@planu/cli 4.13.0 → 4.14.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (787) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/README.md +24 -24
  3. package/dist/cli/commands/inspect.d.ts +4 -0
  4. package/dist/cli/commands/inspect.js +144 -0
  5. package/dist/cli/commands/install.d.ts +19 -1
  6. package/dist/cli/commands/install.js +145 -43
  7. package/dist/cli/commands/job.d.ts +3 -0
  8. package/dist/cli/commands/job.js +119 -0
  9. package/dist/cli/commands/offline.d.ts +15 -0
  10. package/dist/cli/commands/offline.js +132 -0
  11. package/dist/cli/commands/serve.js +4 -0
  12. package/dist/cli/commands/spec.js +1 -1
  13. package/dist/cli/commands/storage.d.ts +3 -0
  14. package/dist/cli/commands/storage.js +102 -0
  15. package/dist/cli/commands/uninstall.d.ts +10 -0
  16. package/dist/cli/commands/uninstall.js +93 -7
  17. package/dist/cli/commands/validate.js +1 -1
  18. package/dist/cli/index.js +2 -0
  19. package/dist/cli/router.js +9 -1
  20. package/dist/config/crash-shield-framework-rules.json +93 -0
  21. package/dist/config/environment-schema.json +149 -0
  22. package/dist/config/hardcode-exceptions.json +4 -0
  23. package/dist/config/license-plans.json +7 -0
  24. package/dist/config/native-release-public-key.pem +3 -0
  25. package/dist/config/native-targets.json +87 -0
  26. package/dist/config/product-public.d.ts +89 -0
  27. package/dist/config/product-public.js +140 -0
  28. package/dist/config/product-public.json +312 -0
  29. package/dist/config/product-public.ts +148 -0
  30. package/dist/config/release-compatibility.json +13 -0
  31. package/dist/config/release-policy.json +26 -0
  32. package/dist/config/runtime-policy.json +44 -0
  33. package/dist/config/skill-templates/planu-validate.md +7 -4
  34. package/dist/config/subagent-templates/planu-spec-implementer.md +7 -3
  35. package/dist/config/subagent-templates/planu-validator.md +10 -5
  36. package/dist/config/technology-registry.json +120 -0
  37. package/dist/config/version.js +7 -8
  38. package/dist/config/version.ts +10 -7
  39. package/dist/engine/abortable-process-runner.js +40 -9
  40. package/dist/engine/advanced-testing/accessibility-checker.js +12 -14
  41. package/dist/engine/advanced-testing/mutation-advisor.js +3 -4
  42. package/dist/engine/advanced-testing/property-based.js +2 -3
  43. package/dist/engine/advanced-testing/test-data-advisor.js +2 -3
  44. package/dist/engine/agent-generator.js +2 -1
  45. package/dist/engine/agent-handoff-store.js +2 -1
  46. package/dist/engine/agent-prompt-generator.js +7 -5
  47. package/dist/engine/agent-telemetry.js +2 -1
  48. package/dist/engine/ai-integration/gemini/extensions-advisor.js +41 -9
  49. package/dist/engine/ambiguity-detector.js +12 -11
  50. package/dist/engine/analyzer/db-engine.js +2 -3
  51. package/dist/engine/analyzer/detectors.js +13 -14
  52. package/dist/engine/analyzer/env-setup.js +9 -10
  53. package/dist/engine/analyzer-env-scanner/env-example.js +7 -8
  54. package/dist/engine/api-spec-generator/graphql-parser.js +2 -2
  55. package/dist/engine/api-validation/graphql-schema-validator.js +2 -1
  56. package/dist/engine/api-validation/openapi-impl-validator.js +6 -7
  57. package/dist/engine/architecture-detector.js +10 -8
  58. package/dist/engine/auth/config.d.ts +1 -1
  59. package/dist/engine/auth/config.js +4 -3
  60. package/dist/engine/auto-updater/atomic-upgrade.d.ts +8 -0
  61. package/dist/engine/auto-updater/atomic-upgrade.js +381 -0
  62. package/dist/engine/auto-updater/config-detector.js +9 -3
  63. package/dist/engine/auto-updater/config-patcher.d.ts +0 -4
  64. package/dist/engine/auto-updater/config-patcher.js +10 -15
  65. package/dist/engine/auto-updater/index.d.ts +3 -1
  66. package/dist/engine/auto-updater/index.js +44 -30
  67. package/dist/engine/auto-updater/npm-registry.js +10 -2
  68. package/dist/engine/auto-updater/release-verifier.d.ts +3 -0
  69. package/dist/engine/auto-updater/release-verifier.js +112 -0
  70. package/dist/engine/auto-updater/upgrade-lock.d.ts +6 -0
  71. package/dist/engine/auto-updater/upgrade-lock.js +28 -0
  72. package/dist/engine/auto-updater/upgrade-trust-state.d.ts +7 -0
  73. package/dist/engine/auto-updater/upgrade-trust-state.js +59 -0
  74. package/dist/engine/autopilot/audit-logger.js +2 -5
  75. package/dist/engine/best-practices-library.js +2 -1
  76. package/dist/engine/browser-validator.js +2 -1
  77. package/dist/engine/build-tool-detector.js +3 -2
  78. package/dist/engine/ci-generator/context-builders.js +7 -5
  79. package/dist/engine/ci-generator/stack-detector.js +0 -2
  80. package/dist/engine/ci-generator/yaml-builder.js +0 -2
  81. package/dist/engine/claude-config-auditor/rules-auditor.js +4 -3
  82. package/dist/engine/code-transforms/typescript/ast-utils.js +2 -3
  83. package/dist/engine/complexity-budget/trivial-detector.js +2 -1
  84. package/dist/engine/compliance-test-generator/index.js +7 -2
  85. package/dist/engine/compliance-test-generator/test-formatter.js +2 -2
  86. package/dist/engine/config-health/mcp-config-checker.js +2 -1
  87. package/dist/engine/config-health/ts-checker-scripts.js +4 -3
  88. package/dist/engine/config-health/ts-checker.js +3 -2
  89. package/dist/engine/convention-injector.js +5 -7
  90. package/dist/engine/convention-scanner/convention-parser.js +3 -2
  91. package/dist/engine/core-bridge-duplicate-blocks.d.ts +3 -0
  92. package/dist/engine/core-bridge-duplicate-blocks.js +57 -0
  93. package/dist/engine/core-bridge-gaps.d.ts +4 -0
  94. package/dist/engine/core-bridge-gaps.js +75 -0
  95. package/dist/engine/core-bridge.d.ts +9 -9
  96. package/dist/engine/core-bridge.js +196 -283
  97. package/dist/engine/cost-tracking/ledger.js +2 -5
  98. package/dist/engine/coverage-gap-analyzer.js +10 -1
  99. package/dist/engine/crash-shield/detectors/framework-detector.d.ts +2 -0
  100. package/dist/engine/crash-shield/detectors/framework-detector.js +110 -192
  101. package/dist/engine/crash-shield/detectors/typescript-detector.js +2 -1
  102. package/dist/engine/dashboard/data-loader.js +2 -1
  103. package/dist/engine/data-projects-gc/gc-runner.d.ts +7 -0
  104. package/dist/engine/data-projects-gc/gc-runner.js +113 -3
  105. package/dist/engine/data-projects-gc/scanner.js +5 -1
  106. package/dist/engine/decision-store.js +11 -14
  107. package/dist/engine/deleter/core.js +5 -5
  108. package/dist/engine/dep-auditor/abandonment-data.js +2 -1
  109. package/dist/engine/dep-auditor/abandonment-registry.js +3 -1
  110. package/dist/engine/dep-auditor/cve-fetcher.js +3 -0
  111. package/dist/engine/dep-auditor/dep-duplicates-detector.js +36 -4
  112. package/dist/engine/dep-auditor/license-registry.js +2 -0
  113. package/dist/engine/dependency-evaluator.d.ts +14 -0
  114. package/dist/engine/dependency-evaluator.js +81 -0
  115. package/dist/engine/deploy/providers/fly.js +7 -7
  116. package/dist/engine/deploy/providers/netlify.js +7 -7
  117. package/dist/engine/deploy/providers/railway.js +10 -12
  118. package/dist/engine/deploy/providers/vercel.js +7 -9
  119. package/dist/engine/deprecation-scanner/pattern-loader.js +0 -2
  120. package/dist/engine/desktop-detector.js +2 -3
  121. package/dist/engine/detect-duplication.js +2 -1
  122. package/dist/engine/detectors/advanced-framework-detector/css-state-detector.js +2 -1
  123. package/dist/engine/detectors/advanced-framework-detector/legacy-detector.js +2 -3
  124. package/dist/engine/detectors/advanced-framework-detector/modern-detector.js +3 -4
  125. package/dist/engine/detectors/agent-framework-detector.js +3 -2
  126. package/dist/engine/detectors/ai-native-detector.js +4 -6
  127. package/dist/engine/detectors/cache-db-detector.js +4 -3
  128. package/dist/engine/detectors/cicd-detector.js +4 -3
  129. package/dist/engine/detectors/deployment-detector.js +11 -12
  130. package/dist/engine/detectors/frontend-perf-detector.js +14 -9
  131. package/dist/engine/detectors/library-detector-multilang-a.js +16 -3
  132. package/dist/engine/detectors/library-detector-node.js +14 -4
  133. package/dist/engine/detectors/library-detector-python.js +7 -1
  134. package/dist/engine/detectors/library-detector.js +0 -2
  135. package/dist/engine/detectors/llm-detector/provider-maps.js +3 -2
  136. package/dist/engine/detectors/mcp-candidate-detector.js +12 -16
  137. package/dist/engine/detectors/mfe-detector.js +6 -7
  138. package/dist/engine/detectors/monitoring-detector.js +4 -3
  139. package/dist/engine/detectors/otel-detector.js +3 -2
  140. package/dist/engine/detectors/otel-ecosystem-detectors.d.ts +2 -2
  141. package/dist/engine/detectors/otel-ecosystem-detectors.js +4 -3
  142. package/dist/engine/detectors/platform-specialty-detector.js +3 -5
  143. package/dist/engine/detectors/template-engine-detector.js +3 -4
  144. package/dist/engine/doc-generator/builders.js +2 -3
  145. package/dist/engine/doc-generator/mobile-distribution-guide.js +13 -17
  146. package/dist/engine/doc-generator/portal/dirty-flag-map.d.ts +2 -2
  147. package/dist/engine/doc-generator/portal/portal-regenerator.js +3 -47
  148. package/dist/engine/domain-detector.js +3 -6
  149. package/dist/engine/dynamic-knowledge/knowledge-cache.js +3 -4
  150. package/dist/engine/dynamic-knowledge/knowledge-merger.js +17 -2
  151. package/dist/engine/dynamic-knowledge/web-researcher.js +15 -14
  152. package/dist/engine/dynamic-migration-detector/manifest-readers-extended.js +0 -2
  153. package/dist/engine/e2e-test-generator.js +4 -3
  154. package/dist/engine/ecosystem-absorber/knowledge-cache.js +2 -1
  155. package/dist/engine/ecosystem-absorber/platform-crawler.js +2 -2
  156. package/dist/engine/escalator/retry-counter.js +2 -1
  157. package/dist/engine/evidence-gates/artifact-reader.d.ts +6 -0
  158. package/dist/engine/evidence-gates/artifact-reader.js +105 -21
  159. package/dist/engine/evidence-gates/lifecycle-gate.d.ts +2 -1
  160. package/dist/engine/evidence-gates/lifecycle-gate.js +54 -0
  161. package/dist/engine/execution/context.d.ts +19 -0
  162. package/dist/engine/execution/context.js +127 -0
  163. package/dist/engine/execution/deadline-io.d.ts +21 -0
  164. package/dist/engine/execution/deadline-io.js +45 -0
  165. package/dist/engine/execution/job-executor.d.ts +16 -0
  166. package/dist/engine/execution/job-executor.js +140 -0
  167. package/dist/engine/execution/job-runtime.d.ts +78 -0
  168. package/dist/engine/execution/job-runtime.js +220 -0
  169. package/dist/engine/execution/native-relevance-scorer.d.ts +6 -0
  170. package/dist/engine/execution/native-relevance-scorer.js +64 -0
  171. package/dist/engine/execution/native-worker-dispatch.d.ts +3 -0
  172. package/dist/engine/execution/native-worker-dispatch.js +46 -0
  173. package/dist/engine/execution/native-worker-protocol.d.ts +6 -0
  174. package/dist/engine/execution/native-worker-protocol.js +33 -0
  175. package/dist/engine/execution/native-worker-runtime.d.ts +4 -0
  176. package/dist/engine/execution/native-worker-runtime.js +177 -0
  177. package/dist/engine/execution/native-worker-thread.d.ts +2 -0
  178. package/dist/engine/execution/native-worker-thread.js +66 -0
  179. package/dist/engine/execution/operation-journal.d.ts +66 -0
  180. package/dist/engine/execution/operation-journal.js +260 -0
  181. package/dist/engine/execution/outbox-worker.d.ts +31 -0
  182. package/dist/engine/execution/outbox-worker.js +192 -0
  183. package/dist/engine/execution/validate-job-executor.d.ts +24 -0
  184. package/dist/engine/execution/validate-job-executor.js +342 -0
  185. package/dist/engine/execution/validate-job-payload.d.ts +5 -0
  186. package/dist/engine/execution/validate-job-payload.js +87 -0
  187. package/dist/engine/execution/validate-job-recovery.d.ts +4 -0
  188. package/dist/engine/execution/validate-job-recovery.js +47 -0
  189. package/dist/engine/execution/validate-worker-runtime.d.ts +5 -0
  190. package/dist/engine/execution/validate-worker-runtime.js +100 -0
  191. package/dist/engine/execution/validate-worker-thread.d.ts +2 -0
  192. package/dist/engine/execution/validate-worker-thread.js +71 -0
  193. package/dist/engine/execution-plan/desktop-distribution.js +3 -7
  194. package/dist/engine/execution-plan/mobile-distribution.js +4 -9
  195. package/dist/engine/execution-plan/phases.js +4 -5
  196. package/dist/engine/execution-plan/plan-utils.js +8 -5
  197. package/dist/engine/facilitate/context-loader.js +3 -9
  198. package/dist/engine/figma/code-connect-fetcher.js +9 -8
  199. package/dist/engine/filesystem-watcher/index.d.ts +3 -3
  200. package/dist/engine/filesystem-watcher/index.js +5 -5
  201. package/dist/engine/framework-detector.js +14 -15
  202. package/dist/engine/git/planu-autocommit.js +8 -7
  203. package/dist/engine/git/repository-probe.d.ts +3 -0
  204. package/dist/engine/git/repository-probe.js +13 -0
  205. package/dist/engine/global-rules-manager.js +2 -2
  206. package/dist/engine/handoff-artifacts/io.js +2 -3
  207. package/dist/engine/handoff-artifacts/schemas/red-tests-handoff.js +8 -1
  208. package/dist/engine/handoff-artifacts/schemas.d.ts +4 -0
  209. package/dist/engine/handoff-artifacts/schemas.js +5 -0
  210. package/dist/engine/hook-generator/stack-hook-templates.js +4 -4
  211. package/dist/engine/hooks/config-loader.js +1 -1
  212. package/dist/engine/hooks/context-injector.js +4 -7
  213. package/dist/engine/hooks/file-watcher.js +1 -14
  214. package/dist/engine/hooks-reconciler.js +6 -4
  215. package/dist/engine/infrastructure/component-mapper.js +5 -7
  216. package/dist/engine/infrastructure/docker-compose-generator.js +8 -10
  217. package/dist/engine/infrastructure/index.js +6 -3
  218. package/dist/engine/infrastructure/kubernetes-generator.js +2 -2
  219. package/dist/engine/infrastructure/railway-generator.js +10 -8
  220. package/dist/engine/infrastructure/signal-detector.js +6 -8
  221. package/dist/engine/infrastructure/terraform-generator.js +6 -8
  222. package/dist/engine/legal-compliance/detector.js +3 -2
  223. package/dist/engine/local-first/storage-advisor.js +5 -6
  224. package/dist/engine/macos-keychain-native-port.d.ts +5 -0
  225. package/dist/engine/macos-keychain-native-port.js +26 -0
  226. package/dist/engine/marketplace-fetcher/cache.js +3 -1
  227. package/dist/engine/mcp-config/mcp-config-writer.d.ts +2 -2
  228. package/dist/engine/mcp-config/mcp-config-writer.js +10 -8
  229. package/dist/engine/migration/db-migrator.js +2 -5
  230. package/dist/engine/migration/equivalence-mapper.js +12 -13
  231. package/dist/engine/migration/service-catalogs.js +6 -7
  232. package/dist/engine/migration/service-migrator-catalogs.js +6 -7
  233. package/dist/engine/mobile-detector-ios.js +2 -3
  234. package/dist/engine/mobile-detector.js +16 -4
  235. package/dist/engine/model-router/complexity-analyzer.js +4 -7
  236. package/dist/engine/multi-agent-review/security-analyzer.js +3 -1
  237. package/dist/engine/multi-app-detector/app-type.js +26 -21
  238. package/dist/engine/multi-app-detector/core.js +3 -2
  239. package/dist/engine/multi-teammate-review/disagreement-counter.js +2 -1
  240. package/dist/engine/multi-teammate-review/panel-orchestrator.js +0 -2
  241. package/dist/engine/mutation-config-generator.js +10 -7
  242. package/dist/engine/native-capability-policy.d.ts +4 -0
  243. package/dist/engine/native-capability-policy.js +24 -0
  244. package/dist/engine/native-platform.d.ts +3 -0
  245. package/dist/engine/native-platform.js +44 -0
  246. package/dist/engine/native-runtime-handshake.d.ts +20 -0
  247. package/dist/engine/native-runtime-handshake.js +230 -0
  248. package/dist/engine/network-policy.d.ts +27 -0
  249. package/dist/engine/network-policy.js +174 -0
  250. package/dist/engine/next-spec-resolver/dependency-filter.js +2 -22
  251. package/dist/engine/nfr-profile-detector.js +12 -16
  252. package/dist/engine/nli-keywords.js +8 -9
  253. package/dist/engine/oauth/config-guard.js +4 -5
  254. package/dist/engine/observability/local-execution-spans.d.ts +15 -0
  255. package/dist/engine/observability/local-execution-spans.js +63 -0
  256. package/dist/engine/orchestrator/runtime.js +0 -1
  257. package/dist/engine/package-registry.js +2 -6
  258. package/dist/engine/performance-analyzer.js +2 -5
  259. package/dist/engine/permissions-merger/stack-detectors.js +5 -5
  260. package/dist/engine/planu-core.darwin-arm64.node.manifest.json +39 -0
  261. package/dist/engine/planu-core.darwin-arm64.node.sbom.json +1310 -0
  262. package/dist/engine/planu-core.darwin-x64.node.manifest.json +39 -0
  263. package/dist/engine/planu-core.darwin-x64.node.sbom.json +1310 -0
  264. package/dist/engine/planu-core.linux-arm64-gnu.node.manifest.json +38 -0
  265. package/dist/engine/planu-core.linux-arm64-gnu.node.sbom.json +1310 -0
  266. package/dist/engine/planu-core.linux-arm64-musl.node.manifest.json +38 -0
  267. package/dist/engine/planu-core.linux-arm64-musl.node.sbom.json +1310 -0
  268. package/dist/engine/planu-core.linux-x64-gnu.node.manifest.json +38 -0
  269. package/dist/engine/planu-core.linux-x64-gnu.node.sbom.json +1310 -0
  270. package/dist/engine/planu-core.linux-x64-musl.node.manifest.json +38 -0
  271. package/dist/engine/planu-core.linux-x64-musl.node.sbom.json +1310 -0
  272. package/dist/engine/planu-core.win32-arm64-msvc.node.manifest.json +38 -0
  273. package/dist/engine/planu-core.win32-arm64-msvc.node.sbom.json +1310 -0
  274. package/dist/engine/planu-core.win32-x64-msvc.node.manifest.json +38 -0
  275. package/dist/engine/planu-core.win32-x64-msvc.node.sbom.json +1310 -0
  276. package/dist/engine/platform-detector/desktop.js +15 -2
  277. package/dist/engine/platform-detector/extensions.js +2 -1
  278. package/dist/engine/platform-detector/games.js +2 -1
  279. package/dist/engine/platform-detector.js +3 -2
  280. package/dist/engine/platform-engineering/idp-detector.js +2 -1
  281. package/dist/engine/plugin-installer/stack-matcher.js +9 -17
  282. package/dist/engine/plugins/lifecycle.js +6 -2
  283. package/dist/engine/prior-decisions/contradiction-detector.js +60 -30
  284. package/dist/engine/project-dna/stack-detector.js +15 -17
  285. package/dist/engine/project-graph/builder.js +11 -0
  286. package/dist/engine/project-graph/cache.js +1 -1
  287. package/dist/engine/project-graph/freshness-projection.d.ts +16 -0
  288. package/dist/engine/project-graph/freshness-projection.js +95 -0
  289. package/dist/engine/project-graph/index.d.ts +1 -0
  290. package/dist/engine/project-graph/index.js +1 -0
  291. package/dist/engine/project-graph/query.js +15 -25
  292. package/dist/engine/project-health-checker.js +3 -4
  293. package/dist/engine/project-scanner/stack-detector.js +17 -17
  294. package/dist/engine/property-test-generator.js +2 -3
  295. package/dist/engine/qa-gate.d.ts +1 -0
  296. package/dist/engine/qa-gate.js +6 -4
  297. package/dist/engine/quality-gates/gate-catalog.js +47 -46
  298. package/dist/engine/quality-gates/gate-injector.js +9 -4
  299. package/dist/engine/registry/core.js +0 -2
  300. package/dist/engine/registry/loader.js +9 -12
  301. package/dist/engine/registry/matcher.js +129 -24
  302. package/dist/engine/resilience-detector/concurrency-detector.js +4 -4
  303. package/dist/engine/resilience-detector/middleware-detector.js +11 -13
  304. package/dist/engine/resilience-detector/validation-detector.js +17 -4
  305. package/dist/engine/reverse-engineer/config-analyzer.js +9 -8
  306. package/dist/engine/reverse-engineer/orchestrator.js +5 -9
  307. package/dist/engine/reverse-engineer/test-file-parser.js +6 -3
  308. package/dist/engine/rules-generator/index.js +6 -5
  309. package/dist/engine/runtime-policy.d.ts +7 -0
  310. package/dist/engine/runtime-policy.js +101 -0
  311. package/dist/engine/runtime-security/checkers/content-security.js +21 -6
  312. package/dist/engine/runtime-security/checkers/file-permissions.js +0 -2
  313. package/dist/engine/safety/atomic-write-file.js +20 -9
  314. package/dist/engine/safety/atomic-writer.js +10 -3
  315. package/dist/engine/safety/cross-process-lock.d.ts +3 -40
  316. package/dist/engine/safety/cross-process-lock.js +268 -272
  317. package/dist/engine/safety/file-mutex.d.ts +2 -9
  318. package/dist/engine/safety/file-mutex.js +155 -87
  319. package/dist/engine/safety/health-monitor.js +15 -6
  320. package/dist/engine/safety/lock-lease-store.d.ts +79 -0
  321. package/dist/engine/safety/lock-lease-store.js +372 -0
  322. package/dist/engine/safety/lock-scavenger.d.ts +2 -5
  323. package/dist/engine/safety/lock-scavenger.js +158 -76
  324. package/dist/engine/safety/lock-staleness.js +4 -1
  325. package/dist/engine/safety/obsolete-lock-guard.d.ts +8 -0
  326. package/dist/engine/safety/obsolete-lock-guard.js +31 -0
  327. package/dist/engine/safety/transaction.js +3 -3
  328. package/dist/engine/sandbox/index.js +2 -1
  329. package/dist/engine/sandbox/runner-detect.js +3 -2
  330. package/dist/engine/sandbox/runner-docker.js +4 -3
  331. package/dist/engine/scan-project/module-discoverer.js +3 -2
  332. package/dist/engine/schema-generator.js +16 -9
  333. package/dist/engine/security-analyzer/criteria-generator.js +2 -3
  334. package/dist/engine/self-healing/healer.js +4 -4
  335. package/dist/engine/session-safeguard/learnings-buffer.d.ts +1 -2
  336. package/dist/engine/session-safeguard/learnings-buffer.js +42 -65
  337. package/dist/engine/shared-agent-memory.js +66 -74
  338. package/dist/engine/skill-adapter/command-rewriter.js +3 -2
  339. package/dist/engine/skill-adapter/index.js +3 -3
  340. package/dist/engine/skill-adapter/placeholder-map.js +3 -2
  341. package/dist/engine/skill-bootstrap/stack-matcher.js +47 -48
  342. package/dist/engine/skill-generation/stack-content-generator.js +0 -2
  343. package/dist/engine/skill-generator/workflow-skill-generator.js +2 -1
  344. package/dist/engine/skill-registry/ttl-refresh.js +3 -1
  345. package/dist/engine/skills/skills-fetcher.js +3 -6
  346. package/dist/engine/skills-reconciler.js +19 -39
  347. package/dist/engine/spec-coverage/test-finder.js +7 -6
  348. package/dist/engine/spec-diff-engine.js +3 -3
  349. package/dist/engine/spec-generator/api-key-resolver.d.ts +1 -1
  350. package/dist/engine/spec-generator/api-key-resolver.js +3 -24
  351. package/dist/engine/spec-generators/issue-extractor.js +9 -3
  352. package/dist/engine/spec-migrator/drift-detector.js +5 -13
  353. package/dist/engine/spec-migrator/filesystem-import.js +14 -10
  354. package/dist/engine/spec-migrator/planu-canonical-policy.js +10 -1
  355. package/dist/engine/spec-migrator/strict-planu-cleanup.js +24 -25
  356. package/dist/engine/spec-registry/adapter.d.ts +0 -5
  357. package/dist/engine/spec-registry/adapter.js +45 -46
  358. package/dist/engine/spec-registry/client.js +2 -0
  359. package/dist/engine/spec-source-sync.js +3 -2
  360. package/dist/engine/spec-templates/custom-loader.js +2 -3
  361. package/dist/engine/spec-templates/templates-domain-specific.js +8 -5
  362. package/dist/engine/spec-templates/templates-perf-integration.js +2 -3
  363. package/dist/engine/stack-auditor/manifest-reader.js +0 -2
  364. package/dist/engine/staleness/stale-implementing.js +7 -7
  365. package/dist/engine/tdd-scaffold-generator.js +24 -11
  366. package/dist/engine/teammate-router/green-phase-verifier.js +2 -1
  367. package/dist/engine/teammate-router/red-phase-verifier.js +2 -1
  368. package/dist/engine/technology-registry.d.ts +11 -0
  369. package/dist/engine/technology-registry.js +142 -0
  370. package/dist/engine/telemetry/error-reporter.d.ts +1 -2
  371. package/dist/engine/telemetry/error-reporter.js +11 -18
  372. package/dist/engine/telemetry/health-checker.js +5 -14
  373. package/dist/engine/telemetry/index.d.ts +0 -1
  374. package/dist/engine/telemetry/index.js +0 -1
  375. package/dist/engine/telemetry/stance.js +3 -2
  376. package/dist/engine/telemetry/telemetry-client.d.ts +1 -5
  377. package/dist/engine/telemetry/telemetry-client.js +45 -29
  378. package/dist/engine/telemetry/telemetry-store.d.ts +3 -3
  379. package/dist/engine/telemetry/telemetry-store.js +30 -23
  380. package/dist/engine/test-framework-detector/detectors.js +8 -8
  381. package/dist/engine/test-framework-detector/strategy.js +8 -9
  382. package/dist/engine/test-generators/agent-test-templates.js +2 -3
  383. package/dist/engine/test-generators/contract-test-generator.d.ts +1 -1
  384. package/dist/engine/test-generators/contract-test-generator.js +9 -202
  385. package/dist/engine/test-generators/platform-test-templates-b.js +2 -3
  386. package/dist/engine/test-generators/platform-test-templates.js +2 -5
  387. package/dist/engine/test-mocks-generator.js +4 -3
  388. package/dist/engine/test-plan-generator.js +30 -12
  389. package/dist/engine/test-scaffold-generator/advanced-scaffold.js +4 -5
  390. package/dist/engine/test-scaffold-generator/unit-scaffold.js +5 -6
  391. package/dist/engine/timing/budget.d.ts +6 -17
  392. package/dist/engine/timing/budget.js +80 -64
  393. package/dist/engine/tool-groups/group-manager.js +3 -3
  394. package/dist/engine/universal-rules/installer.js +1 -1
  395. package/dist/engine/universal-rules/rules/planu-modes.js +2 -0
  396. package/dist/engine/universal-rules/rules/planu-release-policy.js +1 -0
  397. package/dist/engine/update-notifier.js +8 -5
  398. package/dist/engine/validation/approved-spec-portability.d.ts +12 -0
  399. package/dist/engine/validation/approved-spec-portability.js +107 -0
  400. package/dist/engine/validation/durable-validation.d.ts +36 -0
  401. package/dist/engine/validation/durable-validation.js +335 -0
  402. package/dist/engine/validation/validation-freshness.d.ts +36 -0
  403. package/dist/engine/validation/validation-freshness.js +427 -0
  404. package/dist/engine/validation/validation-receipt-codec.d.ts +13 -0
  405. package/dist/engine/validation/validation-receipt-codec.js +182 -0
  406. package/dist/engine/validation/validation-receipt.d.ts +59 -0
  407. package/dist/engine/validation/validation-receipt.js +282 -0
  408. package/dist/engine/validation/validation-source-policy.d.ts +4 -0
  409. package/dist/engine/validation/validation-source-policy.js +16 -0
  410. package/dist/engine/validation/validation-submission.d.ts +36 -0
  411. package/dist/engine/validation/validation-submission.js +128 -0
  412. package/dist/engine/validation-evidence-ledger.js +41 -0
  413. package/dist/engine/validation-impact-planner.js +25 -9
  414. package/dist/engine/validator/spec-compliance-runner.d.ts +1 -1
  415. package/dist/engine/validator/spec-compliance-runner.js +17 -8
  416. package/dist/engine/validator/validation-report-writer.js +1 -1
  417. package/dist/engine/validator.js +2 -1
  418. package/dist/engine/verify-integrations/index.js +1 -1
  419. package/dist/engine/version-resolver.js +5 -6
  420. package/dist/engine/web-fetcher/stack-advisor.js +156 -92
  421. package/dist/engine/web-fetcher/stack-detector.js +114 -54
  422. package/dist/engine/workspace-manager.js +3 -2
  423. package/dist/errors/classified-degradation.d.ts +3 -0
  424. package/dist/errors/classified-degradation.js +10 -0
  425. package/dist/errors/degradation-sink.d.ts +3 -0
  426. package/dist/errors/degradation-sink.js +5 -0
  427. package/dist/errors/error-taxonomy.d.ts +12 -0
  428. package/dist/errors/error-taxonomy.js +62 -0
  429. package/dist/hosts/claude-code/ux/mcp-prompts.js +10 -4
  430. package/dist/hosts/claude-code/ux/mcp-resources.js +4 -2
  431. package/dist/hosts/codex/config-scaffold.js +4 -3
  432. package/dist/hosts/gemini/config-scaffold.js +2 -1
  433. package/dist/hosts/gemini/multimodal-spec-flow.js +7 -4
  434. package/dist/index.js +21 -6
  435. package/dist/resources/patterns.js +3 -1
  436. package/dist/resources/specs.js +3 -1
  437. package/dist/resources/templates.js +3 -1
  438. package/dist/security/adapters/environment.d.ts +12 -0
  439. package/dist/security/adapters/environment.js +25 -0
  440. package/dist/security/adapters/linux-secret-service.d.ts +8 -0
  441. package/dist/security/adapters/linux-secret-service.js +60 -0
  442. package/dist/security/adapters/macos-keychain.d.ts +18 -0
  443. package/dist/security/adapters/macos-keychain.js +90 -0
  444. package/dist/security/adapters/windows-credential-manager.d.ts +8 -0
  445. package/dist/security/adapters/windows-credential-manager.js +58 -0
  446. package/dist/security/redactor.d.ts +5 -0
  447. package/dist/security/redactor.js +58 -0
  448. package/dist/security/secret-field.d.ts +5 -0
  449. package/dist/security/secret-field.js +17 -0
  450. package/dist/security/secret-migration.d.ts +3 -0
  451. package/dist/security/secret-migration.js +123 -0
  452. package/dist/security/secret-provider.d.ts +23 -0
  453. package/dist/security/secret-provider.js +145 -0
  454. package/dist/security/secure-json.d.ts +3 -0
  455. package/dist/security/secure-json.js +29 -0
  456. package/dist/storage/api-surfaces-store.js +2 -2
  457. package/dist/storage/approval-operation-lock.d.ts +1 -1
  458. package/dist/storage/approval-operation-lock.js +5 -3
  459. package/dist/storage/audit-trail-store.d.ts +1 -1
  460. package/dist/storage/audit-trail-store.js +48 -62
  461. package/dist/storage/autopilot-log-store.js +12 -5
  462. package/dist/storage/base-store.d.ts +8 -8
  463. package/dist/storage/base-store.js +57 -20
  464. package/dist/storage/checkpoint-store.js +5 -2
  465. package/dist/storage/comments-store.js +2 -2
  466. package/dist/storage/compliance-audit-store.js +5 -2
  467. package/dist/storage/compliance-gate-config-store.js +7 -4
  468. package/dist/storage/compliance-store.js +2 -2
  469. package/dist/storage/context-profile-store.js +2 -2
  470. package/dist/storage/crash-shield-store.js +8 -4
  471. package/dist/storage/feedback-store.js +10 -6
  472. package/dist/storage/figma-store.js +8 -4
  473. package/dist/storage/file-mutex.js +9 -1
  474. package/dist/storage/gaps-log.js +7 -4
  475. package/dist/storage/global-projects-store.js +4 -2
  476. package/dist/storage/ideas-store.js +2 -2
  477. package/dist/storage/index.d.ts +5 -0
  478. package/dist/storage/index.js +5 -0
  479. package/dist/storage/knowledge-store/knowledge.js +27 -33
  480. package/dist/storage/lessons-store.js +2 -2
  481. package/dist/storage/license-store.js +13 -41
  482. package/dist/storage/migrations/canonical-storage.d.ts +15 -0
  483. package/dist/storage/migrations/canonical-storage.js +599 -0
  484. package/dist/storage/oauth-store.js +36 -8
  485. package/dist/storage/path-resolver.js +16 -3
  486. package/dist/storage/pr-store.js +2 -2
  487. package/dist/storage/project-drift-store.js +20 -8
  488. package/dist/storage/project-identity.d.ts +32 -0
  489. package/dist/storage/project-identity.js +194 -0
  490. package/dist/storage/project-resolver.js +14 -7
  491. package/dist/storage/release-notes-store.js +2 -6
  492. package/dist/storage/runtime-db.d.ts +186 -0
  493. package/dist/storage/runtime-db.js +1054 -0
  494. package/dist/storage/schema-registry.d.ts +5 -0
  495. package/dist/storage/schema-registry.js +74 -0
  496. package/dist/storage/sentry-store.js +20 -9
  497. package/dist/storage/session-state-store.js +12 -5
  498. package/dist/storage/session-store.js +12 -4
  499. package/dist/storage/skill-registry-storage.d.ts +1 -1
  500. package/dist/storage/skill-registry-storage.js +13 -11
  501. package/dist/storage/slack-store.js +10 -5
  502. package/dist/storage/spec-store.js +31 -24
  503. package/dist/storage/status-store/file-lock.js +31 -9
  504. package/dist/storage/status-store/self-healing.js +10 -5
  505. package/dist/storage/status-store/version-sync.js +8 -6
  506. package/dist/storage/steering-store.js +2 -2
  507. package/dist/storage/storage-bundle.d.ts +5 -0
  508. package/dist/storage/storage-bundle.js +117 -0
  509. package/dist/storage/storage-catalog-validation.d.ts +3 -0
  510. package/dist/storage/storage-catalog-validation.js +20 -0
  511. package/dist/storage/storage-catalog.d.ts +25 -0
  512. package/dist/storage/storage-catalog.js +390 -0
  513. package/dist/storage/storage-layout.d.ts +24 -0
  514. package/dist/storage/storage-layout.js +101 -0
  515. package/dist/storage/storybook-store.js +2 -2
  516. package/dist/storage/supabase-store.js +24 -6
  517. package/dist/storage/tdd-policy-store.js +8 -6
  518. package/dist/storage/tech-debt-store.js +3 -3
  519. package/dist/storage/technology-selection-store.d.ts +1 -1
  520. package/dist/storage/technology-selection-store.js +6 -3
  521. package/dist/storage/token-cache-store.js +3 -3
  522. package/dist/storage/token-ledger-store.js +13 -8
  523. package/dist/storage/transition-log.js +7 -4
  524. package/dist/storage/trash-store.js +15 -6
  525. package/dist/storage/vector-store/migrator.js +7 -2
  526. package/dist/storage/vector-store/sqlite-adapter.js +4 -1
  527. package/dist/storage/webhook-server-store.js +2 -2
  528. package/dist/tools/api-spec-generator-handler.js +3 -2
  529. package/dist/tools/auto-update-handler.d.ts +1 -1
  530. package/dist/tools/auto-update-handler.js +1 -1
  531. package/dist/tools/browser-validate-handler.js +2 -1
  532. package/dist/tools/challenge-spec/platform-challenge-scenarios-b.js +8 -5
  533. package/dist/tools/challenge-spec/scenarios-desktop.js +8 -3
  534. package/dist/tools/challenge-spec/scenarios-failure.js +7 -2
  535. package/dist/tools/challenge-spec/security-challenge-scenarios.js +3 -3
  536. package/dist/tools/clarify-requirements/multiple-choice.js +53 -41
  537. package/dist/tools/comments-handler.js +2 -3
  538. package/dist/tools/compliance-test-handler.js +2 -2
  539. package/dist/tools/configure-telemetry.js +11 -11
  540. package/dist/tools/create-spec/auto-pipeline.js +13 -1
  541. package/dist/tools/create-spec/autopilot-analyzer.d.ts +1 -1
  542. package/dist/tools/create-spec/autopilot-analyzer.js +2 -4
  543. package/dist/tools/create-spec/mcp-tool-contract.d.ts +10 -4
  544. package/dist/tools/create-spec/mcp-tool-contract.js +7 -36
  545. package/dist/tools/create-spec/post-creation.d.ts +2 -1
  546. package/dist/tools/create-spec/post-creation.js +56 -54
  547. package/dist/tools/create-spec/relevance-scorer.d.ts +1 -1
  548. package/dist/tools/create-spec/relevance-scorer.js +17 -1
  549. package/dist/tools/create-spec/spec-builder.js +2 -12
  550. package/dist/tools/create-spec/spec-created-outbox-consumer.d.ts +14 -0
  551. package/dist/tools/create-spec/spec-created-outbox-consumer.js +176 -0
  552. package/dist/tools/create-spec.js +385 -520
  553. package/dist/tools/define-ui-contract/agent-interaction-contract.js +2 -4
  554. package/dist/tools/define-ui-contract-desktop/desktop-contract.js +12 -4
  555. package/dist/tools/define-ui-contract-desktop/native-contract.js +7 -3
  556. package/dist/tools/define-ui-contract-extensions.js +2 -3
  557. package/dist/tools/define-ui-contract-mobile.js +5 -9
  558. package/dist/tools/define-ui-contract-web/component-tree.js +4 -3
  559. package/dist/tools/define-ui-contract.js +7 -4
  560. package/dist/tools/deploy/deploy-spec.js +2 -4
  561. package/dist/tools/deploy/deploy-status.js +2 -4
  562. package/dist/tools/design-schema/nosql-category-schemas.js +2 -3
  563. package/dist/tools/design-schema-sql/migrations.js +3 -2
  564. package/dist/tools/design-schema-sql/tables.js +4 -1
  565. package/dist/tools/design-schema.js +4 -3
  566. package/dist/tools/feedback-handler.js +2 -4
  567. package/dist/tools/gc-data-projects.js +5 -5
  568. package/dist/tools/generate-execution-plan.js +3 -4
  569. package/dist/tools/generate-sub-agent.js +2 -1
  570. package/dist/tools/generate-tests/generators/a11y-tests-generator.js +5 -4
  571. package/dist/tools/generate-tests/generators/advanced-testing-generator.js +5 -4
  572. package/dist/tools/generate-tests/generators/concurrency-test-generator/js-templates.js +9 -4
  573. package/dist/tools/generate-tests/generators/concurrency-test-generator.js +8 -4
  574. package/dist/tools/generate-tests/generators/database/detectors.js +9 -3
  575. package/dist/tools/generate-tests/generators/database/index.js +2 -4
  576. package/dist/tools/generate-tests/generators/event-test-generator.js +5 -4
  577. package/dist/tools/generate-tests/generators/game-tests-generator.js +2 -1
  578. package/dist/tools/generate-tests/generators/graphql-test-generator.js +11 -5
  579. package/dist/tools/generate-tests/generators/grpc-test-generator.js +2 -3
  580. package/dist/tools/generate-tests/generators/llm-security-test-generator.js +4 -3
  581. package/dist/tools/generate-tests/generators/local-first-test-generator.js +4 -3
  582. package/dist/tools/generate-tests/generators/mcp-tests-generator.js +11 -9
  583. package/dist/tools/generate-tests/generators/microservices/index.js +2 -3
  584. package/dist/tools/generate-tests/generators/otel-test-generator.js +6 -3
  585. package/dist/tools/generate-tests/generators/security/detectors.js +2 -5
  586. package/dist/tools/generate-tests/generators/security/index.js +2 -4
  587. package/dist/tools/generate-tests/generators/supply-chain-test-generator.js +2 -3
  588. package/dist/tools/generate-tests/generators/visual-regression-generator.js +14 -17
  589. package/dist/tools/generate-tests/generators/websocket-test-generator.js +2 -3
  590. package/dist/tools/generate-tests/test-helpers.js +11 -12
  591. package/dist/tools/generate-tests-content.js +4 -3
  592. package/dist/tools/generate-tests.js +7 -4
  593. package/dist/tools/git/git-helpers.d.ts +0 -2
  594. package/dist/tools/git/git-helpers.js +7 -7
  595. package/dist/tools/github-pr-handler.js +10 -3
  596. package/dist/tools/heal-spec-docs.js +6 -53
  597. package/dist/tools/hook-generator-handler.js +6 -6
  598. package/dist/tools/init-constitution/platform-principles.js +4 -2
  599. package/dist/tools/init-project/agents-md-writer.js +14 -5
  600. package/dist/tools/init-project/claude-md-generator.js +19 -12
  601. package/dist/tools/init-project/handler.js +165 -73
  602. package/dist/tools/init-project/host-assets-writer.d.ts +1 -1
  603. package/dist/tools/init-project/host-assets-writer.js +4 -2
  604. package/dist/tools/init-project/lifecycle-helpers.js +3 -5
  605. package/dist/tools/init-project/lint-scaffolder.js +6 -2
  606. package/dist/tools/init-project/migration-runner.d.ts +10 -1
  607. package/dist/tools/init-project/migration-runner.js +68 -3
  608. package/dist/tools/init-project/per-client-files-writer.js +14 -4
  609. package/dist/tools/init-project/rules-generator.js +10 -2
  610. package/dist/tools/init-project/scaffold-writer.d.ts +1 -1
  611. package/dist/tools/init-project/scaffold-writer.js +17 -15
  612. package/dist/tools/jobs/handlers.d.ts +15 -0
  613. package/dist/tools/jobs/handlers.js +126 -0
  614. package/dist/tools/list-specs.js +35 -34
  615. package/dist/tools/manage-plugins-handler.js +17 -9
  616. package/dist/tools/migrate-tech/advanced-handlers.js +3 -2
  617. package/dist/tools/migrate-tech/build-tool-handlers.js +3 -2
  618. package/dist/tools/migrate-tech/core-handlers.js +5 -2
  619. package/dist/tools/migrate-tech/data-handlers.js +6 -3
  620. package/dist/tools/migrate-tech-advanced/rollback-handlers.js +3 -2
  621. package/dist/tools/migrate-tech-advanced/service-handlers.js +5 -2
  622. package/dist/tools/oauth-handler.js +7 -1
  623. package/dist/tools/register-sdd-tools.d.ts +1 -1
  624. package/dist/tools/register-sdd-tools.js +5 -0
  625. package/dist/tools/register-spec-tools/core-spec-tools.js +31 -0
  626. package/dist/tools/registry/auth.js +13 -5
  627. package/dist/tools/registry/publish.js +7 -4
  628. package/dist/tools/resolve-project-path.d.ts +2 -2
  629. package/dist/tools/resolve-project-path.js +7 -7
  630. package/dist/tools/reverse-engineer/analyzer.js +14 -14
  631. package/dist/tools/rollback-release.js +3 -2
  632. package/dist/tools/safe-handler.js +295 -171
  633. package/dist/tools/schema-generator-handler.js +2 -1
  634. package/dist/tools/schemas/output-schemas.d.ts +88 -82
  635. package/dist/tools/schemas/output-schemas.js +12 -94
  636. package/dist/tools/schemas/plugins-schemas.js +0 -2
  637. package/dist/tools/schemas/registry.js +0 -2
  638. package/dist/tools/schemas/skill-registry-schemas.js +0 -2
  639. package/dist/tools/schemas/validate-output-schema.d.ts +256 -0
  640. package/dist/tools/schemas/validate-output-schema.js +212 -0
  641. package/dist/tools/sentry-handler.js +6 -1
  642. package/dist/tools/skill-bootstrap-handler.js +7 -4
  643. package/dist/tools/status-handler.js +4 -0
  644. package/dist/tools/storage-bundle-handler.d.ts +9 -0
  645. package/dist/tools/storage-bundle-handler.js +29 -0
  646. package/dist/tools/storage-paths-handler.d.ts +9 -0
  647. package/dist/tools/storage-paths-handler.js +17 -0
  648. package/dist/tools/suggest-mcp-server.js +11 -5
  649. package/dist/tools/suggest-mcps.js +29 -9
  650. package/dist/tools/suggest-tooling/advanced-testing-catalog.js +4 -5
  651. package/dist/tools/suggest-tooling/build-tool-catalog.js +2 -1
  652. package/dist/tools/suggest-tooling/css-framework-catalog.js +13 -7
  653. package/dist/tools/suggest-tooling/framework-catalog.js +3 -5
  654. package/dist/tools/suggest-tooling/frontend-perf-catalog.js +2 -6
  655. package/dist/tools/suggest-tooling/handler.js +10 -4
  656. package/dist/tools/suggest-tooling/hypermedia-catalog.js +11 -3
  657. package/dist/tools/suggest-tooling/linting-catalog.js +4 -7
  658. package/dist/tools/suggest-tooling/llm-security-catalog.js +2 -1
  659. package/dist/tools/suggest-tooling/local-first-catalog.js +7 -5
  660. package/dist/tools/suggest-tooling/observability-catalog.js +3 -4
  661. package/dist/tools/suggest-tooling/otel-catalog.js +4 -1
  662. package/dist/tools/suggest-tooling/resilience-catalog.js +16 -5
  663. package/dist/tools/suggest-tooling/skills-catalog.js +10 -9
  664. package/dist/tools/suggest-tooling/supply-chain-catalog.js +2 -3
  665. package/dist/tools/supabase-handler.js +2 -1
  666. package/dist/tools/token-intelligence-handler.js +2 -2
  667. package/dist/tools/token-recording.js +2 -2
  668. package/dist/tools/token-savings-handler.js +2 -2
  669. package/dist/tools/tool-registry/core-tools.js +131 -0
  670. package/dist/tools/tool-registry/group-infra.js +10 -12
  671. package/dist/tools/tool-registry/group-quality-compliance.js +5 -12
  672. package/dist/tools/update-status/approval-gates.d.ts +13 -0
  673. package/dist/tools/update-status/approval-gates.js +81 -0
  674. package/dist/tools/update-status/batch.js +4 -2
  675. package/dist/tools/update-status/dod-gates.d.ts +6 -24
  676. package/dist/tools/update-status/dod-gates.js +60 -135
  677. package/dist/tools/update-status/done-receipt-verifier.d.ts +15 -0
  678. package/dist/tools/update-status/done-receipt-verifier.js +145 -0
  679. package/dist/tools/update-status/evidence-gate.js +154 -2
  680. package/dist/tools/update-status/file-sync.js +23 -12
  681. package/dist/tools/update-status/gate-harness.d.ts +7 -0
  682. package/dist/tools/update-status/gate-harness.js +8 -0
  683. package/dist/tools/update-status/index.js +228 -325
  684. package/dist/tools/update-status/qa-gate.d.ts +1 -1
  685. package/dist/tools/update-status/qa-gate.js +2 -2
  686. package/dist/tools/update-status/side-effects.js +30 -37
  687. package/dist/tools/update-status/transition-guard.d.ts +4 -2
  688. package/dist/tools/update-status/transition-guard.js +57 -10
  689. package/dist/tools/update-status-convention-gate.js +24 -23
  690. package/dist/tools/update-status-reconcile.js +2 -2
  691. package/dist/tools/validate-api-contract-handler.js +3 -3
  692. package/dist/tools/validate-lint.js +20 -13
  693. package/dist/tools/validate.d.ts +3 -1
  694. package/dist/tools/validate.js +213 -5
  695. package/dist/transports/http-transport.js +84 -61
  696. package/dist/transports/middleware/with-telemetry.js +3 -2
  697. package/dist/types/abortable-process.d.ts +2 -0
  698. package/dist/types/advanced-framework.js +0 -2
  699. package/dist/types/atomic-upgrade.d.ts +71 -0
  700. package/dist/types/atomic-upgrade.js +2 -0
  701. package/dist/types/ci.js +0 -2
  702. package/dist/types/core-bridge.d.ts +78 -1
  703. package/dist/types/crash-shield-framework-rules.d.ts +24 -0
  704. package/dist/types/crash-shield-framework-rules.js +2 -0
  705. package/dist/types/data-gc.d.ts +16 -0
  706. package/dist/types/deploy.js +0 -2
  707. package/dist/types/durable-job.d.ts +78 -0
  708. package/dist/types/durable-job.js +2 -0
  709. package/dist/types/durable-validation.d.ts +60 -0
  710. package/dist/types/durable-validation.js +2 -0
  711. package/dist/types/estimation.d.ts +2 -0
  712. package/dist/types/evidence-gates.d.ts +9 -1
  713. package/dist/types/execution.d.ts +43 -0
  714. package/dist/types/handoff-artifacts.d.ts +2 -0
  715. package/dist/types/index.d.ts +2 -0
  716. package/dist/types/index.js +2 -0
  717. package/dist/types/infrastructure.js +0 -2
  718. package/dist/types/lifecycle.js +0 -2
  719. package/dist/types/migration/canonical-storage.d.ts +37 -0
  720. package/dist/types/migration/canonical-storage.js +2 -0
  721. package/dist/types/migration/index.d.ts +1 -1
  722. package/dist/types/native-worker.d.ts +48 -0
  723. package/dist/types/native-worker.js +2 -0
  724. package/dist/types/network-policy.d.ts +12 -0
  725. package/dist/types/network-policy.js +2 -0
  726. package/dist/types/oauth.js +0 -2
  727. package/dist/types/observability.d.ts +32 -0
  728. package/dist/types/outbox-worker.d.ts +35 -0
  729. package/dist/types/outbox-worker.js +11 -0
  730. package/dist/types/permissions-config.d.ts +0 -27
  731. package/dist/types/permissions-config.js +0 -2
  732. package/dist/types/plugin-install.d.ts +0 -11
  733. package/dist/types/plugin-install.js +0 -2
  734. package/dist/types/portal.d.ts +1 -0
  735. package/dist/types/product-public.d.ts +75 -0
  736. package/dist/types/product-public.js +2 -0
  737. package/dist/types/project/inputs.d.ts +2 -0
  738. package/dist/types/project/mfe-detection.js +0 -2
  739. package/dist/types/project/platform-mobile.js +0 -2
  740. package/dist/types/project/platform-specialty.js +0 -2
  741. package/dist/types/project-knowledge-graph.d.ts +7 -0
  742. package/dist/types/runtime-database.d.ts +10 -0
  743. package/dist/types/runtime-database.js +2 -0
  744. package/dist/types/runtime-policy.d.ts +40 -0
  745. package/dist/types/runtime-policy.js +2 -0
  746. package/dist/types/safety.d.ts +4 -5
  747. package/dist/types/schema-registry.d.ts +12 -0
  748. package/dist/types/schema-registry.js +2 -0
  749. package/dist/types/security.d.ts +52 -0
  750. package/dist/types/skill-registry.js +0 -2
  751. package/dist/types/spec/inputs.d.ts +2 -0
  752. package/dist/types/spec-lock-v2.d.ts +13 -7
  753. package/dist/types/spec-lock-v2.js +1 -1
  754. package/dist/types/spec-registry.js +0 -2
  755. package/dist/types/storage-bundle.d.ts +13 -0
  756. package/dist/types/storage-bundle.js +2 -0
  757. package/dist/types/storage-catalog.d.ts +18 -0
  758. package/dist/types/storage-catalog.js +2 -0
  759. package/dist/types/team-planner.js +0 -2
  760. package/dist/types/technology-registry.d.ts +35 -0
  761. package/dist/types/technology-registry.js +2 -0
  762. package/dist/types/technology-symbols.generated.d.ts +117 -0
  763. package/dist/types/technology-symbols.generated.js +2 -0
  764. package/dist/types/telemetry.d.ts +3 -3
  765. package/dist/types/transport.d.ts +2 -0
  766. package/dist/types/validate-worker.d.ts +44 -0
  767. package/dist/types/validate-worker.js +2 -0
  768. package/dist/types/validation-evidence.d.ts +1 -1
  769. package/dist/types/validation-receipt.d.ts +104 -0
  770. package/dist/types/validation-receipt.js +2 -0
  771. package/package.json +31 -20
  772. package/planu-native.json +1 -1
  773. package/planu-plugin.json +1 -1
  774. package/dist/engine/telemetry/geo-resolver.d.ts +0 -9
  775. package/dist/engine/telemetry/geo-resolver.js +0 -43
  776. package/dist/storage/data-dir-discovery.d.ts +0 -31
  777. package/dist/storage/data-dir-discovery.js +0 -140
  778. package/dist/storage/migrations/cwd-to-absolute.d.ts +0 -25
  779. package/dist/storage/migrations/cwd-to-absolute.js +0 -281
  780. package/dist/tools/create-spec/adapters/prior-decisions-hint.d.ts +0 -14
  781. package/dist/tools/create-spec/adapters/prior-decisions-hint.js +0 -30
  782. package/dist/tools/init-project/ancestor-data-detector.d.ts +0 -22
  783. package/dist/tools/init-project/ancestor-data-detector.js +0 -81
  784. package/dist/tools/update-status/force-done-audit.d.ts +0 -2
  785. package/dist/tools/update-status/force-done-audit.js +0 -23
  786. package/dist/types/migration/cwd-to-absolute.d.ts +0 -8
  787. package/dist/types/migration/cwd-to-absolute.js +0 -3
