@automaton-labs/aib 0.0.6 → 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.
Files changed (586) hide show
  1. package/README.md +36 -257
  2. package/config/agent-dx-policy.default.json +31 -0
  3. package/config/control-plane-client.default.json +3 -0
  4. package/dist/agent-dx/agent-dx.js +805 -0
  5. package/dist/agent-dx/presentation.js +32 -0
  6. package/dist/alias-advisor/analyze.js +982 -0
  7. package/dist/alias-advisor/exact-text-cost.js +74 -0
  8. package/dist/alias-advisor/lexical.js +240 -0
  9. package/dist/alias-advisor/model.js +2 -0
  10. package/dist/alias-advisor/path-identity.js +49 -0
  11. package/dist/alias-advisor/ranking.js +171 -0
  12. package/dist/alias-advisor/token-estimator.js +85 -0
  13. package/dist/bin/aib.js +5 -1
  14. package/dist/bin/cli.js +811 -2
  15. package/dist/commands/add-missing-imports-preview-cache.js +99 -2
  16. package/dist/commands/add-missing-imports.js +241 -2
  17. package/dist/commands/apply-module-plan.js +1319 -3
  18. package/dist/commands/background-command.js +378 -0
  19. package/dist/commands/captured-input.js +74 -2
  20. package/dist/commands/config-command.js +314 -2
  21. package/dist/commands/config-output.js +357 -10
  22. package/dist/commands/control-plane-command.js +183 -0
  23. package/dist/commands/declaration-command.js +1209 -0
  24. package/dist/commands/declaration-execution-cache.js +79 -0
  25. package/dist/commands/declaration-format.js +221 -0
  26. package/dist/commands/declaration-preview-cache.js +114 -0
  27. package/dist/commands/diagnostics-command.js +70 -3
  28. package/dist/commands/doctor.js +137 -2
  29. package/dist/commands/execution-command.js +117 -1
  30. package/dist/commands/exports-star-collapse-command.js +178 -0
  31. package/dist/commands/exports-star-command.js +252 -0
  32. package/dist/commands/exports-star-preview-cache.js +84 -0
  33. package/dist/commands/feedback-command.js +176 -3
  34. package/dist/commands/file-move-to-dir-execution-cache.js +92 -0
  35. package/dist/commands/file-move-to-dir-preview-cache.js +125 -0
  36. package/dist/commands/file-move-to-dir-worker.js +54 -0
  37. package/dist/commands/file-move-to-dir.js +1073 -0
  38. package/dist/commands/file-mutation-runtime.js +102 -0
  39. package/dist/commands/file-mutation-worker-apply.js +180 -0
  40. package/dist/commands/file-refactor-batch-execution-cache.js +90 -0
  41. package/dist/commands/file-refactor-batch-preview-cache.js +125 -0
  42. package/dist/commands/file-refactor-batch-worker.js +54 -0
  43. package/dist/commands/file-refactor-batch.js +1154 -0
  44. package/dist/commands/file-rename-execution-cache.js +92 -0
  45. package/dist/commands/file-rename-preview-cache.js +125 -0
  46. package/dist/commands/file-rename-worker.js +54 -0
  47. package/dist/commands/file-rename.js +1053 -0
  48. package/dist/commands/file-text-edit-executor.js +205 -0
  49. package/dist/commands/find-importers.js +52 -1
  50. package/dist/commands/find-unused-imports.js +55 -1
  51. package/dist/commands/generate-docs-command.js +244 -6
  52. package/dist/commands/help-command.js +460 -7
  53. package/dist/commands/import-specifier-policy.js +391 -0
  54. package/dist/commands/imports-command.js +68 -1
  55. package/dist/commands/imports-rebase.js +1138 -0
  56. package/dist/commands/init-skill-usage.js +92 -3
  57. package/dist/commands/init-workspace.js +30 -1
  58. package/dist/commands/inspect-alias-candidates.js +413 -0
  59. package/dist/commands/inspect-cycles.js +811 -5
  60. package/dist/commands/inspect-direct-usages.js +98 -0
  61. package/dist/commands/inspect-duplicates-format.js +229 -0
  62. package/dist/commands/inspect-format-primitives.js +127 -0
  63. package/dist/commands/inspect-format.js +1590 -18
  64. package/dist/commands/inspect-graph.js +1553 -9
  65. package/dist/commands/inspect-imports.js +339 -2
  66. package/dist/commands/inspect-mixed-format.js +524 -0
  67. package/dist/commands/inspect-module-plan-format.js +216 -0
  68. package/dist/commands/inspect-module-plan-serialization.js +402 -0
  69. package/dist/commands/inspect-reference-path-format.js +157 -0
  70. package/dist/commands/inspect-request-values.js +599 -0
  71. package/dist/commands/inspect-selector-kind.js +21 -0
  72. package/dist/commands/inspect-selector.js +50 -0
  73. package/dist/commands/inspect-symbol-format.js +90 -0
  74. package/dist/commands/inspect-topology.js +435 -0
  75. package/dist/commands/inspect-tree.js +827 -5
  76. package/dist/commands/inspect-usages-detail.js +793 -0
  77. package/dist/commands/inspect-usages-evidence.js +31 -0
  78. package/dist/commands/inspect-usages-format.js +367 -0
  79. package/dist/commands/inspect.js +1450 -16
  80. package/dist/commands/internal-command.js +64 -0
  81. package/dist/commands/json-file-input.js +60 -1
  82. package/dist/commands/module-plan-cache.js +156 -2
  83. package/dist/commands/module-plan-standalone.js +208 -0
  84. package/dist/commands/module-plan-timeout.js +77 -1
  85. package/dist/commands/move-preview-cache.js +101 -2
  86. package/dist/commands/mutate-aggregate-output.js +996 -0
  87. package/dist/commands/mutate-child-execution.js +374 -0
  88. package/dist/commands/mutate-command.js +1394 -0
  89. package/dist/commands/mutate-declaration-output.js +313 -0
  90. package/dist/commands/mutate-domain-adapters.js +638 -0
  91. package/dist/commands/mutate-execution-cache.js +114 -0
  92. package/dist/commands/mutate-execution-status.js +598 -0
  93. package/dist/commands/mutate-failure-output.js +531 -0
  94. package/dist/commands/mutate-file-view.js +151 -0
  95. package/dist/commands/mutate-object-output.js +91 -0
  96. package/dist/commands/mutate-output-values.js +97 -0
  97. package/dist/commands/mutate-preview-cache.js +86 -0
  98. package/dist/commands/mutate-response-replay.js +153 -0
  99. package/dist/commands/mutate-result-projection.js +818 -0
  100. package/dist/commands/mutation-eta.js +28 -0
  101. package/dist/commands/mutation-execution-cache.js +140 -3
  102. package/dist/commands/mutation-recovery-journal.js +195 -0
  103. package/dist/commands/normalize-imports.js +1120 -4
  104. package/dist/commands/object-pack-command.js +546 -0
  105. package/dist/commands/object-pack-preview-cache.js +88 -0
  106. package/dist/commands/observability-command.js +47 -3
  107. package/dist/commands/ota-command.js +403 -0
  108. package/dist/commands/print-config.js +10 -1
  109. package/dist/commands/quick-read.js +1113 -11
  110. package/dist/commands/refactor-batch-builder.js +265 -1
  111. package/dist/commands/refactor-batch-execution-cache.js +85 -1
  112. package/dist/commands/refactor-batch-preview-cache.js +96 -2
  113. package/dist/commands/refactor-batch.js +461 -4
  114. package/dist/commands/rename-entities.js +794 -4
  115. package/dist/commands/rename-execution-cache.js +49 -1
  116. package/dist/commands/rename-input.js +22 -1
  117. package/dist/commands/rename-polling-policy.js +68 -0
  118. package/dist/commands/rename-preview-cache.js +96 -2
  119. package/dist/commands/result-view.js +993 -6
  120. package/dist/commands/reveal-command.js +445 -5
  121. package/dist/commands/selector-suggestions.js +93 -0
  122. package/dist/commands/session-workspace.js +1836 -31
  123. package/dist/commands/shared.js +2 -1
  124. package/dist/commands/skills-command.js +315 -0
  125. package/dist/commands/sync-command.js +59 -2
  126. package/dist/commands/worker-command.js +173 -0
  127. package/dist/commands/workspace-cache.js +55 -1
  128. package/dist/config/defaults.js +26 -1
  129. package/dist/config/env-vars.js +77 -1
  130. package/dist/config/glob-match.js +44 -1
  131. package/dist/config/import-rules.js +165 -1
  132. package/dist/config/local-config.js +293 -3
  133. package/dist/config/mutation-comments.js +51 -1
  134. package/dist/config/path-aliases.js +165 -1
  135. package/dist/config/path-display.js +84 -1
  136. package/dist/config/product-storage.js +37 -1
  137. package/dist/config/request-env.js +21 -0
  138. package/dist/config/request-routing-context.js +23 -0
  139. package/dist/config/resolve-command-alias.js +74 -1
  140. package/dist/config/resolve.js +24 -1
  141. package/dist/config/tsconfig-discovery.js +113 -1
  142. package/dist/config/typescript-preferences.js +131 -0
  143. package/dist/config/workspace-root.js +310 -3
  144. package/dist/config/workspace-state.js +254 -1
  145. package/dist/content/content-bundle.js +88 -1
  146. package/dist/diagnostics/module-plan-timeline.js +75 -2
  147. package/dist/diagnostics/readiness-text.js +45 -8
  148. package/dist/dsl/aib-dsl.js +838 -1
  149. package/dist/dsl/declaration-dsl.js +264 -0
  150. package/dist/dsl/file-move-to-dir-dsl.js +123 -0
  151. package/dist/dsl/file-refactor-batch-dsl.js +203 -0
  152. package/dist/dsl/file-rename-dsl.js +135 -0
  153. package/dist/dsl/mutate-dsl.js +746 -0
  154. package/dist/help/bootstrap.bash.md +742 -0
  155. package/dist/help/bootstrap.md +236 -437
  156. package/dist/help/bootstrap.pwsh.md +742 -0
  157. package/dist/help/docs/basics.md +1 -1
  158. package/dist/help/docs/config-setup.import-normalize.md +65 -65
  159. package/dist/help/docs/config-setup.import-rules.md +6 -5
  160. package/dist/help/docs/dsl.md +4 -3
  161. package/dist/help/docs/first-setup.md +6 -5
  162. package/dist/help/docs/help-protocol.md +4 -3
  163. package/dist/help/docs/import.base.md +38 -0
  164. package/dist/help/docs/import.rebase.md +85 -0
  165. package/dist/help/docs/inspect.aliasCandidates.md +39 -0
  166. package/dist/help/docs/inspect.code.md +5 -11
  167. package/dist/help/docs/inspect.deps.md +7 -7
  168. package/dist/help/docs/inspect.file.md +10 -18
  169. package/dist/help/docs/inspect.graph.md +6 -20
  170. package/dist/help/docs/{inspect.md → inspect.shared.md} +18 -17
  171. package/dist/help/docs/modulePlan.md +24 -28
  172. package/dist/help/docs/move.md +19 -22
  173. package/dist/help/docs/moveToDir.md +46 -0
  174. package/dist/help/docs/mutate.mixed.md +34 -0
  175. package/dist/help/docs/mutation.shared.md +55 -0
  176. package/dist/help/docs/patterns.md +3 -16
  177. package/dist/help/docs/qr.md +13 -22
  178. package/dist/help/docs/quick-map.md +36 -23
  179. package/dist/help/docs/recipe.file-layout.md +15 -0
  180. package/dist/help/docs/recipe.import-boundary.md +92 -0
  181. package/dist/help/docs/recipe.safe-artifact-probing.md +68 -0
  182. package/dist/help/docs/recipe.unfamiliar-area.md +64 -0
  183. package/dist/help/docs/recipes.md +20 -0
  184. package/dist/help/docs/rename.md +19 -27
  185. package/dist/help/docs/renameFile.md +36 -0
  186. package/dist/help/docs/rg.md +22 -0
  187. package/dist/help/docs/rules.md +26 -0
  188. package/dist/help/docs/selectors.md +3 -2
  189. package/dist/help/docs/session.md +1 -1
  190. package/dist/help/dsl/bootstrap.bash.md +742 -0
  191. package/dist/help/dsl/bootstrap.md +236 -437
  192. package/dist/help/dsl/bootstrap.pwsh.md +742 -0
  193. package/dist/help/dsl/docs/basics.md +1 -1
  194. package/dist/help/dsl/docs/config-setup.import-normalize.md +65 -65
  195. package/dist/help/dsl/docs/config-setup.import-rules.md +6 -5
  196. package/dist/help/dsl/docs/dsl.md +4 -3
  197. package/dist/help/dsl/docs/first-setup.md +6 -5
  198. package/dist/help/dsl/docs/help-protocol.md +4 -3
  199. package/dist/help/dsl/docs/import.base.md +38 -0
  200. package/dist/help/dsl/docs/import.rebase.md +85 -0
  201. package/dist/help/dsl/docs/inspect.aliasCandidates.md +39 -0
  202. package/dist/help/dsl/docs/inspect.code.md +5 -11
  203. package/dist/help/dsl/docs/inspect.deps.md +7 -7
  204. package/dist/help/dsl/docs/inspect.file.md +10 -18
  205. package/dist/help/dsl/docs/inspect.graph.md +6 -20
  206. package/dist/help/dsl/docs/{inspect.md → inspect.shared.md} +18 -17
  207. package/dist/help/dsl/docs/modulePlan.md +24 -28
  208. package/dist/help/dsl/docs/move.md +19 -22
  209. package/dist/help/dsl/docs/moveToDir.md +46 -0
  210. package/dist/help/dsl/docs/mutate.mixed.md +34 -0
  211. package/dist/help/dsl/docs/mutation.shared.md +55 -0
  212. package/dist/help/dsl/docs/patterns.md +3 -16
  213. package/dist/help/dsl/docs/qr.md +13 -22
  214. package/dist/help/dsl/docs/quick-map.md +36 -23
  215. package/dist/help/dsl/docs/recipe.file-layout.md +15 -0
  216. package/dist/help/dsl/docs/recipe.import-boundary.md +92 -0
  217. package/dist/help/dsl/docs/recipe.safe-artifact-probing.md +68 -0
  218. package/dist/help/dsl/docs/recipe.unfamiliar-area.md +64 -0
  219. package/dist/help/dsl/docs/recipes.md +20 -0
  220. package/dist/help/dsl/docs/rename.md +19 -27
  221. package/dist/help/dsl/docs/renameFile.md +36 -0
  222. package/dist/help/dsl/docs/rg.md +22 -0
  223. package/dist/help/dsl/docs/rules.md +26 -0
  224. package/dist/help/dsl/docs/selectors.md +3 -2
  225. package/dist/help/dsl/docs/session.md +1 -1
  226. package/dist/help/dsl/full.md +236 -437
  227. package/dist/help/dsl/help-index.md +49 -0
  228. package/dist/help/dsl/snippets/agents.md +2 -2
  229. package/dist/help/dsl/tokens/qr.inline.examples.md +2 -0
  230. package/dist/help/dsl/tokens/stdin.examples.bash.md +8 -0
  231. package/dist/help/dsl/tokens/stdin.examples.pwsh.md +8 -0
  232. package/dist/help/dsl/tokens/stdin.examples.with-qr.bash.md +12 -0
  233. package/dist/help/dsl/tokens/stdin.examples.with-qr.pwsh.md +12 -0
  234. package/dist/help/dsl/topics/basics.md +1 -1
  235. package/dist/help/dsl/topics/config-setup.import-normalize.md +65 -65
  236. package/dist/help/dsl/topics/config-setup.import-rules.md +6 -5
  237. package/dist/help/dsl/topics/dsl.md +4 -3
  238. package/dist/help/dsl/topics/first-setup.md +6 -5
  239. package/dist/help/dsl/topics/help-protocol.md +4 -3
  240. package/dist/help/dsl/topics/import.base.md +36 -0
  241. package/dist/help/dsl/topics/import.rebase.md +83 -0
  242. package/dist/help/dsl/topics/inspect.aliasCandidates.md +37 -0
  243. package/dist/help/dsl/topics/inspect.code.md +5 -11
  244. package/dist/help/dsl/topics/inspect.deps.md +7 -7
  245. package/dist/help/dsl/topics/inspect.file.md +10 -18
  246. package/dist/help/dsl/topics/inspect.graph.md +6 -20
  247. package/dist/help/dsl/topics/{inspect.md → inspect.shared.md} +18 -17
  248. package/dist/help/dsl/topics/modulePlan.md +21 -26
  249. package/dist/help/dsl/topics/move.md +17 -18
  250. package/dist/help/dsl/topics/moveToDir.md +44 -0
  251. package/dist/help/dsl/topics/mutate.mixed.md +32 -0
  252. package/dist/help/dsl/topics/mutation.shared.md +53 -0
  253. package/dist/help/dsl/topics/patterns.md +3 -16
  254. package/dist/help/dsl/topics/qr.md +13 -22
  255. package/dist/help/dsl/topics/quick-map.md +36 -23
  256. package/dist/help/dsl/topics/recipe.file-layout.md +13 -0
  257. package/dist/help/dsl/topics/recipe.import-boundary.md +90 -0
  258. package/dist/help/dsl/topics/recipe.safe-artifact-probing.md +66 -0
  259. package/dist/help/dsl/topics/recipe.unfamiliar-area.md +62 -0
  260. package/dist/help/dsl/topics/recipes.md +18 -0
  261. package/dist/help/dsl/topics/rename.md +15 -15
  262. package/dist/help/dsl/topics/renameFile.md +34 -0
  263. package/dist/help/dsl/topics/rg.md +20 -0
  264. package/dist/help/dsl/topics/rules.md +24 -0
  265. package/dist/help/dsl/topics/selectors.md +3 -2
  266. package/dist/help/dsl/topics/session.md +1 -1
  267. package/dist/help/full.md +236 -437
  268. package/dist/help/help-index.md +49 -0
  269. package/dist/help/help-meta.json +114 -48
  270. package/dist/help/index.md +76 -87
  271. package/dist/help/snippets/agents.md +2 -2
  272. package/dist/help/tokens/qr.inline.examples.md +2 -0
  273. package/dist/help/tokens/stdin.examples.bash.md +8 -0
  274. package/dist/help/tokens/stdin.examples.pwsh.md +8 -0
  275. package/dist/help/tokens/stdin.examples.with-qr.bash.md +12 -0
  276. package/dist/help/tokens/stdin.examples.with-qr.pwsh.md +12 -0
  277. package/dist/help/topics/basics.md +1 -1
  278. package/dist/help/topics/config-setup.import-normalize.md +65 -65
  279. package/dist/help/topics/config-setup.import-rules.md +6 -5
  280. package/dist/help/topics/dsl.md +4 -3
  281. package/dist/help/topics/first-setup.md +6 -5
  282. package/dist/help/topics/help-protocol.md +4 -3
  283. package/dist/help/topics/import.base.md +36 -0
  284. package/dist/help/topics/import.rebase.md +83 -0
  285. package/dist/help/topics/inspect.aliasCandidates.md +37 -0
  286. package/dist/help/topics/inspect.code.md +5 -11
  287. package/dist/help/topics/inspect.deps.md +7 -7
  288. package/dist/help/topics/inspect.file.md +10 -18
  289. package/dist/help/topics/inspect.graph.md +6 -20
  290. package/dist/help/topics/{inspect.md → inspect.shared.md} +18 -17
  291. package/dist/help/topics/modulePlan.md +21 -26
  292. package/dist/help/topics/move.md +17 -18
  293. package/dist/help/topics/moveToDir.md +44 -0
  294. package/dist/help/topics/mutate.mixed.md +32 -0
  295. package/dist/help/topics/mutation.shared.md +53 -0
  296. package/dist/help/topics/patterns.md +3 -16
  297. package/dist/help/topics/qr.md +13 -22
  298. package/dist/help/topics/quick-map.md +36 -23
  299. package/dist/help/topics/recipe.file-layout.md +13 -0
  300. package/dist/help/topics/recipe.import-boundary.md +90 -0
  301. package/dist/help/topics/recipe.safe-artifact-probing.md +66 -0
  302. package/dist/help/topics/recipe.unfamiliar-area.md +62 -0
  303. package/dist/help/topics/recipes.md +18 -0
  304. package/dist/help/topics/rename.md +15 -15
  305. package/dist/help/topics/renameFile.md +34 -0
  306. package/dist/help/topics/rg.md +20 -0
  307. package/dist/help/topics/rules.md +24 -0
  308. package/dist/help/topics/selectors.md +3 -2
  309. package/dist/help/topics/session.md +1 -1
  310. package/dist/host/capabilities.js +56 -0
  311. package/dist/imports/standalone-import-analysis.js +602 -0
  312. package/dist/imports/standalone-import-model.js +2 -0
  313. package/dist/imports/standalone-import-process.js +66 -0
  314. package/dist/imports/standalone-import-worker.js +27 -0
  315. package/dist/imports/standalone-ts-project.js +147 -0
  316. package/dist/inspect/inspect-duplicates-service.js +526 -0
  317. package/dist/inspect/inspect-reverse-module-closure.js +338 -0
  318. package/dist/inspect/inspect-source-ranges.js +82 -0
  319. package/dist/inspect/inspect-source-shape.js +649 -0
  320. package/dist/inspect/standalone-inspect-analysis.js +319 -0
  321. package/dist/inspect/standalone-inspect-model.js +9 -0
  322. package/dist/inspect/standalone-inspect-process.js +55 -0
  323. package/dist/inspect/standalone-inspect-usages.js +274 -0
  324. package/dist/inspect/standalone-inspect-worker.js +13 -0
  325. package/dist/metrics/central-metrics.js +101 -2
  326. package/dist/mutation/concrete-edit-plan.js +157 -0
  327. package/dist/mutation/exports-star-collapse-preview.js +361 -0
  328. package/dist/mutation/exports-star-expand-apply.js +373 -0
  329. package/dist/mutation/exports-star-expand-preview.js +807 -0
  330. package/dist/mutation/file-impact-scan.js +182 -0
  331. package/dist/mutation/file-mutation-discovery.js +674 -0
  332. package/dist/mutation/file-mutation-eta.js +99 -0
  333. package/dist/mutation/file-mutation-standalone-apply.js +584 -0
  334. package/dist/mutation/file-mutation-standalone-planner.js +500 -0
  335. package/dist/mutation/file-mutation-tsserver-session.js +473 -0
  336. package/dist/mutation/mutation-estimate.js +45 -0
  337. package/dist/mutation/mutation-plan.js +467 -0
  338. package/dist/mutation/object-mutation-foundation.js +2 -0
  339. package/dist/mutation/object-mutation-partition.js +148 -0
  340. package/dist/mutation/object-pack-semantic-apply.js +507 -0
  341. package/dist/mutation/object-pack-semantic-preview.js +984 -0
  342. package/dist/mutation/object-unpack-semantic-preview.js +993 -0
  343. package/dist/mutation/package-manifest-impact.js +176 -0
  344. package/dist/mutation/rename-owner-worker-child.js +37 -0
  345. package/dist/mutation/rename-owner-worker.js +122 -0
  346. package/dist/mutation/runtime-cycle-query.js +66 -0
  347. package/dist/mutation/semantic-execution-progress.js +63 -0
  348. package/dist/mutation/semantic-export-index.js +474 -0
  349. package/dist/mutation/semantic-impact-scan.js +434 -0
  350. package/dist/mutation/semantic-model.js +2 -0
  351. package/dist/mutation/semantic-move-best-effort-planner.js +209 -0
  352. package/dist/mutation/semantic-move-config-worker-child.js +61 -0
  353. package/dist/mutation/semantic-move-config-worker.js +449 -0
  354. package/dist/mutation/semantic-move-declarations.js +94 -0
  355. package/dist/mutation/semantic-move-metrics.js +119 -0
  356. package/dist/mutation/semantic-move-model.js +2 -0
  357. package/dist/mutation/semantic-move-owner-authority.js +122 -0
  358. package/dist/mutation/semantic-move-owner-candidates.js +300 -0
  359. package/dist/mutation/semantic-move-owner-divergence-harness.js +474 -0
  360. package/dist/mutation/semantic-move-owner-divergence-runner.js +162 -0
  361. package/dist/mutation/semantic-move-plan-hash.js +56 -0
  362. package/dist/mutation/semantic-move-policy.js +360 -0
  363. package/dist/mutation/semantic-move-process.js +218 -0
  364. package/dist/mutation/semantic-move-provider-diagnostics.js +27 -0
  365. package/dist/mutation/semantic-move-standalone-engine.js +919 -0
  366. package/dist/mutation/semantic-move-standalone-planner.js +1553 -0
  367. package/dist/mutation/semantic-move-transaction.js +639 -0
  368. package/dist/mutation/semantic-mutation-engine.js +478 -0
  369. package/dist/mutation/semantic-mutation-runtime.js +521 -0
  370. package/dist/mutation/semantic-planner-retry.js +26 -0
  371. package/dist/mutation/semantic-program-roots.js +69 -0
  372. package/dist/mutation/semantic-rename-commonjs.js +229 -0
  373. package/dist/mutation/semantic-rename-config-worker-child.js +46 -0
  374. package/dist/mutation/semantic-rename-config-worker.js +498 -0
  375. package/dist/mutation/semantic-rename-locations.js +192 -0
  376. package/dist/mutation/semantic-rename-model.js +2 -0
  377. package/dist/mutation/semantic-rename-process.js +210 -0
  378. package/dist/mutation/semantic-rename-standalone-engine.js +302 -0
  379. package/dist/mutation/semantic-rename-standalone-planner.js +567 -0
  380. package/dist/mutation/semantic-rename-transaction.js +333 -0
  381. package/dist/mutation/semantic-unused-import-cleanup.js +248 -0
  382. package/dist/mutation/semantic-worker-retry.js +40 -0
  383. package/dist/mutation/semantic-workspace.js +804 -0
  384. package/dist/mutation/targeted-import-canonicalizer.js +359 -0
  385. package/dist/observability/config.js +206 -1
  386. package/dist/observability/context.js +59 -1
  387. package/dist/observability/failure-snapshot.js +124 -2
  388. package/dist/observability/recent.js +63 -2
  389. package/dist/payloads/read-stdin-json.js +212 -1
  390. package/dist/rg-wrapper/core.js +714 -0
  391. package/dist/rg-wrapper/options.js +125 -0
  392. package/dist/rtk-wrapper/core.js +144 -0
  393. package/dist/rtk-wrapper/git-safety.js +203 -0
  394. package/dist/rtk-wrapper/output-adapter.js +106 -0
  395. package/dist/runtime/buffered-process.js +114 -0
  396. package/dist/runtime/bundled-node.js +97 -1
  397. package/dist/runtime/command-lifecycle.js +2 -0
  398. package/dist/runtime/input-source.js +238 -1
  399. package/dist/runtime/node-cli-identity.js +37 -0
  400. package/dist/runtime/run-command.js +191 -1
  401. package/dist/selectors/parse-entities.js +84 -1
  402. package/dist/semantic/semantic-context-pool.js +830 -0
  403. package/dist/semantic/semantic-context-provider.js +416 -0
  404. package/dist/semantic/semantic-resident-admission.js +38 -0
  405. package/dist/semantic/semantic-worker-child.js +40 -0
  406. package/dist/semantic/semantic-worker-manager.js +460 -0
  407. package/dist/semantic/semantic-worker-protocol.js +2 -0
  408. package/dist/semantic/semantic-worker-runtime.js +38 -0
  409. package/dist/semantic/workspace-semantic-context-pools.js +136 -0
  410. package/dist/session/client.js +359 -1
  411. package/dist/session/daemon-state.js +185 -0
  412. package/dist/session/external-tool-coordinator.js +88 -0
  413. package/dist/session/external-tool-request.js +52 -0
  414. package/dist/session/lane-owner.js +116 -0
  415. package/dist/session/paths.js +71 -1
  416. package/dist/session/runtime-lifecycle.js +225 -0
  417. package/dist/session/runtime-shutdown.js +95 -0
  418. package/dist/session/server.js +1194 -8
  419. package/dist/session/session-health.js +27 -0
  420. package/dist/shared/agent-text.js +29 -1
  421. package/dist/shared/errors.js +496 -30
  422. package/dist/shared/event-loop.js +6 -1
  423. package/dist/shared/hints.js +37 -1
  424. package/dist/shared/metrics.js +43 -1
  425. package/dist/shared/presentation.js +69 -4
  426. package/dist/shared/stdin-examples.js +77 -3
  427. package/dist/shared/stdout.js +6 -2
  428. package/dist/shared/types.js +23 -1
  429. package/dist/tool-runtime/runtime-tools.js +120 -0
  430. package/dist/topology/availability.js +663 -0
  431. package/dist/topology/cache.js +130 -0
  432. package/dist/topology/candidates.js +372 -0
  433. package/dist/topology/core.js +903 -0
  434. package/dist/topology/dependency-snapshot.js +189 -0
  435. package/dist/topology/model.js +2 -0
  436. package/dist/topology/scope.js +100 -0
  437. package/dist/topology/ts-oracle-batch.js +529 -0
  438. package/dist/topology/ts-oracle-host.js +69 -0
  439. package/dist/topology/ts-oracle-model.js +2 -0
  440. package/dist/topology/ts-oracle.js +224 -0
  441. package/dist/topology/tsconfig-loader.js +105 -0
  442. package/dist/topology/workspace-project-index.js +542 -0
  443. package/dist/tracing/config.js +192 -2
  444. package/dist/tracing/failure-summary.js +100 -0
  445. package/dist/tracing/trace.js +318 -5
  446. package/dist/tsc-wrapper/core.js +697 -0
  447. package/dist/workers/control-plane/aib-control-plane-worker.cjs +80 -0
  448. package/dist/workers/control-plane/client-config.default.json +3 -0
  449. package/dist/workers/lexical-worker-child.js +27 -0
  450. package/dist/workers/lexical-worker-manager.js +394 -0
  451. package/dist/workers/lexical-worker-protocol.js +2 -0
  452. package/dist/workers/lexical-worker-runtime.js +25 -0
  453. package/dist/workers/owned-one-shot-process.js +115 -0
  454. package/dist/workers/product-storage.js +23 -0
  455. package/dist/workers/registry.js +241 -0
  456. package/package.json +8 -11
  457. package/runtimes/tools/rg/darwin-arm64/rg +0 -0
  458. package/runtimes/tools/rg/darwin-x64/rg +0 -0
  459. package/runtimes/tools/rg/linux-arm64/rg +0 -0
  460. package/runtimes/tools/rg/linux-x64/rg +0 -0
  461. package/runtimes/tools/rg/manifest.json +36 -0
  462. package/runtimes/tools/rg/win32-x64/rg.exe +0 -0
  463. package/runtimes/tools/rtk/darwin-arm64/rtk +0 -0
  464. package/runtimes/tools/rtk/darwin-x64/rtk +0 -0
  465. package/runtimes/tools/rtk/linux-arm64/rtk +0 -0
  466. package/runtimes/tools/rtk/linux-x64/rtk +0 -0
  467. package/runtimes/tools/rtk/manifest.json +36 -0
  468. package/runtimes/tools/rtk/win32-x64/rtk.exe +0 -0
  469. package/scripts/postinstall.cjs +29 -29
  470. package/scripts/provision-runtime.cjs +411 -459
  471. package/dist/client/http-client.js +0 -1
  472. package/dist/client/transport-options.js +0 -1
  473. package/dist/client/websocket-client.js +0 -1
  474. package/dist/commands/entity-resolution.js +0 -1
  475. package/dist/commands/inspect-symbol-query.js +0 -1
  476. package/dist/commands/list-instances.js +0 -1
  477. package/dist/commands/module-plan-command.js +0 -1
  478. package/dist/commands/move-command.js +0 -1
  479. package/dist/commands/move-to-file.js +0 -2
  480. package/dist/commands/ping.js +0 -1
  481. package/dist/commands/refactor-command.js +0 -1
  482. package/dist/commands/rename-command.js +0 -1
  483. package/dist/commands/runtime-command.js +0 -4
  484. package/dist/commands/runtime-info.js +0 -1
  485. package/dist/commands/validate-module-plan.js +0 -2
  486. package/dist/compatibility/policy.js +0 -1
  487. package/dist/config/auto-start-ide.js +0 -1
  488. package/dist/discovery/registry.js +0 -1
  489. package/dist/discovery/select-instance.js +0 -1
  490. package/dist/help/docs/mutation.md +0 -50
  491. package/dist/help/docs/refactor.batch.md +0 -44
  492. package/dist/help/dsl/docs/mutation.md +0 -50
  493. package/dist/help/dsl/docs/refactor.batch.md +0 -44
  494. package/dist/help/dsl/topics/mutation.md +0 -48
  495. package/dist/help/dsl/topics/refactor.batch.md +0 -33
  496. package/dist/help/json/bootstrap.md +0 -1085
  497. package/dist/help/json/docs/basics.md +0 -15
  498. package/dist/help/json/docs/config-setup.aliases.md +0 -56
  499. package/dist/help/json/docs/config-setup.excludes.md +0 -45
  500. package/dist/help/json/docs/config-setup.import-normalize.md +0 -86
  501. package/dist/help/json/docs/config-setup.import-rules.md +0 -96
  502. package/dist/help/json/docs/config-setup.tsconfigs.md +0 -33
  503. package/dist/help/json/docs/dsl.md +0 -25
  504. package/dist/help/json/docs/first-setup.md +0 -292
  505. package/dist/help/json/docs/help-format.md +0 -9
  506. package/dist/help/json/docs/help-protocol.md +0 -26
  507. package/dist/help/json/docs/imports.normalize.md +0 -47
  508. package/dist/help/json/docs/inspect.code.md +0 -41
  509. package/dist/help/json/docs/inspect.cycles.md +0 -38
  510. package/dist/help/json/docs/inspect.deps.md +0 -46
  511. package/dist/help/json/docs/inspect.duplicates.md +0 -65
  512. package/dist/help/json/docs/inspect.exports.md +0 -40
  513. package/dist/help/json/docs/inspect.file.md +0 -38
  514. package/dist/help/json/docs/inspect.graph.md +0 -139
  515. package/dist/help/json/docs/inspect.imports.md +0 -15
  516. package/dist/help/json/docs/inspect.md +0 -88
  517. package/dist/help/json/docs/inspect.members.md +0 -32
  518. package/dist/help/json/docs/inspect.tree.md +0 -32
  519. package/dist/help/json/docs/inspect.usages.md +0 -61
  520. package/dist/help/json/docs/modulePlan.md +0 -73
  521. package/dist/help/json/docs/move.md +0 -56
  522. package/dist/help/json/docs/mutation.md +0 -65
  523. package/dist/help/json/docs/patterns.md +0 -76
  524. package/dist/help/json/docs/prefs.md +0 -40
  525. package/dist/help/json/docs/qr.md +0 -37
  526. package/dist/help/json/docs/quick-map.md +0 -30
  527. package/dist/help/json/docs/refactor.batch.md +0 -72
  528. package/dist/help/json/docs/rename.md +0 -47
  529. package/dist/help/json/docs/reveal.md +0 -30
  530. package/dist/help/json/docs/selectors.md +0 -23
  531. package/dist/help/json/docs/session.md +0 -77
  532. package/dist/help/json/docs/view.md +0 -30
  533. package/dist/help/json/full.md +0 -1085
  534. package/dist/help/json/snippets/agents.md +0 -14
  535. package/dist/help/json/topics/basics.md +0 -13
  536. package/dist/help/json/topics/config-setup.aliases.md +0 -54
  537. package/dist/help/json/topics/config-setup.excludes.md +0 -43
  538. package/dist/help/json/topics/config-setup.import-normalize.md +0 -84
  539. package/dist/help/json/topics/config-setup.import-rules.md +0 -94
  540. package/dist/help/json/topics/config-setup.tsconfigs.md +0 -31
  541. package/dist/help/json/topics/dsl.md +0 -23
  542. package/dist/help/json/topics/first-setup.md +0 -290
  543. package/dist/help/json/topics/help-format.md +0 -7
  544. package/dist/help/json/topics/help-protocol.md +0 -24
  545. package/dist/help/json/topics/imports.normalize.md +0 -45
  546. package/dist/help/json/topics/inspect.code.md +0 -39
  547. package/dist/help/json/topics/inspect.cycles.md +0 -36
  548. package/dist/help/json/topics/inspect.deps.md +0 -44
  549. package/dist/help/json/topics/inspect.duplicates.md +0 -37
  550. package/dist/help/json/topics/inspect.exports.md +0 -38
  551. package/dist/help/json/topics/inspect.file.md +0 -36
  552. package/dist/help/json/topics/inspect.graph.md +0 -137
  553. package/dist/help/json/topics/inspect.imports.md +0 -13
  554. package/dist/help/json/topics/inspect.md +0 -86
  555. package/dist/help/json/topics/inspect.members.md +0 -30
  556. package/dist/help/json/topics/inspect.tree.md +0 -22
  557. package/dist/help/json/topics/inspect.usages.md +0 -59
  558. package/dist/help/json/topics/modulePlan.md +0 -60
  559. package/dist/help/json/topics/move.md +0 -46
  560. package/dist/help/json/topics/mutation.md +0 -63
  561. package/dist/help/json/topics/patterns.md +0 -74
  562. package/dist/help/json/topics/prefs.md +0 -38
  563. package/dist/help/json/topics/qr.md +0 -35
  564. package/dist/help/json/topics/quick-map.md +0 -28
  565. package/dist/help/json/topics/refactor.batch.md +0 -61
  566. package/dist/help/json/topics/rename.md +0 -42
  567. package/dist/help/json/topics/reveal.md +0 -28
  568. package/dist/help/json/topics/selectors.md +0 -21
  569. package/dist/help/json/topics/session.md +0 -59
  570. package/dist/help/json/topics/view.md +0 -28
  571. package/dist/help/topics/mutation.md +0 -48
  572. package/dist/help/topics/refactor.batch.md +0 -33
  573. package/dist/ide-launch/common.cjs +0 -162
  574. package/dist/managed-host/extension-vsix-resolver.js +0 -1
  575. package/dist/managed-host/manage-serve-web-host.cjs +0 -141
  576. package/dist/managed-host/serve-web-autostart.js +0 -1
  577. package/dist/managed-host/serve-web-host.cjs +0 -1904
  578. package/dist/runtime/managed-runtime-provisioning.js +0 -1
  579. package/dist/shared/diagnostic-catalog.js +0 -1
  580. package/dist/shared/diagnostics.js +0 -1
  581. package/dist/shared/operations.js +0 -1
  582. package/dist/shared/protocol.js +0 -1
  583. package/dist/shared/routes.js +0 -1
  584. package/extension/vscode-refactor-bridge-extension.vsix +0 -0
  585. package/runtimes/launcher/linux-x64/aib +0 -0
  586. package/runtimes/launcher/win-x64/aib.exe +0 -0
