@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.
Files changed (69) hide show
  1. package/dist/blame/legacy.d.ts +24 -0
  2. package/dist/blame/legacy.d.ts.map +1 -0
  3. package/dist/blame/legacy.js +219 -0
  4. package/dist/blame/legacy.js.map +1 -0
  5. package/dist/blame/merge.d.ts +17 -0
  6. package/dist/blame/merge.d.ts.map +1 -0
  7. package/dist/blame/merge.js +32 -0
  8. package/dist/blame/merge.js.map +1 -0
  9. package/dist/cli.d.ts +7 -0
  10. package/dist/cli.d.ts.map +1 -0
  11. package/dist/cli.js +638 -0
  12. package/dist/cli.js.map +1 -0
  13. package/dist/cloud/anchor.d.ts +78 -0
  14. package/dist/cloud/anchor.d.ts.map +1 -0
  15. package/dist/cloud/anchor.js +220 -0
  16. package/dist/cloud/anchor.js.map +1 -0
  17. package/dist/cloud/pending.d.ts +29 -0
  18. package/dist/cloud/pending.d.ts.map +1 -0
  19. package/dist/cloud/pending.js +115 -0
  20. package/dist/cloud/pending.js.map +1 -0
  21. package/dist/cloud/shipper.d.ts +67 -0
  22. package/dist/cloud/shipper.d.ts.map +1 -0
  23. package/dist/cloud/shipper.js +177 -0
  24. package/dist/cloud/shipper.js.map +1 -0
  25. package/dist/crypto/chain.d.ts +19 -0
  26. package/dist/crypto/chain.d.ts.map +1 -0
  27. package/dist/crypto/chain.js +123 -0
  28. package/dist/crypto/chain.js.map +1 -0
  29. package/dist/daemon/journal.d.ts +92 -0
  30. package/dist/daemon/journal.d.ts.map +1 -0
  31. package/dist/daemon/journal.js +370 -0
  32. package/dist/daemon/journal.js.map +1 -0
  33. package/dist/daemon/server.d.ts +89 -0
  34. package/dist/daemon/server.d.ts.map +1 -0
  35. package/dist/daemon/server.js +323 -0
  36. package/dist/daemon/server.js.map +1 -0
  37. package/dist/index.d.ts +8 -0
  38. package/dist/index.d.ts.map +1 -0
  39. package/dist/index.js +9 -0
  40. package/dist/index.js.map +1 -0
  41. package/dist/log/segment.d.ts +43 -0
  42. package/dist/log/segment.d.ts.map +1 -0
  43. package/dist/log/segment.js +180 -0
  44. package/dist/log/segment.js.map +1 -0
  45. package/dist/materializer/db.d.ts +47 -0
  46. package/dist/materializer/db.d.ts.map +1 -0
  47. package/dist/materializer/db.js +385 -0
  48. package/dist/materializer/db.js.map +1 -0
  49. package/dist/notes/git-notes.d.ts +50 -0
  50. package/dist/notes/git-notes.d.ts.map +1 -0
  51. package/dist/notes/git-notes.js +94 -0
  52. package/dist/notes/git-notes.js.map +1 -0
  53. package/dist/schema/events.d.ts +224 -0
  54. package/dist/schema/events.d.ts.map +1 -0
  55. package/dist/schema/events.js +10 -0
  56. package/dist/schema/events.js.map +1 -0
  57. package/dist/security/developer-identity.d.ts +35 -0
  58. package/dist/security/developer-identity.d.ts.map +1 -0
  59. package/dist/security/developer-identity.js +105 -0
  60. package/dist/security/developer-identity.js.map +1 -0
  61. package/dist/security/keychain.d.ts +20 -0
  62. package/dist/security/keychain.d.ts.map +1 -0
  63. package/dist/security/keychain.js +167 -0
  64. package/dist/security/keychain.js.map +1 -0
  65. package/dist/verify/chain-verify.d.ts +43 -0
  66. package/dist/verify/chain-verify.d.ts.map +1 -0
  67. package/dist/verify/chain-verify.js +119 -0
  68. package/dist/verify/chain-verify.js.map +1 -0
  69. package/package.json +47 -0