@@ -1,6 +1,6 @@
1
1
  // tools/safe-handler.ts — Generic error-boundary wrapper for MCP tool handlers.
2
2
  // Catches any unhandled error and returns a graceful MCP error response
3
- // instead of crashing the server. Includes execution timeout via Promise.race.
3
+ // instead of crashing the server. Includes cancellation-aware execution deadlines.
4
4
  import { withLicenseGate, withUsageTracking } from './license-gate.js';
5
5
  import { isTrialActive } from '../engine/trial-engine.js';
6
6
  import { sanitizePath } from './sanitize-path.js';
@@ -8,13 +8,12 @@ import { ensureHooksStarted } from './start-hooks.js';
8
8
  import { ensureWorkersStarted } from '../engine/workers/index.js';
9
9
  import { recordError } from '../storage/error-telemetry-store.js';
10
10
  import { hashProjectPath } from '../storage/base-store.js';
11
- import { reportToolError, reportToolValidationError, isErrorReportingEnabled, } from '../engine/telemetry/error-reporter.js';
11
+ import { reportToolError, reportToolValidationError } from '../engine/telemetry/error-reporter.js';
12
12
  import { sendTelemetryEvent } from '../engine/telemetry/telemetry-client.js';
13
13
  import { PLANU_VERSION } from '../config/version.js';
