@omnitype-code/journal 2.0.0
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/blame/legacy.d.ts +24 -0
- package/dist/blame/legacy.d.ts.map +1 -0
- package/dist/blame/legacy.js +219 -0
- package/dist/blame/legacy.js.map +1 -0
- package/dist/blame/merge.d.ts +17 -0
- package/dist/blame/merge.d.ts.map +1 -0
- package/dist/blame/merge.js +32 -0
- package/dist/blame/merge.js.map +1 -0
- package/dist/cli.d.ts +7 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +638 -0
- package/dist/cli.js.map +1 -0
- package/dist/cloud/anchor.d.ts +78 -0
- package/dist/cloud/anchor.d.ts.map +1 -0
- package/dist/cloud/anchor.js +220 -0
- package/dist/cloud/anchor.js.map +1 -0
- package/dist/cloud/pending.d.ts +29 -0
- package/dist/cloud/pending.d.ts.map +1 -0
- package/dist/cloud/pending.js +115 -0
- package/dist/cloud/pending.js.map +1 -0
- package/dist/cloud/shipper.d.ts +67 -0
- package/dist/cloud/shipper.d.ts.map +1 -0
- package/dist/cloud/shipper.js +177 -0
- package/dist/cloud/shipper.js.map +1 -0
- package/dist/crypto/chain.d.ts +19 -0
- package/dist/crypto/chain.d.ts.map +1 -0
- package/dist/crypto/chain.js +123 -0
- package/dist/crypto/chain.js.map +1 -0
- package/dist/daemon/journal.d.ts +92 -0
- package/dist/daemon/journal.d.ts.map +1 -0
- package/dist/daemon/journal.js +370 -0
- package/dist/daemon/journal.js.map +1 -0
- package/dist/daemon/server.d.ts +89 -0
- package/dist/daemon/server.d.ts.map +1 -0
- package/dist/daemon/server.js +323 -0
- package/dist/daemon/server.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/log/segment.d.ts +43 -0
- package/dist/log/segment.d.ts.map +1 -0
- package/dist/log/segment.js +180 -0
- package/dist/log/segment.js.map +1 -0
- package/dist/materializer/db.d.ts +47 -0
- package/dist/materializer/db.d.ts.map +1 -0
- package/dist/materializer/db.js +385 -0
- package/dist/materializer/db.js.map +1 -0
- package/dist/notes/git-notes.d.ts +50 -0
- package/dist/notes/git-notes.d.ts.map +1 -0
- package/dist/notes/git-notes.js +94 -0
- package/dist/notes/git-notes.js.map +1 -0
- package/dist/schema/events.d.ts +224 -0
- package/dist/schema/events.d.ts.map +1 -0
- package/dist/schema/events.js +10 -0
- package/dist/schema/events.js.map +1 -0
- package/dist/security/developer-identity.d.ts +35 -0
- package/dist/security/developer-identity.d.ts.map +1 -0
- package/dist/security/developer-identity.js +105 -0
- package/dist/security/developer-identity.js.map +1 -0
- package/dist/security/keychain.d.ts +20 -0
- package/dist/security/keychain.d.ts.map +1 -0
- package/dist/security/keychain.js +167 -0
- package/dist/security/keychain.js.map +1 -0
- package/dist/verify/chain-verify.d.ts +43 -0
- package/dist/verify/chain-verify.d.ts.map +1 -0
- package/dist/verify/chain-verify.js +119 -0
- package/dist/verify/chain-verify.js.map +1 -0
- package/package.json +47 -0
|
@@ -0,0 +1,370 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Journal — the single writer.
|
|
3
|
+
*
|
|
4
|
+
* Responsibilities:
|
|
5
|
+
* 1. Accept events from adapters and the VSCode extension via UDS.
|
|
6
|
+
* 2. Assign monotonic seq, chain hash, HMAC-sign, fsync to segment.
|
|
7
|
+
* 3. Broadcast persisted events to subscribers (materializer, cloud shipper).
|
|
8
|
+
* 4. Maintain chain state in memory; persist head to chain/head.json atomically.
|
|
9
|
+
*
|
|
10
|
+
* Single-writer invariant: all appends go through this class.
|
|
11
|
+
* The UDS server (daemon.ts) serializes concurrent callers.
|
|
12
|
+
*/
|
|
13
|
+
import { mkdirSync, writeFileSync, readFileSync, renameSync, existsSync, appendFileSync, unlinkSync } from 'node:fs';
|
|
14
|
+
import { join } from 'node:path';
|
|
15
|
+
import { randomBytes } from 'node:crypto';
|
|
16
|
+
import { hostname } from 'node:os';
|
|
17
|
+
import { SegmentReader } from '../log/segment.js';
|
|
18
|
+
import { ZERO_HASH, hashEvent, loadOrCreateInstallKey, newNonce, signEvent, verifyEventSig, } from '../crypto/chain.js';
|
|
19
|
+
import { loadOrCreateInstallKeySecure } from '../security/keychain.js';
|
|
20
|
+
import { SegmentWriter } from '../log/segment.js';
|
|
21
|
+
import { Materializer } from '../materializer/db.js';
|
|
22
|
+
export function resolvePaths(journalRoot) {
|
|
23
|
+
return {
|
|
24
|
+
root: journalRoot,
|
|
25
|
+
keysDir: join(journalRoot, 'keys'),
|
|
26
|
+
segmentsDir: join(journalRoot, 'segments'),
|
|
27
|
+
indexDir: join(journalRoot, 'index'),
|
|
28
|
+
snapshotsDir: join(journalRoot, 'snapshots'),
|
|
29
|
+
chainDir: join(journalRoot, 'chain'),
|
|
30
|
+
dbPath: join(journalRoot, '..', 'materialized.db'),
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
export class Journal {
|
|
34
|
+
installKey;
|
|
35
|
+
installInfo;
|
|
36
|
+
chainState;
|
|
37
|
+
writer;
|
|
38
|
+
mat;
|
|
39
|
+
listeners = new Set();
|
|
40
|
+
paths;
|
|
41
|
+
batch = [];
|
|
42
|
+
batchTimer = null;
|
|
43
|
+
BATCH_DELAY_MS = 5;
|
|
44
|
+
BATCH_MAX = 64;
|
|
45
|
+
hardened;
|
|
46
|
+
constructor(journalRoot, workspace, opts = {}) {
|
|
47
|
+
const paths = resolvePaths(journalRoot);
|
|
48
|
+
this.paths = paths;
|
|
49
|
+
this.hardened = opts.hardened ?? false;
|
|
50
|
+
for (const dir of [
|
|
51
|
+
paths.root,
|
|
52
|
+
paths.keysDir,
|
|
53
|
+
paths.segmentsDir,
|
|
54
|
+
paths.indexDir,
|
|
55
|
+
paths.snapshotsDir,
|
|
56
|
+
paths.chainDir,
|
|
57
|
+
]) {
|
|
58
|
+
mkdirSync(dir, { recursive: true });
|
|
59
|
+
}
|
|
60
|
+
const installKeyPath = join(paths.keysDir, 'install.key');
|
|
61
|
+
if (this.hardened) {
|
|
62
|
+
// Hardened mode (org policy): the daemon is the sole key-holder. The key
|
|
63
|
+
// lives in the OS keychain (prompts the user once) and is NEVER mirrored to
|
|
64
|
+
// disk. Adapters connect without the key — the daemon brokers all signing.
|
|
65
|
+
// This is what makes the chain forgery-resistant at rest: a same-user
|
|
66
|
+
// process cannot read the key to rewrite history offline.
|
|
67
|
+
this.installKey = loadOrCreateInstallKeySecure(paths.keysDir);
|
|
68
|
+
// Remove any stale plaintext mirror left by a prior non-hardened run.
|
|
69
|
+
try {
|
|
70
|
+
if (existsSync(installKeyPath))
|
|
71
|
+
unlinkSync(installKeyPath);
|
|
72
|
+
}
|
|
73
|
+
catch { /* best-effort */ }
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
// Default (individual / non-hardened org): frictionless. Key on disk so
|
|
77
|
+
// local adapters can complete the key-based handshake with zero prompts.
|
|
78
|
+
this.installKey = loadOrCreateInstallKey(paths.keysDir);
|
|
79
|
+
writeFileSync(installKeyPath, this.installKey, { mode: 0o600 });
|
|
80
|
+
}
|
|
81
|
+
this.installInfo = this.loadOrCreateInstallInfo(workspace);
|
|
82
|
+
this.installInfo.hardened = this.hardened;
|
|
83
|
+
this.chainState = this.loadChainHead();
|
|
84
|
+
this.writer = new SegmentWriter(paths.segmentsDir);
|
|
85
|
+
this.mat = new Materializer(paths.dbPath);
|
|
86
|
+
// Replay any events the materializer hasn't seen
|
|
87
|
+
const lastMat = this.mat.lastAppliedSeq;
|
|
88
|
+
if (lastMat < this.chainState.seq) {
|
|
89
|
+
this.replaySince(lastMat + 1);
|
|
90
|
+
}
|
|
91
|
+
// Emit daemon-start marker
|
|
92
|
+
this.appendSync({ kind: 'system', tool: 'omnitype-daemon', user: this.installInfo.user, host: this.installInfo.host, workspace }, { type: 'Marker', kind: 'daemon-start' }, 'T0', 'omnitype-daemon');
|
|
93
|
+
}
|
|
94
|
+
// ─── Public API ────────────────────────────────────────────────────────────
|
|
95
|
+
append(actor, body, tier, adapterId, sync = false) {
|
|
96
|
+
// Intra-batch chaining (Day 1 fix §2.2): new event chains to last pending event
|
|
97
|
+
// in the batch, not to the last *flushed* hash, so intra-batch order is provable.
|
|
98
|
+
const prevInBatch = this.batch.length > 0
|
|
99
|
+
? hashEvent(this.batch[this.batch.length - 1])
|
|
100
|
+
: undefined;
|
|
101
|
+
const event = this.buildEvent(actor, body, tier, adapterId, prevInBatch);
|
|
102
|
+
if (sync) {
|
|
103
|
+
this.flushBatch([event]);
|
|
104
|
+
return event.seq;
|
|
105
|
+
}
|
|
106
|
+
this.batch.push(event);
|
|
107
|
+
if (this.batch.length >= this.BATCH_MAX) {
|
|
108
|
+
this.flushNow();
|
|
109
|
+
}
|
|
110
|
+
else if (!this.batchTimer) {
|
|
111
|
+
this.batchTimer = setTimeout(() => this.flushNow(), this.BATCH_DELAY_MS);
|
|
112
|
+
}
|
|
113
|
+
return event.seq;
|
|
114
|
+
}
|
|
115
|
+
appendSync(actor, body, tier, adapterId) {
|
|
116
|
+
return this.append(actor, body, tier, adapterId, true);
|
|
117
|
+
}
|
|
118
|
+
subscribe(listener) {
|
|
119
|
+
this.listeners.add(listener);
|
|
120
|
+
return () => this.listeners.delete(listener);
|
|
121
|
+
}
|
|
122
|
+
getChainHead() {
|
|
123
|
+
return { ...this.chainState };
|
|
124
|
+
}
|
|
125
|
+
getInstallInfo() {
|
|
126
|
+
return { ...this.installInfo };
|
|
127
|
+
}
|
|
128
|
+
getInstallKey() {
|
|
129
|
+
return this.installKey;
|
|
130
|
+
}
|
|
131
|
+
close() {
|
|
132
|
+
if (this.batchTimer)
|
|
133
|
+
clearTimeout(this.batchTimer);
|
|
134
|
+
this.flushNow();
|
|
135
|
+
this.writer.close();
|
|
136
|
+
this.mat.close();
|
|
137
|
+
}
|
|
138
|
+
// ─── Private ───────────────────────────────────────────────────────────────
|
|
139
|
+
buildEvent(actor, body, tier, adapterId, prevHashOverride) {
|
|
140
|
+
const seq = ++this.chainState.seq;
|
|
141
|
+
const header = {
|
|
142
|
+
v: 2,
|
|
143
|
+
seq,
|
|
144
|
+
ts: Date.now() * 1000, // µs
|
|
145
|
+
actor,
|
|
146
|
+
// Day 1 fix (§2.2): use override when chaining within a batch so every event
|
|
147
|
+
// in the batch chains to the previous event, not the batch-head's prev.
|
|
148
|
+
prev: prevHashOverride ?? this.chainState.lastHash,
|
|
149
|
+
nonce: newNonce(),
|
|
150
|
+
tier,
|
|
151
|
+
adapter_id: adapterId,
|
|
152
|
+
};
|
|
153
|
+
const sig = signEvent(this.installKey, header, body);
|
|
154
|
+
return { ...header, ...body, sig };
|
|
155
|
+
}
|
|
156
|
+
flushNow() {
|
|
157
|
+
if (this.batchTimer) {
|
|
158
|
+
clearTimeout(this.batchTimer);
|
|
159
|
+
this.batchTimer = null;
|
|
160
|
+
}
|
|
161
|
+
if (this.batch.length === 0)
|
|
162
|
+
return;
|
|
163
|
+
const toFlush = this.batch.splice(0);
|
|
164
|
+
this.flushBatch(toFlush);
|
|
165
|
+
}
|
|
166
|
+
flushBatch(events) {
|
|
167
|
+
this.writer.appendBatch(events);
|
|
168
|
+
const last = events[events.length - 1];
|
|
169
|
+
this.chainState.lastHash = hashEvent(last);
|
|
170
|
+
this.chainState.headTs = last.ts;
|
|
171
|
+
this.persistHead();
|
|
172
|
+
for (const event of events) {
|
|
173
|
+
this.mat.apply(event);
|
|
174
|
+
for (const listener of this.listeners) {
|
|
175
|
+
try {
|
|
176
|
+
listener(event);
|
|
177
|
+
}
|
|
178
|
+
catch { /* listener errors don't crash the daemon */ }
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
persistHead() {
|
|
183
|
+
const head = {
|
|
184
|
+
seq: this.chainState.seq,
|
|
185
|
+
hash: this.chainState.lastHash,
|
|
186
|
+
ts: this.chainState.headTs,
|
|
187
|
+
};
|
|
188
|
+
const tmp = join(this.paths.chainDir, 'head.json.tmp');
|
|
189
|
+
writeFileSync(tmp, JSON.stringify(head, null, 2), 'utf-8');
|
|
190
|
+
renameSync(tmp, join(this.paths.chainDir, 'head.json'));
|
|
191
|
+
}
|
|
192
|
+
loadChainHead() {
|
|
193
|
+
// Day 1 fix (§2.4): Always verify head.json against segments. If head.json is
|
|
194
|
+
// missing, corrupt, or older than the last segment record, rebuild from segments.
|
|
195
|
+
// This prevents silent seq=0 collision when head.json is zeroed/deleted.
|
|
196
|
+
try {
|
|
197
|
+
const headPath = join(this.paths.chainDir, 'head.json');
|
|
198
|
+
if (existsSync(headPath)) {
|
|
199
|
+
const h = JSON.parse(readFileSync(headPath, 'utf-8'));
|
|
200
|
+
if (typeof h.seq === 'number' && h.seq >= 0 && typeof h.hash === 'string') {
|
|
201
|
+
const fromSegment = this.scanSegmentHead();
|
|
202
|
+
// Trust head.json only if it is at least as recent as the segment tail
|
|
203
|
+
if (!fromSegment || h.seq >= fromSegment.seq) {
|
|
204
|
+
return { seq: h.seq, lastHash: h.hash, headTs: h.ts };
|
|
205
|
+
}
|
|
206
|
+
// head.json is stale — rebuild from segments
|
|
207
|
+
console.error('[omnitype-daemon] head.json is stale; rebuilding from segment scan');
|
|
208
|
+
return fromSegment;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
catch { /* fall through to segment scan */ }
|
|
213
|
+
const fromSegment = this.scanSegmentHead();
|
|
214
|
+
if (fromSegment) {
|
|
215
|
+
console.error('[omnitype-daemon] head.json missing/corrupt; rebuilt from segments');
|
|
216
|
+
return fromSegment;
|
|
217
|
+
}
|
|
218
|
+
return { seq: -1, lastHash: ZERO_HASH, headTs: 0 };
|
|
219
|
+
}
|
|
220
|
+
/** Scan all segments and return the head state from the last event. */
|
|
221
|
+
scanSegmentHead() {
|
|
222
|
+
let last = null;
|
|
223
|
+
try {
|
|
224
|
+
for (const event of SegmentReader.readAll(this.paths.segmentsDir)) {
|
|
225
|
+
last = { seq: event.seq, lastHash: hashEvent(event), headTs: event.ts };
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
catch { /* ignore read errors */ }
|
|
229
|
+
return last;
|
|
230
|
+
}
|
|
231
|
+
replaySince(fromSeq) {
|
|
232
|
+
// Verify HMAC sig + prev-hash continuity before applying.
|
|
233
|
+
// Tampered events are REJECTED (not applied) and recorded to chain/tamper.log.
|
|
234
|
+
// This protects the materialized DB from accepting forged history at startup.
|
|
235
|
+
let prevHash = ZERO_HASH;
|
|
236
|
+
let prevSeq = -1;
|
|
237
|
+
let tamperCount = 0;
|
|
238
|
+
for (const event of SegmentReader.readAll(this.paths.segmentsDir)) {
|
|
239
|
+
const evt = event;
|
|
240
|
+
const sigOk = verifyEventSig(this.installKey, evt);
|
|
241
|
+
if (!sigOk) {
|
|
242
|
+
this.recordTamper(evt.seq, 'hmac_failure');
|
|
243
|
+
tamperCount++;
|
|
244
|
+
continue; // do NOT apply
|
|
245
|
+
}
|
|
246
|
+
if (prevSeq >= 0 && event.prev !== prevHash) {
|
|
247
|
+
this.recordTamper(evt.seq, `prev_mismatch:expected=${prevHash.slice(0, 16)},got=${event.prev.slice(0, 16)}`);
|
|
248
|
+
tamperCount++;
|
|
249
|
+
// Resync chain pointer to this event so we can keep validating subsequent
|
|
250
|
+
// events (one bad event shouldn't cascade and reject the rest).
|
|
251
|
+
prevHash = hashEvent(evt);
|
|
252
|
+
prevSeq = event.seq;
|
|
253
|
+
continue; // do NOT apply
|
|
254
|
+
}
|
|
255
|
+
prevHash = hashEvent(evt);
|
|
256
|
+
prevSeq = event.seq;
|
|
257
|
+
if (event.seq >= fromSeq) {
|
|
258
|
+
this.mat.apply(evt);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
if (tamperCount > 0) {
|
|
262
|
+
console.error(`[omnitype-daemon] replay: ${tamperCount} tampered event(s) rejected — see chain/tamper.log`);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
recordTamper(seq, reason) {
|
|
266
|
+
try {
|
|
267
|
+
mkdirSync(this.paths.chainDir, { recursive: true });
|
|
268
|
+
appendFileSync(join(this.paths.chainDir, 'tamper.log'), JSON.stringify({ seq, reason, at: Date.now() }) + '\n', 'utf-8');
|
|
269
|
+
}
|
|
270
|
+
catch { /* best effort */ }
|
|
271
|
+
}
|
|
272
|
+
loadOrCreateInstallInfo(workspace) {
|
|
273
|
+
const infoPath = join(this.paths.root, 'install.json');
|
|
274
|
+
if (existsSync(infoPath)) {
|
|
275
|
+
try {
|
|
276
|
+
return JSON.parse(readFileSync(infoPath, 'utf-8'));
|
|
277
|
+
}
|
|
278
|
+
catch { /* recreate */ }
|
|
279
|
+
}
|
|
280
|
+
const info = {
|
|
281
|
+
install_id: randomBytes(16).toString('hex'),
|
|
282
|
+
user: process.env['USER'] ?? process.env['USERNAME'] ?? 'unknown',
|
|
283
|
+
host: hostname(),
|
|
284
|
+
workspace,
|
|
285
|
+
created_at: Date.now() * 1000,
|
|
286
|
+
protocol_version: '2.0',
|
|
287
|
+
};
|
|
288
|
+
writeFileSync(infoPath, JSON.stringify(info, null, 2), { encoding: 'utf-8', mode: 0o600 });
|
|
289
|
+
return info;
|
|
290
|
+
}
|
|
291
|
+
// ─── Adapter registration (Day 2: UDS handshake, Day 6: CapabilityClaim) ──
|
|
292
|
+
/**
|
|
293
|
+
* Called by DaemonServer when an adapter authenticates over UDS.
|
|
294
|
+
* Emits CapabilityClaim + AdapterInstalled events into the journal.
|
|
295
|
+
*/
|
|
296
|
+
registerAdapter(adapterId, capabilities, manifestSigVerified, runtimeMode) {
|
|
297
|
+
const actor = {
|
|
298
|
+
kind: 'system',
|
|
299
|
+
tool: 'omnitype-daemon',
|
|
300
|
+
user: this.installInfo.user,
|
|
301
|
+
host: this.installInfo.host,
|
|
302
|
+
workspace: this.installInfo.workspace,
|
|
303
|
+
};
|
|
304
|
+
// CapabilityClaim — tier observability (§3.3, §8.2)
|
|
305
|
+
this.appendSync(actor, {
|
|
306
|
+
type: 'CapabilityClaim',
|
|
307
|
+
adapter_id: adapterId,
|
|
308
|
+
capabilities,
|
|
309
|
+
tier_breakdown: this.computeTierBreakdown(capabilities),
|
|
310
|
+
}, 'T0', 'omnitype-daemon');
|
|
311
|
+
// AdapterInstalled
|
|
312
|
+
this.appendSync(actor, {
|
|
313
|
+
type: 'AdapterInstalled',
|
|
314
|
+
adapter_id: adapterId,
|
|
315
|
+
trust_circle: 3, // default; overridden by manifest when PKI verified
|
|
316
|
+
declared_capabilities: Object.keys(capabilities),
|
|
317
|
+
manifest_sig_verified: manifestSigVerified,
|
|
318
|
+
runtime_mode: runtimeMode,
|
|
319
|
+
}, 'T0', 'omnitype-daemon');
|
|
320
|
+
}
|
|
321
|
+
/**
|
|
322
|
+
* Emits a TierShift event when an adapter is downgraded at runtime.
|
|
323
|
+
* Called by the adapter loader when a capability becomes degraded. (Day 6: §3.3)
|
|
324
|
+
*/
|
|
325
|
+
emitTierShift(adapterId, fromTier, toTier, reason, capability) {
|
|
326
|
+
const actor = {
|
|
327
|
+
kind: 'system',
|
|
328
|
+
tool: 'omnitype-daemon',
|
|
329
|
+
user: this.installInfo.user,
|
|
330
|
+
host: this.installInfo.host,
|
|
331
|
+
workspace: this.installInfo.workspace,
|
|
332
|
+
};
|
|
333
|
+
this.appendSync(actor, {
|
|
334
|
+
type: 'TierShift',
|
|
335
|
+
adapter_id: adapterId,
|
|
336
|
+
from_tier: fromTier,
|
|
337
|
+
to_tier: toTier,
|
|
338
|
+
reason,
|
|
339
|
+
...(capability ? { capability } : {}),
|
|
340
|
+
}, 'T0', 'omnitype-daemon');
|
|
341
|
+
}
|
|
342
|
+
computeTierBreakdown(capabilities) {
|
|
343
|
+
const breakdown = {};
|
|
344
|
+
if (capabilities['integrity.in_process'] === 'available')
|
|
345
|
+
breakdown['integrity.in_process'] = 40;
|
|
346
|
+
if (capabilities['integrity.signed_events'] === 'available')
|
|
347
|
+
breakdown['integrity.signed_events'] = 30;
|
|
348
|
+
if (capabilities['operation.editOp.exact'] === 'available')
|
|
349
|
+
breakdown['operation.editOp.exact'] = 15;
|
|
350
|
+
if (capabilities['attest.process_ancestry'] === 'available')
|
|
351
|
+
breakdown['attest.process_ancestry'] = 10;
|
|
352
|
+
if (capabilities['hook.preToolUse'] === 'available')
|
|
353
|
+
breakdown['hook.preToolUse'] = 5;
|
|
354
|
+
return breakdown;
|
|
355
|
+
}
|
|
356
|
+
// ─── Materializer accessors (for IPC) ────────────────────────────────────
|
|
357
|
+
getSpans(path, minTier) {
|
|
358
|
+
return this.mat.getSpans(path, minTier);
|
|
359
|
+
}
|
|
360
|
+
getAttributionSummary(path) {
|
|
361
|
+
return this.mat.getAttributionSummary(path);
|
|
362
|
+
}
|
|
363
|
+
getConcurrencyConflicts(path) {
|
|
364
|
+
return this.mat.getConcurrencyConflicts(path);
|
|
365
|
+
}
|
|
366
|
+
getHighestTierAttestations(path) {
|
|
367
|
+
return this.mat.getHighestTierAttestations(path);
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
//# sourceMappingURL=journal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"journal.js","sourceRoot":"","sources":["../../src/daemon/journal.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unix Domain Socket server.
|
|
3
|
+
*
|
|
4
|
+
* Protocol: newline-delimited JSON over UDS (or named pipe on Windows).
|
|
5
|
+
* Each message: { type, id, payload }
|
|
6
|
+
* Each response: { type: "reply", id, ok, payload? }
|
|
7
|
+
*
|
|
8
|
+
* Message types the daemon accepts:
|
|
9
|
+
* append — write one event to the journal
|
|
10
|
+
* append_batch — write multiple events in one flush
|
|
11
|
+
* query_spans — read materialized spans for a file
|
|
12
|
+
* query_file — read file state
|
|
13
|
+
* query_health — get chain head + stats
|
|
14
|
+
* subscribe — register for live event push (streaming mode)
|
|
15
|
+
*/
|
|
16
|
+
import { Journal } from './journal.js';
|
|
17
|
+
import type { Actor, EventBody, Tier } from '../schema/events.js';
|
|
18
|
+
export interface DaemonMessage {
|
|
19
|
+
type: string;
|
|
20
|
+
id: string;
|
|
21
|
+
payload: unknown;
|
|
22
|
+
}
|
|
23
|
+
export interface DaemonReply {
|
|
24
|
+
type: 'reply';
|
|
25
|
+
id: string;
|
|
26
|
+
ok: boolean;
|
|
27
|
+
payload?: unknown;
|
|
28
|
+
error?: string;
|
|
29
|
+
}
|
|
30
|
+
export declare function getSocketPath(journalRoot: string): string;
|
|
31
|
+
export declare class DaemonServer {
|
|
32
|
+
private server;
|
|
33
|
+
private journal;
|
|
34
|
+
private subscribers;
|
|
35
|
+
private installKey;
|
|
36
|
+
private hardened;
|
|
37
|
+
private connState;
|
|
38
|
+
constructor(journal: Journal, socketPath: string, installKey: Buffer, hardened?: boolean);
|
|
39
|
+
private handleConnection;
|
|
40
|
+
private handleMessage;
|
|
41
|
+
private dispatch;
|
|
42
|
+
private send;
|
|
43
|
+
close(): Promise<void>;
|
|
44
|
+
}
|
|
45
|
+
export declare class JournalClient {
|
|
46
|
+
private socketPath;
|
|
47
|
+
private socket;
|
|
48
|
+
private pending;
|
|
49
|
+
private buf;
|
|
50
|
+
private idCounter;
|
|
51
|
+
constructor(socketPath: string);
|
|
52
|
+
connect(): Promise<void>;
|
|
53
|
+
/**
|
|
54
|
+
* Authenticate with the daemon using the per-adapter subkey. (Day 2: §1.1)
|
|
55
|
+
* Must be called after connect() and before any append calls.
|
|
56
|
+
* installKey is the 32-byte install key; adapterId is this adapter's ID.
|
|
57
|
+
*/
|
|
58
|
+
authenticate(installKey: Buffer, adapterId: string, opts?: {
|
|
59
|
+
capabilities?: Record<string, 'available' | 'degraded' | 'unavailable'>;
|
|
60
|
+
manifestSigVerified?: boolean;
|
|
61
|
+
runtimeMode?: 'co-process' | 'in-process' | 'out-of-process' | 'hook';
|
|
62
|
+
}): Promise<void>;
|
|
63
|
+
send<T = unknown>(type: string, payload: unknown): Promise<T>;
|
|
64
|
+
append(actor: Actor, body: EventBody, tier: Tier, adapterId: string, sync?: boolean): Promise<{
|
|
65
|
+
seq: number;
|
|
66
|
+
}>;
|
|
67
|
+
appendBatch(events: Array<{
|
|
68
|
+
actor: Actor;
|
|
69
|
+
body: EventBody;
|
|
70
|
+
tier: Tier;
|
|
71
|
+
}>, adapterId: string): Promise<{
|
|
72
|
+
seqs: number[];
|
|
73
|
+
}>;
|
|
74
|
+
querySpans(path: string, minTier?: Tier): Promise<{
|
|
75
|
+
spans: import("../schema/events.js").Span[];
|
|
76
|
+
}>;
|
|
77
|
+
health(): Promise<{
|
|
78
|
+
head: {
|
|
79
|
+
seq: number;
|
|
80
|
+
lastHash: string;
|
|
81
|
+
headTs: number;
|
|
82
|
+
};
|
|
83
|
+
install: import("../schema/events.js").InstallInfo;
|
|
84
|
+
}>;
|
|
85
|
+
disconnect(): void;
|
|
86
|
+
/** Check if the daemon is running without connecting. */
|
|
87
|
+
static isRunning(socketPath: string): Promise<boolean>;
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/daemon/server.ts"],"names":[],"mappings":"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"}
|