@nimbus-dev/client
Advanced tools
@@ -204,3 +204,3 @@ import type { AgentName, CatchupBrief, ConflictBrief, ExpertBrief, GhostBrief, HuddleBrief, ImpactBrief, JanitorBrief, NimbusItem, PreflightBrief, WhyBrief, WhyPeek } from "@nimbus-dev/sdk"; | ||
| * | ||
| * **Breaking change in 1.0.0:** the scalar `tier: "authorized-actions"` field is | ||
| * **Breaking change in 0.16.0:** the scalar `tier: "authorized-actions"` field is | ||
| * gone, replaced by the per-class `coverage` vector plus `indeterminate`. | ||
@@ -207,0 +207,0 @@ * |
+1
-1
| { | ||
| "name": "@nimbus-dev/client", | ||
| "version": "0.17.2", | ||
| "version": "0.17.3", | ||
| "license": "MIT", | ||
@@ -5,0 +5,0 @@ "private": false, |
+24
-5
@@ -58,3 +58,3 @@ # @nimbus-dev/client | ||
| | Connectors | `connectorListStatus`, `connectorStatus`, `connectorHealthHistory`, `connectorPause`, `connectorResume`, `connectorSetInterval`, `connectorSetConfig`, `connectorSync`, `connectorAuth`, `connectorAddMcp`, `connectorRemove`, `connectorReindex` | | ||
| | Workflows | `workflowList`, `workflowSave`, `workflowDelete`, `workflowListRuns`, `workflowRun` | | ||
| | Workflows | `workflowList`, `workflowSave`, `workflowDelete`, `workflowListRuns`, `workflowRun`, `workflowCancel` | | ||
| | Metrics & deploy | `metricsDora`, `deployPreflight` | | ||
@@ -66,3 +66,4 @@ | Consent | `consentRespond` | | ||
| (`WorkflowRunStreamHandle`), `subscribeHitl` (`HitlRequest`), | ||
| `subscribeConnectorConfigChanged` (`ConnectorConfigChanged`), and `cancelStream`. | ||
| `subscribeConnectorConfigChanged` (`ConnectorConfigChanged`), | ||
| `subscribeAgentBrief` (`AgentBriefEvent`), and `cancelStream`. | ||
@@ -95,6 +96,24 @@ ### Validated responses | ||
| const { rows } = await client.egressList({ limit: 100 }); // recent rows | ||
| const verify = await client.egressVerify(); // offline chain verify | ||
| const proof = await client.egressProveWindow({ since: Date.now() - 3_600_000 }); | ||
| // Trust `completeness` only when the whole-ledger verify passed: | ||
| // proof.verify.ok && proof.completeness.outboundEgressEvents === 0 → nothing left the machine | ||
| // A zero is only a claim when THREE things hold: the whole-ledger verify passed, the | ||
| // window is not indeterminate, and the class you are asking about was actually being | ||
| // observed. `indeterminate` means no boot marker covers the window — nothing is known | ||
| // to have been observing, so a bare zero says nothing at all; `validate.ts` defaults | ||
| // it to `true` when the field is absent, for that reason. There is a standalone | ||
| // `egressVerify()` too, but `egressProveWindow` already carries the same whole-ledger | ||
| // verify as `proof.verify`, so asking twice proves nothing extra. | ||
| const { coverage, outboundEgressEvents, indeterminate } = proof.completeness; | ||
| const sound = proof.verify.ok && !indeterminate && outboundEgressEvents === 0; | ||
| const observed = (cls: EgressCoverageClass) => coverage[cls] !== "none"; | ||
| // Scoped claim: nothing left the machine over HTTP. A class sitting at `"none"` was | ||
| // never observed by the binary that wrote this window, so the zero makes no claim | ||
| // about it — which is why the coverage check is per-class rather than a formality. | ||
| // See `EGRESS_COVERAGE_CLASSES` and `NO_EGRESS_COVERAGE`. | ||
| const noHttpEgress = sound && observed("http"); | ||
| // Unqualified "nothing left this machine" is the much stronger claim, and it needs | ||
| // EVERY class observed — not just the one you happened to ask about. | ||
| const provablyLocal = sound && EGRESS_COVERAGE_CLASSES.every(observed); | ||
| ``` | ||
@@ -101,0 +120,0 @@ |
467409
0.26%136
16.24%