14
14
  import { recordToolTokens, extractOutputText } from './token-recording.js';
15
15
  import { DriftCacheStore } from '../storage/drift-cache-store.js';
16
16
  import { consumeUpdateBanner } from '../engine/update-notifier.js';
17
- import { getOrCreateInstallationId } from '../engine/telemetry/telemetry-store.js';
18
17
  import { compressToolOutput } from './output-compressor.js';
19
18
  import { recordToolTokens as recordLlmTokens } from '../engine/llm-runtime/index.js';
20
19
  import { guardToolResultOutput } from './output-integrity-guard.js';
@@ -26,7 +25,7 @@ import { checkBudgetEnforcement } from '../engine/cost-guardrails.js';
26
25
  import { existsSync } from 'node:fs';
27
26
  import { join } from 'node:path';
28
27
  import { maybeWriteCheckpoint } from '../engine/session/checkpoint-writer.js';
29
- import { AsyncLocalStorage } from 'node:async_hooks';
28
+ import { createChildCancellationScope, createExecutionScope, ExecutionCancelledError, getExecutionSignal, } from '../engine/execution/context.js';
30
29
  // SPEC-922: Compact response auto-on
31
30
  import { parseContextHeader } from '../engine/compact/header-parser.js';
32
31
  import { evaluateCompactMode } from '../engine/compact/threshold-evaluator.js';
