@miller-tech/uap 2.21.3 → 2.36.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (328) hide show
  1. package/README.md +22 -10
  2. package/config/model-profiles/qwen38-coder390.json +46 -0
  3. package/config/model-profiles/qwen38.json +3 -2
  4. package/config/model-registry.json +110 -0
  5. package/dist/.tsbuildinfo +1 -1
  6. package/dist/benchmarks/paired/types.d.ts +2 -2
  7. package/dist/bin/cli.js +315 -20
  8. package/dist/bin/cli.js.map +1 -1
  9. package/dist/cli/attention.d.ts +6 -0
  10. package/dist/cli/attention.d.ts.map +1 -0
  11. package/dist/cli/attention.js +115 -0
  12. package/dist/cli/attention.js.map +1 -0
  13. package/dist/cli/bench-report.d.ts +82 -0
  14. package/dist/cli/bench-report.d.ts.map +1 -0
  15. package/dist/cli/bench-report.js +237 -0
  16. package/dist/cli/bench-report.js.map +1 -0
  17. package/dist/cli/clients.d.ts +6 -0
  18. package/dist/cli/clients.d.ts.map +1 -0
  19. package/dist/cli/clients.js +142 -0
  20. package/dist/cli/clients.js.map +1 -0
  21. package/dist/cli/dashboard-grants.d.ts +26 -0
  22. package/dist/cli/dashboard-grants.d.ts.map +1 -0
  23. package/dist/cli/dashboard-grants.js +69 -0
  24. package/dist/cli/dashboard-grants.js.map +1 -0
  25. package/dist/cli/dashboard-pace.d.ts +31 -0
  26. package/dist/cli/dashboard-pace.d.ts.map +1 -0
  27. package/dist/cli/dashboard-pace.js +42 -0
  28. package/dist/cli/dashboard-pace.js.map +1 -0
  29. package/dist/cli/dashboard-session.d.ts +25 -0
  30. package/dist/cli/dashboard-session.d.ts.map +1 -0
  31. package/dist/cli/dashboard-session.js +814 -0
  32. package/dist/cli/dashboard-session.js.map +1 -0
  33. package/dist/cli/dashboard-types.d.ts +18 -0
  34. package/dist/cli/dashboard-types.d.ts.map +1 -0
  35. package/dist/cli/dashboard-types.js +9 -0
  36. package/dist/cli/dashboard-types.js.map +1 -0
  37. package/dist/cli/dashboard.d.ts +2 -18
  38. package/dist/cli/dashboard.d.ts.map +1 -1
  39. package/dist/cli/dashboard.js +43 -793
  40. package/dist/cli/dashboard.js.map +1 -1
  41. package/dist/cli/deliver.d.ts +35 -0
  42. package/dist/cli/deliver.d.ts.map +1 -1
  43. package/dist/cli/deliver.js +93 -9
  44. package/dist/cli/deliver.js.map +1 -1
  45. package/dist/cli/diff.d.ts +85 -0
  46. package/dist/cli/diff.d.ts.map +1 -0
  47. package/dist/cli/diff.js +293 -0
  48. package/dist/cli/diff.js.map +1 -0
  49. package/dist/cli/eta.d.ts +35 -0
  50. package/dist/cli/eta.d.ts.map +1 -0
  51. package/dist/cli/eta.js +101 -0
  52. package/dist/cli/eta.js.map +1 -0
  53. package/dist/cli/handsfree.d.ts +7 -0
  54. package/dist/cli/handsfree.d.ts.map +1 -1
  55. package/dist/cli/handsfree.js +27 -0
  56. package/dist/cli/handsfree.js.map +1 -1
  57. package/dist/cli/hooks.d.ts.map +1 -1
  58. package/dist/cli/hooks.js +126 -5
  59. package/dist/cli/hooks.js.map +1 -1
  60. package/dist/cli/loops.d.ts +24 -5
  61. package/dist/cli/loops.d.ts.map +1 -1
  62. package/dist/cli/loops.js +92 -12
  63. package/dist/cli/loops.js.map +1 -1
  64. package/dist/cli/models.d.ts +62 -0
  65. package/dist/cli/models.d.ts.map +1 -0
  66. package/dist/cli/models.js +567 -0
  67. package/dist/cli/models.js.map +1 -0
  68. package/dist/cli/plan.d.ts +9 -0
  69. package/dist/cli/plan.d.ts.map +1 -1
  70. package/dist/cli/plan.js +57 -4
  71. package/dist/cli/plan.js.map +1 -1
  72. package/dist/cli/proxy-relay.d.ts +55 -0
  73. package/dist/cli/proxy-relay.d.ts.map +1 -0
  74. package/dist/cli/proxy-relay.js +116 -0
  75. package/dist/cli/proxy-relay.js.map +1 -0
  76. package/dist/cli/proxy.d.ts +4 -0
  77. package/dist/cli/proxy.d.ts.map +1 -1
  78. package/dist/cli/proxy.js +26 -1
  79. package/dist/cli/proxy.js.map +1 -1
  80. package/dist/cli/sandbox.d.ts +101 -4
  81. package/dist/cli/sandbox.d.ts.map +1 -1
  82. package/dist/cli/sandbox.js +393 -44
  83. package/dist/cli/sandbox.js.map +1 -1
  84. package/dist/cli/self.d.ts +13 -0
  85. package/dist/cli/self.d.ts.map +1 -0
  86. package/dist/cli/self.js +94 -0
  87. package/dist/cli/self.js.map +1 -0
  88. package/dist/cli/systemd-services.d.ts +2 -8
  89. package/dist/cli/systemd-services.d.ts.map +1 -1
  90. package/dist/cli/systemd-services.js +5 -20
  91. package/dist/cli/systemd-services.js.map +1 -1
  92. package/dist/cli/task.js +1 -1
  93. package/dist/cli/task.js.map +1 -1
  94. package/dist/cli/wizard-config.d.ts.map +1 -1
  95. package/dist/cli/wizard-config.js +31 -2
  96. package/dist/cli/wizard-config.js.map +1 -1
  97. package/dist/config/settings-registry.d.ts +1 -1
  98. package/dist/config/settings-registry.d.ts.map +1 -1
  99. package/dist/config/settings-registry.js +108 -0
  100. package/dist/config/settings-registry.js.map +1 -1
  101. package/dist/coordination/capability-router.js +2 -2
  102. package/dist/coordination/capability-router.js.map +1 -1
  103. package/dist/coordination/database.d.ts +13 -0
  104. package/dist/coordination/database.d.ts.map +1 -1
  105. package/dist/coordination/database.js +63 -7
  106. package/dist/coordination/database.js.map +1 -1
  107. package/dist/coordination/eta-inject.d.ts +32 -0
  108. package/dist/coordination/eta-inject.d.ts.map +1 -0
  109. package/dist/coordination/eta-inject.js +64 -0
  110. package/dist/coordination/eta-inject.js.map +1 -0
  111. package/dist/coordination/reactor.d.ts.map +1 -1
  112. package/dist/coordination/reactor.js +14 -0
  113. package/dist/coordination/reactor.js.map +1 -1
  114. package/dist/coordination/service.d.ts +18 -8
  115. package/dist/coordination/service.d.ts.map +1 -1
  116. package/dist/coordination/service.js +38 -28
  117. package/dist/coordination/service.js.map +1 -1
  118. package/dist/dashboard/client-registry.d.ts +163 -0
  119. package/dist/dashboard/client-registry.d.ts.map +1 -0
  120. package/dist/dashboard/client-registry.js +549 -0
  121. package/dist/dashboard/client-registry.js.map +1 -0
  122. package/dist/dashboard/controls.d.ts.map +1 -1
  123. package/dist/dashboard/controls.js +33 -4
  124. package/dist/dashboard/controls.js.map +1 -1
  125. package/dist/dashboard/data-seeder.d.ts +10 -7
  126. package/dist/dashboard/data-seeder.d.ts.map +1 -1
  127. package/dist/dashboard/data-seeder.js +31 -75
  128. package/dist/dashboard/data-seeder.js.map +1 -1
  129. package/dist/dashboard/data-service.d.ts +9 -0
  130. package/dist/dashboard/data-service.d.ts.map +1 -1
  131. package/dist/dashboard/data-service.js +32 -3
  132. package/dist/dashboard/data-service.js.map +1 -1
  133. package/dist/dashboard/placement-routes.d.ts +119 -0
  134. package/dist/dashboard/placement-routes.d.ts.map +1 -0
  135. package/dist/dashboard/placement-routes.js +331 -0
  136. package/dist/dashboard/placement-routes.js.map +1 -0
  137. package/dist/dashboard/server.d.ts.map +1 -1
  138. package/dist/dashboard/server.js +408 -2
  139. package/dist/dashboard/server.js.map +1 -1
  140. package/dist/delivery/attention.d.ts +130 -0
  141. package/dist/delivery/attention.d.ts.map +1 -0
  142. package/dist/delivery/attention.js +341 -0
  143. package/dist/delivery/attention.js.map +1 -0
  144. package/dist/delivery/decompose.d.ts +18 -0
  145. package/dist/delivery/decompose.d.ts.map +1 -1
  146. package/dist/delivery/decompose.js +22 -1
  147. package/dist/delivery/decompose.js.map +1 -1
  148. package/dist/delivery/eta-estimate.d.ts +111 -0
  149. package/dist/delivery/eta-estimate.d.ts.map +1 -0
  150. package/dist/delivery/eta-estimate.js +171 -0
  151. package/dist/delivery/eta-estimate.js.map +1 -0
  152. package/dist/delivery/eta.d.ts +23 -0
  153. package/dist/delivery/eta.d.ts.map +1 -0
  154. package/dist/delivery/eta.js +59 -0
  155. package/dist/delivery/eta.js.map +1 -0
  156. package/dist/delivery/orchestrated-mission.d.ts +10 -0
  157. package/dist/delivery/orchestrated-mission.d.ts.map +1 -1
  158. package/dist/delivery/orchestrated-mission.js +15 -1
  159. package/dist/delivery/orchestrated-mission.js.map +1 -1
  160. package/dist/delivery/plan-check.d.ts +7 -1
  161. package/dist/delivery/plan-check.d.ts.map +1 -1
  162. package/dist/delivery/plan-check.js +23 -2
  163. package/dist/delivery/plan-check.js.map +1 -1
  164. package/dist/delivery/run-state.d.ts +1 -1
  165. package/dist/delivery/run-state.d.ts.map +1 -1
  166. package/dist/delivery/run-state.js +8 -1
  167. package/dist/delivery/run-state.js.map +1 -1
  168. package/dist/delivery/task-orchestrator.d.ts +8 -3
  169. package/dist/delivery/task-orchestrator.d.ts.map +1 -1
  170. package/dist/delivery/task-orchestrator.js +75 -43
  171. package/dist/delivery/task-orchestrator.js.map +1 -1
  172. package/dist/delivery/task-sync.d.ts +21 -0
  173. package/dist/delivery/task-sync.d.ts.map +1 -1
  174. package/dist/delivery/task-sync.js +44 -8
  175. package/dist/delivery/task-sync.js.map +1 -1
  176. package/dist/delivery/task-workspace.d.ts +3 -3
  177. package/dist/delivery/task-workspace.js +3 -3
  178. package/dist/generators/self-card.d.ts +65 -0
  179. package/dist/generators/self-card.d.ts.map +1 -0
  180. package/dist/generators/self-card.js +256 -0
  181. package/dist/generators/self-card.js.map +1 -0
  182. package/dist/inference/probe.js +1 -1
  183. package/dist/inference/probe.js.map +1 -1
  184. package/dist/memory/prepopulate.d.ts.map +1 -1
  185. package/dist/memory/prepopulate.js +2 -0
  186. package/dist/memory/prepopulate.js.map +1 -1
  187. package/dist/models/analytics.d.ts +32 -0
  188. package/dist/models/analytics.d.ts.map +1 -1
  189. package/dist/models/analytics.js +68 -5
  190. package/dist/models/analytics.js.map +1 -1
  191. package/dist/models/plan-readability.d.ts +55 -0
  192. package/dist/models/plan-readability.d.ts.map +1 -0
  193. package/dist/models/plan-readability.js +339 -0
  194. package/dist/models/plan-readability.js.map +1 -0
  195. package/dist/placement/admission.d.ts +59 -0
  196. package/dist/placement/admission.d.ts.map +1 -0
  197. package/dist/placement/admission.js +197 -0
  198. package/dist/placement/admission.js.map +1 -0
  199. package/dist/placement/auto.d.ts +44 -0
  200. package/dist/placement/auto.d.ts.map +1 -0
  201. package/dist/placement/auto.js +212 -0
  202. package/dist/placement/auto.js.map +1 -0
  203. package/dist/placement/enforce.d.ts +128 -0
  204. package/dist/placement/enforce.d.ts.map +1 -0
  205. package/dist/placement/enforce.js +655 -0
  206. package/dist/placement/enforce.js.map +1 -0
  207. package/dist/placement/idle.d.ts +50 -0
  208. package/dist/placement/idle.d.ts.map +1 -0
  209. package/dist/placement/idle.js +213 -0
  210. package/dist/placement/idle.js.map +1 -0
  211. package/dist/placement/ledger.d.ts +323 -0
  212. package/dist/placement/ledger.d.ts.map +1 -0
  213. package/dist/placement/ledger.js +263 -0
  214. package/dist/placement/ledger.js.map +1 -0
  215. package/dist/placement/preview.d.ts +51 -0
  216. package/dist/placement/preview.d.ts.map +1 -0
  217. package/dist/placement/preview.js +61 -0
  218. package/dist/placement/preview.js.map +1 -0
  219. package/dist/placement/probes.d.ts +47 -0
  220. package/dist/placement/probes.d.ts.map +1 -0
  221. package/dist/placement/probes.js +207 -0
  222. package/dist/placement/probes.js.map +1 -0
  223. package/dist/placement/proxy-env.d.ts +21 -0
  224. package/dist/placement/proxy-env.d.ts.map +1 -0
  225. package/dist/placement/proxy-env.js +42 -0
  226. package/dist/placement/proxy-env.js.map +1 -0
  227. package/dist/placement/registry.d.ts +1038 -0
  228. package/dist/placement/registry.d.ts.map +1 -0
  229. package/dist/placement/registry.js +274 -0
  230. package/dist/placement/registry.js.map +1 -0
  231. package/dist/policies/liveness.d.ts +6 -8
  232. package/dist/policies/liveness.d.ts.map +1 -1
  233. package/dist/policies/liveness.js +6 -25
  234. package/dist/policies/liveness.js.map +1 -1
  235. package/dist/policies/sandbox-anchor.d.ts +91 -0
  236. package/dist/policies/sandbox-anchor.d.ts.map +1 -0
  237. package/dist/policies/sandbox-anchor.js +187 -0
  238. package/dist/policies/sandbox-anchor.js.map +1 -0
  239. package/dist/policies/sandbox-grants.d.ts +131 -0
  240. package/dist/policies/sandbox-grants.d.ts.map +1 -0
  241. package/dist/policies/sandbox-grants.js +562 -0
  242. package/dist/policies/sandbox-grants.js.map +1 -0
  243. package/dist/state/manifest.d.ts +4 -2
  244. package/dist/state/manifest.d.ts.map +1 -1
  245. package/dist/state/manifest.js +32 -16
  246. package/dist/state/manifest.js.map +1 -1
  247. package/dist/utils/checkout-root.d.ts +2 -0
  248. package/dist/utils/checkout-root.d.ts.map +1 -0
  249. package/dist/utils/checkout-root.js +43 -0
  250. package/dist/utils/checkout-root.js.map +1 -0
  251. package/dist/utils/resolve-uap-bin.d.ts +5 -0
  252. package/dist/utils/resolve-uap-bin.d.ts.map +1 -0
  253. package/dist/utils/resolve-uap-bin.js +33 -0
  254. package/dist/utils/resolve-uap-bin.js.map +1 -0
  255. package/dist/utils/terminal-safe.d.ts +12 -0
  256. package/dist/utils/terminal-safe.d.ts.map +1 -0
  257. package/dist/utils/terminal-safe.js +53 -0
  258. package/dist/utils/terminal-safe.js.map +1 -0
  259. package/docs/ATTRIBUTION.md +1 -0
  260. package/docs/DASHBOARD_UPLIFT_SPEC.md +8 -8
  261. package/docs/INDEX.md +6 -5
  262. package/docs/architecture/OVERVIEW.md +15 -3
  263. package/docs/architecture/PROTOCOL.md +7 -1
  264. package/docs/architecture/adr/0006-operator-directed-model-placement.md +86 -0
  265. package/docs/architecture/adr/0007-auto-displacement-allowlist-as-standing-consent.md +79 -0
  266. package/docs/architecture/adr/0008-fleet-clients-link-out.md +92 -0
  267. package/docs/architecture/adr/0009-completion-triggered-dispatch-and-per-leaf-model-dials.md +71 -0
  268. package/docs/architecture/adr/0010-attention-queue-and-afk-auto-decider.md +159 -0
  269. package/docs/architecture/adr/0011-sandbox-grants-and-network-egress-boundary.md +219 -0
  270. package/docs/architecture/adr/0012-operator-legibility-surfaces.md +175 -0
  271. package/docs/getting-started/INSTALLATION.md +1 -1
  272. package/docs/guides/AUTOMATIC_FEATURES.md +8 -0
  273. package/docs/guides/LOCAL_MODELS.md +1 -1
  274. package/docs/guides/PROXY.md +2 -1
  275. package/docs/guides/SANDBOX.md +91 -4
  276. package/docs/integrations/MCP_ROUTER.md +1 -1
  277. package/docs/plans/model-performance-proof-options.md +176 -0
  278. package/docs/reference/API.md +1 -1
  279. package/docs/reference/CLI.md +169 -4
  280. package/docs/reference/COMPARISON.md +1 -1
  281. package/docs/reference/CONFIGURATION.md +12 -3
  282. package/docs/reference/CONFIGURATION_REFERENCE.md +269 -14
  283. package/docs/reference/DATABASE_SCHEMA.md +1 -1
  284. package/docs/reference/FEATURES.md +15 -3
  285. package/docs/reference/PATTERNS.md +1 -1
  286. package/docs/reference/PLATFORMS.md +14 -1
  287. package/docs/specs/operator-model-placement.md +1314 -0
  288. package/docs/specs/operator-model-placement.review.md +339 -0
  289. package/package.json +2 -2
  290. package/scripts/maintenance/publish-npm.sh +23 -11
  291. package/scripts/version-bump.sh +6 -51
  292. package/src/policies/enforcers/__pycache__/_common.cpython-311.pyc +0 -0
  293. package/src/policies/enforcers/__pycache__/expert_review_required.cpython-311.pyc +0 -0
  294. package/src/policies/enforcers/__pycache__/quality_metrics_gate.cpython-311.pyc +0 -0
  295. package/src/policies/schemas/policies/mandatory-testing-deployment.md +2 -5
  296. package/templates/hooks/__pycache__/deliver_autoroute.cpython-311.pyc +0 -0
  297. package/templates/hooks/session-start.sh +44 -0
  298. package/tools/agents/UAP/cli.py +14 -3
  299. package/tools/agents/UAP/paths.py +50 -0
  300. package/tools/agents/scripts/__pycache__/toolcall_path_normalizer.cpython-311.pyc +0 -0
  301. package/tools/agents/scripts/anthropic_proxy.py +1386 -99
  302. package/tools/agents/scripts/toolcall_path_normalizer.py +46 -1
  303. package/tools/agents/tests/test_anthropic_proxy_streaming.py +29 -6
  304. package/tools/agents/tests/test_doubling_break.py +64 -5
  305. package/tools/agents/tests/test_error_loop_break.py +10 -4
  306. package/tools/agents/tests/test_error_loop_ignores_correctives.py +13 -2
  307. package/tools/agents/tests/test_lockstep_escalation.py +280 -9
  308. package/tools/agents/tests/test_path_containment.py +94 -0
  309. package/tools/agents/tests/test_proxy_unix_socket.py +162 -0
  310. package/tools/agents/tests/test_signature_quality.py +349 -0
  311. package/tools/agents/tests/test_uap_compliance.py +11 -1
  312. package/web/dash/core.js +1 -0
  313. package/web/dash/tab-clients.js +196 -0
  314. package/web/dash/tab-models.js +387 -8
  315. package/web/dash/tab-policies.js +87 -4
  316. package/web/dash/tabs.js +77 -73
  317. package/web/dashboard.html +6 -0
  318. package/src/policies/enforcers/__pycache__/_common.cpython-312.pyc +0 -0
  319. package/src/policies/enforcers/__pycache__/expert_review_required.cpython-312.pyc +0 -0
  320. package/src/policies/enforcers/__pycache__/quality_metrics_gate.cpython-312.pyc +0 -0
  321. package/templates/hooks/__pycache__/deliver_autoroute.cpython-312.pyc +0 -0
  322. package/tools/agents/scripts/__pycache__/toolcall_path_normalizer.cpython-312.pyc +0 -0
  323. package/web/dash/tab-agents.js +0 -21
  324. package/web/dash/tab-deliver.js +0 -12
  325. package/web/dash/tab-memory.js +0 -12
  326. package/web/dash/tab-orchestration.js +0 -21
  327. package/web/dash/tab-overview.js +0 -21
  328. package/web/dash/tab-tasks.js +0 -21
