avorelo 0.1.0

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 (258) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +56 -0
  3. package/bin/avorelo +9 -0
  4. package/package.json +135 -0
  5. package/scripts/README.md +40 -0
  6. package/scripts/cco-dashboard.js +252 -0
  7. package/scripts/cco-status.js +430 -0
  8. package/scripts/lib/activation/account-state.js +37 -0
  9. package/scripts/lib/activation/activation-runner.js +546 -0
  10. package/scripts/lib/activation/activation-self-healing.js +480 -0
  11. package/scripts/lib/activation/activation-state.js +83 -0
  12. package/scripts/lib/activation/activation-summary.js +191 -0
  13. package/scripts/lib/activation/adapters/claude-code.js +77 -0
  14. package/scripts/lib/activation/adapters/codex-cli.js +52 -0
  15. package/scripts/lib/activation/adapters/cursor.js +37 -0
  16. package/scripts/lib/activation/adapters/github-agent.js +39 -0
  17. package/scripts/lib/activation/adapters/terminal.js +42 -0
  18. package/scripts/lib/activation/adapters/vscode.js +39 -0
  19. package/scripts/lib/activation/adapters/windsurf.js +37 -0
  20. package/scripts/lib/activation/ai-surface-detector.js +151 -0
  21. package/scripts/lib/activation/connect-account.js +145 -0
  22. package/scripts/lib/activation/detect-environment.js +75 -0
  23. package/scripts/lib/activation/detect-hosts.js +62 -0
  24. package/scripts/lib/activation/format-activation-output.js +109 -0
  25. package/scripts/lib/activation/next-action.js +43 -0
  26. package/scripts/lib/activation/repair-engine.js +219 -0
  27. package/scripts/lib/activation-distribution-readiness.js +507 -0
  28. package/scripts/lib/adapter-conformance.js +176 -0
  29. package/scripts/lib/adapter-readiness.js +417 -0
  30. package/scripts/lib/adapter-safety-boundaries.js +335 -0
  31. package/scripts/lib/adapter-technical-readiness-gate.js +205 -0
  32. package/scripts/lib/agent-access-governance.js +455 -0
  33. package/scripts/lib/agent-enforcement.js +765 -0
  34. package/scripts/lib/agent-policy-profile.js +210 -0
  35. package/scripts/lib/agent-security/action-evaluator.js +507 -0
  36. package/scripts/lib/agent-security/adapter-registry.js +98 -0
  37. package/scripts/lib/agent-security/auto-policy.js +139 -0
  38. package/scripts/lib/agent-security/bounded-scan.js +93 -0
  39. package/scripts/lib/agent-security/enforcement-adapter.js +174 -0
  40. package/scripts/lib/agent-security/enforcement-engine.js +1129 -0
  41. package/scripts/lib/agent-security/file-write-adapter.js +183 -0
  42. package/scripts/lib/agent-security/file-write-rules.js +178 -0
  43. package/scripts/lib/agent-security/index.js +3342 -0
  44. package/scripts/lib/agent-security/instruction-risk.js +181 -0
  45. package/scripts/lib/agent-security/mcp-action-adapter.js +185 -0
  46. package/scripts/lib/agent-security/mcp-action-rules.js +184 -0
  47. package/scripts/lib/agent-security/package-action-adapter.js +175 -0
  48. package/scripts/lib/agent-security/package-action-rules.js +233 -0
  49. package/scripts/lib/agent-security/performance.js +148 -0
  50. package/scripts/lib/agent-security/permission-minimizer.js +403 -0
  51. package/scripts/lib/agent-security/scan-cache.js +74 -0
  52. package/scripts/lib/agent-security/source-trust.js +146 -0
  53. package/scripts/lib/ai-install-prompt.js +288 -0
  54. package/scripts/lib/ai-workspace-hygiene.js +1499 -0
  55. package/scripts/lib/alpha-activation.js +520 -0
  56. package/scripts/lib/alpha-feedback.js +263 -0
  57. package/scripts/lib/alpha-readiness-gate.js +332 -0
  58. package/scripts/lib/anti-gaming.js +169 -0
  59. package/scripts/lib/artifact-health.js +431 -0
  60. package/scripts/lib/attribution.js +180 -0
  61. package/scripts/lib/audit.js +289 -0
  62. package/scripts/lib/avorelo-skill-registry.js +810 -0
  63. package/scripts/lib/batch-jobs.js +71 -0
  64. package/scripts/lib/brain-pack.js +578 -0
  65. package/scripts/lib/brand-boundary.js +424 -0
  66. package/scripts/lib/brand.js +74 -0
  67. package/scripts/lib/browser-capability.js +1048 -0
  68. package/scripts/lib/browser-proof-preflight.js +321 -0
  69. package/scripts/lib/cache-readiness.js +187 -0
  70. package/scripts/lib/canonical-reentry.js +162 -0
  71. package/scripts/lib/capability-packs.js +314 -0
  72. package/scripts/lib/capability-recommender.js +512 -0
  73. package/scripts/lib/capability-registry.js +1059 -0
  74. package/scripts/lib/carry-forward-surfacing.js +194 -0
  75. package/scripts/lib/ccusage-adapter.js +188 -0
  76. package/scripts/lib/company-loop.js +1149 -0
  77. package/scripts/lib/config.js +637 -0
  78. package/scripts/lib/context-acquisition-plan.js +287 -0
  79. package/scripts/lib/context-budget-guard.js +170 -0
  80. package/scripts/lib/context-budget-scanner.js +257 -0
  81. package/scripts/lib/context-optimizer.js +715 -0
  82. package/scripts/lib/context-reduction-plan.js +178 -0
  83. package/scripts/lib/context-safety.js +88 -0
  84. package/scripts/lib/context-savings-engine.js +158 -0
  85. package/scripts/lib/cost-evidence.js +254 -0
  86. package/scripts/lib/cross-host-install-plan.js +308 -0
  87. package/scripts/lib/cross-host-install-readiness.js +237 -0
  88. package/scripts/lib/cross-host-value-flow.js +268 -0
  89. package/scripts/lib/dashboard.js +900 -0
  90. package/scripts/lib/design-partner-feedback.js +346 -0
  91. package/scripts/lib/entitlements.js +100 -0
  92. package/scripts/lib/execution-packet.js +559 -0
  93. package/scripts/lib/experimentation-events.js +547 -0
  94. package/scripts/lib/external-capability-compliance.js +107 -0
  95. package/scripts/lib/external-user-simulation.js +166 -0
  96. package/scripts/lib/failure-recovery-readiness.js +81 -0
  97. package/scripts/lib/failure-recovery.js +419 -0
  98. package/scripts/lib/feedback-intelligence.js +537 -0
  99. package/scripts/lib/feedback-signals.js +205 -0
  100. package/scripts/lib/file-integrity.js +68 -0
  101. package/scripts/lib/fsx.js +127 -0
  102. package/scripts/lib/full-readiness-gate.js +451 -0
  103. package/scripts/lib/guidance-builder.js +174 -0
  104. package/scripts/lib/hook-apply.js +1019 -0
  105. package/scripts/lib/hook-baseline.js +310 -0
  106. package/scripts/lib/hook-config-preview.js +275 -0
  107. package/scripts/lib/hook-contracts.js +290 -0
  108. package/scripts/lib/hook-safety-boundary-readiness.js +80 -0
  109. package/scripts/lib/host-capability-matrix.js +351 -0
  110. package/scripts/lib/host-support-context.js +254 -0
  111. package/scripts/lib/http-hook-action.js +538 -0
  112. package/scripts/lib/install-ai-readiness.js +84 -0
  113. package/scripts/lib/install-intake-risk.js +1037 -0
  114. package/scripts/lib/install-journey-intelligence.js +329 -0
  115. package/scripts/lib/intervention-guidance.js +57 -0
  116. package/scripts/lib/known-limitations.js +115 -0
  117. package/scripts/lib/l8-path-truth.js +146 -0
  118. package/scripts/lib/launch-hardening-gate.js +436 -0
  119. package/scripts/lib/launch-readiness.js +628 -0
  120. package/scripts/lib/learning-memory.js +686 -0
  121. package/scripts/lib/lifecycle-hooks.js +802 -0
  122. package/scripts/lib/local-package-smoke.js +423 -0
  123. package/scripts/lib/local-pricing.js +299 -0
  124. package/scripts/lib/mcp-enforcement.js +311 -0
  125. package/scripts/lib/mcp-least-privilege-policy.js +303 -0
  126. package/scripts/lib/mcp-tool-inventory.js +388 -0
  127. package/scripts/lib/mcp-tool-risk.js +0 -0
  128. package/scripts/lib/memory.js +335 -0
  129. package/scripts/lib/metrics.js +699 -0
  130. package/scripts/lib/micro-proof.js +133 -0
  131. package/scripts/lib/next-run-context.js +436 -0
  132. package/scripts/lib/operating-value.js +1648 -0
  133. package/scripts/lib/optimization-v3.js +122 -0
  134. package/scripts/lib/orchestration/adapters/_shared.js +49 -0
  135. package/scripts/lib/orchestration/adapters/aider.js +18 -0
  136. package/scripts/lib/orchestration/adapters/claude-code.js +35 -0
  137. package/scripts/lib/orchestration/adapters/codex.js +35 -0
  138. package/scripts/lib/orchestration/adapters/gemini-cli.js +18 -0
  139. package/scripts/lib/orchestration/adapters/git.js +25 -0
  140. package/scripts/lib/orchestration/adapters/index.js +31 -0
  141. package/scripts/lib/orchestration/adapters/lm-studio.js +18 -0
  142. package/scripts/lib/orchestration/adapters/ollama.js +18 -0
  143. package/scripts/lib/orchestration/adapters/opencode.js +18 -0
  144. package/scripts/lib/orchestration/adapters/openrouter.js +18 -0
  145. package/scripts/lib/orchestration/adapters/test-runner.js +25 -0
  146. package/scripts/lib/orchestration/cli.js +438 -0
  147. package/scripts/lib/orchestration/execution-manager.js +279 -0
  148. package/scripts/lib/orchestration/handoff.js +314 -0
  149. package/scripts/lib/orchestration/index.js +456 -0
  150. package/scripts/lib/orchestration/inventory.js +47 -0
  151. package/scripts/lib/orchestration/model-discovery.js +498 -0
  152. package/scripts/lib/orchestration/model-profiler.js +170 -0
  153. package/scripts/lib/orchestration/model-profiles.js +252 -0
  154. package/scripts/lib/orchestration/model-refresh-policy.js +72 -0
  155. package/scripts/lib/orchestration/proof-writer.js +349 -0
  156. package/scripts/lib/orchestration/provider-discovery/aider.js +49 -0
  157. package/scripts/lib/orchestration/provider-discovery/claude-code.js +56 -0
  158. package/scripts/lib/orchestration/provider-discovery/codex.js +49 -0
  159. package/scripts/lib/orchestration/provider-discovery/common.js +186 -0
  160. package/scripts/lib/orchestration/provider-discovery/gemini.js +106 -0
  161. package/scripts/lib/orchestration/provider-discovery/lm-studio.js +118 -0
  162. package/scripts/lib/orchestration/provider-discovery/models-dev.js +12 -0
  163. package/scripts/lib/orchestration/provider-discovery/ollama.js +100 -0
  164. package/scripts/lib/orchestration/provider-discovery/opencode.js +47 -0
  165. package/scripts/lib/orchestration/provider-discovery/openrouter.js +44 -0
  166. package/scripts/lib/orchestration/risk-classifier.js +130 -0
  167. package/scripts/lib/orchestration/routing-policy.js +486 -0
  168. package/scripts/lib/orchestration/settings.js +112 -0
  169. package/scripts/lib/orchestration/state.js +165 -0
  170. package/scripts/lib/orchestration/verification-manager.js +138 -0
  171. package/scripts/lib/output-profiles.js +146 -0
  172. package/scripts/lib/package-content-audit.js +368 -0
  173. package/scripts/lib/package-runtime.js +278 -0
  174. package/scripts/lib/plan-surface.js +53 -0
  175. package/scripts/lib/plans.js +2318 -0
  176. package/scripts/lib/policy-provider.js +27 -0
  177. package/scripts/lib/prelaunch-activation-readiness.js +409 -0
  178. package/scripts/lib/prelaunch-evidence-store.js +816 -0
  179. package/scripts/lib/prelaunch-intelligence.js +869 -0
  180. package/scripts/lib/pricing-experiment.js +118 -0
  181. package/scripts/lib/pro-moment-events.js +77 -0
  182. package/scripts/lib/pro-moment-state.js +227 -0
  183. package/scripts/lib/pro-moments.js +1216 -0
  184. package/scripts/lib/product-learning-events.js +629 -0
  185. package/scripts/lib/project-profile.js +555 -0
  186. package/scripts/lib/prompt-compiler.js +280 -0
  187. package/scripts/lib/prompt-lint.js +32 -0
  188. package/scripts/lib/prompt-suggestions.js +52 -0
  189. package/scripts/lib/proof-canonical.js +398 -0
  190. package/scripts/lib/proof-drilldown.js +383 -0
  191. package/scripts/lib/proof-events.js +342 -0
  192. package/scripts/lib/proof-history.js +243 -0
  193. package/scripts/lib/proof-metrics.js +296 -0
  194. package/scripts/lib/proof-outcome-evidence.js +134 -0
  195. package/scripts/lib/proof-receipt.js +335 -0
  196. package/scripts/lib/proof-record.js +461 -0
  197. package/scripts/lib/public-activation-distribution-gate.js +258 -0
  198. package/scripts/lib/public-cli.js +3891 -0
  199. package/scripts/lib/public-distribution-truth.js +211 -0
  200. package/scripts/lib/public-install-claim-checker.js +294 -0
  201. package/scripts/lib/publish-provenance-readiness.js +283 -0
  202. package/scripts/lib/readiness-delta.js +218 -0
  203. package/scripts/lib/readiness-evidence-closure.js +196 -0
  204. package/scripts/lib/reentry-memory-capture.js +241 -0
  205. package/scripts/lib/reentry-memory-retrieval.js +302 -0
  206. package/scripts/lib/reentry-memory-status.js +146 -0
  207. package/scripts/lib/reentry-memory-store.js +178 -0
  208. package/scripts/lib/reentry-state.js +66 -0
  209. package/scripts/lib/release-candidate-bundle.js +166 -0
  210. package/scripts/lib/remediation.js +81 -0
  211. package/scripts/lib/repo-map.js +391 -0
  212. package/scripts/lib/run-improvements-lifecycle.js +330 -0
  213. package/scripts/lib/run-improvements.js +789 -0
  214. package/scripts/lib/runtime-decision-policy.js +387 -0
  215. package/scripts/lib/safe-path-engine.js +705 -0
  216. package/scripts/lib/safe-run-controller.js +887 -0
  217. package/scripts/lib/score.js +262 -0
  218. package/scripts/lib/seamless-enforcement.js +329 -0
  219. package/scripts/lib/seamless-outcome.js +689 -0
  220. package/scripts/lib/seamless-reality-gate.js +5043 -0
  221. package/scripts/lib/security-risk-classifier.js +511 -0
  222. package/scripts/lib/security-scan.js +384 -0
  223. package/scripts/lib/session-context-optimizer.js +1211 -0
  224. package/scripts/lib/session-timing.js +315 -0
  225. package/scripts/lib/skill-hygiene.js +805 -0
  226. package/scripts/lib/skill-packs.js +161 -0
  227. package/scripts/lib/skills-operating-layer.js +580 -0
  228. package/scripts/lib/smart-work-routing.js +768 -0
  229. package/scripts/lib/source-catalog.js +700 -0
  230. package/scripts/lib/status-value-summary.js +32 -0
  231. package/scripts/lib/support-bundle.js +578 -0
  232. package/scripts/lib/task-continuation.js +440 -0
  233. package/scripts/lib/test-helpers.js +15 -0
  234. package/scripts/lib/tier.js +38 -0
  235. package/scripts/lib/token-context-quality-gate.js +370 -0
  236. package/scripts/lib/token-cost-capture.js +187 -0
  237. package/scripts/lib/token-cost-intelligence.js +358 -0
  238. package/scripts/lib/token-efficiency-evidence.js +213 -0
  239. package/scripts/lib/token-evidence.js +699 -0
  240. package/scripts/lib/tokenish.js +17 -0
  241. package/scripts/lib/tool-output-sandbox.js +304 -0
  242. package/scripts/lib/trust-audit.js +136 -0
  243. package/scripts/lib/unified-events.js +396 -0
  244. package/scripts/lib/upgrade-interruption-recovery.js +407 -0
  245. package/scripts/lib/usage-ledger.js +201 -0
  246. package/scripts/lib/value-ledger.js +130 -0
  247. package/scripts/lib/value-proof-calibration.js +531 -0
  248. package/scripts/lib/visual-qa.js +231 -0
  249. package/scripts/lib/voice-alpha.js +29 -0
  250. package/scripts/lib/work-aware-orchestration.js +976 -0
  251. package/scripts/lib/work-control-receipts.js +577 -0
  252. package/scripts/lib/work-ledger.js +1123 -0
  253. package/scripts/lib/work-panel-preview.js +352 -0
  254. package/scripts/lib/workflow-discipline.js +280 -0
  255. package/scripts/lib/workflow-signals.js +419 -0
  256. package/scripts/lib/workspace-map.js +281 -0
  257. package/scripts/lib/workspace-registry.js +1367 -0
  258. package/scripts/lib/workspace-resolver.js +480 -0
