avorelo 0.3.8 → 0.4.0-rc.2

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 (394) hide show
  1. package/LICENSE +16 -23
  2. package/README.md +62 -72
  3. package/bin/avorelo +9 -0
  4. package/package.json +147 -139
  5. package/scripts/README.md +40 -0
  6. package/scripts/avorelo-session-collision-guard.js +540 -0
  7. package/scripts/avorelo-workstream-preflight.js +918 -0
  8. package/scripts/cco-dashboard.js +346 -0
  9. package/scripts/cco-posttooluse.js +504 -0
  10. package/scripts/cco-pretooluse.js +381 -0
  11. package/scripts/cco-status.js +540 -0
  12. package/scripts/cco-stop.js +77 -0
  13. package/scripts/cco-userprompt-submit.js +83 -0
  14. package/scripts/lib/activation/account-state.js +37 -0
  15. package/scripts/lib/activation/activate-command.js +114 -0
  16. package/scripts/lib/activation/activation-runner.js +607 -0
  17. package/scripts/lib/activation/activation-self-healing.js +481 -0
  18. package/scripts/lib/activation/activation-state.js +96 -0
  19. package/scripts/lib/activation/activation-summary.js +241 -0
  20. package/scripts/lib/activation/adapters/claude-code.js +77 -0
  21. package/scripts/lib/activation/adapters/codex-cli.js +52 -0
  22. package/scripts/lib/activation/adapters/cursor.js +37 -0
  23. package/scripts/lib/activation/adapters/github-agent.js +39 -0
  24. package/scripts/lib/activation/adapters/terminal.js +42 -0
  25. package/scripts/lib/activation/adapters/vscode.js +39 -0
  26. package/scripts/lib/activation/adapters/windsurf.js +37 -0
  27. package/scripts/lib/activation/ai-surface-detector.js +151 -0
  28. package/scripts/lib/activation/connect-account.js +145 -0
  29. package/scripts/lib/activation/detect-environment.js +75 -0
  30. package/scripts/lib/activation/detect-hosts.js +62 -0
  31. package/scripts/lib/activation/format-activation-output.js +109 -0
  32. package/scripts/lib/activation/next-action.js +43 -0
  33. package/scripts/lib/activation/repair-engine.js +219 -0
  34. package/scripts/lib/activation/run-entry.js +346 -0
  35. package/scripts/lib/activation-distribution-readiness.js +507 -0
  36. package/scripts/lib/adapter-conformance.js +176 -0
  37. package/scripts/lib/adapter-readiness.js +428 -0
  38. package/scripts/lib/adapter-safety-boundaries.js +335 -0
  39. package/scripts/lib/adapter-technical-readiness-gate.js +205 -0
  40. package/scripts/lib/agent-access-governance.js +455 -0
  41. package/scripts/lib/agent-activation-readiness.js +878 -0
  42. package/scripts/lib/agent-enforcement.js +765 -0
  43. package/scripts/lib/agent-evolution-loop.js +479 -0
  44. package/scripts/lib/agent-policy-profile.js +210 -0
  45. package/scripts/lib/agent-security/action-evaluator.js +507 -0
  46. package/scripts/lib/agent-security/adapter-registry.js +98 -0
  47. package/scripts/lib/agent-security/auto-policy.js +139 -0
  48. package/scripts/lib/agent-security/bounded-scan.js +93 -0
  49. package/scripts/lib/agent-security/enforcement-adapter.js +174 -0
  50. package/scripts/lib/agent-security/enforcement-engine.js +1129 -0
  51. package/scripts/lib/agent-security/file-write-adapter.js +183 -0
  52. package/scripts/lib/agent-security/file-write-rules.js +178 -0
  53. package/scripts/lib/agent-security/index.js +3342 -0
  54. package/scripts/lib/agent-security/instruction-risk.js +181 -0
  55. package/scripts/lib/agent-security/mcp-action-adapter.js +185 -0
  56. package/scripts/lib/agent-security/mcp-action-rules.js +184 -0
  57. package/scripts/lib/agent-security/package-action-adapter.js +175 -0
  58. package/scripts/lib/agent-security/package-action-rules.js +233 -0
  59. package/scripts/lib/agent-security/performance.js +148 -0
  60. package/scripts/lib/agent-security/permission-minimizer.js +403 -0
  61. package/scripts/lib/agent-security/scan-cache.js +74 -0
  62. package/scripts/lib/agent-security/source-trust.js +146 -0
  63. package/scripts/lib/ai-efficiency-dogfood-pack.js +437 -0
  64. package/scripts/lib/ai-efficiency-eval.js +207 -0
  65. package/scripts/lib/ai-efficiency-guard-contract.js +209 -0
  66. package/scripts/lib/ai-efficiency-measured-value.js +106 -0
  67. package/scripts/lib/ai-install-prompt.js +293 -0
  68. package/scripts/lib/ai-task-inference.js +155 -0
  69. package/scripts/lib/ai-value-ledger.js +121 -0
  70. package/scripts/lib/ai-value-proof-table.js +151 -0
  71. package/scripts/lib/ai-work-efficiency-routing.js +623 -0
  72. package/scripts/lib/ai-workspace-hygiene.js +1499 -0
  73. package/scripts/lib/alpha-activation.js +520 -0
  74. package/scripts/lib/alpha-feedback.js +263 -0
  75. package/scripts/lib/alpha-readiness-gate.js +332 -0
  76. package/scripts/lib/anti-gaming.js +169 -0
  77. package/scripts/lib/artifact-health.js +431 -0
  78. package/scripts/lib/artifact-receipt-hygiene.js +619 -0
  79. package/scripts/lib/attribution.js +180 -0
  80. package/scripts/lib/audit.js +289 -0
  81. package/scripts/lib/avorelo-skill-registry.js +810 -0
  82. package/scripts/lib/batch-jobs.js +71 -0
  83. package/scripts/lib/brain-pack.js +578 -0
  84. package/scripts/lib/brand-boundary.js +424 -0
  85. package/scripts/lib/brand.js +74 -0
  86. package/scripts/lib/browser-capability.js +1048 -0
  87. package/scripts/lib/browser-proof-governed-workflow.js +1020 -0
  88. package/scripts/lib/browser-proof-preflight.js +321 -0
  89. package/scripts/lib/cache-readiness.js +296 -0
  90. package/scripts/lib/canonical-reentry.js +162 -0
  91. package/scripts/lib/capability-contract-validator.js +177 -0
  92. package/scripts/lib/capability-hygiene.js +504 -0
  93. package/scripts/lib/capability-intake-quarantine.js +789 -0
  94. package/scripts/lib/capability-kernel-registry.js +566 -0
  95. package/scripts/lib/capability-kernel.js +202 -0
  96. package/scripts/lib/capability-manifest.js +255 -0
  97. package/scripts/lib/capability-outcome-normalizer.js +104 -0
  98. package/scripts/lib/capability-packs.js +314 -0
  99. package/scripts/lib/capability-recommender.js +513 -0
  100. package/scripts/lib/capability-registry.js +1062 -0
  101. package/scripts/lib/carry-forward-surfacing.js +194 -0
  102. package/scripts/lib/ccusage-adapter.js +188 -0
  103. package/scripts/lib/claude-session-evidence/index.js +1027 -0
  104. package/scripts/lib/cli-output-sanitizer.js +118 -0
  105. package/scripts/lib/company-loop.js +1149 -0
  106. package/scripts/lib/config.js +641 -0
  107. package/scripts/lib/context-acquisition-plan.js +359 -0
  108. package/scripts/lib/context-authority-rules.js +138 -0
  109. package/scripts/lib/context-budget-guard.js +170 -0
  110. package/scripts/lib/context-budget-scanner.js +257 -0
  111. package/scripts/lib/context-budget.js +167 -0
  112. package/scripts/lib/context-claim-safety.js +116 -0
  113. package/scripts/lib/context-compiler.js +236 -0
  114. package/scripts/lib/context-optimizer.js +715 -0
  115. package/scripts/lib/context-packet.js +121 -0
  116. package/scripts/lib/context-receipt.js +57 -0
  117. package/scripts/lib/context-reduction-plan.js +179 -0
  118. package/scripts/lib/context-safety.js +88 -0
  119. package/scripts/lib/context-savings-engine.js +158 -0
  120. package/scripts/lib/context-source-registry.js +393 -0
  121. package/scripts/lib/context-task-profiles.js +147 -0
  122. package/scripts/lib/cost-abuse-guard.js +975 -0
  123. package/scripts/lib/cost-evidence.js +287 -0
  124. package/scripts/lib/cost-to-outcome-signals.js +639 -0
  125. package/scripts/lib/cross-host-install-plan.js +308 -0
  126. package/scripts/lib/cross-host-install-readiness.js +242 -0
  127. package/scripts/lib/cross-host-value-flow.js +268 -0
  128. package/scripts/lib/dashboard.js +1056 -0
  129. package/scripts/lib/data-permissions-guard.js +1187 -0
  130. package/scripts/lib/deployment-environment-guard.js +1236 -0
  131. package/scripts/lib/design-partner-feedback.js +346 -0
  132. package/scripts/lib/dogfood-evidence-freshness.js +567 -0
  133. package/scripts/lib/efficiency-receipt.js +354 -0
  134. package/scripts/lib/entitlements.js +100 -0
  135. package/scripts/lib/execution-packet.js +559 -0
  136. package/scripts/lib/execution-route-governor.js +179 -0
  137. package/scripts/lib/experimentation-events.js +547 -0
  138. package/scripts/lib/external-capability-compliance.js +107 -0
  139. package/scripts/lib/external-readiness/ai-visibility/ai-visibility-runner.js +322 -0
  140. package/scripts/lib/external-readiness/calibration/benchmark-site-catalog.js +121 -0
  141. package/scripts/lib/external-readiness/calibration/completion-gate.js +112 -0
  142. package/scripts/lib/external-readiness/calibration/real-site-benchmark-runner.js +284 -0
  143. package/scripts/lib/external-readiness/drift-detector.js +100 -0
  144. package/scripts/lib/external-readiness/endpoint-prober.js +332 -0
  145. package/scripts/lib/external-readiness/external-readiness-runner.js +112 -0
  146. package/scripts/lib/external-readiness/full-agent-readiness-scorer.js +220 -0
  147. package/scripts/lib/external-readiness/golden-path-runner.js +333 -0
  148. package/scripts/lib/external-readiness/inside-out-runner.js +118 -0
  149. package/scripts/lib/external-readiness/proof-receipt-writer.js +112 -0
  150. package/scripts/lib/external-readiness/safe-fix-executor.js +117 -0
  151. package/scripts/lib/external-readiness/skills/category-boundary-guard.js +30 -0
  152. package/scripts/lib/external-readiness/skills/pmm-positioning-guard.js +69 -0
  153. package/scripts/lib/external-readiness/skills/safe-fix-policy.js +35 -0
  154. package/scripts/lib/external-user-simulation.js +166 -0
  155. package/scripts/lib/failure-recovery-readiness.js +81 -0
  156. package/scripts/lib/failure-recovery.js +419 -0
  157. package/scripts/lib/feedback-intelligence.js +537 -0
  158. package/scripts/lib/feedback-signals.js +205 -0
  159. package/scripts/lib/file-integrity.js +68 -0
  160. package/scripts/lib/fsx.js +129 -0
  161. package/scripts/lib/full-readiness-gate.js +451 -0
  162. package/scripts/lib/governed-action-exposure-primitives.js +1514 -0
  163. package/scripts/lib/governed-exposure-planner.js +186 -0
  164. package/scripts/lib/governed-workspace-hygiene.js +946 -0
  165. package/scripts/lib/guard-suite-common.js +412 -0
  166. package/scripts/lib/guidance-builder.js +174 -0
  167. package/scripts/lib/hook-apply.js +1075 -0
  168. package/scripts/lib/hook-baseline.js +310 -0
  169. package/scripts/lib/hook-config-preview.js +275 -0
  170. package/scripts/lib/hook-contracts.js +290 -0
  171. package/scripts/lib/hook-safety-boundary-readiness.js +80 -0
  172. package/scripts/lib/host-capability-matrix.js +351 -0
  173. package/scripts/lib/host-support-context.js +254 -0
  174. package/scripts/lib/http-hook-action.js +538 -0
  175. package/scripts/lib/install-ai-readiness.js +84 -0
  176. package/scripts/lib/install-intake-risk.js +1051 -0
  177. package/scripts/lib/install-journey-intelligence.js +329 -0
  178. package/scripts/lib/intervention-guidance.js +57 -0
  179. package/scripts/lib/known-limitations.js +115 -0
  180. package/scripts/lib/l8-path-truth.js +146 -0
  181. package/scripts/lib/launch-hardening-gate.js +436 -0
  182. package/scripts/lib/launch-readiness.js +635 -0
  183. package/scripts/lib/learning-experimentation-foundation.js +1484 -0
  184. package/scripts/lib/learning-memory.js +686 -0
  185. package/scripts/lib/lifecycle-hooks.js +982 -0
  186. package/scripts/lib/local-package-smoke.js +436 -0
  187. package/scripts/lib/local-pricing.js +299 -0
  188. package/scripts/lib/mcp-enforcement.js +311 -0
  189. package/scripts/lib/mcp-least-privilege-policy.js +303 -0
  190. package/scripts/lib/mcp-tool-inventory.js +388 -0
  191. package/scripts/lib/mcp-tool-risk.js +0 -0
  192. package/scripts/lib/memory.js +335 -0
  193. package/scripts/lib/metrics.js +699 -0
  194. package/scripts/lib/micro-proof.js +133 -0
  195. package/scripts/lib/model-work-class-routing.js +79 -0
  196. package/scripts/lib/next-run-context.js +436 -0
  197. package/scripts/lib/next-run-continuity.js +1207 -0
  198. package/scripts/lib/observability-recovery-guard.js +1030 -0
  199. package/scripts/lib/operating-value.js +1662 -0
  200. package/scripts/lib/optimization-v3.js +122 -0
  201. package/scripts/lib/orchestration/adapters/_shared.js +49 -0
  202. package/scripts/lib/orchestration/adapters/aider.js +18 -0
  203. package/scripts/lib/orchestration/adapters/claude-code.js +35 -0
  204. package/scripts/lib/orchestration/adapters/codex.js +35 -0
  205. package/scripts/lib/orchestration/adapters/gemini-cli.js +18 -0
  206. package/scripts/lib/orchestration/adapters/git.js +25 -0
  207. package/scripts/lib/orchestration/adapters/index.js +31 -0
  208. package/scripts/lib/orchestration/adapters/lm-studio.js +18 -0
  209. package/scripts/lib/orchestration/adapters/ollama.js +18 -0
  210. package/scripts/lib/orchestration/adapters/opencode.js +18 -0
  211. package/scripts/lib/orchestration/adapters/openrouter.js +18 -0
  212. package/scripts/lib/orchestration/adapters/test-runner.js +25 -0
  213. package/scripts/lib/orchestration/cli.js +438 -0
  214. package/scripts/lib/orchestration/execution-manager.js +279 -0
  215. package/scripts/lib/orchestration/handoff.js +314 -0
  216. package/scripts/lib/orchestration/index.js +456 -0
  217. package/scripts/lib/orchestration/inventory.js +47 -0
  218. package/scripts/lib/orchestration/model-discovery.js +498 -0
  219. package/scripts/lib/orchestration/model-profiler.js +170 -0
  220. package/scripts/lib/orchestration/model-profiles.js +252 -0
  221. package/scripts/lib/orchestration/model-refresh-policy.js +72 -0
  222. package/scripts/lib/orchestration/proof-writer.js +349 -0
  223. package/scripts/lib/orchestration/provider-discovery/aider.js +49 -0
  224. package/scripts/lib/orchestration/provider-discovery/claude-code.js +56 -0
  225. package/scripts/lib/orchestration/provider-discovery/codex.js +49 -0
  226. package/scripts/lib/orchestration/provider-discovery/common.js +186 -0
  227. package/scripts/lib/orchestration/provider-discovery/gemini.js +106 -0
  228. package/scripts/lib/orchestration/provider-discovery/lm-studio.js +118 -0
  229. package/scripts/lib/orchestration/provider-discovery/models-dev.js +12 -0
  230. package/scripts/lib/orchestration/provider-discovery/ollama.js +100 -0
  231. package/scripts/lib/orchestration/provider-discovery/opencode.js +47 -0
  232. package/scripts/lib/orchestration/provider-discovery/openrouter.js +44 -0
  233. package/scripts/lib/orchestration/risk-classifier.js +130 -0
  234. package/scripts/lib/orchestration/routing-policy.js +486 -0
  235. package/scripts/lib/orchestration/settings.js +95 -0
  236. package/scripts/lib/orchestration/state.js +165 -0
  237. package/scripts/lib/orchestration/verification-manager.js +138 -0
  238. package/scripts/lib/outcome-evidence-stack.js +1083 -0
  239. package/scripts/lib/output-profiles.js +146 -0
  240. package/scripts/lib/package-content-audit.js +368 -0
  241. package/scripts/lib/package-runtime.js +278 -0
  242. package/scripts/lib/plan-surface.js +53 -0
  243. package/scripts/lib/plans.js +2327 -0
  244. package/scripts/lib/policy-provider.js +27 -0
  245. package/scripts/lib/prelaunch-activation-readiness.js +409 -0
  246. package/scripts/lib/prelaunch-evidence-store.js +816 -0
  247. package/scripts/lib/prelaunch-intelligence.js +869 -0
  248. package/scripts/lib/pricing-experiment.js +118 -0
  249. package/scripts/lib/pro-moment-events.js +77 -0
  250. package/scripts/lib/pro-moment-state.js +227 -0
  251. package/scripts/lib/pro-moments.js +1216 -0
  252. package/scripts/lib/product-home-receipt.js +1790 -0
  253. package/scripts/lib/product-learning-events.js +696 -0
  254. package/scripts/lib/production-confidence-control-tower.js +1209 -0
  255. package/scripts/lib/production-confidence.js +1858 -0
  256. package/scripts/lib/project-profile.js +555 -0
  257. package/scripts/lib/prompt-compiler-plan.js +94 -0
  258. package/scripts/lib/prompt-compiler.js +280 -0
  259. package/scripts/lib/prompt-lint.js +32 -0
  260. package/scripts/lib/prompt-suggestions.js +52 -0
  261. package/scripts/lib/proof-canonical.js +398 -0
  262. package/scripts/lib/proof-drilldown.js +383 -0
  263. package/scripts/lib/proof-e2e/promise-completion.js +141 -0
  264. package/scripts/lib/proof-e2e/promise-dashboard-claims.js +135 -0
  265. package/scripts/lib/proof-e2e/promise-local-proof.js +156 -0
  266. package/scripts/lib/proof-e2e/promise-provider-neutral.js +136 -0
  267. package/scripts/lib/proof-e2e/promise-registry.js +219 -0
  268. package/scripts/lib/proof-e2e/promise-security-trust.js +141 -0
  269. package/scripts/lib/proof-e2e/promise-skills-risk.js +163 -0
  270. package/scripts/lib/proof-e2e/promise-token-savings.js +112 -0
  271. package/scripts/lib/proof-e2e/promise-work-management.js +126 -0
  272. package/scripts/lib/proof-events.js +342 -0
  273. package/scripts/lib/proof-history.js +243 -0
  274. package/scripts/lib/proof-metrics.js +296 -0
  275. package/scripts/lib/proof-outcome-evidence.js +134 -0
  276. package/scripts/lib/proof-receipt.js +335 -0
  277. package/scripts/lib/proof-record.js +461 -0
  278. package/scripts/lib/proof-savings-report.js +1549 -0
  279. package/scripts/lib/public-activation-distribution-gate.js +266 -0
  280. package/scripts/lib/public-cli.js +5631 -0
  281. package/scripts/lib/public-distribution-truth.js +211 -0
  282. package/scripts/lib/public-distribution.js +73 -0
  283. package/scripts/lib/public-install-claim-checker.js +300 -0
  284. package/scripts/lib/publish-provenance-readiness.js +287 -0
  285. package/scripts/lib/readiness-delta.js +218 -0
  286. package/scripts/lib/readiness-evidence-closure.js +196 -0
  287. package/scripts/lib/reentry-memory-capture.js +241 -0
  288. package/scripts/lib/reentry-memory-retrieval.js +302 -0
  289. package/scripts/lib/reentry-memory-status.js +147 -0
  290. package/scripts/lib/reentry-memory-store.js +183 -0
  291. package/scripts/lib/reentry-state.js +66 -0
  292. package/scripts/lib/release-candidate-bundle.js +166 -0
  293. package/scripts/lib/remediation.js +81 -0
  294. package/scripts/lib/repo-map.js +391 -0
  295. package/scripts/lib/run-action-policy.js +104 -0
  296. package/scripts/lib/run-contract-receipt.js +48 -0
  297. package/scripts/lib/run-contract.js +288 -0
  298. package/scripts/lib/run-cost-to-verified-outcome.js +87 -0
  299. package/scripts/lib/run-improvements-lifecycle.js +330 -0
  300. package/scripts/lib/run-improvements.js +789 -0
  301. package/scripts/lib/run-proof-contract.js +116 -0
  302. package/scripts/lib/run-risk-classifier.js +131 -0
  303. package/scripts/lib/run-task-classifier.js +216 -0
  304. package/scripts/lib/runtime-decision-policy.js +387 -0
  305. package/scripts/lib/safe-path-engine.js +705 -0
  306. package/scripts/lib/safe-repair.js +877 -0
  307. package/scripts/lib/safe-run-controller.js +887 -0
  308. package/scripts/lib/scope-repair-before-approval.js +865 -0
  309. package/scripts/lib/score.js +262 -0
  310. package/scripts/lib/seamless-enforcement.js +329 -0
  311. package/scripts/lib/seamless-outcome.js +689 -0
  312. package/scripts/lib/seamless-reality-gate.js +5053 -0
  313. package/scripts/lib/security-confidence/activation-safety.js +78 -0
  314. package/scripts/lib/security-confidence/adapters/adapter-contract.js +125 -0
  315. package/scripts/lib/security-confidence/adapters/mock-claude-bughunter-adapter.js +36 -0
  316. package/scripts/lib/security-confidence/adapters/mock-decepticon-adapter.js +34 -0
  317. package/scripts/lib/security-confidence/adapters/mock-mcp-scan-adapter.js +35 -0
  318. package/scripts/lib/security-confidence/adapters/mock-snyk-agent-scan-adapter.js +35 -0
  319. package/scripts/lib/security-confidence/adapters/mock-tank-adapter.js +34 -0
  320. package/scripts/lib/security-confidence/adapters/reference-registry.js +63 -0
  321. package/scripts/lib/security-confidence/auth-rbac-plan.js +39 -0
  322. package/scripts/lib/security-confidence/component-inventory.js +151 -0
  323. package/scripts/lib/security-confidence/constants.js +191 -0
  324. package/scripts/lib/security-confidence/dependency-script-risk.js +95 -0
  325. package/scripts/lib/security-confidence/evidence-hygiene.js +127 -0
  326. package/scripts/lib/security-confidence/feature-impact-classifier.js +80 -0
  327. package/scripts/lib/security-confidence/file-utils.js +161 -0
  328. package/scripts/lib/security-confidence/finding-triage.js +90 -0
  329. package/scripts/lib/security-confidence/findings.js +115 -0
  330. package/scripts/lib/security-confidence/index.js +29 -0
  331. package/scripts/lib/security-confidence/permission-budget.js +93 -0
  332. package/scripts/lib/security-confidence/redaction.js +82 -0
  333. package/scripts/lib/security-confidence/redteam-fixtures.js +53 -0
  334. package/scripts/lib/security-confidence/reference-adoption.js +229 -0
  335. package/scripts/lib/security-confidence/reference-taxonomy.js +155 -0
  336. package/scripts/lib/security-confidence/report-quality.js +99 -0
  337. package/scripts/lib/security-confidence/report-writer.js +79 -0
  338. package/scripts/lib/security-confidence/risk-classifier.js +187 -0
  339. package/scripts/lib/security-confidence/runner.js +179 -0
  340. package/scripts/lib/security-confidence/schema.js +188 -0
  341. package/scripts/lib/security-confidence/secret-safety.js +74 -0
  342. package/scripts/lib/security-confidence/security-capability-router.js +98 -0
  343. package/scripts/lib/security-confidence/web-security-smoke-plan.js +46 -0
  344. package/scripts/lib/security-risk-classifier.js +511 -0
  345. package/scripts/lib/security-scan.js +396 -0
  346. package/scripts/lib/session-context-optimizer.js +1211 -0
  347. package/scripts/lib/session-timing.js +322 -0
  348. package/scripts/lib/skill-hygiene.js +805 -0
  349. package/scripts/lib/skill-packs.js +161 -0
  350. package/scripts/lib/skills-operating-layer-v1.js +1023 -0
  351. package/scripts/lib/skills-operating-layer.js +629 -0
  352. package/scripts/lib/smallest-safe-plan.js +214 -0
  353. package/scripts/lib/smart-routing-plan.js +115 -0
  354. package/scripts/lib/smart-work-routing.js +768 -0
  355. package/scripts/lib/source-catalog.js +1022 -0
  356. package/scripts/lib/status-value-summary.js +32 -0
  357. package/scripts/lib/supply-chain-dependency-guard.js +1333 -0
  358. package/scripts/lib/supply-chain-guard.js +219 -0
  359. package/scripts/lib/support-bundle.js +561 -0
  360. package/scripts/lib/support-redaction.js +66 -0
  361. package/scripts/lib/task-continuation.js +440 -0
  362. package/scripts/lib/test-helpers.js +15 -0
  363. package/scripts/lib/tier.js +38 -0
  364. package/scripts/lib/token-context-quality-gate.js +370 -0
  365. package/scripts/lib/token-cost-capture.js +187 -0
  366. package/scripts/lib/token-cost-evidence.js +862 -0
  367. package/scripts/lib/token-cost-intelligence.js +358 -0
  368. package/scripts/lib/token-efficiency-evidence.js +213 -0
  369. package/scripts/lib/token-efficiency-map.js +110 -0
  370. package/scripts/lib/token-evidence.js +703 -0
  371. package/scripts/lib/tokenish.js +17 -0
  372. package/scripts/lib/tool-output-sandbox.js +559 -0
  373. package/scripts/lib/trust-audit.js +136 -0
  374. package/scripts/lib/unified-events.js +396 -0
  375. package/scripts/lib/upgrade-interruption-recovery.js +407 -0
  376. package/scripts/lib/usage-ledger.js +201 -0
  377. package/scripts/lib/value-ledger.js +130 -0
  378. package/scripts/lib/value-proof-calibration.js +531 -0
  379. package/scripts/lib/visual-qa.js +231 -0
  380. package/scripts/lib/voice-alpha.js +29 -0
  381. package/scripts/lib/webhook-idempotency-guard.js +990 -0
  382. package/scripts/lib/work-aware-orchestration.js +976 -0
  383. package/scripts/lib/work-control-receipts.js +577 -0
  384. package/scripts/lib/work-ledger.js +1123 -0
  385. package/scripts/lib/work-panel-preview.js +352 -0
  386. package/scripts/lib/workflow-discipline.js +280 -0
  387. package/scripts/lib/workflow-intelligence-radar.js +804 -0
  388. package/scripts/lib/workflow-signals.js +419 -0
  389. package/scripts/lib/workspace-map.js +281 -0
  390. package/scripts/lib/workspace-registry.js +1367 -0
  391. package/scripts/lib/workspace-resolver.js +542 -0
  392. package/scripts/wuz-doctor.js +315 -0
  393. package/bin/avorelo.mjs +0 -7
  394. package/dist/avorelo.mjs +0 -24678
