@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,224 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OmniType v2 canonical event schema.
|
|
3
|
+
*
|
|
4
|
+
* Design rules:
|
|
5
|
+
* - Every event is immutable once appended.
|
|
6
|
+
* - Probabilistic attribution is always tagged; no silent defaults to "ai".
|
|
7
|
+
* - Origin requires positive evidence; unknown is a valid (and honest) value.
|
|
8
|
+
*/
|
|
9
|
+
export type Bytes32 = string;
|
|
10
|
+
export type Bytes16 = string;
|
|
11
|
+
export type Bytes20 = string;
|
|
12
|
+
export type UnixMicros = number;
|
|
13
|
+
export type Origin = 'ai' | 'user' | 'paste' | 'tool' | 'external' | 'unknown';
|
|
14
|
+
export type Intent = 'type' | 'edit-tool' | 'format' | 'paste' | 'refactor' | 'import' | 'snippet' | 'undo' | 'redo' | 'git-checkout' | 'unknown';
|
|
15
|
+
/** Attribution confidence tier. T0 is deterministic; T3 is best-effort guess. */
|
|
16
|
+
export type Tier = 'T0' | 'T1' | 'T2' | 'T3';
|
|
17
|
+
export interface Actor {
|
|
18
|
+
kind: 'ai' | 'human' | 'tool' | 'system' | 'unknown';
|
|
19
|
+
tool: string;
|
|
20
|
+
tool_pid?: number;
|
|
21
|
+
tool_ppid?: number;
|
|
22
|
+
tool_path?: string;
|
|
23
|
+
model?: string;
|
|
24
|
+
session_id?: string;
|
|
25
|
+
user: string;
|
|
26
|
+
host: string;
|
|
27
|
+
workspace: string;
|
|
28
|
+
}
|
|
29
|
+
export interface Splice {
|
|
30
|
+
offset: number;
|
|
31
|
+
delete_len: number;
|
|
32
|
+
insert_text: string;
|
|
33
|
+
insert_blob?: Bytes32;
|
|
34
|
+
}
|
|
35
|
+
export type AttributionSignal = 'sentinel' | 'process-list' | 'lsp-client' | 'git' | 'formatter-config' | 'ide-host' | 'transcript' | 'none';
|
|
36
|
+
export interface ActorCandidate {
|
|
37
|
+
actor: Actor;
|
|
38
|
+
signal: AttributionSignal;
|
|
39
|
+
weight: number;
|
|
40
|
+
}
|
|
41
|
+
export interface EventHeader {
|
|
42
|
+
v: 2;
|
|
43
|
+
seq: number;
|
|
44
|
+
ts: UnixMicros;
|
|
45
|
+
actor: Actor;
|
|
46
|
+
prev: Bytes32;
|
|
47
|
+
nonce: Bytes16;
|
|
48
|
+
tier: Tier;
|
|
49
|
+
adapter_id: string;
|
|
50
|
+
sig: Bytes32;
|
|
51
|
+
}
|
|
52
|
+
export interface FileOpened {
|
|
53
|
+
type: 'FileOpened';
|
|
54
|
+
path: string;
|
|
55
|
+
blob_sha256: Bytes32;
|
|
56
|
+
line_count: number;
|
|
57
|
+
byte_count: number;
|
|
58
|
+
origin_seed: 'git' | 'fresh' | 'external';
|
|
59
|
+
git_blob?: Bytes20;
|
|
60
|
+
}
|
|
61
|
+
export interface EditOp {
|
|
62
|
+
type: 'EditOp';
|
|
63
|
+
path: string;
|
|
64
|
+
pre_hash: Bytes32;
|
|
65
|
+
post_hash: Bytes32;
|
|
66
|
+
ops: Splice[];
|
|
67
|
+
origin: Origin;
|
|
68
|
+
intent: Intent;
|
|
69
|
+
parent_intent?: number;
|
|
70
|
+
}
|
|
71
|
+
export interface EditConfirmed {
|
|
72
|
+
type: 'EditConfirmed';
|
|
73
|
+
path: string;
|
|
74
|
+
observed_hash: Bytes32;
|
|
75
|
+
edit_op_seq: number;
|
|
76
|
+
}
|
|
77
|
+
export interface UnattributedDelta {
|
|
78
|
+
type: 'UnattributedDelta';
|
|
79
|
+
path: string;
|
|
80
|
+
pre_hash: Bytes32;
|
|
81
|
+
post_hash: Bytes32;
|
|
82
|
+
ops?: Splice[];
|
|
83
|
+
delta_bytes?: number;
|
|
84
|
+
candidates?: ActorCandidate[];
|
|
85
|
+
confidence: number;
|
|
86
|
+
}
|
|
87
|
+
export interface SessionStarted {
|
|
88
|
+
type: 'SessionStarted';
|
|
89
|
+
session_id: string;
|
|
90
|
+
tool: string;
|
|
91
|
+
model: string;
|
|
92
|
+
prompt_hash: Bytes32;
|
|
93
|
+
prompt_bytes: number;
|
|
94
|
+
prompt_deferred?: boolean;
|
|
95
|
+
parent_session?: string;
|
|
96
|
+
}
|
|
97
|
+
export interface SessionEnded {
|
|
98
|
+
type: 'SessionEnded';
|
|
99
|
+
session_id: string;
|
|
100
|
+
reason: 'user' | 'timeout' | 'tool-exit';
|
|
101
|
+
}
|
|
102
|
+
export interface TxnBegin {
|
|
103
|
+
type: 'TxnBegin';
|
|
104
|
+
txn_id: Bytes16;
|
|
105
|
+
session_id: string;
|
|
106
|
+
expected_files: string[];
|
|
107
|
+
}
|
|
108
|
+
export interface TxnCommit {
|
|
109
|
+
type: 'TxnCommit';
|
|
110
|
+
txn_id: Bytes16;
|
|
111
|
+
event_seqs: number[];
|
|
112
|
+
}
|
|
113
|
+
export interface TxnAbort {
|
|
114
|
+
type: 'TxnAbort';
|
|
115
|
+
txn_id: Bytes16;
|
|
116
|
+
reason: string;
|
|
117
|
+
}
|
|
118
|
+
export interface ModelClaim {
|
|
119
|
+
type: 'ModelClaim';
|
|
120
|
+
session_id: string;
|
|
121
|
+
model: string;
|
|
122
|
+
source: 'sdk-call' | 'hook-stdin' | 'transcript' | 'config-file' | 'env' | 'inference';
|
|
123
|
+
}
|
|
124
|
+
export interface PromptCapture {
|
|
125
|
+
type: 'PromptCapture';
|
|
126
|
+
session_id: string;
|
|
127
|
+
prompt_id: string;
|
|
128
|
+
prompt_hash: Bytes32;
|
|
129
|
+
prompt_bytes: number;
|
|
130
|
+
prompt_text?: string;
|
|
131
|
+
privacy_marks: Array<'pii-suspected' | 'secret-detected'>;
|
|
132
|
+
client_scrubbed: boolean;
|
|
133
|
+
}
|
|
134
|
+
export interface CapabilityClaim {
|
|
135
|
+
type: 'CapabilityClaim';
|
|
136
|
+
adapter_id: string;
|
|
137
|
+
capabilities: Record<string, 'available' | 'degraded' | 'unavailable'>;
|
|
138
|
+
tier_breakdown: Record<string, number>;
|
|
139
|
+
}
|
|
140
|
+
export interface Marker {
|
|
141
|
+
type: 'Marker';
|
|
142
|
+
kind: 'undo' | 'redo' | 'format-on-save' | 'git-checkout' | 'workspace-snapshot' | 'rebase-start' | 'daemon-start' | 'daemon-stop';
|
|
143
|
+
detail?: string;
|
|
144
|
+
}
|
|
145
|
+
export interface TierShift {
|
|
146
|
+
type: 'TierShift';
|
|
147
|
+
adapter_id: string;
|
|
148
|
+
from_tier: Tier;
|
|
149
|
+
to_tier: Tier;
|
|
150
|
+
reason: string;
|
|
151
|
+
capability?: string;
|
|
152
|
+
}
|
|
153
|
+
export interface AttestationClaim {
|
|
154
|
+
type: 'AttestationClaim';
|
|
155
|
+
adapter_id: string;
|
|
156
|
+
path: string;
|
|
157
|
+
byte_start: number;
|
|
158
|
+
byte_end: number;
|
|
159
|
+
origin: Origin;
|
|
160
|
+
tier: Tier;
|
|
161
|
+
confidence: number;
|
|
162
|
+
basis: string;
|
|
163
|
+
}
|
|
164
|
+
export interface IntentOverride {
|
|
165
|
+
type: 'IntentOverride';
|
|
166
|
+
path: string;
|
|
167
|
+
original_seq: number;
|
|
168
|
+
new_intent: Intent;
|
|
169
|
+
detector: string;
|
|
170
|
+
}
|
|
171
|
+
export interface AdapterInstalled {
|
|
172
|
+
type: 'AdapterInstalled';
|
|
173
|
+
adapter_id: string;
|
|
174
|
+
trust_circle: number;
|
|
175
|
+
declared_capabilities: string[];
|
|
176
|
+
manifest_sig_verified: boolean;
|
|
177
|
+
runtime_mode: 'co-process' | 'in-process' | 'out-of-process' | 'hook';
|
|
178
|
+
}
|
|
179
|
+
export interface DevIdentity {
|
|
180
|
+
type: 'DevIdentity';
|
|
181
|
+
dev_key_fingerprint: string;
|
|
182
|
+
install_id: string;
|
|
183
|
+
enrolled_at: UnixMicros;
|
|
184
|
+
}
|
|
185
|
+
export interface Heartbeat {
|
|
186
|
+
type: 'Heartbeat';
|
|
187
|
+
head_seq: number;
|
|
188
|
+
head_hash: Bytes32;
|
|
189
|
+
}
|
|
190
|
+
export type EventBody = FileOpened | EditOp | EditConfirmed | UnattributedDelta | SessionStarted | SessionEnded | TxnBegin | TxnCommit | TxnAbort | ModelClaim | PromptCapture | CapabilityClaim | TierShift | AttestationClaim | IntentOverride | AdapterInstalled | DevIdentity | Marker | Heartbeat;
|
|
191
|
+
export type JournalEvent = EventHeader & EventBody;
|
|
192
|
+
export interface Span {
|
|
193
|
+
path: string;
|
|
194
|
+
byte_start: number;
|
|
195
|
+
byte_end: number;
|
|
196
|
+
origin: Origin;
|
|
197
|
+
actor: Actor;
|
|
198
|
+
seq_introduced: number;
|
|
199
|
+
seq_last_touched: number;
|
|
200
|
+
txn_id: Bytes16 | null;
|
|
201
|
+
tier: Tier;
|
|
202
|
+
confidence: number;
|
|
203
|
+
formatted: boolean;
|
|
204
|
+
}
|
|
205
|
+
export interface FileState {
|
|
206
|
+
path: string;
|
|
207
|
+
hash: Bytes32;
|
|
208
|
+
byte_count: number;
|
|
209
|
+
last_seq: number;
|
|
210
|
+
tracking_status: 'unknown' | 'tracked' | 'quarantined' | 'reconciling';
|
|
211
|
+
}
|
|
212
|
+
export interface InstallInfo {
|
|
213
|
+
install_id: string;
|
|
214
|
+
user: string;
|
|
215
|
+
host: string;
|
|
216
|
+
workspace: string;
|
|
217
|
+
created_at: UnixMicros;
|
|
218
|
+
protocol_version: '2.0';
|
|
219
|
+
org_id?: string | null;
|
|
220
|
+
auth_token?: string | null;
|
|
221
|
+
project_name?: string;
|
|
222
|
+
hardened?: boolean;
|
|
223
|
+
}
|
|
224
|
+
//# sourceMappingURL=events.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/schema/events.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OmniType v2 canonical event schema.
|
|
3
|
+
*
|
|
4
|
+
* Design rules:
|
|
5
|
+
* - Every event is immutable once appended.
|
|
6
|
+
* - Probabilistic attribution is always tagged; no silent defaults to "ai".
|
|
7
|
+
* - Origin requires positive evidence; unknown is a valid (and honest) value.
|
|
8
|
+
*/
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/schema/events.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-developer sub-identity enrollment. (Day 11: §10.5)
|
|
3
|
+
*
|
|
4
|
+
* Allows multiple developers sharing an OS account to have separate attribution
|
|
5
|
+
* identities. Each developer generates an Ed25519 keypair; the public key is
|
|
6
|
+
* registered with the install_id. The dev_key_fingerprint is included in all
|
|
7
|
+
* events emitted by that developer's session.
|
|
8
|
+
*
|
|
9
|
+
* Storage: ~/.omnitype/developer-keys/<fingerprint>.json (private key + metadata)
|
|
10
|
+
* The private key is additionally protected by OS keychain when available.
|
|
11
|
+
*/
|
|
12
|
+
export interface DeveloperKey {
|
|
13
|
+
fingerprint: string;
|
|
14
|
+
public_key_pem: string;
|
|
15
|
+
private_key_pem: string;
|
|
16
|
+
developer_name: string;
|
|
17
|
+
install_id: string;
|
|
18
|
+
enrolled_at: number;
|
|
19
|
+
}
|
|
20
|
+
export declare function devKeysDir(): string;
|
|
21
|
+
export declare function enrollDeveloper(installId: string, developerName?: string): DeveloperKey;
|
|
22
|
+
export declare function listEnrolledDevelopers(): DeveloperKey[];
|
|
23
|
+
export declare function loadDeveloperKey(fingerprint: string): DeveloperKey | null;
|
|
24
|
+
/** Sign arbitrary bytes with the developer's private key. */
|
|
25
|
+
export declare function signWithDevKey(key: DeveloperKey, data: Buffer): Buffer;
|
|
26
|
+
/** Verify a developer signature against the stored public key. */
|
|
27
|
+
export declare function verifyDevKeySignature(key: DeveloperKey, data: Buffer, signature: Buffer): boolean;
|
|
28
|
+
/**
|
|
29
|
+
* Get the active developer key for this process.
|
|
30
|
+
* If OMNITYPE_DEV_KEY env is set, use that fingerprint.
|
|
31
|
+
* If exactly one key is enrolled, use it automatically.
|
|
32
|
+
* Otherwise return null (fall back to OS-user identity).
|
|
33
|
+
*/
|
|
34
|
+
export declare function getActiveDeveloperKey(): DeveloperKey | null;
|
|
35
|
+
//# sourceMappingURL=developer-identity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"developer-identity.d.ts","sourceRoot":"","sources":["../../src/security/developer-identity.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAkBH,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB;AAID,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAaD,wBAAgB,eAAe,CAC7B,SAAS,EAAE,MAAM,EACjB,aAAa,CAAC,EAAE,MAAM,GACrB,YAAY,CAuBd;AAED,wBAAgB,sBAAsB,IAAI,YAAY,EAAE,CAYvD;AAED,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAQzE;AAED,6DAA6D;AAC7D,wBAAgB,cAAc,CAAC,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAItE;AAED,kEAAkE;AAClE,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,YAAY,EACjB,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,GAChB,OAAO,CAQT;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,IAAI,YAAY,GAAG,IAAI,CAO3D"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-developer sub-identity enrollment. (Day 11: §10.5)
|
|
3
|
+
*
|
|
4
|
+
* Allows multiple developers sharing an OS account to have separate attribution
|
|
5
|
+
* identities. Each developer generates an Ed25519 keypair; the public key is
|
|
6
|
+
* registered with the install_id. The dev_key_fingerprint is included in all
|
|
7
|
+
* events emitted by that developer's session.
|
|
8
|
+
*
|
|
9
|
+
* Storage: ~/.omnitype/developer-keys/<fingerprint>.json (private key + metadata)
|
|
10
|
+
* The private key is additionally protected by OS keychain when available.
|
|
11
|
+
*/
|
|
12
|
+
import { generateKeyPairSync, createSign, createVerify, createHash, } from 'node:crypto';
|
|
13
|
+
import { mkdirSync, readdirSync, readFileSync, writeFileSync, existsSync, } from 'node:fs';
|
|
14
|
+
import { join } from 'node:path';
|
|
15
|
+
import { homedir } from 'node:os';
|
|
16
|
+
const DEV_KEYS_DIR = join(homedir(), '.omnitype', 'developer-keys');
|
|
17
|
+
export function devKeysDir() {
|
|
18
|
+
return DEV_KEYS_DIR;
|
|
19
|
+
}
|
|
20
|
+
function fingerprintOf(publicKeyPem) {
|
|
21
|
+
const der = Buffer.from(publicKeyPem
|
|
22
|
+
.replace(/-----BEGIN PUBLIC KEY-----/, '')
|
|
23
|
+
.replace(/-----END PUBLIC KEY-----/, '')
|
|
24
|
+
.replace(/\s+/g, ''), 'base64');
|
|
25
|
+
return createHash('sha256').update(der).digest('hex').slice(0, 32);
|
|
26
|
+
}
|
|
27
|
+
export function enrollDeveloper(installId, developerName) {
|
|
28
|
+
mkdirSync(DEV_KEYS_DIR, { recursive: true, mode: 0o700 });
|
|
29
|
+
const { publicKey, privateKey } = generateKeyPairSync('ed25519', {
|
|
30
|
+
publicKeyEncoding: { type: 'spki', format: 'pem' },
|
|
31
|
+
privateKeyEncoding: { type: 'pkcs8', format: 'pem' },
|
|
32
|
+
});
|
|
33
|
+
const fingerprint = fingerprintOf(publicKey);
|
|
34
|
+
const name = developerName ?? process.env['USER'] ?? process.env['USERNAME'] ?? 'unknown';
|
|
35
|
+
const key = {
|
|
36
|
+
fingerprint,
|
|
37
|
+
public_key_pem: publicKey,
|
|
38
|
+
private_key_pem: privateKey,
|
|
39
|
+
developer_name: name,
|
|
40
|
+
install_id: installId,
|
|
41
|
+
enrolled_at: Date.now(),
|
|
42
|
+
};
|
|
43
|
+
const keyPath = join(DEV_KEYS_DIR, `${fingerprint}.json`);
|
|
44
|
+
writeFileSync(keyPath, JSON.stringify(key, null, 2), { mode: 0o600 });
|
|
45
|
+
return key;
|
|
46
|
+
}
|
|
47
|
+
export function listEnrolledDevelopers() {
|
|
48
|
+
if (!existsSync(DEV_KEYS_DIR))
|
|
49
|
+
return [];
|
|
50
|
+
return readdirSync(DEV_KEYS_DIR)
|
|
51
|
+
.filter((f) => f.endsWith('.json'))
|
|
52
|
+
.map((f) => {
|
|
53
|
+
try {
|
|
54
|
+
return JSON.parse(readFileSync(join(DEV_KEYS_DIR, f), 'utf-8'));
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
})
|
|
60
|
+
.filter((k) => k !== null);
|
|
61
|
+
}
|
|
62
|
+
export function loadDeveloperKey(fingerprint) {
|
|
63
|
+
const keyPath = join(DEV_KEYS_DIR, `${fingerprint}.json`);
|
|
64
|
+
if (!existsSync(keyPath))
|
|
65
|
+
return null;
|
|
66
|
+
try {
|
|
67
|
+
return JSON.parse(readFileSync(keyPath, 'utf-8'));
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/** Sign arbitrary bytes with the developer's private key. */
|
|
74
|
+
export function signWithDevKey(key, data) {
|
|
75
|
+
const signer = createSign('SHA256');
|
|
76
|
+
signer.update(data);
|
|
77
|
+
return signer.sign(key.private_key_pem);
|
|
78
|
+
}
|
|
79
|
+
/** Verify a developer signature against the stored public key. */
|
|
80
|
+
export function verifyDevKeySignature(key, data, signature) {
|
|
81
|
+
try {
|
|
82
|
+
const verifier = createVerify('SHA256');
|
|
83
|
+
verifier.update(data);
|
|
84
|
+
return verifier.verify(key.public_key_pem, signature);
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Get the active developer key for this process.
|
|
92
|
+
* If OMNITYPE_DEV_KEY env is set, use that fingerprint.
|
|
93
|
+
* If exactly one key is enrolled, use it automatically.
|
|
94
|
+
* Otherwise return null (fall back to OS-user identity).
|
|
95
|
+
*/
|
|
96
|
+
export function getActiveDeveloperKey() {
|
|
97
|
+
const envFingerprint = process.env['OMNITYPE_DEV_KEY'];
|
|
98
|
+
if (envFingerprint)
|
|
99
|
+
return loadDeveloperKey(envFingerprint);
|
|
100
|
+
const all = listEnrolledDevelopers();
|
|
101
|
+
if (all.length === 1)
|
|
102
|
+
return all[0];
|
|
103
|
+
return null;
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=developer-identity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"developer-identity.js","sourceRoot":"","sources":["../../src/security/developer-identity.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OS keychain integration for install key storage. (Day 3: §2.1)
|
|
3
|
+
*
|
|
4
|
+
* macOS — Keychain Services via `security` CLI (system-level, no dependency)
|
|
5
|
+
* Linux — Secret Service API via `secret-tool` if available; falls back to file
|
|
6
|
+
* Windows — DPAPI via PowerShell if available; falls back to file
|
|
7
|
+
*
|
|
8
|
+
* The fallback path (plain file) preserves backward compatibility for
|
|
9
|
+
* environments where OS keychain tools are not present. Installations
|
|
10
|
+
* that are enrolled in an org SHOULD always use the keychain path.
|
|
11
|
+
*/
|
|
12
|
+
export declare function keychainSupported(): boolean;
|
|
13
|
+
export declare function storeKeyInKeychain(key: Buffer): void;
|
|
14
|
+
export declare function loadKeyFromKeychain(): Buffer | null;
|
|
15
|
+
/**
|
|
16
|
+
* Load install key from keychain first; fall back to plain file.
|
|
17
|
+
* On first use, attempt to migrate the plain file key to keychain.
|
|
18
|
+
*/
|
|
19
|
+
export declare function loadOrCreateInstallKeySecure(keysDir: string): Buffer;
|
|
20
|
+
//# sourceMappingURL=keychain.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keychain.d.ts","sourceRoot":"","sources":["../../src/security/keychain.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAgHH,wBAAgB,iBAAiB,IAAI,OAAO,CAe3C;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAIpD;AAED,wBAAgB,mBAAmB,IAAI,MAAM,GAAG,IAAI,CAKnD;AAED;;;GAGG;AACH,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CA4BpE"}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OS keychain integration for install key storage. (Day 3: §2.1)
|
|
3
|
+
*
|
|
4
|
+
* macOS — Keychain Services via `security` CLI (system-level, no dependency)
|
|
5
|
+
* Linux — Secret Service API via `secret-tool` if available; falls back to file
|
|
6
|
+
* Windows — DPAPI via PowerShell if available; falls back to file
|
|
7
|
+
*
|
|
8
|
+
* The fallback path (plain file) preserves backward compatibility for
|
|
9
|
+
* environments where OS keychain tools are not present. Installations
|
|
10
|
+
* that are enrolled in an org SHOULD always use the keychain path.
|
|
11
|
+
*/
|
|
12
|
+
import { execSync } from 'node:child_process';
|
|
13
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';
|
|
14
|
+
import { join } from 'node:path';
|
|
15
|
+
import { randomBytes } from 'node:crypto';
|
|
16
|
+
const SERVICE = 'omnitype-journal';
|
|
17
|
+
const ACCOUNT = 'install-key';
|
|
18
|
+
// ─── macOS ────────────────────────────────────────────────────────────────────
|
|
19
|
+
function macosStore(key) {
|
|
20
|
+
const hex = key.toString('hex');
|
|
21
|
+
try {
|
|
22
|
+
execSync(`security add-generic-password -U -s ${SERVICE} -a ${ACCOUNT} -w ${hex}`, { stdio: 'pipe' });
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
// key may already exist; update it
|
|
26
|
+
try {
|
|
27
|
+
execSync(`security delete-generic-password -s ${SERVICE} -a ${ACCOUNT}`, { stdio: 'pipe' });
|
|
28
|
+
execSync(`security add-generic-password -s ${SERVICE} -a ${ACCOUNT} -w ${hex}`, { stdio: 'pipe' });
|
|
29
|
+
}
|
|
30
|
+
catch { /* ignore */ }
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
function macosLoad() {
|
|
34
|
+
try {
|
|
35
|
+
const hex = execSync(`security find-generic-password -s ${SERVICE} -a ${ACCOUNT} -w`, { encoding: 'utf-8' }).trim();
|
|
36
|
+
const buf = Buffer.from(hex, 'hex');
|
|
37
|
+
return buf.length === 32 ? buf : null;
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
// ─── Linux (Secret Service via secret-tool) ───────────────────────────────────
|
|
44
|
+
function linuxStore(key) {
|
|
45
|
+
const hex = key.toString('hex');
|
|
46
|
+
try {
|
|
47
|
+
execSync(`echo -n ${hex} | secret-tool store --label="OmniType install key" service ${SERVICE} account ${ACCOUNT}`, { stdio: 'pipe' });
|
|
48
|
+
}
|
|
49
|
+
catch { /* secret-tool not available */ }
|
|
50
|
+
}
|
|
51
|
+
function linuxLoad() {
|
|
52
|
+
try {
|
|
53
|
+
const hex = execSync(`secret-tool lookup service ${SERVICE} account ${ACCOUNT}`, { encoding: 'utf-8' }).trim();
|
|
54
|
+
const buf = Buffer.from(hex, 'hex');
|
|
55
|
+
return buf.length === 32 ? buf : null;
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
// ─── Windows (DPAPI via PowerShell) ───────────────────────────────────────────
|
|
62
|
+
function windowsStore(key) {
|
|
63
|
+
const hex = key.toString('hex');
|
|
64
|
+
const ps = `
|
|
65
|
+
Add-Type -AssemblyName System.Security;
|
|
66
|
+
$bytes = [System.Text.Encoding]::UTF8.GetBytes('${hex}');
|
|
67
|
+
$encrypted = [System.Security.Cryptography.ProtectedData]::Protect($bytes, $null, 'CurrentUser');
|
|
68
|
+
$b64 = [Convert]::ToBase64String($encrypted);
|
|
69
|
+
[System.IO.File]::WriteAllText('${process.env['LOCALAPPDATA']}\\omnitype-install.dpapi', $b64);
|
|
70
|
+
`;
|
|
71
|
+
try {
|
|
72
|
+
execSync(`powershell -NonInteractive -Command "${ps.replace(/\n\s*/g, ' ')}"`, { stdio: 'pipe' });
|
|
73
|
+
}
|
|
74
|
+
catch { /* DPAPI not available */ }
|
|
75
|
+
}
|
|
76
|
+
function windowsLoad() {
|
|
77
|
+
const dpapiPath = `${process.env['LOCALAPPDATA']}\\omnitype-install.dpapi`;
|
|
78
|
+
if (!existsSync(dpapiPath))
|
|
79
|
+
return null;
|
|
80
|
+
try {
|
|
81
|
+
const b64 = readFileSync(dpapiPath, 'utf-8').trim();
|
|
82
|
+
const ps = `
|
|
83
|
+
Add-Type -AssemblyName System.Security;
|
|
84
|
+
$encrypted = [Convert]::FromBase64String('${b64}');
|
|
85
|
+
$bytes = [System.Security.Cryptography.ProtectedData]::Unprotect($encrypted, $null, 'CurrentUser');
|
|
86
|
+
Write-Output ([System.Text.Encoding]::UTF8.GetString($bytes));
|
|
87
|
+
`;
|
|
88
|
+
const hex = execSync(`powershell -NonInteractive -Command "${ps.replace(/\n\s*/g, ' ')}"`, { stdio: ['pipe', 'pipe', 'pipe'] }).toString('utf-8').trim();
|
|
89
|
+
const buf = Buffer.from(hex, 'hex');
|
|
90
|
+
return buf.length === 32 ? buf : null;
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
return null;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
// ─── Public API ───────────────────────────────────────────────────────────────
|
|
97
|
+
export function keychainSupported() {
|
|
98
|
+
try {
|
|
99
|
+
if (process.platform === 'darwin') {
|
|
100
|
+
execSync('which security', { stdio: 'pipe' });
|
|
101
|
+
return true;
|
|
102
|
+
}
|
|
103
|
+
if (process.platform === 'linux') {
|
|
104
|
+
execSync('which secret-tool', { stdio: 'pipe' });
|
|
105
|
+
return true;
|
|
106
|
+
}
|
|
107
|
+
if (process.platform === 'win32') {
|
|
108
|
+
return !!process.env['LOCALAPPDATA'];
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
catch { /* tool not found */ }
|
|
112
|
+
return false;
|
|
113
|
+
}
|
|
114
|
+
export function storeKeyInKeychain(key) {
|
|
115
|
+
if (process.platform === 'darwin')
|
|
116
|
+
macosStore(key);
|
|
117
|
+
else if (process.platform === 'linux')
|
|
118
|
+
linuxStore(key);
|
|
119
|
+
else if (process.platform === 'win32')
|
|
120
|
+
windowsStore(key);
|
|
121
|
+
}
|
|
122
|
+
export function loadKeyFromKeychain() {
|
|
123
|
+
if (process.platform === 'darwin')
|
|
124
|
+
return macosLoad();
|
|
125
|
+
if (process.platform === 'linux')
|
|
126
|
+
return linuxLoad();
|
|
127
|
+
if (process.platform === 'win32')
|
|
128
|
+
return windowsLoad();
|
|
129
|
+
return null;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Load install key from keychain first; fall back to plain file.
|
|
133
|
+
* On first use, attempt to migrate the plain file key to keychain.
|
|
134
|
+
*/
|
|
135
|
+
export function loadOrCreateInstallKeySecure(keysDir) {
|
|
136
|
+
mkdirSync(keysDir, { recursive: true, mode: 0o700 });
|
|
137
|
+
const keyPath = join(keysDir, 'install.key');
|
|
138
|
+
// Try keychain first
|
|
139
|
+
const keychainKey = loadKeyFromKeychain();
|
|
140
|
+
if (keychainKey)
|
|
141
|
+
return keychainKey;
|
|
142
|
+
// Fall back to file
|
|
143
|
+
if (existsSync(keyPath)) {
|
|
144
|
+
const key = readFileSync(keyPath);
|
|
145
|
+
if (key.length !== 32)
|
|
146
|
+
throw new Error('install.key is corrupt — expected 32 bytes');
|
|
147
|
+
// Opportunistic migration to keychain
|
|
148
|
+
if (keychainSupported()) {
|
|
149
|
+
try {
|
|
150
|
+
storeKeyInKeychain(key);
|
|
151
|
+
}
|
|
152
|
+
catch { /* non-fatal: migration failure still allows file-based operation */ }
|
|
153
|
+
}
|
|
154
|
+
return key;
|
|
155
|
+
}
|
|
156
|
+
// Create fresh key
|
|
157
|
+
const key = randomBytes(32);
|
|
158
|
+
writeFileSync(keyPath, key, { mode: 0o600 });
|
|
159
|
+
if (keychainSupported()) {
|
|
160
|
+
try {
|
|
161
|
+
storeKeyInKeychain(key);
|
|
162
|
+
}
|
|
163
|
+
catch { /* non-fatal */ }
|
|
164
|
+
}
|
|
165
|
+
return key;
|
|
166
|
+
}
|
|
167
|
+
//# sourceMappingURL=keychain.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keychain.js","sourceRoot":"","sources":["../../src/security/keychain.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Chain integrity verifier.
|
|
3
|
+
*
|
|
4
|
+
* Streams all segment files in order and checks:
|
|
5
|
+
* 1. Monotonic seq — no gaps, no duplicates
|
|
6
|
+
* 2. prev pointer — each event's prev must equal SHA-256(previous event)
|
|
7
|
+
* 3. HMAC sig — re-derived from install.key must match stored sig
|
|
8
|
+
*
|
|
9
|
+
* Usage:
|
|
10
|
+
* omnitype-daemon verify [--from-seq N] [--to-seq M] [--report text|json]
|
|
11
|
+
*/
|
|
12
|
+
export interface VerifyOptions {
|
|
13
|
+
fromSeq?: number;
|
|
14
|
+
toSeq?: number;
|
|
15
|
+
report?: 'text' | 'json';
|
|
16
|
+
keysDir: string;
|
|
17
|
+
segmentsDir: string;
|
|
18
|
+
}
|
|
19
|
+
export interface VerifyResult {
|
|
20
|
+
ok: boolean;
|
|
21
|
+
total_verified: number;
|
|
22
|
+
first_seq: number;
|
|
23
|
+
last_seq: number;
|
|
24
|
+
first_ts: number;
|
|
25
|
+
last_ts: number;
|
|
26
|
+
gaps: Array<{
|
|
27
|
+
after_seq: number;
|
|
28
|
+
before_seq: number;
|
|
29
|
+
}>;
|
|
30
|
+
hmac_failures: Array<{
|
|
31
|
+
seq: number;
|
|
32
|
+
reason: string;
|
|
33
|
+
}>;
|
|
34
|
+
prev_mismatches: Array<{
|
|
35
|
+
seq: number;
|
|
36
|
+
expected: string;
|
|
37
|
+
got: string;
|
|
38
|
+
}>;
|
|
39
|
+
duration_ms: number;
|
|
40
|
+
}
|
|
41
|
+
export declare function verifyChain(opts: VerifyOptions): Promise<VerifyResult>;
|
|
42
|
+
export declare function formatVerifyResult(result: VerifyResult, format?: 'text' | 'json'): string;
|
|
43
|
+
//# sourceMappingURL=chain-verify.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chain-verify.d.ts","sourceRoot":"","sources":["../../src/verify/chain-verify.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAaH,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,OAAO,CAAC;IACZ,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,KAAK,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACvD,aAAa,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACtD,eAAe,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACvE,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,CAiE5E;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,GAAE,MAAM,GAAG,MAAe,GAAG,MAAM,CA+CjG"}
|