instar 1.3.602 → 1.3.604

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. package/dist/commands/server.d.ts.map +1 -1
  2. package/dist/commands/server.js +108 -2
  3. package/dist/commands/server.js.map +1 -1
  4. package/dist/config/ConfigDefaults.d.ts.map +1 -1
  5. package/dist/config/ConfigDefaults.js +36 -0
  6. package/dist/config/ConfigDefaults.js.map +1 -1
  7. package/dist/core/CoherenceJournal.d.ts +1 -1
  8. package/dist/core/CoherenceJournal.d.ts.map +1 -1
  9. package/dist/core/CoherenceJournal.js +12 -2
  10. package/dist/core/CoherenceJournal.js.map +1 -1
  11. package/dist/core/CredentialLocationLedger.d.ts +70 -0
  12. package/dist/core/CredentialLocationLedger.d.ts.map +1 -1
  13. package/dist/core/CredentialLocationLedger.js +126 -0
  14. package/dist/core/CredentialLocationLedger.js.map +1 -1
  15. package/dist/core/PostUpdateMigrator.d.ts.map +1 -1
  16. package/dist/core/PostUpdateMigrator.js +25 -0
  17. package/dist/core/PostUpdateMigrator.js.map +1 -1
  18. package/dist/core/ThreadlinePairingReplicatedStore.d.ts +285 -0
  19. package/dist/core/ThreadlinePairingReplicatedStore.d.ts.map +1 -0
  20. package/dist/core/ThreadlinePairingReplicatedStore.js +462 -0
  21. package/dist/core/ThreadlinePairingReplicatedStore.js.map +1 -0
  22. package/dist/core/devGatedFeatures.d.ts.map +1 -1
  23. package/dist/core/devGatedFeatures.js +5 -0
  24. package/dist/core/devGatedFeatures.js.map +1 -1
  25. package/dist/core/types.d.ts +22 -0
  26. package/dist/core/types.d.ts.map +1 -1
  27. package/dist/core/types.js.map +1 -1
  28. package/dist/scaffold/templates.d.ts.map +1 -1
  29. package/dist/scaffold/templates.js +6 -0
  30. package/dist/scaffold/templates.js.map +1 -1
  31. package/dist/server/routes.d.ts.map +1 -1
  32. package/dist/server/routes.js +323 -0
  33. package/dist/server/routes.js.map +1 -1
  34. package/dist/threadline/AgentTrustManager.d.ts +201 -1
  35. package/dist/threadline/AgentTrustManager.d.ts.map +1 -1
  36. package/dist/threadline/AgentTrustManager.js +395 -2
  37. package/dist/threadline/AgentTrustManager.js.map +1 -1
  38. package/dist/threadline/CredentialShareGate.d.ts +66 -0
  39. package/dist/threadline/CredentialShareGate.d.ts.map +1 -0
  40. package/dist/threadline/CredentialShareGate.js +82 -0
  41. package/dist/threadline/CredentialShareGate.js.map +1 -0
  42. package/dist/threadline/InboundMessageGate.d.ts +46 -1
  43. package/dist/threadline/InboundMessageGate.d.ts.map +1 -1
  44. package/dist/threadline/InboundMessageGate.js +105 -0
  45. package/dist/threadline/InboundMessageGate.js.map +1 -1
  46. package/dist/threadline/PairVerifyReceipt.d.ts +69 -0
  47. package/dist/threadline/PairVerifyReceipt.d.ts.map +1 -0
  48. package/dist/threadline/PairVerifyReceipt.js +151 -0
  49. package/dist/threadline/PairVerifyReceipt.js.map +1 -0
  50. package/dist/threadline/PairingPendingStore.d.ts +55 -0
  51. package/dist/threadline/PairingPendingStore.d.ts.map +1 -0
  52. package/dist/threadline/PairingPendingStore.js +110 -0
  53. package/dist/threadline/PairingPendingStore.js.map +1 -0
  54. package/dist/threadline/ThreadlineBootstrap.d.ts +11 -0
  55. package/dist/threadline/ThreadlineBootstrap.d.ts.map +1 -1
  56. package/dist/threadline/ThreadlineBootstrap.js +5 -0
  57. package/dist/threadline/ThreadlineBootstrap.js.map +1 -1
  58. package/dist/threadline/ThreadlineCrypto.d.ts +28 -0
  59. package/dist/threadline/ThreadlineCrypto.d.ts.map +1 -1
  60. package/dist/threadline/ThreadlineCrypto.js +100 -0
  61. package/dist/threadline/ThreadlineCrypto.js.map +1 -1
  62. package/dist/threadline/ThreadlineEndpoints.d.ts +8 -0
  63. package/dist/threadline/ThreadlineEndpoints.d.ts.map +1 -1
  64. package/dist/threadline/ThreadlineEndpoints.js +5 -0
  65. package/dist/threadline/ThreadlineEndpoints.js.map +1 -1
  66. package/dist/threadline/ThreadlineMCPServer.d.ts +3 -1
  67. package/dist/threadline/ThreadlineMCPServer.d.ts.map +1 -1
  68. package/dist/threadline/ThreadlineMCPServer.js +107 -1
  69. package/dist/threadline/ThreadlineMCPServer.js.map +1 -1
  70. package/dist/threadline/client/ThreadlineClient.d.ts +10 -0
  71. package/dist/threadline/client/ThreadlineClient.d.ts.map +1 -1
  72. package/dist/threadline/client/ThreadlineClient.js +13 -0
  73. package/dist/threadline/client/ThreadlineClient.js.map +1 -1
  74. package/package.json +2 -1
  75. package/scripts/check-e2e-pairing.cjs +4 -1
  76. package/src/data/builtin-manifest.json +63 -63
  77. package/src/data/state-coherence-registry.json +26 -0
  78. package/src/scaffold/templates.ts +6 -0
  79. package/src/threadline/data/sas-wordlist-en.json +1 -0
  80. package/upgrades/1.3.603.md +39 -0
  81. package/upgrades/1.3.604.md +57 -0
  82. package/upgrades/side-effects/credential-identity-audit.md +183 -0
  83. package/upgrades/side-effects/secure-a2a-verified-pairing.md +116 -0
