@skrr-ai/cli 0.1.128 → 0.1.130
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/dist/base-command.d.ts +12 -0
- package/dist/base-command.js +65 -0
- package/dist/commands/agenda/trigger/create.js +9 -1
- package/dist/commands/agenda/trigger/list.d.ts +2 -1
- package/dist/commands/agenda/trigger/list.js +55 -6
- package/dist/commands/agents/create.js +3 -1
- package/dist/commands/agents/reflect.d.ts +6 -0
- package/dist/commands/agents/reflect.js +45 -6
- package/dist/commands/agents/schedule-overview.d.ts +17 -0
- package/dist/commands/agents/schedule-overview.js +33 -9
- package/dist/commands/agents/triggers/policy.js +3 -1
- package/dist/commands/browser/persistent-profile.d.ts +22 -0
- package/dist/commands/browser/persistent-profile.js +46 -0
- package/dist/commands/commitments/create.js +3 -1
- package/dist/commands/commitments/effective-policy.js +6 -0
- package/dist/commands/commitments/explain.js +10 -1
- package/dist/commands/commitments/plan.d.ts +14 -0
- package/dist/commands/commitments/plan.js +32 -0
- package/dist/commands/commitments/preflight.d.ts +1 -1
- package/dist/commands/commitments/preflight.js +12 -4
- package/dist/commands/commitments/show.d.ts +9 -0
- package/dist/commands/commitments/show.js +14 -1
- package/dist/commands/compass/revisions.d.ts +6 -2
- package/dist/commands/compass/revisions.js +13 -5
- package/dist/commands/compass/tactic.d.ts +5 -0
- package/dist/commands/compass/tactic.js +14 -0
- package/dist/commands/followups/plans/create.js +1 -1
- package/dist/commands/harnesses/list.js +1 -1
- package/dist/commands/northstars/create.js +6 -1
- package/dist/commands/northstars/governance/configure.js +1 -1
- package/dist/commands/northstars/intents/decide.js +2 -3
- package/dist/commands/northstars/list.js +1 -1
- package/dist/commands/northstars/review-now.js +5 -0
- package/dist/commands/northstars/reviews.js +15 -3
- package/dist/commands/northstars/show.js +1 -1
- package/dist/commands/spaces/auto-executor/runs.d.ts +9 -1
- package/dist/commands/spaces/auto-executor/runs.js +18 -1
- package/dist/commands/spaces/heartbeats/create.js +7 -5
- package/dist/commands/spaces/heartbeats/status.js +10 -0
- package/dist/commands/spaces/heartbeats/update.js +5 -3
- package/dist/commands/store/artifacts/releases.d.ts +20 -0
- package/dist/commands/store/artifacts/releases.js +85 -0
- package/dist/commands/store/library.d.ts +14 -0
- package/dist/commands/store/library.js +71 -0
- package/dist/commands/tasks/archive.js +6 -0
- package/dist/commands/tasks/list.d.ts +48 -0
- package/dist/commands/tasks/list.js +141 -9
- package/dist/commands/tasks/pause-schedule.js +1 -1
- package/dist/commands/tasks/remind.js +23 -11
- package/dist/commands/tasks/resume-schedule.js +4 -1
- package/dist/commands/tasks/retry-schedule.js +6 -3
- package/dist/commands/tasks/schedule.js +35 -8
- package/dist/commands/tasks/self-schedule.d.ts +56 -0
- package/dist/commands/tasks/self-schedule.js +179 -21
- package/dist/commands/tasks/show.js +4 -0
- package/dist/lib/agent-trigger-listing.d.ts +26 -0
- package/dist/lib/agent-trigger-listing.js +63 -0
- package/dist/lib/agentic-stream.js +138 -41
- package/dist/lib/commitment-ledgers.js +3 -1
- package/dist/lib/commitments.d.ts +24 -0
- package/dist/lib/commitments.js +64 -4
- package/dist/lib/compasses.d.ts +2 -0
- package/dist/lib/iso-instant.d.ts +52 -0
- package/dist/lib/iso-instant.js +162 -0
- package/dist/lib/northstars.d.ts +87 -4
- package/dist/lib/northstars.js +226 -94
- package/dist/lib/proposals.js +6 -2
- package/dist/lib/reflection.d.ts +58 -0
- package/dist/lib/reflection.js +115 -6
- package/dist/lib/store-artifact-releases.d.ts +39 -0
- package/dist/lib/store-artifact-releases.js +12 -0
- package/dist/lib/store-library.d.ts +37 -0
- package/dist/lib/store-library.js +12 -0
- package/dist/lib/task-calendar.d.ts +19 -0
- package/dist/lib/task-calendar.js +72 -0
- package/dist/lib/task-operations.js +2 -0
- package/dist/lib/task-recurrence-outcome.js +3 -1
- package/dist/lib/task-recurrence-summary.d.ts +15 -0
- package/dist/lib/task-recurrence-summary.js +228 -0
- package/dist/lib/task-reminder.d.ts +28 -0
- package/dist/lib/task-reminder.js +50 -0
- package/dist/lib/task-schedule-notes.d.ts +46 -0
- package/dist/lib/task-schedule-notes.js +71 -0
- package/dist/lib/triggers.d.ts +31 -2
- package/dist/lib/triggers.js +38 -18
- package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/daemonWire.js +11 -1
- package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/deviceIdentityBridge.d.ts +9 -0
- package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/deviceIdentityBridge.js +22 -0
- package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/executorStopReceipt.d.ts +123 -0
- package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/executorStopReceipt.js +160 -0
- package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/index.d.ts +2 -1
- package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/index.js +19 -0
- package/dist/node_modules/@skrr-ai/auth-core/dist/esm/daemonWire.js +11 -1
- package/dist/node_modules/@skrr-ai/auth-core/dist/esm/deviceIdentityBridge.d.ts +9 -0
- package/dist/node_modules/@skrr-ai/auth-core/dist/esm/deviceIdentityBridge.js +28 -0
- package/dist/node_modules/@skrr-ai/auth-core/dist/esm/executorStopReceipt.d.ts +123 -0
- package/dist/node_modules/@skrr-ai/auth-core/dist/esm/executorStopReceipt.js +173 -0
- package/dist/node_modules/@skrr-ai/auth-core/dist/esm/index.d.ts +2 -1
- package/dist/node_modules/@skrr-ai/auth-core/dist/esm/index.js +3 -1
- package/dist/node_modules/@skrr-ai/auth-core/package.json +1 -1
- package/dist/node_modules/@skrr-ai/data-provider/index.js +6772 -6675
- package/oclif.manifest.json +282 -40
- package/package.json +1 -1
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* executorStopReceipt.ts — a daemon-signed proof that a scheduled session stopped.
|
|
3
|
+
*
|
|
4
|
+
* OSK-20777, Gate 1 (docs/architecture/scheduled-publication-custody-enrollment-2026-11-01.md).
|
|
5
|
+
* Today the executor's terminal proof is the daemon reporting about itself over its own socket: the
|
|
6
|
+
* dispatch tuple is checked for consistency but nothing is signed, nothing covers descendant
|
|
7
|
+
* processes, and nothing says what was erased. A receipt is that report, signed with the device key
|
|
8
|
+
* the server already pins on the daemon's row, so a settlement that depends on it depends on the
|
|
9
|
+
* machine and not on whoever reached the socket.
|
|
10
|
+
*
|
|
11
|
+
* No new cryptography. A receipt is a DPoP-shaped device proof (`deviceKey.ts`) under its OWN header
|
|
12
|
+
* `typ`, so the two can never stand in for each other: a request proof fails here with `bad_typ`, and a
|
|
13
|
+
* receipt fails the request verifier the same way. The proof's `ath` commits to the SHA-256 of the
|
|
14
|
+
* canonical receipt body, its `htu` names the dispatch, and the pin decides which key may sign it.
|
|
15
|
+
*
|
|
16
|
+
* Verification is deliberately strict and returns a reason, never a boolean:
|
|
17
|
+
* - a pin is REQUIRED (a receipt with no key to compare against has no authority);
|
|
18
|
+
* - the algorithm admitted is the algorithm of the pin, never a list, so a receipt cannot choose a
|
|
19
|
+
* weaker algorithm than the device enrolled with;
|
|
20
|
+
* - the body is a closed shape with bounded fields;
|
|
21
|
+
* - every field the caller expects (the dispatch the server issued) must match exactly;
|
|
22
|
+
* - a descendant that survived is `not_quiescent`, not a valid receipt with a footnote;
|
|
23
|
+
* - erasure is claimed only for the one scope the owner allowed, `session_temp`.
|
|
24
|
+
*
|
|
25
|
+
* Freshness is the caller's decision (`maxAgeSeconds`). A receipt can legitimately arrive hours after it
|
|
26
|
+
* was signed, replayed from the daemon's response WAL after a reconnect, so it has no short window of its
|
|
27
|
+
* own. Replay protection is the dispatch binding: the server accepts one receipt per `dispatchId`.
|
|
28
|
+
*/
|
|
29
|
+
import { algForJwk, isDevicePublicJwk, jwkThumbprint, signProofWith, tokenHash, verifyDevicePublicKeyProof, } from './deviceKey.js';
|
|
30
|
+
/** Header `typ` of an executor stop receipt. Distinct from `DEVICE_PROOF_TYP` on purpose. */
|
|
31
|
+
export const EXECUTOR_STOP_RECEIPT_TYP = 'skrr-executor-stop-receipt+jwt';
|
|
32
|
+
/** What the daemon may claim to have erased. One scope, decided by the owner (2026-11-01). */
|
|
33
|
+
export const EXECUTOR_STOP_RECEIPT_ERASURE_SCOPES = ['session_temp'];
|
|
34
|
+
/** Default ceiling on a receipt's age, for a caller that does not decide: one day. */
|
|
35
|
+
export const EXECUTOR_STOP_RECEIPT_DEFAULT_MAX_AGE_SECONDS = 24 * 60 * 60;
|
|
36
|
+
const MAX_ID_LENGTH = 160;
|
|
37
|
+
const BODY_KEYS = [
|
|
38
|
+
'version',
|
|
39
|
+
'daemonId',
|
|
40
|
+
'sourceId',
|
|
41
|
+
'sessionId',
|
|
42
|
+
'requestId',
|
|
43
|
+
'dispatchId',
|
|
44
|
+
'status',
|
|
45
|
+
'stoppedAt',
|
|
46
|
+
'descendants',
|
|
47
|
+
'erasure',
|
|
48
|
+
];
|
|
49
|
+
const BINDING_KEYS = ['daemonId', 'sourceId', 'sessionId', 'requestId', 'dispatchId'];
|
|
50
|
+
const isPlainObject = (value) => value !== null && typeof value === 'object' && !Array.isArray(value);
|
|
51
|
+
const hasExactKeys = (value, keys) => Object.keys(value).length === keys.length && keys.every((key) => Object.hasOwn(value, key));
|
|
52
|
+
const isId = (value) => typeof value === 'string' && value.length > 0 && value.length <= MAX_ID_LENGTH;
|
|
53
|
+
const isCount = (value) => typeof value === 'number' && Number.isSafeInteger(value) && value >= 0;
|
|
54
|
+
/**
|
|
55
|
+
* Stable JSON: object keys sorted at every level, no whitespace. The signer and the verifier must
|
|
56
|
+
* produce the same bytes from the same body, whatever order a transport reordered its keys into.
|
|
57
|
+
*/
|
|
58
|
+
export function canonicalReceiptJson(value) {
|
|
59
|
+
if (value === null || typeof value !== 'object')
|
|
60
|
+
return JSON.stringify(value);
|
|
61
|
+
if (Array.isArray(value))
|
|
62
|
+
return `[${value.map(canonicalReceiptJson).join(',')}]`;
|
|
63
|
+
const record = value;
|
|
64
|
+
return `{${Object.keys(record)
|
|
65
|
+
.sort()
|
|
66
|
+
.map((key) => `${JSON.stringify(key)}:${canonicalReceiptJson(record[key])}`)
|
|
67
|
+
.join(',')}}`;
|
|
68
|
+
}
|
|
69
|
+
/** The URI a receipt's proof names. Reserved `.invalid` host: it can never be a real request target. */
|
|
70
|
+
export function executorStopReceiptHtu(dispatchId) {
|
|
71
|
+
return `https://executor-stop-receipt.skrr.invalid/v1/${encodeURIComponent(dispatchId)}`;
|
|
72
|
+
}
|
|
73
|
+
/** Shape check only. Returns the body as typed, or null when it is not exactly a v1 receipt body. */
|
|
74
|
+
export function parseExecutorStopReceiptBody(value) {
|
|
75
|
+
if (!isPlainObject(value) || !hasExactKeys(value, BODY_KEYS) || value.version !== 1)
|
|
76
|
+
return null;
|
|
77
|
+
if (!BINDING_KEYS.every((key) => isId(value[key])))
|
|
78
|
+
return null;
|
|
79
|
+
if (value.status !== 'completed' && value.status !== 'failed' && value.status !== 'cancelled')
|
|
80
|
+
return null;
|
|
81
|
+
if (typeof value.stoppedAt !== 'string' || Number.isNaN(Date.parse(value.stoppedAt)))
|
|
82
|
+
return null;
|
|
83
|
+
const d = value.descendants;
|
|
84
|
+
if (!isPlainObject(d) || !hasExactKeys(d, ['observed', 'stopped', 'survivors']))
|
|
85
|
+
return null;
|
|
86
|
+
if (!isCount(d.observed) || !isCount(d.stopped) || !isCount(d.survivors))
|
|
87
|
+
return null;
|
|
88
|
+
if (d.observed !== d.stopped + d.survivors)
|
|
89
|
+
return null;
|
|
90
|
+
const e = value.erasure;
|
|
91
|
+
if (!isPlainObject(e))
|
|
92
|
+
return null;
|
|
93
|
+
if (e.performed === false) {
|
|
94
|
+
if (!hasExactKeys(e, ['performed']))
|
|
95
|
+
return null;
|
|
96
|
+
}
|
|
97
|
+
else if (e.performed === true) {
|
|
98
|
+
if (!hasExactKeys(e, ['performed', 'scope', 'artifacts', 'bytes']))
|
|
99
|
+
return null;
|
|
100
|
+
if (!EXECUTOR_STOP_RECEIPT_ERASURE_SCOPES.includes(e.scope))
|
|
101
|
+
return null;
|
|
102
|
+
if (!isCount(e.artifacts) || !isCount(e.bytes))
|
|
103
|
+
return null;
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
return null;
|
|
107
|
+
}
|
|
108
|
+
return value;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Sign a receipt with any `DeviceKeySigner` (a software key, or a hardware handle). Throws on a body
|
|
112
|
+
* that is not exactly a v1 receipt body, so a daemon bug cannot produce a signed receipt the server
|
|
113
|
+
* would only reject later.
|
|
114
|
+
*/
|
|
115
|
+
export async function signExecutorStopReceipt(signer, body, options = {}) {
|
|
116
|
+
const parsed = parseExecutorStopReceiptBody(body);
|
|
117
|
+
if (!parsed)
|
|
118
|
+
throw new Error('signExecutorStopReceipt: body is not a v1 executor stop receipt body');
|
|
119
|
+
const proof = await signProofWith(signer, {
|
|
120
|
+
method: 'POST',
|
|
121
|
+
url: executorStopReceiptHtu(parsed.dispatchId),
|
|
122
|
+
// `accessToken` is hashed inline into the `ath` claim: the commitment to the body.
|
|
123
|
+
accessToken: canonicalReceiptJson(parsed),
|
|
124
|
+
...(options.iat !== undefined ? { iat: options.iat } : {}),
|
|
125
|
+
...(options.jti !== undefined ? { jti: options.jti } : {}),
|
|
126
|
+
}, EXECUTOR_STOP_RECEIPT_TYP);
|
|
127
|
+
return { body: parsed, proof };
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Verify a receipt against the pinned key. Order matters: shape, then signature and pin, then the
|
|
131
|
+
* binding to the dispatch, then what the body claims. A forged receipt is reported as the forgery it
|
|
132
|
+
* is (`sig_invalid`, `pin_mismatch`, `ath_mismatch`), not as a quiescence failure.
|
|
133
|
+
*/
|
|
134
|
+
export function verifyExecutorStopReceipt(receipt, options) {
|
|
135
|
+
if (!isPlainObject(receipt) || !hasExactKeys(receipt, ['body', 'proof'])) {
|
|
136
|
+
return { valid: false, reason: 'bad_receipt' };
|
|
137
|
+
}
|
|
138
|
+
const body = parseExecutorStopReceiptBody(receipt.body);
|
|
139
|
+
if (!body || typeof receipt.proof !== 'string')
|
|
140
|
+
return { valid: false, reason: 'bad_receipt' };
|
|
141
|
+
const pin = options.pinnedPublicJwk;
|
|
142
|
+
if (!pin || !isDevicePublicJwk(pin))
|
|
143
|
+
return { valid: false, reason: 'no_pin' };
|
|
144
|
+
const result = verifyDevicePublicKeyProof(receipt.proof, {
|
|
145
|
+
expectedHtm: 'POST',
|
|
146
|
+
expectedHtu: executorStopReceiptHtu(body.dispatchId),
|
|
147
|
+
expectedAth: tokenHash(canonicalReceiptJson(body)),
|
|
148
|
+
pinnedPublicJwk: pin,
|
|
149
|
+
// The algorithm of the PIN, never a list: a receipt cannot pick a weaker one.
|
|
150
|
+
allowedAlgs: [algForJwk(pin)],
|
|
151
|
+
maxAgeSeconds: options.maxAgeSeconds ?? EXECUTOR_STOP_RECEIPT_DEFAULT_MAX_AGE_SECONDS,
|
|
152
|
+
...(options.clockSkewSeconds !== undefined
|
|
153
|
+
? { clockSkewSeconds: options.clockSkewSeconds }
|
|
154
|
+
: {}),
|
|
155
|
+
...(options.now !== undefined ? { now: options.now } : {}),
|
|
156
|
+
}, EXECUTOR_STOP_RECEIPT_TYP);
|
|
157
|
+
if (!result.valid)
|
|
158
|
+
return { valid: false, reason: result.reason };
|
|
159
|
+
for (const key of BINDING_KEYS) {
|
|
160
|
+
const want = options.expected?.[key];
|
|
161
|
+
if (want !== undefined && body[key] !== want)
|
|
162
|
+
return { valid: false, reason: 'binding_mismatch' };
|
|
163
|
+
}
|
|
164
|
+
if (body.descendants.survivors > 0)
|
|
165
|
+
return { valid: false, reason: 'not_quiescent' };
|
|
166
|
+
return {
|
|
167
|
+
valid: true,
|
|
168
|
+
body,
|
|
169
|
+
alg: result.alg,
|
|
170
|
+
thumbprint: jwkThumbprint(result.publicJwk),
|
|
171
|
+
signedAtSeconds: result.claims.iat,
|
|
172
|
+
};
|
|
173
|
+
}
|
|
@@ -28,12 +28,13 @@ export { buildCredentialAad, decrypt as credEnvelopeDecrypt, deserialize as cred
|
|
|
28
28
|
export { __setKekStrategyForTest, getKekStrategy, InMemoryKek, UnavailableKek, KekUnavailableError, classifyDaemonKeychainService, isMasterKekKeychainService, isSessionKeychainService, isUserOwnedSecretKeychainService, LinuxKek, MacosKek, MASTER_KEK_KEYCHAIN_ACCOUNT, MASTER_KEK_KEYCHAIN_SERVICE, registerZeroizeHook, WindowsKek, zeroizeKekCaches, type DaemonKeychainServiceClass, type KekStrategy, } from './kek/index.js';
|
|
29
29
|
export { ALLOW_LIVE_STATE_ENV, __setAccountHomeForTest, DAEMON_BYOK_KEYCHAIN_SERVICE_BASE, DAEMON_KEYCHAIN_SERVICE_BASE, HERMETIC_HOME_ENV, LEGACY_DAEMON_KEYCHAIN_SERVICE, LIVE_DEFAULT_PROFILE, LIVE_STATE_REFUSED_CODE, LiveStateRefusedError, accountHomeDir, assertMayMutateLiveKeychain, assertMayMutateLiveState, isLiveKeychainService, isLiveStateRefusal, isTestProcess, keychainSuffixForDir, liveKeychainServices, liveStateRoot, refusesLiveKeychainMutation, refusesLiveStateInTest, rethrowIfLiveStateRefusal, testProcessSignal, type LiveKeychainProbe, type LiveStateProbe, } from './liveState.js';
|
|
30
30
|
export { algForJwk, buildProof as buildDeviceProof, DEVICE_KEY_ALGS, generateDeviceKeyPair, isDevicePublicJwk, jwkThumbprint, normalizeHtu, p256PublicJwkFromRaw, proofSigningInput, publicJwkFromX, signProofWith, tokenHash, verifyProof as verifyDeviceProof, type DeviceKeyAlg, type DeviceKeyPair, type DeviceKeySigner, type DevicePublicJwk, type DeviceProofClaims, type DeviceProofHeader, type Ed25519PrivateJwk, type Ed25519PublicJwk, type P256PublicJwk, type VerifyFailureReason as DeviceProofVerifyFailureReason, type VerifyFailure as DeviceProofVerifyFailure, type VerifyOptions as DeviceProofVerifyOptions, type VerifySuccess as DeviceProofVerifySuccess, } from './deviceKey.js';
|
|
31
|
+
export { canonicalReceiptJson, EXECUTOR_STOP_RECEIPT_DEFAULT_MAX_AGE_SECONDS, EXECUTOR_STOP_RECEIPT_ERASURE_SCOPES, EXECUTOR_STOP_RECEIPT_TYP, executorStopReceiptHtu, parseExecutorStopReceiptBody, signExecutorStopReceipt, verifyExecutorStopReceipt, type ExecutorStopReceipt, type ExecutorStopReceiptBody, type ExecutorStopReceiptErasureScope, type ExecutorStopReceiptFailureReason, type ExecutorStopReceiptStatus, type SignExecutorStopReceiptOptions, type VerifyExecutorStopReceiptOptions, type VerifyExecutorStopReceiptResult, } from './executorStopReceipt.js';
|
|
31
32
|
export { softwareEd25519Handle, type DeviceKeyCustody, type DeviceKeyHandle } from './deviceKeyHandle.js';
|
|
32
33
|
export { AUTH_SERVER_METADATA_PATH, readServerDeviceKeyAlgs, SERVER_DEVICE_KEY_ALGS_FIELD, } from './deviceKeyServerSupport.js';
|
|
33
34
|
export { configureHardwareDeviceKeyHelper, HARDWARE_KEY_HELPER_NAME, HardwareDeviceKeyError, probeHardwareDeviceKey, resolveHardwareDeviceKeyHelper, type HardwareDeviceKeyErrorCode, type HardwareKeyCapability, } from './deviceKeyHardware.js';
|
|
34
35
|
export { DPOP_HEADER, DPOP_MAX_AGE_SECONDS, DPOP_PROOF_INVALID, DPOP_PROOF_REQUIRED, DPOP_PROOF_TYP, DPOP_PROOF_VERIFY_UNAVAILABLE, accessTokenHash, createDpopKey, isAth, isJwkThumbprint, normalizeDpopHtu, verifyDpopProof, type DpopKey, type DpopProofClaims, type DpopProofRequest, type DpopVerifyFailureReason, type DpopVerifyOptions, type DpopVerifyResult, } from './dpop.js';
|
|
35
36
|
export { initCredEnvelope, initExistingCredEnvelope, initNewIndependentCredEnvelope, resetCredEnvelope, shutdownCredEnvelope, isCredEnvelopeActive, hasCredEnvelopePathConflict, describeCredEnvelopeState, splitKeyConvergencePolicy, maybeEncryptForWrite, maybeDecryptOnRead, DEFAULT_UNREADABLE_CREDENTIAL_HINT, type DecryptOnReadOptions, __wrappedDekFilePathForTest, __setStateForTest as __setCredEnvelopeStateForTest, __getStateForTest as __getCredEnvelopeStateForTest, __resetShutdownGuardForTest, type ReadTransformResult, } from './credentialEnvelopeBridge.js';
|
|
36
|
-
export { initDeviceIdentity, resetDeviceIdentity, signServerRequest, prepareHardwareKeyCandidate, commitDeviceKeyCandidate, signWithCandidate, persistPendingHardwareKey, commitPendingHardwareKey, discardPendingHardwareKey, PENDING_HARDWARE_KEY_MAX_AGE_MS, type DeviceKeyCandidate, type DeviceKeyCandidateResult, type PendingHardwareKeyOutcome, enrollWithServer, clearEnrollmentMarker, isDeviceIdentityActive, getDevicePublicKey, describeDeviceIdentityState, describeDeviceKeySplit, describeStoredDeviceKey, DEVICE_KEY_UNREADABLE_CREDENTIAL_HINT, type StoredDeviceKeyDescription, __publicKeyPathForTest, __privateKeyPathForTest, __enrollmentMarkerPathForTest, __enrollmentBackoffPathForTest, __setUnreadableReloadIntervalForTest, __setStateForTest as __setDeviceIdentityStateForTest, __getStateForTest as __getDeviceIdentityStateForTest, type EnrollmentResult, } from './deviceIdentityBridge.js';
|
|
37
|
+
export { initDeviceIdentity, resetDeviceIdentity, signServerRequest, signExecutorStopReceiptWithDeviceKey, prepareHardwareKeyCandidate, commitDeviceKeyCandidate, signWithCandidate, persistPendingHardwareKey, commitPendingHardwareKey, discardPendingHardwareKey, PENDING_HARDWARE_KEY_MAX_AGE_MS, type DeviceKeyCandidate, type DeviceKeyCandidateResult, type PendingHardwareKeyOutcome, enrollWithServer, clearEnrollmentMarker, isDeviceIdentityActive, getDevicePublicKey, describeDeviceIdentityState, describeDeviceKeySplit, describeStoredDeviceKey, DEVICE_KEY_UNREADABLE_CREDENTIAL_HINT, type StoredDeviceKeyDescription, __publicKeyPathForTest, __privateKeyPathForTest, __enrollmentMarkerPathForTest, __enrollmentBackoffPathForTest, __setUnreadableReloadIntervalForTest, __setStateForTest as __setDeviceIdentityStateForTest, __getStateForTest as __getDeviceIdentityStateForTest, type EnrollmentResult, } from './deviceIdentityBridge.js';
|
|
37
38
|
export { getMachineUuid, getMachineUuidForProfile, describeMachineIdentity, type MachineIdentityDescription, type MachineIdentityReason, getHardwareMachineUuid, setMachineUuidProfile, getMachineUuidProfile, qualifyMachineUuid, MACHINE_IDENTITY_FILENAME, hostedRuntimeIdOverride, HOSTED_RUNTIME_MACHINE_SOURCES, __resetMachineUuidCacheForTest, } from './machineUuid.js';
|
|
38
39
|
export { ensureMachineDaemonId, legacyDaemonUuids, __resetCachedDaemonIdForTest, } from './machineId.js';
|
|
39
40
|
export { PAIR_AAD_PREFIX, PAIR_AAD_MAX_LEN, PAIR_BUNDLE_MAX_BASE64_LEN, PAIR_NONCE_LEN, PAIR_PUBKEY_LEN, PAIR_SECRET_LEN, PairBundleError, assemblePairBundleBase64, base64ToUint8Array as pairBase64ToUint8Array, base64UrlToUint8Array as pairBase64UrlToUint8Array, buildPairAad, buildPairUrl, generatePairKeyPair, openPairBundleBase64, parsePairBundle, parsePairPlaintext, parsePairUrl, uint8ArrayToBase64 as pairUint8ArrayToBase64, uint8ArrayToBase64Url as pairUint8ArrayToBase64Url, type AssembleBundleOptions as PairAssembleBundleOptions, type OpenBundleOptions as PairOpenBundleOptions, type PairBundle, type PairBundleErrorCode, type PairKeyPair, type PairPlaintextV1, type PairUrlFields, } from './daemonPair.js';
|
|
@@ -109,6 +109,8 @@ export { ALLOW_LIVE_STATE_ENV, __setAccountHomeForTest, DAEMON_BYOK_KEYCHAIN_SER
|
|
|
109
109
|
// persistence + signing lives in `daemon/src/deviceIdentity.ts`.
|
|
110
110
|
// Server-side verification middleware is a later PR.
|
|
111
111
|
export { algForJwk, buildProof as buildDeviceProof, DEVICE_KEY_ALGS, generateDeviceKeyPair, isDevicePublicJwk, jwkThumbprint, normalizeHtu, p256PublicJwkFromRaw, proofSigningInput, publicJwkFromX, signProofWith, tokenHash, verifyProof as verifyDeviceProof, } from './deviceKey.js';
|
|
112
|
+
// OSK-20777 Gate 1 — a daemon-signed proof that a scheduled session stopped, under its own proof `typ`.
|
|
113
|
+
export { canonicalReceiptJson, EXECUTOR_STOP_RECEIPT_DEFAULT_MAX_AGE_SECONDS, EXECUTOR_STOP_RECEIPT_ERASURE_SCOPES, EXECUTOR_STOP_RECEIPT_TYP, executorStopReceiptHtu, parseExecutorStopReceiptBody, signExecutorStopReceipt, verifyExecutorStopReceipt, } from './executorStopReceipt.js';
|
|
112
114
|
// The handle every signing site holds instead of a private key, and the
|
|
113
115
|
// hardware-bound backend behind it (docs/architecture/device-key-custody-2026-10-29.md).
|
|
114
116
|
export { softwareEd25519Handle } from './deviceKeyHandle.js';
|
|
@@ -129,7 +131,7 @@ initCredEnvelope, initExistingCredEnvelope, initNewIndependentCredEnvelope, rese
|
|
|
129
131
|
__wrappedDekFilePathForTest, __setStateForTest as __setCredEnvelopeStateForTest, __getStateForTest as __getCredEnvelopeStateForTest, __resetShutdownGuardForTest, } from './credentialEnvelopeBridge.js';
|
|
130
132
|
export {
|
|
131
133
|
// deviceIdentity bridge
|
|
132
|
-
initDeviceIdentity, resetDeviceIdentity, signServerRequest, prepareHardwareKeyCandidate, commitDeviceKeyCandidate, signWithCandidate, persistPendingHardwareKey, commitPendingHardwareKey, discardPendingHardwareKey, PENDING_HARDWARE_KEY_MAX_AGE_MS, enrollWithServer, clearEnrollmentMarker, isDeviceIdentityActive, getDevicePublicKey, describeDeviceIdentityState, describeDeviceKeySplit, describeStoredDeviceKey, DEVICE_KEY_UNREADABLE_CREDENTIAL_HINT,
|
|
134
|
+
initDeviceIdentity, resetDeviceIdentity, signServerRequest, signExecutorStopReceiptWithDeviceKey, prepareHardwareKeyCandidate, commitDeviceKeyCandidate, signWithCandidate, persistPendingHardwareKey, commitPendingHardwareKey, discardPendingHardwareKey, PENDING_HARDWARE_KEY_MAX_AGE_MS, enrollWithServer, clearEnrollmentMarker, isDeviceIdentityActive, getDevicePublicKey, describeDeviceIdentityState, describeDeviceKeySplit, describeStoredDeviceKey, DEVICE_KEY_UNREADABLE_CREDENTIAL_HINT,
|
|
133
135
|
// Test seams — file path resolvers + state setters for spec files.
|
|
134
136
|
__publicKeyPathForTest, __privateKeyPathForTest, __enrollmentMarkerPathForTest, __enrollmentBackoffPathForTest, __setUnreadableReloadIntervalForTest, __setStateForTest as __setDeviceIdentityStateForTest, __getStateForTest as __getDeviceIdentityStateForTest, } from './deviceIdentityBridge.js';
|
|
135
137
|
// Hardware machine identity sent as `machineUuid` (IOPlatformUUID /
|