@@ -0,0 +1,438 @@
1
+ "use strict";
2
+
3
+ const {
4
+ routeTask,
5
+ runTask,
6
+ buildOrchestrationStatus,
7
+ buildAgentModelOrchestrationSurface,
8
+ generateHandoff,
9
+ modelsText,
10
+ readCurrentProof,
11
+ proofText,
12
+ buildTaskContext,
13
+ } = require("./index");
14
+ const { verifyWorkspace } = require("./verification-manager");
15
+ const { buildStatusDashboard } = require("../dashboard");
16
+ const { getCurrentPlan, canExportReports } = require("../entitlements");
17
+ const { appendProMomentEvent } = require("../pro-moment-events");
18
+ const {
19
+ buildCompactProMomentLines,
20
+ buildProMomentSurface,
21
+ recordProMomentEvaluation,
22
+ } = require("../pro-moments");
23
+ const {
24
+ exportProofHistoryBundle,
25
+ formatProofExportText,
26
+ formatProofHistoryText,
27
+ readProofHistory,
28
+ } = require("../proof-history");
29
+ const {
30
+ getSettings,
31
+ setMode,
32
+ setBooleanFlag,
33
+ setWorkerEnabled,
34
+ formatSettingsText,
35
+ } = require("./settings");
36
+ const { loadInventory } = require("./inventory");
37
+
38
+ function taskFromArgs(args) {
39
+ return args.filter((arg) => !arg.startsWith("--")).join(" ").trim();
40
+ }
41
+
42
+ function wantsJson(args) {
43
+ return args.includes("--json");
44
+ }
45
+
46
+ function parseSurface(args) {
47
+ const found = args.find((arg) => arg.startsWith("--surface="));
48
+ return found ? found.split("=").slice(1).join("=") : "avorelo_cli";
49
+ }
50
+
51
+ function parseBool(value) {
52
+ return ["1", "true", "yes", "on"].includes(String(value).toLowerCase());
53
+ }
54
+
55
+ function wantsHistory(args = []) {
56
+ return args.includes("--history");
57
+ }
58
+
59
+ function wantsExport(args = []) {
60
+ return args.includes("--export");
61
+ }
62
+
63
+ function buildProofDepthPayload(surface) {
64
+ return {
65
+ momentId: surface.momentId,
66
+ surface: surface.surface,
67
+ displayLevel: surface.displayLevel,
68
+ reasonCodes: surface.reasonCodes || [],
69
+ blockedReasonCodes: surface.blockedReasonCodes || [],
70
+ plan: surface.plan,
71
+ sessionCount: surface.sessionCount,
72
+ valueEventsCount: surface.valueEventsCount,
73
+ dismissCount: surface.dismissCount,
74
+ cooldownActive: surface.cooldownActive,
75
+ nextEligibleAt: surface.nextEligibleAt,
76
+ };
77
+ }
78
+
79
+ function buildProofDepthSurface(cwd, momentSurface, featureRequested) {
80
+ const status = buildStatusDashboard(cwd, { limit: 7 });
81
+ return buildProMomentSurface(cwd, {
82
+ surface: momentSurface,
83
+ status,
84
+ momentId: "evidence_history_export",
85
+ featureRequested,
86
+ userAction: featureRequested,
87
+ proactive: true,
88
+ respectRecentShown: false,
89
+ });
90
+ }
91
+
92
+ function renderFreeProofDepthText(baseText, surface) {
93
+ const lines = [String(baseText || "").trimEnd()];
94
+ const proLines = buildCompactProMomentLines(surface);
95
+ if (proLines.length) {
96
+ lines.push("");
97
+ lines.push(...proLines);
98
+ }
99
+ return `${lines.filter(Boolean).join("\n")}\n`;
100
+ }
101
+
102
+ function buildFreeProofDepthJson(proof, surface, extras = {}) {
103
+ return {
104
+ proof: proof || {},
105
+ proMoment: surface,
106
+ checkoutStarted: false,
107
+ accountRequired: false,
108
+ ...extras,
109
+ };
110
+ }
111
+
112
+ function formatWorkerNotes(inventory) {
113
+ const tools = Array.isArray(inventory?.tools) ? inventory.tools : [];
114
+ const notes = [];
115
+ const gemini = tools.find((tool) => tool.toolId === "gemini_cli");
116
+ const lmStudio = tools.find((tool) => tool.toolId === "lm_studio");
117
+
118
+ if (gemini?.installStatus === "installed_not_on_path") {
119
+ notes.push("Gemini CLI command not found on PATH");
120
+ } else if (gemini?.availability === "needs_login") {
121
+ notes.push("Gemini CLI needs login");
122
+ }
123
+
124
+ if (lmStudio?.installStatus === "installed_or_configured_but_not_running") {
125
+ notes.push("LM Studio local server not running");
126
+ } else if (lmStudio?.installStatus === "configured_but_no_models") {
127
+ notes.push("LM Studio server reachable but no models are loaded");
128
+ }
129
+
130
+ return notes.length > 0 ? notes.join("; ") : null;
131
+ }
132
+
133
+ function renderRouteCommand(cwd, args = []) {
134
+ const taskText = taskFromArgs(args);
135
+ if (!taskText) throw new Error("`avorelo route` requires a task.");
136
+ const result = routeTask(cwd, taskText, {
137
+ surface: parseSurface(args),
138
+ refreshInventory: args.includes("--refresh"),
139
+ });
140
+
141
+ if (wantsJson(args)) return JSON.stringify(result.route, null, 2);
142
+
143
+ // Auto-write value summary after routing (best-effort)
144
+ try {
145
+ const { writeSeamlessRunReceipt, formatCompactRouteLine, getDecisionVisibility } = require("../seamless-enforcement");
146
+ const visibility = getDecisionVisibility({
147
+ actionType: "model_worker_routing",
148
+ riskLevel: result.taskContext.classification.risk || "low",
149
+ });
150
+ writeSeamlessRunReceipt(cwd, {
151
+ command: "route",
152
+ manualDecisionsAvoided: 1,
153
+ strongWorkerReservedForCriticalStage: result.route.premiumUseInvolved === true,
154
+ escalationRecommended: (result.route.fallbackReasonCodes || []).includes("ESCALATION_RECOMMENDED"),
155
+ userInterruptAvoided: !visibility.interruptRequired,
156
+ });
157
+ // In automatic mode, show compact outcome line
158
+ if (!visibility.showDetail) {
159
+ return formatCompactRouteLine(result.route);
160
+ }
161
+ } catch { /* enforcement is best-effort */ }
162
+
163
+ return [
164
+ "Avorelo Route",
165
+ `State: ${result.route.state}`,
166
+ `Inventory source: ${result.route.inventorySource || "cache"}`,
167
+ `Refresh level: ${result.route.refreshLevel || "cache"}`,
168
+ `Task type: ${result.taskContext.classification.taskType}`,
169
+ `Risk: ${result.taskContext.classification.risk}`,
170
+ `Chosen: ${result.route.chosenTool || "none"} / ${result.route.selectedModel || "unknown"} / ${result.route.chosenModelProfile || "unknown"}`,
171
+ `Fallback: ${result.route.fallbackTool || "none"} / ${result.route.fallbackModel || "unknown"} / ${result.route.fallbackModelProfile || "unknown"}`,
172
+ `Verify: ${(result.route.expectedVerification || []).join("; ") || "none"}`,
173
+ `Safety: ${(result.route.safetyNotes || []).join(" ") || "none"}`,
174
+ ].join("\n");
175
+ }
176
+
177
+ function renderRunCommand(cwd, args = []) {
178
+ const taskText = taskFromArgs(args);
179
+ if (!taskText) throw new Error("`avorelo run` requires a task.");
180
+
181
+ const prepareOnly = args.includes("--prepare-only") || args.includes("--no-execute");
182
+ const debug = args.includes("--debug");
183
+ const dryRun = args.includes("--dry-run");
184
+
185
+ try {
186
+ const { runSafeControlPipeline, formatSafeRunText } = require("../safe-run-controller");
187
+ const receipt = runSafeControlPipeline(cwd, taskText, {
188
+ prepareOnly,
189
+ dryRun,
190
+ surface: parseSurface(args),
191
+ });
192
+
193
+ if (wantsJson(args)) return JSON.stringify(receipt, null, 2);
194
+ return formatSafeRunText(receipt, { debug });
195
+ } catch (err) {
196
+ // Fallback to legacy run if safe-run-controller unavailable
197
+ try {
198
+ const result = runTask(cwd, taskText, {
199
+ surface: parseSurface(args),
200
+ dryRun,
201
+ refreshInventory: args.includes("--refresh"),
202
+ });
203
+ return wantsJson(args)
204
+ ? JSON.stringify({ runId: result.runId, route: result.route, execution: result.execution, verification: result.verification, proof: result.proof }, null, 2)
205
+ : [`Avorelo Run`, `Run: ${result.runId}`, `State: ${result.route.state}`, `Execution: ${result.execution.finalStatus}`].join("\n");
206
+ } catch (fallbackErr) {
207
+ throw new Error(`Safe run failed: ${err.message}`);
208
+ }
209
+ }
210
+ }
211
+
212
+ function renderModelsCommand(cwd, args = []) {
213
+ const inventory = loadInventory(cwd, { refresh: args.includes("--refresh"), deepRefresh: args.includes("--deep") });
214
+ return wantsJson(args) ? JSON.stringify(inventory, null, 2) : modelsText(cwd, { refresh: args.includes("--refresh"), deepRefresh: args.includes("--deep") });
215
+ }
216
+
217
+ function renderStatusCommand(cwd, args = []) {
218
+ const status = buildOrchestrationStatus(cwd, { refreshInventory: args.includes("--refresh"), deepRefresh: args.includes("--deep") });
219
+ const workerNotes = formatWorkerNotes(status.inventory);
220
+ return wantsJson(args)
221
+ ? JSON.stringify(status, null, 2)
222
+ : [
223
+ "Avorelo Orchestration Status",
224
+ status.statusLine,
225
+ `Inventory source: ${status.inventory.inventorySource || "cache"}`,
226
+ `Refresh level: ${status.inventory.refreshLevel || "cache"}`,
227
+ workerNotes ? `Worker notes: ${workerNotes}` : null,
228
+ status.currentRoute ? `Last route: ${status.currentRoute.selectedRoute}` : "Last route: none",
229
+ status.currentProof ? `Last proof: ${status.currentProof.finalStatus}` : "Last proof: none",
230
+ ].filter(Boolean).join("\n");
231
+ }
232
+
233
+ function renderProofCommand(cwd, args = []) {
234
+ const debug = args.includes("--debug") || args.includes("--verbose");
235
+ const subcommand = args.find((arg) => !String(arg).startsWith("-")) || null;
236
+ const proof = readCurrentProof(cwd);
237
+ const historyRequested = wantsHistory(args);
238
+ const exportRequested = wantsExport(args);
239
+ const jsonMode = wantsJson(args);
240
+
241
+ if (subcommand === "outcome" || subcommand === "readiness") {
242
+ const {
243
+ buildProofOutcomeEvidence,
244
+ writeProofOutcomeEvidence,
245
+ formatProofOutcomeEvidenceText,
246
+ } = require("../proof-outcome-evidence");
247
+ const evidence = buildProofOutcomeEvidence(cwd);
248
+ writeProofOutcomeEvidence(cwd, evidence);
249
+ return jsonMode ? JSON.stringify(evidence, null, 2) : formatProofOutcomeEvidenceText(evidence);
250
+ }
251
+
252
+ if (historyRequested && exportRequested) {
253
+ throw new Error("Use either --history or --export, not both.");
254
+ }
255
+
256
+ if (!historyRequested && !exportRequested) {
257
+ return jsonMode ? JSON.stringify(proof || {}, null, 2) : proofText(cwd, { debug });
258
+ }
259
+
260
+ const plan = getCurrentPlan({ cwd });
261
+ const baseText = proofText(cwd, { debug }).trimEnd();
262
+ const featureRequested = historyRequested ? "proof_history" : "proof_export";
263
+ const surfaceName = historyRequested ? "proof_history" : "proof_export";
264
+
265
+ if (plan === "pro") {
266
+ if (historyRequested) {
267
+ const history = readProofHistory(cwd, { plan });
268
+ if (jsonMode) {
269
+ return JSON.stringify({
270
+ proof: proof || {},
271
+ proofHistory: history.entries,
272
+ historyAvailable: history.available,
273
+ partial: history.partial,
274
+ sourcePath: history.sourcePath,
275
+ retention: history.retention,
276
+ redacted: true,
277
+ }, null, 2);
278
+ }
279
+ const sections = [baseText];
280
+ sections.push("");
281
+ sections.push(formatProofHistoryText(history));
282
+ return `${sections.filter(Boolean).join("\n")}\n`;
283
+ }
284
+
285
+ const exported = exportProofHistoryBundle(cwd, { plan });
286
+ if (jsonMode) {
287
+ return JSON.stringify({
288
+ proof: proof || {},
289
+ exported: exported.ok
290
+ ? {
291
+ jsonRel: exported.jsonRel,
292
+ mdRel: exported.mdRel,
293
+ count: exported.count,
294
+ partial: exported.partial,
295
+ }
296
+ : null,
297
+ proofHistory: exported.history?.entries || [],
298
+ exportAvailable: canExportReports(plan),
299
+ redacted: true,
300
+ }, null, 2);
301
+ }
302
+ const sections = [baseText];
303
+ sections.push("");
304
+ sections.push(
305
+ exported.ok
306
+ ? formatProofExportText(exported)
307
+ : "Proof export is not available yet.",
308
+ );
309
+ return `${sections.filter(Boolean).join("\n")}\n`;
310
+ }
311
+
312
+ const surface = buildProofDepthSurface(cwd, surfaceName, featureRequested);
313
+ const eventPayload = buildProofDepthPayload(surface);
314
+ appendProMomentEvent(cwd, "pro_feature_requested", eventPayload);
315
+ appendProMomentEvent(cwd, "pro_limit_reached", eventPayload);
316
+
317
+ if (jsonMode) {
318
+ recordProMomentEvaluation(cwd, surface, { humanVisible: false });
319
+ return JSON.stringify(
320
+ buildFreeProofDepthJson(proof, surface, {
321
+ requested: featureRequested,
322
+ historyAvailable: false,
323
+ exportAvailable: false,
324
+ redacted: true,
325
+ }),
326
+ null,
327
+ 2,
328
+ );
329
+ }
330
+
331
+ recordProMomentEvaluation(cwd, surface, { humanVisible: true });
332
+ return renderFreeProofDepthText(baseText, surface);
333
+ }
334
+
335
+ function renderVerifyCommand(cwd, args = [], taskText = "") {
336
+ const taskContext = buildTaskContext(taskText || "Verify the current workspace deterministically.", {
337
+ surface: parseSurface(args),
338
+ });
339
+ const verification = verifyWorkspace(cwd, taskContext);
340
+ return wantsJson(args) ? JSON.stringify(verification, null, 2) : [
341
+ "Avorelo Verification",
342
+ `Status: ${verification.status}`,
343
+ `Why: ${verification.reason}`,
344
+ ...((verification.commands || []).map((entry) => `- ${entry.command} ${entry.args.join(" ")} -> ${entry.status}`)),
345
+ ].join("\n");
346
+ }
347
+
348
+ function renderSettingsCommand(cwd, args = []) {
349
+ const positional = args.filter((arg) => !arg.startsWith("--"));
350
+ const [verb, key, value] = positional;
351
+ if (!verb || verb === "show") {
352
+ const settings = getSettings(cwd);
353
+ const inventory = loadInventory(cwd, {});
354
+ return wantsJson(args)
355
+ ? JSON.stringify({ settings, inventory }, null, 2)
356
+ : formatSettingsText(settings, inventory);
357
+ }
358
+
359
+ if (verb === "set") {
360
+ if (key === "mode") {
361
+ const settings = setMode(cwd, value);
362
+ return wantsJson(args) ? JSON.stringify(settings, null, 2) : formatSettingsText(settings);
363
+ }
364
+ if (key === "ask-before-premium") {
365
+ const settings = setBooleanFlag(cwd, "askBeforePremium", parseBool(value));
366
+ return wantsJson(args) ? JSON.stringify(settings, null, 2) : formatSettingsText(settings);
367
+ }
368
+ if (key === "block-cheap-external-high-risk") {
369
+ const settings = setBooleanFlag(cwd, "blockCheapExternalHighRisk", parseBool(value));
370
+ return wantsJson(args) ? JSON.stringify(settings, null, 2) : formatSettingsText(settings);
371
+ }
372
+ if (key === "block-external-secrets") {
373
+ const settings = setBooleanFlag(cwd, "blockExternalSecrets", parseBool(value));
374
+ return wantsJson(args) ? JSON.stringify(settings, null, 2) : formatSettingsText(settings);
375
+ }
376
+ throw new Error(`Unsupported orchestration settings key: ${key}`);
377
+ }
378
+
379
+ if (verb === "enable-tool" || verb === "disable-tool") {
380
+ const settings = setWorkerEnabled(cwd, key, verb === "enable-tool");
381
+ return wantsJson(args) ? JSON.stringify(settings, null, 2) : formatSettingsText(settings);
382
+ }
383
+
384
+ throw new Error(`Unsupported orchestration settings action: ${verb}`);
385
+ }
386
+
387
+ function renderHandoffCommand(cwd, args = []) {
388
+ const positional = args.filter((arg) => !arg.startsWith("--"));
389
+ const toArg = args.find((a) => a.startsWith("--to=")) || args.find((a, i) => args[i - 1] === "--to");
390
+ const target = toArg ? (toArg.startsWith("--to=") ? toArg.split("=")[1] : args[args.indexOf("--to") + 1]) : "claude";
391
+ const taskArg = args.find((a) => a.startsWith("--task=")) || args.find((a, i) => args[i - 1] === "--task");
392
+ const taskText = taskArg ? (taskArg.startsWith("--task=") ? taskArg.slice(7) : args[args.indexOf("--task") + 1]) : positional[0] || "";
393
+
394
+ const result = generateHandoff(cwd, { target, taskText });
395
+
396
+ return wantsJson(args)
397
+ ? JSON.stringify(result.receipt, null, 2)
398
+ : [
399
+ `Avorelo Handoff`,
400
+ `ID: ${result.handoffId}`,
401
+ `Target: ${target}`,
402
+ `Prompt path: ${result.promptPath}`,
403
+ `Receipt path: ${result.receiptPath}`,
404
+ ``,
405
+ result.promptText,
406
+ ].join("\n");
407
+ }
408
+
409
+ function renderOrchestrationSurfaceCommand(cwd, args = []) {
410
+ const surface = buildAgentModelOrchestrationSurface(cwd);
411
+ return wantsJson(args)
412
+ ? JSON.stringify(surface, null, 2)
413
+ : [
414
+ `Agent Model Orchestration Surface`,
415
+ `Status: ${surface.status}`,
416
+ `Route state: ${surface.routeState || "none"}`,
417
+ `Selected worker: ${surface.selectedWorker || "none"}`,
418
+ `Fallback worker: ${surface.fallbackWorker || "none"}`,
419
+ `Stage count: ${surface.stageCount}`,
420
+ `Limited workers: ${surface.limitedWorkers}`,
421
+ `Local workers available: ${surface.localWorkersAvailable}`,
422
+ `Handoff available: ${surface.handoffAvailable}`,
423
+ `Next action: ${surface.nextAction}`,
424
+ `Foundation only: not a generic gateway`,
425
+ ].join("\n");
426
+ }
427
+
428
+ module.exports = {
429
+ renderRouteCommand,
430
+ renderRunCommand,
431
+ renderModelsCommand,
432
+ renderStatusCommand,
433
+ renderProofCommand,
434
+ renderVerifyCommand,
435
+ renderSettingsCommand,
436
+ renderHandoffCommand,
437
+ renderOrchestrationSurfaceCommand,
438
+ };