@@ -0,0 +1,177 @@
1
+ /**
2
+ * CloudShipper — uploads pending journal events to the OmniType backend.
3
+ *
4
+ * Lifecycle:
5
+ * shipper = new CloudShipper(journal, installInfo, journalRoot);
6
+ * shipper.start(); // begins background loop
7
+ * await shipper.flush(); // manual trigger (e.g. from CLI `push` command)
8
+ * shipper.stop(); // graceful shutdown
9
+ *
10
+ * Gate: only org installs upload. Personal installs (org_id == null) are local-only.
11
+ *
12
+ * Retry policy:
13
+ * - Failed upload: retry after RETRY_DELAYS[attempt] seconds
14
+ * - Confirmed events are removed from PendingQueue immediately
15
+ * - On daemon restart, PendingQueue.load() re-queues un-confirmed events
16
+ */
17
+ import { promisify } from 'node:util';
18
+ import { gzip } from 'node:zlib';
19
+ import { PendingQueue } from './pending.js';
20
+ const gzipAsync = promisify(gzip);
21
+ const FLUSH_INTERVAL_MS = 30_000; // flush every 30s
22
+ const BATCH_MAX = 200; // events per upload
23
+ const RETRY_DELAYS_MS = [5_000, 30_000, 300_000]; // 5s, 30s, 5m
24
+ const INGEST_URL = 'https://api.imrishav.life/v2/journal/ingest';
25
+ export class CloudShipper {
26
+ journal;
27
+ install;
28
+ queue;
29
+ timer = null;
30
+ stopped = false;
31
+ flushInProgress = false;
32
+ url;
33
+ authToken;
34
+ orgId;
35
+ projectName;
36
+ installId;
37
+ allowPromptText;
38
+ unsubscribe;
39
+ constructor(journal, install, journalRoot, config = {}) {
40
+ this.journal = journal;
41
+ this.install = install;
42
+ this.queue = new PendingQueue(journalRoot);
43
+ this.url = config.ingestUrl ?? INGEST_URL;
44
+ this.authToken = config.authToken ?? process.env['OMNITYPE_TOKEN'] ?? '';
45
+ this.orgId = config.orgId ?? install.org_id ?? null;
46
+ this.projectName = config.projectName ?? install.project_name ?? 'default';
47
+ this.installId = install.install_id;
48
+ // Default OFF. Only true when the local user has explicitly enabled it.
49
+ this.allowPromptText = config.allowPromptText === true;
50
+ }
51
+ /**
52
+ * Strip fields that should never leave the developer's machine unless they
53
+ * have explicitly opted in. Currently scrubs PromptCapture.prompt_text.
54
+ * This is applied uniformly to every event before upload — there is no
55
+ * server-policy override path.
56
+ */
57
+ scrubForUpload(event) {
58
+ if (this.allowPromptText)
59
+ return event;
60
+ if (event.type !== 'PromptCapture')
61
+ return event;
62
+ const { prompt_text, ...rest } = event;
63
+ return rest;
64
+ }
65
+ start() {
66
+ if (!this.orgId) {
67
+ // Personal install — cloud sync disabled, nothing to do
68
+ return;
69
+ }
70
+ this.queue.load();
71
+ // Subscribe to new events
72
+ this.unsubscribe = this.journal.subscribe((evt) => {
73
+ this.queue.enqueue(evt);
74
+ });
75
+ // Periodic flush
76
+ this.timer = setInterval(() => {
77
+ if (!this.flushInProgress)
78
+ this.flush().catch(() => { });
79
+ }, FLUSH_INTERVAL_MS);
80
+ this.timer.unref();
81
+ // Initial flush for events that were pending before this start
82
+ if (this.queue.pendingCount > 0) {
83
+ this.flush().catch(() => { });
84
+ }
85
+ }
86
+ stop() {
87
+ this.stopped = true;
88
+ this.unsubscribe?.();
89
+ if (this.timer) {
90
+ clearInterval(this.timer);
91
+ this.timer = null;
92
+ }
93
+ }
94
+ async flush() {
95
+ if (!this.orgId || this.stopped) {
96
+ return { accepted: 0, skipped: 0, pending: 0 };
97
+ }
98
+ if (!this.authToken) {
99
+ return { accepted: 0, skipped: 0, pending: this.queue.pendingCount };
100
+ }
101
+ this.flushInProgress = true;
102
+ try {
103
+ return await this.uploadWithRetry();
104
+ }
105
+ finally {
106
+ this.flushInProgress = false;
107
+ }
108
+ }
109
+ async uploadWithRetry() {
110
+ const batch = this.queue.drain(BATCH_MAX);
111
+ if (batch.length === 0) {
112
+ return { accepted: 0, skipped: 0, pending: 0 };
113
+ }
114
+ let lastError = null;
115
+ for (let attempt = 0; attempt <= RETRY_DELAYS_MS.length; attempt++) {
116
+ if (this.stopped)
117
+ break;
118
+ try {
119
+ const result = await this.upload(batch);
120
+ const highestSeq = batch[batch.length - 1].seq;
121
+ this.queue.confirm(highestSeq);
122
+ return { ...result, pending: this.queue.pendingCount };
123
+ }
124
+ catch (err) {
125
+ lastError = err instanceof Error ? err : new Error(String(err));
126
+ const delay = RETRY_DELAYS_MS[attempt];
127
+ if (delay == null || this.stopped)
128
+ break;
129
+ await sleep(delay);
130
+ }
131
+ }
132
+ // All retries exhausted — log and leave in pending queue
133
+ console.error(`[omnitype-shipper] upload failed after retries: ${lastError?.message}`);
134
+ return { accepted: 0, skipped: 0, pending: this.queue.pendingCount };
135
+ }
136
+ async upload(events) {
137
+ // Scrub privacy-sensitive fields client-side before serialization.
138
+ const safeEvents = events.map((e) => this.scrubForUpload(e));
139
+ const body = JSON.stringify({
140
+ project_name: this.projectName,
141
+ install_id: this.installId,
142
+ events: safeEvents,
143
+ });
144
+ const compressed = await gzipAsync(Buffer.from(body, 'utf-8'));
145
+ const resp = await fetchWithTimeout(this.url, {
146
+ method: 'POST',
147
+ headers: {
148
+ 'Content-Type': 'application/json',
149
+ 'Content-Encoding': 'gzip',
150
+ 'Authorization': `Bearer ${this.authToken}`,
151
+ 'X-OmniType-Install': this.installId,
152
+ },
153
+ body: compressed,
154
+ }, 15_000);
155
+ if (!resp.ok) {
156
+ const text = await resp.text().catch(() => '');
157
+ throw new Error(`HTTP ${resp.status}: ${text.slice(0, 200)}`);
158
+ }
159
+ const json = await resp.json();
160
+ return { accepted: json.accepted ?? 0, skipped: json.skipped ?? 0 };
161
+ }
162
+ }
163
+ // ─── Helpers ──────────────────────────────────────────────────────────────────
164
+ function sleep(ms) {
165
+ return new Promise((r) => setTimeout(r, ms).unref());
166
+ }
167
+ async function fetchWithTimeout(url, init, timeoutMs) {
168
+ const controller = new AbortController();
169
+ const id = setTimeout(() => controller.abort(), timeoutMs);
170
+ try {
171
+ return await fetch(url, { ...init, signal: controller.signal });
172
+ }
173
+ finally {
174
+ clearTimeout(id);
175
+ }
176
+ }
177
+ //# sourceMappingURL=shipper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shipper.js","sourceRoot":"","sources":["../../src/cloud/shipper.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { Bytes16, Bytes32, EventBody, EventHeader } from '../schema/events.js';
2
+ export declare const ZERO_HASH: Bytes32;
3
+ export declare function loadOrCreateInstallKey(keysDir: string): Buffer;
4
+ export interface NoteSigningKey {
5
+ publicKeyPem: string;
6
+ privateKeyPem: string;
7
+ }
8
+ export declare function loadOrCreateNoteSigningKey(keysDir: string): NoteSigningKey;
9
+ export declare function signNote(noteSigningKey: NoteSigningKey, data: Buffer): Buffer;
10
+ export declare function verifyNote(noteSigningKey: NoteSigningKey, data: Buffer, sig: Buffer): boolean;
11
+ export declare function deriveAdapterSubkey(installKey: Buffer, adapterId: string): Buffer;
12
+ export declare function canonicalize(obj: Record<string, unknown>): Buffer;
13
+ export declare function signEvent(installKey: Buffer, header: Omit<EventHeader, 'sig'>, body: EventBody): Bytes32;
14
+ export declare function verifyEventSig(installKey: Buffer, event: EventHeader & EventBody): boolean;
15
+ export declare function hashEvent(event: EventHeader & EventBody): Bytes32;
16
+ export declare function newNonce(): Bytes16;
17
+ export declare function hashBytes(buf: Buffer | string): Bytes32;
18
+ export declare function hashFile(path: string): Bytes32;
19
+ //# sourceMappingURL=chain.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chain.d.ts","sourceRoot":"","sources":["../../src/crypto/chain.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAGpF,eAAO,MAAM,SAAS,EAAqB,OAAO,CAAC;AAInD,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE9D;AAID,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc,CAiB1E;AAED,wBAAgB,QAAQ,CAAC,cAAc,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAI7E;AAED,wBAAgB,UAAU,CAAC,cAAc,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAQ7F;AAED,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAIjF;AAQD,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAEjE;AAsCD,wBAAgB,SAAS,CACvB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,EAChC,IAAI,EAAE,SAAS,GACd,OAAO,CAGT;AAED,wBAAgB,cAAc,CAC5B,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,WAAW,GAAG,SAAS,GAC7B,OAAO,CAKT;AAID,wBAAgB,SAAS,CAAC,KAAK,EAAE,WAAW,GAAG,SAAS,GAAG,OAAO,CAGjE;AAID,wBAAgB,QAAQ,IAAI,OAAO,CAElC;AAID,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAIvD;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAO9C"}
@@ -0,0 +1,123 @@
1
+ import { createHmac, createHash, randomBytes, generateKeyPairSync, createSign, createVerify } from 'node:crypto';
2
+ import { readFileSync, writeFileSync, mkdirSync, existsSync } from 'node:fs';
3
+ import { join } from 'node:path';
4
+ import { loadOrCreateInstallKeySecure } from '../security/keychain.js';
5
+ export const ZERO_HASH = '0'.repeat(64);
6
+ // ─── Key management ───────────────────────────────────────────────────────────
7
+ export function loadOrCreateInstallKey(keysDir) {
8
+ return loadOrCreateInstallKeySecure(keysDir);
9
+ }
10
+ export function loadOrCreateNoteSigningKey(keysDir) {
11
+ mkdirSync(keysDir, { recursive: true, mode: 0o700 });
12
+ const pubPath = join(keysDir, 'notes.pub.pem');
13
+ const privPath = join(keysDir, 'notes.priv.pem');
14
+ if (existsSync(pubPath) && existsSync(privPath)) {
15
+ return {
16
+ publicKeyPem: readFileSync(pubPath, 'utf-8'),
17
+ privateKeyPem: readFileSync(privPath, 'utf-8'),
18
+ };
19
+ }
20
+ const { publicKey, privateKey } = generateKeyPairSync('ed25519', {
21
+ publicKeyEncoding: { type: 'spki', format: 'pem' },
22
+ privateKeyEncoding: { type: 'pkcs8', format: 'pem' },
23
+ });
24
+ writeFileSync(pubPath, publicKey, { mode: 0o644 });
25
+ writeFileSync(privPath, privateKey, { mode: 0o600 });
26
+ return { publicKeyPem: publicKey, privateKeyPem: privateKey };
27
+ }
28
+ export function signNote(noteSigningKey, data) {
29
+ const signer = createSign('SHA256');
30
+ signer.update(data);
31
+ return signer.sign(noteSigningKey.privateKeyPem);
32
+ }
33
+ export function verifyNote(noteSigningKey, data, sig) {
34
+ try {
35
+ const verifier = createVerify('SHA256');
36
+ verifier.update(data);
37
+ return verifier.verify(noteSigningKey.publicKeyPem, sig);
38
+ }
39
+ catch {
40
+ return false;
41
+ }
42
+ }
43
+ export function deriveAdapterSubkey(installKey, adapterId) {
44
+ return createHmac('sha256', installKey)
45
+ .update(`adapter-subkey:${adapterId}`)
46
+ .digest();
47
+ }
48
+ // ─── Canonical serialization (RFC 8785 JCS subset) ───────────────────────────
49
+ // Used for HMAC and hash computation. Must be deterministic across implementations.
50
+ // Day 7 fix (§2.3): float numbers use ES6 Number-to-String to guarantee cross-platform
51
+ // bit-identical output (IEEE 754 double, shortest representation via Grisu/Dragon4,
52
+ // same as V8/SpiderMonkey/JavaScriptCore for values in the finite range).
53
+ export function canonicalize(obj) {
54
+ return Buffer.from(jcsStringify(obj), 'utf-8');
55
+ }
56
+ function jcsStringify(val) {
57
+ if (val === null)
58
+ return 'null';
59
+ if (typeof val === 'boolean')
60
+ return val ? 'true' : 'false';
61
+ if (typeof val === 'number') {
62
+ if (!isFinite(val))
63
+ throw new Error(`JCS: non-finite number (${val}) cannot be canonicalized`);
64
+ // Integer check — avoids exponent form for whole numbers within safe range
65
+ if (Number.isInteger(val) && Math.abs(val) <= Number.MAX_SAFE_INTEGER) {
66
+ return val.toString();
67
+ }
68
+ // For floats: ES6 Number::toString gives the shortest round-trippable decimal.
69
+ // This is implementation-defined in the ES spec but identical across V8/SM/JSC/QuickJS
70
+ // for all IEEE-754 doubles — which is the JCS guarantee (RFC 8785 §3.2.2).
71
+ return val.toString();
72
+ }
73
+ if (typeof val === 'string')
74
+ return JSON.stringify(val);
75
+ if (Array.isArray(val)) {
76
+ return '[' + val.map(jcsStringify).join(',') + ']';
77
+ }
78
+ if (typeof val === 'object') {
79
+ const obj = val;
80
+ const keys = Object.keys(obj).sort();
81
+ const pairs = keys
82
+ .filter((k) => obj[k] !== undefined)
83
+ .map((k) => JSON.stringify(k) + ':' + jcsStringify(obj[k]));
84
+ return '{' + pairs.join(',') + '}';
85
+ }
86
+ throw new Error(`JCS: unsupported type ${typeof val}`);
87
+ }
88
+ // ─── Event signing ────────────────────────────────────────────────────────────
89
+ export function signEvent(installKey, header, body) {
90
+ const payload = canonicalize({ ...header, ...body });
91
+ return createHmac('sha256', installKey).update(payload).digest('hex');
92
+ }
93
+ export function verifyEventSig(installKey, event) {
94
+ const { sig, ...rest } = event;
95
+ const payload = canonicalize(rest);
96
+ const expected = createHmac('sha256', installKey).update(payload).digest('hex');
97
+ return expected === sig;
98
+ }
99
+ // ─── Chain hash ───────────────────────────────────────────────────────────────
100
+ export function hashEvent(event) {
101
+ const payload = canonicalize(event); // eslint-disable-line
102
+ return createHash('sha256').update(payload).digest('hex');
103
+ }
104
+ // ─── Nonce generation ─────────────────────────────────────────────────────────
105
+ export function newNonce() {
106
+ return randomBytes(16).toString('hex');
107
+ }
108
+ // ─── File content hash ────────────────────────────────────────────────────────
109
+ export function hashBytes(buf) {
110
+ return createHash('sha256')
111
+ .update(typeof buf === 'string' ? Buffer.from(buf, 'utf-8') : buf)
112
+ .digest('hex');
113
+ }
114
+ export function hashFile(path) {
115
+ try {
116
+ const buf = readFileSync(path);
117
+ return hashBytes(buf);
118
+ }
119
+ catch {
120
+ return ZERO_HASH;
121
+ }
122
+ }
123
+ //# sourceMappingURL=chain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chain.js","sourceRoot":"","sources":["../../src/crypto/chain.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,mBAAmB,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACjH,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,4BAA4B,EAAE,MAAM,yBAAyB,CAAC;AAEvE,MAAM,CAAC,MAAM,SAAS,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAY,CAAC;AAEnD,iFAAiF;AAEjF,MAAM,UAAU,sBAAsB,CAAC,OAAe;IACpD,OAAO,4BAA4B,CAAC,OAAO,CAAC,CAAC;AAC/C,CAAC;AASD,MAAM,UAAU,0BAA0B,CAAC,OAAe;IACxD,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACrD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;IAC/C,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;IACjD,IAAI,UAAU,CAAC,OAAO,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAChD,OAAO;YACL,YAAY,EAAE,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC;YAC5C,aAAa,EAAE,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC;SAC/C,CAAC;IACJ,CAAC;IACD,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,mBAAmB,CAAC,SAAS,EAAE;QAC/D,iBAAiB,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE;QAClD,kBAAkB,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE;KACrD,CAAC,CAAC;IACH,aAAa,CAAC,OAAO,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACnD,aAAa,CAAC,QAAQ,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACrD,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,UAAU,EAAE,CAAC;AAChE,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,cAA8B,EAAE,IAAY;IACnE,MAAM,MAAM,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;IACpC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACpB,OAAO,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,cAA8B,EAAE,IAAY,EAAE,GAAW;IAClF,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;QACxC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACtB,OAAO,QAAQ,CAAC,MAAM,CAAC,cAAc,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;IAC3D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,UAAkB,EAAE,SAAiB;IACvE,OAAO,UAAU,CAAC,QAAQ,EAAE,UAAU,CAAC;SACpC,MAAM,CAAC,kBAAkB,SAAS,EAAE,CAAC;SACrC,MAAM,EAAE,CAAC;AACd,CAAC;AAED,gFAAgF;AAChF,oFAAoF;AACpF,uFAAuF;AACvF,oFAAoF;AACpF,0EAA0E;AAE1E,MAAM,UAAU,YAAY,CAAC,GAA4B;IACvD,OAAO,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;AACjD,CAAC;AAED,SAAS,YAAY,CAAC,GAAY;IAChC,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,MAAM,CAAC;IAChC,IAAI,OAAO,GAAG,KAAK,SAAS;QAAE,OAAO,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;IAE5D,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC5B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,GAAG,2BAA2B,CAAC,CAAC;QAC/F,2EAA2E;QAC3E,IAAI,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,gBAAgB,EAAE,CAAC;YACtE,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC;QACxB,CAAC;QACD,+EAA+E;QAC/E,uFAAuF;QACvF,2EAA2E;QAC3E,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC;IACxB,CAAC;IAED,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IAExD,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;IACrD,CAAC;IAED,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC5B,MAAM,GAAG,GAAG,GAA8B,CAAC;QAC3C,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QACrC,MAAM,KAAK,GAAG,IAAI;aACf,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC;aACnC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9D,OAAO,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;IACrC,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,yBAAyB,OAAO,GAAG,EAAE,CAAC,CAAC;AACzD,CAAC;AAED,iFAAiF;AAEjF,MAAM,UAAU,SAAS,CACvB,UAAkB,EAClB,MAAgC,EAChC,IAAe;IAEf,MAAM,OAAO,GAAG,YAAY,CAAC,EAAE,GAAG,MAAM,EAAE,GAAG,IAAI,EAA6B,CAAC,CAAC;IAChF,OAAO,UAAU,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAY,CAAC;AACnF,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,UAAkB,EAClB,KAA8B;IAE9B,MAAM,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,GAAG,KAA2C,CAAC;IACrE,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAChF,OAAO,QAAQ,KAAK,GAAG,CAAC;AAC1B,CAAC;AAED,iFAAiF;AAEjF,MAAM,UAAU,SAAS,CAAC,KAA8B;IACtD,MAAM,OAAO,GAAG,YAAY,CAAC,KAA2C,CAAC,CAAC,CAAC,sBAAsB;IACjG,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAY,CAAC;AACvE,CAAC;AAED,iFAAiF;AAEjF,MAAM,UAAU,QAAQ;IACtB,OAAO,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAY,CAAC;AACpD,CAAC;AAED,iFAAiF;AAEjF,MAAM,UAAU,SAAS,CAAC,GAAoB;IAC5C,OAAO,UAAU,CAAC,QAAQ,CAAC;SACxB,MAAM,CAAC,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;SACjE,MAAM,CAAC,KAAK,CAAY,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,IAAY;IACnC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;QAC/B,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC"}
@@ -0,0 +1,92 @@
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 type { Actor, EventBody, InstallInfo, JournalEvent, Tier, Bytes32 } from '../schema/events.js';
14
+ export interface JournalPaths {
15
+ root: string;
16
+ keysDir: string;
17
+ segmentsDir: string;
18
+ indexDir: string;
19
+ snapshotsDir: string;
20
+ chainDir: string;
21
+ dbPath: string;
22
+ }
23
+ export declare function resolvePaths(journalRoot: string): JournalPaths;
24
+ interface ChainState {
25
+ seq: number;
26
+ lastHash: Bytes32;
27
+ headTs: number;
28
+ }
29
+ type EventListener = (event: JournalEvent) => void;
30
+ export declare class Journal {
31
+ private installKey;
32
+ private installInfo;
33
+ private chainState;
34
+ private writer;
35
+ private mat;
36
+ private listeners;
37
+ private paths;
38
+ private batch;
39
+ private batchTimer;
40
+ private readonly BATCH_DELAY_MS;
41
+ private readonly BATCH_MAX;
42
+ readonly hardened: boolean;
43
+ constructor(journalRoot: string, workspace: string, opts?: {
44
+ hardened?: boolean;
45
+ });
46
+ append(actor: Actor, body: EventBody, tier: Tier, adapterId: string, sync?: boolean): number;
47
+ appendSync(actor: Actor, body: EventBody, tier: Tier, adapterId: string): number;
48
+ subscribe(listener: EventListener): () => void;
49
+ getChainHead(): ChainState;
50
+ getInstallInfo(): InstallInfo;
51
+ getInstallKey(): Buffer;
52
+ close(): void;
53
+ private buildEvent;
54
+ private flushNow;
55
+ private flushBatch;
56
+ private persistHead;
57
+ private loadChainHead;
58
+ /** Scan all segments and return the head state from the last event. */
59
+ private scanSegmentHead;
60
+ private replaySince;
61
+ private recordTamper;
62
+ private loadOrCreateInstallInfo;
63
+ /**
64
+ * Called by DaemonServer when an adapter authenticates over UDS.
65
+ * Emits CapabilityClaim + AdapterInstalled events into the journal.
66
+ */
67
+ registerAdapter(adapterId: string, capabilities: Record<string, 'available' | 'degraded' | 'unavailable'>, manifestSigVerified: boolean, runtimeMode: 'co-process' | 'in-process' | 'out-of-process' | 'hook'): void;
68
+ /**
69
+ * Emits a TierShift event when an adapter is downgraded at runtime.
70
+ * Called by the adapter loader when a capability becomes degraded. (Day 6: §3.3)
71
+ */
72
+ emitTierShift(adapterId: string, fromTier: Tier, toTier: Tier, reason: string, capability?: string): void;
73
+ private computeTierBreakdown;
74
+ getSpans(path: string, minTier?: Tier): import("../schema/events.js").Span[];
75
+ getAttributionSummary(path: string): Record<import("../schema/events.js").Origin, number>;
76
+ getConcurrencyConflicts(path?: string): {
77
+ path: string;
78
+ conflicting_seq: number;
79
+ expected_hash: string;
80
+ actual_hash: string;
81
+ }[];
82
+ getHighestTierAttestations(path: string): {
83
+ byte_start: number;
84
+ byte_end: number;
85
+ origin: import("../schema/events.js").Origin;
86
+ tier: Tier;
87
+ confidence: number;
88
+ adapter_id: string;
89
+ }[];
90
+ }
91
+ export {};
92
+ //# sourceMappingURL=journal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"journal.d.ts","sourceRoot":"","sources":["../../src/daemon/journal.ts"],"names":[],"mappings":"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"}