@unerr-ai/unerr 0.1.0 → 0.1.1

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 (553) hide show
  1. package/dist/__tests__/architecture-guard.test.js +122 -0
  2. package/dist/__tests__/arg-validator.test.js +205 -0
  3. package/dist/__tests__/ast-extractor.test.js +203 -0
  4. package/dist/__tests__/auto-bootstrap.test.js +280 -0
  5. package/dist/__tests__/background-indexer.test.js +228 -0
  6. package/dist/__tests__/blast-radius-engine.test.js +200 -0
  7. package/dist/__tests__/bridge-isolation.test.js +37 -0
  8. package/dist/__tests__/budget-enforcer.test.js +53 -0
  9. package/dist/__tests__/cfg-test-detection-perf.test.js +82 -0
  10. package/dist/__tests__/change-narrative.test.js +190 -0
  11. package/dist/__tests__/check-commit.test.js +258 -0
  12. package/dist/__tests__/checksum.test.js +34 -0
  13. package/dist/__tests__/commit-watcher.test.js +154 -0
  14. package/dist/__tests__/community-detection.test.js +179 -0
  15. package/dist/__tests__/community-tools.test.js +299 -0
  16. package/dist/__tests__/components.test.js +449 -0
  17. package/dist/__tests__/compression-log.test.js +174 -0
  18. package/dist/__tests__/compression-quality-monitor.test.js +40 -0
  19. package/dist/__tests__/config-healer.test.js +165 -0
  20. package/dist/__tests__/context-ledger.test.js +58 -0
  21. package/dist/__tests__/convention-detector.test.js +99 -0
  22. package/dist/__tests__/convention-learner.test.js +86 -0
  23. package/dist/__tests__/correction-detector.test.js +330 -0
  24. package/dist/__tests__/daemon-autostart-install.test.js +283 -0
  25. package/dist/__tests__/daemon-bridge.test.js +222 -0
  26. package/dist/__tests__/daemon-dashboard.test.js +202 -0
  27. package/dist/__tests__/daemon-registry.test.js +240 -0
  28. package/dist/__tests__/daemon-supervisor.test.js +318 -0
  29. package/dist/__tests__/daemon-version-check.test.js +275 -0
  30. package/dist/__tests__/decision-point-detector.test.js +98 -0
  31. package/dist/__tests__/deep-link.test.js +143 -0
  32. package/dist/__tests__/disallowed-tools.test.js +115 -0
  33. package/dist/__tests__/drift-tracker.test.js +582 -0
  34. package/dist/__tests__/durability-scorer.test.js +152 -0
  35. package/dist/__tests__/efficiency-tracker.test.js +65 -0
  36. package/dist/__tests__/enrich.test.js +144 -0
  37. package/dist/__tests__/entity-rewind.test.js +248 -0
  38. package/dist/__tests__/ephemeral.test.js +111 -0
  39. package/dist/__tests__/exploration-cost.test.js +93 -0
  40. package/dist/__tests__/fact-generator.test.js +197 -0
  41. package/dist/__tests__/file-l0-graph.test.js +244 -0
  42. package/dist/__tests__/file-logger.test.js +82 -0
  43. package/dist/__tests__/file-outline.test.js +141 -0
  44. package/dist/__tests__/file-read-protocol.test.js +188 -0
  45. package/dist/__tests__/format-encoder.test.js +233 -0
  46. package/dist/__tests__/git-attribution.test.js +259 -0
  47. package/dist/__tests__/graph-temporal-joiner.test.js +219 -0
  48. package/dist/__tests__/health-grade-enhanced.test.js +138 -0
  49. package/dist/__tests__/health-map-data.test.js +173 -0
  50. package/dist/__tests__/helpers/mcp-harness.js +45 -0
  51. package/dist/__tests__/helpers/mcp-harness.test.js +68 -0
  52. package/dist/__tests__/hook-dedup.test.js +112 -0
  53. package/dist/__tests__/hook-runner.test.js +253 -0
  54. package/dist/__tests__/indexer-cfg.test.js +185 -0
  55. package/dist/__tests__/indexer-cross-file.test.js +172 -0
  56. package/dist/__tests__/indexer-extraction.test.js +245 -0
  57. package/dist/__tests__/indexer-incremental.test.js +232 -0
  58. package/dist/__tests__/indexer-language-expansion.test.js +165 -0
  59. package/dist/__tests__/init-push.test.js +131 -0
  60. package/dist/__tests__/instruction-writer.test.js +179 -0
  61. package/dist/__tests__/intelligence-integration.test.js +217 -0
  62. package/dist/__tests__/intent-correlator.test.js +175 -0
  63. package/dist/__tests__/intent-detector.test.js +235 -0
  64. package/dist/__tests__/intent-encoder.test.js +167 -0
  65. package/dist/__tests__/java-build-tool-detection.test.js +174 -0
  66. package/dist/__tests__/layer3-sprint-q.test.js +160 -0
  67. package/dist/__tests__/layer3-sprint-r.test.js +91 -0
  68. package/dist/__tests__/layer3-sprint-s.test.js +183 -0
  69. package/dist/__tests__/layer3-sprint-t.test.js +201 -0
  70. package/dist/__tests__/layer3-sprint-u.test.js +174 -0
  71. package/dist/__tests__/layer4-sprint-ba2.test.js +354 -0
  72. package/dist/__tests__/layer4-sprint-ba4.test.js +84 -0
  73. package/dist/__tests__/layer4-sprint-vs.test.js +105 -0
  74. package/dist/__tests__/ledger-chains.test.js +162 -0
  75. package/dist/__tests__/lifecycle-machine.test.js +226 -0
  76. package/dist/__tests__/local-chat-provider.test.js +170 -0
  77. package/dist/__tests__/local-convention-detector.test.js +308 -0
  78. package/dist/__tests__/local-embeddings.test.js +422 -0
  79. package/dist/__tests__/local-graph.test.js +540 -0
  80. package/dist/__tests__/local-indexer.test.js +228 -0
  81. package/dist/__tests__/local-intelligence-l3.test.js +332 -0
  82. package/dist/__tests__/local-llm.test.js +253 -0
  83. package/dist/__tests__/local-mode-offline.test.js +187 -0
  84. package/dist/__tests__/local-mode-stats.test.js +273 -0
  85. package/dist/__tests__/local-mode-tui.test.js +343 -0
  86. package/dist/__tests__/local-parse.test.js +199 -0
  87. package/dist/__tests__/log-tailer.test.js +208 -0
  88. package/dist/__tests__/loop-breaker.test.js +276 -0
  89. package/dist/__tests__/loop-miner.test.js +226 -0
  90. package/dist/__tests__/mcp-config.test.js +126 -0
  91. package/dist/__tests__/mcp-content-json.test.js +10 -0
  92. package/dist/__tests__/mcp-envelope.test.js +124 -0
  93. package/dist/__tests__/metrics-store.test.js +223 -0
  94. package/dist/__tests__/native-watcher.test.js +191 -0
  95. package/dist/__tests__/navigation-hooks-agent-aware.test.js +145 -0
  96. package/dist/__tests__/negative-knowledge.test.js +116 -0
  97. package/dist/__tests__/network-boundary.test.js +190 -0
  98. package/dist/__tests__/network-firewall.test.js +112 -0
  99. package/dist/__tests__/nudge-invariants.test.js +160 -0
  100. package/dist/__tests__/nudge-v2.test.js +225 -0
  101. package/dist/__tests__/offline-rewind.test.js +251 -0
  102. package/dist/__tests__/open-threads.test.js +89 -0
  103. package/dist/__tests__/output-compressor.test.js +93 -0
  104. package/dist/__tests__/pending-violations.test.js +112 -0
  105. package/dist/__tests__/persistence-effectiveness.test.js +143 -0
  106. package/dist/__tests__/provider-factory.test.js +42 -0
  107. package/dist/__tests__/providers.test.js +24 -0
  108. package/dist/__tests__/proxy.test.js +314 -0
  109. package/dist/__tests__/query-router.test.js +1018 -0
  110. package/dist/__tests__/reasoning-quality-route.test.js +138 -0
  111. package/dist/__tests__/redactor.test.js +120 -0
  112. package/dist/__tests__/resource-monitor.test.js +57 -0
  113. package/dist/__tests__/response-envelope.test.js +100 -0
  114. package/dist/__tests__/risk-classifier.test.js +101 -0
  115. package/dist/__tests__/risk-signal-scope.test.js +75 -0
  116. package/dist/__tests__/rule-evaluator.test.js +280 -0
  117. package/dist/__tests__/scip-decoder.test.js +49 -0
  118. package/dist/__tests__/scip-downloader.test.js +201 -0
  119. package/dist/__tests__/scip-merger.test.js +103 -0
  120. package/dist/__tests__/search-index.test.js +422 -0
  121. package/dist/__tests__/semantic-enrichment.test.js +360 -0
  122. package/dist/__tests__/session-brief-builder.test.js +187 -0
  123. package/dist/__tests__/session-context.test.js +221 -0
  124. package/dist/__tests__/session-continuity.test.js +144 -0
  125. package/dist/__tests__/session-dedup.test.js +74 -0
  126. package/dist/__tests__/session-event-wiring.test.js +206 -0
  127. package/dist/__tests__/session-events.test.js +149 -0
  128. package/dist/__tests__/session-legend.test.js +20 -0
  129. package/dist/__tests__/session-persistence.test.js +131 -0
  130. package/dist/__tests__/session-resume-block.test.js +107 -0
  131. package/dist/__tests__/session-resume.test.js +97 -0
  132. package/dist/__tests__/session-summary-writer.test.js +134 -0
  133. package/dist/__tests__/shadow-ledger.test.js +203 -0
  134. package/dist/__tests__/shell-classifier.test.js +151 -0
  135. package/dist/__tests__/shell-compression-floor.test.js +189 -0
  136. package/dist/__tests__/shell-compression-v2.test.js +339 -0
  137. package/dist/__tests__/shell-compressor.test.js +35 -0
  138. package/dist/__tests__/shell-hooks.test.js +128 -0
  139. package/dist/__tests__/shell-strategies.test.js +644 -0
  140. package/dist/__tests__/shell-tee.test.js +133 -0
  141. package/dist/__tests__/signal-dedup.test.js +158 -0
  142. package/dist/__tests__/signal-reinforcer.test.js +77 -0
  143. package/dist/__tests__/signal-scorer.test.js +251 -0
  144. package/dist/__tests__/signal-show-store.test.js +108 -0
  145. package/dist/__tests__/smart-truncate.test.js +215 -0
  146. package/dist/__tests__/snapshot-v2.test.js +113 -0
  147. package/dist/__tests__/sprint-l1-local-mode.test.js +130 -0
  148. package/dist/__tests__/sprint-l10-boot.test.js +220 -0
  149. package/dist/__tests__/sprint-l9-offline-commands.test.js +189 -0
  150. package/dist/__tests__/sprint-q-persistent-context.test.js +198 -0
  151. package/dist/__tests__/sprint-s1-wiring.test.js +215 -0
  152. package/dist/__tests__/sprint-s2-wiring.test.js +256 -0
  153. package/dist/__tests__/sprint-s3-wiring.test.js +195 -0
  154. package/dist/__tests__/sprint-s4-wiring.test.js +213 -0
  155. package/dist/__tests__/sprint-s6-hooks.test.js +222 -0
  156. package/dist/__tests__/sprint-s7-persistent.test.js +263 -0
  157. package/dist/__tests__/sprint-s8-value.test.js +167 -0
  158. package/dist/__tests__/sprint-s9-behavioral.test.js +179 -0
  159. package/dist/__tests__/sprint3-intelligence.test.js +297 -0
  160. package/dist/__tests__/sprint5-mcp-server.test.js +136 -0
  161. package/dist/__tests__/startup-display.test.js +302 -0
  162. package/dist/__tests__/startup-log-file.test.js +97 -0
  163. package/dist/__tests__/stash-manager.test.js +229 -0
  164. package/dist/__tests__/state-detector.test.js +92 -0
  165. package/dist/__tests__/status-dashboard.test.js +142 -0
  166. package/dist/__tests__/temporal-facts.test.js +292 -0
  167. package/dist/__tests__/temporal-routes.test.js +142 -0
  168. package/dist/__tests__/test-detector.test.js +174 -0
  169. package/dist/__tests__/theme.test.js +72 -0
  170. package/dist/__tests__/timeline-agents.test.js +122 -0
  171. package/dist/__tests__/timeline-bootstrap.test.js +176 -0
  172. package/dist/__tests__/timeline-filters.test.js +193 -0
  173. package/dist/__tests__/timeline-markers.test.js +151 -0
  174. package/dist/__tests__/timeline-routes.test.js +156 -0
  175. package/dist/__tests__/timeline-store.test.js +171 -0
  176. package/dist/__tests__/token-counter.test.js +86 -0
  177. package/dist/__tests__/token-estimator.test.js +96 -0
  178. package/dist/__tests__/token-flow-api.test.js +239 -0
  179. package/dist/__tests__/token-flow-instrumentation.test.js +437 -0
  180. package/dist/__tests__/token-flow-persistence.test.js +356 -0
  181. package/dist/__tests__/token-flow-routes.test.js +199 -0
  182. package/dist/__tests__/token-flow.test.js +695 -0
  183. package/dist/__tests__/tool-clusters.test.js +177 -0
  184. package/dist/__tests__/transport-mux.test.js +283 -0
  185. package/dist/__tests__/turn-segmenter.test.js +166 -0
  186. package/dist/__tests__/uninstall.test.js +141 -0
  187. package/dist/__tests__/warm-start-policy.test.js +271 -0
  188. package/dist/__tests__/wire-cap-nudge.test.js +77 -0
  189. package/dist/__tests__/worker-pool.test.js +101 -0
  190. package/dist/behaviors/agent-llm-bridge.js +166 -0
  191. package/dist/behaviors/architecture-guard.js +256 -0
  192. package/dist/behaviors/auto-doc.js +247 -0
  193. package/dist/behaviors/cascade-guard.js +289 -0
  194. package/dist/behaviors/change-narrative.js +270 -0
  195. package/dist/behaviors/convention-drift.js +290 -0
  196. package/dist/behaviors/framework.js +235 -0
  197. package/dist/behaviors/guard-formatter.js +44 -0
  198. package/dist/behaviors/incomplete-work.js +270 -0
  199. package/dist/behaviors/loop-breaker.js +300 -0
  200. package/dist/behaviors/session-continuity.js +208 -0
  201. package/dist/cli.js +992 -706
  202. package/dist/commands/branches.js +97 -0
  203. package/dist/commands/check-commit.js +225 -0
  204. package/dist/commands/compress-output.js +64 -0
  205. package/dist/commands/config-verify.js +243 -0
  206. package/dist/commands/daemon.js +905 -0
  207. package/dist/commands/dashboard.js +52 -0
  208. package/dist/commands/debug.js +200 -0
  209. package/dist/commands/enrich.js +184 -0
  210. package/dist/commands/exec.js +233 -0
  211. package/dist/commands/gain.js +156 -0
  212. package/dist/commands/hook.js +88 -0
  213. package/dist/commands/index.js +88 -0
  214. package/dist/commands/init.js +74 -0
  215. package/dist/commands/install.js +505 -0
  216. package/dist/commands/learn.js +116 -0
  217. package/dist/commands/manifest.js +193 -0
  218. package/dist/commands/rewind.js +103 -0
  219. package/dist/commands/serve.js +19 -0
  220. package/dist/commands/setup-wizard.js +414 -0
  221. package/dist/commands/skills.js +64 -0
  222. package/dist/commands/stats.js +20 -0
  223. package/dist/commands/status.js +654 -0
  224. package/dist/commands/timeline.js +139 -0
  225. package/dist/commands/uninstall.js +230 -0
  226. package/dist/components/App.js +109 -0
  227. package/dist/components/Banner.js +12 -0
  228. package/dist/components/ConfirmPrompt.js +25 -0
  229. package/dist/components/DriftSummary.js +23 -0
  230. package/dist/components/GradeBadge.js +15 -0
  231. package/dist/components/HealthCard.js +18 -0
  232. package/dist/components/InkSpinner.js +22 -0
  233. package/dist/components/InputBox.js +17 -0
  234. package/dist/components/KeyValue.js +13 -0
  235. package/dist/components/MessageList.js +14 -0
  236. package/dist/components/ProgressBar.js +26 -0
  237. package/dist/components/Section.js +16 -0
  238. package/dist/components/SessionSummaryCard.js +73 -0
  239. package/dist/components/StartupDisplay.js +24 -0
  240. package/dist/components/StatusDashboard.js +57 -0
  241. package/dist/components/StatusLine.js +8 -0
  242. package/dist/components/StepLine.js +22 -0
  243. package/dist/components/Theme.js +20 -0
  244. package/dist/components/ToolProgress.js +8 -0
  245. package/dist/components/ViolationList.js +21 -0
  246. package/dist/components/render.js +13 -0
  247. package/dist/config/agent-registry.js +237 -0
  248. package/dist/config/claude-settings-hooks.js +304 -0
  249. package/dist/config/hook-installer.js +65 -0
  250. package/dist/config/instruction-writer.js +388 -0
  251. package/dist/config/mcp-config-writer.js +266 -0
  252. package/dist/config/settings.js +174 -0
  253. package/dist/config/tool-detector.js +42 -0
  254. package/dist/config/value-surfacing.js +119 -0
  255. package/dist/core/context-assembly.js +108 -0
  256. package/dist/core/conversation.js +33 -0
  257. package/dist/core/local-chat-provider.js +475 -0
  258. package/dist/core/provider-factory.js +55 -0
  259. package/dist/core/providers.js +90 -0
  260. package/dist/core/query-engine.js +174 -0
  261. package/dist/daemon/api.js +312 -0
  262. package/dist/daemon/autostart.js +119 -0
  263. package/dist/daemon/bootstrap.js +39 -0
  264. package/dist/daemon/client.js +164 -0
  265. package/dist/daemon/detect-ci.js +81 -0
  266. package/dist/daemon/platform-linux.js +146 -0
  267. package/dist/daemon/platform-macos.js +134 -0
  268. package/dist/daemon/platform-windows.js +116 -0
  269. package/dist/daemon/process-manager.js +299 -0
  270. package/dist/daemon/protocol.js +23 -0
  271. package/dist/daemon/registry.js +270 -0
  272. package/dist/daemon/settings-schema.js +72 -0
  273. package/dist/daemon/system-health.js +134 -0
  274. package/dist/daemon/version-checker.js +262 -0
  275. package/dist/daemon/warm-start.js +223 -0
  276. package/dist/entrypoints/cli.js +1043 -0
  277. package/dist/entrypoints/daemon.js +380 -0
  278. package/dist/entrypoints/repl.js +147 -0
  279. package/dist/hooks/adapters/claude-code.js +90 -0
  280. package/dist/hooks/adapters/cline.js +100 -0
  281. package/dist/hooks/adapters/cursor.js +98 -0
  282. package/dist/hooks/hook-dedup.js +79 -0
  283. package/dist/hooks/hook-runner.js +113 -0
  284. package/dist/hooks/navigation-hooks.js +175 -0
  285. package/dist/hooks/prompt-hooks.js +63 -0
  286. package/dist/hooks/shell-hooks.js +47 -0
  287. package/dist/ignore.js +111 -0
  288. package/dist/intelligence/approach-suggester.js +61 -0
  289. package/dist/intelligence/ast-extractor.js +2615 -0
  290. package/dist/intelligence/ast-worker.js +34 -0
  291. package/dist/intelligence/background-indexer.js +121 -0
  292. package/dist/intelligence/blast-radius.js +200 -0
  293. package/dist/intelligence/community-detection.js +691 -0
  294. package/dist/intelligence/community-detector.js +184 -0
  295. package/dist/intelligence/computation-scheduler.js +75 -0
  296. package/dist/intelligence/confidence-propagation.js +47 -0
  297. package/dist/intelligence/convention-detector.js +242 -0
  298. package/dist/intelligence/convention-learner.js +205 -0
  299. package/dist/intelligence/convention-matcher.js +205 -0
  300. package/dist/intelligence/cozo-schema.js +376 -0
  301. package/dist/intelligence/decision-point-detector.js +90 -0
  302. package/dist/intelligence/deep-dive-tools.js +586 -0
  303. package/dist/intelligence/durability-scorer.js +84 -0
  304. package/dist/intelligence/exploration-cost.js +204 -0
  305. package/dist/intelligence/exploration-pattern-tracker.js +61 -0
  306. package/dist/intelligence/fact-generator.js +322 -0
  307. package/dist/intelligence/facts-schema.js +90 -0
  308. package/dist/intelligence/file-intelligence.js +59 -0
  309. package/dist/intelligence/graph-holder.js +220 -0
  310. package/dist/intelligence/graph-temporal-joiner.js +238 -0
  311. package/dist/intelligence/health-grade.js +423 -0
  312. package/dist/intelligence/health-grader.js +200 -0
  313. package/dist/intelligence/health-map-data.js +259 -0
  314. package/dist/intelligence/import-symbols.js +136 -0
  315. package/dist/intelligence/incremental-indexer.js +658 -0
  316. package/dist/intelligence/indexer/centrality.js +62 -0
  317. package/dist/intelligence/indexer/cfg-context.js +95 -0
  318. package/dist/intelligence/indexer/confidence.js +34 -0
  319. package/dist/intelligence/indexer/cross-file-resolver.js +104 -0
  320. package/dist/intelligence/indexer/edge-repair.js +89 -0
  321. package/dist/intelligence/indexer/entity-key.js +17 -0
  322. package/dist/intelligence/indexer/export-map.js +132 -0
  323. package/dist/intelligence/indexer/git-cochange.js +128 -0
  324. package/dist/intelligence/indexer/graph-patch.js +147 -0
  325. package/dist/intelligence/indexer/incremental.js +78 -0
  326. package/dist/intelligence/indexer/ingest.js +160 -0
  327. package/dist/intelligence/indexer/language-detect.js +226 -0
  328. package/dist/intelligence/indexer/metadata.js +63 -0
  329. package/dist/intelligence/indexer/mutation-tracker.js +79 -0
  330. package/dist/intelligence/indexer/orchestrator.js +155 -0
  331. package/dist/intelligence/indexer/plugin-interface.js +31 -0
  332. package/dist/intelligence/indexer/plugins/csharp.js +440 -0
  333. package/dist/intelligence/indexer/plugins/go.js +335 -0
  334. package/dist/intelligence/indexer/plugins/java.js +370 -0
  335. package/dist/intelligence/indexer/plugins/python.js +358 -0
  336. package/dist/intelligence/indexer/plugins/regex-fallback.js +82 -0
  337. package/dist/intelligence/indexer/plugins/ruby.js +290 -0
  338. package/dist/intelligence/indexer/plugins/rust.js +484 -0
  339. package/dist/intelligence/indexer/plugins/tier2-generic.js +310 -0
  340. package/dist/intelligence/indexer/plugins/typescript.js +456 -0
  341. package/dist/intelligence/indexer/resource-monitor.js +93 -0
  342. package/dist/intelligence/indexer/scip/decoder.js +253 -0
  343. package/dist/intelligence/indexer/scip/detector.js +232 -0
  344. package/dist/intelligence/indexer/scip/downloader.js +427 -0
  345. package/dist/intelligence/indexer/scip/fallback.js +34 -0
  346. package/dist/intelligence/indexer/scip/merger.js +109 -0
  347. package/dist/intelligence/indexer/scip/orchestrator.js +433 -0
  348. package/dist/intelligence/indexer/scip/runner.js +98 -0
  349. package/dist/intelligence/indexer/snapshot.js +66 -0
  350. package/dist/intelligence/indexer/test-detector.js +196 -0
  351. package/dist/intelligence/indexer/watch-integration.js +61 -0
  352. package/dist/intelligence/indexer/worker.js +85 -0
  353. package/dist/intelligence/local-convention-detector.js +437 -0
  354. package/dist/intelligence/local-embeddings.js +190 -0
  355. package/dist/intelligence/local-graph.js +1946 -0
  356. package/dist/intelligence/local-indexer.js +1575 -0
  357. package/dist/intelligence/local-llm.js +163 -0
  358. package/dist/intelligence/local-rule-generator.js +154 -0
  359. package/dist/intelligence/local-snapshot.js +213 -0
  360. package/dist/intelligence/negative-knowledge.js +103 -0
  361. package/dist/intelligence/persistent-db.js +85 -0
  362. package/dist/intelligence/query-router.js +2556 -0
  363. package/dist/intelligence/risk-classifier.js +116 -0
  364. package/dist/intelligence/rule-evaluator.js +380 -0
  365. package/dist/intelligence/rule-generator.js +49 -0
  366. package/dist/intelligence/search-index.js +173 -0
  367. package/dist/intelligence/semantic/docstring-extractor.js +67 -0
  368. package/dist/intelligence/semantic/embedding-store.js +52 -0
  369. package/dist/intelligence/semantic/enrichment-orchestrator.js +48 -0
  370. package/dist/intelligence/semantic/git-message-miner.js +114 -0
  371. package/dist/intelligence/semantic/identifier-tokenizer.js +51 -0
  372. package/dist/intelligence/semantic/node2vec-embeddings.js +71 -0
  373. package/dist/intelligence/semantic/node2vec-walks.js +103 -0
  374. package/dist/intelligence/semantic/path-domain-inference.js +112 -0
  375. package/dist/intelligence/semantic/similarity-engine.js +60 -0
  376. package/dist/intelligence/semantic/tfidf-vectors.js +88 -0
  377. package/dist/intelligence/session-brief-builder.js +159 -0
  378. package/dist/intelligence/session-context.js +221 -0
  379. package/dist/intelligence/session-health-monitor.js +211 -0
  380. package/dist/intelligence/session-narrative.js +197 -0
  381. package/dist/intelligence/session-pattern-analyzer.js +218 -0
  382. package/dist/intelligence/signal-scorer.js +390 -0
  383. package/dist/intelligence/signal-show-store.js +182 -0
  384. package/dist/intelligence/smart-truncate.js +158 -0
  385. package/dist/intelligence/subgraph-cache.js +88 -0
  386. package/dist/intelligence/temporal-facts.js +494 -0
  387. package/dist/intelligence/token-estimator.js +100 -0
  388. package/dist/intelligence/tool-injector.js +87 -0
  389. package/dist/intelligence/tree-sitter-loader.js +71 -0
  390. package/dist/intelligence/worker-pool.js +116 -0
  391. package/dist/proxy/arg-validator.js +79 -0
  392. package/dist/proxy/auto-bootstrap.js +167 -0
  393. package/dist/proxy/bridge.js +147 -0
  394. package/dist/proxy/budget-enforcer.js +70 -0
  395. package/dist/proxy/compression-quality-monitor.js +160 -0
  396. package/dist/proxy/compression-stats.js +51 -0
  397. package/dist/proxy/context-rot-detector.js +137 -0
  398. package/dist/proxy/drift-detector.js +139 -0
  399. package/dist/proxy/efficiency-tracker.js +79 -0
  400. package/dist/proxy/fact-ranking.js +154 -0
  401. package/dist/proxy/format-encoder.js +266 -0
  402. package/dist/proxy/http-transport.js +90 -0
  403. package/dist/proxy/lifecycle-actor.js +55 -0
  404. package/dist/proxy/lifecycle-machine.js +187 -0
  405. package/dist/proxy/log-tailer.js +265 -0
  406. package/dist/proxy/model-pricing.js +98 -0
  407. package/dist/proxy/network-firewall.js +141 -0
  408. package/dist/proxy/nudge-state.js +93 -0
  409. package/dist/proxy/output-compressor.js +185 -0
  410. package/dist/proxy/pid-lock.js +291 -0
  411. package/dist/proxy/proxy-context.js +11 -0
  412. package/dist/proxy/proxy.js +2633 -0
  413. package/dist/proxy/response-enrichment.js +32 -0
  414. package/dist/proxy/response-envelope.js +313 -0
  415. package/dist/proxy/session-dedup.js +82 -0
  416. package/dist/proxy/session-legend.js +30 -0
  417. package/dist/proxy/session-persistence.js +210 -0
  418. package/dist/proxy/session-resume.js +94 -0
  419. package/dist/proxy/session-stats.js +513 -0
  420. package/dist/proxy/shell-classifier.js +1346 -0
  421. package/dist/proxy/shell-compression-log.js +93 -0
  422. package/dist/proxy/shell-compressor.js +390 -0
  423. package/dist/proxy/shell-graph-boost.js +202 -0
  424. package/dist/proxy/shell-monitor-map.js +18 -0
  425. package/dist/proxy/shell-stats.js +54 -0
  426. package/dist/proxy/shell-strategies/cloud.js +215 -0
  427. package/dist/proxy/shell-strategies/diff.js +159 -0
  428. package/dist/proxy/shell-strategies/error-diagnostic.js +796 -0
  429. package/dist/proxy/shell-strategies/filter-dsl.js +358 -0
  430. package/dist/proxy/shell-strategies/git-status.js +177 -0
  431. package/dist/proxy/shell-strategies/key-value.js +193 -0
  432. package/dist/proxy/shell-strategies/log-text.js +154 -0
  433. package/dist/proxy/shell-strategies/omni.js +188 -0
  434. package/dist/proxy/shell-strategies/progress.js +55 -0
  435. package/dist/proxy/shell-strategies/redact.js +76 -0
  436. package/dist/proxy/shell-strategies/structured.js +241 -0
  437. package/dist/proxy/shell-strategies/tabular.js +243 -0
  438. package/dist/proxy/shell-strategies/test-results-types.js +13 -0
  439. package/dist/proxy/shell-strategies/test-results.js +784 -0
  440. package/dist/proxy/shell-strategies/tree-paths.js +144 -0
  441. package/dist/proxy/shell-strategies/yaml.js +182 -0
  442. package/dist/proxy/shell-tee.js +111 -0
  443. package/dist/proxy/signal-dedup.js +171 -0
  444. package/dist/proxy/startup-renderer.js +158 -0
  445. package/dist/proxy/task-token-display.js +38 -0
  446. package/dist/proxy/token-counter.js +61 -0
  447. package/dist/proxy/tool-clusters.js +273 -0
  448. package/dist/proxy/tool-definitions.js +525 -0
  449. package/dist/proxy/transport-mux.js +229 -0
  450. package/dist/proxy/wire-cap.js +268 -0
  451. package/dist/schemas/api/skills.js +19 -0
  452. package/dist/schemas/common/errors.js +7 -0
  453. package/dist/schemas/common/headers.js +5 -0
  454. package/dist/schemas/entities/edge.js +25 -0
  455. package/dist/schemas/entities/entity.js +22 -0
  456. package/dist/schemas/entities/rule.js +18 -0
  457. package/dist/schemas/index.js +14 -0
  458. package/dist/server/event-bus.js +59 -0
  459. package/dist/server/http.js +156 -0
  460. package/dist/server/middleware.js +70 -0
  461. package/dist/server/routes/drift.js +97 -0
  462. package/dist/server/routes/intelligence.js +1217 -0
  463. package/dist/server/routes/reasoning-quality.js +444 -0
  464. package/dist/server/routes/session.js +86 -0
  465. package/dist/server/routes/stream.js +120 -0
  466. package/dist/server/routes/system.js +73 -0
  467. package/dist/server/routes/temporal.js +170 -0
  468. package/dist/server/routes/timeline.js +232 -0
  469. package/dist/server/routes/token-flow.js +403 -0
  470. package/dist/skills/effectiveness-tracker.js +93 -0
  471. package/dist/skills/local-pack.js +380 -0
  472. package/dist/skills/resolver.js +495 -0
  473. package/dist/state-detector.js +83 -0
  474. package/dist/timeline/intent-detector.js +263 -0
  475. package/dist/timeline/loop-miner.js +140 -0
  476. package/dist/timeline/open-threads.js +49 -0
  477. package/dist/timeline/signal-reinforcer.js +62 -0
  478. package/dist/timeline/timeline-bootstrap.js +151 -0
  479. package/dist/timeline/timeline-store.js +618 -0
  480. package/dist/tools/coding/bash.js +49 -0
  481. package/dist/tools/coding/file-edit.js +72 -0
  482. package/dist/tools/coding/file-outline.js +227 -0
  483. package/dist/tools/coding/file-read-protocol.js +425 -0
  484. package/dist/tools/coding/file-read.js +35 -0
  485. package/dist/tools/coding/file-write.js +43 -0
  486. package/dist/tools/coding/glob-tool.js +109 -0
  487. package/dist/tools/coding/grep.js +162 -0
  488. package/dist/tools/coding/index.js +27 -0
  489. package/dist/tools/intelligence/index.js +269 -0
  490. package/dist/tools/intelligence/record-fact.js +48 -0
  491. package/dist/tools/intelligence/timeline-markers.js +130 -0
  492. package/dist/tools/registry.js +47 -0
  493. package/dist/tools/types.js +8 -0
  494. package/dist/tracking/auto-snapshot-triggers.js +246 -0
  495. package/dist/tracking/branch-context.js +115 -0
  496. package/dist/tracking/branch-snapshot.js +217 -0
  497. package/dist/tracking/causal-bridge.js +317 -0
  498. package/dist/tracking/circuit-breaker.js +147 -0
  499. package/dist/tracking/commit-watcher.js +114 -0
  500. package/dist/tracking/context-ledger.js +119 -0
  501. package/dist/tracking/correction-detector.js +324 -0
  502. package/dist/tracking/drift-tracker.js +874 -0
  503. package/dist/tracking/durability-tracker.js +94 -0
  504. package/dist/tracking/entity-rewind.js +200 -0
  505. package/dist/tracking/file-hash-state.js +114 -0
  506. package/dist/tracking/git-attribution.js +132 -0
  507. package/dist/tracking/git-trailers.js +171 -0
  508. package/dist/tracking/intelligence-counter.js +46 -0
  509. package/dist/tracking/intent-correlator.js +202 -0
  510. package/dist/tracking/intent-encoder.js +52 -0
  511. package/dist/tracking/intent-token-tracker.js +159 -0
  512. package/dist/tracking/ledger-archiver.js +94 -0
  513. package/dist/tracking/ledger-chains.js +245 -0
  514. package/dist/tracking/metrics-store.js +361 -0
  515. package/dist/tracking/native-watcher.js +131 -0
  516. package/dist/tracking/offline-rewind.js +295 -0
  517. package/dist/tracking/pending-violations.js +74 -0
  518. package/dist/tracking/persistence-effectiveness.js +167 -0
  519. package/dist/tracking/prompt-durability.js +202 -0
  520. package/dist/tracking/quality-signals.js +213 -0
  521. package/dist/tracking/redactor.js +73 -0
  522. package/dist/tracking/rewind-engine.js +161 -0
  523. package/dist/tracking/session-history.js +128 -0
  524. package/dist/tracking/session-receipt.js +88 -0
  525. package/dist/tracking/session-summary-writer.js +157 -0
  526. package/dist/tracking/shadow-ledger.js +321 -0
  527. package/dist/tracking/stash-manager.js +258 -0
  528. package/dist/tracking/timeline-fork.js +213 -0
  529. package/dist/tracking/timeline.js +69 -0
  530. package/dist/tracking/token-flow.js +276 -0
  531. package/dist/tracking/turn-segmenter.js +122 -0
  532. package/dist/tracking/weekly-accumulator.js +179 -0
  533. package/dist/tracking/working-snapshots.js +188 -0
  534. package/dist/tracking/workspace-manifest.js +176 -0
  535. package/dist/transport/http.js +102 -0
  536. package/dist/ui/assets/index-BsMTQdhX.js +10 -0
  537. package/dist/ui/index.html +1 -1
  538. package/dist/utils/counterfactual.js +65 -0
  539. package/dist/utils/deep-link.js +34 -0
  540. package/dist/utils/detect.js +193 -0
  541. package/dist/utils/exec.js +73 -0
  542. package/dist/utils/file-logger.js +87 -0
  543. package/dist/utils/format-error.js +29 -0
  544. package/dist/utils/git.js +181 -0
  545. package/dist/utils/log.js +57 -0
  546. package/dist/utils/logger.js +35 -0
  547. package/dist/utils/mcp-content-json.js +8 -0
  548. package/dist/utils/session-logger.js +154 -0
  549. package/dist/utils/startup-log.js +512 -0
  550. package/dist/utils/ui.js +56 -0
  551. package/package.json +5 -3
  552. package/scripts/postinstall.mjs +299 -0
  553. package/dist/ui/assets/index-B-0HTtUR.js +0 -10
