tailii-host 0.1.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 (141) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +51 -0
  3. package/dist/apnsConfigStore.d.ts +22 -0
  4. package/dist/apnsConfigStore.js +50 -0
  5. package/dist/apnsConfigStore.js.map +1 -0
  6. package/dist/apnsJwtProvider.d.ts +50 -0
  7. package/dist/apnsJwtProvider.js +158 -0
  8. package/dist/apnsJwtProvider.js.map +1 -0
  9. package/dist/apnsSender.d.ts +69 -0
  10. package/dist/apnsSender.js +155 -0
  11. package/dist/apnsSender.js.map +1 -0
  12. package/dist/approvalPushNotifier.d.ts +100 -0
  13. package/dist/approvalPushNotifier.js +236 -0
  14. package/dist/approvalPushNotifier.js.map +1 -0
  15. package/dist/broker.d.ts +24 -0
  16. package/dist/broker.js +197 -0
  17. package/dist/broker.js.map +1 -0
  18. package/dist/chatTailController.d.ts +87 -0
  19. package/dist/chatTailController.js +292 -0
  20. package/dist/chatTailController.js.map +1 -0
  21. package/dist/claudeSessionStore.d.ts +15 -0
  22. package/dist/claudeSessionStore.js +201 -0
  23. package/dist/claudeSessionStore.js.map +1 -0
  24. package/dist/cli.d.ts +2 -0
  25. package/dist/cli.js +53 -0
  26. package/dist/cli.js.map +1 -0
  27. package/dist/codexRolloutTailer.d.ts +56 -0
  28. package/dist/codexRolloutTailer.js +303 -0
  29. package/dist/codexRolloutTailer.js.map +1 -0
  30. package/dist/codexSessionStore.d.ts +23 -0
  31. package/dist/codexSessionStore.js +274 -0
  32. package/dist/codexSessionStore.js.map +1 -0
  33. package/dist/codexUsage.d.ts +16 -0
  34. package/dist/codexUsage.js +144 -0
  35. package/dist/codexUsage.js.map +1 -0
  36. package/dist/deviceTokenStore.d.ts +38 -0
  37. package/dist/deviceTokenStore.js +73 -0
  38. package/dist/deviceTokenStore.js.map +1 -0
  39. package/dist/dirLister.d.ts +9 -0
  40. package/dist/dirLister.js +98 -0
  41. package/dist/dirLister.js.map +1 -0
  42. package/dist/doctor.d.ts +36 -0
  43. package/dist/doctor.js +162 -0
  44. package/dist/doctor.js.map +1 -0
  45. package/dist/engine.d.ts +85 -0
  46. package/dist/engine.js +962 -0
  47. package/dist/engine.js.map +1 -0
  48. package/dist/hook.d.ts +67 -0
  49. package/dist/hook.js +511 -0
  50. package/dist/hook.js.map +1 -0
  51. package/dist/hookSettings.d.ts +40 -0
  52. package/dist/hookSettings.js +128 -0
  53. package/dist/hookSettings.js.map +1 -0
  54. package/dist/idleReaper.d.ts +13 -0
  55. package/dist/idleReaper.js +30 -0
  56. package/dist/idleReaper.js.map +1 -0
  57. package/dist/imageService.d.ts +53 -0
  58. package/dist/imageService.js +280 -0
  59. package/dist/imageService.js.map +1 -0
  60. package/dist/kick.d.ts +8 -0
  61. package/dist/kick.js +60 -0
  62. package/dist/kick.js.map +1 -0
  63. package/dist/launch.d.ts +107 -0
  64. package/dist/launch.js +396 -0
  65. package/dist/launch.js.map +1 -0
  66. package/dist/legacyHomeMigration.d.ts +1 -0
  67. package/dist/legacyHomeMigration.js +23 -0
  68. package/dist/legacyHomeMigration.js.map +1 -0
  69. package/dist/lineWriter.d.ts +9 -0
  70. package/dist/lineWriter.js +19 -0
  71. package/dist/lineWriter.js.map +1 -0
  72. package/dist/mdnsAdvertiser.d.ts +46 -0
  73. package/dist/mdnsAdvertiser.js +268 -0
  74. package/dist/mdnsAdvertiser.js.map +1 -0
  75. package/dist/observationLog.d.ts +54 -0
  76. package/dist/observationLog.js +108 -0
  77. package/dist/observationLog.js.map +1 -0
  78. package/dist/pairingCode.d.ts +60 -0
  79. package/dist/pairingCode.js +282 -0
  80. package/dist/pairingCode.js.map +1 -0
  81. package/dist/paths.d.ts +13 -0
  82. package/dist/paths.js +46 -0
  83. package/dist/paths.js.map +1 -0
  84. package/dist/permissionMode.d.ts +8 -0
  85. package/dist/permissionMode.js +32 -0
  86. package/dist/permissionMode.js.map +1 -0
  87. package/dist/planUsageFetcher.d.ts +35 -0
  88. package/dist/planUsageFetcher.js +172 -0
  89. package/dist/planUsageFetcher.js.map +1 -0
  90. package/dist/protocol.d.ts +329 -0
  91. package/dist/protocol.js +544 -0
  92. package/dist/protocol.js.map +1 -0
  93. package/dist/pushTokenCommand.d.ts +9 -0
  94. package/dist/pushTokenCommand.js +85 -0
  95. package/dist/pushTokenCommand.js.map +1 -0
  96. package/dist/pushTypes.d.ts +41 -0
  97. package/dist/pushTypes.js +68 -0
  98. package/dist/pushTypes.js.map +1 -0
  99. package/dist/sendLog.d.ts +14 -0
  100. package/dist/sendLog.js +64 -0
  101. package/dist/sendLog.js.map +1 -0
  102. package/dist/sessionActivityProvider.d.ts +7 -0
  103. package/dist/sessionActivityProvider.js +44 -0
  104. package/dist/sessionActivityProvider.js.map +1 -0
  105. package/dist/sessionIdleTracker.d.ts +19 -0
  106. package/dist/sessionIdleTracker.js +42 -0
  107. package/dist/sessionIdleTracker.js.map +1 -0
  108. package/dist/sessionListService.d.ts +27 -0
  109. package/dist/sessionListService.js +85 -0
  110. package/dist/sessionListService.js.map +1 -0
  111. package/dist/sessionMetadataStore.d.ts +33 -0
  112. package/dist/sessionMetadataStore.js +122 -0
  113. package/dist/sessionMetadataStore.js.map +1 -0
  114. package/dist/sessionSearch.d.ts +29 -0
  115. package/dist/sessionSearch.js +139 -0
  116. package/dist/sessionSearch.js.map +1 -0
  117. package/dist/setup.d.ts +83 -0
  118. package/dist/setup.js +412 -0
  119. package/dist/setup.js.map +1 -0
  120. package/dist/sleep.d.ts +4 -0
  121. package/dist/sleep.js +25 -0
  122. package/dist/sleep.js.map +1 -0
  123. package/dist/socketPath.d.ts +12 -0
  124. package/dist/socketPath.js +51 -0
  125. package/dist/socketPath.js.map +1 -0
  126. package/dist/subagentTailer.d.ts +15 -0
  127. package/dist/subagentTailer.js +399 -0
  128. package/dist/subagentTailer.js.map +1 -0
  129. package/dist/tmux.d.ts +62 -0
  130. package/dist/tmux.js +163 -0
  131. package/dist/tmux.js.map +1 -0
  132. package/dist/transcriptTailer.d.ts +61 -0
  133. package/dist/transcriptTailer.js +606 -0
  134. package/dist/transcriptTailer.js.map +1 -0
  135. package/dist/usageAggregator.d.ts +12 -0
  136. package/dist/usageAggregator.js +55 -0
  137. package/dist/usageAggregator.js.map +1 -0
  138. package/dist/version.d.ts +10 -0
  139. package/dist/version.js +45 -0
  140. package/dist/version.js.map +1 -0
  141. package/package.json +50 -0
