@automaton-labs/aib 0.0.7 → 0.0.9
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 +21 -578
- 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 +217 -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
|
@@ -0,0 +1,473 @@
|
|
|
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.runFileMutationTsServerSession = runFileMutationTsServerSession;
|
|
37
|
+
const fs = __importStar(require("node:fs"));
|
|
38
|
+
const path = __importStar(require("node:path"));
|
|
39
|
+
const node_child_process_1 = require("node:child_process");
|
|
40
|
+
const MAX_PROTOCOL_HEADER_BYTES = 64 * 1024;
|
|
41
|
+
const MAX_PROTOCOL_MESSAGE_BYTES = 16 * 1024 * 1024;
|
|
42
|
+
const MAX_PROTOCOL_BUFFER_BYTES = MAX_PROTOCOL_HEADER_BYTES + MAX_PROTOCOL_MESSAGE_BYTES;
|
|
43
|
+
const TERMINATE_GRACE_MS = 500;
|
|
44
|
+
const TERMINATE_FORCE_MS = 2_000;
|
|
45
|
+
async function runFileMutationTsServerSession(input) {
|
|
46
|
+
const startedAt = Date.now();
|
|
47
|
+
let stderrTail = "";
|
|
48
|
+
const serverPath = input.serverPath ?? require.resolve("typescript/lib/tsserver.js");
|
|
49
|
+
const nodePath = input.nodePath ?? process.execPath;
|
|
50
|
+
let child;
|
|
51
|
+
try {
|
|
52
|
+
child = (0, node_child_process_1.spawn)(nodePath, [serverPath, "--disableAutomaticTypingAcquisition"], {
|
|
53
|
+
cwd: input.workspaceRoot,
|
|
54
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
55
|
+
windowsHide: true,
|
|
56
|
+
// The file-mutation worker owns the POSIX process group. Keeping tsserver
|
|
57
|
+
// in that group lets an outer worker deadline reclaim both processes.
|
|
58
|
+
detached: false
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
return failed("FILE_MUTATION_TSSERVER_START_FAILED", error instanceof Error ? error.message : String(error), null);
|
|
63
|
+
}
|
|
64
|
+
const childPid = child.pid ?? null;
|
|
65
|
+
if (!childPid) {
|
|
66
|
+
child.kill();
|
|
67
|
+
const termination = await terminateProcessTree(child, null);
|
|
68
|
+
return failed(termination.confirmed ? "FILE_MUTATION_TSSERVER_START_FAILED" : "FILE_MUTATION_TSSERVER_TERMINATION_FAILED", termination.confirmed ? "tsserver did not publish a child PID." : termination.error, null, null, termination.confirmed);
|
|
69
|
+
}
|
|
70
|
+
let sequence = 0;
|
|
71
|
+
let stdoutBuffer = Buffer.alloc(0);
|
|
72
|
+
let terminal = false;
|
|
73
|
+
let renameStartedAt = 0;
|
|
74
|
+
const pending = new Map();
|
|
75
|
+
let protocolFailed = false;
|
|
76
|
+
let rejectProtocolFatal;
|
|
77
|
+
const protocolFatal = new Promise((_resolve, reject) => {
|
|
78
|
+
rejectProtocolFatal = reject;
|
|
79
|
+
});
|
|
80
|
+
const finishFailure = async (code, error) => {
|
|
81
|
+
if (!terminal) {
|
|
82
|
+
terminal = true;
|
|
83
|
+
for (const item of pending.values()) {
|
|
84
|
+
item.reject(new Error(error));
|
|
85
|
+
}
|
|
86
|
+
pending.clear();
|
|
87
|
+
}
|
|
88
|
+
const rss = readProcessRssMiB(childPid);
|
|
89
|
+
const termination = await terminateProcessTree(child, childPid);
|
|
90
|
+
return failed(termination.confirmed ? code : "FILE_MUTATION_TSSERVER_TERMINATION_FAILED", termination.confirmed ? error : `${error} ${termination.error}`, childPid, rss, termination.confirmed);
|
|
91
|
+
};
|
|
92
|
+
const fatal = new Promise((_resolve, reject) => {
|
|
93
|
+
child.on("error", (error) => reject(new SessionFailure("FILE_MUTATION_TSSERVER_START_FAILED", error.message)));
|
|
94
|
+
child.on("exit", (code, signal) => {
|
|
95
|
+
if (!terminal) {
|
|
96
|
+
reject(new SessionFailure("FILE_MUTATION_TSSERVER_CRASHED", `tsserver exited before completion (code=${String(code)}, signal=${String(signal)}).`));
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
});
|
|
100
|
+
child.stderr.on("data", (chunk) => {
|
|
101
|
+
stderrTail = `${stderrTail}${chunk.toString("utf8")}`.slice(-4_000);
|
|
102
|
+
});
|
|
103
|
+
child.stdout.on("data", (chunk) => {
|
|
104
|
+
if (terminal) {
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
if (stdoutBuffer.length + chunk.length > MAX_PROTOCOL_BUFFER_BYTES) {
|
|
108
|
+
const failure = new SessionFailure("FILE_MUTATION_TSSERVER_PROTOCOL_MALFORMED", `tsserver protocol buffer exceeded ${MAX_PROTOCOL_BUFFER_BYTES} bytes.`);
|
|
109
|
+
child.stdout.pause();
|
|
110
|
+
protocolFailed = true;
|
|
111
|
+
rejectProtocolFatal(failure);
|
|
112
|
+
for (const item of pending.values()) {
|
|
113
|
+
item.reject(failure);
|
|
114
|
+
}
|
|
115
|
+
pending.clear();
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
stdoutBuffer = Buffer.concat([stdoutBuffer, chunk]);
|
|
119
|
+
try {
|
|
120
|
+
drainProtocolMessages();
|
|
121
|
+
}
|
|
122
|
+
catch (error) {
|
|
123
|
+
const failure = error instanceof SessionFailure
|
|
124
|
+
? error
|
|
125
|
+
: new SessionFailure("FILE_MUTATION_TSSERVER_PROTOCOL_MALFORMED", error instanceof Error ? error.message : String(error));
|
|
126
|
+
for (const item of pending.values()) {
|
|
127
|
+
item.reject(failure);
|
|
128
|
+
}
|
|
129
|
+
pending.clear();
|
|
130
|
+
child.stdout.pause();
|
|
131
|
+
if (!protocolFailed) {
|
|
132
|
+
protocolFailed = true;
|
|
133
|
+
rejectProtocolFatal(failure);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
});
|
|
137
|
+
const deadline = new Promise((_resolve, reject) => {
|
|
138
|
+
setTimeout(() => reject(new SessionFailure("FILE_MUTATION_TSSERVER_DEADLINE", `tsserver exceeded ${input.deadlineMs}ms deadline.`)), input.deadlineMs).unref();
|
|
139
|
+
});
|
|
140
|
+
try {
|
|
141
|
+
const work = (async () => {
|
|
142
|
+
const openProjectsResponse = await sendRequest("openExternalProjects", {
|
|
143
|
+
projects: input.ownerProjects.map((project) => ({
|
|
144
|
+
projectFileName: project.configFile,
|
|
145
|
+
rootFiles: project.rootFiles.map((fileName) => ({ fileName })),
|
|
146
|
+
options: project.options
|
|
147
|
+
}))
|
|
148
|
+
});
|
|
149
|
+
if (openProjectsResponse.success !== true) {
|
|
150
|
+
throw new SessionFailure("FILE_MUTATION_TSSERVER_REQUEST_FAILED", openProjectsResponse.message ?? "openExternalProjects failed.");
|
|
151
|
+
}
|
|
152
|
+
for (const opened of input.openFiles) {
|
|
153
|
+
sendNotification("open", {
|
|
154
|
+
file: opened.file,
|
|
155
|
+
fileContent: opened.content,
|
|
156
|
+
projectRootPath: input.workspaceRoot
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
const memberships = await Promise.all(input.openFiles.map(async (opened) => {
|
|
160
|
+
const response = await sendRequest("projectInfo", {
|
|
161
|
+
file: opened.file,
|
|
162
|
+
projectFileName: opened.ownerConfig,
|
|
163
|
+
needFileNameList: false
|
|
164
|
+
});
|
|
165
|
+
const body = isRecord(response.body) ? response.body : {};
|
|
166
|
+
return {
|
|
167
|
+
file: opened.file,
|
|
168
|
+
success: response.success === true,
|
|
169
|
+
configFileName: typeof body.configFileName === "string" ? path.normalize(body.configFileName) : null,
|
|
170
|
+
languageServiceDisabled: typeof body.languageServiceDisabled === "boolean"
|
|
171
|
+
? body.languageServiceDisabled
|
|
172
|
+
: null
|
|
173
|
+
};
|
|
174
|
+
}));
|
|
175
|
+
renameStartedAt = Date.now();
|
|
176
|
+
const response = await sendRequest("getEditsForFileRename", {
|
|
177
|
+
oldFilePath: input.sourceFile,
|
|
178
|
+
newFilePath: input.targetFile
|
|
179
|
+
});
|
|
180
|
+
if (response.success !== true || !Array.isArray(response.body)) {
|
|
181
|
+
throw new SessionFailure("FILE_MUTATION_TSSERVER_REQUEST_FAILED", response.message ?? "getEditsForFileRename failed.");
|
|
182
|
+
}
|
|
183
|
+
const projectListResponse = await sendRequest("synchronizeProjectList", {
|
|
184
|
+
knownProjects: [],
|
|
185
|
+
includeProjectReferenceRedirectInfo: false
|
|
186
|
+
});
|
|
187
|
+
if (projectListResponse.success !== true || !Array.isArray(projectListResponse.body)) {
|
|
188
|
+
throw new SessionFailure("FILE_MUTATION_TSSERVER_REQUEST_FAILED", projectListResponse.message ?? "synchronizeProjectList failed.");
|
|
189
|
+
}
|
|
190
|
+
const allEnabledConfiguredProjects = readEnabledConfiguredProjects(projectListResponse.body);
|
|
191
|
+
const enabledKeys = new Set(allEnabledConfiguredProjects.map(pathKey));
|
|
192
|
+
const expectedOwnerConfigs = uniquePaths(input.expectedOwnerConfigs);
|
|
193
|
+
const enabledOwnerConfigs = expectedOwnerConfigs.filter((config) => enabledKeys.has(pathKey(config)));
|
|
194
|
+
const missingOwnerConfigs = expectedOwnerConfigs
|
|
195
|
+
.filter((config) => !enabledKeys.has(pathKey(config)));
|
|
196
|
+
return { memberships, edits: readEdits(response.body), enabledOwnerConfigs, missingOwnerConfigs };
|
|
197
|
+
})();
|
|
198
|
+
const output = await Promise.race([work, fatal, protocolFatal, deadline]);
|
|
199
|
+
terminal = true;
|
|
200
|
+
const childRssMiB = readProcessRssMiB(childPid);
|
|
201
|
+
const termination = await terminateProcessTree(child, childPid);
|
|
202
|
+
if (!termination.confirmed) {
|
|
203
|
+
return failed("FILE_MUTATION_TSSERVER_TERMINATION_FAILED", termination.error, childPid, childRssMiB, false);
|
|
204
|
+
}
|
|
205
|
+
return {
|
|
206
|
+
ok: true,
|
|
207
|
+
edits: output.edits,
|
|
208
|
+
memberships: output.memberships,
|
|
209
|
+
enabledOwnerConfigs: output.enabledOwnerConfigs,
|
|
210
|
+
missingOwnerConfigs: output.missingOwnerConfigs,
|
|
211
|
+
childPid,
|
|
212
|
+
childRssMiB,
|
|
213
|
+
terminationConfirmed: true,
|
|
214
|
+
totalMs: Date.now() - startedAt,
|
|
215
|
+
renameMs: Date.now() - renameStartedAt,
|
|
216
|
+
openedFileCount: input.openFiles.length,
|
|
217
|
+
stderrTail
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
catch (error) {
|
|
221
|
+
const failure = error instanceof SessionFailure
|
|
222
|
+
? error
|
|
223
|
+
: new SessionFailure("FILE_MUTATION_TSSERVER_REQUEST_FAILED", error instanceof Error ? error.message : String(error));
|
|
224
|
+
return finishFailure(failure.code, failure.message);
|
|
225
|
+
}
|
|
226
|
+
function sendNotification(command, args) {
|
|
227
|
+
child.stdin.write(`${JSON.stringify({ seq: ++sequence, type: "request", command, arguments: args })}\n`);
|
|
228
|
+
}
|
|
229
|
+
function sendRequest(command, args) {
|
|
230
|
+
const seq = ++sequence;
|
|
231
|
+
const promise = new Promise((resolve, reject) => {
|
|
232
|
+
pending.set(seq, { command, resolve, reject });
|
|
233
|
+
});
|
|
234
|
+
child.stdin.write(`${JSON.stringify({ seq, type: "request", command, arguments: args })}\n`);
|
|
235
|
+
return promise;
|
|
236
|
+
}
|
|
237
|
+
function drainProtocolMessages() {
|
|
238
|
+
while (true) {
|
|
239
|
+
const headerEnd = stdoutBuffer.indexOf("\r\n\r\n");
|
|
240
|
+
if (headerEnd < 0) {
|
|
241
|
+
if (stdoutBuffer.length > MAX_PROTOCOL_HEADER_BYTES) {
|
|
242
|
+
throw new SessionFailure("FILE_MUTATION_TSSERVER_PROTOCOL_MALFORMED", `Unframed tsserver output exceeded ${MAX_PROTOCOL_HEADER_BYTES} bytes.`);
|
|
243
|
+
}
|
|
244
|
+
return;
|
|
245
|
+
}
|
|
246
|
+
if (headerEnd > MAX_PROTOCOL_HEADER_BYTES) {
|
|
247
|
+
throw new SessionFailure("FILE_MUTATION_TSSERVER_PROTOCOL_MALFORMED", `tsserver protocol header exceeded ${MAX_PROTOCOL_HEADER_BYTES} bytes.`);
|
|
248
|
+
}
|
|
249
|
+
const header = stdoutBuffer.subarray(0, headerEnd).toString("utf8");
|
|
250
|
+
const match = /Content-Length:\s*(\d+)/i.exec(header);
|
|
251
|
+
if (!match) {
|
|
252
|
+
throw new SessionFailure("FILE_MUTATION_TSSERVER_PROTOCOL_MALFORMED", "tsserver response omitted Content-Length.");
|
|
253
|
+
}
|
|
254
|
+
const length = Number(match[1]);
|
|
255
|
+
if (!Number.isSafeInteger(length) || length < 0 || length > MAX_PROTOCOL_MESSAGE_BYTES) {
|
|
256
|
+
throw new SessionFailure("FILE_MUTATION_TSSERVER_PROTOCOL_MALFORMED", `tsserver Content-Length ${String(match[1])} exceeds the supported limit.`);
|
|
257
|
+
}
|
|
258
|
+
const bodyStart = headerEnd + 4;
|
|
259
|
+
if (stdoutBuffer.length < bodyStart + length) {
|
|
260
|
+
return;
|
|
261
|
+
}
|
|
262
|
+
const body = stdoutBuffer.subarray(bodyStart, bodyStart + length).toString("utf8");
|
|
263
|
+
stdoutBuffer = stdoutBuffer.subarray(bodyStart + length);
|
|
264
|
+
let message;
|
|
265
|
+
try {
|
|
266
|
+
message = JSON.parse(body);
|
|
267
|
+
}
|
|
268
|
+
catch (error) {
|
|
269
|
+
throw new SessionFailure("FILE_MUTATION_TSSERVER_PROTOCOL_MALFORMED", `Invalid tsserver JSON: ${error instanceof Error ? error.message : String(error)}`);
|
|
270
|
+
}
|
|
271
|
+
if (message.type !== "response" || typeof message.request_seq !== "number") {
|
|
272
|
+
continue;
|
|
273
|
+
}
|
|
274
|
+
const request = pending.get(message.request_seq);
|
|
275
|
+
if (!request) {
|
|
276
|
+
continue;
|
|
277
|
+
}
|
|
278
|
+
pending.delete(message.request_seq);
|
|
279
|
+
if (message.command !== request.command) {
|
|
280
|
+
request.reject(new SessionFailure("FILE_MUTATION_TSSERVER_PROTOCOL_MALFORMED", `tsserver response command mismatch: expected ${request.command}, got ${String(message.command)}.`));
|
|
281
|
+
continue;
|
|
282
|
+
}
|
|
283
|
+
request.resolve(message);
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
function failed(code, error, pid, rss = null, terminationConfirmed = pid === null) {
|
|
287
|
+
return {
|
|
288
|
+
ok: false,
|
|
289
|
+
code,
|
|
290
|
+
error,
|
|
291
|
+
childPid: pid,
|
|
292
|
+
childRssMiB: rss,
|
|
293
|
+
terminationConfirmed,
|
|
294
|
+
totalMs: Date.now() - startedAt,
|
|
295
|
+
openedFileCount: input.openFiles.length,
|
|
296
|
+
stderrTail
|
|
297
|
+
};
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
class SessionFailure extends Error {
|
|
301
|
+
code;
|
|
302
|
+
constructor(code, message) {
|
|
303
|
+
super(message);
|
|
304
|
+
this.code = code;
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
function readEdits(value) {
|
|
308
|
+
const edits = [];
|
|
309
|
+
for (const item of value) {
|
|
310
|
+
if (!isRecord(item) || typeof item.fileName !== "string" || !Array.isArray(item.textChanges)) {
|
|
311
|
+
throw new SessionFailure("FILE_MUTATION_TSSERVER_PROTOCOL_MALFORMED", "Malformed file rename edit record.");
|
|
312
|
+
}
|
|
313
|
+
const textChanges = item.textChanges.map((change) => {
|
|
314
|
+
if (!isRecord(change) || !isLocation(change.start) || !isLocation(change.end) || typeof change.newText !== "string") {
|
|
315
|
+
throw new SessionFailure("FILE_MUTATION_TSSERVER_PROTOCOL_MALFORMED", "Malformed file rename text change.");
|
|
316
|
+
}
|
|
317
|
+
return { start: change.start, end: change.end, newText: change.newText };
|
|
318
|
+
});
|
|
319
|
+
edits.push({ fileName: path.normalize(item.fileName), textChanges });
|
|
320
|
+
}
|
|
321
|
+
return edits.sort((left, right) => left.fileName.localeCompare(right.fileName));
|
|
322
|
+
}
|
|
323
|
+
function isLocation(value) {
|
|
324
|
+
return isRecord(value) &&
|
|
325
|
+
typeof value.line === "number" && Number.isInteger(value.line) && value.line > 0 &&
|
|
326
|
+
typeof value.offset === "number" && Number.isInteger(value.offset) && value.offset > 0;
|
|
327
|
+
}
|
|
328
|
+
function isRecord(value) {
|
|
329
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
330
|
+
}
|
|
331
|
+
function readEnabledConfiguredProjects(value) {
|
|
332
|
+
const result = [];
|
|
333
|
+
for (const item of value) {
|
|
334
|
+
if (!isRecord(item) || !isRecord(item.info)) {
|
|
335
|
+
throw new SessionFailure("FILE_MUTATION_TSSERVER_PROTOCOL_MALFORMED", "Malformed synchronizeProjectList project record.");
|
|
336
|
+
}
|
|
337
|
+
const info = item.info;
|
|
338
|
+
if (typeof info.projectName !== "string" || typeof info.isInferred !== "boolean") {
|
|
339
|
+
throw new SessionFailure("FILE_MUTATION_TSSERVER_PROTOCOL_MALFORMED", "Malformed synchronizeProjectList project info.");
|
|
340
|
+
}
|
|
341
|
+
if (!info.isInferred && info.languageServiceDisabled !== true) {
|
|
342
|
+
result.push(path.normalize(info.projectName));
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
return uniquePaths(result);
|
|
346
|
+
}
|
|
347
|
+
async function terminateProcessTree(child, pid) {
|
|
348
|
+
try {
|
|
349
|
+
child.stdin.end();
|
|
350
|
+
}
|
|
351
|
+
catch {
|
|
352
|
+
// Continue with owned-process termination.
|
|
353
|
+
}
|
|
354
|
+
if (pid === null) {
|
|
355
|
+
try {
|
|
356
|
+
child.kill("SIGKILL");
|
|
357
|
+
}
|
|
358
|
+
catch {
|
|
359
|
+
// A PID-less child may already be gone.
|
|
360
|
+
}
|
|
361
|
+
const confirmed = await waitForChildExit(child, TERMINATE_FORCE_MS);
|
|
362
|
+
destroyChildStreams(child);
|
|
363
|
+
return {
|
|
364
|
+
confirmed,
|
|
365
|
+
error: confirmed ? "" : "tsserver PID-less child exit could not be confirmed."
|
|
366
|
+
};
|
|
367
|
+
}
|
|
368
|
+
if (!isProcessTreeAlive(child, pid)) {
|
|
369
|
+
destroyChildStreams(child);
|
|
370
|
+
return { confirmed: true, error: "" };
|
|
371
|
+
}
|
|
372
|
+
if (process.platform === "win32") {
|
|
373
|
+
(0, node_child_process_1.spawnSync)("taskkill.exe", ["/PID", String(pid), "/T", "/F"], {
|
|
374
|
+
stdio: "ignore",
|
|
375
|
+
windowsHide: true,
|
|
376
|
+
timeout: TERMINATE_FORCE_MS
|
|
377
|
+
});
|
|
378
|
+
const confirmed = await waitForProcessTreeExit(child, pid, TERMINATE_FORCE_MS);
|
|
379
|
+
destroyChildStreams(child);
|
|
380
|
+
return {
|
|
381
|
+
confirmed,
|
|
382
|
+
error: confirmed ? "" : `taskkill did not confirm tsserver process-tree exit for PID ${pid}.`
|
|
383
|
+
};
|
|
384
|
+
}
|
|
385
|
+
signalProcessTree(pid, "SIGTERM");
|
|
386
|
+
if (await waitForProcessTreeExit(child, pid, TERMINATE_GRACE_MS)) {
|
|
387
|
+
destroyChildStreams(child);
|
|
388
|
+
return { confirmed: true, error: "" };
|
|
389
|
+
}
|
|
390
|
+
signalProcessTree(pid, "SIGKILL");
|
|
391
|
+
const confirmed = await waitForProcessTreeExit(child, pid, TERMINATE_FORCE_MS);
|
|
392
|
+
destroyChildStreams(child);
|
|
393
|
+
return {
|
|
394
|
+
confirmed,
|
|
395
|
+
error: confirmed ? "" : `SIGKILL did not confirm tsserver process-group exit for PID ${pid}.`
|
|
396
|
+
};
|
|
397
|
+
}
|
|
398
|
+
function signalProcessTree(pid, signal) {
|
|
399
|
+
try {
|
|
400
|
+
process.kill(pid, signal);
|
|
401
|
+
}
|
|
402
|
+
catch {
|
|
403
|
+
// Already exited.
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
async function waitForProcessTreeExit(child, pid, timeoutMs) {
|
|
407
|
+
const deadline = Date.now() + timeoutMs;
|
|
408
|
+
while (Date.now() <= deadline) {
|
|
409
|
+
if (!isProcessTreeAlive(child, pid)) {
|
|
410
|
+
return true;
|
|
411
|
+
}
|
|
412
|
+
await delay(20);
|
|
413
|
+
}
|
|
414
|
+
return !isProcessTreeAlive(child, pid);
|
|
415
|
+
}
|
|
416
|
+
async function waitForChildExit(child, timeoutMs) {
|
|
417
|
+
const deadline = Date.now() + timeoutMs;
|
|
418
|
+
while (Date.now() <= deadline) {
|
|
419
|
+
if (child.exitCode !== null || child.signalCode !== null) {
|
|
420
|
+
return true;
|
|
421
|
+
}
|
|
422
|
+
await delay(20);
|
|
423
|
+
}
|
|
424
|
+
return child.exitCode !== null || child.signalCode !== null;
|
|
425
|
+
}
|
|
426
|
+
function isProcessTreeAlive(child, pid) {
|
|
427
|
+
if (process.platform === "win32") {
|
|
428
|
+
return child.exitCode === null && child.signalCode === null && isPidAlive(pid);
|
|
429
|
+
}
|
|
430
|
+
return child.exitCode === null && child.signalCode === null && isPidAlive(pid);
|
|
431
|
+
}
|
|
432
|
+
function isPidAlive(pid) {
|
|
433
|
+
try {
|
|
434
|
+
process.kill(pid, 0);
|
|
435
|
+
return true;
|
|
436
|
+
}
|
|
437
|
+
catch (error) {
|
|
438
|
+
return isPermissionError(error);
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
function isPermissionError(error) {
|
|
442
|
+
return isRecord(error) && error.code === "EPERM";
|
|
443
|
+
}
|
|
444
|
+
function destroyChildStreams(child) {
|
|
445
|
+
child.stdin.destroy();
|
|
446
|
+
child.stdout.destroy();
|
|
447
|
+
child.stderr.destroy();
|
|
448
|
+
}
|
|
449
|
+
function delay(ms) {
|
|
450
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
451
|
+
}
|
|
452
|
+
function uniquePaths(files) {
|
|
453
|
+
return [...new Map(files.map((file) => [pathKey(file), path.normalize(file)])).values()].sort();
|
|
454
|
+
}
|
|
455
|
+
function pathKey(file) {
|
|
456
|
+
const normalized = path.normalize(file);
|
|
457
|
+
return process.platform === "win32" ? normalized.toLowerCase() : normalized;
|
|
458
|
+
}
|
|
459
|
+
function readProcessRssMiB(pid) {
|
|
460
|
+
if (process.platform === "win32") {
|
|
461
|
+
const result = (0, node_child_process_1.spawnSync)("powershell.exe", ["-NoProfile", "-NonInteractive", "-Command", `(Get-Process -Id ${pid} -ErrorAction Stop).WorkingSet64`], { encoding: "utf8", windowsHide: true, timeout: 5_000 });
|
|
462
|
+
const bytes = Number(result.stdout.trim());
|
|
463
|
+
return Number.isFinite(bytes) ? bytes / 1024 / 1024 : null;
|
|
464
|
+
}
|
|
465
|
+
try {
|
|
466
|
+
const status = fs.readFileSync(`/proc/${pid}/status`, "utf8");
|
|
467
|
+
const match = /^VmRSS:\s+(\d+)\s+kB$/m.exec(status);
|
|
468
|
+
return match ? Number(match[1]) / 1024 : null;
|
|
469
|
+
}
|
|
470
|
+
catch {
|
|
471
|
+
return null;
|
|
472
|
+
}
|
|
473
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.estimateMutationPlanDurationMs = estimateMutationPlanDurationMs;
|
|
4
|
+
function estimateMutationPlanDurationMs(input) {
|
|
5
|
+
const estimate = readEstimate(input);
|
|
6
|
+
const rowCount = readCount(estimate.rowCount);
|
|
7
|
+
const baseMs = 12_000;
|
|
8
|
+
const groupMs = readCount(estimate.groupCount) * 1_500;
|
|
9
|
+
const selectedSemanticMs = readCount(estimate.semanticSelectedDurationMs);
|
|
10
|
+
const hasSelectedSemanticEstimate = selectedSemanticMs > 0;
|
|
11
|
+
const semanticMs = hasSelectedSemanticEstimate ? selectedSemanticMs : readCount(estimate.semanticRowCount) * 6_000;
|
|
12
|
+
const selectedFileMs = readCount(estimate.fileSelectedDurationMs);
|
|
13
|
+
const hasSelectedFileEstimate = selectedFileMs > 0;
|
|
14
|
+
const fileMs = hasSelectedFileEstimate ? selectedFileMs : readCount(estimate.fileRowCount) * 110_000;
|
|
15
|
+
const modulePlanMs = hasSelectedSemanticEstimate ? 0 : readCount(estimate.modulePlanRowCount) * 180_000;
|
|
16
|
+
const providerMs = readCount(estimate.providerRequestCount) * 2_000;
|
|
17
|
+
const fileOperationMs = hasSelectedFileEstimate ? 0 : readCount(estimate.fileOperationCount) * 2_000;
|
|
18
|
+
const targetDirMs = hasSelectedFileEstimate ? 0 : readCount(estimate.targetDirCount) * 1_000;
|
|
19
|
+
const postProcessMs = readCount(estimate.postProcessPhaseCount) * 5_000;
|
|
20
|
+
const operationFloorMs = Math.max(1, rowCount) * 5_000;
|
|
21
|
+
return clampMs(baseMs +
|
|
22
|
+
groupMs +
|
|
23
|
+
semanticMs +
|
|
24
|
+
fileMs +
|
|
25
|
+
modulePlanMs +
|
|
26
|
+
providerMs +
|
|
27
|
+
fileOperationMs +
|
|
28
|
+
targetDirMs +
|
|
29
|
+
postProcessMs, Math.max(8_000, operationFloorMs), 300_000);
|
|
30
|
+
}
|
|
31
|
+
function readEstimate(input) {
|
|
32
|
+
if (isObject(input) && "estimate" in input && isObject(input.estimate)) {
|
|
33
|
+
return input.estimate;
|
|
34
|
+
}
|
|
35
|
+
return input;
|
|
36
|
+
}
|
|
37
|
+
function readCount(value) {
|
|
38
|
+
return typeof value === "number" && Number.isFinite(value) && value > 0 ? value : 0;
|
|
39
|
+
}
|
|
40
|
+
function clampMs(value, minMs, maxMs) {
|
|
41
|
+
return Math.min(maxMs, Math.max(minMs, Math.round(value)));
|
|
42
|
+
}
|
|
43
|
+
function isObject(value) {
|
|
44
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
45
|
+
}
|