@@ -0,0 +1,462 @@
1
+ /**
2
+ * ThreadlinePairingReplicatedStore — replicate ONLY the verified-IDENTITY RESULT of a
3
+ * Secure A2A pairing across the agent's OWN machines (Secure A2A Verified Pairing §3.8 /
4
+ * FD11). It is the EIGHTH concrete consumer of the HLC replicated-store foundation,
5
+ * layering a `threadline-pairing-record` replicated kind onto the generic substrate
6
+ * (ReplicatedRecordEnvelope / UnionReader / ReplicationBudget) so that a pairing a HUMAN
7
+ * SAS-verified on machine A is HONORED on machine B — without ever re-deriving the SAS on B.
8
+ *
9
+ * It is the literal analog of the WS2 PII stores (RelationshipsReplicatedStore /
10
+ * TopicOperatorReplicatedStore): type-clamp on receive, untrusted-envelope render,
11
+ * fingerprint-keyed identity, tombstone on revoke, dark by default. THIS IS PURE LOGIC.
12
+ * No fs, no Date directly, no network.
13
+ *
14
+ * ── THE SECURITY BOUNDARY THAT MAKES THIS SAFE (§3.8) ────────────────────────────────
15
+ *
16
+ * Only FIVE fields ever cross a machine boundary:
17
+ * { peerFp, peerIdentityPub, state:'mutual-verified', verifiedAt, verifiedOnMachine }
18
+ * NEVER the SAS words, NEVER the shared secret, NEVER the relay token — those are bound to
19
+ * the MACHINE-LOCAL handshake's ephemeral shared secret (machine A and B derive DIFFERENT
20
+ * secrets/SAS for the same peer) and stay machine-local by design. This serializer
21
+ * STRUCTURALLY cannot leak them: its INPUT type (`VerifiedPairingResult`) does not even
22
+ * HAVE a sasWords/sharedSecret/relayToken field, and the projection enumerates the five
23
+ * fields explicitly — there is no spread of an on-disk blob, so a secret that is not a
24
+ * field of the input can never become a field of the output.
25
+ *
26
+ * ── HOW MACHINE B HONORS A REPLICATED RECORD (codex finding 1, MATERIAL) ──────────────
27
+ *
28
+ * Machine B honors a replicated `mutual-verified` record ONLY by PINNING the record's
29
+ * `peerIdentityPub`. The honoring decision lives in the CONSUMER (AgentTrustManager.
30
+ * inheritReplicatedVerification): a handshake on B for that `peerFp` whose presented
31
+ * identity key does NOT match the pinned `peerIdentityPub` is REFUSED the inheritance and
32
+ * downgraded to `pending-verification` (re-verify on B) — never auto-`mutual-verified`,
33
+ * never silently-untrusted-but-honored. The replicated grant binds to the exact identity
34
+ * key the human verified. (The `peerFp` is itself the first 16 bytes of that key, so a
35
+ * mismatch is a fingerprint-collision/substitution attempt.)
36
+ *
37
+ * INHERITED = `identity-verified`, NOT channel-ready (codex round-2 finding 1): the
38
+ * replicated record asserts only "this identity key was SAS-verified by a human somewhere".
39
+ * Before B may open credential-share to that peer, B must ADDITIONALLY have its OWN live
40
+ * encrypted+signed handshake channel (the outbound CredentialShareGate already enforces the
41
+ * encrypted-path half). So credential-share on B = inherited `identity-verified` (key-pinned)
42
+ * AND B's own live encrypted channel.
43
+ *
44
+ * A `verification-failed`/revoke propagates as a TOMBSTONE so an un-verify sticks pool-wide.
45
+ *
46
+ * SAFETY POSTURE (§3.8 / §3.10): MECHANISM, ships DARK behind
47
+ * `multiMachine.stateSync.threadlinePairing.{enabled:false, dryRun:true}` — flag-off is a
48
+ * strict no-op (single-machine agents unaffected). Nothing here blocks a user action.
49
+ */
50
+ import { createHash } from 'node:crypto';
51
+ // ───────────────────────────────────────────────────────────────────────────
52
+ // A. Identity, tier, schema, bounds, caps
53
+ // ───────────────────────────────────────────────────────────────────────────
54
+ /** The stateSync config sub-key + advert suffix for this store (e.g.
55
+ * `multiMachine.stateSync.threadlinePairing.enabled`). Equal to the advert flag key
56
+ * `stateSyncReceive['threadlinePairing']`. */
57
+ export const THREADLINE_PAIRING_STORE_KEY = 'threadlinePairing';
58
+ /** The JournalKind string this store rides — the DUAL-REGISTRY's dynamic half.
59
+ * MUST also be present in CoherenceJournal.JOURNAL_KINDS (the static half), or the
60
+ * store advertises receive=true yet serves/applies/pulls nothing. */
61
+ export const THREADLINE_PAIRING_RECORD_KIND = 'threadline-pairing-record';
62
+ /**
63
+ * Pairing results are HIGH-impact at the REPLICATION layer (a divergent concurrent
64
+ * edit goes through APPEND-BOTH-AND-FLAG — never a silent clobber). In practice a
65
+ * verified-identity result is monotonic per (peerFp, identity key) and the consumer
66
+ * key-pins, so a genuine concurrent divergence (two machines verifying a DIFFERENT
67
+ * identity key for the SAME peerFp) is exactly the fingerprint-substitution case the
68
+ * append-both surfaces rather than auto-merges.
69
+ */
70
+ export const THREADLINE_PAIRING_IMPACT_TIER = 'high';
71
+ /** The single state value a verified-identity result may carry across the wire (§3.8):
72
+ * ONLY `mutual-verified`. A `pending-verification` (machine-local SAS state) NEVER
73
+ * replicates; an un-verify propagates as a tombstone, not a state value. */
74
+ export const REPLICATED_PAIRING_STATE = 'mutual-verified';
75
+ /** A peer fingerprint is the first 16 bytes (32 hex chars) of the Ed25519 public key. */
76
+ export const PAIRING_FP_MIN_LEN = 4; // tolerant lower bound (test fixtures use short fps)
77
+ export const PAIRING_FP_MAX_LEN = 128;
78
+ /** An Ed25519 public key is 32 bytes = 64 hex chars; allow a tolerant range. */
79
+ export const PAIRING_PUB_MAX_LEN = 256;
80
+ /** verifiedOnMachine is a machine id (origin-shaped); length-bounded. */
81
+ export const PAIRING_MACHINE_ID_MAX_LEN = 256;
82
+ /**
83
+ * Per-kind replication bounds. The pairing store is FEW + bounded (one record per
84
+ * verified peer — single digits in practice). The rate cap COALESCES (latest state per
85
+ * recordKey per interval) so a re-handshake/re-verify loop cannot flood the stream.
86
+ * NEVER `rotateKeep: 0`.
87
+ */
88
+ export const THREADLINE_PAIRING_RECORD_BOUNDS = {
89
+ retention: { maxFileBytes: 1 * 1024 * 1024, rotateKeep: 4 },
90
+ rateCap: { capacity: 20, refillPerSec: 5 },
91
+ };
92
+ /** Per-entry size cap. A pairing record is tiny (5 short fields); 8KB is generous. */
93
+ export const THREADLINE_PAIRING_MAX_ENTRY_BYTES = 8 * 1024;
94
+ /**
95
+ * The store-specific field names the VALUE schema OWNS. DELIBERATELY a CLOSED set of
96
+ * FOUR (the fifth replicated field, `peerFp`, is carried by the envelope `recordKey` —
97
+ * see deriveThreadlinePairingRecordKey). The SAS words, shared secret, and relay token
98
+ * are NOT in this allowlist by construction, so the envelope validator DROPS any such
99
+ * field a hostile/buggy peer smuggles in. `recordKey`/`hlc`/`op`/`origin`/`observed`
100
+ * are reserved envelope fields, never store fields.
101
+ */
102
+ export const THREADLINE_PAIRING_STORE_KNOWN_FIELDS = Object.freeze([
103
+ 'peerFp',
104
+ 'peerIdentityPub',
105
+ 'state',
106
+ 'verifiedAt',
107
+ 'verifiedOnMachine',
108
+ ]);
109
+ /** The tombstone's store-owned fields beyond the reserved envelope set. `deletedAt`
110
+ * is the only store field a delete (revoke/verification-failed) carries. */
111
+ export const THREADLINE_PAIRING_TOMBSTONE_KNOWN_FIELDS = Object.freeze([
112
+ 'deletedAt',
113
+ ]);
114
+ /** The full set of known store fields across BOTH op-branches. */
115
+ const ALL_KNOWN_FIELDS = Object.freeze([
116
+ ...THREADLINE_PAIRING_STORE_KNOWN_FIELDS,
117
+ ...THREADLINE_PAIRING_TOMBSTONE_KNOWN_FIELDS,
118
+ ]);
119
+ // ── ISO-8601 type-clamp (§3.8 explicitly requires `verifiedAt` ISO-8601-only). ───────
120
+ /** Is `v` a valid ISO-8601 date string (and ONLY a date — no smuggled markup)? */
121
+ export function isIso8601(v) {
122
+ if (typeof v !== 'string' || v.length === 0 || v.length > 64)
123
+ return false;
124
+ const ms = Date.parse(v);
125
+ if (!Number.isFinite(ms))
126
+ return false;
127
+ if (v.includes('<') || v.includes('>') || v.includes('"'))
128
+ return false;
129
+ return true;
130
+ }
131
+ /** Is `v` a clean lowercase/uppercase HEX string within bounds (no markup vectors)?
132
+ * peerFp + peerIdentityPub are hex-only by construction (Ed25519 key material), so a
133
+ * non-hex value on a foreign record is a tampered record and rejects the whole record. */
134
+ function isHexString(v, minLen, maxLen) {
135
+ if (typeof v !== 'string')
136
+ return false;
137
+ if (v.length < minLen || v.length > maxLen)
138
+ return false;
139
+ return /^[0-9a-fA-F]+$/.test(v);
140
+ }
141
+ /** A length-bounded, non-markup machine-id string (origin-shaped). Empty/over-cap → null. */
142
+ function clampMachineId(v) {
143
+ if (typeof v !== 'string' || v.length === 0 || v.length > PAIRING_MACHINE_ID_MAX_LEN)
144
+ return null;
145
+ if (v.includes('<') || v.includes('>') || v.includes('"'))
146
+ return null;
147
+ return v;
148
+ }
149
+ /**
150
+ * The `threadline-pairing-record` store schema — a DISCRIMINATED UNION on `op`. Strict
151
+ * typed validation on top of the envelope: TYPE-CLAMP every known field (verifiedAt
152
+ * ISO-8601-only, peerFp/peerIdentityPub hex-only, state MUST EQUAL 'mutual-verified',
153
+ * verifiedOnMachine length-bounded) so markup cannot smuggle through a render slot AND
154
+ * a non-`mutual-verified` state can never become a replicated value. Returns the
155
+ * validated store-specific object (known fields only), or null to reject the WHOLE
156
+ * record. PURE (no I/O, no mutation of `raw`).
157
+ *
158
+ * The envelope validator has ALREADY validated `op` ∈ {put,delete} before calling this.
159
+ */
160
+ export const threadlinePairingRecordStoreSchema = {
161
+ knownFields: ALL_KNOWN_FIELDS,
162
+ validate(raw, ctx) {
163
+ const op = raw.op;
164
+ // ── DELETE (tombstone) branch — revoke / verification-failed propagation (§3.8).
165
+ // Only `deletedAt` is a legal store field; any VALUE field present is counted
166
+ // as a dropped field but does not reject — the tombstone's recordKey + hlc + op
167
+ // carry the suppression. ──────────────────────────────────────────────────────
168
+ if (op === 'delete') {
169
+ const deletedAt = isIso8601(raw.deletedAt) ? raw.deletedAt : undefined;
170
+ for (const k of Object.keys(raw)) {
171
+ if (k === 'op' || k === 'deletedAt')
172
+ continue;
173
+ if (THREADLINE_PAIRING_STORE_KNOWN_FIELDS.includes(k))
174
+ ctx.countDroppedField();
175
+ }
176
+ return deletedAt !== undefined ? { deletedAt } : {};
177
+ }
178
+ // ── VALUE (put) branch. ──────────────────────────────────────────────────────────
179
+ // peerFp — required hex (the cross-machine identity surface; the recordKey is
180
+ // derived from it). A non-hex peerFp is a tampered record → reject.
181
+ if (!isHexString(raw.peerFp, PAIRING_FP_MIN_LEN, PAIRING_FP_MAX_LEN))
182
+ return null;
183
+ const peerFp = raw.peerFp;
184
+ // peerIdentityPub — required hex (the PINNED key the consumer honors against, §3.8).
185
+ if (!isHexString(raw.peerIdentityPub, PAIRING_FP_MIN_LEN, PAIRING_PUB_MAX_LEN))
186
+ return null;
187
+ const peerIdentityPub = raw.peerIdentityPub;
188
+ // state — MUST be exactly 'mutual-verified' (§3.8). Anything else (incl.
189
+ // 'pending-verification' / 'verification-failed' / arbitrary markup) is REJECTED:
190
+ // a machine-local-only state never replicates as a value.
191
+ if (raw.state !== REPLICATED_PAIRING_STATE)
192
+ return null;
193
+ // verifiedAt — ISO-8601 ONLY (§3.8). A non-date is rejected (markup cannot survive).
194
+ if (!isIso8601(raw.verifiedAt))
195
+ return null;
196
+ const verifiedAt = raw.verifiedAt;
197
+ // verifiedOnMachine — required length-bounded machine id.
198
+ const verifiedOnMachine = clampMachineId(raw.verifiedOnMachine);
199
+ if (verifiedOnMachine === null)
200
+ return null;
201
+ return {
202
+ peerFp,
203
+ peerIdentityPub,
204
+ state: REPLICATED_PAIRING_STATE,
205
+ verifiedAt,
206
+ verifiedOnMachine,
207
+ };
208
+ },
209
+ };
210
+ // ───────────────────────────────────────────────────────────────────────────
211
+ // recordKey — the cross-machine IDENTITY SURFACE
212
+ // ───────────────────────────────────────────────────────────────────────────
213
+ /**
214
+ * Derive the cross-machine-stable recordKey for a pairing. A peer is "the same" across
215
+ * machines by their FINGERPRINT (the first 16 bytes of their Ed25519 identity key), which
216
+ * is itself stable + machine-independent. We hash it to a bounded, non-path-shaped string
217
+ * (the same shape UnionReader.conflictId uses) so the envelope's recordKey jail accepts it.
218
+ * Returns null for an empty/degenerate fingerprint (no identity surface — skip emission).
219
+ */
220
+ export function deriveThreadlinePairingRecordKey(peerFp) {
221
+ const fp = (peerFp ?? '').trim();
222
+ if (fp.length === 0)
223
+ return null;
224
+ const h = createHash('sha256');
225
+ h.update(`threadline-pairing\x1f${fp.toLowerCase()}`);
226
+ return h.digest('hex').slice(0, 32);
227
+ }
228
+ /** The named error a record-over-cap surfaces (never silent-truncate). A pairing record
229
+ * is tiny so this is purely belt-and-suspenders. */
230
+ export class ThreadlinePairingRecordTooLargeError extends Error {
231
+ recordKey;
232
+ bytes;
233
+ constructor(recordKey, bytes) {
234
+ super(`threadline-pairing-record ${recordKey} is ${bytes} bytes after projection — over the ${THREADLINE_PAIRING_MAX_ENTRY_BYTES}-byte per-entry cap; not replicated`);
235
+ this.recordKey = recordKey;
236
+ this.bytes = bytes;
237
+ this.name = 'ThreadlinePairingRecordTooLargeError';
238
+ }
239
+ }
240
+ /**
241
+ * Build the `threadline-pairing-record` envelope `data` for an `op:'put'`. Emits ONLY
242
+ * the FIVE allowed fields (§3.8) — peerFp + peerIdentityPub + state + verifiedAt +
243
+ * verifiedOnMachine (peerFp via the envelope recordKey AND as an explicit field for the
244
+ * consumer). NEVER the SAS / shared secret / relay token — structurally impossible,
245
+ * since they are not fields of `VerifiedPairingResult` and the projection is an explicit
246
+ * enumeration (no blob spread).
247
+ *
248
+ * Returns null when the fingerprint has no identity surface (the caller skips emission).
249
+ * Throws ThreadlinePairingRecordTooLargeError if the projection somehow exceeds the cap.
250
+ */
251
+ export function buildThreadlinePairingRecordData(input) {
252
+ const { result, hlc, origin, observed } = input;
253
+ const recordKey = deriveThreadlinePairingRecordKey(result.peerFp);
254
+ if (recordKey === null)
255
+ return null;
256
+ const data = {
257
+ // The FIVE allowed fields — an EXPLICIT enumeration, never a spread of an on-disk
258
+ // blob (so a secret that is not enumerated here can never be emitted).
259
+ peerFp: result.peerFp,
260
+ peerIdentityPub: result.peerIdentityPub,
261
+ state: REPLICATED_PAIRING_STATE,
262
+ verifiedAt: result.verifiedAt,
263
+ verifiedOnMachine: result.verifiedOnMachine,
264
+ // envelope fields (recordKey = identity surface).
265
+ recordKey,
266
+ hlc,
267
+ op: 'put',
268
+ origin,
269
+ ...(observed !== undefined ? { observed } : {}),
270
+ };
271
+ assertProjectionUnderCap(recordKey, data);
272
+ return data;
273
+ }
274
+ /** Throw ThreadlinePairingRecordTooLargeError if the projected data serializes over the
275
+ * per-entry cap. */
276
+ export function assertProjectionUnderCap(recordKey, data) {
277
+ const bytes = Buffer.byteLength(JSON.stringify(data), 'utf-8');
278
+ if (bytes > THREADLINE_PAIRING_MAX_ENTRY_BYTES) {
279
+ throw new ThreadlinePairingRecordTooLargeError(recordKey, bytes);
280
+ }
281
+ }
282
+ /**
283
+ * Build an `op:'delete'` TOMBSTONE `data` for a pairing revoke / verification-failed
284
+ * (§3.8). recordKey = the SAME fingerprint identity surface the value records key on, so
285
+ * the tombstone reaches the same peer's record on every machine — an un-verify sticks
286
+ * pool-wide even on a machine that was offline at revoke time. Returns null for an empty
287
+ * fingerprint (no identity surface to tombstone).
288
+ */
289
+ export function buildThreadlinePairingTombstoneData(input) {
290
+ const recordKey = deriveThreadlinePairingRecordKey(input.peerFp);
291
+ if (recordKey === null)
292
+ return null;
293
+ return {
294
+ deletedAt: input.deletedAt,
295
+ recordKey,
296
+ hlc: input.hlc,
297
+ op: 'delete',
298
+ origin: input.origin,
299
+ ...(input.observed !== undefined ? { observed: input.observed } : {}),
300
+ };
301
+ }
302
+ function viewFromOriginRecord(rec, conflicted) {
303
+ return { recordKey: rec.envelope.recordKey, origin: rec.origin, data: rec.data, conflicted };
304
+ }
305
+ /**
306
+ * Collapse a `Map<recordKey, UnionResult>` into the merged pairing view.
307
+ * - A resolved single value ⇒ that one view entry.
308
+ * - An OPEN concurrent conflict ⇒ BOTH (all) `put` variants (append-both — never a
309
+ * silent clobber; two machines verifying a DIFFERENT identity key for the SAME
310
+ * peerFp is exactly the substitution case to surface, not auto-merge).
311
+ * - A delete-resolved key (every origin's latest is a tombstone) ⇒ nothing (the
312
+ * revoke-resurrection guard: a later delete wins over an earlier put).
313
+ * READ-ONLY: a replicated record NEVER clobbers a divergent local record.
314
+ */
315
+ export function mergeUnionToPairings(union) {
316
+ const out = [];
317
+ for (const result of union.values()) {
318
+ if (result.conflict) {
319
+ for (const v of result.conflict.versions) {
320
+ if (v.envelope.op === 'delete')
321
+ continue;
322
+ out.push(viewFromOriginRecord(v, true));
323
+ }
324
+ continue;
325
+ }
326
+ if (result.value && result.value.envelope.op !== 'delete') {
327
+ out.push(viewFromOriginRecord(result.value, false));
328
+ }
329
+ }
330
+ return out;
331
+ }
332
+ /**
333
+ * Decide whether machine B HONORS a replicated mutual-verified pairing for `peerFp`,
334
+ * given the identity public key B's OWN live handshake presented for that peer
335
+ * (`presentedIdentityPub`, or undefined if B has no live handshake yet).
336
+ *
337
+ * The honoring rule (§3.8): pin the record's `peerIdentityPub`. If B has a live handshake
338
+ * AND its presented key differs from the pinned key → REFUSE (identity-key-mismatch →
339
+ * downgrade to pending-verification). If B has no live handshake yet, the inheritance is
340
+ * honored as `identity-verified` against the pinned key (B's own encrypted channel is a
341
+ * SEPARATE precondition the credential gate enforces — inherited ≠ channel-ready).
342
+ *
343
+ * Reads the merged view (the union of peer replicas) and resolves the record for `peerFp`.
344
+ * A null `presentedIdentityPub` means "no live handshake key to contradict the pin yet" —
345
+ * the inheritance is honored (key-pinned) but stays NOT-channel-ready.
346
+ */
347
+ export function evaluateInheritedVerification(views, peerFp, presentedIdentityPub) {
348
+ const recordKey = deriveThreadlinePairingRecordKey(peerFp);
349
+ if (recordKey === null)
350
+ return { honor: false, reason: 'no-replicated-record' };
351
+ // Find a mutual-verified value view for this peer. An open conflict (two divergent
352
+ // pinned keys) is NOT auto-honored — we require a single, unambiguous pinned key, so
353
+ // a conflicted record falls through to no-honor (the safe direction).
354
+ const matching = views.filter((v) => v.recordKey === recordKey &&
355
+ v.data.state === REPLICATED_PAIRING_STATE &&
356
+ typeof v.data.peerIdentityPub === 'string');
357
+ if (matching.length === 0)
358
+ return { honor: false, reason: 'no-replicated-record' };
359
+ // Distinct pinned keys across the matching views. >1 distinct key (a genuine
360
+ // substitution divergence) is never auto-honored.
361
+ const pinnedKeys = new Set(matching.map((v) => v.data.peerIdentityPub.toLowerCase()));
362
+ if (pinnedKeys.size !== 1) {
363
+ // Treat as a mismatch against B's presented key (or no-record when B has none) — the
364
+ // safe direction. We surface the first key for the audit.
365
+ const pinnedKey = matching[0].data.peerIdentityPub;
366
+ if (presentedIdentityPub) {
367
+ return { honor: false, reason: 'identity-key-mismatch', pinnedKey, presentedKey: presentedIdentityPub };
368
+ }
369
+ return { honor: false, reason: 'no-replicated-record' };
370
+ }
371
+ const view = matching[0];
372
+ const pinnedKey = view.data.peerIdentityPub;
373
+ // Key-pin: a live handshake whose key differs from the pin is REFUSED inheritance.
374
+ if (presentedIdentityPub && presentedIdentityPub.toLowerCase() !== pinnedKey.toLowerCase()) {
375
+ return { honor: false, reason: 'identity-key-mismatch', pinnedKey, presentedKey: presentedIdentityPub };
376
+ }
377
+ return {
378
+ honor: true,
379
+ pinnedKey,
380
+ verifiedAt: typeof view.data.verifiedAt === 'string' ? view.data.verifiedAt : undefined,
381
+ verifiedOnMachine: typeof view.data.verifiedOnMachine === 'string' ? view.data.verifiedOnMachine : undefined,
382
+ };
383
+ }
384
+ // ───────────────────────────────────────────────────────────────────────────
385
+ // E. Foreign-record render safety — quoted untrusted data
386
+ // ───────────────────────────────────────────────────────────────────────────
387
+ function sanitize(s) {
388
+ return String(s).replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;');
389
+ }
390
+ /**
391
+ * Render a FOREIGN (replicated) pairing record into a context block, wrapped in an
392
+ * explicit `<replicated-untrusted-data origin="…">` envelope so a reader treats it as a
393
+ * PEER MACHINE'S claim to re-ground against, never a directive. EVERY field is escaped.
394
+ * A malformed view (no peerFp) yields null. The SAS / secret / token can never appear
395
+ * here — they are never fields of the record.
396
+ */
397
+ export function renderForeignPairingContext(view) {
398
+ const d = view.data;
399
+ if (typeof d.peerFp !== 'string' || d.peerFp.length === 0)
400
+ return null;
401
+ const safeOrigin = sanitize(view.origin);
402
+ const lines = [
403
+ `<replicated-untrusted-data origin="${safeOrigin}">`,
404
+ `Verified pairing (peer fingerprint): ${sanitize(d.peerFp)}`,
405
+ `State: ${sanitize(typeof d.state === 'string' ? d.state : '')}`,
406
+ ];
407
+ if (typeof d.verifiedAt === 'string')
408
+ lines.push(`Verified at: ${sanitize(d.verifiedAt)}`);
409
+ if (typeof d.verifiedOnMachine === 'string')
410
+ lines.push(`Verified on machine: ${sanitize(d.verifiedOnMachine)}`);
411
+ lines.push('</replicated-untrusted-data>');
412
+ return lines.join('\n');
413
+ }
414
+ // ───────────────────────────────────────────────────────────────────────────
415
+ // Own-origin materialization for the union reader
416
+ // ───────────────────────────────────────────────────────────────────────────
417
+ /**
418
+ * Build an OriginRecord for the OWN pairing store (the single-origin materialization the
419
+ * union reader merges against peer replicas). recordKey = derived fingerprint identity
420
+ * surface; the envelope carries a SYNTHETIC own-origin HLC stamp derived deterministically
421
+ * from verifiedAt (physical) so the own record has a well-formed, stable position relative
422
+ * to peer records. Returns null for a degenerate record (no identity surface). The
423
+ * machine-local SAS / pending state is NEVER carried into the replicated namespace.
424
+ */
425
+ export function pairingResultToOriginRecord(result, origin) {
426
+ const recordKey = deriveThreadlinePairingRecordKey(result.peerFp);
427
+ if (recordKey === null)
428
+ return null;
429
+ const physical = Date.parse(result.verifiedAt);
430
+ const hlc = {
431
+ physical: Number.isFinite(physical) ? physical : 0,
432
+ logical: 0,
433
+ node: origin,
434
+ };
435
+ const data = {
436
+ peerFp: result.peerFp,
437
+ peerIdentityPub: result.peerIdentityPub,
438
+ state: REPLICATED_PAIRING_STATE,
439
+ verifiedAt: result.verifiedAt,
440
+ verifiedOnMachine: result.verifiedOnMachine,
441
+ };
442
+ const envelope = { recordKey, hlc, op: 'put', origin };
443
+ return { origin, envelope, data };
444
+ }
445
+ // ───────────────────────────────────────────────────────────────────────────
446
+ // Registration descriptor (consumed by server.ts to register the dual registry)
447
+ // ───────────────────────────────────────────────────────────────────────────
448
+ /** The ReplicatedKindRegistry registration for the `threadline-pairing-record` store. */
449
+ export const THREADLINE_PAIRING_KIND_REGISTRATION = {
450
+ kind: THREADLINE_PAIRING_RECORD_KIND,
451
+ store: THREADLINE_PAIRING_STORE_KEY,
452
+ schema: threadlinePairingRecordStoreSchema,
453
+ };
454
+ /** Convenience: the store's contributing journal kinds (for rollback-unmerge wiring). */
455
+ export function threadlinePairingContributingKinds() {
456
+ return [THREADLINE_PAIRING_RECORD_KIND];
457
+ }
458
+ /** The store's impact tier resolver, for ReplicatedStoreReader.tierOf. */
459
+ export function threadlinePairingTierOf(_store) {
460
+ return THREADLINE_PAIRING_IMPACT_TIER;
461
+ }
462
+ //# sourceMappingURL=ThreadlinePairingReplicatedStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ThreadlinePairingReplicatedStore.js","sourceRoot":"","sources":["../../src/core/ThreadlinePairingReplicatedStore.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"devGatedFeatures.d.ts","sourceRoot":"","sources":["../../src/core/devGatedFeatures.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,oEAAoE;AACpE,MAAM,WAAW,eAAe;IAC9B,mEAAmE;IACnE,IAAI,EAAE,MAAM,CAAC;IACb,uEAAuE;IACvE,UAAU,EAAE,MAAM,CAAC;IACnB,6DAA6D;IAC7D,WAAW,EAAE,MAAM,CAAC;IACpB;;;;;;OAMG;IACH,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,eAAO,MAAM,kBAAkB,EAAE,eAAe,EA2T/C,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,MAAM,gBAAgB,GACxB,aAAa,GACb,cAAc,GACd,gBAAgB,GAChB,sBAAsB,GACtB,iBAAiB,CAAC;AAEtB,MAAM,WAAW,iBAAiB;IAChC,uEAAuE;IACvE,UAAU,EAAE,MAAM,CAAC;IACnB,6CAA6C;IAC7C,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,mFAAmF;IACnF,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,oBAAoB,EAAE,iBAAiB,EAuHnD,CAAC;AAEF;;;GAGG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAO5E"}
1
+ {"version":3,"file":"devGatedFeatures.d.ts","sourceRoot":"","sources":["../../src/core/devGatedFeatures.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,oEAAoE;AACpE,MAAM,WAAW,eAAe;IAC9B,mEAAmE;IACnE,IAAI,EAAE,MAAM,CAAC;IACb,uEAAuE;IACvE,UAAU,EAAE,MAAM,CAAC;IACnB,6DAA6D;IAC7D,WAAW,EAAE,MAAM,CAAC;IACpB;;;;;;OAMG;IACH,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,eAAO,MAAM,kBAAkB,EAAE,eAAe,EA2T/C,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,MAAM,gBAAgB,GACxB,aAAa,GACb,cAAc,GACd,gBAAgB,GAChB,sBAAsB,GACtB,iBAAiB,CAAC;AAEtB,MAAM,WAAW,iBAAiB;IAChC,uEAAuE;IACvE,UAAU,EAAE,MAAM,CAAC;IACnB,6CAA6C;IAC7C,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,mFAAmF;IACnF,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,oBAAoB,EAAE,iBAAiB,EA4HnD,CAAC;AAEF;;;GAGG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAO5E"}
@@ -418,6 +418,11 @@ export const DARK_GATE_EXCLUSIONS = [
418
418
  category: 'action-bearing',
419
419
  reason: 'A2A check-in summarizer — sends UNBOUNDED user-facing Telegram summaries on a heartbeat while a conversation is active; live-on-dev would flood the operator. Opt-in to keep the operator un-flooded.',
420
420
  },
421
+ {
422
+ configPath: 'multiMachine.stateSync.threadlinePairing.enabled',
423
+ category: 'action-bearing',
424
+ reason: 'Secure A2A Verified Pairing §3.8 — replicates the verified-IDENTITY RESULT of a pairing across the agent\'s own machines; the inherited record AUTHORIZES the identity half of the credential-share gate on a peer machine (key-pinned). A credential-gating surface, so it ships hard-dark with explicit enabled:false + dryRun:true on EVERY agent (dev included) — the cautious rollout posture the spec mandates, NOT the dev-gate-live posture of the 7 WS2 memory/PII stores. NEVER replicates the SAS, shared secret, or relay token (structurally — they are not fields of the replicated result). Opt-in per agent after soak.',
425
+ },
421
426
  {
422
427
  configPath: 'monitoring.apprenticeshipCycleSla.enabled',
423
428
  category: 'action-bearing',
@@ -1 +1 @@
1
- {"version":3,"file":"devGatedFeatures.js","sourceRoot":"","sources":["../../src/core/devGatedFeatures.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"devGatedFeatures.js","sourceRoot":"","sources":["../../src/core/devGatedFeatures.ts"],"names":[],"mappings":"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"}
@@ -3422,6 +3422,28 @@ export interface ThreadlineConfig {
3422
3422
  spawn?: ThreadlineSpawnConfig;
3423
3423
  /** Warm-session A2A keep-alive integration (Arch Y). */
3424
3424
  warmSessionA2A?: ThreadlineWarmSessionConfig;
3425
+ /** Secure A2A Verified Pairing — SAS mutual verification + credential-share gate (§3.10). */
3426
+ verifiedPairing?: ThreadlineVerifiedPairingConfig;
3427
+ }
3428
+ /**
3429
+ * Secure A2A Verified Pairing config (docs/specs/secure-a2a-verified-pairing.md §3.10).
3430
+ *
3431
+ * Ships DARK: `enabled` default false fleet-wide (dev-live via the developmentAgent
3432
+ * gate when omitted). When `enabled` is false the gate is a complete pass-through —
3433
+ * byte-identical legacy behavior, no refusals, no pair-verify handling.
3434
+ *
3435
+ * `dryRun` (default true) governs ONLY inbound observability/logging (FD10) — the
3436
+ * OUTBOUND credential-share refusal is ALWAYS live when `enabled` (a leak gate has
3437
+ * no allow-by-default soak). `credentialShareEnforced` arms inbound enforcement and
3438
+ * is read live at the gate chokepoint (no restart).
3439
+ */
3440
+ export interface ThreadlineVerifiedPairingConfig {
3441
+ /** Master flag. Default false fleet; omit → resolves via the developmentAgent gate. */
3442
+ enabled?: boolean;
3443
+ /** Governs inbound observability + attention verbosity ONLY (FD10). Default true. */
3444
+ dryRun?: boolean;
3445
+ /** Arms inbound credential-ingestion enforcement. Read live at the chokepoint. Default false. */
3446
+ credentialShareEnforced?: boolean;
3425
3447
  }
3426
3448
  /**
3427
3449
  * Warm-session A2A integration config (THREADLINE-WARM-SESSION-A2A-INTEGRATION-SPEC).