@@ -0,0 +1,805 @@
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.AGENT_DX_TESTING = void 0;
37
+ exports.collectUnknownFlagSignal = collectUnknownFlagSignal;
38
+ exports.recordAgentDxObservation = recordAgentDxObservation;
39
+ exports.collectAgentDxObservationSignals = collectAgentDxObservationSignals;
40
+ exports.applyAgentDxSignals = applyAgentDxSignals;
41
+ const node_crypto_1 = require("node:crypto");
42
+ const fs = __importStar(require("node:fs"));
43
+ const path = __importStar(require("node:path"));
44
+ const product_storage_1 = require("../config/product-storage");
45
+ const env_vars_1 = require("../config/env-vars");
46
+ const session_workspace_1 = require("../commands/session-workspace");
47
+ const presentation_1 = require("./presentation");
48
+ const AGENT_TEXT_FIELD = "__aibText";
49
+ function collectUnknownFlagSignal(input) {
50
+ const valueFlags = input.valueFlags ?? new Set();
51
+ const unknownFlags = [];
52
+ for (let index = 0; index < input.args.length; index += 1) {
53
+ const current = input.args[index] ?? "";
54
+ if (!current.startsWith("-") || current === "--") {
55
+ continue;
56
+ }
57
+ if (input.knownFlags.has(current)) {
58
+ if (valueFlags.has(current)) {
59
+ index += 1;
60
+ }
61
+ continue;
62
+ }
63
+ unknownFlags.push(current);
64
+ }
65
+ if (unknownFlags.length === 0) {
66
+ return null;
67
+ }
68
+ return {
69
+ kind: "unknownFlag",
70
+ command: input.command,
71
+ flags: uniqueStrings(unknownFlags),
72
+ ...(input.helpRefs ? { helpRefs: input.helpRefs } : {}),
73
+ ...(input.suggestions ? { suggestions: input.suggestions } : {})
74
+ };
75
+ }
76
+ function recordAgentDxObservation(cwd, observation) {
77
+ collectAgentDxObservationSignals(cwd, observation);
78
+ }
79
+ function collectAgentDxObservationSignals(cwd, observation) {
80
+ const policy = resolveAgentDxPolicy();
81
+ const state = readAgentDxState(cwd);
82
+ const nowMs = Date.now();
83
+ const stored = {
84
+ ...observation,
85
+ targets: observation.targets.filter((target) => target.length > 0).slice(0, 20),
86
+ atMs: nowMs
87
+ };
88
+ state.observations = trimObservations([...state.observations, stored], nowMs, policy);
89
+ state.updatedAt = new Date(nowMs).toISOString();
90
+ const signals = buildObservationSignals(state, stored, nowMs, policy);
91
+ writeAgentDxState(state);
92
+ return signals;
93
+ }
94
+ function applyAgentDxSignals(cwd, response, signals) {
95
+ const persistentSignals = mergeAgentDxSignals(signals.filter((signal) => Boolean(signal)));
96
+ if (persistentSignals.length === 0) {
97
+ return response;
98
+ }
99
+ const state = readAgentDxState(cwd);
100
+ const now = new Date().toISOString();
101
+ for (const signal of persistentSignals) {
102
+ const key = signalKey(signal);
103
+ const item = state.signals[key] ?? {
104
+ count: 0,
105
+ firstSeenAt: now,
106
+ lastSeenAt: now,
107
+ shownCount: 0
108
+ };
109
+ item.count += 1;
110
+ item.lastSeenAt = now;
111
+ if (buildReminder(signal)) {
112
+ item.shownCount += 1;
113
+ item.lastShownAt = now;
114
+ }
115
+ state.signals[key] = item;
116
+ }
117
+ state.updatedAt = now;
118
+ writeAgentDxState(state);
119
+ const reminders = buildReminders(mergeAgentDxResponseSignals(persistentSignals));
120
+ if (reminders.length === 0) {
121
+ return response;
122
+ }
123
+ const nextResponse = {
124
+ ...response,
125
+ agentDx: {
126
+ schemaVersion: 1,
127
+ reminders: reminders.map((reminder) => ({
128
+ kind: reminder.kind,
129
+ level: reminder.level,
130
+ command: reminder.command,
131
+ flags: reminder.flags,
132
+ textLines: reminder.textLines,
133
+ ...(reminder.helpRefs ? { helpRefs: reminder.helpRefs } : {}),
134
+ ...(reminder.suggestions ? { suggestions: reminder.suggestions } : {})
135
+ }))
136
+ }
137
+ };
138
+ const existingText = nextResponse[AGENT_TEXT_FIELD];
139
+ if (typeof existingText === "string" && existingText !== "") {
140
+ nextResponse[AGENT_TEXT_FIELD] = (0, presentation_1.appendAgentDxText)(existingText, nextResponse);
141
+ }
142
+ return nextResponse;
143
+ }
144
+ function buildReminders(signals) {
145
+ const unknownSignals = signals.filter(isUnknownFlagSignal);
146
+ const inspectUnknown = unknownSignals.filter((signal) => signal.command.startsWith("inspect ") &&
147
+ signal.flags.length > 0);
148
+ const mutateUnknown = unknownSignals.filter((signal) => signal.command.startsWith("mutate ") &&
149
+ signal.flags.length > 0);
150
+ const inspectKeys = new Set(inspectUnknown.map((signal) => signalKey(signal)));
151
+ const mutateKeys = new Set(mutateUnknown.map((signal) => signalKey(signal)));
152
+ const reminders = signals
153
+ .filter((signal) => !inspectKeys.has(signalKey(signal)) && !mutateKeys.has(signalKey(signal)))
154
+ .map(buildReminder)
155
+ .filter((reminder) => reminder !== null);
156
+ if (inspectUnknown.length === 1) {
157
+ const reminder = buildReminder(inspectUnknown[0]);
158
+ if (reminder) {
159
+ reminders.push(reminder);
160
+ }
161
+ }
162
+ else if (inspectUnknown.length > 1) {
163
+ reminders.push(buildInspectUnknownFlagReminder(inspectUnknown));
164
+ }
165
+ if (mutateUnknown.length > 0) {
166
+ reminders.push(buildMutateUnknownFlagReminder(mutateUnknown));
167
+ }
168
+ return reminders;
169
+ }
170
+ function buildInspectUnknownFlagReminder(signals) {
171
+ const byFlags = new Map();
172
+ const helpRefs = mergeHelpRefs(...signals.map((signal) => signal.helpRefs));
173
+ for (const signal of signals) {
174
+ const flags = uniqueStrings(signal.flags);
175
+ const key = flags.join("\0");
176
+ const group = byFlags.get(key) ?? { flags, ops: [] };
177
+ const op = signal.command.slice("inspect ".length);
178
+ if (op && !group.ops.includes(op)) {
179
+ group.ops.push(op);
180
+ }
181
+ byFlags.set(key, group);
182
+ }
183
+ const helpTopics = uniqueStrings((helpRefs ?? []).map((ref) => ref.topic));
184
+ const textLines = [
185
+ "inspect request uses unsupported options:",
186
+ ...Array.from(byFlags.values()).map((group) => `${group.ops.join(", ")}: ${group.flags.join(" ")}`)
187
+ ];
188
+ if (helpTopics.length > 0) {
189
+ textLines.push(`Help: aib help ${helpTopics.join(" ")}`);
190
+ }
191
+ return {
192
+ kind: "unknownFlag",
193
+ level: "short",
194
+ command: "inspect request",
195
+ flags: uniqueStrings(signals.flatMap((signal) => signal.flags)),
196
+ textLines,
197
+ ...(helpRefs ? { helpRefs } : {})
198
+ };
199
+ }
200
+ function buildMutateUnknownFlagReminder(signals) {
201
+ const byFlags = new Map();
202
+ const helpRefs = mergeHelpRefs(...signals.map((signal) => signal.helpRefs));
203
+ for (const signal of signals) {
204
+ const flags = uniqueStrings(signal.flags);
205
+ const key = flags.join("\0");
206
+ const group = byFlags.get(key) ?? { flags, ops: [] };
207
+ const op = formatMutateUnknownFlagOperation(signal.command);
208
+ if (op && !group.ops.includes(op)) {
209
+ group.ops.push(op);
210
+ }
211
+ byFlags.set(key, group);
212
+ }
213
+ const helpTopics = uniqueStrings((helpRefs ?? []).map((ref) => ref.topic));
214
+ const textLines = [
215
+ "mutate preview uses unsupported options:",
216
+ ...Array.from(byFlags.values()).map((group) => `${group.ops.join(", ")}: ${group.flags.join(" ")}`)
217
+ ];
218
+ if (helpTopics.length > 0) {
219
+ textLines.push(`Help: aib help ${helpTopics.join(" ")}`);
220
+ }
221
+ return {
222
+ kind: "unknownFlag",
223
+ level: "short",
224
+ command: "mutate preview",
225
+ flags: uniqueStrings(signals.flatMap((signal) => signal.flags)),
226
+ textLines,
227
+ ...(helpRefs ? { helpRefs } : {})
228
+ };
229
+ }
230
+ function formatMutateUnknownFlagOperation(command) {
231
+ const op = command.slice("mutate ".length).trim();
232
+ switch (op) {
233
+ case "semantic rename":
234
+ return "rename";
235
+ case "semantic move":
236
+ return "move";
237
+ case "file moveToDir":
238
+ return "moveToDir";
239
+ case "file rename":
240
+ return "renameFile";
241
+ case "module":
242
+ return "module";
243
+ default:
244
+ return op;
245
+ }
246
+ }
247
+ function mergeAgentDxSignals(signals, keyForSignal = signalKey) {
248
+ const byCommand = new Map();
249
+ for (const signal of signals) {
250
+ const key = keyForSignal(signal);
251
+ const existing = byCommand.get(key);
252
+ if (!existing) {
253
+ byCommand.set(key, signal.kind === "unknownFlag" ? {
254
+ ...signal,
255
+ flags: uniqueStrings(signal.flags)
256
+ } : signal);
257
+ continue;
258
+ }
259
+ if (existing.kind !== "unknownFlag" || signal.kind !== "unknownFlag") {
260
+ continue;
261
+ }
262
+ existing.flags = uniqueStrings([...existing.flags, ...signal.flags]);
263
+ const helpRefs = mergeHelpRefs(existing.helpRefs, signal.helpRefs);
264
+ if (helpRefs) {
265
+ existing.helpRefs = helpRefs;
266
+ }
267
+ const suggestions = mergeSuggestions(existing.suggestions, signal.suggestions);
268
+ if (suggestions) {
269
+ existing.suggestions = suggestions;
270
+ }
271
+ }
272
+ return Array.from(byCommand.values());
273
+ }
274
+ function mergeAgentDxResponseSignals(signals) {
275
+ return mergeAgentDxSignals(signals, responseSignalKey);
276
+ }
277
+ function responseSignalKey(signal) {
278
+ return signal.kind === "unknownFlag"
279
+ ? `${signal.kind}:${signal.command}`
280
+ : signalKey(signal);
281
+ }
282
+ function isUnknownFlagSignal(signal) {
283
+ return signal.kind === "unknownFlag";
284
+ }
285
+ function mergeHelpRefs(...items) {
286
+ const merged = items.flatMap((item) => item ?? []);
287
+ if (merged.length === 0) {
288
+ return undefined;
289
+ }
290
+ const seen = new Set();
291
+ return merged.filter((item) => {
292
+ const key = `${item.topic}:${item.reason ?? ""}:${item.mode ?? ""}`;
293
+ if (seen.has(key)) {
294
+ return false;
295
+ }
296
+ seen.add(key);
297
+ return true;
298
+ });
299
+ }
300
+ function mergeSuggestions(left, right) {
301
+ const merged = [...(left ?? []), ...(right ?? [])];
302
+ if (merged.length === 0) {
303
+ return undefined;
304
+ }
305
+ const seen = new Set();
306
+ return merged.filter((item) => {
307
+ const key = item.command ?? item.text ?? "";
308
+ if (seen.has(key)) {
309
+ return false;
310
+ }
311
+ seen.add(key);
312
+ return true;
313
+ });
314
+ }
315
+ function buildReminder(signal) {
316
+ if (signal.kind === "batchSuggestion") {
317
+ return {
318
+ kind: "batchSuggestion",
319
+ level: "short",
320
+ command: signal.command,
321
+ flags: [],
322
+ textLines: [
323
+ `You called ${signal.command} ${signal.count} times in a row. Batch compatible reads:`,
324
+ signal.exampleCommand
325
+ ]
326
+ };
327
+ }
328
+ if (signal.kind === "inspectDslNudge") {
329
+ return {
330
+ kind: "inspectDslNudge",
331
+ level: "short",
332
+ command: `inspect ${signal.op}`,
333
+ flags: [],
334
+ textLines: formatInspectDslNudgeLines(signal)
335
+ };
336
+ }
337
+ if (signal.kind === "toolSuggestion") {
338
+ return {
339
+ kind: "toolSuggestion",
340
+ level: "short",
341
+ command: signal.command,
342
+ flags: [],
343
+ textLines: [
344
+ `You are reading many TS/JS files with ${signal.command}. Prefer focused inspect when you need symbols, imports, or code:`,
345
+ ...signal.suggestedCommands
346
+ ]
347
+ };
348
+ }
349
+ if (signal.kind !== "unknownFlag" || signal.flags.length === 0) {
350
+ return null;
351
+ }
352
+ const textLines = [
353
+ `${signal.command} does not support: ${signal.flags.join(" ")}`
354
+ ];
355
+ const suggestion = preferredSuggestion(signal.suggestions);
356
+ if (suggestion) {
357
+ textLines.push(suggestion);
358
+ }
359
+ const help = preferredHelp(signal.helpRefs);
360
+ if (help && suggestion !== `Use: aib help ${help.topic}`) {
361
+ textLines.push(`Help: aib help ${help.topic}`);
362
+ }
363
+ return {
364
+ kind: "unknownFlag",
365
+ level: "short",
366
+ command: signal.command,
367
+ flags: signal.flags,
368
+ textLines,
369
+ ...(signal.helpRefs ? { helpRefs: signal.helpRefs } : {}),
370
+ ...(signal.suggestions ? { suggestions: signal.suggestions } : {})
371
+ };
372
+ }
373
+ function formatInspectDslNudgeLines(signal) {
374
+ const intro = signal.reason === "repeatedInlineCalls"
375
+ ? `You called inspect ${signal.op} ${signal.callCount ?? signal.targets.length} times. Use inspect DSL for batched reads:`
376
+ : `You used inline multi-target inspect ${signal.op}. Prefer inspect DSL for grouped reads:`;
377
+ return [
378
+ intro,
379
+ "@'",
380
+ ...signal.exampleLines,
381
+ "'@ | aib inspect --stdin"
382
+ ];
383
+ }
384
+ function preferredSuggestion(suggestions) {
385
+ const sorted = (suggestions ?? []).slice().sort((left, right) => (left.priority ?? 100) - (right.priority ?? 100));
386
+ const first = sorted[0];
387
+ if (!first) {
388
+ return null;
389
+ }
390
+ if (first.command) {
391
+ return `Use: ${first.command}`;
392
+ }
393
+ return first.text ?? null;
394
+ }
395
+ function preferredHelp(helpRefs) {
396
+ const sorted = (helpRefs ?? []).slice().sort((left, right) => (left.priority ?? 100) - (right.priority ?? 100));
397
+ return sorted[0] ?? null;
398
+ }
399
+ function signalKey(signal) {
400
+ if (signal.kind === "batchSuggestion") {
401
+ return `${signal.kind}:${signal.command}:${signal.reason}`;
402
+ }
403
+ if (signal.kind === "toolSuggestion") {
404
+ return `${signal.kind}:${signal.command}:${signal.reason}`;
405
+ }
406
+ if (signal.kind === "inspectDslNudge") {
407
+ return `${signal.kind}:inspect:${signal.reason}:${signal.op}`;
408
+ }
409
+ return `${signal.kind}:${signal.command}:${signal.flags.slice().sort().join(",")}`;
410
+ }
411
+ exports.AGENT_DX_TESTING = {
412
+ buildReminders(signals) {
413
+ return buildReminders(mergeAgentDxResponseSignals(mergeAgentDxSignals(signals)));
414
+ }
415
+ };
416
+ function readAgentDxState(cwd) {
417
+ const scopeKey = agentDxScopeKey(cwd);
418
+ const file = agentDxStatePath(scopeKey);
419
+ try {
420
+ const parsed = JSON.parse(fs.readFileSync(file, "utf8"));
421
+ if (isObject(parsed) && parsed.version === 1 && parsed.scopeKey === scopeKey && isObject(parsed.signals)) {
422
+ return {
423
+ version: 1,
424
+ scopeKey,
425
+ updatedAt: typeof parsed.updatedAt === "string" ? parsed.updatedAt : new Date().toISOString(),
426
+ observations: Array.isArray(parsed.observations) ? normalizeObservations(parsed.observations) : [],
427
+ signals: normalizeSignals(parsed.signals)
428
+ };
429
+ }
430
+ }
431
+ catch {
432
+ // State is best-effort. Corrupt or missing state should not affect command behavior.
433
+ }
434
+ return {
435
+ version: 1,
436
+ scopeKey,
437
+ updatedAt: new Date().toISOString(),
438
+ observations: [],
439
+ signals: {}
440
+ };
441
+ }
442
+ function writeAgentDxState(state) {
443
+ try {
444
+ const file = agentDxStatePath(state.scopeKey);
445
+ fs.mkdirSync(path.dirname(file), { recursive: true });
446
+ fs.writeFileSync(file, `${JSON.stringify(state, null, 2)}\n`, "utf8");
447
+ }
448
+ catch {
449
+ // State is best-effort.
450
+ }
451
+ }
452
+ function agentDxStatePath(scopeKey) {
453
+ return path.join((0, product_storage_1.productStorageRoot)(), "agent-dx", `${safeFileName(scopeKey)}.json`);
454
+ }
455
+ function agentDxScopeKey(cwd) {
456
+ const session = (0, session_workspace_1.tryResolveCurrentSessionId)(cwd);
457
+ if (session.sessionId) {
458
+ return `session:${session.sessionId}`;
459
+ }
460
+ return `cwd:${hashText(path.resolve(cwd).toLowerCase())}`;
461
+ }
462
+ function normalizeSignals(value) {
463
+ const result = {};
464
+ for (const [key, raw] of Object.entries(value)) {
465
+ if (!isObject(raw)) {
466
+ continue;
467
+ }
468
+ result[key] = {
469
+ count: numberOrZero(raw.count),
470
+ firstSeenAt: typeof raw.firstSeenAt === "string" ? raw.firstSeenAt : new Date().toISOString(),
471
+ lastSeenAt: typeof raw.lastSeenAt === "string" ? raw.lastSeenAt : new Date().toISOString(),
472
+ shownCount: numberOrZero(raw.shownCount),
473
+ ...(typeof raw.lastShownAt === "string" ? { lastShownAt: raw.lastShownAt } : {})
474
+ };
475
+ }
476
+ return result;
477
+ }
478
+ function normalizeObservations(values) {
479
+ return values.flatMap((value) => {
480
+ if (!isObject(value)) {
481
+ return [];
482
+ }
483
+ const command = typeof value.command === "string" ? value.command : "";
484
+ const family = readObservationFamily(value.family);
485
+ const surface = readObservationSurface(value.surface);
486
+ const targets = Array.isArray(value.targets)
487
+ ? value.targets.filter((target) => typeof target === "string")
488
+ : [];
489
+ const atMs = typeof value.atMs === "number" && Number.isFinite(value.atMs) ? value.atMs : 0;
490
+ if (!command || !family || !surface || atMs <= 0) {
491
+ return [];
492
+ }
493
+ return [{
494
+ command,
495
+ family,
496
+ surface,
497
+ targets: targets.slice(0, 20),
498
+ batchable: value.batchable === true,
499
+ atMs
500
+ }];
501
+ });
502
+ }
503
+ function trimObservations(observations, nowMs, policy) {
504
+ return observations
505
+ .filter((observation) => nowMs - observation.atMs <= policy.storage.observationWindowMs)
506
+ .slice(-policy.storage.observationMaxCount);
507
+ }
508
+ function buildObservationSignals(state, current, nowMs, policy) {
509
+ if (current.command === "qr") {
510
+ return [
511
+ ...buildQrBatchSuggestionSignals(state, current, nowMs, policy),
512
+ ...buildQrOveruseSignals(state, current, nowMs, policy)
513
+ ];
514
+ }
515
+ if (current.family === "inspect") {
516
+ return buildInspectDslNudgeSignals(state, current, nowMs, policy);
517
+ }
518
+ return [];
519
+ }
520
+ function buildQrBatchSuggestionSignals(state, current, nowMs, policy) {
521
+ const config = policy.signals.repeatedQrBatch;
522
+ if (!config.enabled || current.surface !== "inline" || !current.batchable) {
523
+ return [];
524
+ }
525
+ const recent = state.observations
526
+ .filter((observation) => nowMs - observation.atMs <= config.windowMs)
527
+ .slice(-config.minCount);
528
+ if (recent.length < config.minCount || recent.some((observation) => observation.command !== "qr" ||
529
+ observation.surface !== "inline" ||
530
+ !observation.batchable ||
531
+ observation.targets.length === 0)) {
532
+ return [];
533
+ }
534
+ const signal = {
535
+ kind: "batchSuggestion",
536
+ command: "qr",
537
+ reason: "repeatedInline",
538
+ count: recent.length,
539
+ targets: uniqueStrings(recent.flatMap((observation) => observation.targets)).slice(0, 6),
540
+ exampleCommand: formatQrBatchExample(recent.flatMap((observation) => observation.targets), config.maxExampleItems, config.maxExampleChars),
541
+ windowMs: config.windowMs
542
+ };
543
+ const signalState = state.signals[signalKey(signal)];
544
+ if (signalState?.lastShownAt && nowMs - Date.parse(signalState.lastShownAt) < config.cooldownMs) {
545
+ return [];
546
+ }
547
+ return [signal];
548
+ }
549
+ function formatQrBatchExample(targets, maxItems, maxChars) {
550
+ const uniqueTargets = uniqueStrings(targets);
551
+ const selected = [];
552
+ for (const target of uniqueTargets) {
553
+ const candidate = `aib qr ${[...selected, target].join(" ")}`;
554
+ if (selected.length >= maxItems || (selected.length > 0 && candidate.length > maxChars)) {
555
+ break;
556
+ }
557
+ selected.push(target);
558
+ }
559
+ const hidden = Math.max(0, uniqueTargets.length - selected.length);
560
+ const suffix = hidden > 0 ? ` # +${hidden} more` : "";
561
+ return `aib qr ${selected.join(" ")}${suffix}`;
562
+ }
563
+ function buildInspectDslNudgeSignals(state, current, nowMs, policy) {
564
+ const config = policy.signals.inspectDslNudge;
565
+ if (!config.enabled || current.family !== "inspect" || current.surface !== "inline" || !current.batchable || current.targets.length === 0) {
566
+ return [];
567
+ }
568
+ const op = current.command.startsWith("inspect ") ? current.command.slice("inspect ".length) : "";
569
+ if (!op) {
570
+ return [];
571
+ }
572
+ if (current.targets.length > 1 && op !== "tree") {
573
+ const signal = buildInspectDslNudgeSignal({
574
+ reason: "inlineMultiTarget",
575
+ op,
576
+ targets: current.targets,
577
+ config
578
+ });
579
+ return shouldSuppressSignal(state, signal, nowMs, config.cooldownMs) ? [] : [signal];
580
+ }
581
+ const recent = state.observations
582
+ .filter((observation) => nowMs - observation.atMs <= config.windowMs &&
583
+ observation.command === current.command &&
584
+ observation.family === "inspect" &&
585
+ observation.surface === "inline" &&
586
+ observation.batchable &&
587
+ observation.targets.length > 0)
588
+ .slice(-config.minCount);
589
+ if (recent.length < config.minCount) {
590
+ return [];
591
+ }
592
+ const signal = buildInspectDslNudgeSignal({
593
+ reason: "repeatedInlineCalls",
594
+ op,
595
+ targets: recent.flatMap((observation) => observation.targets),
596
+ callCount: recent.length,
597
+ config
598
+ });
599
+ return shouldSuppressSignal(state, signal, nowMs, config.cooldownMs) ? [] : [signal];
600
+ }
601
+ function buildInspectDslNudgeSignal(input) {
602
+ const formatted = formatInspectDslExample(input.op, input.targets, input.config.maxExampleItems, input.config.maxExampleChars);
603
+ return {
604
+ kind: "inspectDslNudge",
605
+ reason: input.reason,
606
+ op: input.op,
607
+ targets: uniqueStrings(input.targets),
608
+ ...(input.callCount !== undefined ? { callCount: input.callCount } : {}),
609
+ exampleLines: formatted.lines,
610
+ hiddenCount: formatted.hiddenCount
611
+ };
612
+ }
613
+ function formatInspectDslExample(op, targets, maxItems, maxChars) {
614
+ const uniqueTargets = uniqueStrings(targets);
615
+ const lines = [];
616
+ for (const target of uniqueTargets) {
617
+ const nextLine = `${op} ${target}`;
618
+ const nextLines = [...lines, nextLine];
619
+ const nextLength = nextLines.join("\n").length;
620
+ if (lines.length >= maxItems || (lines.length > 0 && nextLength > maxChars)) {
621
+ break;
622
+ }
623
+ lines.push(nextLine);
624
+ }
625
+ const hiddenCount = Math.max(0, uniqueTargets.length - lines.length);
626
+ if (hiddenCount > 0) {
627
+ lines.push(`# +${hiddenCount} more`);
628
+ }
629
+ return { lines, hiddenCount };
630
+ }
631
+ function buildQrOveruseSignals(state, current, nowMs, policy) {
632
+ const config = policy.signals.qrOveruseTsJs;
633
+ if (!config.enabled || current.targets.filter(isCodeLikeTarget).length === 0) {
634
+ return [];
635
+ }
636
+ const recent = state.observations.filter((observation) => nowMs - observation.atMs <= config.windowMs);
637
+ const qrCodeTargets = recent
638
+ .filter((observation) => observation.command === "qr")
639
+ .flatMap((observation) => observation.targets.filter(isCodeLikeTarget));
640
+ const inspectCodeCount = recent.filter((observation) => observation.family === "inspect" &&
641
+ observation.targets.some(isCodeLikeTarget)).length;
642
+ if (qrCodeTargets.length < config.targetMinCount || inspectCodeCount > 0) {
643
+ return [];
644
+ }
645
+ const signal = {
646
+ kind: "toolSuggestion",
647
+ command: "qr",
648
+ reason: "qrOveruseTsJs",
649
+ observedCount: qrCodeTargets.length,
650
+ sampleTargets: uniqueStrings(qrCodeTargets.map(firstShellToken)).slice(0, 5),
651
+ suggestedCommands: [
652
+ "aib inspect file <file>",
653
+ "aib inspect imports <file>",
654
+ "aib inspect code <file> <selector>"
655
+ ]
656
+ };
657
+ const signalState = state.signals[signalKey(signal)];
658
+ if (signalState?.lastShownAt && nowMs - Date.parse(signalState.lastShownAt) < config.cooldownMs) {
659
+ return [];
660
+ }
661
+ return [signal];
662
+ }
663
+ function shouldSuppressSignal(state, signal, nowMs, cooldownMs) {
664
+ const signalState = state.signals[signalKey(signal)];
665
+ return Boolean(signalState?.lastShownAt && nowMs - Date.parse(signalState.lastShownAt) < cooldownMs);
666
+ }
667
+ let cachedAgentDxPolicy = null;
668
+ function resolveAgentDxPolicy() {
669
+ if (cachedAgentDxPolicy) {
670
+ return cachedAgentDxPolicy;
671
+ }
672
+ cachedAgentDxPolicy = readAgentDxPolicy();
673
+ return cachedAgentDxPolicy;
674
+ }
675
+ function readAgentDxPolicy() {
676
+ const raw = readAgentDxPolicyJson();
677
+ return mergeAgentDxPolicy(DEFAULT_AGENT_DX_POLICY, raw);
678
+ }
679
+ function readAgentDxPolicyJson() {
680
+ const paths = [
681
+ process.env[env_vars_1.CLI_ENV.agentDxPolicyConfig],
682
+ path.resolve(__dirname, "..", "..", "config", "agent-dx-policy.default.json")
683
+ ].filter((item) => typeof item === "string" && item.trim().length > 0);
684
+ for (const filePath of paths) {
685
+ try {
686
+ const parsed = JSON.parse(fs.readFileSync(filePath, "utf8"));
687
+ if (isObject(parsed)) {
688
+ return parsed;
689
+ }
690
+ }
691
+ catch {
692
+ // Policy config is best-effort; fall back to bundled defaults.
693
+ }
694
+ }
695
+ return null;
696
+ }
697
+ const DEFAULT_AGENT_DX_POLICY = {
698
+ schemaVersion: 1,
699
+ storage: {
700
+ observationWindowMs: 900000,
701
+ observationMaxCount: 200
702
+ },
703
+ signals: {
704
+ repeatedQrBatch: {
705
+ enabled: true,
706
+ windowMs: 3000,
707
+ minCount: 3,
708
+ cooldownMs: 600000,
709
+ maxExampleItems: 3,
710
+ maxExampleChars: 240
711
+ },
712
+ qrOveruseTsJs: {
713
+ enabled: true,
714
+ windowMs: 600000,
715
+ targetMinCount: 6,
716
+ cooldownMs: 900000
717
+ },
718
+ inspectDslNudge: {
719
+ enabled: true,
720
+ windowMs: 30000,
721
+ minCount: 3,
722
+ cooldownMs: 600000,
723
+ maxExampleItems: 3,
724
+ maxExampleChars: 320
725
+ }
726
+ }
727
+ };
728
+ function mergeAgentDxPolicy(base, raw) {
729
+ if (!raw) {
730
+ return base;
731
+ }
732
+ const storage = isObject(raw.storage) ? raw.storage : {};
733
+ const signals = isObject(raw.signals) ? raw.signals : {};
734
+ const repeatedQrBatch = isObject(signals.repeatedQrBatch) ? signals.repeatedQrBatch : {};
735
+ const qrOveruseTsJs = isObject(signals.qrOveruseTsJs) ? signals.qrOveruseTsJs : {};
736
+ const inspectDslNudge = isObject(signals.inspectDslNudge) ? signals.inspectDslNudge : {};
737
+ return {
738
+ schemaVersion: 1,
739
+ storage: {
740
+ observationWindowMs: readPositiveInteger(storage.observationWindowMs, base.storage.observationWindowMs),
741
+ observationMaxCount: readPositiveInteger(storage.observationMaxCount, base.storage.observationMaxCount)
742
+ },
743
+ signals: {
744
+ repeatedQrBatch: {
745
+ enabled: readBoolean(repeatedQrBatch.enabled, base.signals.repeatedQrBatch.enabled),
746
+ windowMs: readPositiveInteger(repeatedQrBatch.windowMs, base.signals.repeatedQrBatch.windowMs),
747
+ minCount: readPositiveInteger(repeatedQrBatch.minCount, base.signals.repeatedQrBatch.minCount),
748
+ cooldownMs: readPositiveInteger(repeatedQrBatch.cooldownMs, base.signals.repeatedQrBatch.cooldownMs),
749
+ maxExampleItems: readPositiveInteger(repeatedQrBatch.maxExampleItems, base.signals.repeatedQrBatch.maxExampleItems),
750
+ maxExampleChars: readPositiveInteger(repeatedQrBatch.maxExampleChars, base.signals.repeatedQrBatch.maxExampleChars)
751
+ },
752
+ qrOveruseTsJs: {
753
+ enabled: readBoolean(qrOveruseTsJs.enabled, base.signals.qrOveruseTsJs.enabled),
754
+ windowMs: readPositiveInteger(qrOveruseTsJs.windowMs, base.signals.qrOveruseTsJs.windowMs),
755
+ targetMinCount: readPositiveInteger(qrOveruseTsJs.targetMinCount, base.signals.qrOveruseTsJs.targetMinCount),
756
+ cooldownMs: readPositiveInteger(qrOveruseTsJs.cooldownMs, base.signals.qrOveruseTsJs.cooldownMs)
757
+ },
758
+ inspectDslNudge: {
759
+ enabled: readBoolean(inspectDslNudge.enabled, base.signals.inspectDslNudge.enabled),
760
+ windowMs: readPositiveInteger(inspectDslNudge.windowMs, base.signals.inspectDslNudge.windowMs),
761
+ minCount: readPositiveInteger(inspectDslNudge.minCount, base.signals.inspectDslNudge.minCount),
762
+ cooldownMs: readPositiveInteger(inspectDslNudge.cooldownMs, base.signals.inspectDslNudge.cooldownMs),
763
+ maxExampleItems: readPositiveInteger(inspectDslNudge.maxExampleItems, base.signals.inspectDslNudge.maxExampleItems),
764
+ maxExampleChars: readPositiveInteger(inspectDslNudge.maxExampleChars, base.signals.inspectDslNudge.maxExampleChars)
765
+ }
766
+ }
767
+ };
768
+ }
769
+ function readPositiveInteger(value, fallback) {
770
+ return typeof value === "number" && Number.isInteger(value) && value > 0 ? value : fallback;
771
+ }
772
+ function readBoolean(value, fallback) {
773
+ return typeof value === "boolean" ? value : fallback;
774
+ }
775
+ function isCodeLikeTarget(target) {
776
+ return /\.(?:cjs|cts|js|jsx|mjs|mts|ts|tsx)(?:\s|$)/i.test(firstShellToken(target));
777
+ }
778
+ function firstShellToken(value) {
779
+ return value.trim().split(/\s+/, 1)[0] ?? "";
780
+ }
781
+ function readObservationFamily(value) {
782
+ return value === "read" || value === "inspect" || value === "mutation" || value === "view" || value === "other"
783
+ ? value
784
+ : null;
785
+ }
786
+ function readObservationSurface(value) {
787
+ return value === "inline" || value === "stdin-dsl" || value === "json" || value === "stdin-raw"
788
+ ? value
789
+ : null;
790
+ }
791
+ function safeFileName(value) {
792
+ return value.replace(/[^a-zA-Z0-9._-]+/g, "_").slice(0, 120);
793
+ }
794
+ function hashText(value) {
795
+ return (0, node_crypto_1.createHash)("sha256").update(value).digest("hex").slice(0, 16);
796
+ }
797
+ function uniqueStrings(values) {
798
+ return Array.from(new Set(values));
799
+ }
800
+ function numberOrZero(value) {
801
+ return typeof value === "number" && Number.isFinite(value) ? value : 0;
802
+ }
803
+ function isObject(value) {
804
+ return Boolean(value) && typeof value === "object" && !Array.isArray(value);
805
+ }