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,193 @@
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 file_watcher_exports = {};
29
+ __export(file_watcher_exports, {
30
+ startWatching: () => startWatching,
31
+ stopWatching: () => stopWatching
32
+ });
33
+ module.exports = __toCommonJS(file_watcher_exports);
34
+ var _lazy___cross_system_service = __toESM(require("./cross-system-service"));
35
+ var _lazy___plan_progress_service = __toESM(require("./plan-progress-service"));
36
+ var import_tree_watcher = require("./tree-watcher");
37
+ var import_node_path = __toESM(require("node:path"));
38
+ var import_ast_parser = require("./ast-parser");
39
+ var import_database = require("./database");
40
+ var import_server = require("../server");
41
+ var import_deviation_service = require("./deviation-service");
42
+ var import_sensor_bridge_service = require("./sensor-bridge-service");
43
+ var import_stuck_sensor_service = require("./stuck-sensor-service");
44
+ var import_workstream_watch_service = require("./workstream-watch-service");
45
+ var import_watch_ignore = require("./watch-ignore");
46
+ let watcher = null;
47
+ const READY_TIMEOUT_MS = 1e4;
48
+ let crossSystemRecomputeTimer = null;
49
+ const CROSS_SYSTEM_DEBOUNCE_MS = 500;
50
+ function scheduleCrossSystemRecompute() {
51
+ if (crossSystemRecomputeTimer) clearTimeout(crossSystemRecomputeTimer);
52
+ crossSystemRecomputeTimer = setTimeout(() => {
53
+ crossSystemRecomputeTimer = null;
54
+ try {
55
+ const { recomputeCrossSystemEdges } = _lazy___cross_system_service;
56
+ recomputeCrossSystemEdges();
57
+ try {
58
+ (0, import_server.broadcast)("cross-system-changed", { reason: "file-change" });
59
+ } catch {
60
+ }
61
+ } catch (err) {
62
+ console.warn("[Watcher] Cross-system recompute failed:", err);
63
+ }
64
+ }, CROSS_SYSTEM_DEBOUNCE_MS);
65
+ }
66
+ const PARSEABLE_EXTS = new Set((0, import_ast_parser.getParseableExtensions)());
67
+ async function startWatching(projectRoot) {
68
+ await (0, import_ast_parser.initParser)();
69
+ if (watcher) {
70
+ await watcher.close();
71
+ }
72
+ (0, import_workstream_watch_service.setExternallyWatchedFolder)(projectRoot);
73
+ watcher = (0, import_tree_watcher.watchTree)(projectRoot, {
74
+ ...(0, import_watch_ignore.checkoutWatchOptions)(projectRoot),
75
+ ignoreInitial: true,
76
+ awaitWriteFinish: {
77
+ stabilityThreshold: 300,
78
+ pollInterval: 100
79
+ }
80
+ });
81
+ watcher.on("error", (err) => {
82
+ console.warn("[Watcher] error (continuing):", err);
83
+ });
84
+ watcher.on("change", (filePath) => {
85
+ (0, import_workstream_watch_service.nudgeWorkstream)(projectRoot);
86
+ const ext = import_node_path.default.extname(filePath).toLowerCase();
87
+ if (!PARSEABLE_EXTS.has(ext)) return;
88
+ const parsed = (0, import_ast_parser.parseFile)(filePath);
89
+ if (!parsed) return;
90
+ const oldHash = (0, import_database.getFileHash)(filePath);
91
+ if (oldHash === parsed.contentHash) return;
92
+ (0, import_database.storeParsedFile)(parsed, projectRoot);
93
+ (0, import_database.resolvePendingImports)(projectRoot);
94
+ console.log(`[Watcher] Re-parsed: ${import_node_path.default.relative(projectRoot, filePath)}`);
95
+ const relativePath = import_node_path.default.relative(projectRoot, filePath);
96
+ (0, import_server.broadcast)("file-changed", {
97
+ path: filePath,
98
+ relativePath,
99
+ symbols: parsed.symbols.map((s) => ({ name: s.name, kind: s.kind }))
100
+ });
101
+ try {
102
+ (0, import_deviation_service.checkFileDeviation)(relativePath);
103
+ } catch {
104
+ }
105
+ try {
106
+ const { recordFileChange } = _lazy___plan_progress_service;
107
+ recordFileChange(relativePath);
108
+ } catch {
109
+ }
110
+ try {
111
+ (0, import_sensor_bridge_service.checkDocFreshnessForFile)(relativePath, projectRoot);
112
+ } catch {
113
+ }
114
+ try {
115
+ (0, import_stuck_sensor_service.recordFileActivity)(projectRoot);
116
+ } catch {
117
+ }
118
+ scheduleCrossSystemRecompute();
119
+ });
120
+ watcher.on("add", (filePath) => {
121
+ (0, import_workstream_watch_service.nudgeWorkstream)(projectRoot);
122
+ const ext = import_node_path.default.extname(filePath).toLowerCase();
123
+ if (!PARSEABLE_EXTS.has(ext)) return;
124
+ const parsed = (0, import_ast_parser.parseFile)(filePath);
125
+ if (!parsed) return;
126
+ (0, import_database.storeParsedFile)(parsed, projectRoot);
127
+ (0, import_database.resolvePendingImports)(projectRoot);
128
+ console.log(`[Watcher] New file parsed: ${import_node_path.default.relative(projectRoot, filePath)}`);
129
+ (0, import_server.broadcast)("file-added", {
130
+ path: filePath,
131
+ relativePath: import_node_path.default.relative(projectRoot, filePath)
132
+ });
133
+ const relPath = import_node_path.default.relative(projectRoot, filePath);
134
+ try {
135
+ (0, import_deviation_service.checkFileDeviation)(relPath);
136
+ } catch {
137
+ }
138
+ try {
139
+ const { recordFileChange } = _lazy___plan_progress_service;
140
+ recordFileChange(relPath);
141
+ } catch {
142
+ }
143
+ try {
144
+ (0, import_sensor_bridge_service.checkDocFreshnessForFile)(relPath, projectRoot);
145
+ } catch {
146
+ }
147
+ try {
148
+ (0, import_stuck_sensor_service.recordFileActivity)(projectRoot);
149
+ } catch {
150
+ }
151
+ scheduleCrossSystemRecompute();
152
+ });
153
+ watcher.on("unlink", (filePath) => {
154
+ (0, import_workstream_watch_service.nudgeWorkstream)(projectRoot);
155
+ console.log(`[Watcher] File removed: ${import_node_path.default.relative(projectRoot, filePath)}`);
156
+ try {
157
+ (0, import_database.removeStaleFiles)([filePath]);
158
+ } catch (err) {
159
+ console.warn("[Watcher] Could not drop removed file:", err);
160
+ }
161
+ (0, import_server.broadcast)("file-removed", { path: filePath });
162
+ scheduleCrossSystemRecompute();
163
+ });
164
+ const readyWatcher = watcher;
165
+ await new Promise((resolve) => {
166
+ let settled = false;
167
+ const done = () => {
168
+ if (settled) return;
169
+ settled = true;
170
+ clearTimeout(guard);
171
+ resolve();
172
+ };
173
+ const guard = setTimeout(() => {
174
+ console.warn(`[Watcher] Initial walk still running after ${READY_TIMEOUT_MS}ms \u2014 continuing`);
175
+ done();
176
+ }, READY_TIMEOUT_MS);
177
+ guard.unref?.();
178
+ readyWatcher.once("ready", done);
179
+ });
180
+ console.log(`[Watcher] Watching ${projectRoot}`);
181
+ }
182
+ async function stopWatching() {
183
+ if (watcher) {
184
+ await watcher.close();
185
+ watcher = null;
186
+ }
187
+ (0, import_workstream_watch_service.setExternallyWatchedFolder)(null);
188
+ }
189
+ // Annotate the CommonJS export names for ESM import in node:
190
+ 0 && (module.exports = {
191
+ startWatching,
192
+ stopWatching
193
+ });
@@ -0,0 +1,118 @@
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 folder_requests_exports = {};
29
+ __export(folder_requests_exports, {
30
+ clearFolderRequests: () => clearFolderRequests,
31
+ dismissFolderRequest: () => dismissFolderRequest,
32
+ listFolderRequests: () => listFolderRequests,
33
+ normaliseReportedFolder: () => normaliseReportedFolder,
34
+ recordFolderRequest: () => recordFolderRequest,
35
+ rememberDismissal: () => rememberDismissal,
36
+ setFolderRequestsListener: () => setFolderRequestsListener,
37
+ takeFolderRequest: () => takeFolderRequest
38
+ });
39
+ module.exports = __toCommonJS(folder_requests_exports);
40
+ var import_node_path = __toESM(require("node:path"));
41
+ var import_node_crypto = require("node:crypto");
42
+ var import_database = require("./database");
43
+ var import_persistence = require("./persistence");
44
+ const pending = /* @__PURE__ */ new Map();
45
+ let onChanged = () => {
46
+ };
47
+ function setFolderRequestsListener(listener) {
48
+ onChanged = listener;
49
+ }
50
+ function normaliseReportedFolder(raw) {
51
+ if (typeof raw !== "string" || raw.length === 0 || raw.length > 4096 || raw.includes("\0") || !import_node_path.default.isAbsolute(raw)) return null;
52
+ return import_node_path.default.resolve(raw);
53
+ }
54
+ function isDismissed(folder) {
55
+ try {
56
+ return !!(0, import_database.getDb)().exec(`SELECT 1 FROM folder_request_dismissals WHERE folder = ?`, [folder])[0]?.values[0];
57
+ } catch {
58
+ return false;
59
+ }
60
+ }
61
+ function recordFolderRequest(input, now = Date.now()) {
62
+ const folder = normaliseReportedFolder(input.folder);
63
+ if (!folder || isDismissed(folder)) return null;
64
+ const existing = [...pending.values()].find((r) => r.folder === folder);
65
+ if (existing) {
66
+ if (!existing.sessionIds.includes(input.sessionId)) existing.sessionIds.push(input.sessionId);
67
+ return existing;
68
+ }
69
+ const req = {
70
+ id: (0, import_node_crypto.randomBytes)(8).toString("hex"),
71
+ folder,
72
+ agentType: input.agentType,
73
+ sessionIds: [input.sessionId],
74
+ reportedAt: now
75
+ };
76
+ pending.set(req.id, req);
77
+ onChanged();
78
+ return req;
79
+ }
80
+ function listFolderRequests() {
81
+ return [...pending.values()].sort((a, b) => a.reportedAt - b.reportedAt);
82
+ }
83
+ function takeFolderRequest(id) {
84
+ const req = pending.get(id) ?? null;
85
+ if (req) {
86
+ pending.delete(id);
87
+ onChanged();
88
+ }
89
+ return req;
90
+ }
91
+ function dismissFolderRequest(id, now = Date.now()) {
92
+ const req = takeFolderRequest(id);
93
+ if (!req) return false;
94
+ rememberDismissal(req.folder, now);
95
+ return true;
96
+ }
97
+ function rememberDismissal(folder, now = Date.now()) {
98
+ (0, import_database.getDb)().run(
99
+ `INSERT INTO folder_request_dismissals (folder, dismissed_at) VALUES (?, ?)
100
+ ON CONFLICT(folder) DO UPDATE SET dismissed_at = excluded.dismissed_at`,
101
+ [folder, now]
102
+ );
103
+ (0, import_persistence.markDirty)();
104
+ }
105
+ function clearFolderRequests() {
106
+ pending.clear();
107
+ }
108
+ // Annotate the CommonJS export names for ESM import in node:
109
+ 0 && (module.exports = {
110
+ clearFolderRequests,
111
+ dismissFolderRequest,
112
+ listFolderRequests,
113
+ normaliseReportedFolder,
114
+ recordFolderRequest,
115
+ rememberDismissal,
116
+ setFolderRequestsListener,
117
+ takeFolderRequest
118
+ });
@@ -0,0 +1,189 @@
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 freeze_service_exports = {};
19
+ __export(freeze_service_exports, {
20
+ acknowledgeFreezeChange: () => acknowledgeFreezeChange,
21
+ exemptPlanFromFreeze: () => exemptPlanFromFreeze,
22
+ flaggedFreezeChanges: () => flaggedFreezeChanges,
23
+ getFreezeStatus: () => getFreezeStatus,
24
+ isPlanAllowedDuringFreeze: () => isPlanAllowedDuringFreeze,
25
+ listFreezeChanges: () => listFreezeChanges,
26
+ setFreeze: () => setFreeze
27
+ });
28
+ module.exports = __toCommonJS(freeze_service_exports);
29
+ var import_project_config_service = require("./project-config-service");
30
+ var import_database = require("./database");
31
+ var import_persistence = require("./persistence");
32
+ var import_budget_service = require("./budget-service");
33
+ function getFreezeStatus(projectRoot) {
34
+ return { ...freezeState(projectRoot), flaggedChanges: flaggedFreezeChanges(projectRoot) };
35
+ }
36
+ function freezeState(projectRoot) {
37
+ const cfg = (0, import_project_config_service.getProjectConfig)(projectRoot);
38
+ const freeze = cfg.freeze;
39
+ if (!freeze || !freeze.active) {
40
+ return {
41
+ active: false,
42
+ reason: freeze?.reason ?? null,
43
+ since: freeze?.since ?? null,
44
+ until: freeze?.until ?? null,
45
+ expired: false,
46
+ allowedPlanUids: freeze?.allowedPlanUids ?? [],
47
+ elapsedMs: null,
48
+ remainingMs: null
49
+ };
50
+ }
51
+ const now = Date.now();
52
+ const sinceMs = freeze.since ? new Date(freeze.since).getTime() : null;
53
+ const untilMs = freeze.until ? new Date(freeze.until).getTime() : null;
54
+ const expired = untilMs !== null && now > untilMs;
55
+ return {
56
+ active: !expired,
57
+ reason: freeze.reason ?? null,
58
+ since: freeze.since ?? null,
59
+ until: freeze.until ?? null,
60
+ expired,
61
+ allowedPlanUids: freeze.allowedPlanUids ?? [],
62
+ elapsedMs: sinceMs ? now - sinceMs : null,
63
+ remainingMs: untilMs && !expired ? untilMs - now : null
64
+ };
65
+ }
66
+ function setFreeze(projectRoot, opts, by) {
67
+ const before = currentSettings(projectRoot);
68
+ const patch = {
69
+ freeze: {
70
+ active: opts.active,
71
+ reason: opts.reason,
72
+ since: opts.active ? (/* @__PURE__ */ new Date()).toISOString() : void 0,
73
+ until: opts.until ?? null,
74
+ allowedPlanUids: opts.allowedPlanUids ?? []
75
+ }
76
+ };
77
+ if (!opts.active) {
78
+ const cfg = (0, import_project_config_service.getProjectConfig)(projectRoot);
79
+ const existing = cfg.freeze;
80
+ patch.freeze.since = existing?.since ?? void 0;
81
+ }
82
+ (0, import_project_config_service.updateProjectConfig)(projectRoot, patch);
83
+ recordFreezeChange(projectRoot, before, by);
84
+ return getFreezeStatus(projectRoot);
85
+ }
86
+ function isPlanAllowedDuringFreeze(projectRoot, planUid) {
87
+ const status = getFreezeStatus(projectRoot);
88
+ if (!status.active) return true;
89
+ return status.allowedPlanUids.includes(planUid);
90
+ }
91
+ function exemptPlanFromFreeze(projectRoot, planUid, by) {
92
+ const before = currentSettings(projectRoot);
93
+ const cfg = (0, import_project_config_service.getProjectConfig)(projectRoot);
94
+ const freeze = cfg.freeze;
95
+ const current = freeze?.allowedPlanUids ?? [];
96
+ if (current.includes(planUid)) {
97
+ return getFreezeStatus(projectRoot);
98
+ }
99
+ const patch = {
100
+ freeze: {
101
+ ...freeze ?? { active: false },
102
+ allowedPlanUids: [...current, planUid]
103
+ }
104
+ };
105
+ (0, import_project_config_service.updateProjectConfig)(projectRoot, patch);
106
+ recordFreezeChange(projectRoot, before, by);
107
+ return getFreezeStatus(projectRoot);
108
+ }
109
+ function currentSettings(projectRoot) {
110
+ const freeze = (0, import_project_config_service.getProjectConfig)(projectRoot).freeze;
111
+ if (!freeze) return null;
112
+ return {
113
+ active: Boolean(freeze.active),
114
+ reason: freeze.reason ?? null,
115
+ until: freeze.until ?? null,
116
+ allowedPlanUids: [...freeze.allowedPlanUids ?? []]
117
+ };
118
+ }
119
+ const sameSettings = (a, b) => JSON.stringify(a) === JSON.stringify(b);
120
+ const NOT_FROZEN = { active: false, reason: null, until: null, allowedPlanUids: [] };
121
+ function recordFreezeChange(projectRoot, before, by) {
122
+ if (!by) return;
123
+ const after = currentSettings(projectRoot) ?? NOT_FROZEN;
124
+ if (sameSettings(before ?? NOT_FROZEN, after)) return;
125
+ try {
126
+ (0, import_database.getDb)().run(
127
+ `INSERT INTO project_freeze_changes (project_path, actor, actor_type, channel, before_json, after_json, created_at)
128
+ VALUES (?, ?, ?, ?, ?, ?, ?)`,
129
+ [projectRoot, by.actor, by.actorType, by.channel, before ? JSON.stringify(before) : null, JSON.stringify(after), Date.now()]
130
+ );
131
+ (0, import_persistence.markDirty)();
132
+ } catch (err) {
133
+ console.warn("[Freeze] could not record the change:", err);
134
+ }
135
+ }
136
+ const CHANGE_COLUMNS = "id, project_path, actor, actor_type, channel, before_json, after_json, created_at, acknowledged_at, acknowledged_by";
137
+ function toChange(r) {
138
+ const actorType = r[3];
139
+ const acknowledgedAt = r[8] ?? null;
140
+ return {
141
+ id: r[0],
142
+ projectPath: r[1],
143
+ actor: r[2],
144
+ actorType,
145
+ channel: r[4],
146
+ before: r[5] ? JSON.parse(r[5]) : null,
147
+ after: JSON.parse(r[6]),
148
+ at: r[7],
149
+ flagged: (0, import_budget_service.isFlaggedActor)(actorType) && acknowledgedAt === null,
150
+ acknowledgedAt,
151
+ acknowledgedBy: r[9] ?? null
152
+ };
153
+ }
154
+ function listFreezeChanges(projectRoot, limit = 50) {
155
+ try {
156
+ const res = (0, import_database.getDb)().exec(
157
+ `SELECT ${CHANGE_COLUMNS} FROM project_freeze_changes WHERE project_path = ? ORDER BY created_at DESC, id DESC LIMIT ?`,
158
+ [projectRoot, limit]
159
+ );
160
+ return (res[0]?.values ?? []).map(toChange);
161
+ } catch {
162
+ return [];
163
+ }
164
+ }
165
+ function flaggedFreezeChanges(projectRoot) {
166
+ return listFreezeChanges(projectRoot, 500).filter((c) => c.flagged).reverse();
167
+ }
168
+ function acknowledgeFreezeChange(projectRoot, id, by) {
169
+ const db = (0, import_database.getDb)();
170
+ db.run(
171
+ `UPDATE project_freeze_changes SET acknowledged_at = ?, acknowledged_by = ?
172
+ WHERE project_path = ? AND id = ? AND acknowledged_at IS NULL`,
173
+ [Date.now(), by, projectRoot, id]
174
+ );
175
+ (0, import_persistence.markDirty)();
176
+ const res = db.exec(`SELECT ${CHANGE_COLUMNS} FROM project_freeze_changes WHERE project_path = ? AND id = ?`, [projectRoot, id]);
177
+ const row = res[0]?.values[0];
178
+ return row ? toChange(row) : null;
179
+ }
180
+ // Annotate the CommonJS export names for ESM import in node:
181
+ 0 && (module.exports = {
182
+ acknowledgeFreezeChange,
183
+ exemptPlanFromFreeze,
184
+ flaggedFreezeChanges,
185
+ getFreezeStatus,
186
+ isPlanAllowedDuringFreeze,
187
+ listFreezeChanges,
188
+ setFreeze
189
+ });
@@ -0,0 +1,172 @@
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 gemini_cli_hook_exports = {};
29
+ __export(gemini_cli_hook_exports, {
30
+ GEMINI_HOOK_NAME: () => GEMINI_HOOK_NAME,
31
+ GEMINI_HOOK_TIMEOUT_MS: () => GEMINI_HOOK_TIMEOUT_MS,
32
+ GEMINI_SETTINGS_FILE: () => GEMINI_SETTINGS_FILE,
33
+ applyGeminiHook: () => applyGeminiHook,
34
+ geminiDir: () => geminiDir,
35
+ geminiHookCommand: () => geminiHookCommand,
36
+ planGeminiHook: () => planGeminiHook,
37
+ previewGeminiHook: () => previewGeminiHook,
38
+ thisMachine: () => thisMachine
39
+ });
40
+ module.exports = __toCommonJS(gemini_cli_hook_exports);
41
+ var import_node_fs = __toESM(require("node:fs"));
42
+ var import_node_os = __toESM(require("node:os"));
43
+ var import_node_path = __toESM(require("node:path"));
44
+ var import_command = require("../mcp/connector/command");
45
+ var import_hook = require("../mcp/connector/hook");
46
+ var import_claude_desktop_config = require("./claude-desktop-config");
47
+ var import_confined_fs = require("./confined-fs");
48
+ const GEMINI_SETTINGS_FILE = "settings.json";
49
+ const GEMINI_HOOK_TIMEOUT_MS = 1e4;
50
+ const GEMINI_HOOK_NAME = "codetrellis-breakpoints";
51
+ function geminiDir(w) {
52
+ const dir = import_node_path.default.join(w.env.GEMINI_CLI_HOME?.trim() || w.home, ".gemini");
53
+ return w.exists(dir) ? dir : null;
54
+ }
55
+ const psQuote = (arg) => `'${arg.replace(/'/g, "''")}'`;
56
+ function geminiHookCommand(connector, platform = process.platform) {
57
+ if (platform === "win32") {
58
+ return ["&", psQuote(connector.command), ...connector.args.map(psQuote), import_hook.HOOK_FLAG, import_hook.HOOK_GEMINI_BEFORE_TOOL].join(" ");
59
+ }
60
+ return [(0, import_command.shellQuote)(connector.command, "linux"), ...connector.args.map((a) => (0, import_command.shellQuote)(a, "linux")), import_hook.HOOK_FLAG, import_hook.HOOK_GEMINI_BEFORE_TOOL].join(" ");
61
+ }
62
+ const isOurHook = (h) => !!h && typeof h === "object" && typeof h.command === "string" && /mcp-connector\.cjs/.test(h.command) && h.command.includes(`${import_hook.HOOK_FLAG} ${import_hook.HOOK_GEMINI_BEFORE_TOOL}`);
63
+ function planGeminiHook(current, command, env = {}) {
64
+ let doc = {};
65
+ if (current !== null && current.trim() !== "") {
66
+ let parsed;
67
+ try {
68
+ parsed = JSON.parse(current);
69
+ } catch {
70
+ return { ok: false, reason: "Gemini CLI's settings.json is not valid JSON, so it was left alone. Fix it, then try again." };
71
+ }
72
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
73
+ return { ok: false, reason: "Gemini CLI's settings.json is not a JSON object, so it was left alone." };
74
+ }
75
+ doc = parsed;
76
+ }
77
+ const hooks = doc.hooks ?? {};
78
+ if (!hooks || typeof hooks !== "object" || Array.isArray(hooks)) {
79
+ return { ok: false, reason: `Gemini CLI's settings have a "hooks" that is not an object, so they were left alone.` };
80
+ }
81
+ const before = hooks.BeforeTool ?? [];
82
+ if (!Array.isArray(before)) {
83
+ return { ok: false, reason: `Gemini CLI's settings have a "BeforeTool" that is not a list, so they were left alone.` };
84
+ }
85
+ const ours = { type: "command", name: GEMINI_HOOK_NAME, command, ...Object.keys(env).length ? { env } : {}, timeout: GEMINI_HOOK_TIMEOUT_MS };
86
+ let placed = false;
87
+ const kept = before.flatMap((group) => {
88
+ const g = group;
89
+ if (!g || typeof g !== "object" || !Array.isArray(g.hooks) || !g.hooks.some(isOurHook)) return [group];
90
+ const others = g.hooks.filter((h) => !isOurHook(h));
91
+ const mine = placed ? [] : [{ matcher: import_hook.GEMINI_HOOK_MATCHER, hooks: [ours] }];
92
+ placed = true;
93
+ return [...mine, ...others.length ? [{ ...g, hooks: others }] : []];
94
+ });
95
+ const next = placed ? kept : [...kept, { matcher: import_hook.GEMINI_HOOK_MATCHER, hooks: [ours] }];
96
+ const merged = { ...doc, hooks: { ...hooks, BeforeTool: next } };
97
+ const text = current ?? "";
98
+ const unchanged = current !== null && JSON.stringify(JSON.parse(current || "{}")) === JSON.stringify(merged);
99
+ const after = unchanged ? text : `${JSON.stringify(merged, null, 2)}
100
+ `;
101
+ const status = text === after ? "unchanged" : current !== null ? "update" : "add";
102
+ return { ok: true, status, before: text, after, diff: status === "unchanged" ? [] : (0, import_claude_desktop_config.lineDiff)(text, after) };
103
+ }
104
+ const NO_DIR = "Gemini CLI's settings folder (~/.gemini) was not found on this computer. Install Gemini CLI and run it once, then try again.";
105
+ const NO_CONNECTOR = "The connector is not built in this checkout, so there is no hook to add yet (npm run build:connector).";
106
+ function readCurrent(dir) {
107
+ if (!import_node_fs.default.existsSync(import_node_path.default.join(dir, GEMINI_SETTINGS_FILE))) return { text: null };
108
+ try {
109
+ return { text: (0, import_confined_fs.readTextWithin)(dir, GEMINI_SETTINGS_FILE, "Gemini CLI settings") };
110
+ } catch {
111
+ return { error: "Gemini CLI's settings.json could not be read (it may be a link, which is not followed), so it was left alone." };
112
+ }
113
+ }
114
+ function previewGeminiHook(where, connector) {
115
+ const dir = geminiDir(where);
116
+ if (!dir) return { ok: false, reason: NO_DIR };
117
+ if (!connector) return { ok: false, reason: NO_CONNECTOR };
118
+ const current = readCurrent(dir);
119
+ if ("error" in current) return { ok: false, reason: current.error };
120
+ const plan = planGeminiHook(current.text, geminiHookCommand(connector), connector.env);
121
+ if (!plan.ok) return plan;
122
+ return {
123
+ ok: true,
124
+ dir,
125
+ path: import_node_path.default.join(dir, GEMINI_SETTINGS_FILE),
126
+ status: plan.status,
127
+ diff: plan.diff,
128
+ beforeHash: (0, import_claude_desktop_config.hashOf)(current.text),
129
+ exists: current.text !== null,
130
+ ...connector.caveat ? { caveat: connector.caveat } : {}
131
+ };
132
+ }
133
+ const stampOf = (now) => now.toISOString().replace(/[:.]/g, "-");
134
+ function applyGeminiHook(where, connector, shownHash, now = /* @__PURE__ */ new Date()) {
135
+ const dir = geminiDir(where);
136
+ if (!dir) return { ok: false, reason: NO_DIR };
137
+ if (!connector) return { ok: false, reason: NO_CONNECTOR };
138
+ const current = readCurrent(dir);
139
+ if ("error" in current) return { ok: false, reason: current.error };
140
+ if ((0, import_claude_desktop_config.hashOf)(current.text) !== shownHash) {
141
+ return { ok: false, changed: true, reason: "Gemini CLI's settings.json changed after you looked at it. Here is the change again, against the file as it is now." };
142
+ }
143
+ const plan = planGeminiHook(current.text, geminiHookCommand(connector), connector.env);
144
+ if (!plan.ok) return plan;
145
+ const target = import_node_path.default.join(dir, GEMINI_SETTINGS_FILE);
146
+ if (plan.status === "unchanged") return { ok: true, path: target, backupPath: null, status: "unchanged" };
147
+ try {
148
+ let backupPath = null;
149
+ if (current.text !== null) {
150
+ backupPath = (0, import_confined_fs.writeFileWithin)(dir, `settings.before-codetrellis-${stampOf(now)}.json`, current.text, "Gemini CLI settings backup");
151
+ }
152
+ (0, import_confined_fs.writeFileWithin)(dir, GEMINI_SETTINGS_FILE, plan.after, "Gemini CLI settings");
153
+ return { ok: true, path: target, backupPath, status: plan.status };
154
+ } catch {
155
+ return { ok: false, reason: "Gemini CLI's settings.json could not be written (a link at its place is not written through)." };
156
+ }
157
+ }
158
+ function thisMachine() {
159
+ return { home: import_node_os.default.homedir(), env: process.env, exists: (p) => import_node_fs.default.existsSync(p) };
160
+ }
161
+ // Annotate the CommonJS export names for ESM import in node:
162
+ 0 && (module.exports = {
163
+ GEMINI_HOOK_NAME,
164
+ GEMINI_HOOK_TIMEOUT_MS,
165
+ GEMINI_SETTINGS_FILE,
166
+ applyGeminiHook,
167
+ geminiDir,
168
+ geminiHookCommand,
169
+ planGeminiHook,
170
+ previewGeminiHook,
171
+ thisMachine
172
+ });