@@ -0,0 +1,46 @@
1
+ export interface DgramLikeSocket {
2
+ bind(port: number, address: string, callback?: () => void): void;
3
+ on(event: "message", listener: (message: Buffer, remote: unknown) => void): this;
4
+ on(event: "error", listener: (error: Error) => void): this;
5
+ send(message: Buffer, port: number, address: string): void;
6
+ addMembership(multicastAddress: string): void;
7
+ setMulticastTTL(ttl: number): void;
8
+ setMulticastLoopback(flag: boolean): void;
9
+ dropMembership?(multicastAddress: string): void;
10
+ close(): void;
11
+ }
12
+ export interface MdnsAdvertiseOptions {
13
+ instanceName: string;
14
+ hostname: string;
15
+ ipv4: string;
16
+ port: number;
17
+ txt?: string[];
18
+ ttlSeconds?: number;
19
+ socketFactory?: () => DgramLikeSocket;
20
+ }
21
+ export interface MdnsHandle {
22
+ stop(): void;
23
+ }
24
+ export interface DnsQuestion {
25
+ name: string;
26
+ type: number;
27
+ classCode: number;
28
+ }
29
+ export interface DnsResourceRecord {
30
+ name: string;
31
+ type: number;
32
+ classCode: number;
33
+ ttlSeconds: number;
34
+ rdata: Buffer;
35
+ }
36
+ export declare function startMdnsAdvertising(opts: MdnsAdvertiseOptions): MdnsHandle;
37
+ export declare function encodeName(name: string): Buffer;
38
+ export declare function encodeResourceRecord(record: DnsResourceRecord): Buffer;
39
+ export declare function buildResponsePacket(records: DnsResourceRecord[]): Buffer;
40
+ export declare function parseQuery(packet: Buffer): {
41
+ questions: DnsQuestion[];
42
+ } | null;
43
+ export declare function ptrRdata(instanceFqdn: string): Buffer;
44
+ export declare function srvRdata(port: number, targetFqdn: string): Buffer;
45
+ export declare function txtRdata(txt: string[]): Buffer;
46
+ export declare function aRdata(ipv4: string): Buffer;
@@ -0,0 +1,268 @@
1
+ // mdnsAdvertiser.ts
2
+ // pocketclaude (TS host) — zero-dependency mDNS/DNS-SD responder for setup --code discovery.
3
+ import * as dgram from "node:dgram";
4
+ const MDNS_ADDRESS = "224.0.0.251";
5
+ const MDNS_PORT = 5353;
6
+ const SERVICE_TYPE = "_pocketclaude-pair._tcp.local.";
7
+ const TYPE_A = 1;
8
+ const TYPE_PTR = 12;
9
+ const TYPE_TXT = 16;
10
+ const TYPE_SRV = 33;
11
+ const TYPE_ANY = 255;
12
+ const CLASS_IN = 1;
13
+ const CLASS_CACHE_FLUSH_IN = 0x8001;
14
+ const RESPONSE_FLAGS = 0x8400;
15
+ const DEFAULT_TTL_SECONDS = 120;
16
+ export function startMdnsAdvertising(opts) {
17
+ const names = makeNames(opts);
18
+ const socket = opts.socketFactory?.() ?? dgram.createSocket({ type: "udp4", reuseAddr: true });
19
+ const ttlSeconds = opts.ttlSeconds ?? DEFAULT_TTL_SECONDS;
20
+ const txt = opts.txt ?? ["v=1"];
21
+ const timers = [];
22
+ let stopped = false;
23
+ const sendRecords = (records) => {
24
+ if (stopped)
25
+ return;
26
+ safeCall(() => socket.send(buildResponsePacket(records), MDNS_PORT, MDNS_ADDRESS));
27
+ };
28
+ const sendAll = () => sendRecords(makeAllRecords(names, opts.port, opts.ipv4, txt, ttlSeconds));
29
+ socket.on("error", () => { });
30
+ socket.on("message", (message) => {
31
+ if (stopped)
32
+ return;
33
+ const query = parseQuery(message);
34
+ if (query === null)
35
+ return;
36
+ const records = recordsForQuestions(query.questions, names, opts.port, opts.ipv4, txt, ttlSeconds);
37
+ if (records.length > 0)
38
+ sendRecords(records);
39
+ });
40
+ socket.bind(MDNS_PORT, "0.0.0.0", () => {
41
+ if (stopped)
42
+ return;
43
+ safeCall(() => socket.addMembership(MDNS_ADDRESS));
44
+ safeCall(() => socket.setMulticastTTL(255));
45
+ safeCall(() => socket.setMulticastLoopback(true));
46
+ sendAll();
47
+ timers.push(setTimeout(sendAll, 1_000));
48
+ });
49
+ return {
50
+ stop() {
51
+ if (stopped)
52
+ return;
53
+ const goodbye = makePtrRecord(names.serviceName, names.instanceFqdn, 0);
54
+ safeCall(() => socket.send(buildResponsePacket([goodbye]), MDNS_PORT, MDNS_ADDRESS));
55
+ stopped = true;
56
+ for (const timer of timers)
57
+ clearTimeout(timer);
58
+ safeCall(() => socket.dropMembership?.(MDNS_ADDRESS));
59
+ safeCall(() => socket.close());
60
+ },
61
+ };
62
+ }
63
+ export function encodeName(name) {
64
+ const normalized = name.endsWith(".") ? name.slice(0, -1) : name;
65
+ if (normalized.length === 0)
66
+ return Buffer.from([0]);
67
+ const parts = normalized.split(".");
68
+ const chunks = [];
69
+ for (const part of parts) {
70
+ const bytes = Buffer.from(part, "utf8");
71
+ if (bytes.length < 1 || bytes.length > 63)
72
+ throw new Error("DNS label length must be 1..63 bytes");
73
+ chunks.push(Buffer.from([bytes.length]), bytes);
74
+ }
75
+ chunks.push(Buffer.from([0]));
76
+ return Buffer.concat(chunks);
77
+ }
78
+ export function encodeResourceRecord(record) {
79
+ const name = encodeName(record.name);
80
+ const header = Buffer.alloc(10);
81
+ header.writeUInt16BE(record.type, 0);
82
+ header.writeUInt16BE(record.classCode, 2);
83
+ header.writeUInt32BE(record.ttlSeconds, 4);
84
+ header.writeUInt16BE(record.rdata.length, 8);
85
+ return Buffer.concat([name, header, record.rdata]);
86
+ }
87
+ export function buildResponsePacket(records) {
88
+ const header = Buffer.alloc(12);
89
+ header.writeUInt16BE(0, 0);
90
+ header.writeUInt16BE(RESPONSE_FLAGS, 2);
91
+ header.writeUInt16BE(0, 4);
92
+ header.writeUInt16BE(records.length, 6);
93
+ header.writeUInt16BE(0, 8);
94
+ header.writeUInt16BE(0, 10);
95
+ return Buffer.concat([header, ...records.map(encodeResourceRecord)]);
96
+ }
97
+ export function parseQuery(packet) {
98
+ if (packet.length < 12)
99
+ return null;
100
+ const flags = packet.readUInt16BE(2);
101
+ if ((flags & 0x8000) !== 0)
102
+ return null;
103
+ const questionCount = packet.readUInt16BE(4);
104
+ const questions = [];
105
+ let offset = 12;
106
+ for (let i = 0; i < questionCount; i += 1) {
107
+ const parsed = readName(packet, offset);
108
+ if (parsed === null)
109
+ return null;
110
+ offset = parsed.nextOffset;
111
+ if (offset + 4 > packet.length)
112
+ return null;
113
+ questions.push({
114
+ name: parsed.name,
115
+ type: packet.readUInt16BE(offset),
116
+ classCode: packet.readUInt16BE(offset + 2),
117
+ });
118
+ offset += 4;
119
+ }
120
+ return { questions };
121
+ }
122
+ export function ptrRdata(instanceFqdn) {
123
+ return encodeName(instanceFqdn);
124
+ }
125
+ export function srvRdata(port, targetFqdn) {
126
+ const header = Buffer.alloc(6);
127
+ header.writeUInt16BE(0, 0);
128
+ header.writeUInt16BE(0, 2);
129
+ header.writeUInt16BE(port, 4);
130
+ return Buffer.concat([header, encodeName(targetFqdn)]);
131
+ }
132
+ export function txtRdata(txt) {
133
+ if (txt.length === 0)
134
+ return Buffer.from([0]);
135
+ const chunks = [];
136
+ for (const item of txt) {
137
+ const bytes = Buffer.from(item, "utf8");
138
+ if (bytes.length > 255)
139
+ throw new Error("TXT item length must fit in one byte");
140
+ chunks.push(Buffer.from([bytes.length]), bytes);
141
+ }
142
+ return Buffer.concat(chunks);
143
+ }
144
+ export function aRdata(ipv4) {
145
+ const parts = ipv4.split(".");
146
+ if (parts.length !== 4)
147
+ throw new Error("invalid IPv4 address");
148
+ return Buffer.from(parts.map((part) => {
149
+ if (!/^\d+$/.test(part))
150
+ throw new Error("invalid IPv4 address");
151
+ const value = Number(part);
152
+ if (!Number.isInteger(value) || value < 0 || value > 255)
153
+ throw new Error("invalid IPv4 address");
154
+ return value;
155
+ }));
156
+ }
157
+ function recordsForQuestions(questions, names, port, ipv4, txt, ttlSeconds) {
158
+ const records = new Map();
159
+ const add = (record) => {
160
+ records.set(`${record.name}|${record.type}`, record);
161
+ };
162
+ for (const question of questions) {
163
+ const name = canonicalName(question.name);
164
+ if (name === canonicalName(names.serviceName) && (question.type === TYPE_PTR || question.type === TYPE_ANY)) {
165
+ for (const record of makeAllRecords(names, port, ipv4, txt, ttlSeconds))
166
+ add(record);
167
+ }
168
+ else if (name === canonicalName(names.instanceFqdn)) {
169
+ if (question.type === TYPE_SRV || question.type === TYPE_ANY)
170
+ add(makeSrvRecord(names.instanceFqdn, port, names.targetFqdn, ttlSeconds));
171
+ if (question.type === TYPE_TXT || question.type === TYPE_ANY)
172
+ add(makeTxtRecord(names.instanceFqdn, txt, ttlSeconds));
173
+ }
174
+ else if (name === canonicalName(names.targetFqdn) && (question.type === TYPE_A || question.type === TYPE_ANY)) {
175
+ add(makeARecord(names.targetFqdn, ipv4, ttlSeconds));
176
+ }
177
+ }
178
+ return [...records.values()];
179
+ }
180
+ function makeAllRecords(names, port, ipv4, txt, ttlSeconds) {
181
+ return [
182
+ makePtrRecord(names.serviceName, names.instanceFqdn, ttlSeconds),
183
+ makeSrvRecord(names.instanceFqdn, port, names.targetFqdn, ttlSeconds),
184
+ makeTxtRecord(names.instanceFqdn, txt, ttlSeconds),
185
+ makeARecord(names.targetFqdn, ipv4, ttlSeconds),
186
+ ];
187
+ }
188
+ function makePtrRecord(serviceName, instanceFqdn, ttlSeconds) {
189
+ return { name: serviceName, type: TYPE_PTR, classCode: CLASS_IN, ttlSeconds, rdata: ptrRdata(instanceFqdn) };
190
+ }
191
+ function makeSrvRecord(instanceFqdn, port, targetFqdn, ttlSeconds) {
192
+ return { name: instanceFqdn, type: TYPE_SRV, classCode: CLASS_CACHE_FLUSH_IN, ttlSeconds, rdata: srvRdata(port, targetFqdn) };
193
+ }
194
+ function makeTxtRecord(instanceFqdn, txt, ttlSeconds) {
195
+ return { name: instanceFqdn, type: TYPE_TXT, classCode: CLASS_CACHE_FLUSH_IN, ttlSeconds, rdata: txtRdata(txt) };
196
+ }
197
+ function makeARecord(targetFqdn, ipv4, ttlSeconds) {
198
+ return { name: targetFqdn, type: TYPE_A, classCode: CLASS_CACHE_FLUSH_IN, ttlSeconds, rdata: aRdata(ipv4) };
199
+ }
200
+ function makeNames(opts) {
201
+ const hostname = stripLocalSuffix(opts.hostname);
202
+ return {
203
+ serviceName: SERVICE_TYPE,
204
+ instanceFqdn: `${opts.instanceName}.${SERVICE_TYPE}`,
205
+ targetFqdn: `${hostname}.local.`,
206
+ };
207
+ }
208
+ function stripLocalSuffix(hostname) {
209
+ return hostname.replace(/\.local\.?$/i, "");
210
+ }
211
+ function canonicalName(name) {
212
+ return (name.endsWith(".") ? name : `${name}.`).toLowerCase();
213
+ }
214
+ function readName(packet, startOffset) {
215
+ const labels = [];
216
+ let offset = startOffset;
217
+ let nextOffset = startOffset;
218
+ let jumped = false;
219
+ let jumps = 0;
220
+ while (true) {
221
+ if (offset >= packet.length)
222
+ return null;
223
+ const len = packet[offset];
224
+ if (len === undefined)
225
+ return null;
226
+ if ((len & 0xc0) === 0xc0) {
227
+ if (offset + 1 >= packet.length)
228
+ return null;
229
+ const second = packet[offset + 1];
230
+ if (second === undefined)
231
+ return null;
232
+ const pointer = ((len & 0x3f) << 8) | second;
233
+ if (pointer >= packet.length)
234
+ return null;
235
+ if (!jumped)
236
+ nextOffset = offset + 2;
237
+ jumped = true;
238
+ jumps += 1;
239
+ if (jumps > 16)
240
+ return null;
241
+ offset = pointer;
242
+ continue;
243
+ }
244
+ if ((len & 0xc0) !== 0)
245
+ return null;
246
+ offset += 1;
247
+ if (len === 0) {
248
+ if (!jumped)
249
+ nextOffset = offset;
250
+ return { name: labels.length === 0 ? "." : `${labels.join(".")}.`, nextOffset };
251
+ }
252
+ if (len > 63 || offset + len > packet.length)
253
+ return null;
254
+ labels.push(packet.subarray(offset, offset + len).toString("utf8"));
255
+ offset += len;
256
+ if (!jumped)
257
+ nextOffset = offset;
258
+ }
259
+ }
260
+ function safeCall(fn) {
261
+ try {
262
+ fn();
263
+ }
264
+ catch {
265
+ // mDNS failures must not break pairing.
266
+ }
267
+ }
268
+ //# sourceMappingURL=mdnsAdvertiser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mdnsAdvertiser.js","sourceRoot":"","sources":["../src/mdnsAdvertiser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ /** 観測ログに追記するイベント種別(Swift 版 ObsEvent と対)。 */
2
+ export type ObsEvent = {
3
+ kind: "sessionStarted";
4
+ cwd: string;
5
+ } | {
6
+ kind: "reattached";
7
+ } | {
8
+ kind: "sessionKilled";
9
+ } | {
10
+ kind: "approvalRequested";
11
+ id: string;
12
+ tool: string;
13
+ } | {
14
+ kind: "approvalDecided";
15
+ id: string;
16
+ decision: string;
17
+ } | {
18
+ kind: "toolExecuted";
19
+ id: string;
20
+ tool: string;
21
+ decision: string;
22
+ } | {
23
+ kind: "pushSent";
24
+ id: string;
25
+ tool: string;
26
+ } | {
27
+ kind: "pushSkipped";
28
+ id: string;
29
+ reason: string;
30
+ } | {
31
+ kind: "pushFailed";
32
+ id: string;
33
+ reason: string;
34
+ } | {
35
+ kind: "deviceTokenRegistered";
36
+ environment: string;
37
+ };
38
+ /** デフォルトのベースディレクトリ(`~/.tailii/audit`)。 */
39
+ export declare function defaultObservationBase(): string;
40
+ /** `ObservationLog` が投げる型付きエラー。 */
41
+ export declare class ObservationLogError extends Error {
42
+ readonly reason: "invalid-session-name" | "directory-creation-failed" | "append-failed";
43
+ constructor(reason: "invalid-session-name" | "directory-creation-failed" | "append-failed", detail: string);
44
+ }
45
+ /** Mac 側の観測/監査ログ(append-only NDJSON)。 */
46
+ export declare class ObservationLog {
47
+ private readonly base;
48
+ constructor(base?: string);
49
+ /**
50
+ * イベントを 1 行の NDJSON として追記する(append-only)。
51
+ * 時刻は決定性のため呼び出し側から Unix 秒(`at`)で渡す。
52
+ */
53
+ append(event: ObsEvent, session: string, at: number): void;
54
+ }
@@ -0,0 +1,108 @@
1
+ // observationLog.ts
2
+ // tailii (TS host) — Mac 側観測/監査ログ(append-only NDJSON)
3
+ // Swift 版 ObservationLog.swift の移植。1 イベント = 1 行を
4
+ // `<base>/<session>.ndjson` へ純追記する。イベント種別は `mac.*` 名前空間。
5
+ // 秘密(接続鍵・device token 値)を運ぶフィールドは型として存在しない。
6
+ import * as fs from "node:fs";
7
+ import * as os from "node:os";
8
+ import * as path from "node:path";
9
+ import { ensureDirectory0700 } from "./paths.js";
10
+ /** 直列化時の名前空間付きイベント種別名(iOS ミラーと区別可能)。 */
11
+ const OBS_TYPE = {
12
+ sessionStarted: "mac.session.started",
13
+ reattached: "mac.session.reattached",
14
+ sessionKilled: "mac.session.killed",
15
+ approvalRequested: "mac.approval.requested",
16
+ approvalDecided: "mac.approval.decided",
17
+ toolExecuted: "mac.tool.executed",
18
+ pushSent: "mac.push.sent",
19
+ pushSkipped: "mac.push.skipped",
20
+ pushFailed: "mac.push.failed",
21
+ deviceTokenRegistered: "mac.device.tokenRegistered",
22
+ };
23
+ /** デフォルトのベースディレクトリ(`~/.tailii/audit`)。 */
24
+ export function defaultObservationBase() {
25
+ return path.join(os.homedir(), ".tailii", "audit");
26
+ }
27
+ /** `ObservationLog` が投げる型付きエラー。 */
28
+ export class ObservationLogError extends Error {
29
+ reason;
30
+ constructor(reason, detail) {
31
+ super(`${reason}: ${detail}`);
32
+ this.reason = reason;
33
+ this.name = "ObservationLogError";
34
+ }
35
+ }
36
+ /** Mac 側の観測/監査ログ(append-only NDJSON)。 */
37
+ export class ObservationLog {
38
+ base;
39
+ constructor(base) {
40
+ this.base = base ?? defaultObservationBase();
41
+ }
42
+ /**
43
+ * イベントを 1 行の NDJSON として追記する(append-only)。
44
+ * 時刻は決定性のため呼び出し側から Unix 秒(`at`)で渡す。
45
+ */
46
+ append(event, session, at) {
47
+ validateSessionName(session);
48
+ try {
49
+ ensureDirectory0700(this.base);
50
+ }
51
+ catch (error) {
52
+ throw new ObservationLogError("directory-creation-failed", `${this.base}: ${String(error)}`);
53
+ }
54
+ const line = encodeLine(event, at);
55
+ const file = path.join(this.base, `${session}.ndjson`);
56
+ try {
57
+ fs.appendFileSync(file, line);
58
+ }
59
+ catch (error) {
60
+ throw new ObservationLogError("append-failed", `${file}: ${String(error)}`);
61
+ }
62
+ }
63
+ }
64
+ /** イベント 1 件を NDJSON 1 行(末尾 `\n` 付き)へ符号化する(キーは辞書順)。 */
65
+ function encodeLine(event, at) {
66
+ const record = { type: OBS_TYPE[event.kind], at };
67
+ switch (event.kind) {
68
+ case "sessionStarted":
69
+ record["cwd"] = event.cwd;
70
+ break;
71
+ case "reattached":
72
+ case "sessionKilled":
73
+ break;
74
+ case "approvalRequested":
75
+ case "pushSent":
76
+ record["id"] = event.id;
77
+ record["tool"] = event.tool;
78
+ break;
79
+ case "approvalDecided":
80
+ record["id"] = event.id;
81
+ record["decision"] = event.decision;
82
+ break;
83
+ case "toolExecuted":
84
+ record["id"] = event.id;
85
+ record["tool"] = event.tool;
86
+ record["decision"] = event.decision;
87
+ break;
88
+ case "pushSkipped":
89
+ case "pushFailed":
90
+ record["id"] = event.id;
91
+ record["reason"] = event.reason;
92
+ break;
93
+ case "deviceTokenRegistered":
94
+ record["environment"] = event.environment;
95
+ break;
96
+ }
97
+ const sorted = {};
98
+ for (const key of Object.keys(record).sort())
99
+ sorted[key] = record[key];
100
+ return JSON.stringify(sorted) + "\n";
101
+ }
102
+ /** session 名が安全かどうかを検証する(SocketPath の規約に合わせる)。 */
103
+ function validateSessionName(name) {
104
+ if (name.length === 0 || name.includes("\0") || name.includes("/") || name === "." || name === "..") {
105
+ throw new ObservationLogError("invalid-session-name", name);
106
+ }
107
+ }
108
+ //# sourceMappingURL=observationLog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observationLog.js","sourceRoot":"","sources":["../src/observationLog.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ import * as crypto from "node:crypto";
2
+ export interface PairingStream {
3
+ readable: NodeJS.ReadableStream;
4
+ writable: NodeJS.WritableStream;
5
+ }
6
+ export interface PairingResponderDeps {
7
+ payloadJSON: string;
8
+ displaySAS: (code: string) => void;
9
+ randomBytes?: (size: number) => Buffer;
10
+ timeoutMs?: number;
11
+ }
12
+ export type PairingResult = {
13
+ status: "paired";
14
+ } | {
15
+ status: "aborted";
16
+ reason: string;
17
+ };
18
+ export interface DerivedPairingKeys {
19
+ salt: Buffer;
20
+ sasCode: string;
21
+ confirmKey: Buffer;
22
+ dataKey: Buffer;
23
+ }
24
+ export type PairingMessage = {
25
+ t: "hello";
26
+ v: 1;
27
+ commit: string;
28
+ } | {
29
+ t: "server_key";
30
+ v: 1;
31
+ epk: string;
32
+ } | {
33
+ t: "reveal";
34
+ epk: string;
35
+ } | {
36
+ t: "confirm";
37
+ mac: string;
38
+ } | {
39
+ t: "payload";
40
+ iv: string;
41
+ ct: string;
42
+ tag: string;
43
+ };
44
+ export declare function rawX25519PublicKeyToKeyObject(raw32: Buffer): crypto.KeyObject;
45
+ export declare function x25519PublicKeyObjectToRaw(publicKey: crypto.KeyObject): Buffer;
46
+ export declare function hkdfSha256(ikm: Buffer, salt: Buffer, info: string, length: number): Buffer;
47
+ export declare function deriveSASCode(kSas4: Buffer): string;
48
+ export declare function pairingTranscriptSalt(commit32: Buffer, responderPubRaw32: Buffer, initiatorPubRaw32: Buffer): Buffer;
49
+ export declare function derivePairingKeys(sharedSecret32: Buffer, commit32: Buffer, responderPubRaw32: Buffer, initiatorPubRaw32: Buffer): DerivedPairingKeys;
50
+ export declare function computeInitiatorConfirmMac(confirmKey32: Buffer): Buffer;
51
+ export declare function encodePairingMessage(message: PairingMessage): string;
52
+ export declare function parsePairingMessage(line: string): PairingMessage | null;
53
+ export declare function decodeBase64Field(value: string, expectedLength: number): Buffer | null;
54
+ export declare function encryptPayload(dataKey32: Buffer, plaintext: Buffer, randomBytes: (size: number) => Buffer): {
55
+ iv: Buffer;
56
+ ciphertext: Buffer;
57
+ tag: Buffer;
58
+ };
59
+ export declare function decryptPayload(dataKey32: Buffer, iv12: Buffer, ciphertext: Buffer, tag16: Buffer): Buffer;
60
+ export declare function runPairingResponder(stream: PairingStream, deps: PairingResponderDeps): Promise<PairingResult>;