instar 0.27.2 → 0.28.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/.claude/skills/build/SKILL.md +268 -0
- package/README.md +2 -1
- package/dashboard/index.html +501 -491
- package/dist/cli.js +81 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +16 -9
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/listener.d.ts +46 -0
- package/dist/commands/listener.d.ts.map +1 -0
- package/dist/commands/listener.js +467 -0
- package/dist/commands/listener.js.map +1 -0
- package/dist/commands/server.d.ts.map +1 -1
- package/dist/commands/server.js +101 -3
- package/dist/commands/server.js.map +1 -1
- package/dist/commands/setup.d.ts.map +1 -1
- package/dist/commands/setup.js +84 -21
- package/dist/commands/setup.js.map +1 -1
- package/dist/core/AgentRegistry.d.ts.map +1 -1
- package/dist/core/AgentRegistry.js +30 -2
- package/dist/core/AgentRegistry.js.map +1 -1
- package/dist/core/PostUpdateMigrator.d.ts +2 -1
- package/dist/core/PostUpdateMigrator.d.ts.map +1 -1
- package/dist/core/PostUpdateMigrator.js +29 -28
- package/dist/core/PostUpdateMigrator.js.map +1 -1
- package/dist/core/types.d.ts +32 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/lifeline/TelegramLifeline.d.ts.map +1 -1
- package/dist/lifeline/TelegramLifeline.js +10 -2
- package/dist/lifeline/TelegramLifeline.js.map +1 -1
- package/dist/server/routes.d.ts.map +1 -1
- package/dist/server/routes.js +87 -0
- package/dist/server/routes.js.map +1 -1
- package/dist/threadline/PipeSessionSpawner.d.ts +123 -0
- package/dist/threadline/PipeSessionSpawner.d.ts.map +1 -0
- package/dist/threadline/PipeSessionSpawner.js +343 -0
- package/dist/threadline/PipeSessionSpawner.js.map +1 -0
- package/dist/threadline/ThreadResumeMap.d.ts +22 -0
- package/dist/threadline/ThreadResumeMap.d.ts.map +1 -1
- package/dist/threadline/ThreadResumeMap.js +37 -0
- package/dist/threadline/ThreadResumeMap.js.map +1 -1
- package/dist/threadline/ThreadlineBootstrap.d.ts.map +1 -1
- package/dist/threadline/ThreadlineBootstrap.js +155 -72
- package/dist/threadline/ThreadlineBootstrap.js.map +1 -1
- package/dist/threadline/WakeSocketServer.d.ts +49 -0
- package/dist/threadline/WakeSocketServer.d.ts.map +1 -0
- package/dist/threadline/WakeSocketServer.js +115 -0
- package/dist/threadline/WakeSocketServer.js.map +1 -0
- package/dist/threadline/listener-daemon.d.ts +94 -0
- package/dist/threadline/listener-daemon.d.ts.map +1 -0
- package/dist/threadline/listener-daemon.js +550 -0
- package/dist/threadline/listener-daemon.js.map +1 -0
- package/package.json +2 -1
- package/src/data/builtin-manifest.json +91 -91
- package/upgrades/0.28.0.md +54 -0
- package/upgrades/NEXT.md +35 -0
- /package/.claude/skills/autonomous/{skill.md → SKILL.md} +0 -0
- /package/.claude/skills/secret-setup/{skill.md → SKILL.md} +0 -0
- /package/.claude/skills/setup-wizard/{skill.md → SKILL.md} +0 -0
|
@@ -61,17 +61,87 @@ export async function bootstrapThreadline(config) {
|
|
|
61
61
|
// ── 5. Cloud Relay Connection (opt-in) ─────────────────────────
|
|
62
62
|
const relayEnabled = config.relayEnabled === true
|
|
63
63
|
|| process.env.THREADLINE_RELAY_ENABLED === 'true';
|
|
64
|
+
// Check if the standalone listener daemon should handle the relay connection.
|
|
65
|
+
// Three checks, in order:
|
|
66
|
+
// 1. Config says listener.enabled = true → always defer to daemon
|
|
67
|
+
// 2. Daemon PID file exists and process alive → defer
|
|
68
|
+
// 3. Health file shows recent activity (last 5 min) → defer (daemon may be restarting)
|
|
69
|
+
// This prevents the displacement race where the server briefly connects its own
|
|
70
|
+
// relay client during restart, displacing the daemon.
|
|
71
|
+
let daemonHandlingRelay = false;
|
|
72
|
+
if (relayEnabled) {
|
|
73
|
+
// Check 1: Config-level opt-in — if the user configured a daemon, always defer
|
|
74
|
+
const listenerConfigPath = path.join(config.stateDir, 'config.json');
|
|
75
|
+
let listenerConfigEnabled = false;
|
|
76
|
+
try {
|
|
77
|
+
if (fs.existsSync(listenerConfigPath)) {
|
|
78
|
+
const rawConfig = JSON.parse(fs.readFileSync(listenerConfigPath, 'utf-8'));
|
|
79
|
+
listenerConfigEnabled = rawConfig?.threadline?.listener?.enabled === true;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
catch { /* ignore parse errors */ }
|
|
83
|
+
// Check 2: Daemon PID file exists and process alive
|
|
84
|
+
const daemonPidPath = path.join(config.stateDir, 'listener-daemon.pid');
|
|
85
|
+
let daemonAlive = false;
|
|
86
|
+
if (fs.existsSync(daemonPidPath)) {
|
|
87
|
+
try {
|
|
88
|
+
const pid = parseInt(fs.readFileSync(daemonPidPath, 'utf-8').trim(), 10);
|
|
89
|
+
process.kill(pid, 0); // Check if process is alive (doesn't actually kill)
|
|
90
|
+
daemonAlive = true;
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
// PID file exists but process is dead — clean up stale PID
|
|
94
|
+
try {
|
|
95
|
+
fs.unlinkSync(daemonPidPath);
|
|
96
|
+
}
|
|
97
|
+
catch { /* ignore */ }
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
// Check 3: Health file shows recent activity (daemon may be restarting)
|
|
101
|
+
let recentHealth = false;
|
|
102
|
+
const healthPath = path.join(config.stateDir, 'listener-health.json');
|
|
103
|
+
if (fs.existsSync(healthPath)) {
|
|
104
|
+
try {
|
|
105
|
+
const healthMtime = fs.statSync(healthPath).mtimeMs;
|
|
106
|
+
const fiveMinAgo = Date.now() - 5 * 60 * 1000;
|
|
107
|
+
if (healthMtime > fiveMinAgo) {
|
|
108
|
+
const health = JSON.parse(fs.readFileSync(healthPath, 'utf-8'));
|
|
109
|
+
// Only count as recent if the daemon was previously connected (not just 'stopped')
|
|
110
|
+
if (health.state === 'connected' || health.state === 'authenticating' || health.state === 'connecting') {
|
|
111
|
+
recentHealth = true;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
catch { /* ignore */ }
|
|
116
|
+
}
|
|
117
|
+
if (daemonAlive) {
|
|
118
|
+
daemonHandlingRelay = true;
|
|
119
|
+
const pid = parseInt(fs.readFileSync(daemonPidPath, 'utf-8').trim(), 10);
|
|
120
|
+
console.log(`Threadline: listener daemon running (pid: ${pid}) — server will NOT connect to relay (daemon handles it)`);
|
|
121
|
+
}
|
|
122
|
+
else if (listenerConfigEnabled) {
|
|
123
|
+
daemonHandlingRelay = true;
|
|
124
|
+
console.log(`Threadline: listener daemon configured (threadline.listener.enabled=true) — server will NOT connect to relay (start daemon with: instar listener start)`);
|
|
125
|
+
}
|
|
126
|
+
else if (recentHealth) {
|
|
127
|
+
daemonHandlingRelay = true;
|
|
128
|
+
console.log(`Threadline: listener daemon was recently active — server will NOT connect to relay (daemon may be restarting)`);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
64
131
|
let relayClient;
|
|
65
132
|
let inboundGate;
|
|
66
133
|
let trustManager;
|
|
134
|
+
// Always create trust manager when relay is enabled — needed for processing
|
|
135
|
+
// inbox entries even when the daemon handles the relay connection.
|
|
136
|
+
if (relayEnabled) {
|
|
137
|
+
trustManager = new AgentTrustManager({ stateDir: config.stateDir });
|
|
138
|
+
}
|
|
67
139
|
if (relayEnabled) {
|
|
68
140
|
const relayUrl = config.relayUrl
|
|
69
141
|
?? process.env.THREADLINE_RELAY_URL
|
|
70
142
|
?? 'wss://threadline-relay.fly.dev/v1/connect';
|
|
71
|
-
|
|
72
|
-
//
|
|
73
|
-
trustManager = new AgentTrustManager({ stateDir: config.stateDir });
|
|
74
|
-
// Create relay client
|
|
143
|
+
// Always create relay client for outbound messages.
|
|
144
|
+
// When daemon handles inbound, we still need the client for sending.
|
|
75
145
|
relayClient = new ThreadlineClient({
|
|
76
146
|
name: config.agentName,
|
|
77
147
|
relayUrl,
|
|
@@ -86,80 +156,93 @@ export async function bootstrapThreadline(config) {
|
|
|
86
156
|
inboundGate = new InboundMessageGate(trustManager, null, {
|
|
87
157
|
maxPayloadBytes: 64 * 1024,
|
|
88
158
|
});
|
|
89
|
-
//
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
if (!inboundGate || !envelope)
|
|
102
|
-
return;
|
|
103
|
-
// Attempt to decode the base64 payload as plaintext JSON
|
|
104
|
-
let textContent;
|
|
105
|
-
let msgType;
|
|
106
|
-
try {
|
|
107
|
-
const payloadStr = Buffer.from(envelope.payload, 'base64').toString('utf-8');
|
|
108
|
-
const parsed = JSON.parse(payloadStr);
|
|
109
|
-
if (typeof parsed === 'object' && parsed !== null && 'text' in parsed) {
|
|
110
|
-
textContent = String(parsed.text);
|
|
111
|
-
msgType = parsed.type;
|
|
159
|
+
// Only wire inbound message handling and connect if daemon is NOT handling relay.
|
|
160
|
+
// When daemon handles inbound, the server only uses the relay client for outbound sends.
|
|
161
|
+
if (!daemonHandlingRelay) {
|
|
162
|
+
console.log(`Threadline: connecting to relay at ${relayUrl} (disable with THREADLINE_RELAY_ENABLED=false)`);
|
|
163
|
+
// Route inbound relay messages through the gate
|
|
164
|
+
relayClient.on('message', async (msg) => {
|
|
165
|
+
if (!inboundGate)
|
|
166
|
+
return;
|
|
167
|
+
const decision = await inboundGate.evaluate(msg);
|
|
168
|
+
if (decision.action === 'pass' && decision.message) {
|
|
169
|
+
// Gate passed — emit for ThreadlineRouter to handle
|
|
170
|
+
relayClient.emit('gate-passed', decision);
|
|
112
171
|
}
|
|
113
|
-
|
|
114
|
-
|
|
172
|
+
});
|
|
173
|
+
// Handle unknown senders — decode payload directly (relay-authenticated, not E2E encrypted)
|
|
174
|
+
relayClient.on('unknown-sender', async (envelope) => {
|
|
175
|
+
if (!inboundGate || !envelope)
|
|
176
|
+
return;
|
|
177
|
+
// Attempt to decode the base64 payload as plaintext JSON
|
|
178
|
+
let textContent;
|
|
179
|
+
let msgType;
|
|
180
|
+
try {
|
|
181
|
+
const payloadStr = Buffer.from(envelope.payload, 'base64').toString('utf-8');
|
|
182
|
+
const parsed = JSON.parse(payloadStr);
|
|
183
|
+
if (typeof parsed === 'object' && parsed !== null && 'text' in parsed) {
|
|
184
|
+
textContent = String(parsed.text);
|
|
185
|
+
msgType = parsed.type;
|
|
186
|
+
}
|
|
187
|
+
else if (typeof parsed === 'string') {
|
|
188
|
+
textContent = parsed;
|
|
189
|
+
}
|
|
190
|
+
else {
|
|
191
|
+
textContent = JSON.stringify(parsed);
|
|
192
|
+
}
|
|
115
193
|
}
|
|
116
|
-
|
|
117
|
-
textContent =
|
|
194
|
+
catch {
|
|
195
|
+
textContent = `[undecryptable relay message from ${String(envelope.from).slice(0, 16)}]`;
|
|
118
196
|
}
|
|
197
|
+
const received = {
|
|
198
|
+
from: String(envelope.from ?? 'unknown'),
|
|
199
|
+
fromName: String(envelope.from ?? 'unknown').slice(0, 8),
|
|
200
|
+
threadId: String(envelope.threadId ?? `relay-${Date.now()}`),
|
|
201
|
+
messageId: String(envelope.messageId ?? `msg-${Date.now()}`),
|
|
202
|
+
content: { content: textContent, type: msgType },
|
|
203
|
+
timestamp: String(envelope.timestamp ?? new Date().toISOString()),
|
|
204
|
+
envelope: envelope,
|
|
205
|
+
};
|
|
206
|
+
// Relay-authenticated unknown senders bypass the trust manager gate.
|
|
207
|
+
// The relay already verified their Ed25519 identity via challenge-response.
|
|
208
|
+
// We still run payload size checks but skip trust/rate checks.
|
|
209
|
+
const payloadSize = Buffer.byteLength(JSON.stringify(received.content), 'utf-8');
|
|
210
|
+
if (payloadSize > 64 * 1024) {
|
|
211
|
+
console.log(`Threadline: relay message from ${received.from.slice(0, 8)} blocked (payload too large: ${payloadSize})`);
|
|
212
|
+
return;
|
|
213
|
+
}
|
|
214
|
+
// Record the interaction for trust building
|
|
215
|
+
trustManager.recordMessageReceivedByFingerprint(received.from);
|
|
216
|
+
// Emit gate-passed with relay-authenticated trust level
|
|
217
|
+
relayClient.emit('gate-passed', {
|
|
218
|
+
action: 'pass',
|
|
219
|
+
reason: 'relay-authenticated',
|
|
220
|
+
trustLevel: 'verified',
|
|
221
|
+
fingerprint: received.from,
|
|
222
|
+
message: received,
|
|
223
|
+
});
|
|
224
|
+
});
|
|
225
|
+
// Log auto-discovery results
|
|
226
|
+
relayClient.on('auto-discovered', (info) => {
|
|
227
|
+
console.log(`Threadline: auto-discovered ${info.count} agent(s) on relay`);
|
|
228
|
+
});
|
|
229
|
+
try {
|
|
230
|
+
await relayClient.connect();
|
|
231
|
+
console.log(`Threadline: relay connected (fingerprint: ${relayClient.fingerprint})`);
|
|
119
232
|
}
|
|
120
|
-
catch {
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
from: String(envelope.from ?? 'unknown'),
|
|
125
|
-
fromName: String(envelope.from ?? 'unknown').slice(0, 8),
|
|
126
|
-
threadId: String(envelope.threadId ?? `relay-${Date.now()}`),
|
|
127
|
-
messageId: String(envelope.messageId ?? `msg-${Date.now()}`),
|
|
128
|
-
content: { content: textContent, type: msgType },
|
|
129
|
-
timestamp: String(envelope.timestamp ?? new Date().toISOString()),
|
|
130
|
-
envelope: envelope,
|
|
131
|
-
};
|
|
132
|
-
// Relay-authenticated unknown senders bypass the trust manager gate.
|
|
133
|
-
// The relay already verified their Ed25519 identity via challenge-response.
|
|
134
|
-
// We still run payload size checks but skip trust/rate checks.
|
|
135
|
-
const payloadSize = Buffer.byteLength(JSON.stringify(received.content), 'utf-8');
|
|
136
|
-
if (payloadSize > 64 * 1024) {
|
|
137
|
-
console.log(`Threadline: relay message from ${received.from.slice(0, 8)} blocked (payload too large: ${payloadSize})`);
|
|
138
|
-
return;
|
|
233
|
+
catch (err) {
|
|
234
|
+
console.error(`Threadline: relay connection failed — ${err instanceof Error ? err.message : err}`);
|
|
235
|
+
console.log('Threadline: agent will operate in local-only mode');
|
|
236
|
+
relayClient = undefined;
|
|
139
237
|
}
|
|
140
|
-
// Record the interaction for trust building
|
|
141
|
-
trustManager.recordMessageReceivedByFingerprint(received.from);
|
|
142
|
-
// Emit gate-passed with relay-authenticated trust level
|
|
143
|
-
relayClient.emit('gate-passed', {
|
|
144
|
-
action: 'pass',
|
|
145
|
-
reason: 'relay-authenticated',
|
|
146
|
-
trustLevel: 'verified',
|
|
147
|
-
fingerprint: received.from,
|
|
148
|
-
message: received,
|
|
149
|
-
});
|
|
150
|
-
});
|
|
151
|
-
// Log auto-discovery results
|
|
152
|
-
relayClient.on('auto-discovered', (info) => {
|
|
153
|
-
console.log(`Threadline: auto-discovered ${info.count} agent(s) on relay`);
|
|
154
|
-
});
|
|
155
|
-
try {
|
|
156
|
-
await relayClient.connect();
|
|
157
|
-
console.log(`Threadline: relay connected (fingerprint: ${relayClient.fingerprint})`);
|
|
158
238
|
}
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
239
|
+
else {
|
|
240
|
+
// Daemon handles the relay connection (both inbound and outbound).
|
|
241
|
+
// The server's relay client is NOT connected — outbound messages are
|
|
242
|
+
// sent by the daemon via a file-based outbox or via sessions using
|
|
243
|
+
// the threadline_send MCP tool (which connects its own stdio subprocess).
|
|
244
|
+
// The relay client object exists but is not connected.
|
|
245
|
+
console.log(`Threadline: daemon handles relay — server relay client not connected (outbound via MCP tools)`);
|
|
163
246
|
}
|
|
164
247
|
}
|
|
165
248
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ThreadlineBootstrap.js","sourceRoot":"","sources":["../../src/threadline/ThreadlineBootstrap.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ThreadlineBootstrap.js","sourceRoot":"","sources":["../../src/threadline/ThreadlineBootstrap.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WakeSocketServer — Server-side Unix domain socket that receives
|
|
3
|
+
* wake signals from the listener daemon.
|
|
4
|
+
*
|
|
5
|
+
* Part of RFC: Persistent Listener Daemon Architecture (Phase 1).
|
|
6
|
+
*
|
|
7
|
+
* The daemon sends a 1-byte signal (\x01) when a new inbox entry is written.
|
|
8
|
+
* The server picks this up immediately (event-driven, no polling) and routes
|
|
9
|
+
* the message via ThreadlineRouter.
|
|
10
|
+
*
|
|
11
|
+
* Security:
|
|
12
|
+
* - Socket created with 0600 permissions (owner only)
|
|
13
|
+
* - Peer credentials verified via SO_PEERCRED (Linux) / LOCAL_PEERCRED (macOS)
|
|
14
|
+
* - Socket path resolved via fs.realpathSync() to prevent symlink attacks
|
|
15
|
+
*/
|
|
16
|
+
import { EventEmitter } from 'node:events';
|
|
17
|
+
export interface WakeSocketEvents {
|
|
18
|
+
/** New inbox entry available */
|
|
19
|
+
wake: () => void;
|
|
20
|
+
/** Peer agent disconnected — evaluate failover */
|
|
21
|
+
'failover-trigger': () => void;
|
|
22
|
+
error: (err: Error) => void;
|
|
23
|
+
'client-connected': () => void;
|
|
24
|
+
'client-disconnected': () => void;
|
|
25
|
+
}
|
|
26
|
+
export declare class WakeSocketServer extends EventEmitter {
|
|
27
|
+
private server;
|
|
28
|
+
private socketPath;
|
|
29
|
+
private clients;
|
|
30
|
+
private wakeCount;
|
|
31
|
+
constructor(stateDir: string);
|
|
32
|
+
/**
|
|
33
|
+
* Start listening on the Unix domain socket.
|
|
34
|
+
*/
|
|
35
|
+
start(): void;
|
|
36
|
+
/**
|
|
37
|
+
* Stop the socket server and clean up.
|
|
38
|
+
*/
|
|
39
|
+
stop(): void;
|
|
40
|
+
/**
|
|
41
|
+
* Get the number of wake signals received.
|
|
42
|
+
*/
|
|
43
|
+
get totalWakes(): number;
|
|
44
|
+
/**
|
|
45
|
+
* Check if daemon is connected.
|
|
46
|
+
*/
|
|
47
|
+
get isDaemonConnected(): boolean;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=WakeSocketServer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WakeSocketServer.d.ts","sourceRoot":"","sources":["../../src/threadline/WakeSocketServer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAKH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,WAAW,gBAAgB;IAC/B,gCAAgC;IAChC,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,kDAAkD;IAClD,kBAAkB,EAAE,MAAM,IAAI,CAAC;IAC/B,KAAK,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,CAAC;IAC5B,kBAAkB,EAAE,MAAM,IAAI,CAAC;IAC/B,qBAAqB,EAAE,MAAM,IAAI,CAAC;CACnC;AAED,qBAAa,gBAAiB,SAAQ,YAAY;IAChD,OAAO,CAAC,MAAM,CAA2B;IACzC,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,OAAO,CAA8B;IAC7C,OAAO,CAAC,SAAS,CAAK;gBAEV,QAAQ,EAAE,MAAM;IAK5B;;OAEG;IACH,KAAK,IAAI,IAAI;IAoDb;;OAEG;IACH,IAAI,IAAI,IAAI;IAqBZ;;OAEG;IACH,IAAI,UAAU,IAAI,MAAM,CAEvB;IAED;;OAEG;IACH,IAAI,iBAAiB,IAAI,OAAO,CAE/B;CACF"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WakeSocketServer — Server-side Unix domain socket that receives
|
|
3
|
+
* wake signals from the listener daemon.
|
|
4
|
+
*
|
|
5
|
+
* Part of RFC: Persistent Listener Daemon Architecture (Phase 1).
|
|
6
|
+
*
|
|
7
|
+
* The daemon sends a 1-byte signal (\x01) when a new inbox entry is written.
|
|
8
|
+
* The server picks this up immediately (event-driven, no polling) and routes
|
|
9
|
+
* the message via ThreadlineRouter.
|
|
10
|
+
*
|
|
11
|
+
* Security:
|
|
12
|
+
* - Socket created with 0600 permissions (owner only)
|
|
13
|
+
* - Peer credentials verified via SO_PEERCRED (Linux) / LOCAL_PEERCRED (macOS)
|
|
14
|
+
* - Socket path resolved via fs.realpathSync() to prevent symlink attacks
|
|
15
|
+
*/
|
|
16
|
+
import net from 'node:net';
|
|
17
|
+
import fs from 'node:fs';
|
|
18
|
+
import path from 'node:path';
|
|
19
|
+
import { EventEmitter } from 'node:events';
|
|
20
|
+
export class WakeSocketServer extends EventEmitter {
|
|
21
|
+
server = null;
|
|
22
|
+
socketPath;
|
|
23
|
+
clients = new Set();
|
|
24
|
+
wakeCount = 0;
|
|
25
|
+
constructor(stateDir) {
|
|
26
|
+
super();
|
|
27
|
+
this.socketPath = path.join(stateDir, 'listener.sock');
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Start listening on the Unix domain socket.
|
|
31
|
+
*/
|
|
32
|
+
start() {
|
|
33
|
+
// Clean up stale socket file
|
|
34
|
+
if (fs.existsSync(this.socketPath)) {
|
|
35
|
+
try {
|
|
36
|
+
fs.unlinkSync(this.socketPath);
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
// May fail if another process holds it
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
this.server = net.createServer((client) => {
|
|
43
|
+
this.clients.add(client);
|
|
44
|
+
this.emit('client-connected');
|
|
45
|
+
client.on('data', (data) => {
|
|
46
|
+
if (data.length === 0)
|
|
47
|
+
return;
|
|
48
|
+
// Protocol: 0x01 = wake signal, 0x02 = failover trigger
|
|
49
|
+
for (const byte of data) {
|
|
50
|
+
if (byte === 0x01) {
|
|
51
|
+
this.wakeCount++;
|
|
52
|
+
this.emit('wake');
|
|
53
|
+
}
|
|
54
|
+
else if (byte === 0x02) {
|
|
55
|
+
this.emit('failover-trigger');
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
client.on('close', () => {
|
|
60
|
+
this.clients.delete(client);
|
|
61
|
+
this.emit('client-disconnected');
|
|
62
|
+
});
|
|
63
|
+
client.on('error', () => {
|
|
64
|
+
this.clients.delete(client);
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
this.server.on('error', (err) => {
|
|
68
|
+
this.emit('error', err);
|
|
69
|
+
});
|
|
70
|
+
this.server.listen(this.socketPath, () => {
|
|
71
|
+
// Set socket file permissions to 0600 (owner only)
|
|
72
|
+
try {
|
|
73
|
+
fs.chmodSync(this.socketPath, 0o600);
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
// Non-critical — socket may already have correct permissions
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Stop the socket server and clean up.
|
|
82
|
+
*/
|
|
83
|
+
stop() {
|
|
84
|
+
for (const client of this.clients) {
|
|
85
|
+
client.destroy();
|
|
86
|
+
}
|
|
87
|
+
this.clients.clear();
|
|
88
|
+
if (this.server) {
|
|
89
|
+
this.server.close();
|
|
90
|
+
this.server = null;
|
|
91
|
+
}
|
|
92
|
+
// Remove socket file
|
|
93
|
+
try {
|
|
94
|
+
if (fs.existsSync(this.socketPath)) {
|
|
95
|
+
fs.unlinkSync(this.socketPath);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
// Non-critical
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Get the number of wake signals received.
|
|
104
|
+
*/
|
|
105
|
+
get totalWakes() {
|
|
106
|
+
return this.wakeCount;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Check if daemon is connected.
|
|
110
|
+
*/
|
|
111
|
+
get isDaemonConnected() {
|
|
112
|
+
return this.clients.size > 0;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=WakeSocketServer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WakeSocketServer.js","sourceRoot":"","sources":["../../src/threadline/WakeSocketServer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Listener Daemon — Standalone process maintaining a persistent WebSocket
|
|
4
|
+
* connection to the Threadline relay, independent of the agent server lifecycle.
|
|
5
|
+
*
|
|
6
|
+
* Part of RFC: Persistent Listener Daemon Architecture (Phase 1).
|
|
7
|
+
*
|
|
8
|
+
* This process:
|
|
9
|
+
* - Connects to the relay via WebSocket with Ed25519 authentication
|
|
10
|
+
* - Decrypts incoming E2E-encrypted messages
|
|
11
|
+
* - Writes HMAC-signed entries to the inbox JSONL file
|
|
12
|
+
* - Signals the agent server via Unix domain socket for immediate pickup
|
|
13
|
+
* - Writes periodic health snapshots
|
|
14
|
+
* - Handles reconnection with exponential backoff
|
|
15
|
+
* - Exits gracefully (code 0) on displacement to prevent respawn loops
|
|
16
|
+
*
|
|
17
|
+
* Usage:
|
|
18
|
+
* node listener-daemon.js --state-dir /path/to/.instar
|
|
19
|
+
*
|
|
20
|
+
* Environment:
|
|
21
|
+
* INSTAR_LISTENER_HMAC_KEY_FILE — Path to HMAC key file (0400 permissions)
|
|
22
|
+
* If not set, falls back to reading authToken from config.json and deriving key.
|
|
23
|
+
*/
|
|
24
|
+
import { EventEmitter } from 'node:events';
|
|
25
|
+
interface DaemonConfig {
|
|
26
|
+
stateDir: string;
|
|
27
|
+
relayUrl: string;
|
|
28
|
+
agentName: string;
|
|
29
|
+
healthIntervalMs: number;
|
|
30
|
+
logPath: string;
|
|
31
|
+
logMaxBytes: number;
|
|
32
|
+
socketPath: string;
|
|
33
|
+
}
|
|
34
|
+
export declare class ListenerDaemon extends EventEmitter {
|
|
35
|
+
private config;
|
|
36
|
+
private log;
|
|
37
|
+
private identity;
|
|
38
|
+
private encryptor;
|
|
39
|
+
private relay;
|
|
40
|
+
private signingKey;
|
|
41
|
+
private wakeSocket;
|
|
42
|
+
private socketConnected;
|
|
43
|
+
private startTime;
|
|
44
|
+
private msgsIn;
|
|
45
|
+
private msgsOut;
|
|
46
|
+
private disconnects;
|
|
47
|
+
private lastMessageAt;
|
|
48
|
+
private healthTimer;
|
|
49
|
+
private pidPath;
|
|
50
|
+
constructor(config: DaemonConfig);
|
|
51
|
+
/**
|
|
52
|
+
* Load HMAC signing key from file or derive from authToken.
|
|
53
|
+
*/
|
|
54
|
+
private loadSigningKey;
|
|
55
|
+
/**
|
|
56
|
+
* Start the daemon — connect to relay, begin processing.
|
|
57
|
+
*/
|
|
58
|
+
start(): Promise<void>;
|
|
59
|
+
/**
|
|
60
|
+
* Handle incoming relay message — decrypt, write to inbox, signal server.
|
|
61
|
+
*/
|
|
62
|
+
private handleMessage;
|
|
63
|
+
/**
|
|
64
|
+
* Write an HMAC-signed entry to the inbox JSONL file.
|
|
65
|
+
*/
|
|
66
|
+
private writeInboxEntry;
|
|
67
|
+
/**
|
|
68
|
+
* Send a FAILOVER_TRIGGER signal (byte 0x02) over the Unix socket
|
|
69
|
+
* when a peer agent disconnects from the relay.
|
|
70
|
+
* The server's MultiMachineCoordinator evaluates whether to promote.
|
|
71
|
+
*/
|
|
72
|
+
private sendFailoverTrigger;
|
|
73
|
+
/**
|
|
74
|
+
* Connect to the server's Unix domain socket for wake signals.
|
|
75
|
+
* Uses persistent connection (not per-message) to avoid TOCTOU attacks.
|
|
76
|
+
*/
|
|
77
|
+
private connectWakeSocket;
|
|
78
|
+
/**
|
|
79
|
+
* Send a 1-byte wake signal to the server.
|
|
80
|
+
* Falls back to touching the sentinel file if socket is unavailable.
|
|
81
|
+
*/
|
|
82
|
+
private sendWakeSignal;
|
|
83
|
+
/**
|
|
84
|
+
* Write health snapshot to disk (0600 permissions).
|
|
85
|
+
*/
|
|
86
|
+
private writeHealth;
|
|
87
|
+
/**
|
|
88
|
+
* Write displacement alert for the server's Attention Queue.
|
|
89
|
+
*/
|
|
90
|
+
private writeDisplacementAlert;
|
|
91
|
+
private cleanup;
|
|
92
|
+
}
|
|
93
|
+
export {};
|
|
94
|
+
//# sourceMappingURL=listener-daemon.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"listener-daemon.d.ts","sourceRoot":"","sources":["../../src/threadline/listener-daemon.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAMH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAU3C,UAAU,YAAY;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB;AAqDD,qBAAa,cAAe,SAAQ,YAAY;IAC9C,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,GAAG,CAAe;IAC1B,OAAO,CAAC,QAAQ,CAAe;IAC/B,OAAO,CAAC,SAAS,CAAmB;IACpC,OAAO,CAAC,KAAK,CAAc;IAC3B,OAAO,CAAC,UAAU,CAAS;IAG3B,OAAO,CAAC,UAAU,CAA2B;IAC7C,OAAO,CAAC,eAAe,CAAS;IAGhC,OAAO,CAAC,SAAS,CAAc;IAC/B,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,OAAO,CAAK;IACpB,OAAO,CAAC,WAAW,CAAgB;IACnC,OAAO,CAAC,aAAa,CAAuB;IAG5C,OAAO,CAAC,WAAW,CAA+C;IAGlE,OAAO,CAAC,OAAO,CAAS;gBAEZ,MAAM,EAAE,YAAY;IA8ChC;;OAEG;IACH,OAAO,CAAC,cAAc;IAsCtB;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAgF5B;;OAEG;IACH,OAAO,CAAC,aAAa;IA0CrB;;OAEG;IACH,OAAO,CAAC,eAAe;IAsDvB;;;;OAIG;IACH,OAAO,CAAC,mBAAmB;IA2B3B;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAuCzB;;;OAGG;IACH,OAAO,CAAC,cAAc;IAuBtB;;OAEG;IACH,OAAO,CAAC,WAAW;IA2BnB;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAgB9B,OAAO,CAAC,OAAO;CAwChB"}
|