@miller-tech/uap 2.21.2 → 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,331 @@
1
+ /**
2
+ * Placement routes for the dashboard (spec §4.3/§4.7).
3
+ *
4
+ * Reads are open, like every other dashboard read; the load/unload/resolve
5
+ * mutation routes arrive with phase 3 enforcement and go through
6
+ * mutationAuthorized(). One exception ships in phase 2: the admission
7
+ * endpoint (`getPlacementAdmit` + POST /api/placement/admit) is a WRITE —
8
+ * it appends pending entries to the ledger — but its caller is the proxy
9
+ * (a local process with no dashboard token), so it is loopback-gated in
10
+ * server.ts instead of token-gated, and its only write is the operator's
11
+ * decision queue.
12
+ */
13
+ import { randomBytes } from 'crypto';
14
+ import { enqueueAttention } from '../delivery/attention.js';
15
+ import { isUnitActive } from '../placement/probes.js';
16
+ import { syncLedger, loadLedger, withLedger, placementLedgerPath, probeDeviceStates, residentTargetId, } from '../placement/ledger.js';
17
+ import { isMeasuredConfig, isPlaceable, loadModelRegistry, } from '../placement/registry.js';
18
+ import { computeOptions } from '../placement/admission.js';
19
+ import { autoOptionFor, autoPolicyPath, loadAutoPolicy, scheduleAutoResolution, } from '../placement/auto.js';
20
+ function summarizeRegistry(loaded) {
21
+ return Object.entries(loaded.registry.models).map(([mKey, model]) => ({
22
+ model: mKey,
23
+ display: model.display,
24
+ engine: model.engine,
25
+ unit: model.unit,
26
+ service: model.service,
27
+ advertises: model.advertises ?? [],
28
+ configs: Object.entries(model.configs).map(([cKey, cfg]) => isMeasuredConfig(cfg)
29
+ ? {
30
+ config: cKey,
31
+ measured: true,
32
+ resident_gpu_mib: cfg.resident_gpu_mib,
33
+ host_rss_mib: cfg.host_rss_mib,
34
+ context_pool_cells: cfg.context_pool_cells,
35
+ kv_resident_cells: cfg.kv_resident_cells,
36
+ kv_kind: cfg.kv_kind,
37
+ measured_at: cfg.measured_at,
38
+ measured_on: cfg.measured_on,
39
+ source: loaded.measuredFrom.get(`${mKey}/${cKey}`),
40
+ }
41
+ : { config: cKey, measured: false, unit: cfg.unit }),
42
+ }));
43
+ }
44
+ /** Full placement state: registry summary + synced ledger (devices from live
45
+ * probes, residents reconciled from unit activity, pending parked requests). */
46
+ export function getPlacementState(projectDir, opts) {
47
+ const loaded = opts?.loaded ?? loadModelRegistry(projectDir);
48
+ const ledgerPath = opts?.ledgerPath ?? placementLedgerPath();
49
+ const ledger = syncLedger(loaded.registry, ledgerPath, opts?.isActive ?? isUnitActive);
50
+ return {
51
+ updated_at: ledger.updated_at,
52
+ devices: ledger.devices,
53
+ residents: ledger.residents,
54
+ pending: ledger.pending,
55
+ models: summarizeRegistry(loaded),
56
+ registry_errors: loaded.errors,
57
+ auto: loadAutoPolicy(opts?.autoPolicyPath ?? autoPolicyPath()),
58
+ };
59
+ }
60
+ /** Parked requests only — the operator's decision queue. */
61
+ export function getPlacementPending(ledgerPath = placementLedgerPath()) {
62
+ return loadLedger(ledgerPath).pending;
63
+ }
64
+ /** Ranked options + victim previews for a requested model — the same
65
+ * computation the phase-2 proxy gate and phase-3 preview routes use. */
66
+ export function getPlacementPreview(projectDir, requestedModel, opts) {
67
+ const registry = opts?.registry ?? loadModelRegistry(projectDir).registry;
68
+ const ledger = loadLedger(opts?.ledgerPath ?? placementLedgerPath());
69
+ return computeOptions(registry, ledger, requestedModel, { cells: opts?.cells, taskKind: opts?.taskKind });
70
+ }
71
+ /** How long a parked request stays deduped in the OPERATOR-PROMPT sense: the
72
+ * ledger's pending entry. (The proxy's own in-memory burst map is much
73
+ * shorter — see the proxy's _PLACEMENT_BURST_DEDUPE_SECS — so a resolved
74
+ * placement forwards on the very next request; this window only bounds how
75
+ * long one operator prompt lives.) */
76
+ export const PLACEMENT_PENDING_TTL_MS = 120_000;
77
+ /** Does this resident serve the requested wire id? A resident serves it when
78
+ * the registry model it was loaded from advertises the id (or the model or
79
+ * config key matches — config keys are valid ids too). */
80
+ function residentServes(resident, modelId, registry) {
81
+ if (resident.model === modelId || resident.config === modelId)
82
+ return true;
83
+ return (registry.models[resident.model]?.advertises ?? []).includes(modelId);
84
+ }
85
+ /** Cold-start probe throttle: how often the admit path retries a device
86
+ * probe while the ledger has no device facts. The window bounds a
87
+ * permanently failing probe (missing driver, wedged nvidia-smi) to one
88
+ * subprocess spawn per window instead of one per admit. */
89
+ const COLD_PROBE_RETRY_MS = 10_000;
90
+ let coldProbeLastAt = 0;
91
+ /** Test seam: the throttle window is process state; tests reset it so
92
+ * they don't depend on each other's probe timing. */
93
+ export function resetColdProbeForTests() {
94
+ coldProbeLastAt = 0;
95
+ }
96
+ /** Model ids are opaque tokens, not prose. The registry's own ids never
97
+ * leave [A-Za-z0-9._-], and the client's model_id flows verbatim into
98
+ * operator-facing attention-queue text (title/detail) and from there into
99
+ * the session-start prompt — a hostile id must park as invalid_request
100
+ * BEFORE any queue write, so it can never become a durable, self-reasserting
101
+ * injection channel wearing the queue's trusted framing. */
102
+ const MODEL_ID_RE = /^[A-Za-z0-9._-]+$/;
103
+ /** Admission decision for one gated request (spec §4.3).
104
+
105
+ * Forward when a live resident already serves the requested id (reuse — no
106
+ * operator decision needed); otherwise park, with a reason computed from the
107
+ * registry (fail-closed doctrine: unmeasured/unknown refuse with a note) and
108
+ * a pending entry in the ledger for the dashboard to surface.
109
+ *
110
+ * Reads the ledger without the probe-heavy syncLedger refresh on purpose: the
111
+ * proxy holds a 2s timeout on this call, and the dashboard's placement-state
112
+ * poll keeps the ledger fresh. ONE bounded exception: a ledger with NO device
113
+ * facts (fresh boot, nothing ever synced) probes devices — nvidia-smi +
114
+ * MemAvailable, no unit or inflight probes, at most once per retry window —
115
+ * because "device not in ledger"
116
+ * would otherwise refuse every option and the first request after a boot
117
+ * could never auto-load. A resident that just died answers `forward` at
118
+ * worst — the request then hits a dead upstream and the proxy's existing
119
+ * upstream-unavailable machinery (529 + health wait) takes over, which is the
120
+ * same fail-open direction the proxy's own read-only path takes. */
121
+ export function getPlacementAdmit(projectDir, request, opts) {
122
+ if (!request.model_id || typeof request.model_id !== 'string' || !MODEL_ID_RE.test(request.model_id)) {
123
+ return { decision: 'park', reason: 'invalid_request' };
124
+ }
125
+ // Request-driven context need: the proxy's honest estimate, clamped to
126
+ // positive integers; anything off-shape degrades to the computeOptions
127
+ // default rather than being trusted (the proxy is a local process, but
128
+ // the ledger persists what it says, so it is validated anyway).
129
+ const cells = typeof request.cells === 'number' && Number.isInteger(request.cells) && request.cells > 0
130
+ ? request.cells
131
+ : undefined;
132
+ const loaded = opts?.loaded ?? loadModelRegistry(projectDir);
133
+ const registry = loaded.registry;
134
+ const ledgerPath = opts?.ledgerPath ?? placementLedgerPath();
135
+ // One read feeds the resident check, the auto option math, and the
136
+ // dedupe scan (the locked write below re-reads — it must see the
137
+ // authoritative state).
138
+ const ledger = loadLedger(ledgerPath);
139
+ // Cold-start device facts: the admit path deliberately skips the heavy
140
+ // syncLedger refresh (unit probes, inflight asks), but a ledger with NO
141
+ // device facts refuses every option as "device not in ledger" — the
142
+ // first request after a dashboard boot could never auto-load, no matter
143
+ // the cells. Probe devices once (nvidia-smi + MemAvailable) only when
144
+ // the ledger has none. A failing or empty probe keeps the fail-closed
145
+ // refusal and is retried at most once per COLD_PROBE_RETRY_MS window —
146
+ // the loopback admit endpoint must not become a subprocess-spawn
147
+ // amplifier on a machine where the probe can never succeed.
148
+ if (Object.keys(ledger.devices).length === 0) {
149
+ const now = Date.now();
150
+ if (now - coldProbeLastAt >= COLD_PROBE_RETRY_MS) {
151
+ coldProbeLastAt = now;
152
+ try {
153
+ const devices = (opts?.deviceProbe ?? probeDeviceStates)(registry);
154
+ withLedger(ledgerPath, (l) => {
155
+ l.devices = devices;
156
+ });
157
+ ledger.devices = devices;
158
+ }
159
+ catch (err) {
160
+ // No facts, no options — the park reason says not_resident. Log
161
+ // it: a permanently failing probe would otherwise fail silently
162
+ // on every first-request window.
163
+ console.warn(`[placement] cold-start device probe failed (retry in ${Math.round(COLD_PROBE_RETRY_MS / 1000)}s):`, err instanceof Error ? err.message : err);
164
+ }
165
+ }
166
+ }
167
+ // Forward on reuse: a live resident serves this id. Draining residents
168
+ // don't count — a swap is in flight.
169
+ const resident = ledger.residents.find((r) => r.state !== 'draining' && residentServes(r, request.model_id, registry));
170
+ if (resident) {
171
+ // Idle-sweep clock (§4.4.2): a gated request just used this model.
172
+ // Fail-soft by design — the touch only delays a future idle unload,
173
+ // it must never block or slow the forward the proxy is waiting on
174
+ // (2s admit timeout). Two layers keep that promise: the SHORT lock fuse
175
+ // (250ms) bounds a contention stall, and the catch turns a lost touch
176
+ // into a later unload — the conservative direction either way.
177
+ try {
178
+ withLedger(ledgerPath, (l) => {
179
+ l.usage[resident.model] = Date.now();
180
+ }, { lockTimeoutMs: 250 });
181
+ }
182
+ catch {
183
+ /* advisory clock only — see above */
184
+ }
185
+ return { decision: 'forward', target_id: residentTargetId(resident) };
186
+ }
187
+ // Park. The reason comes from the registry, never a guess: unknown model,
188
+ // known but unmeasured (fail closed), or known+measured but not loaded.
189
+ const modelEntry = registry.models[request.model_id] ??
190
+ Object.values(registry.models).find((m) => (m.advertises ?? []).includes(request.model_id));
191
+ let reason = 'not_resident';
192
+ if (!modelEntry) {
193
+ reason = 'unknown_model';
194
+ }
195
+ else if (!Object.values(modelEntry.configs).some(isPlaceable)) {
196
+ reason = 'no_measured_config';
197
+ }
198
+ // Auto-resolution (phase 4): a known, placeable model that is not
199
+ // resident can load ITSELF — alongside always (nothing evicted), by
200
+ // displacement only for operator-allowlisted models. The park reason
201
+ // becomes auto_loading; the client's retry is the protocol and forwards
202
+ // once the load completes. Unmeasured/unknown models never auto-load,
203
+ // and neither does a model in its failure cooldown or past the
204
+ // in-flight cap — autoOptionFor gates all of it so the reason never
205
+ // promises a run that will be refused.
206
+ let autoPlan = null;
207
+ if (reason === 'not_resident') {
208
+ const options = computeOptions(registry, ledger, request.model_id, { cells }).options;
209
+ autoPlan = autoOptionFor(options, opts?.auto?.policy ?? loadAutoPolicy(), request.model_id);
210
+ if (autoPlan)
211
+ reason = 'auto_loading';
212
+ }
213
+ // Dedupe on (requested_model, client): an unexpired pending entry reuses
214
+ // its id, so retries within the TTL do not multiply operator prompts or
215
+ // ledger writes. Checked again under the lock (the authoritative one).
216
+ // client/session are CLIENT-SUPPLIED identity strings — truncated
217
+ // before persisting so a flood cannot grow the ledger the dashboard
218
+ // rewrites on every admit (the full value never matters downstream).
219
+ const now = new Date();
220
+ const expiresAt = new Date(now.getTime() + PLACEMENT_PENDING_TTL_MS).toISOString();
221
+ const client = request.client ? request.client.slice(0, 128) : undefined;
222
+ const session = request.session ? request.session.slice(0, 128) : undefined;
223
+ const clientKey = client ?? '';
224
+ const matchesPending = (p) => p.requested_model === request.model_id && (p.client ?? '') === clientKey && p.expires_at > now.toISOString();
225
+ const existing = ledger.pending.find(matchesPending);
226
+ if (existing) {
227
+ // No re-scheduling on the dedupe path: the entry's auto run is either
228
+ // in flight (the run map dedupes by requested model) or already
229
+ // finished (its reason says so). A stale `auto_loading` entry whose
230
+ // run died with the process self-heals: it expires after the TTL and
231
+ // the next admit creates a fresh entry with a fresh run.
232
+ return { decision: 'park', placement_id: existing.id, reason: existing.reason ?? reason };
233
+ }
234
+ const pending = {
235
+ id: `plc-${randomBytes(3).toString('hex')}`,
236
+ requested_model: request.model_id,
237
+ client,
238
+ session,
239
+ created_at: now.toISOString(),
240
+ expires_at: expiresAt,
241
+ reason,
242
+ cells,
243
+ };
244
+ let placementId = pending.id;
245
+ let raceWinnerReason;
246
+ try {
247
+ withLedger(ledgerPath, (l) => {
248
+ // Prune expired entries while the authoritative ledger is held under
249
+ // the lock: admits deliberately skip the (heavier, probe-running)
250
+ // syncLedger refresh, so without this a parked-and-abandoned flood
251
+ // could grow the pending list until the next dashboard poll or
252
+ // `uap models` run.
253
+ l.pending = l.pending.filter((p) => p.expires_at > now.toISOString());
254
+ const again = l.pending.find(matchesPending);
255
+ if (again) {
256
+ placementId = again.id; // a concurrent admit won the write race
257
+ raceWinnerReason = again.reason;
258
+ return;
259
+ }
260
+ l.pending.push(pending);
261
+ });
262
+ }
263
+ catch {
264
+ // Ledger lock contention fails the WRITE, not the decision: the request
265
+ // still parks. The lock's most likely holder is the dashboard's own
266
+ // 2s state poll (syncLedger takes the same advisory lock), so before
267
+ // falling back to the unpersisted id, re-read for a concurrent admit
268
+ // that DID win the lock — its pending entry is the one `uap models
269
+ // pending` will show, so the client's 409 should carry THAT id.
270
+ const concurrent = loadLedger(ledgerPath).pending.find(matchesPending);
271
+ if (concurrent) {
272
+ return { decision: 'park', placement_id: concurrent.id, reason: concurrent.reason ?? reason };
273
+ }
274
+ // Nobody persisted this ask: answer with our id anyway (the operator
275
+ // sees the 409 in the client; the dashboard has no pending row for it
276
+ // yet) and say so. No auto scheduling: the entry is not persisted, so
277
+ // a resolved pending would have nothing to remove — and the reason
278
+ // must not promise a load that will never run.
279
+ return { decision: 'park', placement_id: placementId, reason: autoPlan ? 'not_resident' : reason };
280
+ }
281
+ if (autoPlan && placementId === pending.id) {
282
+ // Our entry won the race and auto-load applies: fire the background
283
+ // enforcement for exactly this placement id (a concurrent winner
284
+ // schedules its own). The client retries on the floor and forwards
285
+ // once the load lands.
286
+ scheduleAutoResolution(registry, request.model_id, autoPlan, placementId, {
287
+ ledgerPath,
288
+ // The run's step-0 re-derive must see the same context need the
289
+ // option was computed against, or a small-pool load refuses itself.
290
+ cells,
291
+ enforce: opts?.auto?.enforce,
292
+ });
293
+ return { decision: 'park', placement_id: placementId, reason };
294
+ }
295
+ if (raceWinnerReason !== undefined) {
296
+ // A concurrent admit won the write race: its entry (and its auto run,
297
+ // if any) is the real state — report ITS reason, not our locally
298
+ // computed one (which may promise a load the winner never scheduled).
299
+ return { decision: 'park', placement_id: placementId, reason: raceWinnerReason };
300
+ }
301
+ // P3 — the ask that lingers: our pending entry landed, nothing auto-loads
302
+ // it, and the only outcomes are the operator applying an option or the
303
+ // TTL expiring. That is exactly an attention item (ask instead of
304
+ // silently lingering). Best-effort by construction: enqueueAttention is
305
+ // fail-open end-to-end and UAP_ATTENTION_OFF disables the rail — the
306
+ // admit path's 2s budget must never feel this.
307
+ //
308
+ // The item's grace deadline is PINNED to the pending entry's expiry: a
309
+ // generic 300s grace would outlive the 120s TTL and advertise an
310
+ // actionable swap for a pending that is already dead — and a sweep
311
+ // adopting "let it expire" before the expiry would be a false record.
312
+ // `not_resident` is the only park reason with options to apply; the
313
+ // no-option reasons (unknown_model, no_measured_config) ask the
314
+ // operator to LOOK, not to decide — the detail says so plainly.
315
+ const actionable = reason === 'not_resident';
316
+ enqueueAttention(projectDir, {
317
+ kind: 'review-request',
318
+ title: `Placement parked: ${request.model_id}`,
319
+ detail: actionable
320
+ ? `A gated request wants '${request.model_id}' (reason: ${reason}, placement ${pending.id}). Approve a swap with: uap models apply ${pending.id} <n> — or do nothing.`
321
+ : `A gated request wants '${request.model_id}' (reason: ${reason}, placement ${pending.id}). No registered option serves it — nothing to approve; it expires on its own.`,
322
+ source: `placement:${pending.id}`,
323
+ expiresAt: pending.expires_at,
324
+ safeDefault: {
325
+ decision: 'allow the parked request to expire',
326
+ rationale: 'the placement TTL is the default: the client falls back cleanly and nothing is loaded or evicted',
327
+ },
328
+ });
329
+ return { decision: 'park', placement_id: placementId, reason };
330
+ }
331
+ //# sourceMappingURL=placement-routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"placement-routes.js","sourceRoot":"","sources":["../../src/dashboard/placement-routes.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/dashboard/server.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAyJH,MAAM,WAAW,sBAAsB;IACrC;8EAC0E;IAC1E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;uEACmE;IACnE,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;CAC9D;AAED,wBAAgB,oBAAoB,CAClC,OAAO,GAAE,sBAA2B,GACnC;IAAE,KAAK,EAAE,MAAM,IAAI,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CA+kB9C"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/dashboard/server.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAgKH,MAAM,WAAW,sBAAsB;IACrC;8EAC0E;IAC1E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;uEACmE;IACnE,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;CAC9D;AAED,wBAAgB,oBAAoB,CAClC,OAAO,GAAE,sBAA2B,GACnC;IAAE,KAAK,EAAE,MAAM,IAAI,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAy0B9C"}