@@ -0,0 +1,567 @@
1
+ /**
2
+ * `uap models` — model placement surface (spec §4.7).
3
+ *
4
+ * validate — registry (repo + machine-local merge) ↔ capacity-policy
5
+ * cross-check, provenance per measured config. Read-only.
6
+ * measure — record the LIVE backend's footprint into
7
+ * ~/.uap/model-registry.json. Fails closed on anything
8
+ * unverifiable.
9
+ * status — sync + print the placement ledger: devices (probe fact),
10
+ * residents, headroom.
11
+ * pending — list parked placement requests awaiting the operator, with
12
+ * ranked options (1-based, what `apply` takes).
13
+ * apply — the explicit operator yes: prints the impact list first,
14
+ * then enforces (drain → stop → verify-free → start → verify
15
+ * → refresh), rolling back on any failure. --yes required.
16
+ * dismiss — refuse a parked request; the client falls back on expiry.
17
+ * load — operator-initiated load; reuse/load-alongside only, never
18
+ * displacement (displacement needs the pending path).
19
+ * unload — drain, stop, verify-free, refresh for a model's residents.
20
+ * units — write Conflicts= drop-ins for same-device units (systemd
21
+ * itself then refuses two same-device residents).
22
+ */
23
+ import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';
24
+ import { dirname } from 'path';
25
+ import { REGISTRY_VERSION, configCostMiB, isMeasuredConfig, loadModelRegistry, validateRegistry, } from '../placement/registry.js';
26
+ import { gpuComputeMiB, gpuStatsByIndex, hostRssMiB, hostTotalMiB, listeningPortPid, unitCgroupPids, unitMainPid, isUnitActive, } from '../placement/probes.js';
27
+ import { loadLedger, placementLedgerPath, residentTargetId, syncLedger, } from '../placement/ledger.js';
28
+ import { computeOptions } from '../placement/admission.js';
29
+ import { buildVictimPreviews } from '../placement/preview.js';
30
+ import { resolvePendingPlacement, dismissPendingPlacement, loadPlacement, unloadPlacement, writePlacementUnitDropins, fetchProxyInflight, } from '../placement/enforce.js';
31
+ import { resolveAttentionBySource } from '../delivery/attention.js';
32
+ import { autoPolicyPath, loadAutoPolicy, MIN_UNLOAD_IDLE_SECS, saveAutoPolicy, } from '../placement/auto.js';
33
+ import { loadPolicy } from '../capacity/probe.js';
34
+ import { looksLikeStrataMetrics, parseStrataEngine } from '../inference/strata.js';
35
+ const PROBE_TIMEOUT_MS = 5000;
36
+ function fail(msg) {
37
+ throw new Error(msg);
38
+ }
39
+ async function fetchMetrics(endpoint) {
40
+ const url = `${endpoint.replace(/\/+$/, '')}/metrics`;
41
+ const ctrl = new AbortController();
42
+ const timer = setTimeout(() => ctrl.abort(), PROBE_TIMEOUT_MS);
43
+ try {
44
+ const res = await fetch(url, { signal: ctrl.signal });
45
+ if (!res.ok)
46
+ throw new Error(`GET ${url} → HTTP ${res.status}`);
47
+ return (await res.json());
48
+ }
49
+ finally {
50
+ clearTimeout(timer);
51
+ }
52
+ }
53
+ function endpointPort(endpoint) {
54
+ try {
55
+ return new URL(endpoint).port ? Number(new URL(endpoint).port) : null;
56
+ }
57
+ catch {
58
+ return null;
59
+ }
60
+ }
61
+ export async function modelsValidateCommand(opts = {}) {
62
+ const projectDir = opts.projectDir ?? process.cwd();
63
+ const loaded = loadModelRegistry(projectDir, { repoPath: opts.repoPath, localPath: opts.localPath });
64
+ for (const err of loaded.errors)
65
+ console.error(`registry error: ${err}`);
66
+ let findings = [];
67
+ try {
68
+ const { policy } = loadPolicy(projectDir);
69
+ findings = validateRegistry(loaded.registry, policy);
70
+ }
71
+ catch (err) {
72
+ console.error(`capacity policy unavailable: ${err.message}`);
73
+ }
74
+ console.log(`repo registry: ${loaded.repoPath}${existsSync(loaded.repoPath) ? '' : ' (missing)'}`);
75
+ console.log(`local registry: ${loaded.localPath}${existsSync(loaded.localPath) ? '' : ' (missing — no measured footprints on this machine)'}`);
76
+ console.log('');
77
+ for (const [dKey, dev] of Object.entries(loaded.registry.devices)) {
78
+ const total = dev.total_mib !== undefined ? `${dev.total_mib} MiB` : 'total unmeasured';
79
+ const reserved = dev.reserved_mib !== undefined ? `, ${dev.reserved_mib} MiB reserved` : ', reserve unmeasured';
80
+ console.log(`device ${dKey}: ${dev.kind}, ${total}${reserved}`);
81
+ }
82
+ console.log('');
83
+ for (const [mKey, model] of Object.entries(loaded.registry.models)) {
84
+ console.log(`${model.display} (${mKey})`);
85
+ for (const [cKey, cfg] of Object.entries(model.configs)) {
86
+ if (isMeasuredConfig(cfg)) {
87
+ const src = loaded.measuredFrom.get(`${mKey}/${cKey}`);
88
+ const cost = configCostMiB(cfg, cfg.kv_resident_cells);
89
+ console.log(` ${cKey}: measured — ${cfg.resident_gpu_mib} MiB GPU, ${cfg.host_rss_mib} MiB RSS, kv ${cfg.kv_kind ?? '?'} (${cfg.kv_resident_cells}/${cfg.context_pool_cells} cells) [${src}]` + (cost === null ? ' cost above pool: unknown' : ''));
90
+ }
91
+ else {
92
+ console.log(` ${cKey}: unmeasured — fails closed (servable if resident, never loadable)`);
93
+ }
94
+ }
95
+ }
96
+ console.log('');
97
+ if (findings.length > 0) {
98
+ for (const f of findings)
99
+ console.error(`${f.severity === 'error' ? 'ERROR' : 'WARN '} ${f.scope}: ${f.message}`);
100
+ }
101
+ else {
102
+ console.log('validate: no findings');
103
+ }
104
+ const errors = loaded.errors.length + findings.filter((f) => f.severity === 'error').length;
105
+ return errors > 0 ? 1 : 0;
106
+ }
107
+ /** Find the registry entry the live backend's advertised model id maps to.
108
+ * Exactly one match or explicit --model/--config; ambiguity is an error, not
109
+ * a guess — attributing a measurement to the wrong entry poisons the
110
+ * registry. */
111
+ function resolveMeasureTarget(registry, liveModel, modelKey, configKey) {
112
+ const wantExplicit = modelKey !== undefined || configKey !== undefined;
113
+ if (wantExplicit && (modelKey === undefined || configKey === undefined)) {
114
+ fail('--model and --config must be given together');
115
+ }
116
+ if (modelKey !== undefined && configKey !== undefined) {
117
+ const entry = registry.models[modelKey]?.configs[configKey];
118
+ if (!entry)
119
+ fail(`no registry config '${modelKey}/${configKey}'`);
120
+ const advertises = registry.models[modelKey].advertises ?? [];
121
+ if (liveModel && advertises.length > 0 && !advertises.includes(liveModel)) {
122
+ fail(`live backend advertises '${liveModel}' but ${modelKey} advertises [${advertises.join(', ')}] — refusing to attribute this measurement`);
123
+ }
124
+ return { modelKey, configKey, registry };
125
+ }
126
+ const matches = [];
127
+ for (const [mKey, model] of Object.entries(registry.models)) {
128
+ if (!liveModel)
129
+ continue;
130
+ if ((model.advertises ?? []).includes(liveModel)) {
131
+ const configKeys = Object.keys(model.configs);
132
+ for (const cKey of configKeys)
133
+ matches.push({ modelKey: mKey, configKey: cKey, registry });
134
+ }
135
+ }
136
+ if (matches.length === 1)
137
+ return matches[0];
138
+ if (matches.length === 0)
139
+ fail(`no registry entry advertises '${liveModel ?? '?'}' — pass --model <key> --config <key> to attribute the measurement`);
140
+ fail(`ambiguous: ${matches.map((m) => `${m.modelKey}/${m.configKey}`).join(', ')} all advertise '${liveModel}' — pass --model and --config`);
141
+ }
142
+ export async function modelsMeasureCommand(opts = {}) {
143
+ const projectDir = opts.projectDir ?? process.cwd();
144
+ const loaded = loadModelRegistry(projectDir, { repoPath: opts.repoPath, localPath: opts.localPath });
145
+ for (const err of loaded.errors)
146
+ console.error(`registry error: ${err}`);
147
+ if (loaded.errors.length > 0)
148
+ return 1;
149
+ const endpoint = opts.endpoint ?? 'http://127.0.0.1:8080';
150
+ const metrics = await fetchMetrics(endpoint).catch((err) => fail(`${err.message} — is the backend live? measure only works against a resident backend`));
151
+ if (!looksLikeStrataMetrics(metrics))
152
+ fail(`${endpoint}/metrics is not a strata metrics document — v1 measure supports strata-kind backends only`);
153
+ const { engine } = parseStrataEngine(metrics);
154
+ if (engine.maxContext === undefined)
155
+ fail('/metrics engine.max_context missing — refusing to guess the context pool');
156
+ if (engine.kvResident === undefined)
157
+ fail('/metrics engine.kv_resident missing — refusing to guess the resident KV pool');
158
+ if (engine.model === undefined)
159
+ fail('/metrics engine.model missing — cannot attribute the measurement');
160
+ const target = resolveMeasureTarget(loaded.registry, engine.model, opts.model, opts.config);
161
+ const model = loaded.registry.models[target.modelKey];
162
+ const entry = model.configs[target.configKey];
163
+ const unit = entry.unit ?? model.unit;
164
+ const port = endpointPort(endpoint);
165
+ // Prefer the unit's whole cgroup (multi-process backends), then MainPID,
166
+ // then the port listener (unit-less single-process backends).
167
+ const mainPid = unit ? unitMainPid(unit) : null;
168
+ const pids = (unit ? unitCgroupPids(unit) : null) ?? (mainPid ? [mainPid] : null) ?? (port ? [listeningPortPid(port)] : []);
169
+ if (pids.length === 0)
170
+ fail(`cannot find the backend processes (unit '${unit ?? 'none'}', port ${port ?? '?'}) — nothing to measure`);
171
+ const residentGpu = gpuComputeMiB(pids);
172
+ if (residentGpu === null)
173
+ fail(`nvidia-smi shows no GPU memory held by [${pids.join(', ')}] — refusing to record zero; is the backend on the GPU?`);
174
+ const rss = hostRssMiB(pids);
175
+ if (rss === null)
176
+ fail(`no /proc/<pid>/status readable for [${pids.join(', ')}] — refusing to guess host RSS`);
177
+ const device = opts.device ?? Object.entries(loaded.registry.devices).find(([, d]) => d.kind === 'gpu')?.[0] ?? 'gpu0';
178
+ // Identity fields (unit/profile/service/...) come from the merged entry so
179
+ // the measured write never drops how the config was found.
180
+ const measured = {
181
+ engine: entry.engine,
182
+ unit: entry.unit,
183
+ profile: entry.profile,
184
+ service: entry.service,
185
+ note: entry.note,
186
+ flags: entry.flags,
187
+ rails: entry.rails,
188
+ resident_gpu_mib: residentGpu,
189
+ host_rss_mib: rss,
190
+ context_pool_cells: engine.maxContext,
191
+ kv_resident_cells: engine.kvResident,
192
+ kv_kind: engine.kv,
193
+ measured_at: new Date().toISOString(),
194
+ measured_on: device,
195
+ };
196
+ console.log(`${target.modelKey}/${target.configKey} (${pids.join(', ')}${unit ? `, unit ${unit}` : ''}):`);
197
+ console.log(` resident_gpu_mib: ${residentGpu}`);
198
+ console.log(` host_rss_mib: ${rss}`);
199
+ console.log(` context_pool: ${engine.maxContext} cells, kv ${engine.kv ?? '?'} resident ${engine.kvResident}`);
200
+ // Device facts (spec §4.1.1): the gpu reserve is DERIVED — capacity minus
201
+ // free minus the backend's own compute apps — so unattributed graphics
202
+ // memory lands in the reserve whether or not a PID owns it. The cpu
203
+ // reserve is the documented spec floor, not a measurement.
204
+ const deviceFacts = {};
205
+ const gpuIdx = /^gpu(\d+)$/.exec(device);
206
+ if (gpuIdx) {
207
+ const stats = gpuStatsByIndex().get(Number(gpuIdx[1]));
208
+ if (stats?.total_mib !== undefined && stats?.free_mib !== undefined) {
209
+ const reserved = Math.max(0, stats.total_mib - stats.free_mib - residentGpu);
210
+ deviceFacts[device] = {
211
+ kind: 'gpu',
212
+ total_mib: stats.total_mib,
213
+ reserved_mib: reserved,
214
+ reserve_reason: `derived: total ${stats.total_mib} − free ${stats.free_mib} − backend compute apps ${residentGpu}; captures desktop + unattributed graphics memory`,
215
+ };
216
+ console.log(` ${device}: total ${stats.total_mib} MiB, derived reserve ${reserved} MiB (desktop + graphics)`);
217
+ }
218
+ }
219
+ const hostTotal = hostTotalMiB();
220
+ if (hostTotal !== null) {
221
+ deviceFacts.cpu0 = {
222
+ kind: 'cpu',
223
+ total_mib: hostTotal,
224
+ reserved_mib: 8192,
225
+ reserve_reason: 'spec §4.1 floor: page cache and the TS side must survive a 52 GiB engine attach',
226
+ };
227
+ console.log(` cpu0: total ${hostTotal} MiB, reserve 8192 MiB (spec floor)`);
228
+ }
229
+ if (opts.dryRun) {
230
+ console.log('dry-run: nothing written');
231
+ return 0;
232
+ }
233
+ const localPath = loaded.localPath;
234
+ let localDoc = {};
235
+ if (existsSync(localPath)) {
236
+ localDoc = JSON.parse(readFileSync(localPath, 'utf-8'));
237
+ }
238
+ if (localDoc.version !== undefined && localDoc.version !== REGISTRY_VERSION) {
239
+ fail(`${localPath}: unsupported version ${localDoc.version} (expected ${REGISTRY_VERSION}) — refusing to clobber`);
240
+ }
241
+ localDoc.version = REGISTRY_VERSION;
242
+ localDoc.models = localDoc.models ?? {};
243
+ if (Object.keys(deviceFacts).length > 0) {
244
+ localDoc.devices = { ...localDoc.devices, ...deviceFacts };
245
+ }
246
+ const localModel = (localDoc.models[target.modelKey] = localDoc.models[target.modelKey] ?? { display: model.display, configs: {} });
247
+ localModel.configs = localModel.configs ?? {};
248
+ localModel.configs[target.configKey] = measured;
249
+ mkdirSync(dirname(localPath), { recursive: true });
250
+ writeFileSync(localPath, `${JSON.stringify(localDoc, null, 2)}\n`);
251
+ console.log(`written: ${localPath}`);
252
+ console.log('next: uap models validate');
253
+ return 0;
254
+ }
255
+ function printLedger(ledger) {
256
+ for (const [dKey, dev] of Object.entries(ledger.devices)) {
257
+ const free = dev.free_mib !== undefined ? `${dev.free_mib} MiB free` : 'free unprobed';
258
+ const total = dev.total_mib !== undefined ? `${dev.total_mib} MiB total` : 'total unmeasured';
259
+ const reserved = dev.reserved_mib !== undefined ? `, ${dev.reserved_mib} reserved` : ', reserve unmeasured';
260
+ console.log(`device ${dKey}: ${dev.kind}, ${total}, ${free}${reserved} [${dev.source ?? '?'}]`);
261
+ }
262
+ console.log('');
263
+ if (ledger.residents.length === 0) {
264
+ console.log('residents: none');
265
+ }
266
+ for (const r of ledger.residents) {
267
+ const gpu = r.gpu_mib !== undefined ? `, ${r.gpu_mib} MiB GPU` : ', GPU unknown';
268
+ const rss = r.host_rss_mib !== undefined ? `, ${r.host_rss_mib} MiB RSS` : '';
269
+ console.log(`resident ${r.model}/${r.config} ${r.state} on ${r.device}${gpu}${rss}${r.unit ? ` (${r.unit})` : ''}`);
270
+ }
271
+ console.log('');
272
+ console.log(ledger.pending.length === 0 ? 'pending: none' : `pending: ${ledger.pending.length}`);
273
+ for (const p of ledger.pending) {
274
+ console.log(` ${p.id} ${p.requested_model} (client ${p.client ?? '?'}, expires ${p.expires_at}) — ${p.reason ?? 'parked'}`);
275
+ }
276
+ }
277
+ export async function modelsStatusCommand(opts = {}) {
278
+ const projectDir = opts.projectDir ?? process.cwd();
279
+ const loaded = loadModelRegistry(projectDir, { repoPath: opts.repoPath, localPath: opts.localPath });
280
+ for (const err of loaded.errors)
281
+ console.error(`registry error: ${err}`);
282
+ if (loaded.errors.length > 0)
283
+ return 1;
284
+ const ledgerPath = opts.ledgerPath ?? placementLedgerPath();
285
+ const ledger = syncLedger(loaded.registry, ledgerPath, isUnitActive);
286
+ printLedger(ledger);
287
+ return 0;
288
+ }
289
+ export async function modelsPendingCommand(opts = {}) {
290
+ const projectDir = opts.projectDir ?? process.cwd();
291
+ const ledgerPath = opts.ledgerPath ?? placementLedgerPath();
292
+ const ledger = loadLedger(ledgerPath);
293
+ if (ledger.pending.length === 0) {
294
+ console.log('no pending placement requests');
295
+ return 0;
296
+ }
297
+ const loaded = loadModelRegistry(projectDir, { repoPath: opts.repoPath, localPath: opts.localPath });
298
+ const now = Date.now();
299
+ for (const p of ledger.pending) {
300
+ const expires = new Date(p.expires_at).getTime();
301
+ console.log(`${p.id} ${p.requested_model}`);
302
+ console.log(` client ${p.client ?? '?'}${p.session ? `, session ${p.session}` : ''}${p.pid ? `, pid ${p.pid}` : ''}`);
303
+ console.log(` parked ${p.created_at}, expires ${p.expires_at} (${expires > now ? `${Math.round((expires - now) / 1000)}s left` : 'EXPIRED'})`);
304
+ console.log(` reason: ${p.reason ?? 'parked'}`);
305
+ // Options are per-request (spec §4.4): recompute against the context the
306
+ // parked request actually needs, when the proxy recorded it — the 32k
307
+ // default would fail-closed-refuse a small-pool config that fits fine.
308
+ const options = computeOptions(loaded.registry, ledger, p.requested_model, { cells: p.cells }).options;
309
+ if (options.length === 0) {
310
+ console.log(' no viable option (unmeasured, unknown cost, or nothing fits)');
311
+ }
312
+ options.forEach((o, i) => {
313
+ const victims = o.victims ?? [];
314
+ const impact = victims.length
315
+ ? ` — displaces ${victims.map((v) => `${v.model}/${v.config}`).join(', ')}`
316
+ : '';
317
+ console.log(` option ${i + 1}: ${o.kind} ${o.model}/${o.config} on ${o.device}${impact}`);
318
+ });
319
+ }
320
+ console.log('');
321
+ console.log('resolve: uap models apply <id> <option> --yes | refuse: uap models dismiss <id>');
322
+ return 0;
323
+ }
324
+ export async function modelsApplyCommand(opts = {}) {
325
+ const projectDir = opts.projectDir ?? process.cwd();
326
+ const placementId = opts.placementId ?? '';
327
+ const option = Number(opts.option);
328
+ if (!placementId || !Number.isInteger(option) || option < 1) {
329
+ console.error('usage: uap models apply <placement-id> <option> [--yes]');
330
+ return 1;
331
+ }
332
+ const ledgerPath = opts.ledgerPath ?? placementLedgerPath();
333
+ const pending = loadLedger(ledgerPath).pending.find((p) => p.id === placementId);
334
+ if (!pending) {
335
+ console.error(`no pending placement ${placementId} (run: uap models pending)`);
336
+ return 1;
337
+ }
338
+ const loaded = loadModelRegistry(projectDir, { repoPath: opts.repoPath, localPath: opts.localPath });
339
+ // The operator approves the option list the PARKED REQUEST computed against
340
+ // its own context need (recorded in the entry) — not the 32k default, which
341
+ // can refuse a config that serves this request fine.
342
+ const options = computeOptions(loaded.registry, loadLedger(ledgerPath), pending.requested_model, {
343
+ cells: pending.cells,
344
+ }).options;
345
+ const approved = options[option - 1];
346
+ if (!approved) {
347
+ console.error(`option ${option} does not exist (1-${options.length})`);
348
+ return 1;
349
+ }
350
+ // Print the impact list first (spec §4.7): the operator approves KNOWING
351
+ // what is killed. In-flight is the proxy's live view when it answers;
352
+ // otherwise the honest `unknown`.
353
+ if (approved.victims?.length) {
354
+ const inflightMap = await fetchProxyInflight();
355
+ const inflightOf = (victim) => {
356
+ if (inflightMap === null)
357
+ return 'unknown';
358
+ const entries = inflightMap.get(residentTargetId(victim));
359
+ return entries !== undefined ? entries.length > 0 : 'unknown';
360
+ };
361
+ console.log('impact:');
362
+ for (const v of buildVictimPreviews(loaded.registry, approved.victims, inflightOf)) {
363
+ console.log(` ${v.model}/${v.config} on ${v.device}: ${v.consequence} (frees ${v.frees_gpu_mib} MiB GPU)`);
364
+ }
365
+ }
366
+ else {
367
+ console.log(`impact: none (${approved.kind} ${approved.model}/${approved.config})`);
368
+ }
369
+ if (!opts.yes) {
370
+ console.log('');
371
+ console.log(`confirm: uap models apply ${placementId} ${option} --yes`);
372
+ return 1;
373
+ }
374
+ // The approval signature: what is enforced must be exactly what the
375
+ // impact list above showed (a recomputed drift between print and enforce
376
+ // refuses instead of displacing a set the operator never saw).
377
+ const result = await resolvePendingPlacement(projectDir, placementId, option, {
378
+ ledgerPath,
379
+ expectedVictims: (approved.victims ?? []).map((v) => ({ model: v.model, config: v.config })),
380
+ });
381
+ for (const s of result.steps)
382
+ console.log(`${s.ok ? 'ok ' : 'FAIL'} ${s.name}${s.detail ? ` — ${s.detail}` : ''}`);
383
+ if (!result.ok) {
384
+ console.error(`enforcement failed${result.rolledBack ? ' (rolled back)' : ''}: ${result.error}`);
385
+ return 1;
386
+ }
387
+ // P3: close the attention ask by origin — the operator answered through
388
+ // the placement surface; a later sweep must not record a false AFK
389
+ // adoption over this decision. Best-effort + idempotent (no open ask →
390
+ // resolves nothing).
391
+ resolveAttentionBySource(projectDir, `placement:${placementId}`, `operator applied option ${option}`);
392
+ console.log('placement applied; the parked client is served on its next retry');
393
+ return 0;
394
+ }
395
+ export async function modelsDismissCommand(opts = {}) {
396
+ const placementId = opts.placementId ?? '';
397
+ if (!placementId) {
398
+ console.error('usage: uap models dismiss <placement-id>');
399
+ return 1;
400
+ }
401
+ const { dismissed } = dismissPendingPlacement(placementId, { ledgerPath: opts.ledgerPath });
402
+ if (dismissed) {
403
+ // Same origin-close as apply (see above); the queue root is the main
404
+ // checkout, so the CLI's cwd only needs to be inside the project.
405
+ resolveAttentionBySource(process.cwd(), `placement:${placementId}`, 'operator dismissed the parked request');
406
+ }
407
+ console.log(dismissed ? `dismissed ${placementId}; the client falls back on its next retry` : `no pending placement ${placementId}`);
408
+ return dismissed ? 0 : 1;
409
+ }
410
+ export async function modelsLoadCommand(opts = {}) {
411
+ const projectDir = opts.projectDir ?? process.cwd();
412
+ const model = opts.model ?? '';
413
+ if (!model) {
414
+ console.error('usage: uap models load <model-key>');
415
+ return 1;
416
+ }
417
+ const result = await loadPlacement(projectDir, model, { ledgerPath: opts.ledgerPath });
418
+ for (const s of result.steps)
419
+ console.log(`${s.ok ? 'ok ' : 'FAIL'} ${s.name}${s.detail ? ` — ${s.detail}` : ''}`);
420
+ if (!result.ok) {
421
+ console.error(result.error);
422
+ return 1;
423
+ }
424
+ return 0;
425
+ }
426
+ export async function modelsUnloadCommand(opts = {}) {
427
+ const projectDir = opts.projectDir ?? process.cwd();
428
+ const model = opts.model ?? '';
429
+ if (!model) {
430
+ console.error('usage: uap models unload <model-key>');
431
+ return 1;
432
+ }
433
+ const result = await unloadPlacement(projectDir, model, { ledgerPath: opts.ledgerPath });
434
+ for (const s of result.steps)
435
+ console.log(`${s.ok ? 'ok ' : 'FAIL'} ${s.name}${s.detail ? ` — ${s.detail}` : ''}`);
436
+ if (!result.ok) {
437
+ console.error(result.error);
438
+ return 1;
439
+ }
440
+ return 0;
441
+ }
442
+ export async function modelsUnitsCommand(opts = {}) {
443
+ const projectDir = opts.projectDir ?? process.cwd();
444
+ const loaded = loadModelRegistry(projectDir, { repoPath: opts.repoPath, localPath: opts.localPath });
445
+ const { written, dir } = writePlacementUnitDropins(loaded.registry);
446
+ if (written.length === 0) {
447
+ console.log('no same-device unit pairs in the registry; nothing to write');
448
+ return 0;
449
+ }
450
+ for (const w of written)
451
+ console.log(`wrote ${w}`);
452
+ console.log(`(Conflicts= drop-ins in ${dir}; the operator's unit files are untouched)`);
453
+ return 0;
454
+ }
455
+ export function modelsAutoCommand(opts = {}) {
456
+ const path = opts.policyPath ?? autoPolicyPath();
457
+ const policy = loadAutoPolicy(path);
458
+ if (opts.enable === true && opts.disable === true) {
459
+ console.error('--enable and --disable are mutually exclusive; pick one');
460
+ return 1;
461
+ }
462
+ if (opts.unloadIdleAfterSecs !== undefined && opts.unloadIdleAfterSecsOff) {
463
+ console.error('--unload-idle-after-secs and --unload-idle-off are mutually exclusive');
464
+ return 1;
465
+ }
466
+ const wantsChange = opts.enable === true || opts.disable === true || !!opts.allowDisplace || !!opts.disallowDisplace ||
467
+ opts.unloadIdleAfterSecs !== undefined || opts.unloadIdleAfterSecsOff === true ||
468
+ !!opts.allowUnload || !!opts.disallowUnload;
469
+ if (!wantsChange) {
470
+ console.log(`auto-load: ${policy.enabled ? 'enabled' : 'disabled'} (${path})`);
471
+ console.log(' non-displacing options (load-alongside) load automatically when the policy is enabled');
472
+ console.log(` auto-displacement allowlist: ${policy.allow_displace.length ? policy.allow_displace.join(', ') : '(empty — displacement always parks for the operator)'}`);
473
+ console.log(` idle-unload: ${policy.unload_idle_after_secs
474
+ ? `after ${policy.unload_idle_after_secs}s idle; allowlist: ${policy.unload_allow?.length ? policy.unload_allow.join(', ') : '(empty — nobody is swept)'}`
475
+ : '(off — no unload_idle_after_secs recorded)'}`);
476
+ return 0;
477
+ }
478
+ const next = { ...policy, allow_displace: [...policy.allow_displace] };
479
+ if (opts.enable === true)
480
+ next.enabled = true;
481
+ if (opts.disable === true)
482
+ next.enabled = false;
483
+ const parseList = (v) => v.split(',').map((s) => s.trim()).filter(Boolean);
484
+ if (opts.allowDisplace) {
485
+ const adding = parseList(opts.allowDisplace);
486
+ if (!opts.yes) {
487
+ console.log('auto-displacement means: a parked request for these models UNLOADS the current');
488
+ console.log('resident(s) — the minimal set that makes room, re-evaluated at load time — and');
489
+ console.log('loads the requested one WITHOUT an operator prompt between them.');
490
+ console.log(`models: ${adding.join(', ')}`);
491
+ console.log(`confirm: uap models auto --allow-displace ${opts.allowDisplace} --yes`);
492
+ return 1;
493
+ }
494
+ for (const m of adding)
495
+ if (!next.allow_displace.includes(m))
496
+ next.allow_displace.push(m);
497
+ console.log(`auto-displacement allowed for: ${next.allow_displace.join(', ')}`);
498
+ }
499
+ if (opts.disallowDisplace) {
500
+ for (const m of parseList(opts.disallowDisplace)) {
501
+ next.allow_displace = next.allow_displace.filter((x) => x !== m);
502
+ }
503
+ console.log(`auto-displacement allowed for: ${next.allow_displace.join(', ') || '(none)'}`);
504
+ }
505
+ if (opts.allowUnload) {
506
+ const adding = parseList(opts.allowUnload);
507
+ if (!opts.yes) {
508
+ console.log('idle-unload means: once these models have served no gated request for the');
509
+ console.log('armed idle window AND their endpoint has no established connections, the');
510
+ console.log('dashboard STOPS their resident automatically — full drain and in-flight');
511
+ console.log('checks included — with no operator prompt.');
512
+ console.log(`models: ${adding.join(', ')}`);
513
+ console.log(`confirm: uap models auto --allow-unload ${opts.allowUnload} --yes`);
514
+ return 1;
515
+ }
516
+ next.unload_allow = [...(next.unload_allow ?? [])];
517
+ for (const m of adding)
518
+ if (!next.unload_allow.includes(m))
519
+ next.unload_allow.push(m);
520
+ console.log(`idle-unload allowed for: ${next.unload_allow.join(', ')}`);
521
+ }
522
+ if (opts.disallowUnload) {
523
+ next.unload_allow = [...(next.unload_allow ?? [])];
524
+ for (const m of parseList(opts.disallowUnload)) {
525
+ next.unload_allow = next.unload_allow.filter((x) => x !== m);
526
+ }
527
+ console.log(`idle-unload allowed for: ${next.unload_allow.join(', ') || '(none)'}`);
528
+ }
529
+ if (opts.unloadIdleAfterSecs !== undefined) {
530
+ if (!Number.isFinite(opts.unloadIdleAfterSecs) || opts.unloadIdleAfterSecs < MIN_UNLOAD_IDLE_SECS) {
531
+ console.error(`--unload-idle-after-secs must be >= ${MIN_UNLOAD_IDLE_SECS} (under a minute the sweep would thrash)`);
532
+ return 1;
533
+ }
534
+ next.unload_idle_after_secs = Math.floor(opts.unloadIdleAfterSecs);
535
+ console.log(`idle-unload timer: ${next.unload_idle_after_secs}s`);
536
+ }
537
+ if (opts.unloadIdleAfterSecsOff === true) {
538
+ delete next.unload_idle_after_secs;
539
+ console.log('idle-unload timer: (disarmed — allowlist left as recorded)');
540
+ }
541
+ saveAutoPolicy(next, path);
542
+ console.log(`auto-load: ${next.enabled ? 'enabled' : 'disabled'} (policy written to ${path})`);
543
+ console.log('the dashboard controller picks the policy up on its next admission (no restart needed)');
544
+ return 0;
545
+ }
546
+ export async function modelsCommand(action, opts) {
547
+ if (action === 'validate')
548
+ return modelsValidateCommand(opts);
549
+ if (action === 'measure')
550
+ return modelsMeasureCommand(opts);
551
+ if (action === 'status')
552
+ return modelsStatusCommand(opts);
553
+ if (action === 'apply')
554
+ return modelsApplyCommand(opts);
555
+ if (action === 'dismiss')
556
+ return modelsDismissCommand(opts);
557
+ if (action === 'load')
558
+ return modelsLoadCommand(opts);
559
+ if (action === 'unload')
560
+ return modelsUnloadCommand(opts);
561
+ if (action === 'units')
562
+ return modelsUnitsCommand(opts);
563
+ if (action === 'auto')
564
+ return modelsAutoCommand(opts);
565
+ return modelsPendingCommand(opts);
566
+ }
567
+ //# sourceMappingURL=models.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"models.js","sourceRoot":"","sources":["../../src/cli/models.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import type { LoopExecutor } from '../delivery/convergence-loop.js';
2
+ import { type PlanReadabilityReport } from '../models/plan-readability.js';
2
3
  export interface PlanOptions {
3
4
  json?: boolean;
4
5
  /** Explicit plan artifact to review (positional arg after `validate`). */
@@ -18,6 +19,8 @@ export interface PlanReviewOutcome {
18
19
  file?: string;
19
20
  findings: string[];
20
21
  reason?: string;
22
+ /** B1 plan-comprehension scan — present whenever a review resolved plan text. */
23
+ readability?: PlanReadabilityReport;
21
24
  }
22
25
  declare function statePath(cwd: string): string;
23
26
  declare function windowSec(): number;
@@ -47,6 +50,12 @@ export interface PlanState {
47
50
  reason: string;
48
51
  at: number;
49
52
  }>;
53
+ /**
54
+ * B1 plan-comprehension scan record for the latest stamp. Additive: the
55
+ * Python enforcer (validate_plan_on_change.py) reads only pending/validated,
56
+ * so older/newer readers coexist with this key.
57
+ */
58
+ readability?: Pick<PlanReadabilityReport, 'passed' | 'strict' | 'findings'>;
50
59
  }
51
60
  /** Path key shared with the enforcer: repo-relative, forward slashes. */
52
61
  export declare function planKey(cwd: string, file: string): string;