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,177 @@
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 workstream_imports_exports = {};
29
+ __export(workstream_imports_exports, {
30
+ importsAdded: () => importsAdded,
31
+ importsReadableFor: () => importsReadableFor,
32
+ ruleImports: () => ruleImports
33
+ });
34
+ module.exports = __toCommonJS(workstream_imports_exports);
35
+ var import_node_fs = __toESM(require("node:fs"));
36
+ var import_node_path = __toESM(require("node:path"));
37
+ var import_ast_parser = require("./ast-parser");
38
+ var import_database = require("./database");
39
+ var import_resolvers = require("./resolvers");
40
+ var import_package_entry = require("../../shared/lib/package-entry");
41
+ var import_symbol_entry = require("../../shared/lib/symbol-entry");
42
+ var import_call_entry = require("../../shared/lib/call-entry");
43
+ var import_folder_entry = require("../../shared/lib/folder-entry");
44
+ var import_grep_entry = require("../../shared/lib/grep-entry");
45
+ var import_patterns = require("./patterns");
46
+ var import_importers = require("./importers");
47
+ var import_check_words = require("../../shared/lib/check-words");
48
+ var import_branch_workstreams = require("./branch-workstreams");
49
+ var import_workstream_symbols = require("./workstream-symbols");
50
+ var import_architecture_rules = require("./architecture-rules");
51
+ var import_architecture_rule = require("./architecture-rule");
52
+ const MAX_CACHED = 5e3;
53
+ const cache = /* @__PURE__ */ new Map();
54
+ const posix = (p) => p.split(import_node_path.default.sep).join("/");
55
+ function stampOf(folder, base, file, head) {
56
+ if (head) return `${base}|${head}|${file.status}|${file.from ?? ""}`;
57
+ let st = "gone";
58
+ try {
59
+ const s = import_node_fs.default.statSync(import_node_path.default.join(folder, file.path));
60
+ st = `${s.size}:${s.mtimeMs}:${s.ctimeMs}`;
61
+ } catch {
62
+ }
63
+ return `${base}|${file.status}|${file.from ?? ""}|${st}`;
64
+ }
65
+ async function importsAdded(projectRoot, w, mainRoot, opts = {}) {
66
+ const base = w.changes.base;
67
+ const branch = w.shape === "branch" && w.head && mainRoot ? w.head : null;
68
+ const folder = branch ? mainRoot : w.root;
69
+ const read = async (rel) => branch ? (0, import_branch_workstreams.showAtAsync)(mainRoot, branch, rel) : (0, import_workstream_symbols.currentContent)(w.root, rel);
70
+ const known = new Set((0, import_database.getAllFileHashes)().keys());
71
+ for (const f of w.changes.files) if (f.status !== "deleted") known.add(import_node_path.default.join(projectRoot, f.path));
72
+ const { aliasMap, systems } = (0, import_database.getImportResolutionContext)(projectRoot);
73
+ const targets = (rel, content, scopeRel = rel, lines) => {
74
+ const out = /* @__PURE__ */ new Set();
75
+ if (content === null) return out;
76
+ for (const rule of opts.grep ?? []) if ((0, import_architecture_rules.grepReads)(rule, scopeRel)) for (const e of (0, import_grep_entry.grepEntries)(rule, content)) out.add(e);
77
+ const abs = import_node_path.default.join(projectRoot, rel);
78
+ let parsed = null;
79
+ try {
80
+ parsed = (0, import_ast_parser.parseVirtualFile)(abs, content);
81
+ } catch {
82
+ parsed = null;
83
+ }
84
+ if (opts.files) out.add((0, import_folder_entry.fileFact)(rel, parsed ? (0, import_folder_entry.exportCount)(parsed.language, parsed.symbols) : null));
85
+ if (!parsed) return out;
86
+ if (opts.calls) {
87
+ for (const cs of parsed.callsites ?? []) {
88
+ const e = (0, import_call_entry.callEntry)(cs);
89
+ if (!e) continue;
90
+ out.add(e);
91
+ if (lines && cs.line && !lines.has(e)) lines.set(e, cs.line);
92
+ }
93
+ }
94
+ const resolver = (0, import_resolvers.getResolverForLanguage)(parsed.language);
95
+ if (!resolver) return out;
96
+ for (const imp of parsed.imports) {
97
+ const hit = resolver.resolve({ importSource: imp.source, importerPath: abs, projectRoot, knownFiles: known, aliasMap, systems, isRelative: imp.isRelative });
98
+ if (hit) out.add(posix(import_node_path.default.relative(projectRoot, hit)));
99
+ if (hit && opts.symbols && !imp.isReexport) {
100
+ const names = imp.isNamespace ? ["*"] : [...imp.specifiers, ...imp.isDefault ? ["default"] : []];
101
+ for (const name of names) {
102
+ for (const origin of (0, import_importers.originsOf)(hit, name)) out.add((0, import_symbol_entry.symbolEntry)(posix(import_node_path.default.relative(projectRoot, origin)), name));
103
+ }
104
+ } else if (opts.packages) {
105
+ const entry = (0, import_package_entry.packageEntry)(parsed.language, imp.source, imp.isRelative);
106
+ if (entry) out.add(entry);
107
+ }
108
+ }
109
+ return out;
110
+ };
111
+ const edges = [];
112
+ for (const file of w.changes.files) {
113
+ if (file.status === "deleted") continue;
114
+ const key = `${folder}\0${file.path}\0${opts.packages ? "p" : ""}${opts.symbols ? "s" : ""}${opts.calls ? `c${(0, import_patterns.patternStamp)(projectRoot)}` : ""}${opts.files ? "f" : ""}${(opts.grep ?? []).map((r) => `g${(0, import_grep_entry.grepKey)(r)}${r.in?.join(",")}|${r.except.join(",")}`).join("")}`;
115
+ const stamp = stampOf(folder, base, file, branch);
116
+ const hit = cache.get(key);
117
+ if (hit && hit.stamp === stamp) {
118
+ edges.push(...hit.added);
119
+ continue;
120
+ }
121
+ const beforePath = file.status === "renamed" && file.from ? file.from : file.path;
122
+ const lines = /* @__PURE__ */ new Map();
123
+ const after = targets(file.path, await read(file.path), file.path, lines);
124
+ const before = file.status === "added" || !base ? /* @__PURE__ */ new Set() : targets(beforePath, await (0, import_workstream_symbols.baseContent)(folder, base, beforePath), file.path);
125
+ const added = [...after].filter((t) => !before.has(t)).sort().map((to) => ({ from: file.path, to, ...lines.has(to) ? { line: lines.get(to) } : {} }));
126
+ if (cache.size >= MAX_CACHED) cache.clear();
127
+ cache.set(key, { stamp, added });
128
+ edges.push(...added);
129
+ }
130
+ return edges;
131
+ }
132
+ const real = (p) => {
133
+ try {
134
+ return import_node_fs.default.realpathSync(p);
135
+ } catch {
136
+ return import_node_path.default.resolve(p);
137
+ }
138
+ };
139
+ function importsReadableFor(projectRoot) {
140
+ const held = (0, import_database.resolutionContextRoot)();
141
+ return !!held && real(held) === real(projectRoot);
142
+ }
143
+ async function ruleImports(projectRoot, files, base, judgeBy) {
144
+ const rules = judgeBy ? [...judgeBy] : (0, import_architecture_rules.rulesOf)(projectRoot);
145
+ if (rules.length === 0) return [];
146
+ if (!importsReadableFor(projectRoot)) return null;
147
+ const edges = await importsAdded(projectRoot, {
148
+ root: projectRoot,
149
+ shape: "shared",
150
+ head: null,
151
+ changes: { base, files: files.map((f) => ({ path: f, status: "modified" })), truncated: false }
152
+ }, null, { packages: true, symbols: rules.some((r) => r.kind === "symbol"), calls: rules.some((r) => r.kind === "calls"), files: rules.some((r) => r.kind === "folder"), grep: rules.filter((r) => r.kind === "grep" && r.strength !== "guide") });
153
+ const byId = new Map(rules.map((r) => [r.id, r]));
154
+ const lineOf = new Map(edges.filter((e) => e.line).map((e) => [`${e.from}>${e.to}`, e.line]));
155
+ return (0, import_architecture_rules.checkEdges)(rules, edges).map((b) => {
156
+ const rule = byId.get(b.rule);
157
+ const line = lineOf.get(`${b.from}>${b.to}`);
158
+ return {
159
+ path: b.from,
160
+ imports: b.to,
161
+ ...line ? { line } : {},
162
+ rule: rule.id,
163
+ words: (0, import_architecture_rules.ruleStatement)({ ...rule, except: [] }),
164
+ because: rule.because,
165
+ strength: rule.strength === "block" ? "block" : "warn",
166
+ // B3: a look-alike's fix says how alike, and what it is like.
167
+ suite: rule.suite ?? "architecture",
168
+ fix: (0, import_architecture_rule.lookAlikeFix)(rule, b.to) ?? (0, import_check_words.ruleFix)(rule)
169
+ };
170
+ });
171
+ }
172
+ // Annotate the CommonJS export names for ESM import in node:
173
+ 0 && (module.exports = {
174
+ importsAdded,
175
+ importsReadableFor,
176
+ ruleImports
177
+ });
@@ -0,0 +1,335 @@
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 workstream_service_exports = {};
29
+ __export(workstream_service_exports, {
30
+ INLINE_SYMBOL_FILES: () => INLINE_SYMBOL_FILES,
31
+ MAX_WATCHED_TREES: () => MAX_WATCHED_TREES,
32
+ branchSymbolsWarmed: () => branchSymbolsWarmed,
33
+ deriveWorkstreams: () => deriveWorkstreams,
34
+ discoverAround: () => discoverAround,
35
+ getSymbolParser: () => getSymbolParser,
36
+ listWorkstreamPlaces: () => listWorkstreamPlaces,
37
+ listWorkstreams: () => listWorkstreams,
38
+ setClaudeSessionSource: () => setClaudeSessionSource,
39
+ setSymbolParser: () => setSymbolParser,
40
+ treesToWatch: () => treesToWatch,
41
+ workstreamBranches: () => workstreamBranches
42
+ });
43
+ module.exports = __toCommonJS(workstream_service_exports);
44
+ var import_node_fs = __toESM(require("node:fs"));
45
+ var import_worktree_service = require("./worktree-service");
46
+ var import_session_service = require("./session-service");
47
+ var import_intent_service = require("./intent-service");
48
+ var import_workstream_watch_service = require("./workstream-watch-service");
49
+ var import_workstream_symbols = require("./workstream-symbols");
50
+ var import_branch_workstreams = require("./branch-workstreams");
51
+ var import_project_config_service = require("./project-config-service");
52
+ var import_trusted_roots = require("./trusted-roots");
53
+ var import_git_env = require("./git-env");
54
+ var import_recent_projects_service = require("./recent-projects-service");
55
+ const NO_CHANGES = { base: null, files: [], truncated: false };
56
+ const isClaude = (agentType) => agentType.toLowerCase().includes("claude");
57
+ function deriveWorkstreams(input) {
58
+ const realpath = input.realpath ?? import_node_fs.default.realpathSync.native;
59
+ const canon = (p) => {
60
+ try {
61
+ return realpath(p);
62
+ } catch {
63
+ return p;
64
+ }
65
+ };
66
+ const trees = input.worktrees.filter((w) => !w.bare && !w.prunable);
67
+ const byCanon = new Map(trees.map((w) => [canon(w.path), w.path]));
68
+ const agentsIn = new Map(trees.map((w) => [w.path, []]));
69
+ const logsIn = /* @__PURE__ */ new Map();
70
+ for (const s of input.mcpSessions) {
71
+ if (s.status !== "active" || !s.workstreamRoot) continue;
72
+ const tree = byCanon.get(canon(s.workstreamRoot));
73
+ if (!tree) continue;
74
+ agentsIn.get(tree).push({
75
+ sessionId: s.sessionId,
76
+ agentType: s.agentType,
77
+ model: s.model ?? null,
78
+ source: "mcp",
79
+ lastSeen: s.lastSeen
80
+ });
81
+ }
82
+ for (const s of input.claudeSessions) {
83
+ const tree = byCanon.get(canon(s.workstreamRoot));
84
+ if (!tree) continue;
85
+ logsIn.set(tree, [...logsIn.get(tree) ?? [], s]);
86
+ }
87
+ return trees.map((w) => {
88
+ const agents = agentsIn.get(w.path);
89
+ const connectedClaude = agents.filter((a) => isClaude(a.agentType)).length;
90
+ for (const log of (logsIn.get(w.path) ?? []).slice(connectedClaude)) {
91
+ agents.push({ sessionId: log.sessionId, agentType: "claude-code", model: null, source: "claude-log", lastSeen: null });
92
+ }
93
+ const changes = input.changes?.(w.path) ?? NO_CHANGES;
94
+ return {
95
+ root: w.path,
96
+ branch: w.branch,
97
+ head: w.head,
98
+ main: w.isMain,
99
+ shape: agents.length >= 2 ? "shared" : "worktree",
100
+ agents,
101
+ changes,
102
+ // Spec §4.1: idle is no agent AND no changes. A worktree an agent left
103
+ // with work in it is still a line of work.
104
+ idle: agents.length === 0 && changes.files.length === 0
105
+ };
106
+ });
107
+ }
108
+ let claudeSource = () => [];
109
+ function setClaudeSessionSource(source) {
110
+ claudeSource = source;
111
+ }
112
+ let symbolParser = null;
113
+ function setSymbolParser(parse) {
114
+ symbolParser = parse;
115
+ }
116
+ function getSymbolParser() {
117
+ return symbolParser;
118
+ }
119
+ async function listWorkstreams(projectRoot, opts = {}) {
120
+ let all;
121
+ if (opts.fresh) {
122
+ all = await listAll(projectRoot, true);
123
+ } else {
124
+ let p = listing.get(projectRoot);
125
+ if (!p) {
126
+ p = listAll(projectRoot, false).finally(() => listing.delete(projectRoot));
127
+ listing.set(projectRoot, p);
128
+ }
129
+ all = await p;
130
+ }
131
+ return opts.includeIdle ? [...all] : all.filter((w) => !w.idle);
132
+ }
133
+ const CHANGES_CONCURRENCY = 6;
134
+ const listing = /* @__PURE__ */ new Map();
135
+ async function listAll(projectRoot, fresh) {
136
+ let claudeSessions = [];
137
+ try {
138
+ claudeSessions = claudeSource();
139
+ } catch {
140
+ }
141
+ const listed = await (0, import_worktree_service.listWorktreesAsync)(projectRoot);
142
+ const worktrees = listed.length ? listed : [{ path: projectRoot, branch: null, head: null, isMain: true, isCurrent: true, bare: false, prunable: false }];
143
+ const main = worktrees.find((w) => w.isMain);
144
+ const mainRef = main?.branch ?? main?.head ?? null;
145
+ const clones = listed.length ? await cloneTrees(projectRoot, worktrees) : [];
146
+ const cloneRoots = new Set(clones.map((c) => c.path));
147
+ const trees = [...worktrees, ...clones];
148
+ const changesOf = /* @__PURE__ */ new Map();
149
+ const folders = [...new Set(trees.filter((w) => !w.bare && !w.prunable).map((w) => w.path))];
150
+ const todo = [...folders.filter((f) => f === projectRoot), ...folders.filter((f) => f !== projectRoot)];
151
+ let symbolBudget = INLINE_SYMBOL_FILES;
152
+ const later = [];
153
+ const measure = async () => {
154
+ for (let folder = todo.shift(); folder !== void 0; folder = todo.shift()) {
155
+ const changes = await (0, import_workstream_watch_service.getChanges)(folder, mainRef, { fresh });
156
+ if (!symbolParser) {
157
+ changesOf.set(folder, changes);
158
+ continue;
159
+ }
160
+ const pending = (0, import_workstream_symbols.uncachedSymbolFiles)(folder, changes);
161
+ if (pending <= symbolBudget) {
162
+ symbolBudget -= pending;
163
+ changesOf.set(folder, await (0, import_workstream_symbols.withSymbolChanges)(folder, changes, symbolParser));
164
+ } else {
165
+ changesOf.set(folder, changes);
166
+ later.push({ folder, changes });
167
+ }
168
+ }
169
+ };
170
+ await Promise.all(Array.from({ length: CHANGES_CONCURRENCY }, measure));
171
+ const derived = deriveWorkstreams({
172
+ worktrees: trees,
173
+ // Sessions read after the awaits above, so an agent that connected meanwhile is placed.
174
+ mcpSessions: (0, import_session_service.getActiveSessions)(),
175
+ claudeSessions,
176
+ changes: (folder) => changesOf.get(folder)
177
+ });
178
+ const all = derived.map((w) => cloneRoots.has(w.root) ? { ...w, shape: "clone" } : w);
179
+ (0, import_workstream_watch_service.syncWorkstreamWatchers)(
180
+ treesToWatch(all, projectRoot).map((folder) => ({ folder, mainRef })),
181
+ all.map((w) => w.root)
182
+ ).catch(() => {
183
+ });
184
+ const branches = main && listed.length ? await branchWorkstreams(main.path, main.branch, mainRef, worktrees, projectRoot) : [];
185
+ if (main && listed.length) void (0, import_workstream_watch_service.watchRefs)(main.path).catch(() => {
186
+ });
187
+ warmSymbols(`${main?.path ?? projectRoot}\0trees`, main?.path ?? projectRoot, later);
188
+ return withIntents([...all, ...branches]);
189
+ }
190
+ const MAX_WATCHED_TREES = 16;
191
+ function treesToWatch(all, projectRoot, max = Number(process.env.CODETRELLIS_MAX_WATCHED_TREES) || MAX_WATCHED_TREES) {
192
+ const rank = (w) => w.agents.length > 0 ? 2 + w.agents.length : w.main || w.root === projectRoot ? 1 : 0;
193
+ return all.map((w, i) => ({ w, i })).filter(({ w }) => !w.idle).sort((a, b) => rank(b.w) - rank(a.w) || a.i - b.i).slice(0, max).map(({ w }) => w.root);
194
+ }
195
+ async function listWorkstreamPlaces(projectRoot) {
196
+ const worktrees = await (0, import_worktree_service.listWorktreesAsync)(projectRoot);
197
+ if (!worktrees.length) return [];
198
+ const trees = [...worktrees, ...await cloneTrees(projectRoot, worktrees)].filter((w) => !w.bare && !w.prunable);
199
+ const places = trees.map((w) => ({ root: w.path, branch: w.branch }));
200
+ const checkedOut = new Set(trees.map((w) => w.branch).filter((b) => Boolean(b)));
201
+ const main = worktrees.find((w) => w.isMain) ?? worktrees[0];
202
+ let refs = [];
203
+ try {
204
+ refs = (await (0, import_git_env.gitAsync)(main.path, ["for-each-ref", "--format=%(refname)%00%(refname:short)", "refs/heads", "refs/remotes"])).split("\n").map((line) => {
205
+ const [ref, short] = line.split("\0");
206
+ return { ref, short };
207
+ }).filter((r) => r.ref && r.short && !r.ref.endsWith("/HEAD"));
208
+ } catch {
209
+ }
210
+ const local = new Set(refs.filter((r) => r.ref.startsWith("refs/heads/")).map((r) => r.short));
211
+ for (const r of refs) {
212
+ if (checkedOut.has(r.short)) continue;
213
+ if (r.ref.startsWith("refs/remotes/") && local.has(r.short.split("/").slice(1).join("/"))) continue;
214
+ places.push({ root: `branch:${r.short}`, branch: r.short });
215
+ }
216
+ return places;
217
+ }
218
+ async function discoverAround(folder) {
219
+ if ((0, import_workstream_watch_service.isWatchedFolder)(folder)) return;
220
+ for (const root of (0, import_trusted_roots.listTrustedRoots)()) {
221
+ try {
222
+ if (root !== folder && !(await (0, import_worktree_service.listWorktreesAsync)(root)).some((w) => w.path === folder)) continue;
223
+ await listWorkstreams(root, { includeIdle: true });
224
+ } catch {
225
+ }
226
+ }
227
+ }
228
+ async function workstreamBranches(projectRoot) {
229
+ const worktrees = await (0, import_worktree_service.listWorktreesAsync)(projectRoot);
230
+ const main = worktrees.find((w) => w.isMain);
231
+ if (!main) return [];
232
+ const mainRef = main.branch ?? main.head ?? null;
233
+ const out = worktrees.filter((w) => !w.isMain && w.branch).map((w) => w.branch);
234
+ for (const b of await branchWorkstreams(main.path, main.branch, mainRef, worktrees, projectRoot)) {
235
+ if (!b.idle && b.branch && !out.includes(b.branch)) out.push(b.branch);
236
+ }
237
+ return out;
238
+ }
239
+ function withIntents(all) {
240
+ return all.map((w) => {
241
+ const intents = w.agents.map((a) => (0, import_intent_service.getIntent)(a.sessionId)).filter((i) => i !== null);
242
+ return intents.length ? { ...w, intents } : w;
243
+ });
244
+ }
245
+ async function branchWorkstreams(repo, mainBranch, mainRef, worktrees, projectRoot) {
246
+ let windowDays;
247
+ try {
248
+ windowDays = (0, import_project_config_service.getEffectiveSensorConfig)(projectRoot).awareness.branchWindowDays;
249
+ } catch {
250
+ windowDays = 7;
251
+ }
252
+ const checkedOut = new Set(worktrees.map((w) => w.branch).filter((b) => !!b));
253
+ const out = [];
254
+ let symbolBudget = INLINE_SYMBOL_FILES;
255
+ const later = [];
256
+ for (const b of await (0, import_branch_workstreams.branchWorkstreamsOf)(repo, { mainBranch, mainRef, checkedOut, windowDays })) {
257
+ const atCommit = { head: b.head, read: (rel) => (0, import_branch_workstreams.showAtAsync)(repo, b.head, rel) };
258
+ let changes = b.changes;
259
+ if (symbolParser) {
260
+ const pending = (0, import_workstream_symbols.uncachedSymbolFiles)(repo, b.changes, atCommit);
261
+ if (pending <= symbolBudget) {
262
+ symbolBudget -= pending;
263
+ changes = await (0, import_workstream_symbols.withSymbolChanges)(repo, b.changes, symbolParser, atCommit);
264
+ } else {
265
+ later.push({ folder: repo, changes: b.changes, atCommit });
266
+ }
267
+ }
268
+ out.push({
269
+ root: `branch:${b.short}`,
270
+ ref: b.ref,
271
+ branch: b.short,
272
+ head: b.head,
273
+ main: false,
274
+ shape: "branch",
275
+ agents: [],
276
+ changes,
277
+ idle: b.changes.files.length === 0
278
+ });
279
+ }
280
+ warmSymbols(repo, repo, later);
281
+ return out;
282
+ }
283
+ const INLINE_SYMBOL_FILES = 60;
284
+ const symbolWarming = /* @__PURE__ */ new Map();
285
+ function branchSymbolsWarmed(repo) {
286
+ return Promise.all([symbolWarming.get(repo), symbolWarming.get(`${repo}\0trees`)]).then(() => void 0);
287
+ }
288
+ function warmSymbols(key, repo, jobs) {
289
+ if (!symbolParser || jobs.length === 0 || symbolWarming.has(key)) return;
290
+ const parse = symbolParser;
291
+ const run = (async () => {
292
+ await new Promise((resolve) => setImmediate(resolve));
293
+ for (const j of jobs) await (0, import_workstream_symbols.withSymbolChanges)(j.folder, j.changes, parse, j.atCommit).catch(() => void 0);
294
+ })().finally(() => {
295
+ symbolWarming.delete(key);
296
+ (0, import_branch_workstreams.notifyBranchesWarmed)(repo);
297
+ });
298
+ symbolWarming.set(key, run);
299
+ }
300
+ const canonicalPath = (p) => {
301
+ try {
302
+ return import_node_fs.default.realpathSync.native(p);
303
+ } catch {
304
+ return p;
305
+ }
306
+ };
307
+ async function cloneTrees(projectRoot, worktrees) {
308
+ const origin = (0, import_recent_projects_service.getRecentProject)(projectRoot)?.originUrl ?? null;
309
+ if (!origin) return [];
310
+ const own = new Set(worktrees.map((w) => canonicalPath(w.path)));
311
+ own.add(canonicalPath(projectRoot));
312
+ const out = [];
313
+ for (const root of (0, import_trusted_roots.listTrustedRoots)()) {
314
+ if (own.has(canonicalPath(root))) continue;
315
+ if ((0, import_recent_projects_service.getRecentProject)(root)?.originUrl !== origin) continue;
316
+ const self = (await (0, import_worktree_service.listWorktreesAsync)(root)).find((w) => w.isMain);
317
+ out.push({ path: root, branch: self?.branch ?? null, head: self?.head ?? null, isMain: false, isCurrent: false, bare: false, prunable: false });
318
+ }
319
+ return out;
320
+ }
321
+ // Annotate the CommonJS export names for ESM import in node:
322
+ 0 && (module.exports = {
323
+ INLINE_SYMBOL_FILES,
324
+ MAX_WATCHED_TREES,
325
+ branchSymbolsWarmed,
326
+ deriveWorkstreams,
327
+ discoverAround,
328
+ getSymbolParser,
329
+ listWorkstreamPlaces,
330
+ listWorkstreams,
331
+ setClaudeSessionSource,
332
+ setSymbolParser,
333
+ treesToWatch,
334
+ workstreamBranches
335
+ });