@@ -0,0 +1,354 @@
1
+ "use strict";
2
+
3
+ // Efficiency Receipt — unified per-run composer over the already-wired efficiency levers.
4
+ //
5
+ // COMPOSITION ONLY. This module does not introduce a new telemetry system, a new
6
+ // dashboard, or a duplicate savings engine. It reads existing structured artifacts
7
+ // (the tool-output sandbox latest summary + persisted product-learning events) and
8
+ // composes them into ONE honest per-run view: Found / Fixed / Saved / Proved /
9
+ // Needs attention.
10
+ //
11
+ // Rules enforced here (deterministic-first):
12
+ // - Receipt is built from structured evidence, never from model self-report.
13
+ // - Every claim carries a claimType: measured | estimated | heuristic.
14
+ // - "Saved" and "Proved" are kept in separate buckets.
15
+ // - No invented token/cost savings. Dollar figures are rejected outright; percent
16
+ // figures are only allowed when measured with a per_run_measurement basis.
17
+ // - No raw secrets/logs leak: every surfaced string is run through a secret scrub.
18
+ //
19
+ // Artifacts:
20
+ // .claude/cco/orchestration/efficiency/latest-receipt.json — avorelo.efficiencyReceipt.v1
21
+ // .claude/cco/reports/efficiency-teams-aggregate.json — avorelo.efficiencyTeamsAggregate.v1
22
+
23
+ const fs = require("fs");
24
+ const path = require("path");
25
+ const { nowIso } = require("./fsx");
26
+ const { readProductLearningEvents } = require("./product-learning-events");
27
+ const { LATEST_SUMMARY_REL } = require("./tool-output-sandbox");
28
+
29
+ const CONTRACT = "avorelo.efficiencyReceipt.v1";
30
+ const TEAMS_CONTRACT = "avorelo.efficiencyTeamsAggregate.v1";
31
+ const RECEIPT_REL = ".claude/cco/orchestration/efficiency/latest-receipt.json";
32
+ const TEAMS_REL = ".claude/cco/reports/efficiency-teams-aggregate.json";
33
+
34
+ const CLAIM_TYPES = ["measured", "estimated", "heuristic"];
35
+
36
+ // Unsupported-claim detection.
37
+ const MONEY_RE = /\$\s?\d|\b\d+(?:\.\d+)?\s?(?:usd|dollars?|cents?)\b/i;
38
+ const SAVINGS_PCT_RE = /\b\d+(?:\.\d+)?\s?%/;
39
+
40
+ // Secret scrub applied to every surfaced string (defence-in-depth; the sandbox and
41
+ // product-learning layer already redact, this guarantees the composed view never leaks).
42
+ const SECRET_RE =
43
+ /(?:sk-[A-Za-z0-9_-]{16,}|ghp_[A-Za-z0-9]{20,}|github_pat_[A-Za-z0-9_]{20,}|AKIA[0-9A-Z]{16}|xox[baprs]-[A-Za-z0-9-]{10,}|eyJ[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}|-----BEGIN [A-Z ]+-----|(?:authorization|bearer)\s*[:=]\s*\S+|\b[A-Fa-f0-9]{32,}\b)/i;
44
+
45
+ function unique(values) {
46
+ return [...new Set((values || []).filter(Boolean))];
47
+ }
48
+
49
+ function scrub(text) {
50
+ const s = String(text == null ? "" : text);
51
+ return SECRET_RE.test(s) ? "[REDACTED]" : s;
52
+ }
53
+
54
+ // ── Claim classification + unsupported-claim rejection ────────────────────────
55
+ // A claim: { lever, label, claimType, value?, basis? }
56
+ function classifyClaim(claim) {
57
+ const errors = [];
58
+ if (!claim || typeof claim !== "object") {
59
+ return { valid: false, errors: ["claim must be an object"] };
60
+ }
61
+ if (!CLAIM_TYPES.includes(claim.claimType)) {
62
+ errors.push(`claimType must be one of: ${CLAIM_TYPES.join(", ")}`);
63
+ }
64
+ const text = `${claim.label || ""} ${claim.value == null ? "" : JSON.stringify(claim.value)}`;
65
+ if (MONEY_RE.test(text)) {
66
+ errors.push("unsupported_savings_claim: dollar/cost figures are not permitted in efficiency claims");
67
+ }
68
+ if (SAVINGS_PCT_RE.test(text)) {
69
+ const ok = claim.claimType === "measured" && claim.basis === "per_run_measurement";
70
+ if (!ok) {
71
+ errors.push("unsupported_savings_claim: percent figures require a measured per_run_measurement basis");
72
+ }
73
+ }
74
+ return { valid: errors.length === 0, errors };
75
+ }
76
+
77
+ function readLatestSandboxSummary(cwd) {
78
+ try {
79
+ const abs = path.join(cwd, LATEST_SUMMARY_REL);
80
+ if (!fs.existsSync(abs)) return null;
81
+ return JSON.parse(fs.readFileSync(abs, "utf8"));
82
+ } catch {
83
+ return null;
84
+ }
85
+ }
86
+
87
+ // ── Scope A: unified per-run efficiency receipt ───────────────────────────────
88
+ function buildEfficiencyReceipt(cwd, options = {}) {
89
+ const events = options.events || readProductLearningEvents(cwd);
90
+ const sandbox =
91
+ options.sandbox !== undefined ? options.sandbox : readLatestSandboxSummary(cwd);
92
+
93
+ const found = [];
94
+ const fixed = [];
95
+ const saved = []; // each: { lever, label, claimType, value, basis }
96
+ const proved = [];
97
+ const needsAttention = [];
98
+ const claims = []; // flat audit list (includes heuristic/estimated not placed in "saved")
99
+ const evidenceRefs = [];
100
+
101
+ const byName = {};
102
+ for (const e of events) {
103
+ if (e && e.eventName) byName[e.eventName] = (byName[e.eventName] || 0) + 1;
104
+ }
105
+
106
+ // Lever 6/13 — output compression (measured) + Lever 8 diagnostic nextBestAction.
107
+ if (sandbox && (sandbox.rawChars != null || sandbox.compressedEvidence)) {
108
+ const rawChars = sandbox.rawChars ?? sandbox.rawEvidence?.rawChars ?? null;
109
+ const summaryChars =
110
+ sandbox.summaryChars ?? sandbox.compressedEvidence?.summaryChars ?? null;
111
+ const ratio =
112
+ sandbox.compressedEvidence?.compressionRatio ?? sandbox.compressionRatio ?? null;
113
+ if (rawChars != null && summaryChars != null) {
114
+ found.push("noisy tool output");
115
+ fixed.push("compressed output into a decision-grade summary");
116
+ const c = {
117
+ lever: "output_compression",
118
+ label: `raw output reduced from ${rawChars} to ${summaryChars} chars`,
119
+ claimType: "measured",
120
+ value: { rawChars, summaryChars, compressionRatio: ratio },
121
+ basis: "per_run_measurement",
122
+ };
123
+ saved.push(c);
124
+ claims.push(c);
125
+ }
126
+ const ref = sandbox.rawEvidenceRef || sandbox.rawEvidence?.path || null;
127
+ const sha = sandbox.rawEvidenceSha256 || sandbox.rawEvidence?.sha256 || null;
128
+ if (ref) {
129
+ evidenceRefs.push({ type: "raw_evidence", ref: scrub(ref), sha256: sha });
130
+ proved.push("raw evidence retained and hashed");
131
+ }
132
+ const redCount = sandbox.redaction?.secretLikeValuesRemoved;
133
+ if (redCount != null) {
134
+ proved.push(`redaction performed (${redCount} secret-like value(s) removed)`);
135
+ }
136
+ if (sandbox.nextBestAction) {
137
+ fixed.push(`next action: ${sandbox.nextBestAction}`);
138
+ }
139
+ if (sandbox.failOpen) {
140
+ needsAttention.push(
141
+ `output sandbox fell back to metadata-only (fail-open: ${sandbox.failOpenReason || "unknown"})`
142
+ );
143
+ }
144
+ } else {
145
+ needsAttention.push("no output-compression evidence available this run");
146
+ }
147
+
148
+ // Lever 5 — tool/MCP tax / no-connect governor (measured event counts).
149
+ const toolLoadAvoided = byName.tool_load_avoided || 0;
150
+ const noConnect = byName.no_connect_decision || 0;
151
+ const toolLoadRequired = byName.tool_load_required || 0;
152
+ if (toolLoadAvoided > 0 || noConnect > 0) {
153
+ found.push("unnecessary external tool request");
154
+ fixed.push("used local evidence instead of loading a tool");
155
+ const c = {
156
+ lever: "tool_tax",
157
+ label: `external tool load avoided (${toolLoadAvoided} event(s))`,
158
+ claimType: "measured",
159
+ value: { toolLoadAvoided, noConnectDecisions: noConnect },
160
+ basis: "event_count",
161
+ };
162
+ saved.push(c);
163
+ claims.push(c);
164
+ }
165
+ if (toolLoadRequired > 0) {
166
+ proved.push(`tool load justified ${toolLoadRequired} time(s) (external evidence required)`);
167
+ }
168
+
169
+ // Lever 2 — prompt cache hygiene (heuristic; never presented as measured saving).
170
+ const cacheVolatile = byName.cache_prefix_volatile_detected || 0;
171
+ const cacheStable = byName.cache_prefix_stable_confirmed || 0;
172
+ if (cacheStable > 0) {
173
+ found.push("cache prefix checked");
174
+ proved.push("cache prefix confirmed stable across samples");
175
+ }
176
+ if (cacheVolatile > 0) {
177
+ found.push("volatile cache prefix");
178
+ fixed.push("kept volatile data outside cacheable context");
179
+ needsAttention.push("cache hygiene flagged volatile prefix content (heuristic)");
180
+ const c = {
181
+ lever: "cache_hygiene",
182
+ label: `volatile prefix detected (${cacheVolatile})`,
183
+ claimType: "heuristic",
184
+ value: { volatileEvents: cacheVolatile },
185
+ };
186
+ claims.push(c); // heuristic — intentionally NOT in "saved"
187
+ }
188
+
189
+ // Lever 1 — strategic routing / route budget (estimated unless measured).
190
+ const expensiveRouteAvoided = byName.expensive_route_avoided || 0;
191
+ if (expensiveRouteAvoided > 0) {
192
+ found.push("expensive route candidate");
193
+ fixed.push("selected the cheapest safe route");
194
+ const c = {
195
+ lever: "route_budget",
196
+ label: `expensive route avoided (${expensiveRouteAvoided})`,
197
+ claimType: "estimated",
198
+ value: { events: expensiveRouteAvoided },
199
+ };
200
+ saved.push(c);
201
+ claims.push(c);
202
+ }
203
+
204
+ // Lever 3/4/9 — context management / reentry hygiene.
205
+ const ctxTrimmed = byName.context_trimmed || 0;
206
+ const staleSuppressed = byName.stale_context_suppressed || 0;
207
+ if (ctxTrimmed > 0 || staleSuppressed > 0) {
208
+ fixed.push("used compact reentry / suppressed stale context");
209
+ proved.push(`context hygiene events persisted (${ctxTrimmed + staleSuppressed})`);
210
+ }
211
+
212
+ // Lever 7 — zero-token observability (always honest: count persisted signals).
213
+ proved.push(`learning events persisted (${events.length})`);
214
+
215
+ // Classification audit + invalid-claim guard.
216
+ const classification = claims.map((c) => {
217
+ const v = classifyClaim(c);
218
+ return { lever: c.lever, label: scrub(c.label), claimType: c.claimType, valid: v.valid };
219
+ });
220
+ const invalidClaimCount = classification.filter((c) => !c.valid).length;
221
+
222
+ const receipt = {
223
+ contract: CONTRACT,
224
+ generatedAt: nowIso(),
225
+ deterministic: true,
226
+ source: "structured_evidence",
227
+ found: unique(found).map(scrub),
228
+ fixed: unique(fixed).map(scrub),
229
+ saved: saved.map((c) => ({
230
+ lever: c.lever,
231
+ label: scrub(c.label),
232
+ claimType: c.claimType,
233
+ value: c.value,
234
+ basis: c.basis || null,
235
+ })),
236
+ proved: unique(proved).map(scrub),
237
+ needsAttention: unique(needsAttention).map(scrub),
238
+ claims: classification,
239
+ invalidClaimCount,
240
+ evidenceRefs,
241
+ userLine: null,
242
+ };
243
+ receipt.userLine = formatEfficiencyReceiptLine(receipt);
244
+ return receipt;
245
+ }
246
+
247
+ function formatEfficiencyReceiptLine(receipt) {
248
+ // Compact, honest. Only measured savings are counted in the headline; estimated /
249
+ // heuristic items live in advanced detail (the claims array), never presented as fact.
250
+ const measuredSaved = receipt.saved.filter((s) => s.claimType === "measured").length;
251
+ const parts = [];
252
+ if (receipt.found.length) parts.push(`${receipt.found.length} found`);
253
+ if (receipt.fixed.length) parts.push(`${receipt.fixed.length} fixed`);
254
+ if (measuredSaved) parts.push(`${measuredSaved} measured saving${measuredSaved === 1 ? "" : "s"}`);
255
+ if (receipt.proved.length) parts.push(`${receipt.proved.length} proved`);
256
+ if (receipt.needsAttention.length) parts.push(`${receipt.needsAttention.length} need attention`);
257
+ return `Avorelo efficiency: ${parts.join(", ") || "no efficiency signals this run"}`;
258
+ }
259
+
260
+ function writeEfficiencyReceipt(cwd, receipt) {
261
+ const abs = path.join(cwd, RECEIPT_REL);
262
+ fs.mkdirSync(path.dirname(abs), { recursive: true });
263
+ fs.writeFileSync(abs, JSON.stringify(receipt, null, 2), "utf8");
264
+ return RECEIPT_REL;
265
+ }
266
+
267
+ // ── Scope B: Teams aggregate / "AI Waste Reduced" (privacy-safe, multi-run) ────
268
+ function buildEfficiencyTeamsAggregate(cwd, options = {}) {
269
+ const events = options.events || readProductLearningEvents(cwd);
270
+ const count = (name) => events.filter((e) => e && e.eventName === name).length;
271
+
272
+ const metrics = {
273
+ outputsCompressed: count("output_compressed"),
274
+ rawOutputRetained: count("raw_output_retained"),
275
+ noisyOutputArtifactsWritten: count("raw_tool_output_artifact_written"),
276
+ noConnectDecisions: count("no_connect_decision"),
277
+ toolLoadAvoided: count("tool_load_avoided"),
278
+ toolLoadRequired: count("tool_load_required"),
279
+ mcpLazyLoaded: count("mcp_lazy_loaded"),
280
+ cachePrefixStable: count("cache_prefix_stable_confirmed"),
281
+ cachePrefixVolatile: count("cache_prefix_volatile_detected"),
282
+ contextTrimmed: count("context_trimmed"),
283
+ staleContextSuppressed: count("stale_context_suppressed"),
284
+ expensiveRouteAvoided: count("expensive_route_avoided"),
285
+ routeEscalationsJustified: count("route_escalation_justified"),
286
+ lifecycleHookInvocations: count("lifecycle_hook_handler_invoked"),
287
+ sandboxSummariesWritten: count("tool_output_sandbox_summary_written"),
288
+ };
289
+
290
+ // Category breakdown (no payloads — counts only).
291
+ const byCategory = {};
292
+ for (const e of events) {
293
+ if (e && e.category) byCategory[e.category] = (byCategory[e.category] || 0) + 1;
294
+ }
295
+
296
+ // Proof coverage is surfaced BEFORE any cost framing (we never assert money totals).
297
+ const proofCoverage = {
298
+ compressionWithRetention: Math.min(
299
+ metrics.outputsCompressed,
300
+ metrics.rawOutputRetained + metrics.noisyOutputArtifactsWritten
301
+ ),
302
+ redactionEvents: count("redaction_performed"),
303
+ classificationsPresent: true,
304
+ moneyClaims: false,
305
+ };
306
+
307
+ const aggregate = {
308
+ contract: TEAMS_CONTRACT,
309
+ generatedAt: nowIso(),
310
+ privacySafe: true,
311
+ basis: "product_learning_events",
312
+ totalEvents: events.length,
313
+ metrics,
314
+ byCategory,
315
+ proofCoverage,
316
+ runsWithMissingEvidence: events.length === 0 ? 1 : 0,
317
+ customerLine: null,
318
+ };
319
+ aggregate.customerLine = buildTeamsCustomerLine(aggregate);
320
+ return aggregate;
321
+ }
322
+
323
+ function buildTeamsCustomerLine(aggregate) {
324
+ const m = aggregate.metrics;
325
+ return scrub(
326
+ `AI waste reduced: ${m.outputsCompressed} noisy outputs compressed, ` +
327
+ `${m.toolLoadAvoided} unnecessary tool loads avoided, ` +
328
+ `${m.cachePrefixVolatile} volatile cache prefixes caught ` +
329
+ `(${aggregate.totalEvents} privacy-safe signals; counts only, no raw prompts or logs).`
330
+ );
331
+ }
332
+
333
+ function writeEfficiencyTeamsAggregate(cwd, aggregate) {
334
+ const abs = path.join(cwd, TEAMS_REL);
335
+ fs.mkdirSync(path.dirname(abs), { recursive: true });
336
+ fs.writeFileSync(abs, JSON.stringify(aggregate, null, 2), "utf8");
337
+ return TEAMS_REL;
338
+ }
339
+
340
+ module.exports = {
341
+ CONTRACT,
342
+ TEAMS_CONTRACT,
343
+ RECEIPT_REL,
344
+ TEAMS_REL,
345
+ CLAIM_TYPES,
346
+ classifyClaim,
347
+ readLatestSandboxSummary,
348
+ buildEfficiencyReceipt,
349
+ formatEfficiencyReceiptLine,
350
+ writeEfficiencyReceipt,
351
+ buildEfficiencyTeamsAggregate,
352
+ buildTeamsCustomerLine,
353
+ writeEfficiencyTeamsAggregate,
354
+ };
@@ -0,0 +1,100 @@
1
+ "use strict";
2
+
3
+ const path = require("path");
4
+ const { safeReadJson } = require("./fsx");
5
+ const {
6
+ getPlan,
7
+ getCapability,
8
+ isCapabilityEnabled,
9
+ comparePlans,
10
+ } = require("./plans");
11
+
12
+ const PLAN_ENV = "AVORELO_PLAN";
13
+ const SUPPORTED_PUBLIC_PLANS = new Set(["free", "pro"]);
14
+
15
+ function normalizePlanName(value) {
16
+ const normalized = String(value || "").trim().toLowerCase();
17
+ if (normalized === "teams") return "pro";
18
+ if (normalized === "enterprise") return "pro";
19
+ return normalized;
20
+ }
21
+
22
+ function resolvePlanFromAccountState(cwd) {
23
+ const account = safeReadJson(cwd, ".claude/cco/state/account.json", null);
24
+ const fromAccount = normalizePlanName(account?.plan);
25
+ if (SUPPORTED_PUBLIC_PLANS.has(fromAccount)) return fromAccount;
26
+ return null;
27
+ }
28
+
29
+ function resolvePlanFromProjectConfig(cwd) {
30
+ const config = safeReadJson(cwd, ".claude/cco/config.json", null);
31
+ const fromConfig = normalizePlanName(config?.tier);
32
+ if (SUPPORTED_PUBLIC_PLANS.has(fromConfig)) return fromConfig;
33
+ if (fromConfig === "teams") return "pro";
34
+ return null;
35
+ }
36
+
37
+ function getCurrentPlan(options = {}) {
38
+ const cwd = path.resolve(options.cwd || process.cwd());
39
+ const explicitPlan = normalizePlanName(options.plan);
40
+ if (SUPPORTED_PUBLIC_PLANS.has(explicitPlan)) {
41
+ return explicitPlan;
42
+ }
43
+ const envPlan = normalizePlanName(process.env[PLAN_ENV]);
44
+ if (envPlan) {
45
+ return SUPPORTED_PUBLIC_PLANS.has(envPlan) ? envPlan : "free";
46
+ }
47
+ return resolvePlanFromAccountState(cwd) || resolvePlanFromProjectConfig(cwd) || "free";
48
+ }
49
+
50
+ function capabilityEnabled(capabilityId, options = {}) {
51
+ return isCapabilityEnabled(getCurrentPlan(options), capabilityId);
52
+ }
53
+
54
+ function requireCapability(capabilityId, options = {}) {
55
+ if (capabilityEnabled(capabilityId, options)) {
56
+ return getCapability(capabilityId);
57
+ }
58
+ const plan = getCurrentPlan(options);
59
+ const capability = getCapability(capabilityId);
60
+ const comparison = comparePlans();
61
+ const unlock = comparison.upgradeUnlocks.find((item) => item.id === capabilityId);
62
+ const label = capability?.label || capabilityId;
63
+ const note = unlock ? ` Upgrade to Pro to unlock ${label.toLowerCase()}.` : "";
64
+ throw new Error(`${label} is not available on the ${getPlan(plan)?.name || plan} plan.${note}`);
65
+ }
66
+
67
+ function getQuota(capabilityId, options = {}) {
68
+ const plan = getCurrentPlan(options);
69
+ const capability = requireCapability(capabilityId, options);
70
+ if (!capability.quota) return null;
71
+
72
+ if (capabilityId === "visual_qa_weekly" && plan === "free") {
73
+ return { ...capability.quota };
74
+ }
75
+ if (capabilityId === "visual_qa_weekly" && plan === "pro") {
76
+ const advanced = getCapability("visual_qa_advanced");
77
+ return advanced?.quota ? { ...advanced.quota } : { period: "month", limit: 50 };
78
+ }
79
+ return { ...capability.quota };
80
+ }
81
+
82
+ function getHistoryRetention(planName = getCurrentPlan()) {
83
+ const plan = getPlan(planName) || getPlan("free");
84
+ return { ...(plan.historyRetention || { mode: "latest_only", maxReports: 1, retentionDays: 7 }) };
85
+ }
86
+
87
+ function canExportReports(planName = getCurrentPlan()) {
88
+ const plan = getPlan(planName) || getPlan("free");
89
+ return plan.exportReports === true;
90
+ }
91
+
92
+ module.exports = {
93
+ PLAN_ENV,
94
+ getCurrentPlan,
95
+ capabilityEnabled,
96
+ requireCapability,
97
+ getQuota,
98
+ getHistoryRetention,
99
+ canExportReports,
100
+ };