@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.
- 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 +1386 -99
- 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 +349 -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 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/placement/registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Model placement registry: repo defaults merged with machine-local
|
|
3
|
+
* measurements.
|
|
4
|
+
*
|
|
5
|
+
* Two files, deep-merged local-over-repo (ADR-0006, decision 1):
|
|
6
|
+
* - `config/model-registry.json` (repo): shape — models, configs, units,
|
|
7
|
+
* profiles, affinity, device kinds. Reviewable, machine-independent.
|
|
8
|
+
* - `~/.uap/model-registry.json` (local): measurements — device totals,
|
|
9
|
+
* `reserved_mib`, and each config's `resident_gpu_mib` / `host_rss_mib`.
|
|
10
|
+
* A footprint is a property of this hardware, not of the repo.
|
|
11
|
+
*
|
|
12
|
+
* Fail-closed doctrine (docs/specs/operator-model-placement.md §4.1): a config
|
|
13
|
+
* without a measurement is `unmeasured`. It may be served if already
|
|
14
|
+
* resident; it may never be loaded, and it never enters an eviction candidate
|
|
15
|
+
* set. Unknown cost is never guessed — guessing is how a 24 GiB card gets
|
|
16
|
+
* OOM-killed.
|
|
17
|
+
*/
|
|
18
|
+
import { existsSync, readFileSync } from 'fs';
|
|
19
|
+
import { homedir } from 'os';
|
|
20
|
+
import { join } from 'path';
|
|
21
|
+
import { z } from 'zod';
|
|
22
|
+
export const REGISTRY_VERSION = 1;
|
|
23
|
+
// ---------------------------------------------------------------------------
|
|
24
|
+
// Schemas
|
|
25
|
+
// ---------------------------------------------------------------------------
|
|
26
|
+
export const DeviceSchema = z.object({
|
|
27
|
+
kind: z.enum(['gpu', 'cpu']),
|
|
28
|
+
name: z.string().optional(),
|
|
29
|
+
total_mib: z.number().int().positive().optional(),
|
|
30
|
+
reserved_mib: z.number().int().nonnegative().optional(),
|
|
31
|
+
reserve_reason: z.string().optional(),
|
|
32
|
+
});
|
|
33
|
+
/** Valid systemd unit name (for the effects placement builds from it:
|
|
34
|
+
* systemctl argv, drop-in file paths, drop-in content). Charset excludes
|
|
35
|
+
* `/`, whitespace, and control characters (no path traversal, no line
|
|
36
|
+
* injection into drop-in files); a leading dot or any `..` run is refused.
|
|
37
|
+
* The registry comes from the repo's config/ — a cloned repo must not get
|
|
38
|
+
* to write outside ~/.config/systemd/user or inject `[Service]` sections. */
|
|
39
|
+
const UNIT_NAME_RE = /^[A-Za-z0-9_][A-Za-z0-9_.@-]*$/;
|
|
40
|
+
export function validUnitName(unit) {
|
|
41
|
+
return UNIT_NAME_RE.test(unit) && !unit.includes('..');
|
|
42
|
+
}
|
|
43
|
+
const UnitNameSchema = z.string().refine(validUnitName, {
|
|
44
|
+
message: 'invalid systemd unit name (charset [A-Za-z0-9_.@-], no leading dot, no ..)',
|
|
45
|
+
});
|
|
46
|
+
/** Identity fields a config carries regardless of measured state, so a
|
|
47
|
+
* `measure` write never drops the unit/profile/service it was found through. */
|
|
48
|
+
const configIdentity = {
|
|
49
|
+
engine: z.string().optional(),
|
|
50
|
+
unit: UnitNameSchema.optional(),
|
|
51
|
+
profile: z.string().optional(),
|
|
52
|
+
/** Capacity-policy service name this config is cross-checked against
|
|
53
|
+
* (overrides the model-level `service`). The policy's `services` is a
|
|
54
|
+
* LIST keyed by `name` — never assume a map. */
|
|
55
|
+
service: z.string().optional(),
|
|
56
|
+
note: z.string().optional(),
|
|
57
|
+
flags: z.array(z.string()).optional(),
|
|
58
|
+
rails: z.number().int().positive().optional(),
|
|
59
|
+
};
|
|
60
|
+
/** A measured footprint. `measured_at` is the discriminator in practice: it
|
|
61
|
+
* is present iff the config has a measurement. `measured_on` gates reuse —
|
|
62
|
+
* a footprint measured on one device class is not valid for another. */
|
|
63
|
+
export const MeasuredConfigSchema = z.object({
|
|
64
|
+
...configIdentity,
|
|
65
|
+
resident_gpu_mib: z.number().int().positive(),
|
|
66
|
+
host_rss_mib: z.number().int().positive(),
|
|
67
|
+
context_pool_cells: z.number().int().positive(),
|
|
68
|
+
per_session_cap_cells: z.number().int().positive().optional(),
|
|
69
|
+
kv_resident_cells: z.number().int().positive(),
|
|
70
|
+
kv_kind: z.string().optional(),
|
|
71
|
+
/** Marginal KV cost above the resident pool. Absent = unknown, and cost
|
|
72
|
+
* above the pool fails closed rather than extrapolating. */
|
|
73
|
+
kv_mib_per_1k_cells: z.number().positive().optional(),
|
|
74
|
+
measured_at: z.string(),
|
|
75
|
+
measured_on: z.string(),
|
|
76
|
+
});
|
|
77
|
+
export const UnmeasuredConfigSchema = z.object({
|
|
78
|
+
...configIdentity,
|
|
79
|
+
status: z.literal('unmeasured'),
|
|
80
|
+
});
|
|
81
|
+
export const ConfigEntrySchema = z.union([MeasuredConfigSchema, UnmeasuredConfigSchema]);
|
|
82
|
+
export const ModelEntrySchema = z.object({
|
|
83
|
+
display: z.string(),
|
|
84
|
+
engine: z.string().optional(),
|
|
85
|
+
unit: UnitNameSchema.optional(),
|
|
86
|
+
service: z.string().optional(),
|
|
87
|
+
launch: z.string().optional(),
|
|
88
|
+
endpoint: z.string().optional(),
|
|
89
|
+
task_affinity: z.array(z.string()).optional(),
|
|
90
|
+
affinity: z.object({ device: z.array(z.string()) }).optional(),
|
|
91
|
+
advertises: z.array(z.string()).optional(),
|
|
92
|
+
configs: z.record(z.string(), ConfigEntrySchema),
|
|
93
|
+
});
|
|
94
|
+
export const ModelRegistrySchema = z.object({
|
|
95
|
+
version: z.literal(REGISTRY_VERSION),
|
|
96
|
+
devices: z.record(z.string(), DeviceSchema),
|
|
97
|
+
models: z.record(z.string(), ModelEntrySchema),
|
|
98
|
+
});
|
|
99
|
+
/** The machine-local file is an overlay, not a full document: it may carry
|
|
100
|
+
* only models (or only devices). `measure` writes exactly this shape. */
|
|
101
|
+
export const RegistryOverlaySchema = z.object({
|
|
102
|
+
version: z.literal(REGISTRY_VERSION),
|
|
103
|
+
devices: z.record(z.string(), DeviceSchema).optional(),
|
|
104
|
+
models: z.record(z.string(), ModelEntrySchema).optional(),
|
|
105
|
+
});
|
|
106
|
+
// ---------------------------------------------------------------------------
|
|
107
|
+
// Type guards and cost math
|
|
108
|
+
// ---------------------------------------------------------------------------
|
|
109
|
+
export function isMeasuredConfig(cfg) {
|
|
110
|
+
return 'measured_at' in cfg && 'resident_gpu_mib' in cfg;
|
|
111
|
+
}
|
|
112
|
+
/** A config is placeable only with a measurement. This is the fail-closed
|
|
113
|
+
* gate: `unmeasured` never becomes a load or eviction candidate. */
|
|
114
|
+
export function isPlaceable(cfg) {
|
|
115
|
+
return isMeasuredConfig(cfg);
|
|
116
|
+
}
|
|
117
|
+
/** Admission cost (MiB) of serving `cells` context on a measured config:
|
|
118
|
+
* whole-config resident figure, plus marginal KV beyond the pool the config
|
|
119
|
+
* already paid for at startup. Returns null when the answer is unknown —
|
|
120
|
+
* `cells` beyond the resident pool with no `kv_mib_per_1k_cells`. Null is
|
|
121
|
+
* "refuse", never "free". */
|
|
122
|
+
export function configCostMiB(cfg, cells) {
|
|
123
|
+
const overPool = Math.max(0, cells - cfg.kv_resident_cells);
|
|
124
|
+
if (overPool === 0)
|
|
125
|
+
return cfg.resident_gpu_mib;
|
|
126
|
+
if (cfg.kv_mib_per_1k_cells === undefined)
|
|
127
|
+
return null;
|
|
128
|
+
return cfg.resident_gpu_mib + (overPool / 1000) * cfg.kv_mib_per_1k_cells;
|
|
129
|
+
}
|
|
130
|
+
export function repoRegistryPath(projectDir) {
|
|
131
|
+
return join(projectDir, 'config', 'model-registry.json');
|
|
132
|
+
}
|
|
133
|
+
export function localRegistryPath() {
|
|
134
|
+
return process.env.UAP_MODEL_REGISTRY_LOCAL ?? join(homedir(), '.uap', 'model-registry.json');
|
|
135
|
+
}
|
|
136
|
+
function parseRegistryFile(path, schema, errors) {
|
|
137
|
+
if (!existsSync(path))
|
|
138
|
+
return null;
|
|
139
|
+
let raw;
|
|
140
|
+
try {
|
|
141
|
+
raw = readFileSync(path, 'utf-8');
|
|
142
|
+
}
|
|
143
|
+
catch (err) {
|
|
144
|
+
errors.push(`${path}: unreadable (${err.message})`);
|
|
145
|
+
return null;
|
|
146
|
+
}
|
|
147
|
+
let doc;
|
|
148
|
+
try {
|
|
149
|
+
doc = JSON.parse(raw);
|
|
150
|
+
}
|
|
151
|
+
catch (err) {
|
|
152
|
+
errors.push(`${path}: unparseable JSON (${err.message})`);
|
|
153
|
+
return null;
|
|
154
|
+
}
|
|
155
|
+
const parsed = schema.safeParse(doc);
|
|
156
|
+
if (!parsed.success) {
|
|
157
|
+
errors.push(`${path}: invalid registry: ${parsed.error.issues.map((i) => `${i.path.join('.')}: ${i.message}`).join('; ')}`);
|
|
158
|
+
return null;
|
|
159
|
+
}
|
|
160
|
+
return parsed.data;
|
|
161
|
+
}
|
|
162
|
+
/** Deep-merge local over repo. Devices merge field-by-field; models merge
|
|
163
|
+
* per key; configs merge per key with local winning wholesale (a measured
|
|
164
|
+
* local entry replaces an unmeasured repo entry). */
|
|
165
|
+
function mergeRegistries(repo, local) {
|
|
166
|
+
const devices = { ...repo.devices };
|
|
167
|
+
for (const [key, dev] of Object.entries(local.devices)) {
|
|
168
|
+
devices[key] = { ...devices[key], ...dev };
|
|
169
|
+
}
|
|
170
|
+
const models = { ...repo.models };
|
|
171
|
+
for (const [key, model] of Object.entries(local.models)) {
|
|
172
|
+
const base = models[key];
|
|
173
|
+
if (!base) {
|
|
174
|
+
models[key] = model;
|
|
175
|
+
continue;
|
|
176
|
+
}
|
|
177
|
+
models[key] = { ...base, ...model, configs: { ...base.configs, ...model.configs } };
|
|
178
|
+
}
|
|
179
|
+
return { version: REGISTRY_VERSION, devices, models };
|
|
180
|
+
}
|
|
181
|
+
export function loadModelRegistry(projectDir, opts) {
|
|
182
|
+
const errors = [];
|
|
183
|
+
const repoPath = opts?.repoPath ?? repoRegistryPath(projectDir);
|
|
184
|
+
const localPath = opts?.localPath ?? localRegistryPath();
|
|
185
|
+
const repo = parseRegistryFile(repoPath, ModelRegistrySchema, errors);
|
|
186
|
+
const local = parseRegistryFile(localPath, RegistryOverlaySchema, errors);
|
|
187
|
+
if (!repo) {
|
|
188
|
+
return { registry: { version: REGISTRY_VERSION, devices: {}, models: {} }, repoPath, localPath, measuredFrom: new Map(), errors };
|
|
189
|
+
}
|
|
190
|
+
const merged = local
|
|
191
|
+
? mergeRegistries(repo, { version: REGISTRY_VERSION, devices: local.devices ?? {}, models: local.models ?? {} })
|
|
192
|
+
: repo;
|
|
193
|
+
const measuredFrom = new Map();
|
|
194
|
+
for (const [mKey, model] of Object.entries(merged.models)) {
|
|
195
|
+
for (const [cKey, cfg] of Object.entries(model.configs)) {
|
|
196
|
+
if (!isMeasuredConfig(cfg))
|
|
197
|
+
continue;
|
|
198
|
+
const inLocal = local?.models?.[mKey]?.configs[cKey];
|
|
199
|
+
measuredFrom.set(`${mKey}/${cKey}`, inLocal && isMeasuredConfig(inLocal) ? 'local' : 'repo');
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
return { registry: merged, repoPath, localPath, measuredFrom, errors };
|
|
203
|
+
}
|
|
204
|
+
/** The capacity policy service a model/config is cross-checked against
|
|
205
|
+
* (config-level overrides model-level). */
|
|
206
|
+
export function crossCheckService(model, cfg) {
|
|
207
|
+
return isMeasuredConfig(cfg) ? cfg.service ?? model.service : cfg.service ?? model.service;
|
|
208
|
+
}
|
|
209
|
+
/** Cross-check the registry against the capacity policy and its own internal
|
|
210
|
+
* consistency. One source of truth per number: a registry entry that
|
|
211
|
+
* contradicts the policy it should agree with is an error, not a warning. */
|
|
212
|
+
export function validateRegistry(registry, policy) {
|
|
213
|
+
const findings = [];
|
|
214
|
+
const serviceByName = new Map(policy.services.map((s) => [s.name, s]));
|
|
215
|
+
const deviceKeys = new Set(Object.keys(registry.devices));
|
|
216
|
+
for (const [mKey, model] of Object.entries(registry.models)) {
|
|
217
|
+
const scope = (cfg) => `${mKey}/${cfg}`;
|
|
218
|
+
for (const device of model.affinity?.device ?? []) {
|
|
219
|
+
if (!deviceKeys.has(device)) {
|
|
220
|
+
findings.push({ severity: 'error', scope: `model:${mKey}`, message: `affinity device '${device}' is not declared in devices` });
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
for (const [cKey, cfg] of Object.entries(model.configs)) {
|
|
224
|
+
if (isMeasuredConfig(cfg)) {
|
|
225
|
+
if (!deviceKeys.has(cfg.measured_on)) {
|
|
226
|
+
findings.push({ severity: 'error', scope: scope(cKey), message: `measured_on device '${cfg.measured_on}' is not declared in devices` });
|
|
227
|
+
}
|
|
228
|
+
else if (registry.devices[cfg.measured_on]?.kind !== 'gpu') {
|
|
229
|
+
findings.push({ severity: 'error', scope: scope(cKey), message: `measured_on device '${cfg.measured_on}' is not a gpu` });
|
|
230
|
+
}
|
|
231
|
+
if (cfg.kv_resident_cells > cfg.context_pool_cells) {
|
|
232
|
+
findings.push({ severity: 'error', scope: scope(cKey), message: `kv_resident_cells ${cfg.kv_resident_cells} exceeds context_pool_cells ${cfg.context_pool_cells}` });
|
|
233
|
+
}
|
|
234
|
+
if (cfg.per_session_cap_cells !== undefined && cfg.per_session_cap_cells > cfg.context_pool_cells) {
|
|
235
|
+
findings.push({ severity: 'error', scope: scope(cKey), message: `per_session_cap_cells ${cfg.per_session_cap_cells} exceeds context_pool_cells ${cfg.context_pool_cells}` });
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
const svcName = crossCheckService(model, cfg);
|
|
239
|
+
const svc = svcName ? serviceByName.get(svcName) : undefined;
|
|
240
|
+
if (svcName && !svc) {
|
|
241
|
+
findings.push({ severity: 'error', scope: scope(cKey), message: `declares service '${svcName}' but capacity policy has no service by that name` });
|
|
242
|
+
continue;
|
|
243
|
+
}
|
|
244
|
+
if (!svc) {
|
|
245
|
+
if (isMeasuredConfig(cfg)) {
|
|
246
|
+
findings.push({ severity: 'warning', scope: scope(cKey), message: 'measured but no capacity-policy service to cross-check against' });
|
|
247
|
+
}
|
|
248
|
+
continue;
|
|
249
|
+
}
|
|
250
|
+
if (svc.http?.metricsMustMatch && isMeasuredConfig(cfg)) {
|
|
251
|
+
const want = svc.http.metricsMustMatch;
|
|
252
|
+
if ('max_context' in want && want.max_context !== cfg.context_pool_cells) {
|
|
253
|
+
findings.push({ severity: 'error', scope: scope(cKey), message: `context_pool_cells ${cfg.context_pool_cells} contradicts policy metricsMustMatch max_context=${want.max_context}` });
|
|
254
|
+
}
|
|
255
|
+
if ('kv' in want && want.kv !== cfg.kv_kind) {
|
|
256
|
+
findings.push({ severity: 'error', scope: scope(cKey), message: `kv_kind '${cfg.kv_kind}' contradicts policy metricsMustMatch kv='${want.kv}'` });
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
else if (svc.http?.metricsMustMatch && !isMeasuredConfig(cfg)) {
|
|
260
|
+
findings.push({ severity: 'warning', scope: scope(cKey), message: 'cannot cross-check metricsMustMatch: config is unmeasured' });
|
|
261
|
+
}
|
|
262
|
+
if (svc.systemd && model.unit && svc.systemd.unit !== model.unit) {
|
|
263
|
+
findings.push({ severity: 'warning', scope: scope(cKey), message: `unit '${model.unit}' differs from policy service systemd unit '${svc.systemd.unit}'` });
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
for (const [dKey, dev] of Object.entries(registry.devices)) {
|
|
268
|
+
if (dev.total_mib !== undefined && dev.reserved_mib !== undefined && dev.reserved_mib > dev.total_mib) {
|
|
269
|
+
findings.push({ severity: 'error', scope: `device:${dKey}`, message: `reserved_mib ${dev.reserved_mib} exceeds total_mib ${dev.total_mib}` });
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
return findings;
|
|
273
|
+
}
|
|
274
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/placement/registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -62,15 +62,13 @@ export interface LivenessCache {
|
|
|
62
62
|
policies: Record<string, Omit<PolicyLivenessResult, 'name'>>;
|
|
63
63
|
}
|
|
64
64
|
/**
|
|
65
|
-
* The MAIN checkout root for a session cwd.
|
|
66
|
-
*
|
|
67
|
-
*
|
|
68
|
-
*
|
|
69
|
-
* gate never looks (review should-fix, 2026-07-13). policies.db lives ONLY
|
|
70
|
-
* in the main checkout (the hook's own header documents this), so the DB
|
|
71
|
-
* read must anchor too. Non-git roots (unit fixtures) pass through unchanged.
|
|
65
|
+
* The MAIN checkout root for a session cwd. Moved to
|
|
66
|
+
* src/utils/checkout-root.ts (memoized there) so the attention queue can
|
|
67
|
+
* anchor the same way without importing the policies layer; imported and
|
|
68
|
+
* re-exported here for existing callers.
|
|
72
69
|
*/
|
|
73
|
-
|
|
70
|
+
import { mainCheckoutRoot } from '../utils/checkout-root.js';
|
|
71
|
+
export { mainCheckoutRoot };
|
|
74
72
|
/**
|
|
75
73
|
* Whether a failed path requirement sits on a surface the AGENT could have
|
|
76
74
|
* broken. Inside the repo → agent-writable (it could have deleted or chmod'd
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"liveness.d.ts","sourceRoot":"","sources":["../../src/policies/liveness.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAgBH,MAAM,WAAW,kBAAkB;IACjC,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,qGAAqG;IACrG,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,gEAAgE;IAChE,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB;4EACwE;IACxE,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED;;;;GAIG;AACH,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAO9D,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG,UAAU,GAAG,gBAAgB,CAAC;AAE/D,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,SAAS,GAAG,KAAK,GAAG,OAAO,CAAC;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,kBAAkB,CAAC;IAC5B,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,oFAAoF;IACpF,UAAU,EAAE,OAAO,CAAC;IACpB,QAAQ,EAAE,kBAAkB,EAAE,CAAC;CAChC;AAED,MAAM,WAAW,aAAa;IAC5B,qEAAqE;IACrE,OAAO,EAAE,CAAC,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB;;;wEAGoE;IACpE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,oBAAoB,EAAE,MAAM,CAAC,CAAC,CAAC;CAC9D;AAID
|
|
1
|
+
{"version":3,"file":"liveness.d.ts","sourceRoot":"","sources":["../../src/policies/liveness.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAgBH,MAAM,WAAW,kBAAkB;IACjC,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,qGAAqG;IACrG,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,gEAAgE;IAChE,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB;4EACwE;IACxE,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED;;;;GAIG;AACH,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAO9D,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG,UAAU,GAAG,gBAAgB,CAAC;AAE/D,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,SAAS,GAAG,KAAK,GAAG,OAAO,CAAC;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,kBAAkB,CAAC;IAC5B,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,oFAAoF;IACpF,UAAU,EAAE,OAAO,CAAC;IACpB,QAAQ,EAAE,kBAAkB,EAAE,CAAC;CAChC;AAED,MAAM,WAAW,aAAa;IAC5B,qEAAqE;IACrE,OAAO,EAAE,CAAC,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB;;;wEAGoE;IACpE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,oBAAoB,EAAE,MAAM,CAAC,CAAC,CAAC;CAC9D;AAID;;;;;GAKG;AACH,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,CAAC;AA0B5B;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,kBAAkB,CAKvF;AAED,6EAA6E;AAC7E,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,oBAAoB,GAAG,IAAI,CAgDlG;AAED,2DAA2D;AAC3D,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,oBAAoB,EAAE,CAO9F;AAED,iFAAiF;AACjF,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB,EAAE,GAAG,MAAM,CAe/F;AAED,2EAA2E;AAC3E,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAS3E;AAED,+EAA+E;AAC/E,wBAAsB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAqB/E;AAED;;;;;GAKG;AACH,wBAAsB,gBAAgB,CAAC,IAAI,EAAE;IAC3C,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,OAAO,CAAC;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAwC9C"}
|
|
@@ -38,32 +38,13 @@ export const POLICY_LIVENESS = {
|
|
|
38
38
|
};
|
|
39
39
|
const CACHE_REL = join('.uap', 'policy-liveness.json');
|
|
40
40
|
/**
|
|
41
|
-
* The MAIN checkout root for a session cwd.
|
|
42
|
-
*
|
|
43
|
-
*
|
|
44
|
-
*
|
|
45
|
-
* gate never looks (review should-fix, 2026-07-13). policies.db lives ONLY
|
|
46
|
-
* in the main checkout (the hook's own header documents this), so the DB
|
|
47
|
-
* read must anchor too. Non-git roots (unit fixtures) pass through unchanged.
|
|
41
|
+
* The MAIN checkout root for a session cwd. Moved to
|
|
42
|
+
* src/utils/checkout-root.ts (memoized there) so the attention queue can
|
|
43
|
+
* anchor the same way without importing the policies layer; imported and
|
|
44
|
+
* re-exported here for existing callers.
|
|
48
45
|
*/
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
const r = spawnSync('git', ['rev-parse', '--show-toplevel'], {
|
|
52
|
-
cwd: projectRoot,
|
|
53
|
-
encoding: 'utf-8',
|
|
54
|
-
});
|
|
55
|
-
if (r.status !== 0)
|
|
56
|
-
return projectRoot;
|
|
57
|
-
const top = (r.stdout ?? '').trim();
|
|
58
|
-
if (!top)
|
|
59
|
-
return projectRoot;
|
|
60
|
-
const i = top.indexOf(`${sep}.worktrees${sep}`);
|
|
61
|
-
return i === -1 ? top : top.slice(0, i);
|
|
62
|
-
}
|
|
63
|
-
catch {
|
|
64
|
-
return projectRoot;
|
|
65
|
-
}
|
|
66
|
-
}
|
|
46
|
+
import { mainCheckoutRoot } from '../utils/checkout-root.js';
|
|
47
|
+
export { mainCheckoutRoot };
|
|
67
48
|
/** Directories skills are resolved from, repo first then user-level. */
|
|
68
49
|
function skillDirs(projectRoot) {
|
|
69
50
|
return [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"liveness.js","sourceRoot":"","sources":["../../src/policies/liveness.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EACL,UAAU,EACV,SAAS,EACT,UAAU,EACV,SAAS,EACT,WAAW,EACX,YAAY,EACZ,MAAM,EACN,aAAa,GACd,MAAM,IAAI,CAAC;AACZ,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC;AActD;;;;GAIG;AACH,MAAM,CAAC,MAAM,eAAe,GAAuC;IACjE,uEAAuE;IACvE,4EAA4E;IAC5E,0EAA0E;IAC1E,sBAAsB,EAAE,EAAE,QAAQ,EAAE,CAAC,KAAK,CAAC,EAAE;IAC7C,kEAAkE;IAClE,mBAAmB,EAAE,EAAE,QAAQ,EAAE,CAAC,KAAK,CAAC,EAAE;CAC3C,CAAC;AA+BF,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC;AAEvD
|
|
1
|
+
{"version":3,"file":"liveness.js","sourceRoot":"","sources":["../../src/policies/liveness.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The sandbox-consent trust anchor (ADR 0011's named operator-surface follow-up).
|
|
3
|
+
*
|
|
4
|
+
* The grant ledger and audit trail live under the MAIN checkout root —
|
|
5
|
+
* writable by the operator side of every run. The kernel ro-bind closes the
|
|
6
|
+
* *sandboxed* side, and the load path re-validates shape, but neither
|
|
7
|
+
* can prove WHO wrote a row: a process with the checkout's write reach can
|
|
8
|
+
* plant a well-formed grant and claim the operator consented.
|
|
9
|
+
*
|
|
10
|
+
* This module is the honest increment: **tamper-evidence, not tamper-proofing**.
|
|
11
|
+
* A 0600 anchor file OUTSIDE the checkout's write reach records the hash of
|
|
12
|
+
* the sanitized ledger as of the last recorded consent operation. On load,
|
|
13
|
+
* the on-disk ledger is re-hashed and compared: a match proves the ledger is
|
|
14
|
+
* exactly the state a recorded grant/renew/revoke produced; a mismatch means
|
|
15
|
+
* something with checkout write access altered it — which fails CLOSED (no
|
|
16
|
+
* extra holes, loud warning) at the sandbox launch and refuses new grants.
|
|
17
|
+
*
|
|
18
|
+
* What this does NOT do (kept explicit, not hidden): the anchor lives in the
|
|
19
|
+
* user's state dir, so a *same-user* process outside the checkout can still
|
|
20
|
+
* write it. The boundary it draws is exactly the ADR's frame — the
|
|
21
|
+
* checkout's write reach vs. outside it. True origin proof (a different uid
|
|
22
|
+
* or a hardware key) remains open and is not claimed.
|
|
23
|
+
*/
|
|
24
|
+
import type { SandboxGrant } from './sandbox-grants.js';
|
|
25
|
+
/** Anchor file version — future shape changes bump this and re-anchor. */
|
|
26
|
+
export declare const ANCHOR_VERSION = 1;
|
|
27
|
+
export interface AnchorState {
|
|
28
|
+
v: number;
|
|
29
|
+
/** sha256 of the sanitized ledger array as of the last recorded mutation. */
|
|
30
|
+
ledgerHead: string;
|
|
31
|
+
/** Monotonic count of recorded ledger mutations (context for the operator). */
|
|
32
|
+
mutations: number;
|
|
33
|
+
/** High-water of audit seqs this anchor has WITNESSED: seq continuity then
|
|
34
|
+
* survives not just compaction but audit-file DELETION — a trail whose
|
|
35
|
+
* numbering can restart from 0 is a forgeable trail. A duplicate seq is
|
|
36
|
+
* evidence to investigate, not proof of planting on its own: concurrent
|
|
37
|
+
* appends can mint the same next-seq before either lands (a documented
|
|
38
|
+
* pre-existing race; serializing audit writes is open on purpose).
|
|
39
|
+
* Additive optional v1 field: anchors written before it existed simply
|
|
40
|
+
* lack it, and pre-field anchors stay valid. */
|
|
41
|
+
seqHi?: number;
|
|
42
|
+
updatedAt: string;
|
|
43
|
+
updatedBy: string;
|
|
44
|
+
}
|
|
45
|
+
/** The anchor dir: OUTSIDE the checkout's write reach by construction. */
|
|
46
|
+
export declare function anchorDir(): string;
|
|
47
|
+
/** One anchor per MAIN-checkout root (keyed by its hash, never its literal
|
|
48
|
+
* path — the path can contain spaces/usernames that must not reach a
|
|
49
|
+
* filename). Keying by `mainCheckoutRoot` — NOT the raw argument — is the
|
|
50
|
+
* whole point: every surface passes a cwd (often a `.worktrees/NNN-*`
|
|
51
|
+
* subdir), and the LEDGER already resolves through the same helper, so
|
|
52
|
+
* keying the anchor by the raw cwd would give the shared ledger one anchor
|
|
53
|
+
* per cwd string: worktree sessions would silently run UNANCHORED, and a
|
|
54
|
+
* grant recorded from one cwd would look tampered from another. All three
|
|
55
|
+
* P-debt reviewers caught this independently; the fix is to key exactly
|
|
56
|
+
* the way the ledger does. */
|
|
57
|
+
export declare function anchorPath(projectRoot: string): string;
|
|
58
|
+
/** True when a granted writable path would cover the anchor dir — the one
|
|
59
|
+
* grant that must be refused, because a hole over the anchor lets the
|
|
60
|
+
* sandboxed side delete or corrupt the tamper evidence itself. */
|
|
61
|
+
export declare function pathCoversAnchorDir(grantPath: string): boolean;
|
|
62
|
+
/** The tamper-evidence hash of a ledger state: over the SANITIZED rows (the
|
|
63
|
+
* same shape the load path enforces), in stored order. */
|
|
64
|
+
export declare function ledgerHeadOf(grants: SandboxGrant[]): string;
|
|
65
|
+
/** Read the anchor; null when absent or malformed (absent = unanchored).
|
|
66
|
+
* The metadata fields are termSafe'd here — they are interpolated into the
|
|
67
|
+
* mismatch banners on the dashboard/CLI/launch stderr, and whoever can
|
|
68
|
+
* write the anchor can plant control bytes in them. */
|
|
69
|
+
export declare function readAnchor(projectRoot: string): AnchorState | null;
|
|
70
|
+
/** Write the anchor atomically with tight permissions (0600, 0700 dirs).
|
|
71
|
+
* Best-effort: a failure is reported by return value, never a throw — the
|
|
72
|
+
* ledger itself stays the operative record; without an anchor there is
|
|
73
|
+
* simply nothing to verify against yet. `seqHi` is the audit high-water the
|
|
74
|
+
* caller witnessed AFTER the operation's audit line landed (the recorded
|
|
75
|
+
* mutations run audit-then-anchor for exactly this reason). */
|
|
76
|
+
export declare function writeAnchor(projectRoot: string, ledgerHead: string, mutations: number, seqHi: number): boolean;
|
|
77
|
+
export type LedgerIntegrity = 'ok' | 'unanchored' | 'mismatch';
|
|
78
|
+
export interface Verification {
|
|
79
|
+
state: LedgerIntegrity;
|
|
80
|
+
/** Operator-facing explanation, set for every non-ok state. */
|
|
81
|
+
detail: string;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Verify the on-disk ledger against the anchor. 'unanchored' is not a
|
|
85
|
+
* failure — it is the pre-bootstrap state (existing ledgers predate the
|
|
86
|
+
* anchor; the first recorded mutation anchors them). 'mismatch' is the
|
|
87
|
+
* tamper signal: something changed the ledger outside a recorded consent
|
|
88
|
+
* operation.
|
|
89
|
+
*/
|
|
90
|
+
export declare function verifyLedger(projectRoot: string, onDiskHead: string): Verification;
|
|
91
|
+
//# sourceMappingURL=sandbox-anchor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sandbox-anchor.d.ts","sourceRoot":"","sources":["../../src/policies/sandbox-anchor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AASH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExD,0EAA0E;AAC1E,eAAO,MAAM,cAAc,IAAI,CAAC;AAEhC,MAAM,WAAW,WAAW;IAC1B,CAAC,EAAE,MAAM,CAAC;IACV,6EAA6E;IAC7E,UAAU,EAAE,MAAM,CAAC;IACnB,+EAA+E;IAC/E,SAAS,EAAE,MAAM,CAAC;IAClB;;;;;;;qDAOiD;IACjD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,0EAA0E;AAC1E,wBAAgB,SAAS,IAAI,MAAM,CASlC;AA4BD;;;;;;;;;+BAS+B;AAC/B,wBAAgB,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAGtD;AAED;;mEAEmE;AACnE,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAG9D;AAED;2DAC2D;AAC3D,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,CAE3D;AAED;;;wDAGwD;AACxD,wBAAgB,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAqBlE;AAED;;;;;gEAKgE;AAChE,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAgC9G;AAED,MAAM,MAAM,eAAe,GAAG,IAAI,GAAG,YAAY,GAAG,UAAU,CAAC;AAE/D,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,eAAe,CAAC;IACvB,+DAA+D;IAC/D,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,YAAY,CAalF"}
|