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,327 @@
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 ast_parser_exports = {};
29
+ __export(ast_parser_exports, {
30
+ computeFileHash: () => computeFileHash,
31
+ getParseableExtensions: () => getParseableExtensions,
32
+ getParserHealth: () => getParserHealth,
33
+ initParser: () => initParser,
34
+ parseFile: () => parseFile,
35
+ parseFiles: () => parseFiles,
36
+ parseVirtualFile: () => parseVirtualFile,
37
+ reinitParsers: () => reinitParsers
38
+ });
39
+ module.exports = __toCommonJS(ast_parser_exports);
40
+ var import_node_fs = __toESM(require("node:fs"));
41
+ var import_node_path = __toESM(require("node:path"));
42
+ var import_node_crypto = require("node:crypto");
43
+ var import_parsers = require("./parsers");
44
+ var import_project_scanner = require("./project-scanner");
45
+ var import_callsites = require("./callsites");
46
+ var import_sql = require("./sql");
47
+ var import_embedded = require("./sql/embedded");
48
+ var import_patterns = require("./patterns");
49
+ var import_process_env = require("./callsites/process-env");
50
+ function loadWebTreeSitter() {
51
+ const resourcesPath = process.resourcesPath;
52
+ if (resourcesPath) {
53
+ const packaged = import_node_path.default.join(resourcesPath, "web-tree-sitter", "web-tree-sitter.cjs");
54
+ if (import_node_fs.default.existsSync(packaged)) {
55
+ return require(packaged);
56
+ }
57
+ }
58
+ const wtsName = "web-tree-sitter";
59
+ return require(wtsName);
60
+ }
61
+ const TreeSitterModule = loadWebTreeSitter();
62
+ const TreeSitter = TreeSitterModule.Parser || TreeSitterModule.default?.Parser || TreeSitterModule;
63
+ const Language = TreeSitterModule.Language || TreeSitter.Language;
64
+ const GRAMMAR_DIR = (() => {
65
+ const dev = import_node_path.default.resolve(__dirname, "../../../resources/tree-sitter");
66
+ if (import_node_fs.default.existsSync(dev)) return dev;
67
+ const resourcesPath = process.resourcesPath;
68
+ if (resourcesPath) {
69
+ const packaged = import_node_path.default.join(resourcesPath, "tree-sitter");
70
+ if (import_node_fs.default.existsSync(packaged)) return packaged;
71
+ }
72
+ return dev;
73
+ })();
74
+ let initialized = false;
75
+ const parsersByGrammar = /* @__PURE__ */ new Map();
76
+ let parsesSinceInit = 0;
77
+ const PARSE_BUDGET = 2e3;
78
+ const MAX_CONSECUTIVE_ERRORS = 3;
79
+ let consecutiveParseErrors = 0;
80
+ async function initParser() {
81
+ if (initialized) return;
82
+ await TreeSitter.init({
83
+ locateFile: () => import_node_path.default.join(GRAMMAR_DIR, "tree-sitter.wasm")
84
+ });
85
+ await loadGrammars();
86
+ try {
87
+ const unparsed = (0, import_parsers.findUnparsedLanguages)((0, import_project_scanner.listTaggedLanguages)());
88
+ if (unparsed.length > 0) {
89
+ console.warn(
90
+ `[AST] These languages are tagged by the scanner but have no parser: ${unparsed.join(", ")}. Files in them will show zero symbols and zero edges, which looks like a working scan of an empty file. Add a parser plugin or stop tagging them.`
91
+ );
92
+ }
93
+ const unscanned = (0, import_parsers.findUnscannedExtensions)((0, import_project_scanner.listTaggedExtensions)());
94
+ if (unscanned.length > 0) {
95
+ console.warn(
96
+ `[AST] These extensions have a parser but the scanner never ingests them: ${unscanned.join(", ")}. Files with them are absent from the graph entirely, and the file-watcher will queue re-parses for files no scan ever stored. Add them to the scanner's LANG_MAP or drop them from the plugin.`
97
+ );
98
+ }
99
+ } catch {
100
+ }
101
+ initialized = true;
102
+ parsesSinceInit = 0;
103
+ consecutiveParseErrors = 0;
104
+ console.log(`[AST] Initialized with grammars: ${[...parsersByGrammar.keys()].join(", ")}`);
105
+ }
106
+ async function loadGrammars() {
107
+ parsersByGrammar.clear();
108
+ for (const plugin of import_parsers.PARSER_PLUGINS) {
109
+ if (parsersByGrammar.has(plugin.grammarKey)) continue;
110
+ const grammarPath = import_node_path.default.join(GRAMMAR_DIR, plugin.grammarFile);
111
+ if (!import_node_fs.default.existsSync(grammarPath)) {
112
+ console.warn(`[AST] Skipping ${plugin.language} (${plugin.grammarKey}) \u2014 grammar missing at ${plugin.grammarFile}`);
113
+ continue;
114
+ }
115
+ try {
116
+ const language = await Language.load(grammarPath);
117
+ const parser = new TreeSitter();
118
+ parser.setLanguage(language);
119
+ parsersByGrammar.set(plugin.grammarKey, parser);
120
+ } catch (err) {
121
+ console.warn(`[AST] Failed to load grammar for ${plugin.language}:`, err);
122
+ }
123
+ }
124
+ }
125
+ async function reinitParsers() {
126
+ console.log(`[AST] Reinitialising parsers (${parsesSinceInit} parses since last init)`);
127
+ await loadGrammars();
128
+ parsesSinceInit = 0;
129
+ consecutiveParseErrors = 0;
130
+ console.log(`[AST] Parsers reinitialised: ${[...parsersByGrammar.keys()].join(", ")}`);
131
+ }
132
+ function dispatchParser(filePath) {
133
+ const plugin = (0, import_parsers.getPluginForFile)(filePath);
134
+ if (!plugin) return null;
135
+ const parser = parsersByGrammar.get(plugin.grammarKey);
136
+ if (!parser) return null;
137
+ return { plugin, parser };
138
+ }
139
+ const MAX_PARSE_BYTES = 2 * 1024 * 1024;
140
+ function parseSqlSource(filePath, content) {
141
+ const byteLength = Buffer.byteLength(content, "utf-8");
142
+ if (byteLength > MAX_PARSE_BYTES) {
143
+ console.warn(
144
+ `[AST] Skipping ${filePath} \u2014 ${(byteLength / 1024 / 1024).toFixed(1)} MB exceeds the ${MAX_PARSE_BYTES / 1024 / 1024} MB parse budget. Almost certainly a data dump.`
145
+ );
146
+ return null;
147
+ }
148
+ const contentHash = (0, import_node_crypto.createHash)("md5").update(content).digest("hex");
149
+ let symbols = [];
150
+ let callsites = [];
151
+ try {
152
+ symbols = (0, import_sql.extractSqlSymbols)(content);
153
+ callsites = (0, import_sql.sqlRefsToCallsites)((0, import_sql.extractTableRefs)(content), "sql-file");
154
+ } catch (err) {
155
+ console.warn(`[AST] SQL extraction failed for ${filePath}:`, err);
156
+ }
157
+ return {
158
+ path: filePath,
159
+ contentHash,
160
+ language: "sql",
161
+ symbols,
162
+ imports: [],
163
+ exports: [],
164
+ callsites
165
+ };
166
+ }
167
+ function parseSource(filePath, content) {
168
+ if (filePath.toLowerCase().endsWith(".sql")) {
169
+ return parseSqlSource(filePath, content);
170
+ }
171
+ const dispatch = dispatchParser(filePath);
172
+ if (!dispatch) return null;
173
+ const { plugin, parser } = dispatch;
174
+ const byteLength = Buffer.byteLength(content, "utf-8");
175
+ if (byteLength > MAX_PARSE_BYTES) {
176
+ console.warn(
177
+ `[AST] Skipping ${filePath} \u2014 ${(byteLength / 1024 / 1024).toFixed(1)} MB exceeds the ${MAX_PARSE_BYTES / 1024 / 1024} MB parse budget. Symbols and edges for this file will be absent; it is almost certainly generated.`
178
+ );
179
+ return null;
180
+ }
181
+ let tree;
182
+ try {
183
+ tree = parser.parse(content);
184
+ parsesSinceInit++;
185
+ consecutiveParseErrors = 0;
186
+ } catch (err) {
187
+ consecutiveParseErrors++;
188
+ const msg = String(err);
189
+ if (msg.includes("memory access out of bounds") || msg.includes("RuntimeError")) {
190
+ console.error(`[AST] WASM memory error parsing ${filePath} (${consecutiveParseErrors} consecutive errors, ${parsesSinceInit} total parses)`);
191
+ } else {
192
+ console.warn(`[AST] Parse error for ${filePath}:`, err);
193
+ }
194
+ return null;
195
+ }
196
+ const root = tree.rootNode;
197
+ const contentHash = (0, import_node_crypto.createHash)("md5").update(content).digest("hex");
198
+ const symbols = plugin.extractSymbols(root);
199
+ const imports = plugin.extractImports(root);
200
+ const exports2 = plugin.extractExports?.(root) ?? [];
201
+ let callsites = [];
202
+ try {
203
+ const extractor = (0, import_callsites.getCallsiteExtractor)(plugin.language);
204
+ if (extractor) callsites = extractor.extract(content, filePath);
205
+ } catch (err) {
206
+ console.warn(`[AST] Callsite extraction failed for ${filePath}:`, err);
207
+ }
208
+ try {
209
+ callsites = [...callsites, ...(0, import_embedded.extractEmbeddedSql)(content)];
210
+ } catch (err) {
211
+ console.warn(`[AST] Embedded SQL extraction failed for ${filePath}:`, err);
212
+ }
213
+ try {
214
+ callsites = [...callsites, ...(0, import_process_env.extractProcessAndEnv)(plugin.language, content)];
215
+ } catch (err) {
216
+ console.warn(`[AST] Command and environment extraction failed for ${filePath}:`, err);
217
+ }
218
+ callsites = [...callsites, ...(0, import_patterns.patternCallsitesFor)(filePath, content)];
219
+ return {
220
+ path: filePath,
221
+ contentHash,
222
+ language: plugin.language,
223
+ symbols,
224
+ imports,
225
+ exports: exports2,
226
+ callsites
227
+ };
228
+ }
229
+ function computeFileHash(filePath) {
230
+ try {
231
+ const content = import_node_fs.default.readFileSync(filePath, "utf-8");
232
+ return (0, import_node_crypto.createHash)("md5").update(content).digest("hex");
233
+ } catch {
234
+ return null;
235
+ }
236
+ }
237
+ function getParseableExtensions() {
238
+ return [...(0, import_parsers.listPluginExtensions)(), ".sql"];
239
+ }
240
+ function parseFile(filePath) {
241
+ let content;
242
+ try {
243
+ content = import_node_fs.default.readFileSync(filePath, "utf-8");
244
+ } catch {
245
+ return null;
246
+ }
247
+ return parseSource(filePath, content);
248
+ }
249
+ function parseVirtualFile(filePath, content) {
250
+ return parseSource(filePath, content);
251
+ }
252
+ const yieldToEventLoop = () => new Promise((resolve) => setImmediate(resolve));
253
+ const PARSE_BATCH_SIZE = 8;
254
+ async function parseFiles(filePaths) {
255
+ await initParser();
256
+ if (parsesSinceInit + filePaths.length > PARSE_BUDGET) {
257
+ await reinitParsers();
258
+ }
259
+ const results = [];
260
+ for (let i = 0; i < filePaths.length; i++) {
261
+ let parsed = parseFile(filePaths[i]);
262
+ if (!parsed && consecutiveParseErrors >= MAX_CONSECUTIVE_ERRORS) {
263
+ console.warn(`[AST] ${MAX_CONSECUTIVE_ERRORS} consecutive parse errors \u2014 reinitialising parsers`);
264
+ await reinitParsers();
265
+ parsed = parseFile(filePaths[i]);
266
+ if (!parsed) {
267
+ consecutiveParseErrors = 0;
268
+ }
269
+ }
270
+ if (parsed) results.push(parsed);
271
+ if ((i + 1) % PARSE_BATCH_SIZE === 0) {
272
+ await yieldToEventLoop();
273
+ }
274
+ }
275
+ const sqlFiles = results.filter((r) => r.language === "sql");
276
+ if (sqlFiles.length > 0) {
277
+ try {
278
+ const batchPaths = new Set(sqlFiles.map((f) => f.path));
279
+ const dirs = new Set(sqlFiles.map((f) => f.path.replace(/[\\/][^\\/]*$/, "")));
280
+ const siblings = [];
281
+ for (const dir of dirs) {
282
+ let entries = [];
283
+ try {
284
+ entries = import_node_fs.default.readdirSync(dir);
285
+ } catch {
286
+ continue;
287
+ }
288
+ for (const name of entries) {
289
+ if (!name.toLowerCase().endsWith(".sql")) continue;
290
+ const full = import_node_path.default.join(dir, name);
291
+ if (batchPaths.has(full)) continue;
292
+ siblings.push({ path: full, symbols: [], language: "sql" });
293
+ }
294
+ }
295
+ (0, import_sql.applyMigrationFold)([...sqlFiles, ...siblings], (p) => {
296
+ try {
297
+ return import_node_fs.default.readFileSync(p, "utf-8");
298
+ } catch {
299
+ return null;
300
+ }
301
+ });
302
+ } catch (err) {
303
+ console.warn("[AST] Migration fold failed \u2014 leaving SQL symbols as parsed:", err);
304
+ }
305
+ }
306
+ return results;
307
+ }
308
+ function getParserHealth() {
309
+ return {
310
+ initialized,
311
+ parsesSinceInit,
312
+ parseBudget: PARSE_BUDGET,
313
+ consecutiveErrors: consecutiveParseErrors,
314
+ loadedGrammars: [...parsersByGrammar.keys()]
315
+ };
316
+ }
317
+ // Annotate the CommonJS export names for ESM import in node:
318
+ 0 && (module.exports = {
319
+ computeFileHash,
320
+ getParseableExtensions,
321
+ getParserHealth,
322
+ initParser,
323
+ parseFile,
324
+ parseFiles,
325
+ parseVirtualFile,
326
+ reinitParsers
327
+ });
@@ -0,0 +1,152 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __export = (target, all) => {
6
+ for (var name in all)
7
+ __defProp(target, name, { get: all[name], enumerable: true });
8
+ };
9
+ var __copyProps = (to, from, except, desc) => {
10
+ if (from && typeof from === "object" || typeof from === "function") {
11
+ for (let key of __getOwnPropNames(from))
12
+ if (!__hasOwnProp.call(to, key) && key !== except)
13
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
14
+ }
15
+ return to;
16
+ };
17
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
18
+ var audio_buffer_service_exports = {};
19
+ __export(audio_buffer_service_exports, {
20
+ AudioRequestError: () => AudioRequestError,
21
+ MAX_BUFFER_SECONDS_LIMIT: () => MAX_BUFFER_SECONDS_LIMIT,
22
+ MAX_CHUNK_MS: () => MAX_CHUNK_MS,
23
+ audioBuffer: () => audioBuffer,
24
+ checkBufferSeconds: () => checkBufferSeconds,
25
+ checkChunkMs: () => checkChunkMs
26
+ });
27
+ module.exports = __toCommonJS(audio_buffer_service_exports);
28
+ const DEFAULT_MAX_BUFFER_MS = 12e4;
29
+ const MAX_BUFFER_SECONDS_LIMIT = 600;
30
+ const MAX_CHUNK_MS = 6e4;
31
+ class AudioRequestError extends Error {
32
+ }
33
+ function checkBufferSeconds(value) {
34
+ if (value === void 0 || value === null) return void 0;
35
+ if (typeof value !== "number" || !Number.isFinite(value) || value < 1 || value > MAX_BUFFER_SECONDS_LIMIT) {
36
+ throw new AudioRequestError(`maxBufferSeconds must be a number from 1 to ${MAX_BUFFER_SECONDS_LIMIT}`);
37
+ }
38
+ return value;
39
+ }
40
+ function checkChunkMs(value) {
41
+ if (typeof value !== "number" || !Number.isFinite(value) || value <= 0 || value > MAX_CHUNK_MS) {
42
+ throw new AudioRequestError(`durationMs must be a number from 1 to ${MAX_CHUNK_MS}`);
43
+ }
44
+ return value;
45
+ }
46
+ class AudioBufferService {
47
+ chunks = [];
48
+ maxBufferMs = DEFAULT_MAX_BUFFER_MS;
49
+ capturing = false;
50
+ startedAt = null;
51
+ /**
52
+ * Start accepting audio chunks. Clears any existing buffer.
53
+ */
54
+ startCapture(maxBufferSeconds) {
55
+ this.maxBufferMs = (checkBufferSeconds(maxBufferSeconds) ?? DEFAULT_MAX_BUFFER_MS / 1e3) * 1e3;
56
+ this.chunks = [];
57
+ this.capturing = true;
58
+ this.startedAt = /* @__PURE__ */ new Date();
59
+ }
60
+ /**
61
+ * Stop accepting audio chunks. Buffer is preserved until next start.
62
+ */
63
+ stopCapture() {
64
+ this.capturing = false;
65
+ }
66
+ /**
67
+ * Whether capture is currently active.
68
+ */
69
+ isCapturing() {
70
+ return this.capturing;
71
+ }
72
+ /**
73
+ * Add an audio chunk to the rolling buffer. Evicts old chunks
74
+ * that exceed the max buffer duration.
75
+ */
76
+ addChunk(data, durationMs) {
77
+ if (!this.capturing) return;
78
+ checkChunkMs(durationMs);
79
+ this.chunks.push({
80
+ data,
81
+ timestamp: Date.now(),
82
+ durationMs
83
+ });
84
+ this.evictOldChunks();
85
+ }
86
+ /**
87
+ * Get the most recent N seconds of audio as a concatenated buffer.
88
+ * If seconds is omitted, returns the entire buffer.
89
+ */
90
+ getRecentAudio(seconds) {
91
+ if (this.chunks.length === 0) return null;
92
+ let targetChunks = this.chunks;
93
+ if (seconds) {
94
+ const cutoffMs = seconds * 1e3;
95
+ const now = Date.now();
96
+ targetChunks = this.chunks.filter(
97
+ (c) => now - c.timestamp <= cutoffMs
98
+ );
99
+ }
100
+ if (targetChunks.length === 0) return null;
101
+ const totalData = Buffer.concat(targetChunks.map((c) => c.data));
102
+ const totalDurationMs = targetChunks.reduce((sum, c) => sum + c.durationMs, 0);
103
+ const startsAt = new Date(targetChunks[0].timestamp);
104
+ const lastChunk = targetChunks[targetChunks.length - 1];
105
+ const endsAt = new Date(lastChunk.timestamp + lastChunk.durationMs);
106
+ return {
107
+ audioBase64: totalData.toString("base64"),
108
+ mimeType: "audio/webm;codecs=opus",
109
+ durationSeconds: Math.round(totalDurationMs / 1e3 * 10) / 10,
110
+ startsAt: startsAt.toISOString(),
111
+ endsAt: endsAt.toISOString(),
112
+ chunkCount: targetChunks.length
113
+ };
114
+ }
115
+ /**
116
+ * Get current capture status.
117
+ */
118
+ getStatus() {
119
+ const bufferedMs = this.chunks.reduce((sum, c) => sum + c.durationMs, 0);
120
+ return {
121
+ capturing: this.capturing,
122
+ bufferedSeconds: Math.round(bufferedMs / 1e3 * 10) / 10,
123
+ chunkCount: this.chunks.length,
124
+ maxBufferSeconds: this.maxBufferMs / 1e3,
125
+ startedAt: this.startedAt?.toISOString() ?? null
126
+ };
127
+ }
128
+ /**
129
+ * Clear the buffer entirely.
130
+ */
131
+ clear() {
132
+ this.chunks = [];
133
+ }
134
+ // --- Internals ---
135
+ evictOldChunks() {
136
+ const now = Date.now();
137
+ const cutoff = now - this.maxBufferMs;
138
+ while (this.chunks.length > 0 && this.chunks[0].timestamp < cutoff) {
139
+ this.chunks.shift();
140
+ }
141
+ }
142
+ }
143
+ const audioBuffer = new AudioBufferService();
144
+ // Annotate the CommonJS export names for ESM import in node:
145
+ 0 && (module.exports = {
146
+ AudioRequestError,
147
+ MAX_BUFFER_SECONDS_LIMIT,
148
+ MAX_CHUNK_MS,
149
+ audioBuffer,
150
+ checkBufferSeconds,
151
+ checkChunkMs
152
+ });
@@ -0,0 +1,139 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __export = (target, all) => {
6
+ for (var name in all)
7
+ __defProp(target, name, { get: all[name], enumerable: true });
8
+ };
9
+ var __copyProps = (to, from, except, desc) => {
10
+ if (from && typeof from === "object" || typeof from === "function") {
11
+ for (let key of __getOwnPropNames(from))
12
+ if (!__hasOwnProp.call(to, key) && key !== except)
13
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
14
+ }
15
+ return to;
16
+ };
17
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
18
+ var awareness_notices_exports = {};
19
+ __export(awareness_notices_exports, {
20
+ MAX_NOTE: () => MAX_NOTE,
21
+ markTold: () => markTold,
22
+ noticeFor: () => noticeFor,
23
+ noticeText: () => noticeText,
24
+ recordNote: () => recordNote,
25
+ setNoticeListener: () => setNoticeListener,
26
+ toldFor: () => toldFor,
27
+ withTold: () => withTold
28
+ });
29
+ module.exports = __toCommonJS(awareness_notices_exports);
30
+ var import_database = require("./database");
31
+ var import_persistence = require("./persistence");
32
+ var import_awareness_service = require("./awareness-service");
33
+ var import_session_service = require("./session-service");
34
+ var import_project_config_service = require("./project-config-service");
35
+ var import_task_workstreams = require("./task-workstreams");
36
+ const MAX_NOTE = 500;
37
+ const RANK = { high: 0, medium: 1, low: 2 };
38
+ const NO_NOTICE = /* @__PURE__ */ new Set(["get_awareness", "acknowledge_signal"]);
39
+ const CONCERNS = /* @__PURE__ */ new Set(["open", "acknowledged"]);
40
+ let onChanged = () => {
41
+ };
42
+ function setNoticeListener(listener) {
43
+ onChanged = listener;
44
+ }
45
+ function toldTo(sessionId) {
46
+ const res = (0, import_database.getDb)().exec(
47
+ "SELECT signal_id FROM awareness_signal_notes WHERE session_id = ? AND told_at IS NOT NULL",
48
+ [sessionId]
49
+ );
50
+ return new Set((res[0]?.values ?? []).map((r) => r[0]));
51
+ }
52
+ function markTold(projectRoot, signalIds, sessionId, agentType, now = Date.now()) {
53
+ if (signalIds.length === 0) return;
54
+ const db = (0, import_database.getDb)();
55
+ for (const id of signalIds) {
56
+ db.run(
57
+ `INSERT INTO awareness_signal_notes (signal_id, session_id, agent_type, told_at) VALUES (?, ?, ?, ?)
58
+ ON CONFLICT(signal_id, session_id) DO UPDATE SET told_at = COALESCE(awareness_signal_notes.told_at, excluded.told_at)`,
59
+ [id, sessionId, agentType, now]
60
+ );
61
+ }
62
+ (0, import_persistence.markDirty)();
63
+ onChanged(projectRoot);
64
+ }
65
+ function recordNote(projectRoot, signalId, sessionId, agentType, note, now = Date.now()) {
66
+ (0, import_database.getDb)().run(
67
+ `INSERT INTO awareness_signal_notes (signal_id, session_id, agent_type, told_at, note, noted_at) VALUES (?, ?, ?, ?, ?, ?)
68
+ ON CONFLICT(signal_id, session_id) DO UPDATE SET
69
+ note = excluded.note, noted_at = excluded.noted_at,
70
+ told_at = COALESCE(awareness_signal_notes.told_at, excluded.told_at)`,
71
+ [signalId, sessionId, agentType, now, note, now]
72
+ );
73
+ (0, import_persistence.markDirty)();
74
+ onChanged(projectRoot);
75
+ }
76
+ function toldFor(signalIds) {
77
+ const out = /* @__PURE__ */ new Map();
78
+ if (signalIds.length === 0) return out;
79
+ const res = (0, import_database.getDb)().exec(
80
+ `SELECT signal_id, session_id, agent_type, told_at, note, noted_at FROM awareness_signal_notes
81
+ WHERE signal_id IN (${signalIds.map(() => "?").join(",")}) ORDER BY COALESCE(noted_at, told_at)`,
82
+ [...signalIds]
83
+ );
84
+ for (const [id, sessionId, agentType, toldAt, note, notedAt] of res[0]?.values ?? []) {
85
+ const list = out.get(id) ?? [];
86
+ list.push({
87
+ sessionId,
88
+ agentType,
89
+ toldAt: toldAt ?? null,
90
+ ...note ? { note, notedAt } : {}
91
+ });
92
+ out.set(id, list);
93
+ }
94
+ return out;
95
+ }
96
+ function withTold(signals) {
97
+ const told = toldFor(signals.map((s) => s.id));
98
+ return signals.map((s) => told.has(s.id) ? { ...s, told: told.get(s.id) } : s);
99
+ }
100
+ function noticeText(signals) {
101
+ const lines = signals.map((s) => `- ${s.severity} ${s.kind}: ${s.summary}`);
102
+ const head = signals.length === 1 ? "1 new signal affects your work:" : `${signals.length} new signals affect your work:`;
103
+ return [
104
+ "\u2500\u2500 CodeTrellis awareness \u2500\u2500",
105
+ head,
106
+ ...lines,
107
+ "Call get_awareness for details, and acknowledge_signal to say what you will do. This is information about other work, not an instruction."
108
+ ].join("\n");
109
+ }
110
+ function noticeFor(sessionId, toolName, projectRoot) {
111
+ if (!projectRoot || NO_NOTICE.has(toolName)) return null;
112
+ try {
113
+ if (!(0, import_project_config_service.getEffectiveSensorConfig)(projectRoot).awareness.inlineNotices) return null;
114
+ const session = (0, import_session_service.getActiveSessions)().find((s) => s.sessionId === sessionId);
115
+ const mine = (0, import_task_workstreams.sessionWorkstreams)(session);
116
+ if (!session || mine.length === 0) return null;
117
+ const seen = toldTo(sessionId);
118
+ const byId = /* @__PURE__ */ new Map();
119
+ for (const w of mine) for (const s of (0, import_awareness_service.listSignals)(projectRoot, { workstream: w })) byId.set(s.id, s);
120
+ const fresh = [...byId.values()].sort((a, b) => RANK[a.severity] - RANK[b.severity] || b.lastSeen - a.lastSeen).filter((s) => (s.severity === "high" || s.severity === "medium") && CONCERNS.has(s.state) && !seen.has(s.id));
121
+ if (fresh.length === 0) return null;
122
+ markTold(projectRoot, fresh.map((s) => s.id), sessionId, session.agentType);
123
+ return noticeText(fresh);
124
+ } catch (err) {
125
+ console.warn("[Awareness] notice failed:", err instanceof Error ? err.message : err);
126
+ return null;
127
+ }
128
+ }
129
+ // Annotate the CommonJS export names for ESM import in node:
130
+ 0 && (module.exports = {
131
+ MAX_NOTE,
132
+ markTold,
133
+ noticeFor,
134
+ noticeText,
135
+ recordNote,
136
+ setNoticeListener,
137
+ toldFor,
138
+ withTold
139
+ });