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,140 @@
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 agent_turns_exports = {};
19
+ __export(agent_turns_exports, {
20
+ TURN_GAP_MS: () => import_turn_gap.TURN_GAP_MS,
21
+ formatDuration: () => formatDuration,
22
+ formatRelative: () => formatRelative,
23
+ groupIntoTurns: () => groupIntoTurns
24
+ });
25
+ module.exports = __toCommonJS(agent_turns_exports);
26
+ var import_tool_phrasing = require("./tool-phrasing");
27
+ var import_turn_gap = require("./turn-gap");
28
+ function sessionOf(event) {
29
+ const s = event.payload?.sessionId;
30
+ return typeof s === "string" ? s : null;
31
+ }
32
+ function stringField(event, key) {
33
+ const v = event.payload?.[key];
34
+ return typeof v === "string" ? v : null;
35
+ }
36
+ function fileOf(event) {
37
+ const f = event.payload?.file ?? event.payload?.path ?? event.payload?.relativePath;
38
+ if (typeof f !== "string" || !f) return null;
39
+ return f.split("/").pop() ?? null;
40
+ }
41
+ function groupIntoTurns(events, gapMs = import_turn_gap.TURN_GAP_MS, vocabulary = "code") {
42
+ if (events.length === 0) return [];
43
+ const sorted = [...events].sort((a, b) => a.timestamp - b.timestamp);
44
+ const openBySession = /* @__PURE__ */ new Map();
45
+ const turns = [];
46
+ for (const event of sorted) {
47
+ const sessionId = sessionOf(event);
48
+ const key = sessionId ?? `__no_session__:${stringField(event, "workstreamRoot") ?? ""}`;
49
+ const open = openBySession.get(key);
50
+ if (open && event.timestamp - open.endedAt <= gapMs) {
51
+ open.events.push(event);
52
+ open.endedAt = event.timestamp;
53
+ open.durationMs = open.endedAt - open.startedAt;
54
+ continue;
55
+ }
56
+ const turn = {
57
+ id: event.id,
58
+ sessionId,
59
+ agentType: stringField(event, "agentType"),
60
+ agentModel: stringField(event, "agentModel"),
61
+ startedAt: event.timestamp,
62
+ endedAt: event.timestamp,
63
+ durationMs: 0,
64
+ events: [event],
65
+ summary: "",
66
+ mutating: false,
67
+ hasError: false,
68
+ files: []
69
+ };
70
+ openBySession.set(key, turn);
71
+ turns.push(turn);
72
+ }
73
+ for (const turn of turns) finalise(turn, vocabulary);
74
+ return turns;
75
+ }
76
+ function finalise(turn, vocabulary) {
77
+ const phrased = turn.events.map((e) => ({ event: e, phrased: (0, import_tool_phrasing.phraseEvent)(e, vocabulary) }));
78
+ turn.hasError = phrased.some((p) => p.phrased.intent === "error");
79
+ turn.mutating = phrased.some((p) => p.phrased.mutating);
80
+ const files = [];
81
+ for (const { event } of phrased) {
82
+ const f = fileOf(event);
83
+ if (f && !files.includes(f)) files.push(f);
84
+ }
85
+ turn.files = files;
86
+ if (!turn.agentType) {
87
+ turn.agentType = phrased.map((p) => stringField(p.event, "agentType")).find((v) => v) ?? null;
88
+ }
89
+ if (!turn.agentModel) {
90
+ turn.agentModel = phrased.map((p) => stringField(p.event, "agentModel")).find((v) => v) ?? null;
91
+ }
92
+ turn.summary = summarise(turn, phrased.map((p) => p.phrased));
93
+ }
94
+ function summarise(turn, phrased) {
95
+ const count = turn.events.length;
96
+ const suffix = count > 1 ? ` \xB7 ${count} calls` : "";
97
+ const error = phrased.find((p) => p.intent === "error");
98
+ if (error) return `${error.text}${suffix}`;
99
+ const ask = phrased.find((p) => p.intent === "ask");
100
+ if (ask) return `${ask.text}${suffix}`;
101
+ const mutations = phrased.filter((p) => p.mutating);
102
+ if (mutations.length > 0) {
103
+ const headline = mutations[mutations.length - 1].text;
104
+ const others = mutations.length > 1 ? ` (+${mutations.length - 1} more)` : "";
105
+ return `${headline}${others}${suffix}`;
106
+ }
107
+ const session = phrased.find((p) => p.intent === "session");
108
+ if (session && count === 1) return session.text;
109
+ const reads = phrased.filter((p) => p.intent === "read");
110
+ if (reads.length > 0) {
111
+ return reads.length === 1 ? reads[0].text : `${reads[0].text}${suffix}`;
112
+ }
113
+ return phrased[0]?.text ?? `${count} events`;
114
+ }
115
+ function formatDuration(ms) {
116
+ if (ms < 1e3) return "\u2014";
117
+ const totalSeconds = Math.round(ms / 1e3);
118
+ if (totalSeconds < 60) return `${totalSeconds}s`;
119
+ const minutes = Math.floor(totalSeconds / 60);
120
+ const seconds = totalSeconds % 60;
121
+ return `${minutes}m ${String(seconds).padStart(2, "0")}s`;
122
+ }
123
+ function formatRelative(timestamp, now = Date.now()) {
124
+ const delta = Math.max(0, now - timestamp);
125
+ const seconds = Math.round(delta / 1e3);
126
+ if (seconds < 45) return "just now";
127
+ const minutes = Math.round(seconds / 60);
128
+ if (minutes < 60) return `${minutes} minute${minutes === 1 ? "" : "s"} ago`;
129
+ const hours = Math.round(minutes / 60);
130
+ if (hours < 24) return `${hours} hour${hours === 1 ? "" : "s"} ago`;
131
+ const days = Math.round(hours / 24);
132
+ return `${days} day${days === 1 ? "" : "s"} ago`;
133
+ }
134
+ // Annotate the CommonJS export names for ESM import in node:
135
+ 0 && (module.exports = {
136
+ TURN_GAP_MS,
137
+ formatDuration,
138
+ formatRelative,
139
+ groupIntoTurns
140
+ });
@@ -0,0 +1,120 @@
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_digest_exports = {};
19
+ __export(awareness_digest_exports, {
20
+ DIGEST_MAX_LINES: () => DIGEST_MAX_LINES,
21
+ buildDigest: () => buildDigest,
22
+ digestText: () => digestText
23
+ });
24
+ module.exports = __toCommonJS(awareness_digest_exports);
25
+ const DIGEST_MAX_LINES = 5;
26
+ const RANK = { high: 0, medium: 1, low: 2 };
27
+ const QUESTION = {
28
+ collision: "who goes first, or is it intended?",
29
+ contract: "keep the old signature, or update the callers?",
30
+ drift: "is the wider scope meant?",
31
+ "stale-base": "rebase now, or later?",
32
+ "version-split": "which version should both use?",
33
+ "state-split": "which state is right?",
34
+ rule: "route it through what the rule allows, or change the rule?"
35
+ };
36
+ const MATERIAL_QUESTION = {
37
+ contract: "check the cited parts again, or keep the old version?",
38
+ collision: "which task writes it?",
39
+ drift: "is the file meant to be shared?",
40
+ "stale-base": "read it again, or keep the old version?"
41
+ };
42
+ const listed = (names, max = 2) => names.length <= max ? names.join(", ") : `${names.slice(0, max).join(", ")} and ${names.length - max} more`;
43
+ const plural = (n, word) => `${n} ${word}${n === 1 ? "" : "s"}`;
44
+ function subjectOf(s) {
45
+ if (s.subject.file && s.subject.symbol) return `${s.subject.file} \u2192 ${s.subject.symbol}`;
46
+ return s.subject.file ?? (s.subject.files ?? []).join(", ");
47
+ }
48
+ function lineText(kind, group, label) {
49
+ const first = group[0];
50
+ if (first.subject.material) return first.summary;
51
+ const names = (roots) => roots.map((r) => `\`${label(r)}\``);
52
+ if (kind === "contract") {
53
+ const by = first.subject.by ?? first.workstreams[0];
54
+ const others = names(first.workstreams.filter((w) => w !== by)).join(" and ");
55
+ const symbols = [...new Set(group.map((s) => s.subject.symbol ?? "?"))];
56
+ const removed = group.every((s) => s.subject.change === "removed");
57
+ if (group.length === 1) {
58
+ return removed ? `\`${label(by)}\` removed ${symbols[0]}; ${others} imports it` : `\`${label(by)}\` changed ${symbols[0]}'s signature; ${others} imports it`;
59
+ }
60
+ return `\`${label(by)}\` changed ${plural(symbols.length, "exported name")} ${others} imports: ${listed(symbols)}`;
61
+ }
62
+ if (kind === "drift") {
63
+ const files = [...new Set(group.flatMap((s) => s.subject.files ?? []))];
64
+ const rules = [...new Set(group.flatMap((s) => (s.subject.rules ?? []).map((r) => r.id)))];
65
+ return `${names(first.workstreams)[0]} changes ${plural(files.length, "file")} outside its scope: ${listed(files)}${rules.length ? `, where ${rules.length === 1 ? "the rule" : "the rules"} ${rules.length <= 2 ? rules.join(" and ") : listed(rules)} ${rules.length === 1 ? "applies" : "apply"}` : ""}`;
66
+ }
67
+ if (kind === "rule") {
68
+ const rules = [...new Set(group.map((s) => s.subject.rule?.words ?? "?"))];
69
+ const edges = group.flatMap((s) => (s.subject.edges ?? []).map((e) => `${e.from} \u2192 ${e.to}`));
70
+ return `${names(first.workstreams)[0]} now imports across ${rules.length === 1 ? `the rule \u201C${rules[0]}\u201D` : plural(rules.length, "rule")}: ${listed(edges)}`;
71
+ }
72
+ const pair = names(first.workstreams).join(" and ");
73
+ if (group.length === 1) {
74
+ const declared = first.subject.intended?.length ? " (declared, not yet edited)" : "";
75
+ return `${pair} both change ${subjectOf(first)}${declared}`;
76
+ }
77
+ return `${pair} both change ${plural(group.length, "thing")}: ${listed(group.map(subjectOf))}`;
78
+ }
79
+ function buildDigest(signals, label, opts = {}) {
80
+ const live = signals.filter((s) => s.state !== "resolved");
81
+ const needs = live.filter((s) => s.state === "open" && s.severity !== "low");
82
+ const low = live.filter((s) => s.state === "open" && s.severity === "low").length;
83
+ const groups = /* @__PURE__ */ new Map();
84
+ for (const s of needs) {
85
+ const key = s.subject.material ? `material\0${s.id}` : `${s.kind}\0${s.kind === "contract" ? `${s.subject.by ?? ""}\0` : ""}${[...s.workstreams].sort().join("\0")}`;
86
+ groups.set(key, [...groups.get(key) ?? [], s]);
87
+ }
88
+ const ordered = [...groups.values()].map((g) => g.sort((a, b) => RANK[a.severity] - RANK[b.severity] || b.lastSeen - a.lastSeen)).sort((a, b) => RANK[a[0].severity] - RANK[b[0].severity] || b[0].lastSeen - a[0].lastSeen);
89
+ const max = opts.maxLines ?? DIGEST_MAX_LINES;
90
+ const lines = ordered.slice(0, max).map((g) => ({
91
+ kind: g[0].kind,
92
+ severity: g[0].severity,
93
+ signalIds: g.map((s) => s.id),
94
+ text: lineText(g[0].kind, g, label),
95
+ told: g.every((s) => (s.told ?? []).some((t) => t.toldAt !== null)),
96
+ question: (g[0].subject.material ? MATERIAL_QUESTION[g[0].kind] : void 0) ?? QUESTION[g[0].kind]
97
+ }));
98
+ return {
99
+ needsYou: needs.length,
100
+ lines,
101
+ moreLines: Math.max(0, ordered.length - max),
102
+ low,
103
+ newSince: opts.since == null ? null : needs.filter((s) => s.firstSeen > opts.since).length
104
+ };
105
+ }
106
+ function digestText(d) {
107
+ if (d.needsYou === 0) {
108
+ return d.low ? `Nothing needs attention; ${plural(d.low, "low-priority note")}.` : "Nothing overlaps with other work right now.";
109
+ }
110
+ const lines = d.lines.map((l) => `${l.text}.${l.told ? " Agents told." : ""} Waiting on the person: ${l.question}`);
111
+ if (d.moreLines) lines.push(`And ${plural(d.moreLines, "more overlap")}.`);
112
+ if (d.low) lines.push(`${plural(d.low, "low-priority note")}.`);
113
+ return `${plural(d.needsYou, "signal")} ${d.needsYou === 1 ? "needs" : "need"} attention. ${lines.join(" ")}`;
114
+ }
115
+ // Annotate the CommonJS export names for ESM import in node:
116
+ 0 && (module.exports = {
117
+ DIGEST_MAX_LINES,
118
+ buildDigest,
119
+ digestText
120
+ });
@@ -0,0 +1,45 @@
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 branch_name_exports = {};
19
+ __export(branch_name_exports, {
20
+ slugPart: () => slugPart,
21
+ suggestSectionBranch: () => suggestSectionBranch,
22
+ worktreeDirFor: () => worktreeDirFor
23
+ });
24
+ module.exports = __toCommonJS(branch_name_exports);
25
+ function slugPart(text, max = 40) {
26
+ return text.normalize("NFKD").replace(/[̀-ͯ]/g, "").toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "").slice(0, max).replace(/-+$/g, "");
27
+ }
28
+ function suggestSectionBranch(planTitle, sectionTitle) {
29
+ const parts = [slugPart(planTitle, 30), slugPart(sectionTitle, 40)].filter(Boolean);
30
+ return parts.join("-") || "section";
31
+ }
32
+ function worktreeDirFor(projectRoot, branch) {
33
+ const root = projectRoot.replace(/[\\/]+$/, "");
34
+ const sep = root.includes("\\") && !root.includes("/") ? "\\" : "/";
35
+ const i = Math.max(root.lastIndexOf("/"), root.lastIndexOf("\\"));
36
+ const parent = i > 0 ? root.slice(0, i) : root;
37
+ const name = i >= 0 ? root.slice(i + 1) : root;
38
+ return `${parent}${sep}${name}-${branch.replace(/[/\\]+/g, "-")}`;
39
+ }
40
+ // Annotate the CommonJS export names for ESM import in node:
41
+ 0 && (module.exports = {
42
+ slugPart,
43
+ suggestSectionBranch,
44
+ worktreeDirFor
45
+ });
@@ -0,0 +1,118 @@
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 breakpoint_words_exports = {};
19
+ __export(breakpoint_words_exports, {
20
+ agentName: () => agentName,
21
+ changedLines: () => changedLines,
22
+ decisionLabels: () => decisionLabels,
23
+ hitHeadline: () => hitHeadline,
24
+ hitWhy: () => hitWhy,
25
+ reliedOnLine: () => reliedOnLine,
26
+ subjectOf: () => subjectOf
27
+ });
28
+ module.exports = __toCommonJS(breakpoint_words_exports);
29
+ function agentName(agent) {
30
+ if (!agent) return "An agent";
31
+ if (agent === "claude-code" || agent === "claude-code-hook") return "Claude Code";
32
+ if (agent === "mcp-agent") return "An agent";
33
+ return agent;
34
+ }
35
+ const DOING = {
36
+ claim: "claim",
37
+ done: "mark done",
38
+ edit: "change the description of",
39
+ delete: "delete",
40
+ edit_code: "change",
41
+ breach: "change",
42
+ propose: "change the spec",
43
+ disk: "change"
44
+ };
45
+ function subjectOf(hit) {
46
+ const at = hit.breakpointTarget ? hit.breakpointTarget.indexOf("#") : -1;
47
+ if (hit.path && at > 0) return `${hit.breakpointTarget.slice(at + 1)} in ${hit.path}`;
48
+ return hit.path ?? hit.itemTitle ?? hit.itemUid;
49
+ }
50
+ function hitHeadline(hit, where) {
51
+ const who = agentName(hit.agent);
52
+ const inWs = where ? ` in ${where}` : "";
53
+ if (hit.breach) return `${who}${inWs} changed ${subjectOf(hit)} past a breakpoint`;
54
+ if (hit.action === "disk") return `\u201C${subjectOf(hit)}\u201D changed on disk`;
55
+ return `${who}${inWs} wants to ${DOING[hit.action]} \u201C${subjectOf(hit)}\u201D`;
56
+ }
57
+ function reliedOnLine(r) {
58
+ const tasks = `${r.tasks} ${r.tasks === 1 ? "task" : "tasks"}`;
59
+ const plans = `${r.plans} ${r.plans === 1 ? "plan" : "plans"}`;
60
+ return `${tasks} in ${plans} ${r.tasks === 1 ? "relies" : "rely"} on this page`;
61
+ }
62
+ function hitWhy(hit) {
63
+ if (hit.breach) return "It could not be paused: this agent edits with its own editor. It has been told to stop and wait.";
64
+ switch (hit.kind) {
65
+ case "task":
66
+ return "You asked to be asked before an agent claims or finishes this task.";
67
+ case "spec":
68
+ if (hit.action === "disk") {
69
+ return "You guard this document. Its file changed on disk, and the app kept its own version until you decide: apply the file to take its version, or keep the app's and it is written back to the file.";
70
+ }
71
+ if (hit.reliedOn && hit.reliedOn.tasks > 0) {
72
+ return `You asked to be asked before an agent changes this description. ${reliedOnLine(hit.reliedOn)}; the agent was told a proposal would let their agents weigh in.`;
73
+ }
74
+ return "You asked to be asked before an agent changes this description.";
75
+ case "code":
76
+ return "You asked to be asked before this code changes. The edit was not made.";
77
+ case "signal":
78
+ return "A serious signal names this workstream, and you asked to be asked while one is open.";
79
+ case "proposal":
80
+ return "A spec others rely on would change. Nothing changes until you decide.";
81
+ default:
82
+ return "You set a breakpoint here.";
83
+ }
84
+ }
85
+ function decisionLabels(hit) {
86
+ if (hit.action === "disk") return { continue: "Apply the file", steer: "Apply the file, with a note", stop: "Keep the app's version" };
87
+ if (hit.action === "propose") return { continue: "Accept", steer: "Accept, with a note", stop: "Reject" };
88
+ return hit.breach ? { continue: "Carry on", steer: "Carry on with this note", stop: "Stop" } : { continue: "Continue", steer: "Continue with steer", stop: "Stop" };
89
+ }
90
+ function changedLines(before, after, context = 1) {
91
+ if (before.replace(/\n+$/, "") === after.replace(/\n+$/, "")) return { before: "", after: "", from: 1 };
92
+ const a = before.replace(/\n+$/, "").split("\n");
93
+ const b = after.replace(/\n+$/, "").split("\n");
94
+ let start = 0;
95
+ while (start < a.length && start < b.length && a[start] === b[start]) start++;
96
+ let endA = a.length;
97
+ let endB = b.length;
98
+ while (endA > start && endB > start && a[endA - 1] === b[endB - 1]) {
99
+ endA--;
100
+ endB--;
101
+ }
102
+ const from = Math.max(0, start - context);
103
+ return {
104
+ before: a.slice(from, Math.min(a.length, endA + context)).join("\n"),
105
+ after: b.slice(from, Math.min(b.length, endB + context)).join("\n"),
106
+ from: from + 1
107
+ };
108
+ }
109
+ // Annotate the CommonJS export names for ESM import in node:
110
+ 0 && (module.exports = {
111
+ agentName,
112
+ changedLines,
113
+ decisionLabels,
114
+ hitHeadline,
115
+ hitWhy,
116
+ reliedOnLine,
117
+ subjectOf
118
+ });
@@ -0,0 +1,56 @@
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 budget_words_exports = {};
19
+ __export(budget_words_exports, {
20
+ describeBudgetChange: () => describeBudgetChange,
21
+ formatCost: () => formatCost,
22
+ formatMinutes: () => formatMinutes
23
+ });
24
+ module.exports = __toCommonJS(budget_words_exports);
25
+ function formatMinutes(mins) {
26
+ if (mins < 1) return "<1m";
27
+ if (mins < 60) return `${Math.round(mins)}m`;
28
+ const h = Math.floor(mins / 60);
29
+ const m = Math.round(mins % 60);
30
+ return m === 0 ? `${h}h` : `${h}h ${m}m`;
31
+ }
32
+ function formatCost(usd) {
33
+ if (usd === null) return "not reported";
34
+ if (usd < 0.01) return "<$0.01";
35
+ return `$${usd.toFixed(2)}`;
36
+ }
37
+ function describeBudgetChange(before, after) {
38
+ const was = before ?? { minutes: null, costUsd: null, exempt: false };
39
+ const parts = [];
40
+ const dimension = (label, from, to, fmt) => {
41
+ if (from === to) return;
42
+ if (to === null) parts.push(`cleared the ${label} ceiling (was ${fmt(from)})`);
43
+ else if (from === null) parts.push(`set a ${label} ceiling of ${fmt(to)}`);
44
+ else parts.push(`${to > from ? "raised" : "lowered"} the ${label} ceiling ${fmt(from)} \u2192 ${fmt(to)}`);
45
+ };
46
+ dimension("time", was.minutes, after.minutes, formatMinutes);
47
+ dimension("cost", was.costUsd, after.costUsd, (n) => formatCost(n));
48
+ if (was.exempt !== after.exempt) parts.push(after.exempt ? "exempted the plan from its ceiling" : "ended the exemption");
49
+ return parts.join(", ") || "changed the budget";
50
+ }
51
+ // Annotate the CommonJS export names for ESM import in node:
52
+ 0 && (module.exports = {
53
+ describeBudgetChange,
54
+ formatCost,
55
+ formatMinutes
56
+ });
@@ -0,0 +1,69 @@
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 burst_exports = {};
19
+ __export(burst_exports, {
20
+ burst: () => burst
21
+ });
22
+ module.exports = __toCommonJS(burst_exports);
23
+ const realTimers = {
24
+ set: (fn, ms) => {
25
+ const t = setTimeout(fn, ms);
26
+ t.unref?.();
27
+ return t;
28
+ },
29
+ clear: (h) => clearTimeout(h),
30
+ now: () => Date.now()
31
+ };
32
+ function burst(onFlush, opts) {
33
+ const timers = opts.timers ?? realTimers;
34
+ const open = /* @__PURE__ */ new Map();
35
+ const fire = (key) => {
36
+ const b = open.get(key);
37
+ if (!b) return;
38
+ timers.clear(b.handle);
39
+ open.delete(key);
40
+ onFlush(key, [...b.items]);
41
+ };
42
+ const arm = (key) => {
43
+ const b = open.get(key);
44
+ timers.clear(b.handle);
45
+ const untilQuiet = opts.quietMs;
46
+ const untilMax = Math.max(0, b.firstAt + opts.maxWaitMs - timers.now());
47
+ b.handle = timers.set(() => fire(key), Math.min(untilQuiet, untilMax));
48
+ };
49
+ return {
50
+ add(key, item) {
51
+ let b = open.get(key);
52
+ if (!b) open.set(key, b = { items: /* @__PURE__ */ new Set(), firstAt: timers.now(), handle: null });
53
+ b.items.add(item);
54
+ arm(key);
55
+ },
56
+ flush(key) {
57
+ for (const k of key === void 0 ? [...open.keys()] : [key]) fire(k);
58
+ },
59
+ cancel() {
60
+ for (const b of open.values()) timers.clear(b.handle);
61
+ open.clear();
62
+ },
63
+ pending: () => [...open.keys()]
64
+ };
65
+ }
66
+ // Annotate the CommonJS export names for ESM import in node:
67
+ 0 && (module.exports = {
68
+ burst
69
+ });
@@ -0,0 +1,105 @@
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 call_entry_exports = {};
19
+ __export(call_entry_exports, {
20
+ callEntry: () => callEntry,
21
+ callMatches: () => callMatches,
22
+ callProblem: () => callProblem,
23
+ callWords: () => callWords,
24
+ isCallEntry: () => isCallEntry,
25
+ isOwnKind: () => isOwnKind,
26
+ normaliseCall: () => normaliseCall
27
+ });
28
+ module.exports = __toCommonJS(call_entry_exports);
29
+ var import_package_entry = require("./package-entry");
30
+ const CALL_RE = /^([a-z][a-z0-9-]{0,30}):(\S.*)$/;
31
+ const NOT_CALLS = /* @__PURE__ */ new Set([...import_package_entry.PACKAGE_ECOSYSTEMS, "grep", "file", "folder"]);
32
+ const callParts = (s) => {
33
+ const m = CALL_RE.exec(s);
34
+ return m && !NOT_CALLS.has(m[1]) ? [m[1], m[2]] : null;
35
+ };
36
+ function isCallEntry(s) {
37
+ return callParts(s) !== null;
38
+ }
39
+ function isOwnKind(s) {
40
+ const p = callParts(s);
41
+ return !!p && p[0] !== "http" && p[0] !== "sql";
42
+ }
43
+ function callEntry(cs) {
44
+ if (cs.kind === "http_call") {
45
+ const p = cs.urlPattern ?? "";
46
+ if (!cs.host && !p) return null;
47
+ return `http:${cs.host ?? ""}${p === "/" && cs.host ? "" : p}`;
48
+ }
49
+ if (cs.kind === "sql_query" && cs.urlPattern) return `sql:${cs.urlPattern.toLowerCase()}`;
50
+ if (cs.kind === "subprocess" && cs.urlPattern) return `exec:${cs.urlPattern}`;
51
+ if (cs.kind === "env_lookup" && cs.urlPattern) return `env:${cs.urlPattern}`;
52
+ if (cs.kind === "entry" && cs.urlPattern && isOwnKind(cs.urlPattern)) return cs.urlPattern;
53
+ return null;
54
+ }
55
+ function callProblem(s) {
56
+ const m = typeof s === "string" ? callParts(s.trim()) : null;
57
+ if (!m) return "calls must be http: and a host or a path, sql: and a table, or a kind of your own and a name, like http:api.stripe.com, sql:payments or queue:orders";
58
+ const rest = m[1];
59
+ if (m[0] !== "http" && m[0] !== "sql") return /\s/.test(rest) ? `a ${m[0]} entry is one name, with no spaces, like ${m[0]}:orders.created` : null;
60
+ if (m[0] === "http" && !/^(?:[a-z0-9-]+(?:\.[a-z0-9-]+)+|localhost)?(?:\/\S*)?$/i.test(rest)) return "an http call is a host, a path, or both, like api.stripe.com/v1/charges";
61
+ if (m[0] === "sql" && !/^[A-Za-z_][\w.]*$/.test(rest)) return "a sql call is a table name, like payments";
62
+ return null;
63
+ }
64
+ function normaliseCall(s) {
65
+ const m = CALL_RE.exec(s.trim());
66
+ if (m[1] === "sql") return `sql:${m[2].toLowerCase()}`;
67
+ if (m[1] !== "http") return `${m[1]}:${m[2]}`;
68
+ const slash = m[2].indexOf("/");
69
+ const host = (slash < 0 ? m[2] : m[2].slice(0, slash)).toLowerCase();
70
+ const path = slash < 0 ? "" : m[2].slice(slash).replace(/\/+$/, "");
71
+ return `http:${host}${path}`;
72
+ }
73
+ function callMatches(ruleCall, entry) {
74
+ const r = callParts(ruleCall);
75
+ const e = callParts(entry);
76
+ if (!r || !e || r[0] !== e[0]) return false;
77
+ if (r[0] === "sql") return r[1] === e[1];
78
+ if (r[0] !== "http") return e[1] === r[1] || [".", "/", ":"].some((sep) => e[1].startsWith(r[1] + sep));
79
+ const under = (path, prefix) => prefix === "" || path === prefix || path.startsWith(`${prefix}/`);
80
+ const split = (x) => {
81
+ const i = x.indexOf("/");
82
+ return i < 0 ? [x, ""] : [x.slice(0, i), x.slice(i)];
83
+ };
84
+ const [rh, rp] = split(r[1]);
85
+ const [eh, ep] = split(e[1]);
86
+ if (rh === "") return under(ep, rp);
87
+ return rh === eh && under(ep, rp);
88
+ }
89
+ function callWords(entry) {
90
+ const m = callParts(entry);
91
+ if (!m) return entry;
92
+ if (m[0] === "exec") return m[1] === "*" ? "any command" : `the command ${m[1]}`;
93
+ if (m[0] === "env") return m[1] === "*" ? "any environment variable" : `the environment variable ${m[1]}`;
94
+ return m[0] === "sql" ? `the table ${m[1]}` : m[0] === "http" ? m[1] : entry;
95
+ }
96
+ // Annotate the CommonJS export names for ESM import in node:
97
+ 0 && (module.exports = {
98
+ callEntry,
99
+ callMatches,
100
+ callProblem,
101
+ callWords,
102
+ isCallEntry,
103
+ isOwnKind,
104
+ normaliseCall
105
+ });