@@ -0,0 +1,193 @@
1
+ /**
2
+ * Strategy T6 — key=value (env, printenv) and Key: Value compression.
3
+ * Drops noisy keys, truncates long values, shortens PATH.
4
+ * Handles both KEY=VALUE format (env) and Key: Value format (kubectl describe, systemctl).
5
+ */
6
+ /** Keys to drop from colon-format output (k8s/systemd noise). */
7
+ const DROP_COLON_KEYS = new Set([
8
+ "managedFields",
9
+ "resourceVersion",
10
+ "selfLink",
11
+ "uid",
12
+ "creationTimestamp",
13
+ "generation",
14
+ "ownerReferences",
15
+ "finalizers",
16
+ "kubectl.kubernetes.io/last-applied-configuration",
17
+ "deployment.kubernetes.io/revision",
18
+ "control-plane.alpha.kubernetes.io/leader",
19
+ ]);
20
+ const DROP_KEYS = new Set([
21
+ // PWD/shell state
22
+ "OLDPWD",
23
+ "SHLVL",
24
+ "_",
25
+ "PWD",
26
+ // Terminal noise
27
+ "LS_COLORS",
28
+ "LESSOPEN",
29
+ "LESSCLOSE",
30
+ "LSCOLORS",
31
+ "TERM",
32
+ "TERM_PROGRAM",
33
+ "TERM_SESSION_ID",
34
+ "COLORTERM",
35
+ "CLICOLOR",
36
+ "CLICOLOR_FORCE",
37
+ "FORCE_COLOR",
38
+ // Locale
39
+ "LANG",
40
+ "LC_ALL",
41
+ "LC_CTYPE",
42
+ "LC_MESSAGES",
43
+ "LC_COLLATE",
44
+ "LC_MONETARY",
45
+ "LC_NUMERIC",
46
+ "LC_TIME",
47
+ // System noise
48
+ "HOSTNAME",
49
+ "LOGNAME",
50
+ "DISPLAY",
51
+ "XDG_SESSION_TYPE",
52
+ "XDG_RUNTIME_DIR",
53
+ "XDG_DATA_DIRS",
54
+ "XDG_CONFIG_DIRS",
55
+ "DBUS_SESSION_BUS_ADDRESS",
56
+ "DESKTOP_SESSION",
57
+ // SSH/GPG
58
+ "SSH_AUTH_SOCK",
59
+ "SSH_AGENT_PID",
60
+ "GPG_AGENT_INFO",
61
+ "GPG_TTY",
62
+ // Shell internals
63
+ "SHELL",
64
+ "BASH_VERSION",
65
+ "ZSH_VERSION",
66
+ "HISTSIZE",
67
+ "HISTFILESIZE",
68
+ "HIST_STAMPS",
69
+ "SAVEHIST",
70
+ "HISTCONTROL",
71
+ "HISTFILE",
72
+ // Misc
73
+ "MANPATH",
74
+ "INFOPATH",
75
+ "MAIL",
76
+ ]);
77
+ const VALUE_MAX = 200;
78
+ /** Compress colon-format output (kubectl describe, systemctl status, etc.) */
79
+ function compressColonFormat(lines) {
80
+ const kept = [];
81
+ let i = 0;
82
+ while (i < lines.length) {
83
+ const line = lines[i];
84
+ const colonMatch = /^(\s{0,4})([\w][\w\s./-]*):\s*(.*)$/.exec(line);
85
+ if (!colonMatch) {
86
+ if (line.trim())
87
+ kept.push(line.trimEnd());
88
+ i++;
89
+ continue;
90
+ }
91
+ const [, indent, key, value] = colonMatch;
92
+ const keyTrimmed = key?.trim();
93
+ // Drop noisy k8s keys
94
+ if (keyTrimmed && DROP_COLON_KEYS.has(keyTrimmed)) {
95
+ i++;
96
+ // Skip indented child lines
97
+ const childIndent = (indent?.length ?? 0) + 2;
98
+ while (i < lines.length) {
99
+ const nextLine = lines[i];
100
+ if (nextLine.trim() === "") {
101
+ i++;
102
+ break;
103
+ }
104
+ const nextIndent = nextLine.match(/^(\s*)/)?.[1]?.length ?? 0;
105
+ if (nextIndent < childIndent && nextLine.trim())
106
+ break;
107
+ i++;
108
+ }
109
+ continue;
110
+ }
111
+ // Check for indented sub-block
112
+ const childIndent = (indent?.length ?? 0) + 2;
113
+ let childCount = 0;
114
+ let j = i + 1;
115
+ while (j < lines.length) {
116
+ const nextLine = lines[j];
117
+ if (nextLine.trim() === "")
118
+ break;
119
+ const nextInd = nextLine.match(/^(\s*)/)?.[1]?.length ?? 0;
120
+ if (nextInd < childIndent)
121
+ break;
122
+ childCount++;
123
+ j++;
124
+ }
125
+ if (childCount > 10 && !value?.trim()) {
126
+ // Collapse large sub-blocks
127
+ kept.push(`${indent}${keyTrimmed}: [${childCount} entries]`);
128
+ i = j;
129
+ }
130
+ else {
131
+ // Truncate long values
132
+ let val = value ?? "";
133
+ if (val.length > VALUE_MAX) {
134
+ val = `${val.slice(0, 100)}…(${val.length} chars)`;
135
+ }
136
+ kept.push(val ? `${indent}${keyTrimmed}: ${val}` : line.trimEnd());
137
+ i++;
138
+ }
139
+ }
140
+ return kept.join("\n");
141
+ }
142
+ export function compressKeyValue(raw, command) {
143
+ const lines = raw.split("\n");
144
+ // Detect format: KEY=VALUE vs Key: Value
145
+ const equalsCount = lines.filter((l) => /^[A-Za-z_]\w*=/.test(l)).length;
146
+ const colonCount = lines.filter((l) => /^\s{0,4}[A-Za-z][\w\s-]*:\s/.test(l)).length;
147
+ // Nothing to compress: input has no key=value or key:value rows. The
148
+ // classifier sometimes maps a `git`/`kubectl` subcommand to key_value
149
+ // (correct hint) even when the actual output is a single bare word
150
+ // (e.g. `git branch --show-current` → "main\n"). Emitting the
151
+ // `_shell_fmt:key_value\n` header on a sub-header-length payload is
152
+ // strictly net-negative — passthrough verbatim instead. Matches the
153
+ // "header is fixed overhead with nothing to decode" convention from
154
+ // log_text / omni / progress / yaml / tabular.
155
+ if (colonCount === 0 && equalsCount === 0)
156
+ return raw;
157
+ if (colonCount > equalsCount) {
158
+ const body = compressColonFormat(lines);
159
+ const clipped = body.length > 8000
160
+ ? `${body.slice(0, 5000)}\n…kv_omitted…\n${body.slice(-2000)}`
161
+ : body;
162
+ return `_shell_fmt:key_value\n${clipped}`;
163
+ }
164
+ // Original KEY=VALUE format handling
165
+ void command;
166
+ const kept = [];
167
+ for (const line of lines) {
168
+ const m = /^([A-Za-z_][A-Za-z0-9_]*)=(.*)$/.exec(line);
169
+ if (!m) {
170
+ if (line.trim())
171
+ kept.push(line.trimEnd());
172
+ continue;
173
+ }
174
+ const key = m[1];
175
+ let val = m[2] ?? "";
176
+ if (!key || DROP_KEYS.has(key))
177
+ continue;
178
+ // Shorten PATH
179
+ if (key === "PATH" && val.length > VALUE_MAX) {
180
+ const parts = val.split(":");
181
+ val = `${parts.slice(0, 3).join(":")}:…:${parts.length} segments`;
182
+ }
183
+ else if (val.length > VALUE_MAX) {
184
+ val = `${val.slice(0, 100)}…(${val.length} chars)`;
185
+ }
186
+ kept.push(`${key}=${val}`);
187
+ }
188
+ const body = kept.join("\n");
189
+ const clipped = body.length > 8000
190
+ ? `${body.slice(0, 5000)}\n…kv_omitted…\n${body.slice(-2000)}`
191
+ : body;
192
+ return `_shell_fmt:key_value\n${clipped}`;
193
+ }
@@ -0,0 +1,154 @@
1
+ /**
2
+ * Strategy T3 — log/build output compression.
3
+ * Deduplicates by normalized pattern, preserves errors, emits compact summary.
4
+ */
5
+ const SMALL_THRESHOLD = 80;
6
+ const MAX_PATTERNS = 20;
7
+ const MAX_ERROR_LINES = 30;
8
+ const MAX_KEPT_LINES = 20;
9
+ const ERROR_RE = /\b(ERROR|FATAL|CRIT|PANIC|Exception|Traceback|FAIL(?:ED)?|WARN(?:ING)?)\b/i;
10
+ const FRAME_RE = /^\s+at\s/;
11
+ const BUILD_RESULT_RE = /\b(error|warning|built|compiled|bundled|output|dist\/|size:|gzip:|emitted|generated|BUILD (SUCCESS|FAIL)|Finished|Total time|succeeded|SUCCEED|actionable tasks|up-to-date)\b/i;
12
+ const BUILD_CMD_RE = /\b(build|compile|bundle|webpack|vite build|rollup|esbuild|swc|parcel|make|cmake|ninja|gradle|gradlew|mvn|sbt|xcodebuild|dotnet build|cargo build|go build|nx build|turbo|bazel)\b/i;
13
+ /**
14
+ * Normalize a log line by replacing timestamps, UUIDs, IPs, and timings
15
+ * with placeholders so identical-in-spirit lines merge.
16
+ */
17
+ function normalizeLogLine(line) {
18
+ return (line
19
+ .replace(/\d{4}-\d{2}-\d{2}[T ]\d{2}:\d{2}:\d{2}[.\d]*Z?/g, "<TS>")
20
+ .replace(/\b[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\b/gi, "<UUID>")
21
+ .replace(/\b[0-9a-f]{7,40}\b/gi, "<HASH>")
22
+ .replace(/\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b/g, "<IP>")
23
+ // File paths: src/foo/bar.ts → <PATH>
24
+ .replace(/\b(?:src|lib|app|test|pkg|cmd|internal)\/\S+/g, "<PATH>")
25
+ // Bare filenames with extensions
26
+ .replace(/\b[\w.-]+\.(ts|js|tsx|jsx|py|go|rs|c|cpp|java|rb|swift|kt|cs|o|so|dll|wasm)\b/g, "<FILE>")
27
+ // Relative/absolute paths
28
+ .replace(/(?:\.\.?\/|\/)[\w./-]+/g, "<PATH>")
29
+ // Package names with versions: foo@1.2.3, foo-1.2.3, foo v1.2.3
30
+ .replace(/\b[\w@/-]+[@-]\d+\.\d+[\w.-]*/g, "<PKG>")
31
+ // Port numbers
32
+ .replace(/:\d{2,5}\b/g, ":<PORT>")
33
+ // Timings with units
34
+ .replace(/\b\d+(\.\d+)?\s*(ms|s|sec|min|MB|KB|GB|B|bytes)\b/gi, "<N>$2")
35
+ .replace(/\b\d+ms\b/g, "<N>ms")
36
+ .replace(/\b\d+\.\d+s\b/g, "<N>s")
37
+ .replace(/\blatency=\d+/g, "latency=<N>")
38
+ .replace(/\bstatus=\d{3}/g, "status=<N>")
39
+ // Generic numbers (last, after specific patterns)
40
+ .replace(/\b\d+\b/g, "<N>"));
41
+ }
42
+ /**
43
+ * R1 — success short-circuit. When the entire output is a clean build/run
44
+ * (no errors, no warnings, classic "all green" markers), collapse to a
45
+ * one-line summary regardless of total length. Tee still preserves the raw
46
+ * payload on disk for recovery.
47
+ */
48
+ const SUCCESS_PATTERNS = [
49
+ /\bBUILD SUCCESS(?:FUL)?\b/i,
50
+ /\bbuild succeeded\b/i,
51
+ /\bbuilt successfully\b/i,
52
+ /\bcompil(?:ed|ation) successful\b/i,
53
+ /^Finished\b.*\bin\s/m,
54
+ /\b0 errors?,?\s*0 warnings?\b/i,
55
+ /\bno (?:errors|problems|issues|violations) (?:found|reported)\b/i,
56
+ /\ball checks pass(?:ed)?\b/i,
57
+ ];
58
+ function isCleanSuccess(text) {
59
+ if (ERROR_RE.test(text))
60
+ return { ok: false };
61
+ for (const pat of SUCCESS_PATTERNS) {
62
+ const m = text.match(pat);
63
+ if (m)
64
+ return { ok: true, line: m[0] };
65
+ }
66
+ return { ok: false };
67
+ }
68
+ export function compressLogText(text, command) {
69
+ const lines = text.replace(/\r\n/g, "\n").split("\n");
70
+ const total = lines.length;
71
+ if (total <= SMALL_THRESHOLD) {
72
+ return text;
73
+ }
74
+ const isBuild = command ? BUILD_CMD_RE.test(command) : false;
75
+ // R1 success short-circuit — content-driven (not command-gated).
76
+ // SUCCESS_PATTERNS are specific enough ("0 errors, 0 warnings",
77
+ // "Finished release...", "compilation successful") that wrapper scripts
78
+ // benefit too. The ERROR_RE veto inside isCleanSuccess prevents false
79
+ // positives when error/warning markers are also present.
80
+ {
81
+ const probe = isCleanSuccess(text);
82
+ if (probe.ok) {
83
+ const label = isBuild ? "build ok" : "ok";
84
+ return `_shell_fmt:log_text\n${label} — ${probe.line ?? "succeeded"} (${total} lines suppressed)`;
85
+ }
86
+ }
87
+ const patterns = new Map();
88
+ const errorLines = [];
89
+ const keptLines = [];
90
+ for (const line of lines) {
91
+ if (!line.trim())
92
+ continue;
93
+ // Always keep error/warning and stack frame lines verbatim
94
+ if (ERROR_RE.test(line) || FRAME_RE.test(line)) {
95
+ errorLines.push(line);
96
+ continue;
97
+ }
98
+ // For build output, keep result/summary lines
99
+ if (isBuild && BUILD_RESULT_RE.test(line)) {
100
+ keptLines.push(line);
101
+ continue;
102
+ }
103
+ const normalized = normalizeLogLine(line);
104
+ const existing = patterns.get(normalized);
105
+ if (existing) {
106
+ existing.count++;
107
+ }
108
+ else {
109
+ patterns.set(normalized, { firstLine: line, count: 1 });
110
+ }
111
+ }
112
+ const parts = ["_shell_fmt:log_text"];
113
+ parts.push(`(${total} lines, ${patterns.size} unique patterns)`);
114
+ // Errors first — dedup identical error/warning lines with [×N]
115
+ if (errorLines.length > 0) {
116
+ const errDedup = new Map();
117
+ for (const e of errorLines) {
118
+ const existing = errDedup.get(e);
119
+ if (existing)
120
+ existing.count++;
121
+ else
122
+ errDedup.set(e, { line: e, count: 1 });
123
+ }
124
+ let shown = 0;
125
+ for (const { line, count } of errDedup.values()) {
126
+ if (shown >= MAX_ERROR_LINES)
127
+ break;
128
+ parts.push(count > 1 ? `${line} [×${count}]` : line);
129
+ shown++;
130
+ }
131
+ if (errDedup.size > MAX_ERROR_LINES) {
132
+ parts.push(`… ${errDedup.size - MAX_ERROR_LINES} more error lines`);
133
+ }
134
+ }
135
+ // Build-specific kept lines
136
+ if (keptLines.length > 0) {
137
+ for (const k of keptLines.slice(0, MAX_KEPT_LINES))
138
+ parts.push(k);
139
+ }
140
+ // Deduped patterns sorted by count desc
141
+ const sorted = [...patterns.values()].sort((a, b) => b.count - a.count);
142
+ for (const p of sorted.slice(0, MAX_PATTERNS)) {
143
+ if (p.count > 1) {
144
+ parts.push(`${p.firstLine} [×${p.count}]`);
145
+ }
146
+ else {
147
+ parts.push(p.firstLine);
148
+ }
149
+ }
150
+ if (sorted.length > MAX_PATTERNS) {
151
+ parts.push(`… ${sorted.length - MAX_PATTERNS} more unique patterns`);
152
+ }
153
+ return parts.join("\n");
154
+ }
@@ -0,0 +1,188 @@
1
+ /**
2
+ * Omni catch-all compression for unclassified shell output.
3
+ * Five tiers: normalize → pattern-dedup → consecutive-dedup → smart truncate → char cap.
4
+ * Fires only when classifier confidence < 0.7.
5
+ */
6
+ const SMALL_THRESHOLD = 40;
7
+ const DEDUP_THRESHOLD = 30;
8
+ const DEDUP_MIN_RUN = 3;
9
+ const TRUNCATE_THRESHOLD = 200;
10
+ const HEAD_KEEP = 20;
11
+ const TAIL_KEEP = 40;
12
+ const CHAR_CAP = 50_000;
13
+ const CHAR_HEAD = 30_000;
14
+ const CHAR_TAIL = 15_000;
15
+ const MAX_PATTERNS = 30;
16
+ const DIAGNOSTIC_RE = /\b(ERROR|FATAL|WARN(?:ING)?|FAIL(?:ED)?|Exception|Traceback|panic|SIGKILL|SIGSEGV|OOM|error\[E\d+\]|cannot find|undefined reference|segmentation fault)\b/i;
17
+ /** Normalize a line by replacing variable parts (numbers, hashes, UUIDs, paths) for pattern matching. */
18
+ function normalizeForPattern(line) {
19
+ return line
20
+ .replace(/\b[0-9a-f]{7,40}\b/gi, "<HASH>")
21
+ .replace(/\b[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\b/gi, "<UUID>")
22
+ .replace(/\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b/g, "<IP>")
23
+ .replace(/\d{4}-\d{2}-\d{2}[T ]\d{2}:\d{2}:\d{2}[.\d]*Z?/g, "<TS>")
24
+ .replace(/\b\d+(\.\d+)?\s*(ms|s|sec|min|MB|KB|GB|B|bytes)\b/gi, "<N>$2")
25
+ .replace(/\d+/g, "<N>")
26
+ .trim();
27
+ }
28
+ /** Tier 1: Collapse blank runs (3+ → 1) and trim trailing whitespace. */
29
+ function normalize(lines) {
30
+ const out = [];
31
+ let blankRun = 0;
32
+ for (const line of lines) {
33
+ const trimmed = line.trimEnd();
34
+ if (trimmed.length === 0) {
35
+ blankRun++;
36
+ if (blankRun <= 1)
37
+ out.push("");
38
+ continue;
39
+ }
40
+ blankRun = 0;
41
+ out.push(trimmed);
42
+ }
43
+ return out;
44
+ }
45
+ /**
46
+ * Tier 2: Pattern-based dedup — merge lines that are identical after normalizing
47
+ * variable parts (numbers, hashes, timestamps). Non-consecutive duplicates merge.
48
+ */
49
+ function patternDedup(lines) {
50
+ if (lines.length < DEDUP_THRESHOLD)
51
+ return lines;
52
+ // Separate diagnostic lines (always keep verbatim)
53
+ const diagnosticLines = [];
54
+ const normalLines = [];
55
+ for (const line of lines) {
56
+ if (DIAGNOSTIC_RE.test(line)) {
57
+ diagnosticLines.push(line);
58
+ }
59
+ else {
60
+ normalLines.push(line);
61
+ }
62
+ }
63
+ // Group normal lines by normalized pattern
64
+ const patterns = new Map();
65
+ const ordered = []; // track insertion order of pattern keys
66
+ for (const line of normalLines) {
67
+ if (!line.trim())
68
+ continue;
69
+ const norm = normalizeForPattern(line);
70
+ const existing = patterns.get(norm);
71
+ if (existing) {
72
+ existing.count++;
73
+ }
74
+ else {
75
+ patterns.set(norm, { firstLine: line, count: 1 });
76
+ ordered.push(norm);
77
+ }
78
+ }
79
+ // If dedup saved less than 20% of lines, not worth it — return as-is
80
+ const dedupedCount = ordered.length + diagnosticLines.length;
81
+ if (dedupedCount > lines.length * 0.8)
82
+ return lines;
83
+ // Rebuild: diagnostics first, then patterns sorted by original order
84
+ const out = [];
85
+ // Dedup diagnostic lines too (identical ones)
86
+ const diagDedup = new Map();
87
+ for (const d of diagnosticLines) {
88
+ const existing = diagDedup.get(d);
89
+ if (existing)
90
+ existing.count++;
91
+ else
92
+ diagDedup.set(d, { line: d, count: 1 });
93
+ }
94
+ for (const { line, count } of diagDedup.values()) {
95
+ out.push(count > 1 ? `${line} [×${count}]` : line);
96
+ }
97
+ let shown = 0;
98
+ for (const key of ordered) {
99
+ if (shown >= MAX_PATTERNS)
100
+ break;
101
+ const p = patterns.get(key);
102
+ if (p.count > 1) {
103
+ out.push(`${p.firstLine} [×${p.count}]`);
104
+ }
105
+ else {
106
+ out.push(p.firstLine);
107
+ }
108
+ shown++;
109
+ }
110
+ if (ordered.length > MAX_PATTERNS) {
111
+ out.push(`… ${ordered.length - MAX_PATTERNS} more unique patterns`);
112
+ }
113
+ return out;
114
+ }
115
+ /** Tier 3: Collapse runs of 3+ identical consecutive lines into `line [×N]`. */
116
+ function consecutiveDedup(lines) {
117
+ if (lines.length < DEDUP_THRESHOLD)
118
+ return lines;
119
+ const out = [];
120
+ let i = 0;
121
+ while (i < lines.length) {
122
+ const line = lines[i];
123
+ let runLen = 1;
124
+ while (i + runLen < lines.length &&
125
+ lines[i + runLen] === line &&
126
+ line.length > 0) {
127
+ runLen++;
128
+ }
129
+ if (runLen >= DEDUP_MIN_RUN) {
130
+ out.push(`${line} [×${runLen}]`);
131
+ }
132
+ else {
133
+ for (let j = 0; j < runLen; j++)
134
+ out.push(line);
135
+ }
136
+ i += runLen;
137
+ }
138
+ return out;
139
+ }
140
+ /** Tier 4: Head + diagnostic-preserving middle + tail truncation. */
141
+ function truncate(lines) {
142
+ if (lines.length <= TRUNCATE_THRESHOLD)
143
+ return lines;
144
+ const head = lines.slice(0, HEAD_KEEP);
145
+ const tail = lines.slice(-TAIL_KEEP);
146
+ const middleStart = HEAD_KEEP;
147
+ const middleEnd = lines.length - TAIL_KEEP;
148
+ const diagnostics = [];
149
+ for (let i = middleStart; i < middleEnd; i++) {
150
+ if (DIAGNOSTIC_RE.test(lines[i]))
151
+ diagnostics.push(lines[i]);
152
+ }
153
+ const omitted = middleEnd - middleStart - diagnostics.length;
154
+ const marker = diagnostics.length > 0
155
+ ? `… ${omitted} lines omitted (${diagnostics.length} diagnostic lines preserved) …`
156
+ : `… ${omitted} lines omitted …`;
157
+ return [...head, marker, ...diagnostics, ...tail];
158
+ }
159
+ /** Tier 5: Character-level safety cap for extremely wide output (e.g., minified JS). */
160
+ function capChars(text) {
161
+ if (text.length <= CHAR_CAP)
162
+ return text;
163
+ const omitted = text.length - CHAR_HEAD - CHAR_TAIL;
164
+ return `${text.slice(0, CHAR_HEAD)}\n… ${omitted} chars omitted …\n${text.slice(-CHAR_TAIL)}`;
165
+ }
166
+ /** Universal catch-all compression. Format-agnostic, safe on any text. */
167
+ export function compressOmni(raw) {
168
+ const lines = raw.replace(/\r\n/g, "\n").split("\n");
169
+ const originalCount = lines.length;
170
+ // Small output — pass through. Skip header (no compression happened);
171
+ // capChars's `… N chars omitted …` marker still signals any wide-line cap.
172
+ if (originalCount <= SMALL_THRESHOLD) {
173
+ return capChars(raw);
174
+ }
175
+ const normalized = normalize(lines);
176
+ // Try pattern dedup first (more aggressive, non-consecutive)
177
+ const patternDeduped = patternDedup(normalized);
178
+ // Then consecutive dedup on whatever remains
179
+ const deduped = consecutiveDedup(patternDeduped);
180
+ const truncated = truncate(deduped);
181
+ const joined = truncated.join("\n");
182
+ const capped = capChars(joined);
183
+ const savedLines = originalCount - truncated.length;
184
+ const header = savedLines > 5
185
+ ? `_shell_fmt:omni (${originalCount}→${truncated.length} lines)`
186
+ : "_shell_fmt:omni";
187
+ return `${header}\n${capped}`;
188
+ }
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Strategy T9 — npm/pip-style progress: extract summary, drop transient lines.
3
+ */
4
+ const KEEP_LAST = 18;
5
+ const SUMMARY_PATTERNS = [
6
+ // npm/pnpm/yarn
7
+ /^added \d+ packages?/i,
8
+ /^Packages: \+\d+/,
9
+ /^success Saved lockfile/,
10
+ /^\d+ packages? installed/,
11
+ /^up to date/i,
12
+ /^Done in \d/,
13
+ /^✨\s+Done in/,
14
+ /^Lockfile is up to date/,
15
+ // pip/uv
16
+ /^Successfully installed/i,
17
+ /^Requirement already satisfied/i,
18
+ /^Resolved \d+ packages?/i,
19
+ /^Installed \d+ packages?/i,
20
+ // cargo
21
+ /^\s*Compiling .+ v\d/,
22
+ /^\s*Finished .+ target/,
23
+ /^\s*Downloaded \d+ crates?/,
24
+ // go
25
+ /^go: downloading /,
26
+ /^go: added /,
27
+ // bundle (ruby)
28
+ /^Bundle complete!/,
29
+ /^Using /,
30
+ /^\d+ gems? installed/,
31
+ // composer (php)
32
+ /^Package operations:/,
33
+ /^Generating autoload files/,
34
+ // apt/brew/dnf
35
+ /^\d+ upgraded, \d+ newly installed/,
36
+ /^==> (Downloading|Installing|Pouring)/,
37
+ /^Complete!/,
38
+ /^Transaction Summary/,
39
+ ];
40
+ export function compressProgress(text, command) {
41
+ void command;
42
+ const lines = text.replace(/\r\n/g, "\n").split("\n");
43
+ // Look for summary line near the end
44
+ const summary = [...lines]
45
+ .reverse()
46
+ .find((l) => SUMMARY_PATTERNS.some((p) => p.test(l.trim())));
47
+ if (summary) {
48
+ return `_shell_fmt:progress\n${summary.trim()}`;
49
+ }
50
+ if (lines.length <= KEEP_LAST) {
51
+ return text;
52
+ }
53
+ const tail = lines.slice(-KEEP_LAST).join("\n");
54
+ return `_shell_fmt:progress\n… ${lines.length - KEEP_LAST} progress line(s) omitted …\n${tail}`;
55
+ }
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Pre-strategy redaction — runs BEFORE classification so every strategy
3
+ * sees normalized input. Strips boilerplate that survives ANSI strip and
4
+ * has no semantic value to a coding agent.
5
+ *
6
+ * Token wins are small per-rule but stack across every shell call:
7
+ * absolute home paths → ~, long hashes → <sha>, ISO timestamps → <ts>,
8
+ * surviving CSI/OSC cursor codes that the basic ANSI strip missed.
9
+ */
10
+ import { homedir } from "node:os";
11
+ const HOME = (() => {
12
+ try {
13
+ return homedir();
14
+ }
15
+ catch {
16
+ return "";
17
+ }
18
+ })();
19
+ function escapeRegex(s) {
20
+ return s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
21
+ }
22
+ /**
23
+ * Built-in redactors. Order matters — longer/more-specific patterns first.
24
+ */
25
+ const BUILTIN_RULES = [
26
+ // Home directory → ~ (only the literal home, not arbitrary user paths)
27
+ ...(HOME
28
+ ? [{ pattern: new RegExp(escapeRegex(HOME), "g"), replacement: "~" }]
29
+ : []),
30
+ // ISO timestamps — keep the date but compress time portion
31
+ // 2026-05-13T14:32:01.123Z → <ts>
32
+ {
33
+ pattern: /\b\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:?\d{2})?\b/g,
34
+ replacement: "<ts>",
35
+ },
36
+ // Long full-line UUIDs
37
+ {
38
+ pattern: /\b[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\b/gi,
39
+ replacement: "<uuid>",
40
+ },
41
+ // 40-char or 64-char hex digests (sha1/sha256) — keep first 7
42
+ {
43
+ pattern: /\b([0-9a-f]{7})[0-9a-f]{33,57}\b/gi,
44
+ replacement: "$1…",
45
+ },
46
+ // Surviving CSI cursor movement / scroll region codes that the basic
47
+ // ANSI stripper missed (rare but real on Windows-style output)
48
+ // biome-ignore lint/suspicious/noControlCharactersInRegex: stripping control codes by design
49
+ { pattern: /\x1b\][^\x07\x1b]*\x1b?\\?/g, replacement: "" },
50
+ // npm/pip progress carriage returns that don't survive ANSI strip cleanly
51
+ { pattern: /\r(?!\n)/g, replacement: "\n" },
52
+ ];
53
+ /**
54
+ * Apply default + user redactors to raw output. Idempotent. Cheap.
55
+ */
56
+ export function redactOutput(raw, extra) {
57
+ if (!raw)
58
+ return raw;
59
+ let s = raw;
60
+ for (const r of BUILTIN_RULES) {
61
+ s = s.replace(r.pattern, r.replacement);
62
+ }
63
+ if (extra && extra.length > 0) {
64
+ for (const r of extra) {
65
+ s = s.replace(r.pattern, r.replacement);
66
+ }
67
+ }
68
+ return s;
69
+ }
70
+ /**
71
+ * Expose builtin rules so the filter-DSL loader (R3) can merge user
72
+ * rules with the same shape.
73
+ */
74
+ export function getBuiltinRedactRules() {
75
+ return BUILTIN_RULES;
76
+ }