@@ -34,6 +33,13 @@ import { loadCompactThresholds } from '../engine/compact/registry-loader.js';
34
33
  import { applyCompactMode } from '../engine/compact/compact-middleware.js';
35
34
  import { globalCompactStateStore } from '../engine/compact/state-store.js';
36
35
  import { recordCompactDecision, recordVerboseDecision, recordNoHeader, } from '../engine/compact/metrics.js';
36
+ import { getSessionContext } from '../transports/session-context.js';
37
+ import { LocalExecutionSpan } from '../engine/observability/local-execution-spans.js';
38
+ import { classifyBoundaryFailure } from '../errors/error-taxonomy.js';
39
+ import { boundedEnvironmentDuration, getRuntimePolicy } from '../engine/runtime-policy.js';
40
+ function reportOptionalDegradation(component, error) {
41
+ console.warn(classifyBoundaryFailure(error, component, 'The primary operation completed; inspect local diagnostics before relying on this optional output.').message);
42
+ }
37
43
  // ---------------------------------------------------------------------------
38
44
  // Project initialization state — read-only check, zero file writes
39
45
  // ---------------------------------------------------------------------------
@@ -87,36 +93,41 @@ function getDriftBannerThreshold() {
87
93
  }
88
94
  /**
89
95
  * Checks for pending drift cache entries for a project.
90
- * Returns a banner string if any pending entry has driftScore >= threshold,
91
- * or null if nothing to show.
92
- * Marks all pending entries as shown (fire-and-forget).
96
+ * Returns the banner and a deferred acknowledgement effect. The caller invokes
97
+ * that effect only after every awaited postprocessing step has completed.
93
98
  */
