@unerr-ai/unerr 0.0.1 → 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.
- package/README.md +215 -35
- package/dist/__tests__/architecture-guard.test.js +122 -0
- package/dist/__tests__/arg-validator.test.js +205 -0
- package/dist/__tests__/ast-extractor.test.js +203 -0
- package/dist/__tests__/auto-bootstrap.test.js +280 -0
- package/dist/__tests__/background-indexer.test.js +228 -0
- package/dist/__tests__/blast-radius-engine.test.js +200 -0
- package/dist/__tests__/bridge-isolation.test.js +37 -0
- package/dist/__tests__/budget-enforcer.test.js +53 -0
- package/dist/__tests__/cfg-test-detection-perf.test.js +82 -0
- package/dist/__tests__/change-narrative.test.js +190 -0
- package/dist/__tests__/check-commit.test.js +258 -0
- package/dist/__tests__/checksum.test.js +34 -0
- package/dist/__tests__/commit-watcher.test.js +154 -0
- package/dist/__tests__/community-detection.test.js +179 -0
- package/dist/__tests__/community-tools.test.js +299 -0
- package/dist/__tests__/components.test.js +449 -0
- package/dist/__tests__/compression-log.test.js +174 -0
- package/dist/__tests__/compression-quality-monitor.test.js +40 -0
- package/dist/__tests__/config-healer.test.js +165 -0
- package/dist/__tests__/context-ledger.test.js +58 -0
- package/dist/__tests__/convention-detector.test.js +99 -0
- package/dist/__tests__/convention-learner.test.js +86 -0
- package/dist/__tests__/correction-detector.test.js +330 -0
- package/dist/__tests__/daemon-autostart-install.test.js +283 -0
- package/dist/__tests__/daemon-bridge.test.js +222 -0
- package/dist/__tests__/daemon-dashboard.test.js +202 -0
- package/dist/__tests__/daemon-registry.test.js +240 -0
- package/dist/__tests__/daemon-supervisor.test.js +318 -0
- package/dist/__tests__/daemon-version-check.test.js +275 -0
- package/dist/__tests__/decision-point-detector.test.js +98 -0
- package/dist/__tests__/deep-link.test.js +143 -0
- package/dist/__tests__/disallowed-tools.test.js +115 -0
- package/dist/__tests__/drift-tracker.test.js +582 -0
- package/dist/__tests__/durability-scorer.test.js +152 -0
- package/dist/__tests__/efficiency-tracker.test.js +65 -0
- package/dist/__tests__/enrich.test.js +144 -0
- package/dist/__tests__/entity-rewind.test.js +248 -0
- package/dist/__tests__/ephemeral.test.js +111 -0
- package/dist/__tests__/exploration-cost.test.js +93 -0
- package/dist/__tests__/fact-generator.test.js +197 -0
- package/dist/__tests__/file-l0-graph.test.js +244 -0
- package/dist/__tests__/file-logger.test.js +82 -0
- package/dist/__tests__/file-outline.test.js +141 -0
- package/dist/__tests__/file-read-protocol.test.js +188 -0
- package/dist/__tests__/format-encoder.test.js +233 -0
- package/dist/__tests__/git-attribution.test.js +259 -0
- package/dist/__tests__/graph-temporal-joiner.test.js +219 -0
- package/dist/__tests__/health-grade-enhanced.test.js +138 -0
- package/dist/__tests__/health-map-data.test.js +173 -0
- package/dist/__tests__/helpers/mcp-harness.js +45 -0
- package/dist/__tests__/helpers/mcp-harness.test.js +68 -0
- package/dist/__tests__/hook-dedup.test.js +112 -0
- package/dist/__tests__/hook-runner.test.js +253 -0
- package/dist/__tests__/indexer-cfg.test.js +185 -0
- package/dist/__tests__/indexer-cross-file.test.js +172 -0
- package/dist/__tests__/indexer-extraction.test.js +245 -0
- package/dist/__tests__/indexer-incremental.test.js +232 -0
- package/dist/__tests__/indexer-language-expansion.test.js +165 -0
- package/dist/__tests__/init-push.test.js +131 -0
- package/dist/__tests__/instruction-writer.test.js +179 -0
- package/dist/__tests__/intelligence-integration.test.js +217 -0
- package/dist/__tests__/intent-correlator.test.js +175 -0
- package/dist/__tests__/intent-detector.test.js +235 -0
- package/dist/__tests__/intent-encoder.test.js +167 -0
- package/dist/__tests__/java-build-tool-detection.test.js +174 -0
- package/dist/__tests__/layer3-sprint-q.test.js +160 -0
- package/dist/__tests__/layer3-sprint-r.test.js +91 -0
- package/dist/__tests__/layer3-sprint-s.test.js +183 -0
- package/dist/__tests__/layer3-sprint-t.test.js +201 -0
- package/dist/__tests__/layer3-sprint-u.test.js +174 -0
- package/dist/__tests__/layer4-sprint-ba2.test.js +354 -0
- package/dist/__tests__/layer4-sprint-ba4.test.js +84 -0
- package/dist/__tests__/layer4-sprint-vs.test.js +105 -0
- package/dist/__tests__/ledger-chains.test.js +162 -0
- package/dist/__tests__/lifecycle-machine.test.js +226 -0
- package/dist/__tests__/local-chat-provider.test.js +170 -0
- package/dist/__tests__/local-convention-detector.test.js +308 -0
- package/dist/__tests__/local-embeddings.test.js +422 -0
- package/dist/__tests__/local-graph.test.js +540 -0
- package/dist/__tests__/local-indexer.test.js +228 -0
- package/dist/__tests__/local-intelligence-l3.test.js +332 -0
- package/dist/__tests__/local-llm.test.js +253 -0
- package/dist/__tests__/local-mode-offline.test.js +187 -0
- package/dist/__tests__/local-mode-stats.test.js +273 -0
- package/dist/__tests__/local-mode-tui.test.js +343 -0
- package/dist/__tests__/local-parse.test.js +199 -0
- package/dist/__tests__/log-tailer.test.js +208 -0
- package/dist/__tests__/loop-breaker.test.js +276 -0
- package/dist/__tests__/loop-miner.test.js +226 -0
- package/dist/__tests__/mcp-config.test.js +126 -0
- package/dist/__tests__/mcp-content-json.test.js +10 -0
- package/dist/__tests__/mcp-envelope.test.js +124 -0
- package/dist/__tests__/metrics-store.test.js +223 -0
- package/dist/__tests__/native-watcher.test.js +191 -0
- package/dist/__tests__/navigation-hooks-agent-aware.test.js +145 -0
- package/dist/__tests__/negative-knowledge.test.js +116 -0
- package/dist/__tests__/network-boundary.test.js +190 -0
- package/dist/__tests__/network-firewall.test.js +112 -0
- package/dist/__tests__/nudge-invariants.test.js +160 -0
- package/dist/__tests__/nudge-v2.test.js +225 -0
- package/dist/__tests__/offline-rewind.test.js +251 -0
- package/dist/__tests__/open-threads.test.js +89 -0
- package/dist/__tests__/output-compressor.test.js +93 -0
- package/dist/__tests__/pending-violations.test.js +112 -0
- package/dist/__tests__/persistence-effectiveness.test.js +143 -0
- package/dist/__tests__/provider-factory.test.js +42 -0
- package/dist/__tests__/providers.test.js +24 -0
- package/dist/__tests__/proxy.test.js +314 -0
- package/dist/__tests__/query-router.test.js +1018 -0
- package/dist/__tests__/reasoning-quality-route.test.js +138 -0
- package/dist/__tests__/redactor.test.js +120 -0
- package/dist/__tests__/resource-monitor.test.js +57 -0
- package/dist/__tests__/response-envelope.test.js +100 -0
- package/dist/__tests__/risk-classifier.test.js +101 -0
- package/dist/__tests__/risk-signal-scope.test.js +75 -0
- package/dist/__tests__/rule-evaluator.test.js +280 -0
- package/dist/__tests__/scip-decoder.test.js +49 -0
- package/dist/__tests__/scip-downloader.test.js +201 -0
- package/dist/__tests__/scip-merger.test.js +103 -0
- package/dist/__tests__/search-index.test.js +422 -0
- package/dist/__tests__/semantic-enrichment.test.js +360 -0
- package/dist/__tests__/session-brief-builder.test.js +187 -0
- package/dist/__tests__/session-context.test.js +221 -0
- package/dist/__tests__/session-continuity.test.js +144 -0
- package/dist/__tests__/session-dedup.test.js +74 -0
- package/dist/__tests__/session-event-wiring.test.js +206 -0
- package/dist/__tests__/session-events.test.js +149 -0
- package/dist/__tests__/session-legend.test.js +20 -0
- package/dist/__tests__/session-persistence.test.js +131 -0
- package/dist/__tests__/session-resume-block.test.js +107 -0
- package/dist/__tests__/session-resume.test.js +97 -0
- package/dist/__tests__/session-summary-writer.test.js +134 -0
- package/dist/__tests__/shadow-ledger.test.js +203 -0
- package/dist/__tests__/shell-classifier.test.js +151 -0
- package/dist/__tests__/shell-compression-floor.test.js +189 -0
- package/dist/__tests__/shell-compression-v2.test.js +339 -0
- package/dist/__tests__/shell-compressor.test.js +35 -0
- package/dist/__tests__/shell-hooks.test.js +128 -0
- package/dist/__tests__/shell-strategies.test.js +644 -0
- package/dist/__tests__/shell-tee.test.js +133 -0
- package/dist/__tests__/signal-dedup.test.js +158 -0
- package/dist/__tests__/signal-reinforcer.test.js +77 -0
- package/dist/__tests__/signal-scorer.test.js +251 -0
- package/dist/__tests__/signal-show-store.test.js +108 -0
- package/dist/__tests__/smart-truncate.test.js +215 -0
- package/dist/__tests__/snapshot-v2.test.js +113 -0
- package/dist/__tests__/sprint-l1-local-mode.test.js +130 -0
- package/dist/__tests__/sprint-l10-boot.test.js +220 -0
- package/dist/__tests__/sprint-l9-offline-commands.test.js +189 -0
- package/dist/__tests__/sprint-q-persistent-context.test.js +198 -0
- package/dist/__tests__/sprint-s1-wiring.test.js +215 -0
- package/dist/__tests__/sprint-s2-wiring.test.js +256 -0
- package/dist/__tests__/sprint-s3-wiring.test.js +195 -0
- package/dist/__tests__/sprint-s4-wiring.test.js +213 -0
- package/dist/__tests__/sprint-s6-hooks.test.js +222 -0
- package/dist/__tests__/sprint-s7-persistent.test.js +263 -0
- package/dist/__tests__/sprint-s8-value.test.js +167 -0
- package/dist/__tests__/sprint-s9-behavioral.test.js +179 -0
- package/dist/__tests__/sprint3-intelligence.test.js +297 -0
- package/dist/__tests__/sprint5-mcp-server.test.js +136 -0
- package/dist/__tests__/startup-display.test.js +302 -0
- package/dist/__tests__/startup-log-file.test.js +97 -0
- package/dist/__tests__/stash-manager.test.js +229 -0
- package/dist/__tests__/state-detector.test.js +92 -0
- package/dist/__tests__/status-dashboard.test.js +142 -0
- package/dist/__tests__/temporal-facts.test.js +292 -0
- package/dist/__tests__/temporal-routes.test.js +142 -0
- package/dist/__tests__/test-detector.test.js +174 -0
- package/dist/__tests__/theme.test.js +72 -0
- package/dist/__tests__/timeline-agents.test.js +122 -0
- package/dist/__tests__/timeline-bootstrap.test.js +176 -0
- package/dist/__tests__/timeline-filters.test.js +193 -0
- package/dist/__tests__/timeline-markers.test.js +151 -0
- package/dist/__tests__/timeline-routes.test.js +156 -0
- package/dist/__tests__/timeline-store.test.js +171 -0
- package/dist/__tests__/token-counter.test.js +86 -0
- package/dist/__tests__/token-estimator.test.js +96 -0
- package/dist/__tests__/token-flow-api.test.js +239 -0
- package/dist/__tests__/token-flow-instrumentation.test.js +437 -0
- package/dist/__tests__/token-flow-persistence.test.js +356 -0
- package/dist/__tests__/token-flow-routes.test.js +199 -0
- package/dist/__tests__/token-flow.test.js +695 -0
- package/dist/__tests__/tool-clusters.test.js +177 -0
- package/dist/__tests__/transport-mux.test.js +283 -0
- package/dist/__tests__/turn-segmenter.test.js +166 -0
- package/dist/__tests__/uninstall.test.js +141 -0
- package/dist/__tests__/warm-start-policy.test.js +271 -0
- package/dist/__tests__/wire-cap-nudge.test.js +77 -0
- package/dist/__tests__/worker-pool.test.js +101 -0
- package/dist/behaviors/agent-llm-bridge.js +166 -0
- package/dist/behaviors/architecture-guard.js +256 -0
- package/dist/behaviors/auto-doc.js +247 -0
- package/dist/behaviors/cascade-guard.js +289 -0
- package/dist/behaviors/change-narrative.js +270 -0
- package/dist/behaviors/convention-drift.js +290 -0
- package/dist/behaviors/framework.js +235 -0
- package/dist/behaviors/guard-formatter.js +44 -0
- package/dist/behaviors/incomplete-work.js +270 -0
- package/dist/behaviors/loop-breaker.js +300 -0
- package/dist/behaviors/session-continuity.js +208 -0
- package/dist/cli.js +6446 -2227
- package/dist/commands/branches.js +97 -0
- package/dist/commands/check-commit.js +225 -0
- package/dist/commands/compress-output.js +64 -0
- package/dist/commands/config-verify.js +243 -0
- package/dist/commands/daemon.js +905 -0
- package/dist/commands/dashboard.js +52 -0
- package/dist/commands/debug.js +200 -0
- package/dist/commands/enrich.js +184 -0
- package/dist/commands/exec.js +233 -0
- package/dist/commands/gain.js +156 -0
- package/dist/commands/hook.js +88 -0
- package/dist/commands/index.js +88 -0
- package/dist/commands/init.js +74 -0
- package/dist/commands/install.js +505 -0
- package/dist/commands/learn.js +116 -0
- package/dist/commands/manifest.js +193 -0
- package/dist/commands/rewind.js +103 -0
- package/dist/commands/serve.js +19 -0
- package/dist/commands/setup-wizard.js +414 -0
- package/dist/commands/skills.js +64 -0
- package/dist/commands/stats.js +20 -0
- package/dist/commands/status.js +654 -0
- package/dist/commands/timeline.js +139 -0
- package/dist/commands/uninstall.js +230 -0
- package/dist/components/App.js +109 -0
- package/dist/components/Banner.js +12 -0
- package/dist/components/ConfirmPrompt.js +25 -0
- package/dist/components/DriftSummary.js +23 -0
- package/dist/components/GradeBadge.js +15 -0
- package/dist/components/HealthCard.js +18 -0
- package/dist/components/InkSpinner.js +22 -0
- package/dist/components/InputBox.js +17 -0
- package/dist/components/KeyValue.js +13 -0
- package/dist/components/MessageList.js +14 -0
- package/dist/components/ProgressBar.js +26 -0
- package/dist/components/Section.js +16 -0
- package/dist/components/SessionSummaryCard.js +73 -0
- package/dist/components/StartupDisplay.js +24 -0
- package/dist/components/StatusDashboard.js +57 -0
- package/dist/components/StatusLine.js +8 -0
- package/dist/components/StepLine.js +22 -0
- package/dist/components/Theme.js +20 -0
- package/dist/components/ToolProgress.js +8 -0
- package/dist/components/ViolationList.js +21 -0
- package/dist/components/render.js +13 -0
- package/dist/config/agent-registry.js +237 -0
- package/dist/config/claude-settings-hooks.js +304 -0
- package/dist/config/hook-installer.js +65 -0
- package/dist/config/instruction-writer.js +388 -0
- package/dist/config/mcp-config-writer.js +266 -0
- package/dist/config/settings.js +174 -0
- package/dist/config/tool-detector.js +42 -0
- package/dist/config/value-surfacing.js +119 -0
- package/dist/core/context-assembly.js +108 -0
- package/dist/core/conversation.js +33 -0
- package/dist/core/local-chat-provider.js +475 -0
- package/dist/core/provider-factory.js +55 -0
- package/dist/core/providers.js +90 -0
- package/dist/core/query-engine.js +174 -0
- package/dist/daemon/api.js +312 -0
- package/dist/daemon/autostart.js +119 -0
- package/dist/daemon/bootstrap.js +39 -0
- package/dist/daemon/client.js +164 -0
- package/dist/daemon/detect-ci.js +81 -0
- package/dist/daemon/platform-linux.js +146 -0
- package/dist/daemon/platform-macos.js +134 -0
- package/dist/daemon/platform-windows.js +116 -0
- package/dist/daemon/process-manager.js +299 -0
- package/dist/daemon/protocol.js +23 -0
- package/dist/daemon/registry.js +270 -0
- package/dist/daemon/settings-schema.js +72 -0
- package/dist/daemon/system-health.js +134 -0
- package/dist/daemon/version-checker.js +262 -0
- package/dist/daemon/warm-start.js +223 -0
- package/dist/entrypoints/cli.js +1043 -0
- package/dist/entrypoints/daemon.js +380 -0
- package/dist/entrypoints/repl.js +147 -0
- package/dist/hooks/adapters/claude-code.js +90 -0
- package/dist/hooks/adapters/cline.js +100 -0
- package/dist/hooks/adapters/cursor.js +98 -0
- package/dist/hooks/hook-dedup.js +79 -0
- package/dist/hooks/hook-runner.js +113 -0
- package/dist/hooks/navigation-hooks.js +175 -0
- package/dist/hooks/prompt-hooks.js +63 -0
- package/dist/hooks/shell-hooks.js +47 -0
- package/dist/ignore.js +111 -0
- package/dist/intelligence/approach-suggester.js +61 -0
- package/dist/intelligence/ast-extractor.js +2615 -0
- package/dist/intelligence/ast-worker.js +34 -0
- package/dist/intelligence/background-indexer.js +121 -0
- package/dist/intelligence/blast-radius.js +200 -0
- package/dist/intelligence/community-detection.js +691 -0
- package/dist/intelligence/community-detector.js +184 -0
- package/dist/intelligence/computation-scheduler.js +75 -0
- package/dist/intelligence/confidence-propagation.js +47 -0
- package/dist/intelligence/convention-detector.js +242 -0
- package/dist/intelligence/convention-learner.js +205 -0
- package/dist/intelligence/convention-matcher.js +205 -0
- package/dist/intelligence/cozo-schema.js +376 -0
- package/dist/intelligence/decision-point-detector.js +90 -0
- package/dist/intelligence/deep-dive-tools.js +586 -0
- package/dist/intelligence/durability-scorer.js +84 -0
- package/dist/intelligence/exploration-cost.js +204 -0
- package/dist/intelligence/exploration-pattern-tracker.js +61 -0
- package/dist/intelligence/fact-generator.js +322 -0
- package/dist/intelligence/facts-schema.js +90 -0
- package/dist/intelligence/file-intelligence.js +59 -0
- package/dist/intelligence/graph-holder.js +220 -0
- package/dist/intelligence/graph-temporal-joiner.js +238 -0
- package/dist/intelligence/health-grade.js +423 -0
- package/dist/intelligence/health-grader.js +200 -0
- package/dist/intelligence/health-map-data.js +259 -0
- package/dist/intelligence/import-symbols.js +136 -0
- package/dist/intelligence/incremental-indexer.js +658 -0
- package/dist/intelligence/indexer/centrality.js +62 -0
- package/dist/intelligence/indexer/cfg-context.js +95 -0
- package/dist/intelligence/indexer/confidence.js +34 -0
- package/dist/intelligence/indexer/cross-file-resolver.js +104 -0
- package/dist/intelligence/indexer/edge-repair.js +89 -0
- package/dist/intelligence/indexer/entity-key.js +17 -0
- package/dist/intelligence/indexer/export-map.js +132 -0
- package/dist/intelligence/indexer/git-cochange.js +128 -0
- package/dist/intelligence/indexer/graph-patch.js +147 -0
- package/dist/intelligence/indexer/incremental.js +78 -0
- package/dist/intelligence/indexer/ingest.js +160 -0
- package/dist/intelligence/indexer/language-detect.js +226 -0
- package/dist/intelligence/indexer/metadata.js +63 -0
- package/dist/intelligence/indexer/mutation-tracker.js +79 -0
- package/dist/intelligence/indexer/orchestrator.js +155 -0
- package/dist/intelligence/indexer/plugin-interface.js +31 -0
- package/dist/intelligence/indexer/plugins/csharp.js +440 -0
- package/dist/intelligence/indexer/plugins/go.js +335 -0
- package/dist/intelligence/indexer/plugins/java.js +370 -0
- package/dist/intelligence/indexer/plugins/python.js +358 -0
- package/dist/intelligence/indexer/plugins/regex-fallback.js +82 -0
- package/dist/intelligence/indexer/plugins/ruby.js +290 -0
- package/dist/intelligence/indexer/plugins/rust.js +484 -0
- package/dist/intelligence/indexer/plugins/tier2-generic.js +310 -0
- package/dist/intelligence/indexer/plugins/typescript.js +456 -0
- package/dist/intelligence/indexer/resource-monitor.js +93 -0
- package/dist/intelligence/indexer/scip/decoder.js +253 -0
- package/dist/intelligence/indexer/scip/detector.js +232 -0
- package/dist/intelligence/indexer/scip/downloader.js +427 -0
- package/dist/intelligence/indexer/scip/fallback.js +34 -0
- package/dist/intelligence/indexer/scip/merger.js +109 -0
- package/dist/intelligence/indexer/scip/orchestrator.js +433 -0
- package/dist/intelligence/indexer/scip/runner.js +98 -0
- package/dist/intelligence/indexer/snapshot.js +66 -0
- package/dist/intelligence/indexer/test-detector.js +196 -0
- package/dist/intelligence/indexer/watch-integration.js +61 -0
- package/dist/intelligence/indexer/worker.js +85 -0
- package/dist/intelligence/local-convention-detector.js +437 -0
- package/dist/intelligence/local-embeddings.js +190 -0
- package/dist/intelligence/local-graph.js +1946 -0
- package/dist/intelligence/local-indexer.js +1575 -0
- package/dist/intelligence/local-llm.js +163 -0
- package/dist/intelligence/local-rule-generator.js +154 -0
- package/dist/intelligence/local-snapshot.js +213 -0
- package/dist/intelligence/negative-knowledge.js +103 -0
- package/dist/intelligence/persistent-db.js +85 -0
- package/dist/intelligence/query-router.js +2556 -0
- package/dist/intelligence/risk-classifier.js +116 -0
- package/dist/intelligence/rule-evaluator.js +380 -0
- package/dist/intelligence/rule-generator.js +49 -0
- package/dist/intelligence/search-index.js +173 -0
- package/dist/intelligence/semantic/docstring-extractor.js +67 -0
- package/dist/intelligence/semantic/embedding-store.js +52 -0
- package/dist/intelligence/semantic/enrichment-orchestrator.js +48 -0
- package/dist/intelligence/semantic/git-message-miner.js +114 -0
- package/dist/intelligence/semantic/identifier-tokenizer.js +51 -0
- package/dist/intelligence/semantic/node2vec-embeddings.js +71 -0
- package/dist/intelligence/semantic/node2vec-walks.js +103 -0
- package/dist/intelligence/semantic/path-domain-inference.js +112 -0
- package/dist/intelligence/semantic/similarity-engine.js +60 -0
- package/dist/intelligence/semantic/tfidf-vectors.js +88 -0
- package/dist/intelligence/session-brief-builder.js +159 -0
- package/dist/intelligence/session-context.js +221 -0
- package/dist/intelligence/session-health-monitor.js +211 -0
- package/dist/intelligence/session-narrative.js +197 -0
- package/dist/intelligence/session-pattern-analyzer.js +218 -0
- package/dist/intelligence/signal-scorer.js +390 -0
- package/dist/intelligence/signal-show-store.js +182 -0
- package/dist/intelligence/smart-truncate.js +158 -0
- package/dist/intelligence/subgraph-cache.js +88 -0
- package/dist/intelligence/temporal-facts.js +494 -0
- package/dist/intelligence/token-estimator.js +100 -0
- package/dist/intelligence/tool-injector.js +87 -0
- package/dist/intelligence/tree-sitter-loader.js +71 -0
- package/dist/intelligence/worker-pool.js +116 -0
- package/dist/proxy/arg-validator.js +79 -0
- package/dist/proxy/auto-bootstrap.js +167 -0
- package/dist/proxy/bridge.js +147 -0
- package/dist/proxy/budget-enforcer.js +70 -0
- package/dist/proxy/compression-quality-monitor.js +160 -0
- package/dist/proxy/compression-stats.js +51 -0
- package/dist/proxy/context-rot-detector.js +137 -0
- package/dist/proxy/drift-detector.js +139 -0
- package/dist/proxy/efficiency-tracker.js +79 -0
- package/dist/proxy/fact-ranking.js +154 -0
- package/dist/proxy/format-encoder.js +266 -0
- package/dist/proxy/http-transport.js +90 -0
- package/dist/proxy/lifecycle-actor.js +55 -0
- package/dist/proxy/lifecycle-machine.js +187 -0
- package/dist/proxy/log-tailer.js +265 -0
- package/dist/proxy/model-pricing.js +98 -0
- package/dist/proxy/network-firewall.js +141 -0
- package/dist/proxy/nudge-state.js +93 -0
- package/dist/proxy/output-compressor.js +185 -0
- package/dist/proxy/pid-lock.js +291 -0
- package/dist/proxy/proxy-context.js +11 -0
- package/dist/proxy/proxy.js +2633 -0
- package/dist/proxy/response-enrichment.js +32 -0
- package/dist/proxy/response-envelope.js +313 -0
- package/dist/proxy/session-dedup.js +82 -0
- package/dist/proxy/session-legend.js +30 -0
- package/dist/proxy/session-persistence.js +210 -0
- package/dist/proxy/session-resume.js +94 -0
- package/dist/proxy/session-stats.js +513 -0
- package/dist/proxy/shell-classifier.js +1346 -0
- package/dist/proxy/shell-compression-log.js +93 -0
- package/dist/proxy/shell-compressor.js +390 -0
- package/dist/proxy/shell-graph-boost.js +202 -0
- package/dist/proxy/shell-monitor-map.js +18 -0
- package/dist/proxy/shell-stats.js +54 -0
- package/dist/proxy/shell-strategies/cloud.js +215 -0
- package/dist/proxy/shell-strategies/diff.js +159 -0
- package/dist/proxy/shell-strategies/error-diagnostic.js +796 -0
- package/dist/proxy/shell-strategies/filter-dsl.js +358 -0
- package/dist/proxy/shell-strategies/git-status.js +177 -0
- package/dist/proxy/shell-strategies/key-value.js +193 -0
- package/dist/proxy/shell-strategies/log-text.js +154 -0
- package/dist/proxy/shell-strategies/omni.js +188 -0
- package/dist/proxy/shell-strategies/progress.js +55 -0
- package/dist/proxy/shell-strategies/redact.js +76 -0
- package/dist/proxy/shell-strategies/structured.js +241 -0
- package/dist/proxy/shell-strategies/tabular.js +243 -0
- package/dist/proxy/shell-strategies/test-results-types.js +13 -0
- package/dist/proxy/shell-strategies/test-results.js +784 -0
- package/dist/proxy/shell-strategies/tree-paths.js +144 -0
- package/dist/proxy/shell-strategies/yaml.js +182 -0
- package/dist/proxy/shell-tee.js +111 -0
- package/dist/proxy/signal-dedup.js +171 -0
- package/dist/proxy/startup-renderer.js +158 -0
- package/dist/proxy/task-token-display.js +38 -0
- package/dist/proxy/token-counter.js +61 -0
- package/dist/proxy/tool-clusters.js +273 -0
- package/dist/proxy/tool-definitions.js +525 -0
- package/dist/proxy/transport-mux.js +229 -0
- package/dist/proxy/wire-cap.js +268 -0
- package/dist/schemas/api/skills.js +19 -0
- package/dist/schemas/common/errors.js +7 -0
- package/dist/schemas/common/headers.js +5 -0
- package/dist/schemas/entities/edge.js +25 -0
- package/dist/schemas/entities/entity.js +22 -0
- package/dist/schemas/entities/rule.js +18 -0
- package/dist/schemas/index.js +14 -0
- package/dist/server/event-bus.js +59 -0
- package/dist/server/http.js +156 -0
- package/dist/server/middleware.js +70 -0
- package/dist/server/routes/drift.js +97 -0
- package/dist/server/routes/intelligence.js +1217 -0
- package/dist/server/routes/reasoning-quality.js +444 -0
- package/dist/server/routes/session.js +86 -0
- package/dist/server/routes/stream.js +120 -0
- package/dist/server/routes/system.js +73 -0
- package/dist/server/routes/temporal.js +170 -0
- package/dist/server/routes/timeline.js +232 -0
- package/dist/server/routes/token-flow.js +403 -0
- package/dist/skills/effectiveness-tracker.js +93 -0
- package/dist/skills/local-pack.js +380 -0
- package/dist/skills/resolver.js +495 -0
- package/dist/state-detector.js +83 -0
- package/dist/timeline/intent-detector.js +263 -0
- package/dist/timeline/loop-miner.js +140 -0
- package/dist/timeline/open-threads.js +49 -0
- package/dist/timeline/signal-reinforcer.js +62 -0
- package/dist/timeline/timeline-bootstrap.js +151 -0
- package/dist/timeline/timeline-store.js +618 -0
- package/dist/tools/coding/bash.js +49 -0
- package/dist/tools/coding/file-edit.js +72 -0
- package/dist/tools/coding/file-outline.js +227 -0
- package/dist/tools/coding/file-read-protocol.js +425 -0
- package/dist/tools/coding/file-read.js +35 -0
- package/dist/tools/coding/file-write.js +43 -0
- package/dist/tools/coding/glob-tool.js +109 -0
- package/dist/tools/coding/grep.js +162 -0
- package/dist/tools/coding/index.js +27 -0
- package/dist/tools/intelligence/index.js +269 -0
- package/dist/tools/intelligence/record-fact.js +48 -0
- package/dist/tools/intelligence/timeline-markers.js +130 -0
- package/dist/tools/registry.js +47 -0
- package/dist/tools/types.js +8 -0
- package/dist/tracking/auto-snapshot-triggers.js +246 -0
- package/dist/tracking/branch-context.js +115 -0
- package/dist/tracking/branch-snapshot.js +217 -0
- package/dist/tracking/causal-bridge.js +317 -0
- package/dist/tracking/circuit-breaker.js +147 -0
- package/dist/tracking/commit-watcher.js +114 -0
- package/dist/tracking/context-ledger.js +119 -0
- package/dist/tracking/correction-detector.js +324 -0
- package/dist/tracking/drift-tracker.js +874 -0
- package/dist/tracking/durability-tracker.js +94 -0
- package/dist/tracking/entity-rewind.js +200 -0
- package/dist/tracking/file-hash-state.js +114 -0
- package/dist/tracking/git-attribution.js +132 -0
- package/dist/tracking/git-trailers.js +171 -0
- package/dist/tracking/intelligence-counter.js +46 -0
- package/dist/tracking/intent-correlator.js +202 -0
- package/dist/tracking/intent-encoder.js +52 -0
- package/dist/tracking/intent-token-tracker.js +159 -0
- package/dist/tracking/ledger-archiver.js +94 -0
- package/dist/tracking/ledger-chains.js +245 -0
- package/dist/tracking/metrics-store.js +361 -0
- package/dist/tracking/native-watcher.js +131 -0
- package/dist/tracking/offline-rewind.js +295 -0
- package/dist/tracking/pending-violations.js +74 -0
- package/dist/tracking/persistence-effectiveness.js +167 -0
- package/dist/tracking/prompt-durability.js +202 -0
- package/dist/tracking/quality-signals.js +213 -0
- package/dist/tracking/redactor.js +73 -0
- package/dist/tracking/rewind-engine.js +161 -0
- package/dist/tracking/session-history.js +128 -0
- package/dist/tracking/session-receipt.js +88 -0
- package/dist/tracking/session-summary-writer.js +157 -0
- package/dist/tracking/shadow-ledger.js +321 -0
- package/dist/tracking/stash-manager.js +258 -0
- package/dist/tracking/timeline-fork.js +213 -0
- package/dist/tracking/timeline.js +69 -0
- package/dist/tracking/token-flow.js +276 -0
- package/dist/tracking/turn-segmenter.js +122 -0
- package/dist/tracking/weekly-accumulator.js +179 -0
- package/dist/tracking/working-snapshots.js +188 -0
- package/dist/tracking/workspace-manifest.js +176 -0
- package/dist/transport/http.js +102 -0
- package/dist/ui/assets/index-7gl3mIuY.css +1 -0
- package/dist/ui/assets/index-BsMTQdhX.js +10 -0
- package/dist/ui/index.html +2 -2
- package/dist/utils/counterfactual.js +65 -0
- package/dist/utils/deep-link.js +34 -0
- package/dist/utils/detect.js +193 -0
- package/dist/utils/exec.js +73 -0
- package/dist/utils/file-logger.js +87 -0
- package/dist/utils/format-error.js +29 -0
- package/dist/utils/git.js +181 -0
- package/dist/utils/log.js +57 -0
- package/dist/utils/logger.js +35 -0
- package/dist/utils/mcp-content-json.js +8 -0
- package/dist/utils/session-logger.js +154 -0
- package/dist/utils/startup-log.js +512 -0
- package/dist/utils/ui.js +56 -0
- package/package.json +5 -3
- package/scripts/postinstall.mjs +299 -0
- package/dist/ui/assets/index-BISLlJyc.js +0 -10
- package/dist/ui/assets/index-BUChTv4H.css +0 -1
|
@@ -0,0 +1,512 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Premium Startup Logger — brand-aligned terminal output.
|
|
3
|
+
*
|
|
4
|
+
* Design principles (inspired by Claude Code, Vercel, PostHog):
|
|
5
|
+
* - Every line tells you something you didn't know
|
|
6
|
+
* - Strategic color: violet accent (brand), cyan (live data), emerald (success)
|
|
7
|
+
* - Dim metadata, bold insights — the eye goes to what matters
|
|
8
|
+
* - Step markers with timing — feels responsive and intentional
|
|
9
|
+
* - No walls of text — one insight per line, whitespace between phases
|
|
10
|
+
*
|
|
11
|
+
* Color palette (from styles/tailwind.css design system):
|
|
12
|
+
* - Violet #8B5CF6 (brand accent)
|
|
13
|
+
* - Cyan #22D3EE (live/active data)
|
|
14
|
+
* - Emerald #34D399 (success)
|
|
15
|
+
* - Amber #FBBF24 (warning)
|
|
16
|
+
* - Red #F87171 (error)
|
|
17
|
+
* - Cloud White #FAFAFA (primary text)
|
|
18
|
+
* - Muted #A1A1AA (metadata)
|
|
19
|
+
*
|
|
20
|
+
* All output to stderr (stdout is MCP JSON-RPC sacred).
|
|
21
|
+
* File logging: call `initFileLog(cwd)` once at boot to enable parallel
|
|
22
|
+
* NDJSON logging to `.unerr/logs/unerr.jsonl` with richer metadata than console.
|
|
23
|
+
*/
|
|
24
|
+
import { appendFileSync, mkdirSync, readFileSync, writeFileSync, } from "node:fs";
|
|
25
|
+
import { join } from "node:path";
|
|
26
|
+
// ── File logging ────────────────────────────────────────────────────
|
|
27
|
+
let _fileLogPath = null;
|
|
28
|
+
let _fileLogCount = 0;
|
|
29
|
+
/** Strip ANSI escape sequences for machine-readable file output. */
|
|
30
|
+
function stripAnsi(s) {
|
|
31
|
+
const ESC = "\x1b";
|
|
32
|
+
const CSI = new RegExp(`${ESC}\\[[0-9;?]*[A-Za-z~]`, "g");
|
|
33
|
+
const OSC = new RegExp(`${ESC}\\][^\\x07]*\\x07`, "g");
|
|
34
|
+
return s.replace(CSI, "").replace(OSC, "");
|
|
35
|
+
}
|
|
36
|
+
function rotateIfNeeded(filePath, maxLines, keepLines) {
|
|
37
|
+
try {
|
|
38
|
+
const content = readFileSync(filePath, "utf-8");
|
|
39
|
+
const lines = content.split("\n").filter(Boolean);
|
|
40
|
+
if (lines.length > maxLines) {
|
|
41
|
+
writeFileSync(filePath, `${lines.slice(-keepLines).join("\n")}\n`);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
/* file may not exist yet */
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/** Initialize file logging for this process. Call once at boot. */
|
|
49
|
+
export function initFileLog(cwd) {
|
|
50
|
+
const logsDir = join(cwd, ".unerr", "logs");
|
|
51
|
+
mkdirSync(logsDir, { recursive: true });
|
|
52
|
+
_fileLogPath = join(logsDir, "unerr.jsonl");
|
|
53
|
+
rotateIfNeeded(_fileLogPath, 2000, 1000);
|
|
54
|
+
}
|
|
55
|
+
function writeToFile(level, message, meta) {
|
|
56
|
+
if (!_fileLogPath)
|
|
57
|
+
return;
|
|
58
|
+
const entry = {
|
|
59
|
+
ts: new Date().toISOString(),
|
|
60
|
+
pid: process.pid,
|
|
61
|
+
level,
|
|
62
|
+
msg: stripAnsi(message),
|
|
63
|
+
...meta,
|
|
64
|
+
};
|
|
65
|
+
try {
|
|
66
|
+
appendFileSync(_fileLogPath, `${JSON.stringify(entry)}\n`);
|
|
67
|
+
if (++_fileLogCount % 200 === 0)
|
|
68
|
+
rotateIfNeeded(_fileLogPath, 2000, 1000);
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
/* best effort */
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
// ── ANSI 256-color helpers ──────────────────────────────────────────
|
|
75
|
+
const ESC = "\x1b[";
|
|
76
|
+
const RESET = `${ESC}0m`;
|
|
77
|
+
const BOLD = `${ESC}1m`;
|
|
78
|
+
const DIM = `${ESC}2m`;
|
|
79
|
+
const ITALIC = `${ESC}3m`;
|
|
80
|
+
// 256-color foreground: \x1b[38;5;{n}m
|
|
81
|
+
function fg256(n) {
|
|
82
|
+
return `${ESC}38;5;${n}m`;
|
|
83
|
+
}
|
|
84
|
+
// True-color (24-bit) foreground: \x1b[38;2;r;g;bm
|
|
85
|
+
function fgRgb(r, g, b) {
|
|
86
|
+
return `${ESC}38;2;${r};${g};${b}m`;
|
|
87
|
+
}
|
|
88
|
+
// ── Brand color codes (true-color for maximum fidelity) ─────────────
|
|
89
|
+
const VIOLET = fgRgb(139, 92, 246); // #8B5CF6
|
|
90
|
+
const CYAN = fgRgb(34, 211, 238); // #22D3EE
|
|
91
|
+
const EMERALD = fgRgb(52, 211, 153); // #34D399
|
|
92
|
+
const AMBER = fgRgb(251, 191, 36); // #FBBF24
|
|
93
|
+
const RED = fgRgb(248, 113, 113); // #F87171
|
|
94
|
+
const MUTED = fgRgb(161, 161, 170); // #A1A1AA
|
|
95
|
+
const WHITE = fgRgb(250, 250, 250); // #FAFAFA
|
|
96
|
+
// ── Formatters ──────────────────────────────────────────��───────────
|
|
97
|
+
function violet(s) {
|
|
98
|
+
return `${VIOLET}${s}${RESET}`;
|
|
99
|
+
}
|
|
100
|
+
function cyan(s) {
|
|
101
|
+
return `${CYAN}${s}${RESET}`;
|
|
102
|
+
}
|
|
103
|
+
function emerald(s) {
|
|
104
|
+
return `${EMERALD}${s}${RESET}`;
|
|
105
|
+
}
|
|
106
|
+
function amber(s) {
|
|
107
|
+
return `${AMBER}${s}${RESET}`;
|
|
108
|
+
}
|
|
109
|
+
function red(s) {
|
|
110
|
+
return `${RED}${s}${RESET}`;
|
|
111
|
+
}
|
|
112
|
+
function muted(s) {
|
|
113
|
+
return `${MUTED}${s}${RESET}`;
|
|
114
|
+
}
|
|
115
|
+
function bold(s) {
|
|
116
|
+
return `${BOLD}${s}${RESET}`;
|
|
117
|
+
}
|
|
118
|
+
function dim(s) {
|
|
119
|
+
return `${DIM}${s}${RESET}`;
|
|
120
|
+
}
|
|
121
|
+
function brandBold(s) {
|
|
122
|
+
return `${BOLD}${VIOLET}${s}${RESET}`;
|
|
123
|
+
}
|
|
124
|
+
// ── Symbols ─────────────────────────────────────────────────────────
|
|
125
|
+
const SYM = {
|
|
126
|
+
step: `${VIOLET}▸${RESET}`,
|
|
127
|
+
done: `${EMERALD}✓${RESET}`,
|
|
128
|
+
warn: `${AMBER}⚠${RESET}`,
|
|
129
|
+
fail: `${RED}✗${RESET}`,
|
|
130
|
+
dot: `${MUTED}·${RESET}`,
|
|
131
|
+
arrow: `${MUTED}→${RESET}`,
|
|
132
|
+
bar: `${MUTED}│${RESET}`,
|
|
133
|
+
brain: `${VIOLET}◆${RESET}`,
|
|
134
|
+
bolt: `${CYAN}⚡${RESET}`,
|
|
135
|
+
};
|
|
136
|
+
// ── Output (always stderr) ──────────────────────────────────────────
|
|
137
|
+
// Pause buffer — when paused (e.g. while an interactive clack prompt owns
|
|
138
|
+
// the terminal during indexing), startup lines are buffered and flushed on
|
|
139
|
+
// resume. Avoids prints like "Dashboard — http://…" appearing under the
|
|
140
|
+
// prompt while the user is still picking an option.
|
|
141
|
+
let paused = false;
|
|
142
|
+
const pauseBuffer = [];
|
|
143
|
+
function write(line) {
|
|
144
|
+
if (paused) {
|
|
145
|
+
pauseBuffer.push(line);
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
process.stderr.write(`${line}\n`);
|
|
149
|
+
}
|
|
150
|
+
function pauseWrites() {
|
|
151
|
+
paused = true;
|
|
152
|
+
}
|
|
153
|
+
function resumeWrites() {
|
|
154
|
+
paused = false;
|
|
155
|
+
if (pauseBuffer.length === 0)
|
|
156
|
+
return;
|
|
157
|
+
const pending = pauseBuffer.splice(0, pauseBuffer.length);
|
|
158
|
+
for (const line of pending) {
|
|
159
|
+
process.stderr.write(`${line}\n`);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
// ── Public API ──────────────────────────────────────────��───────────
|
|
163
|
+
export const startupLog = {
|
|
164
|
+
/** Brand header — first thing the user sees */
|
|
165
|
+
header() {
|
|
166
|
+
write("");
|
|
167
|
+
write(` ${brandBold("unerr")} ${muted("— intelligence engine for AI agents")}`);
|
|
168
|
+
write("");
|
|
169
|
+
writeToFile("header", "unerr — intelligence engine for AI agents");
|
|
170
|
+
},
|
|
171
|
+
/** Phase separator with dim label */
|
|
172
|
+
phase(label) {
|
|
173
|
+
write(` ${dim("─── ")}${muted(label)}${dim(" ───")}`);
|
|
174
|
+
writeToFile("phase", label);
|
|
175
|
+
},
|
|
176
|
+
/** Active step — something is happening */
|
|
177
|
+
step(msg) {
|
|
178
|
+
write(` ${SYM.step} ${msg}`);
|
|
179
|
+
writeToFile("step", stripAnsi(msg));
|
|
180
|
+
},
|
|
181
|
+
/** Completed step with optional timing */
|
|
182
|
+
done(msg, ms) {
|
|
183
|
+
const timing = ms !== undefined ? ` ${muted(`${ms}ms`)}` : "";
|
|
184
|
+
write(` ${SYM.done} ${msg}${timing}`);
|
|
185
|
+
writeToFile("done", stripAnsi(msg), ms !== undefined ? { ms } : undefined);
|
|
186
|
+
},
|
|
187
|
+
/** Insight line — the wow factor. Tells user something they didn't know */
|
|
188
|
+
insight(msg) {
|
|
189
|
+
write(` ${SYM.brain} ${msg}`);
|
|
190
|
+
writeToFile("insight", stripAnsi(msg));
|
|
191
|
+
},
|
|
192
|
+
/** Live data / metric with cyan accent */
|
|
193
|
+
metric(label, value, unit) {
|
|
194
|
+
const unitStr = unit ? ` ${muted(unit)}` : "";
|
|
195
|
+
write(` ${SYM.dot} ${muted(label)} ${cyan(String(value))}${unitStr}`);
|
|
196
|
+
writeToFile("metric", label, { value, unit });
|
|
197
|
+
},
|
|
198
|
+
/** Performance highlight — instant/fast operations */
|
|
199
|
+
perf(msg) {
|
|
200
|
+
write(` ${SYM.bolt} ${msg}`);
|
|
201
|
+
writeToFile("perf", stripAnsi(msg));
|
|
202
|
+
},
|
|
203
|
+
/** Warning — non-blocking issue */
|
|
204
|
+
warn(msg) {
|
|
205
|
+
write(` ${SYM.warn} ${amber(msg)}`);
|
|
206
|
+
writeToFile("warn", msg);
|
|
207
|
+
},
|
|
208
|
+
/**
|
|
209
|
+
* File-only log entry — writes to .unerr/logs/unerr.jsonl without touching
|
|
210
|
+
* stderr. Use this on hot paths like `unerr exec` where stderr gets merged
|
|
211
|
+
* into the agent's tool-result context (every byte we emit is LLM tokens),
|
|
212
|
+
* but we still want the event in the JSONL log for dashboards / debugging.
|
|
213
|
+
*/
|
|
214
|
+
fileOnly(level, msg, meta) {
|
|
215
|
+
writeToFile(level, msg, meta);
|
|
216
|
+
},
|
|
217
|
+
/** Error — blocking issue */
|
|
218
|
+
error(msg) {
|
|
219
|
+
write(` ${SYM.fail} ${red(msg)}`);
|
|
220
|
+
writeToFile("error", msg);
|
|
221
|
+
},
|
|
222
|
+
/** Detail line — supplementary info, indented + dim */
|
|
223
|
+
detail(msg) {
|
|
224
|
+
write(` ${muted(msg)}`);
|
|
225
|
+
writeToFile("detail", msg);
|
|
226
|
+
},
|
|
227
|
+
/** Blank line for breathing room */
|
|
228
|
+
blank() {
|
|
229
|
+
write("");
|
|
230
|
+
},
|
|
231
|
+
/** Final ready message — the "we're good" confirmation */
|
|
232
|
+
ready(toolCount, mode) {
|
|
233
|
+
write("");
|
|
234
|
+
write(` ${SYM.done} ${bold("Ready")} ${muted("—")} ${cyan(String(toolCount))} ${muted("tools")} ${muted("·")} ${muted(mode)} ${muted("mode")} ${muted("·")} ${emerald("<5ms")} ${muted("per query")}`);
|
|
235
|
+
write("");
|
|
236
|
+
writeToFile("ready", "Ready", { toolCount, mode });
|
|
237
|
+
},
|
|
238
|
+
/** Session summary box — end of session stats */
|
|
239
|
+
summary(stats) {
|
|
240
|
+
write("");
|
|
241
|
+
write(` ${dim("┌──────────────────────────────────────────┐")}`);
|
|
242
|
+
write(` ${dim("│")} ${brandBold("unerr")} session ${dim("│")}`);
|
|
243
|
+
write(` ${dim("├──────────────────────────────────────────┤")}`);
|
|
244
|
+
write(` ${dim("│")} Duration ${cyan(stats.duration.padEnd(24))}${dim("│")}`);
|
|
245
|
+
write(` ${dim("│")} Tool calls ${cyan(String(stats.toolCalls).padEnd(24))}${dim("│")}`);
|
|
246
|
+
if (stats.tokensSaved) {
|
|
247
|
+
write(` ${dim("│")} Saved ${emerald(stats.tokensSaved.padEnd(24))}${dim("│")}`);
|
|
248
|
+
}
|
|
249
|
+
if (stats.efficiency) {
|
|
250
|
+
write(` ${dim("│")} Efficiency ${emerald(stats.efficiency.padEnd(24))}${dim("│")}`);
|
|
251
|
+
}
|
|
252
|
+
write(` ${dim("└──────────────────────────────────────────┘")}`);
|
|
253
|
+
write("");
|
|
254
|
+
writeToFile("summary", "Session summary", {
|
|
255
|
+
duration: stats.duration,
|
|
256
|
+
toolCalls: stats.toolCalls,
|
|
257
|
+
tokensSaved: stats.tokensSaved,
|
|
258
|
+
efficiency: stats.efficiency,
|
|
259
|
+
});
|
|
260
|
+
},
|
|
261
|
+
// ── Convenience composites ──────────────────────────────────────
|
|
262
|
+
/** Graph loaded insight block — the money shot */
|
|
263
|
+
graphLoaded(stats) {
|
|
264
|
+
const avgConn = stats.edges > 0 ? (stats.edges / stats.entities).toFixed(1) : "0";
|
|
265
|
+
write(` ${SYM.done} ${bold("Graph loaded")} ${muted(`in ${stats.ms}ms`)}`);
|
|
266
|
+
write("");
|
|
267
|
+
write(` ${cyan(stats.entities.toLocaleString())} entities ${muted("across")} ${cyan(String(stats.files))} files ${muted("·")} ${cyan(stats.edges.toLocaleString())} edges ${muted(`(${avgConn} avg/entity)`)}`);
|
|
268
|
+
write(` ${violet(String(stats.communities))} communities ${muted("detected")} ${muted("·")} ${violet(String(stats.patterns))} conventions ${muted("→")} ${violet(String(stats.rules))} rules`);
|
|
269
|
+
if (stats.hottestFile) {
|
|
270
|
+
write(` ${muted("hottest:")} ${bold(stats.hottestFile)} ${muted(`(${stats.hottestCount} entities)`)}`);
|
|
271
|
+
}
|
|
272
|
+
write("");
|
|
273
|
+
writeToFile("graph_loaded", "Graph loaded", {
|
|
274
|
+
entities: stats.entities,
|
|
275
|
+
edges: stats.edges,
|
|
276
|
+
files: stats.files,
|
|
277
|
+
communities: stats.communities,
|
|
278
|
+
patterns: stats.patterns,
|
|
279
|
+
rules: stats.rules,
|
|
280
|
+
ms: stats.ms,
|
|
281
|
+
hottestFile: stats.hottestFile,
|
|
282
|
+
hottestCount: stats.hottestCount,
|
|
283
|
+
});
|
|
284
|
+
},
|
|
285
|
+
/** MCP tools registered */
|
|
286
|
+
toolsReady(count, ruleCount) {
|
|
287
|
+
write(` ${SYM.done} ${cyan(String(count))} intelligence tools registered ${ruleCount > 0 ? muted(`(${ruleCount} enforcement rules)`) : ""}`);
|
|
288
|
+
writeToFile("tools_ready", "Tools registered", { count, ruleCount });
|
|
289
|
+
},
|
|
290
|
+
/** Skills installed during setup */
|
|
291
|
+
skillsInstalled(names, ide) {
|
|
292
|
+
write(` ${SYM.done} ${emerald(String(names.length))} agent skills installed ${muted(`for ${ide}`)}`);
|
|
293
|
+
for (const name of names) {
|
|
294
|
+
write(` ${muted("·")} ${name}`);
|
|
295
|
+
}
|
|
296
|
+
writeToFile("skills_installed", "Skills installed", {
|
|
297
|
+
ide,
|
|
298
|
+
count: names.length,
|
|
299
|
+
names,
|
|
300
|
+
});
|
|
301
|
+
},
|
|
302
|
+
/** MCP config written */
|
|
303
|
+
mcpConfigured(ide, path) {
|
|
304
|
+
write(` ${SYM.done} MCP server registered ${muted("→")} ${dim(path)}`);
|
|
305
|
+
write(` ${muted(`${ide} will auto-connect to unerr intelligence`)}`);
|
|
306
|
+
writeToFile("mcp_configured", "MCP configured", { ide, path });
|
|
307
|
+
},
|
|
308
|
+
/** Background indexing started */
|
|
309
|
+
indexingStarted() {
|
|
310
|
+
write(` ${SYM.step} Deep indexing ${muted("(tree-sitter AST analysis)")}`);
|
|
311
|
+
writeToFile("indexing_started", "Deep indexing started");
|
|
312
|
+
},
|
|
313
|
+
/** Session resume context */
|
|
314
|
+
sessionResumed(prevCalls, prevMinutes) {
|
|
315
|
+
write(` ${SYM.done} Session resumed ${muted("— picking up where you left off")}`);
|
|
316
|
+
write(` ${muted("previous:")} ${cyan(String(prevCalls))} tool calls ${muted("·")} ${cyan(String(prevMinutes))}min`);
|
|
317
|
+
writeToFile("session_resumed", "Session resumed", {
|
|
318
|
+
prevCalls,
|
|
319
|
+
prevMinutes,
|
|
320
|
+
});
|
|
321
|
+
},
|
|
322
|
+
/** Token flow event — real-time savings display in proxy mode */
|
|
323
|
+
tokenFlow(opts) {
|
|
324
|
+
const toolSlug = opts.tool ?? "shell";
|
|
325
|
+
const prefix = opts.pid && opts.pid !== process.pid
|
|
326
|
+
? `${muted(`[exec:${opts.pid}]`)} `
|
|
327
|
+
: "";
|
|
328
|
+
write(` ${SYM.step} ${prefix}Turn ${cyan(String(opts.turn))}: ${bold(toolSlug)} ${muted("—")} ${emerald(opts.tokensSaved.toLocaleString())} tokens saved ${muted(`(${opts.mechanism})`)}${opts.tokensDelivered > 0 ? `, ${cyan(opts.tokensDelivered.toLocaleString())} delivered` : ""}`);
|
|
329
|
+
writeToFile("token_flow", `${toolSlug}: ${opts.tokensSaved} saved (${opts.mechanism})`, {
|
|
330
|
+
turn: opts.turn,
|
|
331
|
+
tool: opts.tool,
|
|
332
|
+
mechanism: opts.mechanism,
|
|
333
|
+
tokens_saved: opts.tokensSaved,
|
|
334
|
+
tokens_delivered: opts.tokensDelivered,
|
|
335
|
+
session_total: opts.sessionTotal,
|
|
336
|
+
pid: opts.pid,
|
|
337
|
+
});
|
|
338
|
+
},
|
|
339
|
+
/** Token flow session total — periodic summary line */
|
|
340
|
+
tokenFlowTotal(saved, delivered, efficiency) {
|
|
341
|
+
write(` ${SYM.bolt} Session: ${emerald(saved.toLocaleString())} saved ${muted("/")} ${cyan(delivered.toLocaleString())} delivered ${muted(`(${efficiency}% efficiency)`)}`);
|
|
342
|
+
writeToFile("token_flow_total", "Session token flow", {
|
|
343
|
+
tokens_saved: saved,
|
|
344
|
+
tokens_delivered: delivered,
|
|
345
|
+
efficiency_pct: efficiency,
|
|
346
|
+
});
|
|
347
|
+
},
|
|
348
|
+
/** Health card — visually rich architecture health display */
|
|
349
|
+
healthCard(health) {
|
|
350
|
+
const gradeColor = health.score >= 90
|
|
351
|
+
? emerald
|
|
352
|
+
: health.score >= 70
|
|
353
|
+
? cyan
|
|
354
|
+
: health.score >= 50
|
|
355
|
+
? amber
|
|
356
|
+
: red;
|
|
357
|
+
const gradeBg = health.score >= 90
|
|
358
|
+
? fgRgb(16, 185, 129) // deeper emerald
|
|
359
|
+
: health.score >= 70
|
|
360
|
+
? fgRgb(6, 182, 212) // deeper cyan
|
|
361
|
+
: health.score >= 50
|
|
362
|
+
? fgRgb(245, 158, 11) // deeper amber
|
|
363
|
+
: fgRgb(239, 68, 68); // deeper red
|
|
364
|
+
// ── Score bar (sub-character precision) ──
|
|
365
|
+
const BAR_WIDTH = 24;
|
|
366
|
+
const BLOCKS = [" ", "▏", "▎", "▍", "▌", "▋", "▊", "▉", "█"];
|
|
367
|
+
const fillWidth = (health.score / 100) * BAR_WIDTH;
|
|
368
|
+
const fullBlocks = Math.floor(fillWidth);
|
|
369
|
+
const partialIdx = Math.round((fillWidth - fullBlocks) * (BLOCKS.length - 1));
|
|
370
|
+
const emptyBlocks = BAR_WIDTH - fullBlocks - (partialIdx > 0 ? 1 : 0);
|
|
371
|
+
const bar = "█".repeat(fullBlocks) +
|
|
372
|
+
(partialIdx > 0 ? (BLOCKS[partialIdx] ?? "") : "") +
|
|
373
|
+
"░".repeat(Math.max(0, emptyBlocks));
|
|
374
|
+
write("");
|
|
375
|
+
write(` ${dim("┌─────────────────────────────────────────────────────┐")}`);
|
|
376
|
+
write(` ${dim("│")} ${violet("◆")} ${bold("Architecture Health")} ${dim("│")}`);
|
|
377
|
+
write(` ${dim("├─────────────────────────────────────────────────────┤")}`);
|
|
378
|
+
write(` ${dim("│")} ${dim("│")}`);
|
|
379
|
+
write(` ${dim("│")} ${gradeColor(`${BOLD}${health.grade}${RESET}`)} ${gradeBg}${bar}${RESET} ${gradeColor(`${health.score}`)}${muted("/100")} ${dim("│")}`);
|
|
380
|
+
write(` ${dim("│")} ${dim("│")}`);
|
|
381
|
+
write(` ${dim("├─────────────────────────────────────────────────────┤")}`);
|
|
382
|
+
// ── Metrics grid ──
|
|
383
|
+
const entityStr = health.totalEntities.toLocaleString();
|
|
384
|
+
const edgeStr = health.totalEdges.toLocaleString();
|
|
385
|
+
const connectivity = health.totalEntities > 0
|
|
386
|
+
? (health.totalEdges / health.totalEntities).toFixed(1)
|
|
387
|
+
: "0";
|
|
388
|
+
write(` ${dim("│")} ${muted("Entities")} ${cyan(entityStr.padEnd(8))} ${muted("Edges")} ${cyan(edgeStr.padEnd(8))} ${dim("│")}`);
|
|
389
|
+
write(` ${dim("│")} ${muted("Connectivity")} ${cyan(connectivity.padEnd(8))} ${muted("Rules")} ${violet(String(health.totalRules).padEnd(8))} ${dim("│")}`);
|
|
390
|
+
// ── Signals ──
|
|
391
|
+
write(` ${dim("├─────────────────────────────────────────────────────┤")}`);
|
|
392
|
+
write(` ${dim("│")} ${muted("Signal")} ${muted("Status")} ${dim("│")}`);
|
|
393
|
+
write(` ${dim("│")} ${dim("─────────────────────────────────────────────")} ${dim("│")}`);
|
|
394
|
+
// Dead functions
|
|
395
|
+
const deadIcon = health.deadFunctionCount === 0
|
|
396
|
+
? SYM.done
|
|
397
|
+
: health.deadFunctionCount > 20
|
|
398
|
+
? SYM.fail
|
|
399
|
+
: SYM.warn;
|
|
400
|
+
const deadColor = health.deadFunctionCount === 0
|
|
401
|
+
? emerald
|
|
402
|
+
: health.deadFunctionCount > 20
|
|
403
|
+
? red
|
|
404
|
+
: amber;
|
|
405
|
+
write(` ${dim("│")} ${deadIcon} ${muted("Dead functions")} ${deadColor(String(health.deadFunctionCount).padEnd(4))} ${dim("│")}`);
|
|
406
|
+
// Circular deps
|
|
407
|
+
const circCount = health.circularDeps?.length ?? 0;
|
|
408
|
+
const circIcon = circCount === 0 ? SYM.done : circCount > 5 ? SYM.fail : SYM.warn;
|
|
409
|
+
const circColor = circCount === 0 ? emerald : circCount > 5 ? red : amber;
|
|
410
|
+
write(` ${dim("│")} ${circIcon} ${muted("Circular dependencies")} ${circColor(String(circCount).padEnd(4))} ${dim("│")}`);
|
|
411
|
+
// Import depth
|
|
412
|
+
const depth = health.maxImportDepth ?? 0;
|
|
413
|
+
const depthIcon = depth <= 7 ? SYM.done : depth > 15 ? SYM.fail : SYM.warn;
|
|
414
|
+
const depthColor = depth <= 7 ? emerald : depth > 15 ? red : amber;
|
|
415
|
+
write(` ${dim("│")} ${depthIcon} ${muted("Max import chain")} ${depthColor(String(depth).padEnd(4))} ${dim("│")}`);
|
|
416
|
+
// Convention adherence
|
|
417
|
+
const adherence = health.conventionAdherence ?? 1;
|
|
418
|
+
const adherencePct = `${Math.round(adherence * 100)}%`;
|
|
419
|
+
const adhIcon = adherence >= 0.9 ? SYM.done : adherence >= 0.7 ? SYM.warn : SYM.fail;
|
|
420
|
+
const adhColor = adherence >= 0.9 ? emerald : adherence >= 0.7 ? amber : red;
|
|
421
|
+
write(` ${dim("│")} ${adhIcon} ${muted("Convention adherence")} ${adhColor(adherencePct.padEnd(4))} ${dim("│")}`);
|
|
422
|
+
// Drift impact
|
|
423
|
+
const drift = health.driftImpactScore ?? 0;
|
|
424
|
+
const driftIcon = drift === 0 ? SYM.done : drift > 10 ? SYM.fail : SYM.warn;
|
|
425
|
+
const driftColor = drift === 0 ? emerald : drift > 10 ? red : amber;
|
|
426
|
+
write(` ${dim("│")} ${driftIcon} ${muted("Drift in critical paths")} ${driftColor(String(drift).padEnd(4))} ${dim("│")}`);
|
|
427
|
+
// Orphan test files
|
|
428
|
+
const orphanCount = health.orphanTestFiles?.length ?? 0;
|
|
429
|
+
const orphanIcon = orphanCount === 0 ? SYM.done : orphanCount > 10 ? SYM.fail : SYM.warn;
|
|
430
|
+
const orphanColor = orphanCount === 0 ? emerald : orphanCount > 10 ? red : amber;
|
|
431
|
+
write(` ${dim("│")} ${orphanIcon} ${muted("Orphan test files")} ${orphanColor(String(orphanCount).padEnd(4))} ${dim("│")}`);
|
|
432
|
+
// ── High-risk entities (chokepoints) ──
|
|
433
|
+
if (health.highRiskEntities.length > 0) {
|
|
434
|
+
write(` ${dim("├─────────────────────────────────────────────────────┤")}`);
|
|
435
|
+
write(` ${dim("│")} ${amber("⚠")} ${bold("Chokepoints")} ${muted("— changes here ripple widely")} ${dim("│")}`);
|
|
436
|
+
for (const entity of health.highRiskEntities) {
|
|
437
|
+
const fanStr = `${entity.fan_in}↓ ${entity.fan_out}↑`;
|
|
438
|
+
const nameDisplay = entity.name.length > 24
|
|
439
|
+
? `${entity.name.slice(0, 22)}..`
|
|
440
|
+
: entity.name;
|
|
441
|
+
write(` ${dim("│")} ${cyan(nameDisplay.padEnd(26))} ${amber(fanStr.padEnd(10))} ${dim("│")}`);
|
|
442
|
+
const fileShort = entity.file_path.length > 40
|
|
443
|
+
? `...${entity.file_path.slice(-37)}`
|
|
444
|
+
: entity.file_path;
|
|
445
|
+
write(` ${dim("│")} ${dim(fileShort.padEnd(43))} ${dim("│")}`);
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
write(` ${dim("└─────────────────────────────────────────────────────┘")}`);
|
|
449
|
+
write("");
|
|
450
|
+
writeToFile("health_card", "Architecture health", {
|
|
451
|
+
grade: health.grade,
|
|
452
|
+
score: health.score,
|
|
453
|
+
totalEntities: health.totalEntities,
|
|
454
|
+
totalEdges: health.totalEdges,
|
|
455
|
+
totalRules: health.totalRules,
|
|
456
|
+
deadFunctionCount: health.deadFunctionCount,
|
|
457
|
+
circularDeps: health.circularDeps?.length ?? 0,
|
|
458
|
+
maxImportDepth: health.maxImportDepth,
|
|
459
|
+
conventionAdherence: health.conventionAdherence,
|
|
460
|
+
driftImpactScore: health.driftImpactScore,
|
|
461
|
+
orphanTestFiles: health.orphanTestFiles?.length ?? 0,
|
|
462
|
+
highRiskCount: health.highRiskEntities.length,
|
|
463
|
+
});
|
|
464
|
+
},
|
|
465
|
+
/** MCP connection card — shows config snippet for manual agent setup */
|
|
466
|
+
mcpConnectionCard(configuredAgents, projectDir) {
|
|
467
|
+
write("");
|
|
468
|
+
write(` ${dim("┌─────────────────────────────────────────────────────┐")}`);
|
|
469
|
+
write(` ${dim("│")} ${violet("⚡")} ${bold("MCP Connection")} ${dim("│")}`);
|
|
470
|
+
write(` ${dim("├─────────────────────────────────────────────────────┤")}`);
|
|
471
|
+
if (configuredAgents.length > 0) {
|
|
472
|
+
write(` ${dim("│")} ${emerald(SYM.done)} ${muted("Auto-configured:")} ${cyan(configuredAgents.join(", "))} ${dim("│")}`);
|
|
473
|
+
}
|
|
474
|
+
write(` ${dim("│")} ${dim("│")}`);
|
|
475
|
+
write(` ${dim("│")} ${muted("For any MCP-compatible agent, add to config:")} ${dim("│")}`);
|
|
476
|
+
write(` ${dim("│")} ${dim("│")}`);
|
|
477
|
+
write(` ${dim("│")} ${dim("{")} ${dim("│")}`);
|
|
478
|
+
write(` ${dim("│")} ${cyan('"mcpServers"')}: ${dim("{")} ${dim("│")}`);
|
|
479
|
+
write(` ${dim("│")} ${cyan('"unerr"')}: ${dim("{")} ${dim("│")}`);
|
|
480
|
+
write(` ${dim("│")} ${cyan('"command"')}: ${emerald('"unerr"')}${dim(",")} ${dim("│")}`);
|
|
481
|
+
write(` ${dim("│")} ${cyan('"args"')}: [${emerald('"--mcp"')}] ${dim("│")}`);
|
|
482
|
+
write(` ${dim("│")} ${dim("}")} ${dim("│")}`);
|
|
483
|
+
write(` ${dim("│")} ${dim("}")} ${dim("│")}`);
|
|
484
|
+
write(` ${dim("│")} ${dim("}")} ${dim("│")}`);
|
|
485
|
+
write(` ${dim("│")} ${dim("│")}`);
|
|
486
|
+
write(` ${dim("│")} ${muted("Add more:")} ${dim("unerr install <agent>")} ${dim("│")}`);
|
|
487
|
+
write(` ${dim("└─────────────────────────────────────────────────────┘")}`);
|
|
488
|
+
write("");
|
|
489
|
+
writeToFile("mcp_connection_card", "MCP connection info", {
|
|
490
|
+
configuredAgents,
|
|
491
|
+
projectDir,
|
|
492
|
+
});
|
|
493
|
+
},
|
|
494
|
+
/** Layer 7 — web dashboard is listening (127.0.0.1, same process as proxy) */
|
|
495
|
+
dashboardReady(url) {
|
|
496
|
+
write(` ${SYM.brain} ${bold("Dashboard")} ${muted("—")} ${cyan(url)}`);
|
|
497
|
+
write(` ${muted("Tip:")} ${dim("unerr dashboard")} ${muted("opens this in your browser")}`);
|
|
498
|
+
writeToFile("dashboard_ready", "Dashboard ready", { url });
|
|
499
|
+
},
|
|
500
|
+
/**
|
|
501
|
+
* Buffer all subsequent startup-log writes until resume() is called.
|
|
502
|
+
* Used to keep interactive prompts (e.g. SCIP build-tool picker) free of
|
|
503
|
+
* stderr clutter from async events that complete while the prompt is on
|
|
504
|
+
* screen (Dashboard ready, etc.). Buffered lines flush on resume in order.
|
|
505
|
+
*/
|
|
506
|
+
pause: pauseWrites,
|
|
507
|
+
/** Resume writes and flush anything buffered since pause(). */
|
|
508
|
+
resume: resumeWrites,
|
|
509
|
+
// ── Direct color exports for custom formatting ────────────────
|
|
510
|
+
fmt: { violet, cyan, emerald, amber, red, muted, bold, dim, brandBold },
|
|
511
|
+
sym: SYM,
|
|
512
|
+
};
|
package/dist/utils/ui.js
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Branded terminal output utilities.
|
|
3
|
+
*
|
|
4
|
+
* Follows Claude Code-style output patterns:
|
|
5
|
+
* - Section markers: ● (in progress), ✓ (done), ✗ (failed)
|
|
6
|
+
* - 2-space indent for detail lines
|
|
7
|
+
* - Colors: cyan for info, green for success, red for error, dim for metadata
|
|
8
|
+
*/
|
|
9
|
+
import pc from "picocolors";
|
|
10
|
+
export const brand = {
|
|
11
|
+
name: "unerr",
|
|
12
|
+
tagline: "Code intelligence for AI agents",
|
|
13
|
+
};
|
|
14
|
+
export function banner() {
|
|
15
|
+
console.log("");
|
|
16
|
+
console.log(` ${pc.bold(pc.cyan(brand.name))} ${pc.dim(brand.tagline)}`);
|
|
17
|
+
console.log("");
|
|
18
|
+
}
|
|
19
|
+
export function section(label) {
|
|
20
|
+
console.log(` ${pc.cyan("●")} ${label}`);
|
|
21
|
+
}
|
|
22
|
+
export function success(label) {
|
|
23
|
+
console.log(` ${pc.green("✓")} ${label}`);
|
|
24
|
+
}
|
|
25
|
+
export function fail(label) {
|
|
26
|
+
console.log(` ${pc.red("✗")} ${label}`);
|
|
27
|
+
}
|
|
28
|
+
export function info(label) {
|
|
29
|
+
console.log(` ${label}`);
|
|
30
|
+
}
|
|
31
|
+
export function detail(label) {
|
|
32
|
+
console.log(` ${pc.dim(label)}`);
|
|
33
|
+
}
|
|
34
|
+
export function warn(label) {
|
|
35
|
+
console.log(` ${pc.yellow(label)}`);
|
|
36
|
+
}
|
|
37
|
+
export function blank() {
|
|
38
|
+
console.log("");
|
|
39
|
+
}
|
|
40
|
+
export function done(label) {
|
|
41
|
+
console.log("");
|
|
42
|
+
console.log(` ${pc.green("✓")} ${pc.bold(pc.green(label))}`);
|
|
43
|
+
console.log("");
|
|
44
|
+
}
|
|
45
|
+
export function dimLabel(key, value) {
|
|
46
|
+
return `${pc.dim(`${key}:`)} ${value}`;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Format a choices list for display (used alongside prompts).
|
|
50
|
+
*/
|
|
51
|
+
export function formatChoice(label, meta) {
|
|
52
|
+
if (meta)
|
|
53
|
+
return `${label} ${pc.dim(`(${meta})`)}`;
|
|
54
|
+
return label;
|
|
55
|
+
}
|
|
56
|
+
export { pc };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@unerr-ai/unerr",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"description": "Local-first code intelligence CLI for unerr",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -23,7 +23,8 @@
|
|
|
23
23
|
"lint:fix": "biome check --write src/",
|
|
24
24
|
"format": "biome format --write src/",
|
|
25
25
|
"typecheck": "tsc --noEmit",
|
|
26
|
-
"test:local-mode": "vitest run src/__tests__/local-mode-offline.test.ts src/__tests__/network-boundary.test.ts"
|
|
26
|
+
"test:local-mode": "vitest run src/__tests__/local-mode-offline.test.ts src/__tests__/network-boundary.test.ts",
|
|
27
|
+
"postinstall": "node scripts/postinstall.mjs || true"
|
|
27
28
|
},
|
|
28
29
|
"dependencies": {
|
|
29
30
|
"@ai-sdk/anthropic": "^3.0.73",
|
|
@@ -93,7 +94,8 @@
|
|
|
93
94
|
"node": ">=20.9.0"
|
|
94
95
|
},
|
|
95
96
|
"files": [
|
|
96
|
-
"dist"
|
|
97
|
+
"dist",
|
|
98
|
+
"scripts/postinstall.mjs"
|
|
97
99
|
],
|
|
98
100
|
"license": "Elastic-2.0",
|
|
99
101
|
"pnpm": {
|