@automaton-labs/aib 0.0.7 → 0.0.8
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 +36 -257
- package/config/agent-dx-policy.default.json +31 -0
- package/config/control-plane-client.default.json +3 -0
- package/dist/agent-dx/agent-dx.js +805 -0
- package/dist/agent-dx/presentation.js +32 -0
- package/dist/alias-advisor/analyze.js +982 -0
- package/dist/alias-advisor/exact-text-cost.js +74 -0
- package/dist/alias-advisor/lexical.js +240 -0
- package/dist/alias-advisor/model.js +2 -0
- package/dist/alias-advisor/path-identity.js +49 -0
- package/dist/alias-advisor/ranking.js +171 -0
- package/dist/alias-advisor/token-estimator.js +85 -0
- package/dist/bin/aib.js +5 -1
- package/dist/bin/cli.js +811 -4
- package/dist/commands/add-missing-imports-preview-cache.js +99 -2
- package/dist/commands/add-missing-imports.js +241 -2
- package/dist/commands/apply-module-plan.js +1319 -3
- package/dist/commands/background-command.js +378 -2
- package/dist/commands/captured-input.js +74 -1
- package/dist/commands/config-command.js +314 -2
- package/dist/commands/config-output.js +357 -10
- package/dist/commands/control-plane-command.js +183 -1
- package/dist/commands/declaration-command.js +1209 -7
- package/dist/commands/declaration-execution-cache.js +79 -1
- package/dist/commands/declaration-format.js +221 -1
- package/dist/commands/declaration-preview-cache.js +114 -2
- package/dist/commands/diagnostics-command.js +70 -3
- package/dist/commands/doctor.js +137 -3
- package/dist/commands/execution-command.js +117 -1
- package/dist/commands/exports-star-collapse-command.js +178 -0
- package/dist/commands/exports-star-command.js +252 -0
- package/dist/commands/exports-star-preview-cache.js +84 -0
- package/dist/commands/feedback-command.js +176 -3
- package/dist/commands/file-move-to-dir-execution-cache.js +92 -1
- package/dist/commands/file-move-to-dir-preview-cache.js +125 -2
- package/dist/commands/file-move-to-dir-worker.js +54 -0
- package/dist/commands/file-move-to-dir.js +1073 -5
- package/dist/commands/file-mutation-runtime.js +102 -1
- package/dist/commands/file-mutation-worker-apply.js +180 -0
- package/dist/commands/file-refactor-batch-execution-cache.js +90 -1
- package/dist/commands/file-refactor-batch-preview-cache.js +125 -2
- package/dist/commands/file-refactor-batch-worker.js +54 -0
- package/dist/commands/file-refactor-batch.js +1154 -5
- package/dist/commands/file-rename-execution-cache.js +92 -1
- package/dist/commands/file-rename-preview-cache.js +125 -2
- package/dist/commands/file-rename-worker.js +54 -0
- package/dist/commands/file-rename.js +1053 -5
- package/dist/commands/file-text-edit-executor.js +205 -0
- package/dist/commands/find-importers.js +52 -1
- package/dist/commands/find-unused-imports.js +55 -1
- package/dist/commands/generate-docs-command.js +244 -6
- package/dist/commands/help-command.js +460 -7
- package/dist/commands/import-specifier-policy.js +391 -0
- package/dist/commands/imports-command.js +68 -1
- package/dist/commands/imports-rebase.js +1138 -0
- package/dist/commands/init-skill-usage.js +92 -3
- package/dist/commands/init-workspace.js +30 -1
- package/dist/commands/inspect-alias-candidates.js +413 -0
- package/dist/commands/inspect-cycles.js +811 -5
- package/dist/commands/inspect-direct-usages.js +98 -0
- package/dist/commands/inspect-duplicates-format.js +229 -0
- package/dist/commands/inspect-format-primitives.js +127 -0
- package/dist/commands/inspect-format.js +1590 -18
- package/dist/commands/inspect-graph.js +1553 -9
- package/dist/commands/inspect-imports.js +339 -2
- package/dist/commands/inspect-mixed-format.js +524 -0
- package/dist/commands/inspect-module-plan-format.js +216 -0
- package/dist/commands/inspect-module-plan-serialization.js +402 -0
- package/dist/commands/inspect-reference-path-format.js +157 -0
- package/dist/commands/inspect-request-values.js +599 -0
- package/dist/commands/inspect-selector-kind.js +21 -0
- package/dist/commands/inspect-selector.js +50 -0
- package/dist/commands/inspect-symbol-format.js +90 -0
- package/dist/commands/inspect-topology.js +435 -0
- package/dist/commands/inspect-tree.js +827 -5
- package/dist/commands/inspect-usages-detail.js +793 -0
- package/dist/commands/inspect-usages-evidence.js +31 -0
- package/dist/commands/inspect-usages-format.js +367 -0
- package/dist/commands/inspect.js +1450 -16
- package/dist/commands/internal-command.js +64 -0
- package/dist/commands/json-file-input.js +60 -1
- package/dist/commands/module-plan-cache.js +156 -2
- package/dist/commands/module-plan-standalone.js +208 -0
- package/dist/commands/module-plan-timeout.js +77 -1
- package/dist/commands/move-preview-cache.js +101 -2
- package/dist/commands/mutate-aggregate-output.js +996 -0
- package/dist/commands/mutate-child-execution.js +374 -0
- package/dist/commands/mutate-command.js +1394 -0
- package/dist/commands/mutate-declaration-output.js +313 -0
- package/dist/commands/mutate-domain-adapters.js +638 -0
- package/dist/commands/mutate-execution-cache.js +114 -0
- package/dist/commands/mutate-execution-status.js +598 -0
- package/dist/commands/mutate-failure-output.js +531 -0
- package/dist/commands/mutate-file-view.js +151 -0
- package/dist/commands/mutate-object-output.js +91 -0
- package/dist/commands/mutate-output-values.js +97 -0
- package/dist/commands/mutate-preview-cache.js +86 -0
- package/dist/commands/mutate-response-replay.js +153 -0
- package/dist/commands/mutate-result-projection.js +818 -0
- package/dist/commands/mutation-eta.js +28 -0
- package/dist/commands/mutation-execution-cache.js +140 -3
- package/dist/commands/mutation-recovery-journal.js +195 -0
- package/dist/commands/normalize-imports.js +1120 -4
- package/dist/commands/object-pack-command.js +546 -0
- package/dist/commands/object-pack-preview-cache.js +88 -0
- package/dist/commands/observability-command.js +47 -3
- package/dist/commands/ota-command.js +403 -2
- package/dist/commands/print-config.js +10 -1
- package/dist/commands/quick-read.js +1113 -11
- package/dist/commands/refactor-batch-builder.js +265 -1
- package/dist/commands/refactor-batch-execution-cache.js +85 -1
- package/dist/commands/refactor-batch-preview-cache.js +96 -2
- package/dist/commands/refactor-batch.js +461 -4
- package/dist/commands/rename-entities.js +794 -4
- package/dist/commands/rename-execution-cache.js +49 -1
- package/dist/commands/rename-input.js +22 -1
- package/dist/commands/rename-polling-policy.js +68 -0
- package/dist/commands/rename-preview-cache.js +96 -2
- package/dist/commands/result-view.js +993 -7
- package/dist/commands/reveal-command.js +445 -5
- package/dist/commands/selector-suggestions.js +93 -0
- package/dist/commands/session-workspace.js +1836 -31
- package/dist/commands/shared.js +2 -1
- package/dist/commands/skills-command.js +315 -0
- package/dist/commands/sync-command.js +59 -2
- package/dist/commands/worker-command.js +173 -1
- package/dist/commands/workspace-cache.js +55 -1
- package/dist/config/defaults.js +26 -1
- package/dist/config/env-vars.js +77 -1
- package/dist/config/glob-match.js +44 -1
- package/dist/config/import-rules.js +165 -1
- package/dist/config/local-config.js +293 -3
- package/dist/config/mutation-comments.js +51 -1
- package/dist/config/path-aliases.js +165 -1
- package/dist/config/path-display.js +84 -1
- package/dist/config/product-storage.js +37 -1
- package/dist/config/request-env.js +21 -0
- package/dist/config/request-routing-context.js +23 -0
- package/dist/config/resolve-command-alias.js +74 -1
- package/dist/config/resolve.js +24 -1
- package/dist/config/tsconfig-discovery.js +113 -1
- package/dist/config/typescript-preferences.js +131 -0
- package/dist/config/workspace-root.js +310 -3
- package/dist/config/workspace-state.js +254 -1
- package/dist/content/content-bundle.js +88 -1
- package/dist/diagnostics/module-plan-timeline.js +75 -2
- package/dist/diagnostics/readiness-text.js +45 -8
- package/dist/dsl/aib-dsl.js +838 -1
- package/dist/dsl/declaration-dsl.js +264 -1
- package/dist/dsl/file-move-to-dir-dsl.js +123 -1
- package/dist/dsl/file-refactor-batch-dsl.js +203 -1
- package/dist/dsl/file-rename-dsl.js +135 -1
- package/dist/dsl/mutate-dsl.js +746 -0
- package/dist/help/bootstrap.bash.md +176 -341
- package/dist/help/bootstrap.md +175 -340
- package/dist/help/bootstrap.pwsh.md +176 -341
- package/dist/help/docs/basics.md +1 -1
- package/dist/help/docs/config-setup.import-normalize.md +65 -65
- package/dist/help/docs/config-setup.import-rules.md +6 -5
- package/dist/help/docs/first-setup.md +6 -5
- package/dist/help/docs/help-protocol.md +4 -3
- package/dist/help/docs/import.base.md +38 -0
- package/dist/help/docs/import.rebase.md +85 -0
- package/dist/help/docs/inspect.aliasCandidates.md +39 -0
- package/dist/help/docs/inspect.code.md +1 -7
- package/dist/help/docs/inspect.file.md +10 -19
- package/dist/help/docs/inspect.graph.md +3 -17
- package/dist/help/{dsl/docs/inspect.md → docs/inspect.shared.md} +13 -12
- package/dist/help/docs/modulePlan.md +24 -28
- package/dist/help/docs/move.md +19 -22
- package/dist/help/{dsl/topics/file.move.md → docs/moveToDir.md} +36 -34
- package/dist/help/docs/mutate.mixed.md +34 -0
- package/dist/help/docs/mutation.shared.md +55 -0
- package/dist/help/docs/patterns.md +3 -12
- package/dist/help/docs/qr.md +12 -6
- package/dist/help/docs/quick-map.md +36 -24
- package/dist/help/docs/recipe.file-layout.md +10 -10
- package/dist/help/docs/recipe.import-boundary.md +92 -0
- package/dist/help/docs/recipe.safe-artifact-probing.md +68 -0
- package/dist/help/docs/recipe.unfamiliar-area.md +64 -0
- package/dist/help/docs/recipes.md +20 -0
- package/dist/help/docs/rename.md +19 -27
- package/dist/help/docs/renameFile.md +36 -0
- package/dist/help/docs/rules.md +26 -0
- package/dist/help/dsl/bootstrap.bash.md +176 -341
- package/dist/help/dsl/bootstrap.md +175 -340
- package/dist/help/dsl/bootstrap.pwsh.md +176 -341
- package/dist/help/dsl/docs/basics.md +1 -1
- package/dist/help/dsl/docs/config-setup.import-normalize.md +65 -65
- package/dist/help/dsl/docs/config-setup.import-rules.md +6 -5
- package/dist/help/dsl/docs/first-setup.md +6 -5
- package/dist/help/dsl/docs/help-protocol.md +4 -3
- package/dist/help/dsl/docs/import.base.md +38 -0
- package/dist/help/dsl/docs/import.rebase.md +85 -0
- package/dist/help/dsl/docs/inspect.aliasCandidates.md +39 -0
- package/dist/help/dsl/docs/inspect.code.md +1 -7
- package/dist/help/dsl/docs/inspect.file.md +10 -19
- package/dist/help/dsl/docs/inspect.graph.md +3 -17
- package/dist/help/{docs/inspect.md → dsl/docs/inspect.shared.md} +13 -12
- package/dist/help/dsl/docs/modulePlan.md +24 -28
- package/dist/help/dsl/docs/move.md +19 -22
- package/dist/help/{topics/file.move.md → dsl/docs/moveToDir.md} +36 -34
- package/dist/help/dsl/docs/mutate.mixed.md +34 -0
- package/dist/help/dsl/docs/mutation.shared.md +55 -0
- package/dist/help/dsl/docs/patterns.md +3 -12
- package/dist/help/dsl/docs/qr.md +12 -6
- package/dist/help/dsl/docs/quick-map.md +36 -24
- package/dist/help/dsl/docs/recipe.file-layout.md +10 -10
- package/dist/help/dsl/docs/recipe.import-boundary.md +92 -0
- package/dist/help/dsl/docs/recipe.safe-artifact-probing.md +68 -0
- package/dist/help/dsl/docs/recipe.unfamiliar-area.md +64 -0
- package/dist/help/dsl/docs/recipes.md +20 -0
- package/dist/help/dsl/docs/rename.md +19 -27
- package/dist/help/dsl/docs/renameFile.md +36 -0
- package/dist/help/dsl/docs/rules.md +26 -0
- package/dist/help/dsl/full.md +175 -340
- package/dist/help/dsl/help-index.md +48 -43
- package/dist/help/dsl/snippets/agents.md +2 -2
- package/dist/help/dsl/tokens/qr.inline.examples.md +1 -1
- package/dist/help/dsl/topics/basics.md +1 -1
- package/dist/help/dsl/topics/config-setup.import-normalize.md +65 -65
- package/dist/help/dsl/topics/config-setup.import-rules.md +6 -5
- package/dist/help/dsl/topics/first-setup.md +6 -5
- package/dist/help/dsl/topics/help-protocol.md +4 -3
- package/dist/help/dsl/topics/import.base.md +36 -0
- package/dist/help/dsl/topics/import.rebase.md +83 -0
- package/dist/help/dsl/topics/inspect.aliasCandidates.md +37 -0
- package/dist/help/dsl/topics/inspect.code.md +1 -7
- package/dist/help/dsl/topics/inspect.file.md +10 -19
- package/dist/help/dsl/topics/inspect.graph.md +3 -17
- package/dist/help/dsl/topics/{inspect.md → inspect.shared.md} +13 -12
- package/dist/help/dsl/topics/modulePlan.md +21 -26
- package/dist/help/dsl/topics/move.md +17 -18
- package/dist/help/{docs/file.move.md → dsl/topics/moveToDir.md} +33 -35
- package/dist/help/dsl/topics/mutate.mixed.md +32 -0
- package/dist/help/dsl/topics/mutation.shared.md +53 -0
- package/dist/help/dsl/topics/patterns.md +3 -12
- package/dist/help/dsl/topics/qr.md +12 -6
- package/dist/help/dsl/topics/quick-map.md +36 -24
- package/dist/help/dsl/topics/recipe.file-layout.md +10 -10
- package/dist/help/dsl/topics/recipe.import-boundary.md +90 -0
- package/dist/help/dsl/topics/recipe.safe-artifact-probing.md +66 -0
- package/dist/help/dsl/topics/recipe.unfamiliar-area.md +62 -0
- package/dist/help/dsl/topics/recipes.md +18 -0
- package/dist/help/dsl/topics/rename.md +15 -15
- package/dist/help/dsl/topics/renameFile.md +34 -0
- package/dist/help/dsl/topics/rules.md +24 -0
- package/dist/help/full.md +175 -340
- package/dist/help/help-index.md +48 -43
- package/dist/help/help-meta.json +98 -48
- package/dist/help/index.md +52 -20
- package/dist/help/snippets/agents.md +2 -2
- package/dist/help/tokens/qr.inline.examples.md +1 -1
- package/dist/help/topics/basics.md +1 -1
- package/dist/help/topics/config-setup.import-normalize.md +65 -65
- package/dist/help/topics/config-setup.import-rules.md +6 -5
- package/dist/help/topics/first-setup.md +6 -5
- package/dist/help/topics/help-protocol.md +4 -3
- package/dist/help/topics/import.base.md +36 -0
- package/dist/help/topics/import.rebase.md +83 -0
- package/dist/help/topics/inspect.aliasCandidates.md +37 -0
- package/dist/help/topics/inspect.code.md +1 -7
- package/dist/help/topics/inspect.file.md +10 -19
- package/dist/help/topics/inspect.graph.md +3 -17
- package/dist/help/topics/{inspect.md → inspect.shared.md} +13 -12
- package/dist/help/topics/modulePlan.md +21 -26
- package/dist/help/topics/move.md +17 -18
- package/dist/help/{dsl/docs/file.move.md → topics/moveToDir.md} +33 -35
- package/dist/help/topics/mutate.mixed.md +32 -0
- package/dist/help/topics/mutation.shared.md +53 -0
- package/dist/help/topics/patterns.md +3 -12
- package/dist/help/topics/qr.md +12 -6
- package/dist/help/topics/quick-map.md +36 -24
- package/dist/help/topics/recipe.file-layout.md +10 -10
- package/dist/help/topics/recipe.import-boundary.md +90 -0
- package/dist/help/topics/recipe.safe-artifact-probing.md +66 -0
- package/dist/help/topics/recipe.unfamiliar-area.md +62 -0
- package/dist/help/topics/recipes.md +18 -0
- package/dist/help/topics/rename.md +15 -15
- package/dist/help/topics/renameFile.md +34 -0
- package/dist/help/topics/rules.md +24 -0
- package/dist/host/capabilities.js +56 -1
- package/dist/imports/standalone-import-analysis.js +602 -0
- package/dist/imports/standalone-import-model.js +2 -0
- package/dist/imports/standalone-import-process.js +66 -0
- package/dist/imports/standalone-import-worker.js +27 -0
- package/dist/imports/standalone-ts-project.js +147 -0
- package/dist/inspect/inspect-duplicates-service.js +526 -0
- package/dist/inspect/inspect-reverse-module-closure.js +338 -0
- package/dist/inspect/inspect-source-ranges.js +82 -0
- package/dist/inspect/inspect-source-shape.js +649 -0
- package/dist/inspect/standalone-inspect-analysis.js +319 -0
- package/dist/inspect/standalone-inspect-model.js +9 -0
- package/dist/inspect/standalone-inspect-process.js +55 -0
- package/dist/inspect/standalone-inspect-usages.js +274 -0
- package/dist/inspect/standalone-inspect-worker.js +13 -0
- package/dist/metrics/central-metrics.js +101 -2
- package/dist/mutation/concrete-edit-plan.js +157 -0
- package/dist/mutation/exports-star-collapse-preview.js +361 -0
- package/dist/mutation/exports-star-expand-apply.js +373 -0
- package/dist/mutation/exports-star-expand-preview.js +807 -0
- package/dist/mutation/file-impact-scan.js +182 -0
- package/dist/mutation/file-mutation-discovery.js +674 -0
- package/dist/mutation/file-mutation-eta.js +99 -0
- package/dist/mutation/file-mutation-standalone-apply.js +584 -0
- package/dist/mutation/file-mutation-standalone-planner.js +500 -0
- package/dist/mutation/file-mutation-tsserver-session.js +473 -0
- package/dist/mutation/mutation-estimate.js +45 -0
- package/dist/mutation/mutation-plan.js +467 -0
- package/dist/mutation/object-mutation-foundation.js +2 -0
- package/dist/mutation/object-mutation-partition.js +148 -0
- package/dist/mutation/object-pack-semantic-apply.js +507 -0
- package/dist/mutation/object-pack-semantic-preview.js +984 -0
- package/dist/mutation/object-unpack-semantic-preview.js +993 -0
- package/dist/mutation/package-manifest-impact.js +176 -0
- package/dist/mutation/rename-owner-worker-child.js +37 -0
- package/dist/mutation/rename-owner-worker.js +122 -0
- package/dist/mutation/runtime-cycle-query.js +66 -0
- package/dist/mutation/semantic-execution-progress.js +63 -0
- package/dist/mutation/semantic-export-index.js +474 -0
- package/dist/mutation/semantic-impact-scan.js +434 -0
- package/dist/mutation/semantic-model.js +2 -0
- package/dist/mutation/semantic-move-best-effort-planner.js +209 -0
- package/dist/mutation/semantic-move-config-worker-child.js +61 -0
- package/dist/mutation/semantic-move-config-worker.js +449 -0
- package/dist/mutation/semantic-move-declarations.js +94 -0
- package/dist/mutation/semantic-move-metrics.js +119 -0
- package/dist/mutation/semantic-move-model.js +2 -0
- package/dist/mutation/semantic-move-owner-authority.js +122 -0
- package/dist/mutation/semantic-move-owner-candidates.js +300 -0
- package/dist/mutation/semantic-move-owner-divergence-harness.js +474 -0
- package/dist/mutation/semantic-move-owner-divergence-runner.js +162 -0
- package/dist/mutation/semantic-move-plan-hash.js +56 -0
- package/dist/mutation/semantic-move-policy.js +360 -0
- package/dist/mutation/semantic-move-process.js +218 -0
- package/dist/mutation/semantic-move-provider-diagnostics.js +27 -0
- package/dist/mutation/semantic-move-standalone-engine.js +919 -0
- package/dist/mutation/semantic-move-standalone-planner.js +1553 -0
- package/dist/mutation/semantic-move-transaction.js +639 -0
- package/dist/mutation/semantic-mutation-engine.js +478 -0
- package/dist/mutation/semantic-mutation-runtime.js +521 -0
- package/dist/mutation/semantic-planner-retry.js +26 -0
- package/dist/mutation/semantic-program-roots.js +69 -0
- package/dist/mutation/semantic-rename-commonjs.js +229 -0
- package/dist/mutation/semantic-rename-config-worker-child.js +46 -0
- package/dist/mutation/semantic-rename-config-worker.js +498 -0
- package/dist/mutation/semantic-rename-locations.js +192 -0
- package/dist/mutation/semantic-rename-model.js +2 -0
- package/dist/mutation/semantic-rename-process.js +210 -0
- package/dist/mutation/semantic-rename-standalone-engine.js +302 -0
- package/dist/mutation/semantic-rename-standalone-planner.js +567 -0
- package/dist/mutation/semantic-rename-transaction.js +333 -0
- package/dist/mutation/semantic-unused-import-cleanup.js +248 -0
- package/dist/mutation/semantic-worker-retry.js +40 -0
- package/dist/mutation/semantic-workspace.js +804 -0
- package/dist/mutation/targeted-import-canonicalizer.js +359 -0
- package/dist/observability/config.js +206 -1
- package/dist/observability/context.js +59 -1
- package/dist/observability/failure-snapshot.js +124 -2
- package/dist/observability/recent.js +63 -2
- package/dist/payloads/read-stdin-json.js +212 -1
- package/dist/rg-wrapper/core.js +714 -6
- package/dist/rg-wrapper/options.js +125 -1
- package/dist/rtk-wrapper/core.js +144 -2
- package/dist/rtk-wrapper/git-safety.js +203 -0
- package/dist/rtk-wrapper/output-adapter.js +106 -0
- package/dist/runtime/buffered-process.js +114 -0
- package/dist/runtime/bundled-node.js +97 -1
- package/dist/runtime/command-lifecycle.js +2 -0
- package/dist/runtime/input-source.js +238 -1
- package/dist/runtime/node-cli-identity.js +37 -0
- package/dist/runtime/run-command.js +191 -1
- package/dist/selectors/parse-entities.js +84 -1
- package/dist/semantic/semantic-context-pool.js +830 -0
- package/dist/semantic/semantic-context-provider.js +416 -0
- package/dist/semantic/semantic-resident-admission.js +38 -0
- package/dist/semantic/semantic-worker-child.js +40 -0
- package/dist/semantic/semantic-worker-manager.js +460 -0
- package/dist/semantic/semantic-worker-protocol.js +2 -0
- package/dist/semantic/semantic-worker-runtime.js +38 -0
- package/dist/semantic/workspace-semantic-context-pools.js +136 -0
- package/dist/session/client.js +359 -1
- package/dist/session/daemon-state.js +185 -2
- package/dist/session/external-tool-coordinator.js +88 -0
- package/dist/session/external-tool-request.js +52 -0
- package/dist/session/lane-owner.js +116 -0
- package/dist/session/paths.js +71 -1
- package/dist/session/runtime-lifecycle.js +225 -0
- package/dist/session/runtime-shutdown.js +95 -0
- package/dist/session/server.js +1194 -7
- package/dist/session/session-health.js +27 -0
- package/dist/shared/agent-text.js +29 -1
- package/dist/shared/errors.js +496 -30
- package/dist/shared/event-loop.js +6 -1
- package/dist/shared/hints.js +37 -1
- package/dist/shared/metrics.js +43 -1
- package/dist/shared/presentation.js +69 -4
- package/dist/shared/stdin-examples.js +77 -1
- package/dist/shared/stdout.js +6 -2
- package/dist/shared/types.js +23 -1
- package/dist/tool-runtime/runtime-tools.js +120 -1
- package/dist/topology/availability.js +663 -0
- package/dist/topology/cache.js +130 -0
- package/dist/topology/candidates.js +372 -0
- package/dist/topology/core.js +903 -0
- package/dist/topology/dependency-snapshot.js +189 -0
- package/dist/topology/model.js +2 -0
- package/dist/topology/scope.js +100 -0
- package/dist/topology/ts-oracle-batch.js +529 -0
- package/dist/topology/ts-oracle-host.js +69 -0
- package/dist/topology/ts-oracle-model.js +2 -0
- package/dist/topology/ts-oracle.js +224 -0
- package/dist/topology/tsconfig-loader.js +105 -0
- package/dist/topology/workspace-project-index.js +542 -0
- package/dist/tracing/config.js +192 -2
- package/dist/tracing/failure-summary.js +100 -0
- package/dist/tracing/trace.js +318 -5
- package/dist/tsc-wrapper/core.js +697 -0
- package/dist/workers/control-plane/aib-control-plane-worker.cjs +32 -32
- package/dist/workers/control-plane/client-config.default.json +3 -3
- package/dist/workers/lexical-worker-child.js +27 -0
- package/dist/workers/lexical-worker-manager.js +394 -0
- package/dist/workers/lexical-worker-protocol.js +2 -0
- package/dist/workers/lexical-worker-runtime.js +25 -0
- package/dist/workers/owned-one-shot-process.js +115 -0
- package/dist/workers/product-storage.js +23 -1
- package/dist/workers/registry.js +241 -1
- package/package.json +8 -13
- package/scripts/postinstall.cjs +29 -29
- package/scripts/provision-runtime.cjs +411 -459
- package/dist/client/http-client.js +0 -1
- package/dist/client/transport-options.js +0 -1
- package/dist/client/websocket-client.js +0 -1
- package/dist/commands/entity-resolution.js +0 -1
- package/dist/commands/file-command.js +0 -1
- package/dist/commands/host-command.js +0 -1
- package/dist/commands/inspect-symbol-query.js +0 -1
- package/dist/commands/list-instances.js +0 -1
- package/dist/commands/module-plan-command.js +0 -1
- package/dist/commands/move-command.js +0 -1
- package/dist/commands/move-to-file.js +0 -2
- package/dist/commands/ping.js +0 -1
- package/dist/commands/refactor-command.js +0 -1
- package/dist/commands/rename-command.js +0 -1
- package/dist/commands/runtime-command.js +0 -4
- package/dist/commands/runtime-info.js +0 -1
- package/dist/commands/validate-module-plan.js +0 -2
- package/dist/compatibility/policy.js +0 -1
- package/dist/config/auto-start-ide.js +0 -1
- package/dist/discovery/registry.js +0 -1
- package/dist/discovery/select-instance.js +0 -1
- package/dist/help/docs/file.rename.md +0 -35
- package/dist/help/docs/mutation.md +0 -60
- package/dist/help/docs/refactor.batch.md +0 -44
- package/dist/help/dsl/docs/file.rename.md +0 -35
- package/dist/help/dsl/docs/mutation.md +0 -60
- package/dist/help/dsl/docs/refactor.batch.md +0 -44
- package/dist/help/dsl/topics/file.rename.md +0 -33
- package/dist/help/dsl/topics/mutation.md +0 -58
- package/dist/help/dsl/topics/refactor.batch.md +0 -33
- package/dist/help/topics/file.rename.md +0 -33
- package/dist/help/topics/mutation.md +0 -58
- package/dist/help/topics/refactor.batch.md +0 -33
- package/dist/ide-launch/common.cjs +0 -162
- package/dist/managed-host/extension-vsix-resolver.js +0 -1
- package/dist/managed-host/manage-serve-web-host.cjs +0 -141
- package/dist/managed-host/serve-web-autostart.js +0 -1
- package/dist/managed-host/serve-web-host.cjs +0 -2115
- package/dist/runtime/managed-runtime-provisioning.js +0 -1
- package/dist/shared/diagnostic-catalog.js +0 -1
- package/dist/shared/diagnostics.js +0 -1
- package/dist/shared/operations.js +0 -1
- package/dist/shared/protocol.js +0 -1
- package/dist/shared/routes.js +0 -1
- package/extension/vscode-refactor-bridge-extension.vsix +0 -0
- package/runtimes/launcher/linux-x64/aib +0 -0
- package/runtimes/launcher/win-x64/aib.exe +0 -0
|
@@ -1,11 +1,1113 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.runQuickReadCommand = runQuickReadCommand;
|
|
37
|
+
const fs = __importStar(require("node:fs/promises"));
|
|
38
|
+
const path = __importStar(require("node:path"));
|
|
39
|
+
const path_display_1 = require("../config/path-display");
|
|
40
|
+
const path_aliases_1 = require("../config/path-aliases");
|
|
41
|
+
const workspace_root_1 = require("../config/workspace-root");
|
|
42
|
+
const agent_dx_1 = require("../agent-dx/agent-dx");
|
|
43
|
+
const agent_text_1 = require("../shared/agent-text");
|
|
44
|
+
const errors_1 = require("../shared/errors");
|
|
45
|
+
const session_workspace_1 = require("./session-workspace");
|
|
46
|
+
const DEFAULT_HEAD_LINES = 80;
|
|
47
|
+
const QR_OUTPUT_CAP_KB_CONFIG_KEY = "qr.outputCapKb";
|
|
48
|
+
const QR_OUTPUT_CAP_KB_ENV = "AIB_QR_OUTPUT_CAP_KB";
|
|
49
|
+
const GLOBAL_OUTPUT_CAP_ENV = "AIB_OUTPUT_CAP";
|
|
50
|
+
const DEFAULT_QR_OUTPUT_CAP_KB = 32;
|
|
51
|
+
const MAX_QR_CAP_LINE_SAMPLES = 8;
|
|
52
|
+
async function runQuickReadCommand(cwd, restArgs, options = {}) {
|
|
53
|
+
const aliases = (0, session_workspace_1.readEffectiveSessionPathAliases)(cwd);
|
|
54
|
+
const displayAliases = (0, path_display_1.buildDisplayPathAliases)(cwd, aliases);
|
|
55
|
+
const parsed = restArgs.includes("--stdin")
|
|
56
|
+
? parseStdinRequests(cwd, aliases, displayAliases, options.rawStdin ?? await readRawStdin())
|
|
57
|
+
: parseInlineRequests(cwd, aliases, displayAliases, restArgs);
|
|
58
|
+
const blocks = [
|
|
59
|
+
...await executeQrRequests(cwd, collapseAllReadRequests(parsed.requests)),
|
|
60
|
+
...parsed.errors
|
|
61
|
+
];
|
|
62
|
+
const hasReadableBlock = blocks.some((block) => block.error === undefined);
|
|
63
|
+
const response = {
|
|
64
|
+
ok: hasReadableBlock,
|
|
65
|
+
blocks: blocks.map((block) => ({
|
|
66
|
+
file: block.file,
|
|
67
|
+
...(block.window !== undefined ? { window: block.window } : {}),
|
|
68
|
+
...(block.content !== undefined ? { content: block.content } : {}),
|
|
69
|
+
...(block.error !== undefined ? { error: block.error } : {}),
|
|
70
|
+
...(block.code !== undefined ? { code: block.code } : {}),
|
|
71
|
+
...(block.details !== undefined ? { details: block.details } : {})
|
|
72
|
+
}))
|
|
73
|
+
};
|
|
74
|
+
const agentDxSignals = [
|
|
75
|
+
...collectQrAgentDxSignals(blocks),
|
|
76
|
+
...(0, agent_dx_1.collectAgentDxObservationSignals)(cwd, buildQrObservation(restArgs, parsed.requests))
|
|
77
|
+
];
|
|
78
|
+
return (0, agent_text_1.attachAgentText)((0, agent_dx_1.applyAgentDxSignals)(cwd, response, agentDxSignals), formatQrBlocks(blocks));
|
|
79
|
+
}
|
|
80
|
+
function collectQrAgentDxSignals(blocks) {
|
|
81
|
+
const flags = uniqueStrings(blocks
|
|
82
|
+
.filter((block) => block.code === "QR_UNKNOWN_ARGUMENT")
|
|
83
|
+
.map((block) => typeof block.details?.argument === "string" ? block.details.argument : null)
|
|
84
|
+
.filter((item) => typeof item === "string" && item.startsWith("-")));
|
|
85
|
+
if (flags.length === 0) {
|
|
86
|
+
return [];
|
|
87
|
+
}
|
|
88
|
+
return [{
|
|
89
|
+
kind: "unknownFlag",
|
|
90
|
+
command: "qr",
|
|
91
|
+
flags,
|
|
92
|
+
helpRefs: [{ topic: "qr", reason: "unknownFlag", priority: 1, mode: "command" }],
|
|
93
|
+
suggestions: [{ command: "aib help qr", priority: 1 }]
|
|
94
|
+
}];
|
|
95
|
+
}
|
|
96
|
+
function buildQrObservation(restArgs, requests) {
|
|
97
|
+
const inline = !restArgs.includes("--stdin");
|
|
98
|
+
return {
|
|
99
|
+
command: "qr",
|
|
100
|
+
family: "read",
|
|
101
|
+
surface: inline ? "inline" : "stdin-raw",
|
|
102
|
+
targets: requests.map(formatQrRequestForBatchSuggestion),
|
|
103
|
+
batchable: inline && requests.length === 1
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
function formatQrRequestForBatchSuggestion(request) {
|
|
107
|
+
const windowArgs = request.windows
|
|
108
|
+
.map(formatWindow)
|
|
109
|
+
.filter((window) => window !== "h=80");
|
|
110
|
+
return [request.displayFile, ...windowArgs].join(" ");
|
|
111
|
+
}
|
|
112
|
+
function collapseAllReadRequests(requests) {
|
|
113
|
+
const allFiles = new Set(requests.filter((request) => request.windows.some((window) => window.kind === "all")).map((request) => request.resolvedFile));
|
|
114
|
+
if (allFiles.size === 0) {
|
|
115
|
+
return requests;
|
|
116
|
+
}
|
|
117
|
+
const emittedAllFiles = new Set();
|
|
118
|
+
const collapsed = [];
|
|
119
|
+
for (const request of requests) {
|
|
120
|
+
if (!allFiles.has(request.resolvedFile)) {
|
|
121
|
+
collapsed.push(request);
|
|
122
|
+
continue;
|
|
123
|
+
}
|
|
124
|
+
if (emittedAllFiles.has(request.resolvedFile)) {
|
|
125
|
+
continue;
|
|
126
|
+
}
|
|
127
|
+
emittedAllFiles.add(request.resolvedFile);
|
|
128
|
+
collapsed.push({
|
|
129
|
+
...request,
|
|
130
|
+
windows: [{ kind: "all" }]
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
return collapsed;
|
|
134
|
+
}
|
|
135
|
+
async function executeQrRequests(cwd, requests) {
|
|
136
|
+
const outputCapBytes = readQrOutputCapBytes(cwd, process.env);
|
|
137
|
+
const fileCache = new Map();
|
|
138
|
+
for (const request of requests) {
|
|
139
|
+
if (!fileCache.has(request.resolvedFile)) {
|
|
140
|
+
fileCache.set(request.resolvedFile, readTextFileLines(request.resolvedFile));
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
const blocks = [];
|
|
144
|
+
for (const request of requests) {
|
|
145
|
+
const file = await fileCache.get(request.resolvedFile);
|
|
146
|
+
if (file.error !== undefined || file.lines === undefined) {
|
|
147
|
+
blocks.push({ file: request.displayFile, error: file.error ?? "read failed" });
|
|
148
|
+
continue;
|
|
149
|
+
}
|
|
150
|
+
blocks.push(...buildQrReadBlocks(request.displayFile, file.lines, request.windows, outputCapBytes));
|
|
151
|
+
}
|
|
152
|
+
return blocks;
|
|
153
|
+
}
|
|
154
|
+
function buildQrReadBlocks(file, lines, windows, capBytes) {
|
|
155
|
+
if (windows.some((window) => window.kind === "all")) {
|
|
156
|
+
const content = lines.join("\n");
|
|
157
|
+
const capped = buildQrAllCapBlock(file, "all", lines, content, capBytes);
|
|
158
|
+
return [capped ?? { file, window: "all", content }];
|
|
159
|
+
}
|
|
160
|
+
const sourceWindows = resolveQrSourceWindows(lines, windows);
|
|
161
|
+
if (sourceWindows.length === 0) {
|
|
162
|
+
return [{ file, window: "h=0", content: "" }];
|
|
163
|
+
}
|
|
164
|
+
if (!isQrCapEnabled(capBytes)) {
|
|
165
|
+
return renderQrWindows(file, mergeQrWindows(sourceWindows), lines);
|
|
166
|
+
}
|
|
167
|
+
const metrics = buildQrLineMetrics(lines);
|
|
168
|
+
const measured = sourceWindows.map((window) => ({
|
|
169
|
+
...window,
|
|
170
|
+
bytes: qrWindowContentBytes(metrics, window)
|
|
171
|
+
}));
|
|
172
|
+
const hidden = measured.filter((window) => window.bytes > capBytes);
|
|
173
|
+
if (hidden.length === 0) {
|
|
174
|
+
return renderQrWindows(file, mergeQrWindows(measured), lines);
|
|
175
|
+
}
|
|
176
|
+
return [
|
|
177
|
+
buildQrBlockCapBlock(file, metrics, hidden, capBytes),
|
|
178
|
+
...renderQrWindows(file, mergeQrWindows(measured.filter((window) => window.bytes <= capBytes)), lines)
|
|
179
|
+
];
|
|
180
|
+
}
|
|
181
|
+
function renderQrWindows(file, windows, lines) {
|
|
182
|
+
return windows.map((window) => ({
|
|
183
|
+
file,
|
|
184
|
+
window: window.label,
|
|
185
|
+
content: lines.slice(window.start - 1, window.end).join("\n")
|
|
186
|
+
}));
|
|
187
|
+
}
|
|
188
|
+
function buildQrBlockCapBlock(file, metrics, hiddenWindows, capBytes) {
|
|
189
|
+
const mergedHiddenWindows = mergeQrWindows(hiddenWindows);
|
|
190
|
+
const lineSamples = sampleLargestQrLinesInWindows(metrics, hiddenWindows, MAX_QR_CAP_LINE_SAMPLES);
|
|
191
|
+
const hiddenSourceWindowBytes = hiddenWindows.reduce((sum, window) => sum + window.bytes, 0);
|
|
192
|
+
const hiddenUniqueBytes = mergedHiddenWindows.reduce((sum, window) => sum + qrWindowContentBytes(metrics, window), 0);
|
|
193
|
+
return {
|
|
194
|
+
file,
|
|
195
|
+
code: "QR_BLOCK_OUTPUT_CAP_EXCEEDED",
|
|
196
|
+
details: {
|
|
197
|
+
capScope: "block",
|
|
198
|
+
hiddenUniqueBytes,
|
|
199
|
+
hiddenUniqueKb: bytesToKbValue(hiddenUniqueBytes),
|
|
200
|
+
hiddenSourceWindowBytes,
|
|
201
|
+
hiddenSourceWindowKb: bytesToKbValue(hiddenSourceWindowBytes),
|
|
202
|
+
capBytes,
|
|
203
|
+
capKb: bytesToKbValue(capBytes),
|
|
204
|
+
hiddenWindows: hiddenWindows.map((window) => ({
|
|
205
|
+
window: window.label,
|
|
206
|
+
start: window.start,
|
|
207
|
+
end: window.end,
|
|
208
|
+
bytes: window.bytes,
|
|
209
|
+
sizeKb: bytesToKbValue(window.bytes)
|
|
210
|
+
})),
|
|
211
|
+
lineSamples: lineSamples.map((sample) => ({
|
|
212
|
+
line: sample.line,
|
|
213
|
+
bytes: sample.bytes,
|
|
214
|
+
sizeKb: bytesToKbValue(sample.bytes)
|
|
215
|
+
}))
|
|
216
|
+
}
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
function buildQrAllCapBlock(file, window, lines, content, capBytes) {
|
|
220
|
+
if (!isQrCapEnabled(capBytes)) {
|
|
221
|
+
return null;
|
|
222
|
+
}
|
|
223
|
+
const outputBytes = Buffer.byteLength(content, "utf8");
|
|
224
|
+
if (outputBytes <= capBytes) {
|
|
225
|
+
return null;
|
|
226
|
+
}
|
|
227
|
+
const lineSamples = sampleLargestQrLines(lines, MAX_QR_CAP_LINE_SAMPLES);
|
|
228
|
+
return {
|
|
229
|
+
file,
|
|
230
|
+
window,
|
|
231
|
+
code: "QR_ALL_OUTPUT_CAP_EXCEEDED",
|
|
232
|
+
details: {
|
|
233
|
+
capScope: "all",
|
|
234
|
+
capAppliedTo: "all",
|
|
235
|
+
outputBytes,
|
|
236
|
+
outputKb: bytesToKbValue(outputBytes),
|
|
237
|
+
capBytes,
|
|
238
|
+
capKb: bytesToKbValue(capBytes),
|
|
239
|
+
lineCount: lines.length,
|
|
240
|
+
lineSamples: lineSamples.map((sample) => ({
|
|
241
|
+
line: sample.line,
|
|
242
|
+
bytes: sample.bytes,
|
|
243
|
+
sizeKb: bytesToKbValue(sample.bytes)
|
|
244
|
+
}))
|
|
245
|
+
}
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
function isQrCapEnabled(capBytes) {
|
|
249
|
+
return typeof capBytes === "number" && Number.isFinite(capBytes) && capBytes > 0;
|
|
250
|
+
}
|
|
251
|
+
function sampleLargestQrLines(lines, limit) {
|
|
252
|
+
const minSampleBytes = 512;
|
|
253
|
+
return lines
|
|
254
|
+
.map((line, index) => ({ line: index + 1, bytes: Buffer.byteLength(line, "utf8") }))
|
|
255
|
+
.filter((sample) => sample.bytes >= minSampleBytes)
|
|
256
|
+
.sort((left, right) => right.bytes - left.bytes || left.line - right.line)
|
|
257
|
+
.slice(0, limit)
|
|
258
|
+
.sort((left, right) => left.line - right.line);
|
|
259
|
+
}
|
|
260
|
+
function sampleLargestQrLinesInWindows(metrics, windows, limit) {
|
|
261
|
+
const minSampleBytes = 512;
|
|
262
|
+
const samplesByLine = new Map();
|
|
263
|
+
for (const window of windows) {
|
|
264
|
+
const windowSamples = metrics.lineBytes
|
|
265
|
+
.slice(window.start - 1, window.end)
|
|
266
|
+
.map((bytes, index) => ({ line: window.start + index, bytes }))
|
|
267
|
+
.filter((sample) => sample.bytes >= minSampleBytes)
|
|
268
|
+
.sort((left, right) => right.bytes - left.bytes || left.line - right.line)
|
|
269
|
+
.slice(0, 2);
|
|
270
|
+
for (const sample of windowSamples) {
|
|
271
|
+
samplesByLine.set(sample.line, sample);
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
if (samplesByLine.size < limit) {
|
|
275
|
+
for (const sample of sampleLargestQrLinesInRanges(metrics, windows, limit)) {
|
|
276
|
+
samplesByLine.set(sample.line, sample);
|
|
277
|
+
if (samplesByLine.size >= limit) {
|
|
278
|
+
break;
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
return Array.from(samplesByLine.values())
|
|
283
|
+
.sort((left, right) => left.line - right.line)
|
|
284
|
+
.slice(0, limit);
|
|
285
|
+
}
|
|
286
|
+
function sampleLargestQrLinesInRanges(metrics, windows, limit) {
|
|
287
|
+
const seen = new Set();
|
|
288
|
+
const samples = [];
|
|
289
|
+
for (const window of windows) {
|
|
290
|
+
for (let line = window.start; line <= window.end; line += 1) {
|
|
291
|
+
if (seen.has(line)) {
|
|
292
|
+
continue;
|
|
293
|
+
}
|
|
294
|
+
seen.add(line);
|
|
295
|
+
samples.push({ line, bytes: metrics.lineBytes[line - 1] ?? 0 });
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
return samples
|
|
299
|
+
.filter((sample) => sample.bytes >= 512)
|
|
300
|
+
.sort((left, right) => right.bytes - left.bytes || left.line - right.line)
|
|
301
|
+
.slice(0, limit)
|
|
302
|
+
.sort((left, right) => left.line - right.line);
|
|
303
|
+
}
|
|
304
|
+
function readQrOutputCapBytes(cwd, env) {
|
|
305
|
+
if (isOutputCapDisabled(env[GLOBAL_OUTPUT_CAP_ENV])) {
|
|
306
|
+
return null;
|
|
307
|
+
}
|
|
308
|
+
const envValue = readQrOutputCapKbEnvOverride(env[QR_OUTPUT_CAP_KB_ENV]);
|
|
309
|
+
if (envValue !== undefined) {
|
|
310
|
+
return capKbToBytes(envValue);
|
|
311
|
+
}
|
|
312
|
+
const configValue = readWorkspaceQrOutputCapKb(cwd);
|
|
313
|
+
if (configValue !== undefined) {
|
|
314
|
+
return capKbToBytes(configValue);
|
|
315
|
+
}
|
|
316
|
+
return capKbToBytes(DEFAULT_QR_OUTPUT_CAP_KB);
|
|
317
|
+
}
|
|
318
|
+
function readQrOutputCapKbEnvOverride(value) {
|
|
319
|
+
if (value === undefined) {
|
|
320
|
+
return undefined;
|
|
321
|
+
}
|
|
322
|
+
const normalized = value.trim().toLowerCase();
|
|
323
|
+
if (isDisabledOutputCapToken(normalized)) {
|
|
324
|
+
return null;
|
|
325
|
+
}
|
|
326
|
+
const parsed = Number(normalized);
|
|
327
|
+
if (!Number.isFinite(parsed)) {
|
|
328
|
+
return undefined;
|
|
329
|
+
}
|
|
330
|
+
return normalizeOutputCapKb(parsed);
|
|
331
|
+
}
|
|
332
|
+
function readWorkspaceQrOutputCapKb(cwd) {
|
|
333
|
+
const resolved = (0, workspace_root_1.resolveWorkspaceRoot)(cwd);
|
|
334
|
+
if (!resolved || !Object.prototype.hasOwnProperty.call(resolved.config, QR_OUTPUT_CAP_KB_CONFIG_KEY)) {
|
|
335
|
+
return undefined;
|
|
336
|
+
}
|
|
337
|
+
return readOutputCapKbConfigValue(resolved.config[QR_OUTPUT_CAP_KB_CONFIG_KEY]);
|
|
338
|
+
}
|
|
339
|
+
function readOutputCapKbConfigValue(value) {
|
|
340
|
+
if (typeof value === "boolean") {
|
|
341
|
+
return value ? DEFAULT_QR_OUTPUT_CAP_KB : null;
|
|
342
|
+
}
|
|
343
|
+
if (typeof value === "string") {
|
|
344
|
+
const normalized = value.trim().toLowerCase();
|
|
345
|
+
if (isDisabledOutputCapToken(normalized)) {
|
|
346
|
+
return null;
|
|
347
|
+
}
|
|
348
|
+
const parsed = Number(normalized);
|
|
349
|
+
return normalizeOutputCapKb(parsed);
|
|
350
|
+
}
|
|
351
|
+
return typeof value === "number" ? normalizeOutputCapKb(value) : null;
|
|
352
|
+
}
|
|
353
|
+
function isOutputCapDisabled(value) {
|
|
354
|
+
return value !== undefined && isDisabledOutputCapToken(value.trim().toLowerCase());
|
|
355
|
+
}
|
|
356
|
+
function isDisabledOutputCapToken(value) {
|
|
357
|
+
return value === "" || value === "off" || value === "disabled" || value === "false" || value === "0";
|
|
358
|
+
}
|
|
359
|
+
function normalizeOutputCapKb(value) {
|
|
360
|
+
return Number.isFinite(value) && value > 0 ? value : null;
|
|
361
|
+
}
|
|
362
|
+
function capKbToBytes(value) {
|
|
363
|
+
return typeof value === "number" ? Math.round(value * 1024) : null;
|
|
364
|
+
}
|
|
365
|
+
function bytesToKbValue(bytes) {
|
|
366
|
+
return Math.round((bytes / 1024) * 10) / 10;
|
|
367
|
+
}
|
|
368
|
+
function formatKbValue(value) {
|
|
369
|
+
return Number.isInteger(value) ? String(value) : value.toFixed(1);
|
|
370
|
+
}
|
|
371
|
+
async function readTextFileLines(filePath) {
|
|
372
|
+
let stat;
|
|
373
|
+
try {
|
|
374
|
+
stat = await fs.stat(filePath);
|
|
375
|
+
}
|
|
376
|
+
catch (error) {
|
|
377
|
+
const code = typeof error === "object" && error !== null && "code" in error ? String(error.code) : "";
|
|
378
|
+
return { error: code === "ENOENT" ? "file not found" : "cannot stat file" };
|
|
379
|
+
}
|
|
380
|
+
if (stat.isDirectory()) {
|
|
381
|
+
return { error: "is a directory" };
|
|
382
|
+
}
|
|
383
|
+
if (!stat.isFile()) {
|
|
384
|
+
return { error: "not a regular file" };
|
|
385
|
+
}
|
|
386
|
+
let buffer;
|
|
387
|
+
try {
|
|
388
|
+
buffer = await fs.readFile(filePath);
|
|
389
|
+
}
|
|
390
|
+
catch {
|
|
391
|
+
return { error: "cannot read file" };
|
|
392
|
+
}
|
|
393
|
+
if (isProbablyBinary(buffer)) {
|
|
394
|
+
return { error: "binary file" };
|
|
395
|
+
}
|
|
396
|
+
return { lines: splitLines(buffer.toString("utf8")) };
|
|
397
|
+
}
|
|
398
|
+
function isProbablyBinary(buffer) {
|
|
399
|
+
const length = Math.min(buffer.length, 8192);
|
|
400
|
+
for (let index = 0; index < length; index += 1) {
|
|
401
|
+
if (buffer[index] === 0) {
|
|
402
|
+
return true;
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
return false;
|
|
406
|
+
}
|
|
407
|
+
function splitLines(text) {
|
|
408
|
+
const normalized = text.replace(/\r\n/g, "\n").replace(/\r/g, "\n");
|
|
409
|
+
return normalized.endsWith("\n") ? normalized.slice(0, -1).split("\n") : normalized.split("\n");
|
|
410
|
+
}
|
|
411
|
+
function parseStdinRequests(cwd, aliases, displayAliases, raw) {
|
|
412
|
+
const lines = raw.replace(/^\uFEFF/, "").split(/\r?\n/);
|
|
413
|
+
const requests = [];
|
|
414
|
+
const errors = [];
|
|
415
|
+
for (let index = 0; index < lines.length; index += 1) {
|
|
416
|
+
const line = lines[index]?.trim() ?? "";
|
|
417
|
+
if (!line || line.startsWith("#")) {
|
|
418
|
+
continue;
|
|
419
|
+
}
|
|
420
|
+
let tokens;
|
|
421
|
+
try {
|
|
422
|
+
tokens = tokenize(line);
|
|
423
|
+
}
|
|
424
|
+
catch (error) {
|
|
425
|
+
errors.push(errorBlock(`stdin line ${index + 1}`, error));
|
|
426
|
+
continue;
|
|
427
|
+
}
|
|
428
|
+
if (tokens.length === 0) {
|
|
429
|
+
continue;
|
|
430
|
+
}
|
|
431
|
+
const effectiveTokens = tokens[0] === "qr" ? tokens.slice(1) : tokens;
|
|
432
|
+
const parsed = parseInlineRequests(cwd, aliases, displayAliases, effectiveTokens);
|
|
433
|
+
requests.push(...parsed.requests);
|
|
434
|
+
errors.push(...parsed.errors.map((block) => ({
|
|
435
|
+
...block,
|
|
436
|
+
file: `stdin line ${index + 1}: ${block.file}`
|
|
437
|
+
})));
|
|
438
|
+
}
|
|
439
|
+
if (requests.length === 0 && errors.length === 0) {
|
|
440
|
+
throw new errors_1.CliError("QR_STDIN_EMPTY", "qr --stdin expects at least one qr line.");
|
|
441
|
+
}
|
|
442
|
+
return { requests, errors };
|
|
443
|
+
}
|
|
444
|
+
function parseInlineRequests(cwd, aliases, displayAliases, args) {
|
|
445
|
+
const filteredArgs = args.filter((arg) => arg !== "--stdin");
|
|
446
|
+
const effectiveArgs = filteredArgs[0] === "qr" ? filteredArgs.slice(1) : filteredArgs;
|
|
447
|
+
const grouped = groupInlineQrArgs(effectiveArgs);
|
|
448
|
+
if (grouped.length === 0) {
|
|
449
|
+
throw new errors_1.CliError("QR_FILE_REQUIRED", "qr expects a file path.");
|
|
450
|
+
}
|
|
451
|
+
const requests = [];
|
|
452
|
+
const errors = [];
|
|
453
|
+
for (const group of grouped) {
|
|
454
|
+
if ("error" in group) {
|
|
455
|
+
errors.push({ file: group.file, error: group.error, code: group.code });
|
|
456
|
+
continue;
|
|
457
|
+
}
|
|
458
|
+
const parsedWindows = parseWindows(group.windowArgs);
|
|
459
|
+
errors.push(...parsedWindows.errors);
|
|
460
|
+
try {
|
|
461
|
+
requests.push(buildRequest(cwd, aliases, displayAliases, group.file, parsedWindows.windows));
|
|
462
|
+
}
|
|
463
|
+
catch (error) {
|
|
464
|
+
errors.push(errorBlock(group.file, error));
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
return { requests, errors };
|
|
468
|
+
}
|
|
469
|
+
function groupInlineQrArgs(args) {
|
|
470
|
+
const grouped = [];
|
|
471
|
+
for (let index = 0; index < args.length; index += 1) {
|
|
472
|
+
const current = args[index] ?? "";
|
|
473
|
+
if (isWindowArg(current)) {
|
|
474
|
+
if (grouped.length === 0) {
|
|
475
|
+
grouped.push({
|
|
476
|
+
file: current,
|
|
477
|
+
windowArgs: [],
|
|
478
|
+
error: "qr expects a file path before window flags.",
|
|
479
|
+
code: "QR_FILE_REQUIRED"
|
|
480
|
+
});
|
|
481
|
+
if (expectsWindowValue(current)) {
|
|
482
|
+
index += 1;
|
|
483
|
+
}
|
|
484
|
+
continue;
|
|
485
|
+
}
|
|
486
|
+
grouped[grouped.length - 1].windowArgs.push(current);
|
|
487
|
+
if (expectsWindowValue(current)) {
|
|
488
|
+
index += 1;
|
|
489
|
+
grouped[grouped.length - 1].windowArgs.push(args[index] ?? "");
|
|
490
|
+
}
|
|
491
|
+
continue;
|
|
492
|
+
}
|
|
493
|
+
grouped.push({ file: current, windowArgs: [] });
|
|
494
|
+
}
|
|
495
|
+
return grouped;
|
|
496
|
+
}
|
|
497
|
+
function buildRequest(cwd, aliases, displayAliases, file, windows) {
|
|
498
|
+
if (!file || file.startsWith("-") || isWindowToken(file)) {
|
|
499
|
+
throw new errors_1.CliError("QR_FILE_REQUIRED", "qr expects a file path before window flags.");
|
|
500
|
+
}
|
|
501
|
+
const resolvedFile = path.resolve(cwd, (0, path_aliases_1.expandPathAliasValue)(cwd, file, aliases));
|
|
502
|
+
return {
|
|
503
|
+
file,
|
|
504
|
+
resolvedFile,
|
|
505
|
+
displayFile: (0, path_display_1.compactDisplayPath)(cwd, resolvedFile, displayAliases),
|
|
506
|
+
windows
|
|
507
|
+
};
|
|
508
|
+
}
|
|
509
|
+
function parseWindows(args) {
|
|
510
|
+
let all = false;
|
|
511
|
+
let head = null;
|
|
512
|
+
let tail = null;
|
|
513
|
+
let offset = null;
|
|
514
|
+
let limit = null;
|
|
515
|
+
const ranges = [];
|
|
516
|
+
const errors = [];
|
|
517
|
+
for (let index = 0; index < args.length; index += 1) {
|
|
518
|
+
const current = args[index] ?? "";
|
|
519
|
+
const assignment = parseAssignment(current);
|
|
520
|
+
if (assignment) {
|
|
521
|
+
assignWindowValue(assignment.key, assignment.value);
|
|
522
|
+
continue;
|
|
523
|
+
}
|
|
524
|
+
if (current === "-a" || current === "--all" || current === "a" || current === "all" || current === "+all") {
|
|
525
|
+
all = true;
|
|
526
|
+
continue;
|
|
527
|
+
}
|
|
528
|
+
if (current === "-h" || current === "--head") {
|
|
529
|
+
const next = args[index + 1];
|
|
530
|
+
if (!next || next.startsWith("-")) {
|
|
531
|
+
head = DEFAULT_HEAD_LINES;
|
|
532
|
+
errors.push(defaultedWindowError(`Expected a value after ${current}, used ${DEFAULT_HEAD_LINES} by default.`));
|
|
533
|
+
}
|
|
534
|
+
else {
|
|
535
|
+
index += 1;
|
|
536
|
+
head = parsePositiveIntegerOrDefault(next, current, DEFAULT_HEAD_LINES, errors);
|
|
537
|
+
}
|
|
538
|
+
continue;
|
|
539
|
+
}
|
|
540
|
+
if (current === "-t" || current === "--tail") {
|
|
541
|
+
const next = args[index + 1];
|
|
542
|
+
if (!next || next.startsWith("-")) {
|
|
543
|
+
tail = DEFAULT_HEAD_LINES;
|
|
544
|
+
errors.push(defaultedWindowError(`Expected a value after ${current}, used ${DEFAULT_HEAD_LINES} by default.`));
|
|
545
|
+
}
|
|
546
|
+
else {
|
|
547
|
+
index += 1;
|
|
548
|
+
tail = parsePositiveIntegerOrDefault(next, current, DEFAULT_HEAD_LINES, errors);
|
|
549
|
+
}
|
|
550
|
+
continue;
|
|
551
|
+
}
|
|
552
|
+
if (current === "-o" || current === "--offset") {
|
|
553
|
+
offset = readNextPositiveOrDefault(args, ++index, current, 1, errors);
|
|
554
|
+
continue;
|
|
555
|
+
}
|
|
556
|
+
if (current === "-l" || current === "--limit") {
|
|
557
|
+
limit = readNextPositiveOrDefault(args, ++index, current, DEFAULT_HEAD_LINES, errors);
|
|
558
|
+
continue;
|
|
559
|
+
}
|
|
560
|
+
if (current === "-r" || current === "--range" || current === "--ranges") {
|
|
561
|
+
const next = args[index + 1];
|
|
562
|
+
if (!next || next.startsWith("-")) {
|
|
563
|
+
errors.push(defaultedWindowError(`Expected a value after ${current}, ignored range flag.`));
|
|
564
|
+
}
|
|
565
|
+
else {
|
|
566
|
+
index += 1;
|
|
567
|
+
ranges.push(...parseRangeWindows(next, current, errors));
|
|
568
|
+
}
|
|
569
|
+
continue;
|
|
570
|
+
}
|
|
571
|
+
if (current === "-s" || current === "--slice" || current === "--slices") {
|
|
572
|
+
const next = args[index + 1];
|
|
573
|
+
if (!next || next.startsWith("-")) {
|
|
574
|
+
errors.push(defaultedWindowError(`Expected a value after ${current}, ignored slice flag.`));
|
|
575
|
+
}
|
|
576
|
+
else {
|
|
577
|
+
index += 1;
|
|
578
|
+
ranges.push(...parseSliceWindows(next, current, errors));
|
|
579
|
+
}
|
|
580
|
+
continue;
|
|
581
|
+
}
|
|
582
|
+
errors.push({
|
|
583
|
+
file: "",
|
|
584
|
+
error: `Unknown qr argument: ${current}`,
|
|
585
|
+
code: "QR_UNKNOWN_ARGUMENT",
|
|
586
|
+
details: { argument: current }
|
|
587
|
+
});
|
|
588
|
+
}
|
|
589
|
+
if (offset === null && limit !== null) {
|
|
590
|
+
head = limit;
|
|
591
|
+
limit = null;
|
|
592
|
+
}
|
|
593
|
+
if (offset !== null && limit === null) {
|
|
594
|
+
limit = DEFAULT_HEAD_LINES;
|
|
595
|
+
}
|
|
596
|
+
if (all) {
|
|
597
|
+
return { windows: [{ kind: "all" }], errors };
|
|
598
|
+
}
|
|
599
|
+
const windows = [];
|
|
600
|
+
if (head !== null) {
|
|
601
|
+
windows.push({ kind: "head", count: head });
|
|
602
|
+
}
|
|
603
|
+
if (offset !== null && limit !== null) {
|
|
604
|
+
windows.push({ kind: "range", offset, limit });
|
|
605
|
+
}
|
|
606
|
+
windows.push(...ranges);
|
|
607
|
+
if (tail !== null) {
|
|
608
|
+
windows.push({ kind: "tail", count: tail });
|
|
609
|
+
}
|
|
610
|
+
return { windows: windows.length > 0 ? windows : [{ kind: "head", count: DEFAULT_HEAD_LINES }], errors };
|
|
611
|
+
function assignWindowValue(key, value) {
|
|
612
|
+
if (key === "a" || key === "all") {
|
|
613
|
+
const parsed = parseBooleanFlagOrNull(value);
|
|
614
|
+
if (parsed === null) {
|
|
615
|
+
errors.push(defaultedWindowError(`${key} expects true or false, ignored.`));
|
|
616
|
+
}
|
|
617
|
+
else {
|
|
618
|
+
all = parsed;
|
|
619
|
+
}
|
|
620
|
+
return;
|
|
621
|
+
}
|
|
622
|
+
if (key === "r" || key === "range" || key === "ranges") {
|
|
623
|
+
ranges.push(...parseRangeWindows(value, key, errors));
|
|
624
|
+
return;
|
|
625
|
+
}
|
|
626
|
+
if (key === "s" || key === "slice" || key === "slices") {
|
|
627
|
+
ranges.push(...parseSliceWindows(value, key, errors));
|
|
628
|
+
return;
|
|
629
|
+
}
|
|
630
|
+
if (key === "h" || key === "head") {
|
|
631
|
+
head = parsePositiveIntegerOrDefault(value, key, DEFAULT_HEAD_LINES, errors);
|
|
632
|
+
return;
|
|
633
|
+
}
|
|
634
|
+
if (key === "t" || key === "tail") {
|
|
635
|
+
tail = parsePositiveIntegerOrDefault(value, key, DEFAULT_HEAD_LINES, errors);
|
|
636
|
+
return;
|
|
637
|
+
}
|
|
638
|
+
if (key === "o" || key === "offset") {
|
|
639
|
+
offset = parsePositiveIntegerOrDefault(value, key, 1, errors);
|
|
640
|
+
return;
|
|
641
|
+
}
|
|
642
|
+
if (key === "l" || key === "limit") {
|
|
643
|
+
limit = parsePositiveIntegerOrDefault(value, key, DEFAULT_HEAD_LINES, errors);
|
|
644
|
+
return;
|
|
645
|
+
}
|
|
646
|
+
errors.push({
|
|
647
|
+
file: "",
|
|
648
|
+
error: `Unknown qr window field: ${key}`,
|
|
649
|
+
code: "QR_UNKNOWN_ARGUMENT",
|
|
650
|
+
details: { argument: key }
|
|
651
|
+
});
|
|
652
|
+
}
|
|
653
|
+
}
|
|
654
|
+
function resolveQrSourceWindows(lines, windows) {
|
|
655
|
+
if (windows.some((window) => window.kind === "all")) {
|
|
656
|
+
return [{ label: "all", start: 1, end: lines.length }];
|
|
657
|
+
}
|
|
658
|
+
return windows
|
|
659
|
+
.map((window) => toLineRange(lines.length, window))
|
|
660
|
+
.filter((range) => range.end >= range.start)
|
|
661
|
+
.sort((left, right) => left.start - right.start || left.end - right.end);
|
|
662
|
+
}
|
|
663
|
+
function mergeQrWindows(windows) {
|
|
664
|
+
const ranges = windows
|
|
665
|
+
.slice()
|
|
666
|
+
.sort((left, right) => left.start - right.start || left.end - right.end);
|
|
667
|
+
const merged = [];
|
|
668
|
+
for (const range of ranges) {
|
|
669
|
+
const previous = merged[merged.length - 1];
|
|
670
|
+
if (previous && range.start <= previous.end + 1) {
|
|
671
|
+
previous.end = Math.max(previous.end, range.end);
|
|
672
|
+
previous.labels.push(range.label);
|
|
673
|
+
continue;
|
|
674
|
+
}
|
|
675
|
+
merged.push({ ...range, labels: [range.label] });
|
|
676
|
+
}
|
|
677
|
+
return merged.map((range) => ({
|
|
678
|
+
label: range.labels.length === 1 ? range.labels[0] : formatMergedWindowLabel(range.start, range.end, range.labels),
|
|
679
|
+
start: range.start,
|
|
680
|
+
end: range.end
|
|
681
|
+
}));
|
|
682
|
+
}
|
|
683
|
+
function buildQrLineMetrics(lines) {
|
|
684
|
+
const lineBytes = lines.map((line) => Buffer.byteLength(line, "utf8"));
|
|
685
|
+
const prefixBytes = [0];
|
|
686
|
+
for (const bytes of lineBytes) {
|
|
687
|
+
prefixBytes.push((prefixBytes[prefixBytes.length - 1] ?? 0) + bytes);
|
|
688
|
+
}
|
|
689
|
+
return { lineBytes, prefixBytes };
|
|
690
|
+
}
|
|
691
|
+
function qrWindowContentBytes(metrics, window) {
|
|
692
|
+
if (window.end < window.start) {
|
|
693
|
+
return 0;
|
|
694
|
+
}
|
|
695
|
+
const startIndex = Math.max(0, window.start - 1);
|
|
696
|
+
const endIndex = Math.min(metrics.lineBytes.length, window.end);
|
|
697
|
+
if (endIndex <= startIndex) {
|
|
698
|
+
return 0;
|
|
699
|
+
}
|
|
700
|
+
const lineBytes = (metrics.prefixBytes[endIndex] ?? 0) - (metrics.prefixBytes[startIndex] ?? 0);
|
|
701
|
+
const newlineBytes = Math.max(0, endIndex - startIndex - 1);
|
|
702
|
+
return lineBytes + newlineBytes;
|
|
703
|
+
}
|
|
704
|
+
function formatMergedWindowLabel(start, end, labels) {
|
|
705
|
+
if (labels.every((label) => label.startsWith("s="))) {
|
|
706
|
+
return start === end ? `s=${start}` : `s=${start}:${end}`;
|
|
707
|
+
}
|
|
708
|
+
return `r=${start}:${end - start + 1}`;
|
|
709
|
+
}
|
|
710
|
+
function toLineRange(lineCount, window) {
|
|
711
|
+
if (window.kind === "head") {
|
|
712
|
+
return {
|
|
713
|
+
start: 1,
|
|
714
|
+
end: Math.min(lineCount, window.count),
|
|
715
|
+
label: formatWindow(window)
|
|
716
|
+
};
|
|
717
|
+
}
|
|
718
|
+
if (window.kind === "tail") {
|
|
719
|
+
return {
|
|
720
|
+
start: Math.max(1, lineCount - window.count + 1),
|
|
721
|
+
end: lineCount,
|
|
722
|
+
label: formatWindow(window)
|
|
723
|
+
};
|
|
724
|
+
}
|
|
725
|
+
if (window.kind === "range") {
|
|
726
|
+
return {
|
|
727
|
+
start: Math.max(1, Math.min(window.offset, lineCount + 1)),
|
|
728
|
+
end: Math.min(lineCount, window.offset + window.limit - 1),
|
|
729
|
+
label: formatWindow(window)
|
|
730
|
+
};
|
|
731
|
+
}
|
|
732
|
+
return { start: 1, end: lineCount, label: "all" };
|
|
733
|
+
}
|
|
734
|
+
function parseRangeWindows(value, label, errors) {
|
|
735
|
+
return value.split(",").map((part) => part.trim()).filter(Boolean).map((part) => {
|
|
736
|
+
const [offsetValue, limitValue] = part.split(":");
|
|
737
|
+
const offset = parsePositiveIntegerOrDefault(offsetValue ?? "", label, 1, errors);
|
|
738
|
+
const limit = limitValue && limitValue.length > 0
|
|
739
|
+
? parsePositiveIntegerOrDefault(limitValue, label, DEFAULT_HEAD_LINES, errors)
|
|
740
|
+
: DEFAULT_HEAD_LINES;
|
|
741
|
+
return { kind: "range", offset, limit };
|
|
742
|
+
});
|
|
743
|
+
}
|
|
744
|
+
function parseSliceWindows(value, label, errors) {
|
|
745
|
+
return value.split(",").map((part) => part.trim()).filter(Boolean).flatMap((part) => {
|
|
746
|
+
const [fromValue, toValue] = part.split(":");
|
|
747
|
+
const from = parsePositiveIntegerOrDefault(fromValue ?? "", label, 1, errors);
|
|
748
|
+
if (toValue === undefined || toValue.length === 0) {
|
|
749
|
+
return [{ kind: "range", offset: from, limit: 1, display: `s=${from}` }];
|
|
750
|
+
}
|
|
751
|
+
const to = parsePositiveIntegerOrDefault(toValue, label, from, errors);
|
|
752
|
+
if (to < from) {
|
|
753
|
+
errors.push(defaultedWindowError(`${windowDiagnosticLabel(label)} expects end line >= start line, ignored ${part}.`));
|
|
754
|
+
return [];
|
|
755
|
+
}
|
|
756
|
+
return [{ kind: "range", offset: from, limit: to - from + 1, display: startEndSliceLabel(from, to) }];
|
|
757
|
+
});
|
|
758
|
+
}
|
|
759
|
+
function startEndSliceLabel(start, end) {
|
|
760
|
+
return start === end ? `s=${start}` : `s=${start}:${end}`;
|
|
761
|
+
}
|
|
762
|
+
function parseBooleanFlag(value, label) {
|
|
763
|
+
if (value === "true" || value === "1" || value === "yes") {
|
|
764
|
+
return true;
|
|
765
|
+
}
|
|
766
|
+
if (value === "false" || value === "0" || value === "no") {
|
|
767
|
+
return false;
|
|
768
|
+
}
|
|
769
|
+
throw new errors_1.CliError("QR_INVALID_BOOLEAN", `${label} expects true or false.`);
|
|
770
|
+
}
|
|
771
|
+
function parseAssignment(value) {
|
|
772
|
+
const index = value.indexOf("=");
|
|
773
|
+
if (index <= 0) {
|
|
774
|
+
return null;
|
|
775
|
+
}
|
|
776
|
+
return {
|
|
777
|
+
key: value.slice(0, index),
|
|
778
|
+
value: value.slice(index + 1)
|
|
779
|
+
};
|
|
780
|
+
}
|
|
781
|
+
function readNextPositiveOrDefault(args, index, flag, fallback, errors) {
|
|
782
|
+
const value = args[index];
|
|
783
|
+
if (!value || value.startsWith("-")) {
|
|
784
|
+
errors.push(defaultedWindowError(`Expected a value after ${flag}, used ${fallback} by default.`));
|
|
785
|
+
return fallback;
|
|
786
|
+
}
|
|
787
|
+
return parsePositiveIntegerOrDefault(value, flag, fallback, errors);
|
|
788
|
+
}
|
|
789
|
+
function parsePositiveInteger(value, label) {
|
|
790
|
+
const parsed = Number(value);
|
|
791
|
+
if (!Number.isInteger(parsed) || parsed < 1) {
|
|
792
|
+
throw new errors_1.CliError("QR_INVALID_NUMBER", `${label} expects a positive integer.`);
|
|
793
|
+
}
|
|
794
|
+
return parsed;
|
|
795
|
+
}
|
|
796
|
+
function parsePositiveIntegerOrDefault(value, label, fallback, errors) {
|
|
797
|
+
try {
|
|
798
|
+
return parsePositiveInteger(value, label);
|
|
799
|
+
}
|
|
800
|
+
catch {
|
|
801
|
+
errors.push(defaultedWindowError(`${windowDiagnosticLabel(label)} expects a positive integer, used ${fallback} by default.`));
|
|
802
|
+
return fallback;
|
|
803
|
+
}
|
|
804
|
+
}
|
|
805
|
+
function windowDiagnosticLabel(label) {
|
|
806
|
+
if (label === "-h" || label === "--head" || label === "head") {
|
|
807
|
+
return "h";
|
|
808
|
+
}
|
|
809
|
+
if (label === "-t" || label === "--tail" || label === "tail") {
|
|
810
|
+
return "t";
|
|
811
|
+
}
|
|
812
|
+
if (label === "-o" || label === "--offset" || label === "offset") {
|
|
813
|
+
return "o";
|
|
814
|
+
}
|
|
815
|
+
if (label === "-l" || label === "--limit" || label === "limit") {
|
|
816
|
+
return "l";
|
|
817
|
+
}
|
|
818
|
+
if (label === "-r" || label === "--range" || label === "--ranges" || label === "range" || label === "ranges") {
|
|
819
|
+
return "r";
|
|
820
|
+
}
|
|
821
|
+
if (label === "-s" || label === "--slice" || label === "--slices" || label === "slice" || label === "slices") {
|
|
822
|
+
return "s";
|
|
823
|
+
}
|
|
824
|
+
return label;
|
|
825
|
+
}
|
|
826
|
+
function parseBooleanFlagOrNull(value) {
|
|
827
|
+
if (value === "true" || value === "1" || value === "yes") {
|
|
828
|
+
return true;
|
|
829
|
+
}
|
|
830
|
+
if (value === "false" || value === "0" || value === "no") {
|
|
831
|
+
return false;
|
|
832
|
+
}
|
|
833
|
+
return null;
|
|
834
|
+
}
|
|
835
|
+
function defaultedWindowError(error) {
|
|
836
|
+
return {
|
|
837
|
+
file: "",
|
|
838
|
+
error,
|
|
839
|
+
code: "QR_WINDOW_DEFAULT"
|
|
840
|
+
};
|
|
841
|
+
}
|
|
842
|
+
function isWindowToken(value) {
|
|
843
|
+
return /^(?:h|head|t|tail|o|offset|l|limit|r|range|ranges|s|slice|slices|a|all)=/.test(value) || value === "+all";
|
|
844
|
+
}
|
|
845
|
+
function isWindowArg(value) {
|
|
846
|
+
return value.startsWith("-") || isWindowToken(value) || value === "a" || value === "all";
|
|
847
|
+
}
|
|
848
|
+
function expectsWindowValue(value) {
|
|
849
|
+
return ["-h", "--head", "-t", "--tail", "-o", "--offset", "-l", "--limit", "-r", "--range", "--ranges", "-s", "--slice", "--slices"].includes(value);
|
|
850
|
+
}
|
|
851
|
+
function formatQrBlocks(blocks) {
|
|
852
|
+
const readable = blocks.filter((block) => block.error === undefined);
|
|
853
|
+
const errors = blocks.filter((block) => block.error !== undefined);
|
|
854
|
+
const parts = formatReadableQrBlocks(readable);
|
|
855
|
+
if (errors.length > 0) {
|
|
856
|
+
const errorText = formatQrErrors(errors);
|
|
857
|
+
if (errorText) {
|
|
858
|
+
parts.push(errorText);
|
|
859
|
+
}
|
|
860
|
+
}
|
|
861
|
+
return parts.join("\n\n");
|
|
862
|
+
}
|
|
863
|
+
function formatReadableQrBlocks(blocks) {
|
|
864
|
+
const fileCounts = new Map();
|
|
865
|
+
for (const block of blocks) {
|
|
866
|
+
fileCounts.set(block.file, (fileCounts.get(block.file) ?? 0) + 1);
|
|
867
|
+
}
|
|
868
|
+
const parts = [];
|
|
869
|
+
let previousGroupedFile = null;
|
|
870
|
+
for (const block of blocks) {
|
|
871
|
+
const grouped = (fileCounts.get(block.file) ?? 0) > 1;
|
|
872
|
+
if (!grouped) {
|
|
873
|
+
previousGroupedFile = null;
|
|
874
|
+
parts.push(formatSingleQrBlock(block));
|
|
875
|
+
continue;
|
|
876
|
+
}
|
|
877
|
+
if (previousGroupedFile !== block.file) {
|
|
878
|
+
parts.push(`// ${block.file}\n${formatQrWindowBlock(block)}`);
|
|
879
|
+
previousGroupedFile = block.file;
|
|
880
|
+
continue;
|
|
881
|
+
}
|
|
882
|
+
parts.push(formatQrWindowBlock(block));
|
|
883
|
+
}
|
|
884
|
+
return parts;
|
|
885
|
+
}
|
|
886
|
+
function formatSingleQrBlock(block) {
|
|
887
|
+
const capText = formatQrAllOutputCapBlock(block, `// ${block.file}${block.window ? ` ${block.window}` : ""}`);
|
|
888
|
+
if (capText) {
|
|
889
|
+
return capText;
|
|
890
|
+
}
|
|
891
|
+
const blockCapText = formatQrBlockOutputCapBlock(block, `// ${block.file}`);
|
|
892
|
+
if (blockCapText) {
|
|
893
|
+
return blockCapText;
|
|
894
|
+
}
|
|
895
|
+
const header = `// ${block.file}${block.window ? ` ${block.window}` : ""}`;
|
|
896
|
+
return block.content ? `${header}\n${block.content}` : `${header}\n`;
|
|
897
|
+
}
|
|
898
|
+
function formatQrWindowBlock(block) {
|
|
899
|
+
const capText = formatQrAllOutputCapBlock(block, `// ${block.window ?? "window"}`);
|
|
900
|
+
if (capText) {
|
|
901
|
+
return capText;
|
|
902
|
+
}
|
|
903
|
+
const blockCapText = formatQrBlockOutputCapBlock(block, null);
|
|
904
|
+
if (blockCapText) {
|
|
905
|
+
return blockCapText;
|
|
906
|
+
}
|
|
907
|
+
const header = `// ${block.window ?? "window"}`;
|
|
908
|
+
return block.content ? `${header}\n${block.content}` : `${header}\n`;
|
|
909
|
+
}
|
|
910
|
+
function formatQrAllOutputCapBlock(block, header) {
|
|
911
|
+
if (block.code !== "QR_ALL_OUTPUT_CAP_EXCEEDED") {
|
|
912
|
+
return null;
|
|
913
|
+
}
|
|
914
|
+
const outputKb = typeof block.details?.outputKb === "number" ? block.details.outputKb : 0;
|
|
915
|
+
const capKb = typeof block.details?.capKb === "number" ? block.details.capKb : 0;
|
|
916
|
+
const lines = [
|
|
917
|
+
header,
|
|
918
|
+
`AIB_QR_ALL_OUTPUT_CAP_EXCEEDED: ${formatKbValue(outputKb)} KB > ${formatKbValue(capKb)} KB`,
|
|
919
|
+
"line size KB",
|
|
920
|
+
...formatQrLineSamples(block.details?.lineSamples)
|
|
921
|
+
];
|
|
922
|
+
return lines.join("\n");
|
|
923
|
+
}
|
|
924
|
+
function formatQrBlockOutputCapBlock(block, header) {
|
|
925
|
+
if (block.code !== "QR_BLOCK_OUTPUT_CAP_EXCEEDED") {
|
|
926
|
+
return null;
|
|
927
|
+
}
|
|
928
|
+
const capKb = typeof block.details?.capKb === "number" ? block.details.capKb : 0;
|
|
929
|
+
const lines = [
|
|
930
|
+
...(header !== null ? [header] : []),
|
|
931
|
+
`AIB_QR_BLOCK_OUTPUT_CAP_EXCEEDED: cap = ${formatKbValue(capKb)} KB`,
|
|
932
|
+
...formatQrHiddenWindows(block.details?.hiddenWindows),
|
|
933
|
+
"line size KB",
|
|
934
|
+
...formatQrLineSamples(block.details?.lineSamples)
|
|
935
|
+
];
|
|
936
|
+
return lines.join("\n");
|
|
937
|
+
}
|
|
938
|
+
function formatQrHiddenWindows(value) {
|
|
939
|
+
if (!Array.isArray(value)) {
|
|
940
|
+
return [];
|
|
941
|
+
}
|
|
942
|
+
const windows = value.filter((item) => isJsonObject(item) &&
|
|
943
|
+
typeof item.window === "string" &&
|
|
944
|
+
typeof item.sizeKb === "number");
|
|
945
|
+
if (windows.length === 0) {
|
|
946
|
+
return [];
|
|
947
|
+
}
|
|
948
|
+
if (windows.length === 1) {
|
|
949
|
+
const window = windows[0];
|
|
950
|
+
return [`${window.window}: ${formatKbValue(window.sizeKb)} KB`];
|
|
951
|
+
}
|
|
952
|
+
return [
|
|
953
|
+
"hidden:",
|
|
954
|
+
"window size KB",
|
|
955
|
+
...windows.map((window) => `${String(window.window).padEnd(9)} ${formatKbValue(window.sizeKb)}`)
|
|
956
|
+
];
|
|
957
|
+
}
|
|
958
|
+
function formatQrLineSamples(value) {
|
|
959
|
+
if (!Array.isArray(value)) {
|
|
960
|
+
return [];
|
|
961
|
+
}
|
|
962
|
+
return value.flatMap((item) => {
|
|
963
|
+
if (!isJsonObject(item) || typeof item.line !== "number" || typeof item.sizeKb !== "number") {
|
|
964
|
+
return [];
|
|
965
|
+
}
|
|
966
|
+
return `${String(item.line).padEnd(5)} ${formatKbValue(item.sizeKb)}`;
|
|
967
|
+
});
|
|
968
|
+
}
|
|
969
|
+
function formatWindow(window) {
|
|
970
|
+
if (window.kind === "all") {
|
|
971
|
+
return "all";
|
|
972
|
+
}
|
|
973
|
+
if (window.kind === "head") {
|
|
974
|
+
return `h=${window.count}`;
|
|
975
|
+
}
|
|
976
|
+
if (window.kind === "tail") {
|
|
977
|
+
return `t=${window.count}`;
|
|
978
|
+
}
|
|
979
|
+
return window.display ?? `r=${window.offset}:${window.limit}`;
|
|
980
|
+
}
|
|
981
|
+
function formatQrErrors(blocks) {
|
|
982
|
+
const lines = ["errors:"];
|
|
983
|
+
const diagnostics = uniqueStrings(blocks
|
|
984
|
+
.filter((block) => block.code === "QR_FILE_REQUIRED" || block.code === "QR_UNTERMINATED_QUOTE")
|
|
985
|
+
.map((block) => block.error)
|
|
986
|
+
.filter((item) => Boolean(item)));
|
|
987
|
+
for (const diagnostic of diagnostics) {
|
|
988
|
+
lines.push(diagnostic);
|
|
989
|
+
}
|
|
990
|
+
const windowDefaults = blocks.filter((block) => block.code === "QR_WINDOW_DEFAULT");
|
|
991
|
+
for (const block of windowDefaults) {
|
|
992
|
+
lines.push(block.error ?? "qr window defaulted.");
|
|
993
|
+
}
|
|
994
|
+
appendGroupedFileErrors(lines, "files not found:", blocks.filter((block) => block.error === "file not found"));
|
|
995
|
+
appendGroupedFileErrors(lines, "directories:", blocks.filter((block) => block.error === "is a directory"));
|
|
996
|
+
appendGroupedFileErrors(lines, "binary files:", blocks.filter((block) => block.error === "binary file"));
|
|
997
|
+
appendGroupedFileErrors(lines, "read errors:", blocks.filter((block) => block.error !== undefined &&
|
|
998
|
+
!["file not found", "is a directory", "binary file"].includes(block.error) &&
|
|
999
|
+
block.code !== "QR_FILE_REQUIRED" &&
|
|
1000
|
+
block.code !== "QR_UNTERMINATED_QUOTE" &&
|
|
1001
|
+
block.code !== "QR_UNKNOWN_ARGUMENT" &&
|
|
1002
|
+
block.code !== "QR_WINDOW_DEFAULT" &&
|
|
1003
|
+
block.code !== "UNKNOWN_PATH_ALIAS"));
|
|
1004
|
+
const unknownAliases = uniqueStrings(blocks
|
|
1005
|
+
.map((block) => typeof block.details?.alias === "string" ? `@${block.details.alias}` : null)
|
|
1006
|
+
.filter((item) => Boolean(item)));
|
|
1007
|
+
if (unknownAliases.length > 0) {
|
|
1008
|
+
lines.push(`unknown AIB path alias: ${unknownAliases.join(" ")}`);
|
|
1009
|
+
}
|
|
1010
|
+
const availableAliases = firstAvailableAliases(blocks);
|
|
1011
|
+
if (availableAliases.length > 0) {
|
|
1012
|
+
lines.push("", "available aliases:");
|
|
1013
|
+
lines.push(availableAliases.join(", "));
|
|
1014
|
+
}
|
|
1015
|
+
return lines.length > 1 ? lines.join("\n") : "";
|
|
1016
|
+
}
|
|
1017
|
+
function appendGroupedFileErrors(lines, title, blocks) {
|
|
1018
|
+
if (blocks.length === 0) {
|
|
1019
|
+
return;
|
|
1020
|
+
}
|
|
1021
|
+
lines.push(title);
|
|
1022
|
+
for (const file of sortQrErrorFiles(uniqueStrings(blocks.map((block) => block.file).filter(Boolean)))) {
|
|
1023
|
+
lines.push(file);
|
|
1024
|
+
}
|
|
1025
|
+
}
|
|
1026
|
+
function uniqueStrings(values) {
|
|
1027
|
+
return Array.from(new Set(values));
|
|
1028
|
+
}
|
|
1029
|
+
function sortQrErrorFiles(files) {
|
|
1030
|
+
return files.slice().sort((left, right) => qrErrorFileRank(left) - qrErrorFileRank(right));
|
|
1031
|
+
}
|
|
1032
|
+
function qrErrorFileRank(file) {
|
|
1033
|
+
if (file === "BATCH") {
|
|
1034
|
+
return 3;
|
|
1035
|
+
}
|
|
1036
|
+
if (file.startsWith("@") || file.includes("/") || file.includes("\\")) {
|
|
1037
|
+
return 0;
|
|
1038
|
+
}
|
|
1039
|
+
return 1;
|
|
1040
|
+
}
|
|
1041
|
+
function firstAvailableAliases(blocks) {
|
|
1042
|
+
for (const block of blocks) {
|
|
1043
|
+
const available = Array.isArray(block.details?.available)
|
|
1044
|
+
? block.details.available.filter((item) => typeof item === "string")
|
|
1045
|
+
: [];
|
|
1046
|
+
if (available.length > 0) {
|
|
1047
|
+
return available.map((alias) => `@${alias}`);
|
|
1048
|
+
}
|
|
1049
|
+
}
|
|
1050
|
+
return [];
|
|
1051
|
+
}
|
|
1052
|
+
function errorBlock(file, error) {
|
|
1053
|
+
if (error instanceof errors_1.CliError) {
|
|
1054
|
+
const details = isJsonObject(error.details) ? error.details : undefined;
|
|
1055
|
+
const alias = typeof details?.alias === "string" ? details.alias : null;
|
|
1056
|
+
return {
|
|
1057
|
+
file,
|
|
1058
|
+
error: alias ? `unknown AIB path alias: @${alias}` : error.message,
|
|
1059
|
+
code: error.code,
|
|
1060
|
+
...(details ? { details } : {})
|
|
1061
|
+
};
|
|
1062
|
+
}
|
|
1063
|
+
return {
|
|
1064
|
+
file,
|
|
1065
|
+
error: error instanceof Error ? error.message : String(error)
|
|
1066
|
+
};
|
|
1067
|
+
}
|
|
1068
|
+
function isJsonObject(value) {
|
|
1069
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
1070
|
+
}
|
|
1071
|
+
function tokenize(line) {
|
|
1072
|
+
const tokens = [];
|
|
1073
|
+
let current = "";
|
|
1074
|
+
let quote = null;
|
|
1075
|
+
for (let index = 0; index < line.length; index += 1) {
|
|
1076
|
+
const char = line[index] ?? "";
|
|
1077
|
+
if (quote) {
|
|
1078
|
+
if (char === quote) {
|
|
1079
|
+
quote = null;
|
|
1080
|
+
}
|
|
1081
|
+
else {
|
|
1082
|
+
current += char;
|
|
1083
|
+
}
|
|
1084
|
+
continue;
|
|
1085
|
+
}
|
|
1086
|
+
if (char === "\"" || char === "'") {
|
|
1087
|
+
quote = char;
|
|
1088
|
+
continue;
|
|
1089
|
+
}
|
|
1090
|
+
if (/\s/.test(char)) {
|
|
1091
|
+
if (current.length > 0) {
|
|
1092
|
+
tokens.push(current);
|
|
1093
|
+
current = "";
|
|
1094
|
+
}
|
|
1095
|
+
continue;
|
|
1096
|
+
}
|
|
1097
|
+
current += char;
|
|
1098
|
+
}
|
|
1099
|
+
if (quote) {
|
|
1100
|
+
throw new errors_1.CliError("QR_UNTERMINATED_QUOTE", "qr input has an unterminated quote.");
|
|
1101
|
+
}
|
|
1102
|
+
if (current.length > 0) {
|
|
1103
|
+
tokens.push(current);
|
|
1104
|
+
}
|
|
1105
|
+
return tokens;
|
|
1106
|
+
}
|
|
1107
|
+
async function readRawStdin() {
|
|
1108
|
+
const chunks = [];
|
|
1109
|
+
for await (const chunk of process.stdin) {
|
|
1110
|
+
chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(String(chunk)));
|
|
1111
|
+
}
|
|
1112
|
+
return Buffer.concat(chunks).toString("utf8");
|
|
1113
|
+
}
|