94
- async function checkPendingDriftBanner(projectPath) {
99
+ async function checkPendingDriftBanner(projectPath, signal) {
100
+ const noBanner = { banner: null, acknowledge: () => undefined };
95
101
  if (process.env.PLANU_AUTO_DRIFT === 'false') {
96
- return null;
102
+ return noBanner;
97
103
  }
98
104
  try {
105
+ signal.throwIfAborted();
99
106
  const projectId = hashProjectPath(projectPath);
100
107
  const store = new DriftCacheStore(projectId);
101
108
  const threshold = getDriftBannerThreshold();
102
109
  const pending = await store.getPendingBanners(threshold);
110
+ signal.throwIfAborted();
103
111
  if (pending.length === 0) {
104
- return null;
112
+ return noBanner;
105
113
  }
106
- // Mark as shown — fire-and-forget
107
- /* v8 ignore start */
108
- store.markAllShown().catch((err) => {
109
- console.error('[Planu] Failed to mark drift banners as shown:', err);
110
- });
111
- /* v8 ignore stop */
112
114
  const specIds = pending.map((e) => e.specId).join(', ');
113
115
  const maxScore = Math.max(...pending.map((e) => e.driftScore));
114
- return (`\n⚠️ Auto-drift alert: specs [${specIds}] may have drifted ` +
115
- `(score: ${maxScore.toFixed(2)}). Run detect_drift to review.`);
116
+ return {
117
+ banner: `\n⚠️ Auto-drift alert: specs [${specIds}] may have drifted ` +
118
+ `(score: ${maxScore.toFixed(2)}). Run detect_drift to review.`,
119
+ acknowledge: () => {
120
+ /* v8 ignore start */
121
+ void store.markAllShown().catch((err) => {
122
+ reportOptionalDegradation('drift banner acknowledgement', err);
123
+ });
124
+ /* v8 ignore stop */
125
+ },
126
+ };
116
127
  }
117
128
  catch {
118
129
  // Never block a tool call due to drift cache errors
119
- return null;
130
+ return noBanner;
120
131
  }
121
132
  }
122
133
  /**
@@ -165,18 +176,15 @@ function sanitizeArgs(args, toolName) {
165
176
  }
166
177
  return obj;
167
178
  }
168
- /** Keep the server deadline below the common 60s client deadline. */
169
- const DEFAULT_TIMEOUT_MS = 55_000;
170
- const toolAbortContext = new AsyncLocalStorage();
171
179
  const activeToolControllers = new Set();
172
180
  /** Signal for the currently executing tool, including server deadline and client cancellation. */
173
181
  export function getToolExecutionSignal() {
174
- return toolAbortContext.getStore();
182
+ return getExecutionSignal();
175
183
  }
176
184
  /** Abort every in-flight tool before stdio shutdown closes the transport. */
177
185
  export function abortActiveToolExecutions(reason = 'MCP transport closed') {
178
186
  for (const controller of activeToolControllers) {
179
- controller.abort(new Error(reason));
187
+ controller.abort(new ExecutionCancelledError(reason));
180
188
  }
181
189
  }
182
190
  /**
@@ -185,23 +193,80 @@ export function abortActiveToolExecutions(reason = 'MCP transport closed') {
185
193
  */
186
194
  const SESSION_ID = `SES-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
187
195
  function getTimeoutMs() {
188
- const envVal = process.env.PLANU_TOOL_TIMEOUT_MS;
189
- if (envVal === undefined || envVal === '') {
190
- return DEFAULT_TIMEOUT_MS;
191
- }
192
- const parsed = Number(envVal);
193
- return Number.isFinite(parsed) && parsed > 0 ? parsed : DEFAULT_TIMEOUT_MS;
196
+ return boundedEnvironmentDuration('PLANU_TOOL_TIMEOUT_MS', getRuntimePolicy().toolExecution);
194
197
  }
195
198
  /**
196
199
  * Races a handler promise against a timeout. Returns a timeout error ToolResult
197
200
  * if the handler exceeds the configured duration.
198
201
  */
199
- async function withTimeout(fn, ms, upstreamSignal) {
200
- let timer;
202
+ function deadlineSafetyMargin(ms) {
203
+ const policy = getRuntimePolicy().toolExecution;
204
+ return Math.min(policy.safetyMarginMaximumMs, Math.max(policy.minimumTimeoutMs, Math.floor(ms * policy.safetyMarginRatio)));
205
+ }
206
+ function executionMeasurements(value) {
207
+ let serialized;
208
+ try {
209
+ serialized = JSON.stringify(value);
210
+ }
211
+ catch {
212
+ serialized = '';
213
+ }
214
+ const files = value !== null && typeof value === 'object'
215
+ ? Object.entries(value).filter(([key, entry]) => /(?:file|path)s?$/iu.test(key) && entry !== undefined).length
216
+ : 0;
217
+ return {
218
+ lockWaitMs: 0,
219
+ files,
220
+ bytes: Buffer.byteLength(serialized),
221
+ subprocess: false,
222
+ };
223
+ }
224
+ function commitState(phase) {
225
+ return phase === 'committed' || phase === 'acknowledged' ? phase : 'pre-commit';
226
+ }
227
+ function requestIdentity(extra) {
228
+ if (extra === null || typeof extra !== 'object') {
229
+ return {};
230
+ }
231
+ const record = extra;
232
+ return {
233
+ ...(typeof record.requestId === 'string' && record.requestId.trim() !== ''
234
+ ? { requestId: record.requestId }
235
+ : {}),
236
+ ...(typeof record.idempotencyKey === 'string' && record.idempotencyKey.trim() !== ''
237
+ ? { idempotencyKey: record.idempotencyKey }
238
+ : {}),
239
+ };
240
+ }
241
+ function requestAbortSignal(extra) {
242
+ const sdkSignal = extra !== null &&
243
+ typeof extra === 'object' &&
244
+ extra.signal instanceof AbortSignal
245
+ ? extra.signal
246
+ : undefined;
247
+ const transportSignal = getSessionContext()?.signal;
248
+ if (sdkSignal && transportSignal) {
249
+ return AbortSignal.any([sdkSignal, transportSignal]);
250
+ }
251
+ return sdkSignal ?? transportSignal;
252
+ }
253
+ async function withTimeout(fn, ms, upstreamSignal, identity = {}, operation = 'tool', measurements = {
254
+ lockWaitMs: 0,
255
+ files: 0,
256
+ bytes: 0,
257
+ subprocess: false,
258
+ }) {
201
259
  const controller = new AbortController();
260
+ const deadlineAt = Date.now() + ms;
261
+ const responseTimeoutMs = Math.max(0, ms - deadlineSafetyMargin(ms));
202
262
  activeToolControllers.add(controller);
203
263
  const abortFromUpstream = () => {
204
- controller.abort(upstreamSignal?.reason ?? new Error('Tool request aborted'));
264
+ const reason = upstreamSignal?.reason;
265
+ controller.abort(new ExecutionCancelledError(reason instanceof Error
266
+ ? reason.message
267
+ : typeof reason === 'string'
268
+ ? reason
269
+ : 'Tool request aborted'));
205
270
  };
206
271
  if (upstreamSignal?.aborted === true) {
207
272
  abortFromUpstream();
@@ -209,42 +274,74 @@ async function withTimeout(fn, ms, upstreamSignal) {
209
274
  else {
210
275
  upstreamSignal?.addEventListener('abort', abortFromUpstream, { once: true });
211
276
  }
212
- const timeoutPromise = new Promise((_resolve, reject) => {
213
- timer = setTimeout(() => {
214
- const error = new Error(`Tool execution timed out after ${ms}ms`);
215
- controller.abort(error);
216
- reject(error);
217
- }, ms);
277
+ const scope = createExecutionScope({
278
+ deadlineAt,
279
+ upstreamSignal: controller.signal,
280
+ ...identity,
281
+ });
282
+ const localSpan = new LocalExecutionSpan({
283
+ requestId: scope.context.requestId,
284
+ operationId: identity.idempotencyKey ?? scope.context.requestId,
285
+ operation,
286
+ deadlineAt,
287
+ ...measurements,
288
+ });
289
+ const handlerPromise = scope.run(() => fn(scope.context.signal));
290
+ // Keep an explicit terminal observer because the response path intentionally
291
+ // never awaits abandoned work.
292
+ void handlerPromise.then(() => {
293
+ localSpan.complete(scope.context.phase, commitState(scope.context.phase));
294
+ }, () => {
295
+ localSpan.complete(scope.context.phase, commitState(scope.context.phase));
218
296
  });
219
- const abortPromise = new Promise((_resolve, reject) => {
297
+ const responsePromise = new Promise((resolve, reject) => {
298
+ let settled = false;
220
299
  const rejectAbort = () => {
300
+ if (settled) {
301
+ return;
302
+ }
303
+ settled = true;
221
304
  const reason = controller.signal.reason;
222
- const error = reason instanceof Error
305
+ reject(reason instanceof Error
223
306
  ? reason
224
- : new Error(typeof reason === 'string' ? reason : 'Tool request aborted');
225
- reject(error);
307
+ : new Error(typeof reason === 'string' ? reason : 'Tool request aborted'));
226
308
  };
309
+ controller.signal.addEventListener('abort', rejectAbort, { once: true });
310
+ handlerPromise.then((value) => {
311
+ if (!settled) {
312
+ settled = true;
313
+ controller.signal.removeEventListener('abort', rejectAbort);
314
+ resolve(value);
315
+ }
316
+ }, (error) => {
317
+ if (!settled) {
318
+ settled = true;
319
+ controller.signal.removeEventListener('abort', rejectAbort);
320
+ reject(error instanceof Error ? error : new Error(String(error)));
321
+ }
322
+ });
227
323
  if (controller.signal.aborted) {
228
324
  rejectAbort();
229
325
  }
230
- else {
231
- controller.signal.addEventListener('abort', rejectAbort, { once: true });
232
- }
233
326
  });
234
- const handlerPromise = toolAbortContext.run(controller.signal, () => fn(controller.signal));
327
+ const timer = setTimeout(() => {
328
+ localSpan.timeout(scope.context.phase, commitState(scope.context.phase));
329
+ const error = new ExecutionCancelledError(`Tool execution timed out after ${ms}ms`);
330
+ controller.abort(error);
331
+ scope.cancel(error);
332
+ }, responseTimeoutMs);
235
333
  try {
236
- return await Promise.race([handlerPromise, timeoutPromise, abortPromise]);
237
- }
238
- catch (error) {
239
- if (controller.signal.aborted) {
240
- await handlerPromise.then(() => undefined, () => undefined);
241
- }
242
- throw error;
334
+ return await responsePromise;
243
335
  }
244
336
  finally {
337
+ scope.acknowledge();
338
+ scope.dispose();
245
339
  clearTimeout(timer);
246
340
  upstreamSignal?.removeEventListener('abort', abortFromUpstream);
247
341
  activeToolControllers.delete(controller);
342
+ if (!localSpan.didTimeout) {
343
+ localSpan.complete(scope.context.phase, commitState(scope.context.phase));
344
+ }
248
345
  }
249
346
  }
250
347
  /**
@@ -257,18 +354,34 @@ async function withTimeout(fn, ms, upstreamSignal) {
257
354
  * @param fallback - Value returned when the timeout fires
258
355
  */
259
356
  export function withToolTimeout(p, ms, fallback) {
260
- let t;
261
- const timeout = new Promise((res) => {
262
- t = setTimeout(() => {
263
- res(fallback);
264
- }, ms);
357
+ const scope = createChildCancellationScope(ms);
358
+ return new Promise((resolve, reject) => {
359
+ let settled = false;
360
+ const finish = (value) => {
361
+ if (!settled) {
362
+ settled = true;
363
+ scope.signal.removeEventListener('abort', onAbort);
364
+ scope.dispose();
365
+ resolve(value);
366
+ }
367
+ };
368
+ const fail = (error) => {
369
+ if (!settled) {
370
+ settled = true;
371
+ scope.signal.removeEventListener('abort', onAbort);
372
+ scope.dispose();
373
+ reject(error instanceof Error ? error : new Error(String(error)));
374
+ }
375
+ };
376
+ const onAbort = () => {
377
+ finish(fallback);
378
+ };
379
+ scope.signal.addEventListener('abort', onAbort, { once: true });
380
+ p.then(finish, fail);
381
+ if (scope.signal.aborted) {
382
+ onAbort();
383
+ }
265
384
  });
266
- return Promise.race([
267
- p.finally(() => {
268
- clearTimeout(t);
269
- }),
270
- timeout,
271
- ]);
272
385
  }
273
386
  /**
274
387
  * Wraps a tool handler so that any unhandled error is caught and returned as a
@@ -312,61 +425,95 @@ function safeWithTelemetry(toolName, handler) {
312
425
  recordVerboseDecision();
313
426
  }
314
427
  try {
315
- const upstreamSignal = extra &&
316
- typeof extra === 'object' &&
317
- extra.signal instanceof AbortSignal
318
- ? extra.signal
319
- : undefined;
320
- const rawResult = (await withTimeout((signal) => handler(safeArgs, {
321
- ...(extra && typeof extra === 'object' ? extra : {}),
322
- signal,
323
- }), getTimeoutMs(), upstreamSignal));
324
- // Defensive guard: belt-and-suspenders alongside withUsageTracking guard and noImplicitReturns.
325
- const result = rawResult ?? {
326
- content: [{ type: 'text', text: 'Internal error: tool handler returned no result' }],
327
- isError: true,
328
- };
329
- // SPEC-455: Compress verbose JSON outputs to save LLM tokens
330
- const compressed = compressToolOutput(result);
331
- // SPEC-922: Apply compact mode middleware
332
- const compacted = applyCompactMode(compressed, decision, {
333
- projectPath,
334
- flow: toolName,
335
- });
336
- // Inject pending drift banner (non-blocking, informational only)
337
- const driftBanner = projectPath !== undefined ? await checkPendingDriftBanner(projectPath) : null;
338
- const withDrift = injectDriftBanner(compacted, driftBanner);
339
- // Inject update banner (once per version check, consumed and cleared)
340
- const updateBanner = consumeUpdateBanner();
341
- const finalResult = updateBanner !== null && withDrift.isError !== true
342
- ? {
343
- ...withDrift,
344
- content: [...withDrift.content, { type: 'text', text: updateBanner }],
428
+ const upstreamSignal = requestAbortSignal(extra);
429
+ const guardedResult = await withTimeout(async (signal) => {
430
+ const rawResult = (await handler(safeArgs, {
431
+ ...(extra && typeof extra === 'object' ? extra : {}),
432
+ signal,
433
+ }));
434
+ signal.throwIfAborted();
435
+ // Defensive guard: belt-and-suspenders alongside withUsageTracking guard and noImplicitReturns.
436
+ const result = rawResult ?? {
437
+ content: [{ type: 'text', text: 'Internal error: tool handler returned no result' }],
438
+ isError: true,
439
+ };
440
+ // SPEC-455: Compress verbose JSON outputs to save LLM tokens
441
+ const compressed = compressToolOutput(result);
442
+ // SPEC-922: Apply compact mode middleware
443
+ const compacted = applyCompactMode(compressed, decision, {
444
+ projectPath,
445
+ flow: toolName,
446
+ });
447
+ // Postprocessing remains inside the request cancellation tree. In
448
+ // particular, a disconnect while reading drift state cannot start
449
+ // the shown-marker, token, audit or checkpoint effects afterwards.
450
+ const driftBanner = projectPath !== undefined
451
+ ? await checkPendingDriftBanner(projectPath, signal)
452
+ : { banner: null, acknowledge: () => undefined };
453
+ signal.throwIfAborted();
454
+ const withDrift = injectDriftBanner(compacted, driftBanner.banner);
455
+ const updateBanner = consumeUpdateBanner();
456
+ const finalResult = updateBanner !== null && withDrift.isError !== true
457
+ ? {
458
+ ...withDrift,
459
+ content: [...withDrift.content, { type: 'text', text: updateBanner }],
460
+ }
461
+ : withDrift;
462
+ const processedResult = guardToolResultOutput(toolName, finalResult);
463
+ signal.throwIfAborted();
464
+ let appendAudit;
465
+ /* v8 ignore start */
466
+ if (toolName !== undefined) {
467
+ try {
468
+ const [{ appendEntry, getLastHash }, { buildAuditEntry }, { hashEntry }] = await Promise.all([
469
+ import('../storage/audit-trail-store.js'),
470
+ import('../engine/audit-trail/formatter.js'),
471
+ import('../engine/audit-trail/hasher.js'),
472
+ ]);
473
+ signal.throwIfAborted();
474
+ appendAudit = () => {
475
+ const prevHash = getLastHash();
476
+ const partial = buildAuditEntry({
477
+ toolName,
478
+ args,
479
+ outputType: processedResult.isError === true ? 'error' : 'success',
480
+ durationMs: Date.now() - startTime,
481
+ prevHash,
482
+ });
483
+ appendEntry({ ...partial, hash: hashEntry(partial) });
484
+ };
485
+ }
486
+ catch (error) {
487
+ if (signal.aborted) {
488
+ throw signal.reason;
489
+ }
490
+ reportOptionalDegradation('tool success audit', error);
491
+ }
345
492
  }
346
- : withDrift;
347
- const guardedResult = guardToolResultOutput(toolName, finalResult);
348
- // Report validation errors (isError:true returned by handler logic, not exceptions)
349
- if (toolName !== undefined && guardedResult.isError === true) {
350
- const firstContent = guardedResult.content[0];
351
- const errText = firstContent?.type === 'text' ? firstContent.text : 'unknown error';
352
- reportToolValidationError(toolName, errText);
353
- }
354
- // Record token usage for successful calls (fire-and-forget, only when projectPath available)
355
- if (toolName !== undefined && projectPath !== undefined && guardedResult.isError !== true) {
356
- const outputText = extractOutputText(guardedResult);
357
- recordToolTokens(toolName, projectPath, args, outputText, SESSION_ID);
358
- }
359
- // SPEC-460: Track real token estimates in LLM runtime (session-scoped, measured)
360
- if (toolName !== undefined) {
361
- const inputText = JSON.stringify(args);
362
- const outputText = extractOutputText(guardedResult);
363
- recordLlmTokens(toolName, inputText, outputText);
364
- }
365
- // Emit tool_used telemetry for successful calls (fire-and-forget)
366
- /* v8 ignore start */
367
- if (toolName !== undefined && guardedResult.isError !== true && isErrorReportingEnabled()) {
368
- getOrCreateInstallationId()
369
- .then((installationId) => {
493
+ /* v8 ignore stop */
494
+ signal.throwIfAborted();
495
+ // Report validation errors (isError:true returned by handler logic, not exceptions)
496
+ if (toolName !== undefined && processedResult.isError === true) {
497
+ const firstContent = processedResult.content[0];
498
+ const errText = firstContent?.type === 'text' ? firstContent.text : 'unknown error';
499
+ reportToolValidationError(toolName, errText);
500
+ }
501
+ // Record token usage for successful calls (fire-and-forget, only when projectPath available)
502
+ if (toolName !== undefined &&
503
+ projectPath !== undefined &&
504
+ processedResult.isError !== true) {
505
+ const outputText = extractOutputText(processedResult);
506
+ recordToolTokens(toolName, projectPath, args, outputText, SESSION_ID);
507
+ }
508
+ // SPEC-460: Track real token estimates in LLM runtime (session-scoped, measured)
509
+ if (toolName !== undefined) {
510
+ const inputText = JSON.stringify(args);
511
+ const outputText = extractOutputText(processedResult);
512
+ recordLlmTokens(toolName, inputText, outputText);
513
+ }
514
+ // Emit tool_used telemetry for successful calls (fire-and-forget)
515
+ /* v8 ignore start */
516
+ if (toolName !== undefined && processedResult.isError !== true) {
370
517
  sendTelemetryEvent({
371
518
  event: 'tool_used',
372
519
  properties: {
@@ -376,47 +523,24 @@ function safeWithTelemetry(toolName, handler) {
376
523
  platform: process.platform,
377
524
  durationMs: Date.now() - startTime,
378
525
  },
379
- installationId,
380
526
  });
381
- })
382
- .catch(() => {
383
- /* best-effort — never block tool response */
384
- });
385
- }
386
- /* v8 ignore stop */
387
- // SPEC-387: Audit trail — fire-and-forget, never throws
388
- /* v8 ignore start */
389
- if (toolName !== undefined) {
390
- try {
391
- const [{ appendEntry, getLastHash }, { buildAuditEntry }, { hashEntry }] = await Promise.all([
392
- import('../storage/audit-trail-store.js'),
393
- import('../engine/audit-trail/formatter.js'),
394
- import('../engine/audit-trail/hasher.js'),
395
- ]);
396
- const prevHash = getLastHash();
397
- const partial = buildAuditEntry({
398
- toolName,
399
- args,
400
- outputType: guardedResult.isError === true ? 'error' : 'success',
401
- durationMs: Date.now() - startTime,
402
- prevHash,
403
- });
404
- appendEntry({ ...partial, hash: hashEntry(partial) });
405
527
  }
406
- catch {
407
- // Silent audit must never affect tool execution
528
+ /* v8 ignore stop */
529
+ // No awaited boundary remains below this point. Cancellation cannot
530
+ // interleave between the final check and these synchronous starters.
531
+ driftBanner.acknowledge();
532
+ appendAudit?.();
533
+ if (toolName !== undefined) {
534
+ maybeWriteCheckpoint(toolName, processedResult.isError !== true, projectPath);
408
535
  }
409
- }
410
- /* v8 ignore stop */
411
- // SPEC-563: Auto session checkpoint — fire-and-forget, non-blocking
412
- if (toolName !== undefined) {
413
- maybeWriteCheckpoint(toolName, guardedResult.isError !== true, projectPath);
414
- }
536
+ return processedResult;
537
+ }, getTimeoutMs(), upstreamSignal, requestIdentity(extra), toolName, executionMeasurements(safeArgs));
415
538
  return guardedResult;
416
539
  }
417
540
  catch (error) {
418
541
  const message = error instanceof Error ? error.message : String(error);
419
- if (toolName !== undefined && projectPath !== undefined) {
542
+ const cancelledBeforeCommit = error instanceof ExecutionCancelledError;
543
+ if (!cancelledBeforeCommit && toolName !== undefined && projectPath !== undefined) {
420
544
  const projectId = hashProjectPath(projectPath);
421
545
  // Fire-and-forget: do not block the error response
422
546
  recordError(projectId, {
@@ -426,12 +550,12 @@ function safeWithTelemetry(toolName, handler) {
426
550
  message,
427
551
  /* v8 ignore start */
428
552
  }).catch((err) => {
429
- console.error('[Planu] Telemetry recording failed:', err);
553
+ reportOptionalDegradation('local error telemetry', err);
430
554
  });
431
555
  /* v8 ignore stop */
432
556
  }
433
557
  // Remote error reporting — fire-and-forget, respects PLANU_TELEMETRY=off
434
- if (toolName !== undefined) {
558
+ if (!cancelledBeforeCommit && toolName !== undefined) {
435
559
  reportToolError(toolName, error);
436
560
  }
437
561
  // SPEC-902: Structured error contract with recovery hints
@@ -443,7 +567,7 @@ function safeWithTelemetry(toolName, handler) {
443
567
  // Log unmatched errors for registry improvement (fire-and-forget)
444
568
  /* v8 ignore start */
445
569
  const matchedRule = registry.match(error);
446
- if (!matchedRule && toolName !== undefined) {
570
+ if (!cancelledBeforeCommit && !matchedRule && toolName !== undefined) {
447
571
  void Promise.resolve().then(async () => {
448
572
  try {
449
573
  const { recordError: recordErrorTelemetry } = await import('../storage/error-telemetry-store.js');
@@ -453,25 +577,25 @@ function safeWithTelemetry(toolName, handler) {
453
577
  module: `tools/${toolName}`,
454
578
  severity: 'warning',
455
579
  message: `Unmatched error: ${message}`,
456
- }).catch(() => {
457
- // best-effort logging, ignore failure
580
+ }).catch((telemetryError) => {
581
+ reportOptionalDegradation('unmatched error telemetry', telemetryError);
458
582
  });
459
583
  }
460
- catch {
461
- // best-effort
584
+ catch (telemetryError) {
585
+ reportOptionalDegradation('unmatched error telemetry import', telemetryError);
462
586
  }
463
587
  });
464
588
  }
465
589
  /* v8 ignore stop */
466
590
  // SPEC-387: Audit trail for error path — fire-and-forget, never throws
467
591
  /* v8 ignore start */
468
- if (toolName !== undefined) {
469
- try {
470
- const [{ appendEntry, getLastHash }, { buildAuditEntry }, { hashEntry }] = await Promise.all([
471
- import('../storage/audit-trail-store.js'),
472
- import('../engine/audit-trail/formatter.js'),
473
- import('../engine/audit-trail/hasher.js'),
474
- ]);
592
+ if (!cancelledBeforeCommit && toolName !== undefined) {
593
+ void Promise.all([
594
+ import('../storage/audit-trail-store.js'),
595
+ import('../engine/audit-trail/formatter.js'),
596
+ import('../engine/audit-trail/hasher.js'),
597
+ ])
598
+ .then(([{ appendEntry, getLastHash }, { buildAuditEntry }, { hashEntry }]) => {
475
599
  const prevHash = getLastHash();
476
600
  const partial = buildAuditEntry({
477
601
  toolName,
@@ -481,10 +605,10 @@ function safeWithTelemetry(toolName, handler) {
481
605
  prevHash,
482
606
  });
483
607
  appendEntry({ ...partial, hash: hashEntry(partial) });
484
- }
485
- catch {
486
- // Silent audit must never affect tool execution
487
- }
608
+ })
609
+ .catch((auditError) => {
610
+ reportOptionalDegradation('tool error audit', auditError);
611
+ });
488
612
  }
489
613
  /* v8 ignore stop */
490
614
  return errorResult;
@@ -1,3 +1,4 @@
1
+ import { technologyValue } from '../engine/technology-registry.js';
1
2
  // tools/schema-generator-handler.ts — Handler for Validation Schema Generator (SPEC-365)
2
3
  import { readFile, writeFile, mkdir } from 'node:fs/promises';
3
4
  import { dirname } from 'node:path';
@@ -51,7 +52,7 @@ export async function handleGenerateValidationSchema(input) {
51
52
  // Write files if outputPath is provided
52
53
  if (outputPath !== undefined) {
53
54
  for (const schema of result.schemas) {
54
- const ext = outputFormat === 'typescript' ? '.ts' : '.js';
55
+ const ext = outputFormat === technologyValue('technology-typescript-969545') ? '.ts' : '.js';
55
56
  const libSuffix = library === 'all' ? `.${schema.library}` : '';
56
57
  const filePath = outputPath.replace(/\.(ts|js)$/, '') + libSuffix + ext;
57
58
  await writeOutputFile(filePath, schema.code);