@miller-tech/uap 2.21.3 → 2.36.4
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.
- package/README.md +22 -10
- package/config/model-profiles/qwen38-coder390.json +46 -0
- package/config/model-profiles/qwen38.json +3 -2
- package/config/model-registry.json +110 -0
- package/dist/.tsbuildinfo +1 -1
- package/dist/benchmarks/paired/types.d.ts +2 -2
- package/dist/bin/cli.js +315 -20
- package/dist/bin/cli.js.map +1 -1
- package/dist/cli/attention.d.ts +6 -0
- package/dist/cli/attention.d.ts.map +1 -0
- package/dist/cli/attention.js +115 -0
- package/dist/cli/attention.js.map +1 -0
- package/dist/cli/bench-report.d.ts +82 -0
- package/dist/cli/bench-report.d.ts.map +1 -0
- package/dist/cli/bench-report.js +237 -0
- package/dist/cli/bench-report.js.map +1 -0
- package/dist/cli/clients.d.ts +6 -0
- package/dist/cli/clients.d.ts.map +1 -0
- package/dist/cli/clients.js +142 -0
- package/dist/cli/clients.js.map +1 -0
- package/dist/cli/dashboard-grants.d.ts +26 -0
- package/dist/cli/dashboard-grants.d.ts.map +1 -0
- package/dist/cli/dashboard-grants.js +69 -0
- package/dist/cli/dashboard-grants.js.map +1 -0
- package/dist/cli/dashboard-pace.d.ts +31 -0
- package/dist/cli/dashboard-pace.d.ts.map +1 -0
- package/dist/cli/dashboard-pace.js +42 -0
- package/dist/cli/dashboard-pace.js.map +1 -0
- package/dist/cli/dashboard-session.d.ts +25 -0
- package/dist/cli/dashboard-session.d.ts.map +1 -0
- package/dist/cli/dashboard-session.js +814 -0
- package/dist/cli/dashboard-session.js.map +1 -0
- package/dist/cli/dashboard-types.d.ts +18 -0
- package/dist/cli/dashboard-types.d.ts.map +1 -0
- package/dist/cli/dashboard-types.js +9 -0
- package/dist/cli/dashboard-types.js.map +1 -0
- package/dist/cli/dashboard.d.ts +2 -18
- package/dist/cli/dashboard.d.ts.map +1 -1
- package/dist/cli/dashboard.js +43 -793
- package/dist/cli/dashboard.js.map +1 -1
- package/dist/cli/deliver.d.ts +35 -0
- package/dist/cli/deliver.d.ts.map +1 -1
- package/dist/cli/deliver.js +93 -9
- package/dist/cli/deliver.js.map +1 -1
- package/dist/cli/diff.d.ts +85 -0
- package/dist/cli/diff.d.ts.map +1 -0
- package/dist/cli/diff.js +293 -0
- package/dist/cli/diff.js.map +1 -0
- package/dist/cli/eta.d.ts +35 -0
- package/dist/cli/eta.d.ts.map +1 -0
- package/dist/cli/eta.js +101 -0
- package/dist/cli/eta.js.map +1 -0
- package/dist/cli/handsfree.d.ts +7 -0
- package/dist/cli/handsfree.d.ts.map +1 -1
- package/dist/cli/handsfree.js +27 -0
- package/dist/cli/handsfree.js.map +1 -1
- package/dist/cli/hooks.d.ts.map +1 -1
- package/dist/cli/hooks.js +126 -5
- package/dist/cli/hooks.js.map +1 -1
- package/dist/cli/loops.d.ts +24 -5
- package/dist/cli/loops.d.ts.map +1 -1
- package/dist/cli/loops.js +92 -12
- package/dist/cli/loops.js.map +1 -1
- package/dist/cli/models.d.ts +62 -0
- package/dist/cli/models.d.ts.map +1 -0
- package/dist/cli/models.js +567 -0
- package/dist/cli/models.js.map +1 -0
- package/dist/cli/plan.d.ts +9 -0
- package/dist/cli/plan.d.ts.map +1 -1
- package/dist/cli/plan.js +57 -4
- package/dist/cli/plan.js.map +1 -1
- package/dist/cli/proxy-relay.d.ts +55 -0
- package/dist/cli/proxy-relay.d.ts.map +1 -0
- package/dist/cli/proxy-relay.js +116 -0
- package/dist/cli/proxy-relay.js.map +1 -0
- package/dist/cli/proxy.d.ts +4 -0
- package/dist/cli/proxy.d.ts.map +1 -1
- package/dist/cli/proxy.js +26 -1
- package/dist/cli/proxy.js.map +1 -1
- package/dist/cli/sandbox.d.ts +101 -4
- package/dist/cli/sandbox.d.ts.map +1 -1
- package/dist/cli/sandbox.js +393 -44
- package/dist/cli/sandbox.js.map +1 -1
- package/dist/cli/self.d.ts +13 -0
- package/dist/cli/self.d.ts.map +1 -0
- package/dist/cli/self.js +94 -0
- package/dist/cli/self.js.map +1 -0
- package/dist/cli/systemd-services.d.ts +2 -8
- package/dist/cli/systemd-services.d.ts.map +1 -1
- package/dist/cli/systemd-services.js +5 -20
- package/dist/cli/systemd-services.js.map +1 -1
- package/dist/cli/task.js +1 -1
- package/dist/cli/task.js.map +1 -1
- package/dist/cli/wizard-config.d.ts.map +1 -1
- package/dist/cli/wizard-config.js +31 -2
- package/dist/cli/wizard-config.js.map +1 -1
- package/dist/config/settings-registry.d.ts +1 -1
- package/dist/config/settings-registry.d.ts.map +1 -1
- package/dist/config/settings-registry.js +108 -0
- package/dist/config/settings-registry.js.map +1 -1
- package/dist/coordination/capability-router.js +2 -2
- package/dist/coordination/capability-router.js.map +1 -1
- package/dist/coordination/database.d.ts +13 -0
- package/dist/coordination/database.d.ts.map +1 -1
- package/dist/coordination/database.js +63 -7
- package/dist/coordination/database.js.map +1 -1
- package/dist/coordination/eta-inject.d.ts +32 -0
- package/dist/coordination/eta-inject.d.ts.map +1 -0
- package/dist/coordination/eta-inject.js +64 -0
- package/dist/coordination/eta-inject.js.map +1 -0
- package/dist/coordination/reactor.d.ts.map +1 -1
- package/dist/coordination/reactor.js +14 -0
- package/dist/coordination/reactor.js.map +1 -1
- package/dist/coordination/service.d.ts +18 -8
- package/dist/coordination/service.d.ts.map +1 -1
- package/dist/coordination/service.js +38 -28
- package/dist/coordination/service.js.map +1 -1
- package/dist/dashboard/client-registry.d.ts +163 -0
- package/dist/dashboard/client-registry.d.ts.map +1 -0
- package/dist/dashboard/client-registry.js +549 -0
- package/dist/dashboard/client-registry.js.map +1 -0
- package/dist/dashboard/controls.d.ts.map +1 -1
- package/dist/dashboard/controls.js +33 -4
- package/dist/dashboard/controls.js.map +1 -1
- package/dist/dashboard/data-seeder.d.ts +10 -7
- package/dist/dashboard/data-seeder.d.ts.map +1 -1
- package/dist/dashboard/data-seeder.js +31 -75
- package/dist/dashboard/data-seeder.js.map +1 -1
- package/dist/dashboard/data-service.d.ts +9 -0
- package/dist/dashboard/data-service.d.ts.map +1 -1
- package/dist/dashboard/data-service.js +32 -3
- package/dist/dashboard/data-service.js.map +1 -1
- package/dist/dashboard/placement-routes.d.ts +119 -0
- package/dist/dashboard/placement-routes.d.ts.map +1 -0
- package/dist/dashboard/placement-routes.js +331 -0
- package/dist/dashboard/placement-routes.js.map +1 -0
- package/dist/dashboard/server.d.ts.map +1 -1
- package/dist/dashboard/server.js +408 -2
- package/dist/dashboard/server.js.map +1 -1
- package/dist/delivery/attention.d.ts +130 -0
- package/dist/delivery/attention.d.ts.map +1 -0
- package/dist/delivery/attention.js +341 -0
- package/dist/delivery/attention.js.map +1 -0
- package/dist/delivery/decompose.d.ts +18 -0
- package/dist/delivery/decompose.d.ts.map +1 -1
- package/dist/delivery/decompose.js +22 -1
- package/dist/delivery/decompose.js.map +1 -1
- package/dist/delivery/eta-estimate.d.ts +111 -0
- package/dist/delivery/eta-estimate.d.ts.map +1 -0
- package/dist/delivery/eta-estimate.js +171 -0
- package/dist/delivery/eta-estimate.js.map +1 -0
- package/dist/delivery/eta.d.ts +23 -0
- package/dist/delivery/eta.d.ts.map +1 -0
- package/dist/delivery/eta.js +59 -0
- package/dist/delivery/eta.js.map +1 -0
- package/dist/delivery/orchestrated-mission.d.ts +10 -0
- package/dist/delivery/orchestrated-mission.d.ts.map +1 -1
- package/dist/delivery/orchestrated-mission.js +15 -1
- package/dist/delivery/orchestrated-mission.js.map +1 -1
- package/dist/delivery/plan-check.d.ts +7 -1
- package/dist/delivery/plan-check.d.ts.map +1 -1
- package/dist/delivery/plan-check.js +23 -2
- package/dist/delivery/plan-check.js.map +1 -1
- package/dist/delivery/run-state.d.ts +1 -1
- package/dist/delivery/run-state.d.ts.map +1 -1
- package/dist/delivery/run-state.js +8 -1
- package/dist/delivery/run-state.js.map +1 -1
- package/dist/delivery/task-orchestrator.d.ts +8 -3
- package/dist/delivery/task-orchestrator.d.ts.map +1 -1
- package/dist/delivery/task-orchestrator.js +75 -43
- package/dist/delivery/task-orchestrator.js.map +1 -1
- package/dist/delivery/task-sync.d.ts +21 -0
- package/dist/delivery/task-sync.d.ts.map +1 -1
- package/dist/delivery/task-sync.js +44 -8
- package/dist/delivery/task-sync.js.map +1 -1
- package/dist/delivery/task-workspace.d.ts +3 -3
- package/dist/delivery/task-workspace.js +3 -3
- package/dist/generators/self-card.d.ts +65 -0
- package/dist/generators/self-card.d.ts.map +1 -0
- package/dist/generators/self-card.js +256 -0
- package/dist/generators/self-card.js.map +1 -0
- package/dist/inference/probe.js +1 -1
- package/dist/inference/probe.js.map +1 -1
- package/dist/memory/prepopulate.d.ts.map +1 -1
- package/dist/memory/prepopulate.js +2 -0
- package/dist/memory/prepopulate.js.map +1 -1
- package/dist/models/analytics.d.ts +32 -0
- package/dist/models/analytics.d.ts.map +1 -1
- package/dist/models/analytics.js +68 -5
- package/dist/models/analytics.js.map +1 -1
- package/dist/models/plan-readability.d.ts +55 -0
- package/dist/models/plan-readability.d.ts.map +1 -0
- package/dist/models/plan-readability.js +339 -0
- package/dist/models/plan-readability.js.map +1 -0
- package/dist/placement/admission.d.ts +59 -0
- package/dist/placement/admission.d.ts.map +1 -0
- package/dist/placement/admission.js +197 -0
- package/dist/placement/admission.js.map +1 -0
- package/dist/placement/auto.d.ts +44 -0
- package/dist/placement/auto.d.ts.map +1 -0
- package/dist/placement/auto.js +212 -0
- package/dist/placement/auto.js.map +1 -0
- package/dist/placement/enforce.d.ts +128 -0
- package/dist/placement/enforce.d.ts.map +1 -0
- package/dist/placement/enforce.js +655 -0
- package/dist/placement/enforce.js.map +1 -0
- package/dist/placement/idle.d.ts +50 -0
- package/dist/placement/idle.d.ts.map +1 -0
- package/dist/placement/idle.js +213 -0
- package/dist/placement/idle.js.map +1 -0
- package/dist/placement/ledger.d.ts +323 -0
- package/dist/placement/ledger.d.ts.map +1 -0
- package/dist/placement/ledger.js +263 -0
- package/dist/placement/ledger.js.map +1 -0
- package/dist/placement/preview.d.ts +51 -0
- package/dist/placement/preview.d.ts.map +1 -0
- package/dist/placement/preview.js +61 -0
- package/dist/placement/preview.js.map +1 -0
- package/dist/placement/probes.d.ts +47 -0
- package/dist/placement/probes.d.ts.map +1 -0
- package/dist/placement/probes.js +207 -0
- package/dist/placement/probes.js.map +1 -0
- package/dist/placement/proxy-env.d.ts +21 -0
- package/dist/placement/proxy-env.d.ts.map +1 -0
- package/dist/placement/proxy-env.js +42 -0
- package/dist/placement/proxy-env.js.map +1 -0
- package/dist/placement/registry.d.ts +1038 -0
- package/dist/placement/registry.d.ts.map +1 -0
- package/dist/placement/registry.js +274 -0
- package/dist/placement/registry.js.map +1 -0
- package/dist/policies/liveness.d.ts +6 -8
- package/dist/policies/liveness.d.ts.map +1 -1
- package/dist/policies/liveness.js +6 -25
- package/dist/policies/liveness.js.map +1 -1
- package/dist/policies/sandbox-anchor.d.ts +91 -0
- package/dist/policies/sandbox-anchor.d.ts.map +1 -0
- package/dist/policies/sandbox-anchor.js +187 -0
- package/dist/policies/sandbox-anchor.js.map +1 -0
- package/dist/policies/sandbox-grants.d.ts +131 -0
- package/dist/policies/sandbox-grants.d.ts.map +1 -0
- package/dist/policies/sandbox-grants.js +562 -0
- package/dist/policies/sandbox-grants.js.map +1 -0
- package/dist/state/manifest.d.ts +4 -2
- package/dist/state/manifest.d.ts.map +1 -1
- package/dist/state/manifest.js +32 -16
- package/dist/state/manifest.js.map +1 -1
- package/dist/utils/checkout-root.d.ts +2 -0
- package/dist/utils/checkout-root.d.ts.map +1 -0
- package/dist/utils/checkout-root.js +43 -0
- package/dist/utils/checkout-root.js.map +1 -0
- package/dist/utils/resolve-uap-bin.d.ts +5 -0
- package/dist/utils/resolve-uap-bin.d.ts.map +1 -0
- package/dist/utils/resolve-uap-bin.js +33 -0
- package/dist/utils/resolve-uap-bin.js.map +1 -0
- package/dist/utils/terminal-safe.d.ts +12 -0
- package/dist/utils/terminal-safe.d.ts.map +1 -0
- package/dist/utils/terminal-safe.js +53 -0
- package/dist/utils/terminal-safe.js.map +1 -0
- package/docs/ATTRIBUTION.md +1 -0
- package/docs/DASHBOARD_UPLIFT_SPEC.md +8 -8
- package/docs/INDEX.md +6 -5
- package/docs/architecture/OVERVIEW.md +15 -3
- package/docs/architecture/PROTOCOL.md +7 -1
- package/docs/architecture/adr/0006-operator-directed-model-placement.md +86 -0
- package/docs/architecture/adr/0007-auto-displacement-allowlist-as-standing-consent.md +79 -0
- package/docs/architecture/adr/0008-fleet-clients-link-out.md +92 -0
- package/docs/architecture/adr/0009-completion-triggered-dispatch-and-per-leaf-model-dials.md +71 -0
- package/docs/architecture/adr/0010-attention-queue-and-afk-auto-decider.md +159 -0
- package/docs/architecture/adr/0011-sandbox-grants-and-network-egress-boundary.md +219 -0
- package/docs/architecture/adr/0012-operator-legibility-surfaces.md +175 -0
- package/docs/getting-started/INSTALLATION.md +1 -1
- package/docs/guides/AUTOMATIC_FEATURES.md +8 -0
- package/docs/guides/LOCAL_MODELS.md +1 -1
- package/docs/guides/PROXY.md +2 -1
- package/docs/guides/SANDBOX.md +91 -4
- package/docs/integrations/MCP_ROUTER.md +1 -1
- package/docs/plans/model-performance-proof-options.md +176 -0
- package/docs/reference/API.md +1 -1
- package/docs/reference/CLI.md +169 -4
- package/docs/reference/COMPARISON.md +1 -1
- package/docs/reference/CONFIGURATION.md +12 -3
- package/docs/reference/CONFIGURATION_REFERENCE.md +269 -14
- package/docs/reference/DATABASE_SCHEMA.md +1 -1
- package/docs/reference/FEATURES.md +15 -3
- package/docs/reference/PATTERNS.md +1 -1
- package/docs/reference/PLATFORMS.md +14 -1
- package/docs/specs/operator-model-placement.md +1314 -0
- package/docs/specs/operator-model-placement.review.md +339 -0
- package/package.json +2 -2
- package/scripts/maintenance/publish-npm.sh +23 -11
- package/scripts/version-bump.sh +6 -51
- package/src/policies/enforcers/__pycache__/_common.cpython-311.pyc +0 -0
- package/src/policies/enforcers/__pycache__/expert_review_required.cpython-311.pyc +0 -0
- package/src/policies/enforcers/__pycache__/quality_metrics_gate.cpython-311.pyc +0 -0
- package/src/policies/schemas/policies/mandatory-testing-deployment.md +2 -5
- package/templates/hooks/__pycache__/deliver_autoroute.cpython-311.pyc +0 -0
- package/templates/hooks/session-start.sh +44 -0
- package/tools/agents/UAP/cli.py +14 -3
- package/tools/agents/UAP/paths.py +50 -0
- package/tools/agents/scripts/__pycache__/toolcall_path_normalizer.cpython-311.pyc +0 -0
- package/tools/agents/scripts/anthropic_proxy.py +1420 -100
- package/tools/agents/scripts/toolcall_path_normalizer.py +46 -1
- package/tools/agents/tests/test_anthropic_proxy_streaming.py +29 -6
- package/tools/agents/tests/test_doubling_break.py +64 -5
- package/tools/agents/tests/test_error_loop_break.py +10 -4
- package/tools/agents/tests/test_error_loop_ignores_correctives.py +13 -2
- package/tools/agents/tests/test_lockstep_escalation.py +280 -9
- package/tools/agents/tests/test_path_containment.py +94 -0
- package/tools/agents/tests/test_proxy_unix_socket.py +162 -0
- package/tools/agents/tests/test_signature_quality.py +400 -0
- package/tools/agents/tests/test_uap_compliance.py +11 -1
- package/web/dash/core.js +1 -0
- package/web/dash/tab-clients.js +196 -0
- package/web/dash/tab-models.js +387 -8
- package/web/dash/tab-policies.js +87 -4
- package/web/dash/tabs.js +77 -73
- package/web/dashboard.html +6 -0
- package/src/policies/enforcers/__pycache__/_common.cpython-312.pyc +0 -0
- package/src/policies/enforcers/__pycache__/expert_review_required.cpython-312.pyc +0 -0
- package/src/policies/enforcers/__pycache__/quality_metrics_gate.cpython-312.pyc +0 -0
- package/templates/hooks/__pycache__/deliver_autoroute.cpython-312.pyc +0 -0
- package/tools/agents/scripts/__pycache__/toolcall_path_normalizer.cpython-312.pyc +0 -0
- package/web/dash/tab-agents.js +0 -21
- package/web/dash/tab-deliver.js +0 -12
- package/web/dash/tab-memory.js +0 -12
- package/web/dash/tab-orchestration.js +0 -21
- package/web/dash/tab-overview.js +0 -21
- 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;
|
|
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"}
|