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,456 @@
1
+ "use strict";
2
+
3
+ const { loadInventory, inventoryText, summarizeInventoryForText } = require("./inventory");
4
+ const { classifyTask } = require("./risk-classifier");
5
+ const { planRoute } = require("./routing-policy");
6
+ const { createAdapterRegistry } = require("./adapters");
7
+ const { executeRoute } = require("./execution-manager");
8
+ const { verifyWorkspace } = require("./verification-manager");
9
+ const { getSettings, settingsMetadata } = require("./settings");
10
+ const {
11
+ ensureOrchestrationDirs,
12
+ createRunId,
13
+ getCurrentPaths,
14
+ getRunPaths,
15
+ safeReadJson,
16
+ } = require("./state");
17
+ const {
18
+ buildProof,
19
+ buildAgentModelOrchestrationReceipt,
20
+ writeOrchestrationReceipt,
21
+ readOrchestrationReceipt,
22
+ writeCurrentArtifacts,
23
+ writeRunArtifacts,
24
+ writeHostContracts,
25
+ renderProofMarkdown,
26
+ } = require("./proof-writer");
27
+ const { writeHandoff, readCurrentHandoff } = require("./handoff");
28
+ const { buildAgentAccessGovernanceSurface } = require("../agent-access-governance");
29
+ const { buildSafePathSurface } = require("../safe-path-engine");
30
+ const { buildInstallIntakeRiskSurface } = require("../install-intake-risk");
31
+ const { buildSkillsOperatingLayerSurface } = require("../skills-operating-layer");
32
+ const { buildWorkControlSurface } = require("../work-control-receipts");
33
+ const { buildAiWorkspaceHygieneSurface } = require("../ai-workspace-hygiene");
34
+
35
+ function buildTaskContext(taskText, options = {}) {
36
+ const classification = classifyTask(taskText, {
37
+ changedFiles: options.changedFiles || [],
38
+ selectedFiles: options.selectedFiles || [],
39
+ });
40
+ return {
41
+ taskText,
42
+ surface: options.surface || "avorelo_cli",
43
+ classification,
44
+ selectedFiles: options.selectedFiles || [],
45
+ changedFiles: options.changedFiles || [],
46
+ };
47
+ }
48
+
49
+ function routeTask(cwd, taskText, options = {}) {
50
+ ensureOrchestrationDirs(cwd);
51
+ const settings = getSettings(cwd);
52
+ const taskContext = buildTaskContext(taskText, options);
53
+ const inventory = loadInventory(cwd, {
54
+ env: options.env,
55
+ commandExists: options.commandExists,
56
+ commandRunner: options.commandRunner,
57
+ httpGetJson: options.httpGetJson,
58
+ surface: taskContext.surface,
59
+ refresh: options.refreshInventory,
60
+ deepRefresh: options.deepRefresh,
61
+ });
62
+ const route = planRoute({
63
+ taskText,
64
+ task: taskContext.classification,
65
+ inventory,
66
+ settings,
67
+ surface: taskContext.surface,
68
+ });
69
+ const proof = buildProof({
70
+ runId: options.runId || createRunId(),
71
+ taskContext,
72
+ route,
73
+ execution: {
74
+ finalStatus: "planned",
75
+ steps: [],
76
+ failures: [],
77
+ verification: { status: "skipped", reason: "Route only." },
78
+ diffSummary: null,
79
+ },
80
+ verification: { status: "skipped", reason: "Route only." },
81
+ });
82
+ writeCurrentArtifacts(cwd, taskContext, route, proof);
83
+ const hostContracts = writeHostContracts(cwd, route, taskContext, proof);
84
+ const orchestrationReceipt = buildAgentModelOrchestrationReceipt({ route, proof, cwd });
85
+ const orchestrationReceiptPath = writeOrchestrationReceipt(cwd, orchestrationReceipt);
86
+ return {
87
+ taskContext,
88
+ inventory,
89
+ route,
90
+ proof,
91
+ hostContracts,
92
+ orchestrationReceipt,
93
+ orchestrationReceiptPath,
94
+ };
95
+ }
96
+
97
+ function runTask(cwd, taskText, options = {}) {
98
+ ensureOrchestrationDirs(cwd);
99
+ const runId = options.runId || createRunId();
100
+ const routed = routeTask(cwd, taskText, { ...options, runId });
101
+ const settings = getSettings(cwd);
102
+ const runPaths = getRunPaths(cwd, runId);
103
+ const adapters = options.adapters || createAdapterRegistry();
104
+ const execution = executeRoute({
105
+ cwd,
106
+ runId,
107
+ route: routed.route,
108
+ taskContext: routed.taskContext,
109
+ adapters,
110
+ settings,
111
+ dryRun: options.dryRun === true,
112
+ executionLogPath: runPaths.executionLog,
113
+ options,
114
+ });
115
+ const verification = execution.verification || verifyWorkspace(cwd, routed.taskContext, options);
116
+ const proof = buildProof({
117
+ runId,
118
+ taskContext: routed.taskContext,
119
+ route: routed.route,
120
+ execution,
121
+ verification,
122
+ });
123
+ writeRunArtifacts(cwd, runId, routed.taskContext, routed.route, execution, verification, proof);
124
+ writeCurrentArtifacts(cwd, routed.taskContext, routed.route, proof);
125
+ const hostContracts = writeHostContracts(cwd, routed.route, routed.taskContext, proof);
126
+ return {
127
+ runId,
128
+ taskContext: routed.taskContext,
129
+ inventory: routed.inventory,
130
+ route: routed.route,
131
+ execution,
132
+ verification,
133
+ proof,
134
+ hostContracts,
135
+ };
136
+ }
137
+
138
+ function readCurrentProof(cwd) {
139
+ const paths = getCurrentPaths(cwd);
140
+ const proof = safeReadJson(paths.currentProofJson, null);
141
+ const governance = buildAgentAccessGovernanceSurface(cwd);
142
+ const safePath = buildSafePathSurface(cwd);
143
+ const installIntakeRisk = buildInstallIntakeRiskSurface(cwd);
144
+ const skillsOperatingLayer = buildSkillsOperatingLayerSurface(cwd);
145
+ const workControl = buildWorkControlSurface(cwd);
146
+ const aiWorkspaceHygiene = buildAiWorkspaceHygieneSurface(cwd);
147
+ if (!proof) {
148
+ return governance.latestReceiptPath || safePath.latestReceiptPath || installIntakeRisk.latestReceiptPath || skillsOperatingLayer.latestSourceAdoptionReceiptPath
149
+ ? {
150
+ governance,
151
+ safePath,
152
+ installIntakeRisk,
153
+ skillsOperatingLayer,
154
+ workControl,
155
+ aiWorkspaceHygiene,
156
+ }
157
+ : null;
158
+ }
159
+ return {
160
+ ...proof,
161
+ governance,
162
+ safePath,
163
+ installIntakeRisk,
164
+ skillsOperatingLayer,
165
+ workControl,
166
+ aiWorkspaceHygiene,
167
+ };
168
+ }
169
+
170
+ function buildOrchestrationStatus(cwd, options = {}) {
171
+ ensureOrchestrationDirs(cwd);
172
+ const settings = getSettings(cwd);
173
+ const inventory = loadInventory(cwd, {
174
+ env: options.env,
175
+ commandExists: options.commandExists,
176
+ commandRunner: options.commandRunner,
177
+ httpGetJson: options.httpGetJson,
178
+ surface: options.surface || "avorelo_cli",
179
+ refresh: options.refreshInventory,
180
+ deepRefresh: options.deepRefresh,
181
+ });
182
+ const currentPaths = getCurrentPaths(cwd);
183
+ const route = safeReadJson(currentPaths.currentRouteJson, null);
184
+ const proof = safeReadJson(currentPaths.currentProofJson, null);
185
+ const summary = summarizeInventoryForText(inventory);
186
+ const statusLine = route
187
+ ? `Orchestration: ${settings.mode} · ${route.state} · ${summary.available} workers available · inventory ${inventory.inventorySource || "cache"} · next refresh ${inventory.nextFullModelRefreshAfter || "unknown"} · last task ${route.task?.risk || "unknown"} risk`
188
+ : `Orchestration: ${settings.mode} · ${summary.available} workers available · inventory ${inventory.inventorySource || "cache"} · next refresh ${inventory.nextFullModelRefreshAfter || "unknown"}`;
189
+ return {
190
+ showInStatus: true,
191
+ statusLine,
192
+ settings: settingsMetadata(settings),
193
+ inventory,
194
+ currentRoute: route,
195
+ currentProof: proof,
196
+ summary,
197
+ whyChosen: route?.whyChosen || [],
198
+ };
199
+ }
200
+
201
+ function modelsText(cwd, options = {}) {
202
+ return inventoryText(loadInventory(cwd, options));
203
+ }
204
+
205
+ function proofText(cwd, options = {}) {
206
+ const proof = readCurrentProof(cwd);
207
+ if (!proof) return "No orchestration proof is available yet.\n";
208
+ if (!proof.runId && (proof.governance || proof.safePath || proof.skillsOperatingLayer)) {
209
+ return [
210
+ "No orchestration proof is available yet.",
211
+ "",
212
+ `Agent Access Governance: ${String(proof.governance.status || "partial").toUpperCase()}`,
213
+ `Latest receipt: ${proof.governance.latestReceiptPath || "missing"}`,
214
+ `Unknown subjects: ${proof.governance.unknownSubjects}`,
215
+ proof.safePath
216
+ ? `Safe Path: ${String(proof.safePath.status || "foundation").toUpperCase()} · last=${proof.safePath.lastDecision || "none"} · latest receipt ${proof.safePath.latestReceiptPath || "missing"}`
217
+ : null,
218
+ proof.installIntakeRisk
219
+ ? `Install Intake: ${String(proof.installIntakeRisk.status || "foundation").toUpperCase()} · items=${proof.installIntakeRisk.totalItems} · unknown=${proof.installIntakeRisk.unknownItems} · latest receipt ${proof.installIntakeRisk.latestReceiptPath || "missing"}`
220
+ : null,
221
+ proof.skillsOperatingLayer
222
+ ? `Skills Operating Layer: ${String(proof.skillsOperatingLayer.status || "foundation").toUpperCase()} · reviewed=${proof.skillsOperatingLayer.reviewedSources} · deferred=${proof.skillsOperatingLayer.deferredSources} · latest receipt ${proof.skillsOperatingLayer.latestSourceAdoptionReceiptPath || "missing"}`
223
+ : null,
224
+ `Next: ${proof.safePath?.nextAction || proof.governance.nextAction}`,
225
+ "",
226
+ ].filter(Boolean).join("\n");
227
+ }
228
+ const rendered = renderProofMarkdown(proof, options);
229
+ const trailingSections = [];
230
+ if (proof.governance?.latestReceiptPath) {
231
+ trailingSections.push(
232
+ [
233
+ "Agent Access Governance:",
234
+ `- Status: ${String(proof.governance.status || "partial").toUpperCase()}`,
235
+ `- Latest receipt: ${proof.governance.latestReceiptPath}`,
236
+ `- Unknown subjects: ${proof.governance.unknownSubjects}`,
237
+ `- Top reason codes: ${(proof.governance.topReasonCodes || []).join(", ") || "none"}`,
238
+ ].join("\n")
239
+ );
240
+ }
241
+ if (proof.safePath?.latestReceiptPath) {
242
+ trailingSections.push(
243
+ [
244
+ "Safe Path:",
245
+ `- Status: ${String(proof.safePath.status || "foundation").toUpperCase()}`,
246
+ `- Latest receipt: ${proof.safePath.latestReceiptPath}`,
247
+ `- Last decision: ${proof.safePath.lastDecision || "none"}`,
248
+ `- Top reason codes: ${(proof.safePath.topReasonCodes || []).join(", ") || "none"}`,
249
+ `- Reductions recommended: ${proof.safePath.reductionsRecommended || 0}`,
250
+ `- Approvals required: ${proof.safePath.approvalsRequired || 0}`,
251
+ `- Skill context warnings: ${proof.safePath.skillContextWarnings || 0}`,
252
+ ].join("\n")
253
+ );
254
+ }
255
+ if (proof.installIntakeRisk?.latestReceiptPath) {
256
+ trailingSections.push(
257
+ [
258
+ "Install Intake:",
259
+ `- Status: ${String(proof.installIntakeRisk.status || "foundation").toUpperCase()}`,
260
+ `- Latest receipt: ${proof.installIntakeRisk.latestReceiptPath}`,
261
+ `- Total items: ${proof.installIntakeRisk.totalItems || 0}`,
262
+ `- Unknown items: ${proof.installIntakeRisk.unknownItems || 0}`,
263
+ `- Deferred items: ${proof.installIntakeRisk.deferredItems || 0}`,
264
+ `- Blocked items: ${proof.installIntakeRisk.blockedItems || 0}`,
265
+ `- High-risk items: ${proof.installIntakeRisk.highRiskItems || 0}`,
266
+ `- Top reason codes: ${(proof.installIntakeRisk.topReasonCodes || []).join(", ") || "none"}`,
267
+ ].join("\n")
268
+ );
269
+ }
270
+ if (proof.skillsOperatingLayer?.latestSourceAdoptionReceiptPath || proof.skillsOperatingLayer?.latestSkillRouteReceiptPath) {
271
+ trailingSections.push(
272
+ [
273
+ "Skills Operating Layer:",
274
+ `- Status: ${String(proof.skillsOperatingLayer.status || "foundation").toUpperCase()}`,
275
+ `- Reviewed sources: ${proof.skillsOperatingLayer.reviewedSources}`,
276
+ `- Deferred sources: ${proof.skillsOperatingLayer.deferredSources}`,
277
+ `- Parsed skills: ${proof.skillsOperatingLayer.parsedSkills}`,
278
+ `- Latest source receipt: ${proof.skillsOperatingLayer.latestSourceAdoptionReceiptPath || "missing"}`,
279
+ `- Latest route receipt: ${proof.skillsOperatingLayer.latestSkillRouteReceiptPath || "missing"}`,
280
+ `- Latest adapter receipt: ${proof.skillsOperatingLayer.latestAdapterSyncReceiptPath || "missing"}`,
281
+ ].join("\n")
282
+ );
283
+ }
284
+ if (proof.workControl?.latestReceiptPath) {
285
+ trailingSections.push(
286
+ [
287
+ "Work Control:",
288
+ `- Status: ${String(proof.workControl.status || "missing").toUpperCase()}`,
289
+ `- Final state: ${proof.workControl.finalState || "missing"}`,
290
+ `- Latest receipt: ${proof.workControl.latestReceiptPath}`,
291
+ `- Blocked: ${proof.workControl.blockedCount || 0}`,
292
+ `- Approval required: ${proof.workControl.approvalRequiredCount || 0}`,
293
+ `- High-risk intake: ${proof.workControl.highRiskIntakeCount || 0}`,
294
+ `- Next safest action: ${proof.workControl.nextSafestAction || "none"}`,
295
+ ].join("\n")
296
+ );
297
+ }
298
+ if (proof.aiWorkspaceHygiene?.latestReportPath) {
299
+ trailingSections.push(
300
+ [
301
+ "AI Workspace Hygiene:",
302
+ `- Status: ${String(proof.aiWorkspaceHygiene.status || "not_run").toUpperCase()}`,
303
+ proof.aiWorkspaceHygiene.score != null ? `- Score: ${proof.aiWorkspaceHygiene.score}/100` : null,
304
+ `- Total assets: ${proof.aiWorkspaceHygiene.totalAssets ?? "unknown"}`,
305
+ `- Needs review: ${proof.aiWorkspaceHygiene.needsReview ?? 0}`,
306
+ `- High risk: ${proof.aiWorkspaceHygiene.highRisk ?? 0}`,
307
+ `- Latest report: ${proof.aiWorkspaceHygiene.latestReportPath}`,
308
+ proof.aiWorkspaceHygiene.nextAction ? `- Next action: ${proof.aiWorkspaceHygiene.nextAction}` : null,
309
+ ].filter(Boolean).join("\n")
310
+ );
311
+ }
312
+ // Work Ledger
313
+ try {
314
+ const { buildWorkLedgerSurface } = require("../work-ledger");
315
+ const ledgerSurface = buildWorkLedgerSurface(cwd);
316
+ if (ledgerSurface && ledgerSurface.status !== "not_available") {
317
+ trailingSections.push(
318
+ [
319
+ "Work Ledger:",
320
+ `- Status: ${String(ledgerSurface.status || "unknown").toUpperCase()}`,
321
+ `- Entries: ${ledgerSurface.entryCount ?? 0}`,
322
+ `- Friction points: ${ledgerSurface.frictionCount ?? 0}`,
323
+ `- Latest ledger: ${ledgerSurface.latestLedgerPath}`,
324
+ ledgerSurface.nextAction ? `- Next: ${ledgerSurface.nextAction}` : null,
325
+ ].filter(Boolean).join("\n")
326
+ );
327
+ }
328
+ } catch { /* non-blocking */ }
329
+
330
+ // Company Loop
331
+ try {
332
+ const { buildCompanyLoopSurface } = require("../company-loop");
333
+ const loopSurface = buildCompanyLoopSurface(cwd);
334
+ if (loopSurface && loopSurface.status !== "not_available") {
335
+ trailingSections.push(
336
+ [
337
+ "Company Loop:",
338
+ `- Status: ${String(loopSurface.status || "unknown").toUpperCase()}`,
339
+ `- Persona warnings: ${loopSurface.personaWarnCount ?? 0}`,
340
+ loopSurface.topFriction ? `- Top friction: ${loopSurface.topFriction}` : null,
341
+ `- Recommended next PR: ${loopSurface.recommendedNextPr || "not_available"}`,
342
+ `- Confidence: ${loopSurface.confidence || "low"}`,
343
+ `- Latest report: ${loopSurface.latestReportPath}`,
344
+ ].filter(Boolean).join("\n")
345
+ );
346
+ }
347
+ } catch { /* non-blocking */ }
348
+
349
+ if (!trailingSections.length) return rendered;
350
+ return [rendered.trimEnd(), "", ...trailingSections, ""].join("\n");
351
+ }
352
+
353
+ function generateHandoff(cwd, params = {}) {
354
+ ensureOrchestrationDirs(cwd);
355
+ const paths = getCurrentPaths(cwd);
356
+ const route = safeReadJson(paths.currentRouteJson, null);
357
+ const inventory = loadInventory(cwd, { surface: "avorelo_cli" });
358
+ const result = writeHandoff(cwd, {
359
+ target: params.target || "claude",
360
+ taskText: params.taskText || route?.taskText || "Continue current work",
361
+ route,
362
+ inventory,
363
+ changedFiles: params.changedFiles || [],
364
+ testsRun: params.testsRun || [],
365
+ validationStatus: params.validationStatus || "unknown",
366
+ dogfoodStatus: params.dogfoodStatus || "not_run",
367
+ whatWasDone: params.whatWasDone || [],
368
+ doNotRedo: params.doNotRedo || [],
369
+ remainingGaps: params.remainingGaps || [],
370
+ exactNextAction: params.exactNextAction || route?.expectedVerification?.[0] || "",
371
+ safePathConstraints: params.safePathConstraints || (route?.safetyNotes || []),
372
+ intakeWarnings: params.intakeWarnings || [],
373
+ selectedSkills: params.selectedSkills || [],
374
+ nonGoals: params.nonGoals || [],
375
+ branchName: params.branchName || null,
376
+ prUrl: params.prUrl || null,
377
+ lastCommit: params.lastCommit || null,
378
+ });
379
+ return result;
380
+ }
381
+
382
+ function buildAgentModelOrchestrationSurface(cwd) {
383
+ try {
384
+ const receipt = readOrchestrationReceipt(cwd);
385
+ const handoff = readCurrentHandoff(cwd);
386
+ const paths = getCurrentPaths(cwd);
387
+ const route = safeReadJson(paths.currentRouteJson, null);
388
+
389
+ if (!receipt && !route) {
390
+ return {
391
+ status: "not_run",
392
+ latestReceiptPath: null,
393
+ workersDetected: 0,
394
+ availableWorkers: 0,
395
+ limitedWorkers: 0,
396
+ localWorkersAvailable: 0,
397
+ selectedWorker: null,
398
+ fallbackWorker: null,
399
+ stageCount: 0,
400
+ handoffAvailable: false,
401
+ nextAction: "Run: avorelo route \"<task>\" to generate a route plan",
402
+ };
403
+ }
404
+
405
+ const r = receipt || {};
406
+ const stageCount = r.stageCount || (route?.stageList || []).length || 0;
407
+ const limitedWorkers = (r.quotaSignals?.limitedWorkers || []).length;
408
+ const localWorkersAvailable = (r.localWorkersAvailable || route?.localWorkersAvailable || []).length;
409
+ const statusText = limitedWorkers > 0 ? "limited" : localWorkersAvailable > 0 ? "local_available" : "ready";
410
+
411
+ return {
412
+ status: statusText,
413
+ contract: r.contract || "avorelo.agentModelOrchestration.v1",
414
+ latestReceiptPath: paths ? require("path").join(paths.root, "receipts", "current-orchestration-receipt.json").replace(/\\/g, "/") : null,
415
+ routeState: r.routeState || route?.state || "unknown",
416
+ selectedWorker: r.selectedWorkers?.[0]?.toolId || route?.chosenTool || null,
417
+ fallbackWorker: r.fallbackWorkers?.[0]?.toolId || route?.fallbackTool || null,
418
+ stageCount,
419
+ limitedWorkers,
420
+ localWorkersAvailable,
421
+ handoffAvailable: Boolean(r.handoffAvailable || handoff.receipt),
422
+ handoffPromptPath: r.handoffPromptPath || handoff.receipt?.handoffId ? `.claude/cco/orchestration/handoffs/current-handoff.md` : null,
423
+ fallbackReasonCodes: r.quotaSignals?.fallbackReasonCodes || [],
424
+ localWorkerRecommendation: r.localWorkerRecommendation || null,
425
+ nextAction: r.nextAction || "Run: avorelo route \"<task>\" to generate a stage plan",
426
+ notAGateway: true,
427
+ foundationOnly: true,
428
+ };
429
+ } catch {
430
+ return {
431
+ status: "error",
432
+ latestReceiptPath: null,
433
+ workersDetected: 0,
434
+ availableWorkers: 0,
435
+ limitedWorkers: 0,
436
+ localWorkersAvailable: 0,
437
+ selectedWorker: null,
438
+ fallbackWorker: null,
439
+ stageCount: 0,
440
+ handoffAvailable: false,
441
+ nextAction: "Run: avorelo route \"<task>\" to generate a route plan",
442
+ };
443
+ }
444
+ }
445
+
446
+ module.exports = {
447
+ buildTaskContext,
448
+ routeTask,
449
+ runTask,
450
+ buildOrchestrationStatus,
451
+ buildAgentModelOrchestrationSurface,
452
+ generateHandoff,
453
+ modelsText,
454
+ readCurrentProof,
455
+ proofText,
456
+ };
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+
3
+ const { loadInventory, summarizeInventoryForText, INVENTORY_SCHEMA_VERSION } = require("./model-discovery");
4
+
5
+ function describeToolStatus(tool) {
6
+ if (tool.toolId === "gemini_cli" && tool.installStatus === "installed_not_on_path") {
7
+ return "Gemini CLI command not found on PATH";
8
+ }
9
+ if (tool.toolId === "lm_studio" && tool.installStatus === "installed_or_configured_but_not_running") {
10
+ return "LM Studio local server not running";
11
+ }
12
+ if (tool.toolId === "lm_studio" && tool.installStatus === "configured_but_no_models") {
13
+ return "LM Studio local server reachable but no loaded models";
14
+ }
15
+ if (tool.availability === "needs_login") return "needs login";
16
+ return `${tool.installStatus}/${tool.availability}`;
17
+ }
18
+
19
+ function inventoryText(inventory) {
20
+ const summary = summarizeInventoryForText(inventory);
21
+ const lines = [
22
+ "Avorelo Model + Worker Inventory",
23
+ `Inventory source: ${inventory.inventorySource || "cache"}`,
24
+ `Refresh level: ${inventory.refreshLevel || "cache"}`,
25
+ `Last full model refresh: ${inventory.lastFullModelRefreshAt || "unknown"}`,
26
+ `Next full model refresh after: ${inventory.nextFullModelRefreshAfter || "unknown"}`,
27
+ `Detected: ${summary.available}/${summary.total} available · ${summary.enabled} enabled`,
28
+ ];
29
+ (inventory.tools || []).forEach((tool) => {
30
+ const selected = tool.activeModel || "unknown";
31
+ const roles = (tool.supportedRoles || []).join(", ") || "n/a";
32
+ const notes = [];
33
+ if (tool.workerState === "disabled_by_user") notes.push("disabled_by_user");
34
+ if (tool.workerState === "recently_limited") notes.push("recently_limited");
35
+ if (tool.workerState === "recently_failed") notes.push("recently_failed");
36
+ if (tool.workerState === "needs_login") notes.push("needs_login");
37
+ lines.push(`- ${tool.label}: ${describeToolStatus(tool)} · selected ${selected} · roles ${roles} · cost ${tool.costTier} · trust ${tool.trustTier}${notes.length ? ` · ${notes.join(", ")}` : ""}`);
38
+ });
39
+ return lines.join("\n");
40
+ }
41
+
42
+ module.exports = {
43
+ INVENTORY_SCHEMA_VERSION,
44
+ loadInventory,
45
+ inventoryText,
46
+ summarizeInventoryForText,
47
+ };