claudelink 1.0.0 → 1.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.
package/README.md CHANGED
@@ -11,6 +11,10 @@ Terminal 3 (tester) ──┤
11
11
  Terminal 4 (ops) ──┘
12
12
  ```
13
13
 
14
+ A local **Command Center** at `http://127.0.0.1:7878` opens automatically with the first agent — see who's online, watch messages flow, and kill stuck servers without touching the terminal.
15
+
16
+ ![ClaudeLink Command Center](docs/assets/command-center.png)
17
+
14
18
  ## Quick Start
15
19
 
16
20
  ```bash
@@ -70,6 +74,30 @@ ClaudeLink is an [MCP (Model Context Protocol)](https://modelcontextprotocol.io/
70
74
 
71
75
  There is no daemon or background service. Each Claude Code session spawns its own MCP server process, and they coordinate through the shared database.
72
76
 
77
+ ## Command Center
78
+
79
+ The Command Center is a local web UI at `http://127.0.0.1:7878` that gives you a live view of every agent in the mesh. The first `claudelink-server` to boot in any terminal launches it automatically — subsequent agents share the same window. It survives MCP restarts and only exits when you click **Quit UI** (or run `claudelink ui --stop`).
80
+
81
+ ### What it shows
82
+
83
+ - **Running servers** — every `claudelink-server` process, with PID, TTY, uptime, and the role it registered as. Per-row **Kill** button sends SIGTERM.
84
+ - **Registered agents** — role, description, online status, message counts (sent / received), and last-seen timestamp. Per-row **Kill agent** SIGTERMs the matching server.
85
+ - **Health** — total agents, unread/total messages, bulletin entries, orphan blockers, FK violations, and servers running. The **Heal orphans** button cascade-cleans every dead agent's messages and bulletin rows in one transaction.
86
+ - **Recent messages** — the last several messages across all agents, with unread and priority badges.
87
+
88
+ The page auto-refreshes every 2 seconds. **Kill all servers** in the header drops the whole mesh in one click.
89
+
90
+ ### Lifecycle
91
+
92
+ A lock file at `~/.claudelink/ui.lock` prevents duplicate windows. The launcher detached-spawns the UI process with `unref()` so it outlives the MCP parent. If a stale lock is detected (PID dead and no heartbeat at `/api/heartbeat`), a fresh UI takes over.
93
+
94
+ To opt out, set `CLAUDELINK_UI=off` in the environment before starting Claude Code.
95
+
96
+ ```bash
97
+ claudelink ui # start it manually (or just spawn any agent)
98
+ claudelink ui --stop # graceful shutdown
99
+ ```
100
+
73
101
  ## Available Tools
74
102
 
75
103
  Once connected, Claude Code gains these tools:
@@ -122,10 +150,50 @@ Read the bulletin board.
122
150
  claudelink init # Configure for current project
123
151
  claudelink init --global # Configure globally
124
152
  claudelink status # Show registered agents and message stats
153
+ claudelink ui # Open the Command Center in your browser
154
+ claudelink ui --stop # Stop the Command Center
125
155
  claudelink reset # Clear all data (fresh start)
126
156
  claudelink help # Show help
127
157
  ```
128
158
 
159
+ ## Autonomous Replies
160
+
161
+ ClaudeLink ships a Claude Code Stop hook that auto-processes inbound messages without you typing "check inbox" in each terminal. When an agent finishes a turn, the hook peeks at its inbox; if any messages expect a reply, it injects a continuation telling the agent to call `read_inbox` and respond.
162
+
163
+ ### Why the hook directs to `read_inbox` instead of embedding contents
164
+
165
+ The Stop hook deliberately does **not** embed message contents in the continuation it injects. Doing so trips Claude Code's prompt-injection defense — to the safety layer, "an external message saying do X" is indistinguishable from a malicious file or web page steering Claude's actions, and Claude will (correctly) refuse to act on it. Instead, the hook directs Claude to call its own `read_inbox` tool. The tool result is content Claude has agency over, so the safety layer accepts it and the autonomous reply happens cleanly.
166
+
167
+ The advisor branch (`autonomousReply: false`) does still consume messages via the hook (marks them read + emits to stderr) so they don't pile up indefinitely; only the autonomous branch leaves messages unread for `read_inbox` to consume.
168
+
169
+ ### Caps and opt-outs
170
+
171
+ Three guards prevent runaway loops:
172
+
173
+ - **Hard cap** — max consecutive auto-fires per terminal without a human prompt (`CLAUDELINK_HARD_CAP`, default 5).
174
+ - **Cooldown** — minimum seconds between auto-fires per terminal (`CLAUDELINK_COOLDOWN_S`, default 30).
175
+ - **Chain cap** — max `parent_id` chain depth before a message stops triggering auto-fires (`CLAUDELINK_CHAIN_CAP`, default 8).
176
+
177
+ Set any to `0` to disable that specific guard. Per-agent opt-out: register with `autonomousReply: false` and the hook reads the inbox but never blocks-and-continues — useful for advisor-style terminals where you want visibility but no automatic action.
178
+
179
+ Per-message opt-out: send with `expectsReply: false` for FYI/informational pings. The recipient still reads them but the hook treats them as ineligible for auto-fire.
180
+
181
+ Every Stop hook decision logs to `~/.claudelink/auto-fire.log` for auditing without reading any conversation.
182
+
183
+ ### Desktop notifications
184
+
185
+ The Command Center fires a macOS desktop notification (via `osascript display notification`, no Accessibility permission required) for every new message that lands in any agent's inbox — including agents registered with `autonomousReply: false`. Notifications give you situational awareness across the swarm without switching terminals.
186
+
187
+ Multiple messages arriving in the same 2-second poll window collapse into one summary notification ("3 new ClaudeLink messages: reviewer → developer: ... (+2 more)"). The historical backlog is suppressed at startup so a freshly opened Command Center doesn't spam you with old messages.
188
+
189
+ Off-switch: `CLAUDELINK_NOTIFY=off`.
190
+
191
+ ### Debug knobs
192
+
193
+ - `CLAUDELINK_HOOK_TTY=/dev/ttysNNN` — override TTY auto-detection (testing, CI).
194
+ - `CLAUDELINK_HOOK_STRICT=1` — surface hook errors to stderr instead of swallowing them. Default is fail-open (production safety).
195
+ - `CLAUDELINK_NOTIFY=off` — disable desktop notifications.
196
+
129
197
  ## Autonomous Mode (Recommended)
130
198
 
131
199
  By default, you'd have to tell Claude "check my inbox" manually every time. That defeats the purpose. With autonomous mode, agents communicate **on their own** — checking for messages and sending updates without you asking.
@@ -451,7 +519,6 @@ node dist/cli.js status
451
519
  - **Message history**: Tool to view past messages (not just unread)
452
520
  - **File sharing**: Agents can share file paths or code snippets with structured formatting
453
521
  - **Priority notifications**: Interrupt the current agent when a high-priority message arrives
454
- - **Web dashboard**: A local web UI to visualize agent activity
455
522
  - **Agent templates**: Pre-built role configurations for common workflows
456
523
  - **Webhooks**: Notify external services when agents communicate
457
524
  - **Encryption**: Encrypt messages at rest in the database
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ require('../dist/ui-bin.js');
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ require('../dist/hooks/user-prompt-submit-hook.js');
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ require('../dist/hooks/stop-hook.js');
@@ -0,0 +1,26 @@
1
+ export interface FireState {
2
+ count: number;
3
+ lastFireTs: number;
4
+ }
5
+ export interface Caps {
6
+ hardCap: number;
7
+ cooldownS: number;
8
+ chainCap: number;
9
+ }
10
+ export interface CapDecision {
11
+ allowed: boolean;
12
+ reason: string;
13
+ newCount: number;
14
+ caps: Caps;
15
+ }
16
+ export declare function getCaps(): Caps;
17
+ export declare function readState(tty: string): FireState;
18
+ export declare function checkAndIncrement(tty: string): CapDecision;
19
+ export declare function resetCounter(tty: string): void;
20
+ export declare function appendAutoFireLog(entry: {
21
+ tty: string;
22
+ agentRole: string | null;
23
+ decision: "fired" | "blocked-by-cap" | "no-eligible-msgs" | "opt-out" | "no-agent" | "counter-reset";
24
+ reason: string;
25
+ inboundCount?: number;
26
+ }): void;
@@ -0,0 +1,133 @@
1
+ "use strict";
2
+ // Per-TTY auto-fire state for the Stop hook.
3
+ //
4
+ // Each terminal that has registered an agent gets a tiny JSON file at
5
+ // ~/.claudelink/state/<tty>.json holding the consecutive auto-fire count
6
+ // and the last-fire timestamp. checkAndIncrement applies the hard cap
7
+ // (consecutive fires) and the soft cooldown (seconds since last fire);
8
+ // resetCounter is called by the UserPromptSubmit hook when the human types
9
+ // something. Everything is per-TTY, so different terminals never contend.
10
+ var __importDefault = (this && this.__importDefault) || function (mod) {
11
+ return (mod && mod.__esModule) ? mod : { "default": mod };
12
+ };
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.getCaps = getCaps;
15
+ exports.readState = readState;
16
+ exports.checkAndIncrement = checkAndIncrement;
17
+ exports.resetCounter = resetCounter;
18
+ exports.appendAutoFireLog = appendAutoFireLog;
19
+ const fs_1 = __importDefault(require("fs"));
20
+ const path_1 = __importDefault(require("path"));
21
+ const os_1 = __importDefault(require("os"));
22
+ const HARD_CAP_DEFAULT = 5;
23
+ const COOLDOWN_S_DEFAULT = 30;
24
+ const CHAIN_CAP_DEFAULT = 8;
25
+ const STATE_DIR = path_1.default.join(os_1.default.homedir(), ".claudelink", "state");
26
+ const LOG_PATH = path_1.default.join(os_1.default.homedir(), ".claudelink", "auto-fire.log");
27
+ function envInt(key, dflt) {
28
+ const raw = process.env[key];
29
+ if (raw === undefined || raw === "")
30
+ return dflt;
31
+ const n = parseInt(raw, 10);
32
+ if (Number.isNaN(n))
33
+ return dflt;
34
+ return Math.max(0, n);
35
+ }
36
+ function getCaps() {
37
+ return {
38
+ hardCap: envInt("CLAUDELINK_HARD_CAP", HARD_CAP_DEFAULT),
39
+ cooldownS: envInt("CLAUDELINK_COOLDOWN_S", COOLDOWN_S_DEFAULT),
40
+ chainCap: envInt("CLAUDELINK_CHAIN_CAP", CHAIN_CAP_DEFAULT),
41
+ };
42
+ }
43
+ function ensureStateDir() {
44
+ if (!fs_1.default.existsSync(STATE_DIR)) {
45
+ fs_1.default.mkdirSync(STATE_DIR, { recursive: true });
46
+ }
47
+ }
48
+ function ttyToFilename(tty) {
49
+ return tty.replace(/^\/dev\//, "").replace(/[^a-zA-Z0-9_-]/g, "_");
50
+ }
51
+ function statePath(tty) {
52
+ return path_1.default.join(STATE_DIR, ttyToFilename(tty) + ".json");
53
+ }
54
+ function readState(tty) {
55
+ try {
56
+ const raw = fs_1.default.readFileSync(statePath(tty), "utf8");
57
+ const parsed = JSON.parse(raw);
58
+ return {
59
+ count: Number(parsed.count) || 0,
60
+ lastFireTs: Number(parsed.lastFireTs) || 0,
61
+ };
62
+ }
63
+ catch {
64
+ return { count: 0, lastFireTs: 0 };
65
+ }
66
+ }
67
+ function writeState(tty, state) {
68
+ ensureStateDir();
69
+ // Atomic-on-POSIX write: write to a sibling temp file then rename. Avoids
70
+ // partial writes if the process is killed mid-write.
71
+ const tmp = statePath(tty) + ".tmp";
72
+ fs_1.default.writeFileSync(tmp, JSON.stringify(state));
73
+ fs_1.default.renameSync(tmp, statePath(tty));
74
+ }
75
+ // Apply hard-cap and cooldown policy. If allowed, increment and persist.
76
+ // Caller decides what "allowed=false" means (typically: read inbox but do
77
+ // not block-and-continue).
78
+ function checkAndIncrement(tty) {
79
+ const caps = getCaps();
80
+ const now = Date.now();
81
+ const state = readState(tty);
82
+ if (state.lastFireTs > 0) {
83
+ const sinceLastS = (now - state.lastFireTs) / 1000;
84
+ if (sinceLastS < caps.cooldownS) {
85
+ return {
86
+ allowed: false,
87
+ reason: `cooldown (${sinceLastS.toFixed(1)}s of ${caps.cooldownS}s)`,
88
+ newCount: state.count,
89
+ caps,
90
+ };
91
+ }
92
+ }
93
+ if (state.count >= caps.hardCap) {
94
+ return {
95
+ allowed: false,
96
+ reason: `hard cap reached (${state.count}/${caps.hardCap}); awaiting user prompt`,
97
+ newCount: state.count,
98
+ caps,
99
+ };
100
+ }
101
+ const newState = { count: state.count + 1, lastFireTs: now };
102
+ writeState(tty, newState);
103
+ return {
104
+ allowed: true,
105
+ reason: `fire ${newState.count}/${caps.hardCap}`,
106
+ newCount: newState.count,
107
+ caps,
108
+ };
109
+ }
110
+ function resetCounter(tty) {
111
+ try {
112
+ fs_1.default.unlinkSync(statePath(tty));
113
+ }
114
+ catch {
115
+ // No file = already reset.
116
+ }
117
+ }
118
+ // Append to ~/.claudelink/auto-fire.log so a human can audit the swarm
119
+ // without reading any conversation. One line per Stop-hook fire,
120
+ // regardless of whether the cap allowed it.
121
+ function appendAutoFireLog(entry) {
122
+ try {
123
+ const ts = new Date().toISOString();
124
+ const role = entry.agentRole ?? "?";
125
+ const inbound = entry.inboundCount === undefined ? "" : ` inbound=${entry.inboundCount}`;
126
+ const line = `${ts} tty=${entry.tty} role=${role} decision=${entry.decision} reason="${entry.reason}"${inbound}\n`;
127
+ fs_1.default.appendFileSync(LOG_PATH, line);
128
+ }
129
+ catch {
130
+ // Logging must never break the hook. Drop the entry on failure.
131
+ }
132
+ }
133
+ //# sourceMappingURL=cap-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cap-state.js","sourceRoot":"","sources":["../src/cap-state.ts"],"names":[],"mappings":"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"}
package/dist/cli.js CHANGED
@@ -1,5 +1,38 @@
1
1
  #!/usr/bin/env node
2
2
  "use strict";
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
18
+ });
19
+ var __importStar = (this && this.__importStar) || (function () {
20
+ var ownKeys = function(o) {
21
+ ownKeys = Object.getOwnPropertyNames || function (o) {
22
+ var ar = [];
23
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
24
+ return ar;
25
+ };
26
+ return ownKeys(o);
27
+ };
28
+ return function (mod) {
29
+ if (mod && mod.__esModule) return mod;
30
+ var result = {};
31
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
32
+ __setModuleDefault(result, mod);
33
+ return result;
34
+ };
35
+ })();
3
36
  var __importDefault = (this && this.__importDefault) || function (mod) {
4
37
  return (mod && mod.__esModule) ? mod : { "default": mod };
5
38
  };
@@ -182,13 +215,196 @@ function showHelp() {
182
215
  Usage: claudelink <command>
183
216
 
184
217
  Commands:
185
- init Add ClaudeLink to .mcp.json in current project + CLAUDE.md
186
- init --global Add ClaudeLink globally + ~/.claude/CLAUDE.md
187
- status Show registered agents and their status
188
- reset Clear all messages and agent registrations
189
- help Show this help message
218
+ init Add ClaudeLink to .mcp.json in current project + CLAUDE.md
219
+ init --global Add ClaudeLink globally + ~/.claude/CLAUDE.md
220
+ status Show registered agents and their status
221
+ ui Launch the Command Center UI in your browser
222
+ ui --stop Stop the Command Center UI
223
+ install-hooks Install Stop + UserPromptSubmit hooks for autonomous replies (project)
224
+ install-hooks --global Install hooks in ~/.claude/settings.json (all projects)
225
+ install-hooks --uninstall Remove ClaudeLink hooks from the chosen scope
226
+ reset Clear all messages and agent registrations
227
+ help Show this help message
228
+ `);
229
+ }
230
+ // --- Hook installation (Path A) ---------------------------------------------
231
+ // Idempotently installs the Stop + UserPromptSubmit hooks into the appropriate
232
+ // settings.json. Never clobbers existing hook entries: we look for our
233
+ // command name and skip if already present. The two hook scripts are
234
+ // installed by npm into the same bin directory as `claudelink` itself, so
235
+ // resolving an absolute path lets the install survive even if the user's
236
+ // shell PATH is different from Claude Code's spawned-process PATH.
237
+ const STOP_HOOK_BIN = "claudelink-stop-hook";
238
+ const PROMPT_HOOK_BIN = "claudelink-prompt-hook";
239
+ function resolveHookCommand(name) {
240
+ // Prefer absolute path next to this CLI binary (works regardless of PATH).
241
+ // Falls back to bare name if we can't locate ourselves.
242
+ const candidates = [
243
+ path_1.default.join(path_1.default.dirname(process.argv[1] || ""), name),
244
+ path_1.default.join(__dirname, "..", "bin", name + ".js"),
245
+ ];
246
+ for (const c of candidates) {
247
+ if (c && fs_1.default.existsSync(c))
248
+ return c;
249
+ }
250
+ return name;
251
+ }
252
+ function settingsPath(scope) {
253
+ return scope === "global"
254
+ ? path_1.default.join(os_1.default.homedir(), ".claude", "settings.json")
255
+ : path_1.default.join(process.cwd(), ".claude", "settings.json");
256
+ }
257
+ function readSettings(p) {
258
+ if (!fs_1.default.existsSync(p))
259
+ return {};
260
+ try {
261
+ return JSON.parse(fs_1.default.readFileSync(p, "utf-8"));
262
+ }
263
+ catch (e) {
264
+ throw new Error(`Could not parse ${p}: ${e.message}. Refusing to overwrite — fix the JSON manually and rerun.`);
265
+ }
266
+ }
267
+ function writeSettingsAtomic(p, settings) {
268
+ const dir = path_1.default.dirname(p);
269
+ if (!fs_1.default.existsSync(dir))
270
+ fs_1.default.mkdirSync(dir, { recursive: true });
271
+ const tmp = p + ".tmp";
272
+ fs_1.default.writeFileSync(tmp, JSON.stringify(settings, null, 2) + "\n");
273
+ fs_1.default.renameSync(tmp, p);
274
+ }
275
+ function hookEntryExists(settings, event, binName) {
276
+ const events = settings?.hooks?.[event];
277
+ if (!Array.isArray(events))
278
+ return false;
279
+ for (const group of events) {
280
+ const groupHooks = group?.hooks;
281
+ if (!Array.isArray(groupHooks))
282
+ continue;
283
+ for (const h of groupHooks) {
284
+ if (typeof h?.command === "string" && h.command.endsWith(binName)) {
285
+ return true;
286
+ }
287
+ }
288
+ }
289
+ return false;
290
+ }
291
+ function appendHookEntry(settings, event, command, timeout) {
292
+ if (!settings.hooks)
293
+ settings.hooks = {};
294
+ if (!Array.isArray(settings.hooks[event]))
295
+ settings.hooks[event] = [];
296
+ settings.hooks[event].push({
297
+ matcher: "",
298
+ hooks: [{ type: "command", command, timeout }],
299
+ });
300
+ }
301
+ function removeHookEntries(settings, event, binName) {
302
+ if (!Array.isArray(settings?.hooks?.[event]))
303
+ return 0;
304
+ let removed = 0;
305
+ const filtered = [];
306
+ for (const group of settings.hooks[event]) {
307
+ const remaining = (group?.hooks || []).filter((h) => !(typeof h?.command === "string" && h.command.endsWith(binName)));
308
+ if (remaining.length !== (group?.hooks || []).length) {
309
+ removed += (group?.hooks?.length || 0) - remaining.length;
310
+ }
311
+ if (remaining.length > 0) {
312
+ filtered.push({ ...group, hooks: remaining });
313
+ }
314
+ }
315
+ settings.hooks[event] = filtered;
316
+ if (settings.hooks[event].length === 0)
317
+ delete settings.hooks[event];
318
+ return removed;
319
+ }
320
+ function installHooks(scope, uninstall) {
321
+ const p = settingsPath(scope);
322
+ let settings;
323
+ try {
324
+ settings = readSettings(p);
325
+ }
326
+ catch (e) {
327
+ console.log(` ${e.message}`);
328
+ return;
329
+ }
330
+ const stopCmd = resolveHookCommand(STOP_HOOK_BIN);
331
+ const promptCmd = resolveHookCommand(PROMPT_HOOK_BIN);
332
+ if (uninstall) {
333
+ const stopRemoved = removeHookEntries(settings, "Stop", STOP_HOOK_BIN);
334
+ const promptRemoved = removeHookEntries(settings, "UserPromptSubmit", PROMPT_HOOK_BIN);
335
+ if (stopRemoved + promptRemoved === 0) {
336
+ console.log(` No ClaudeLink hooks found in ${p}. Nothing to remove.`);
337
+ return;
338
+ }
339
+ if (settings.hooks && Object.keys(settings.hooks).length === 0)
340
+ delete settings.hooks;
341
+ writeSettingsAtomic(p, settings);
342
+ console.log(` Removed ${stopRemoved} Stop hook(s) and ${promptRemoved} UserPromptSubmit hook(s) from ${p}.`);
343
+ return;
344
+ }
345
+ let stopAction;
346
+ let promptAction;
347
+ if (hookEntryExists(settings, "Stop", STOP_HOOK_BIN)) {
348
+ stopAction = "skipped";
349
+ }
350
+ else {
351
+ appendHookEntry(settings, "Stop", stopCmd, 10);
352
+ stopAction = "added";
353
+ }
354
+ if (hookEntryExists(settings, "UserPromptSubmit", PROMPT_HOOK_BIN)) {
355
+ promptAction = "skipped";
356
+ }
357
+ else {
358
+ appendHookEntry(settings, "UserPromptSubmit", promptCmd, 5);
359
+ promptAction = "added";
360
+ }
361
+ if (stopAction === "skipped" && promptAction === "skipped") {
362
+ console.log(` ClaudeLink hooks already installed in ${p}. Nothing to do.`);
363
+ return;
364
+ }
365
+ writeSettingsAtomic(p, settings);
366
+ console.log(` Updated ${p}:`);
367
+ console.log(` Stop hook: ${stopAction} (${stopCmd})`);
368
+ console.log(` UserPromptSubmit hook: ${promptAction} (${promptCmd})`);
369
+ console.log(`
370
+ Restart Claude Code in any terminal where you want autonomous replies
371
+ active. The hooks fire on Stop (when an agent finishes a turn) and
372
+ UserPromptSubmit (resets the per-terminal auto-fire counter).
373
+
374
+ Tunable env vars:
375
+ CLAUDELINK_HARD_CAP=5 consecutive auto-fires per terminal
376
+ CLAUDELINK_COOLDOWN_S=30 seconds between fires
377
+ CLAUDELINK_CHAIN_CAP=8 parent_id chain depth before excluding msg
378
+ CLAUDELINK_HOOK_STRICT=1 surface hook errors to stderr (dev mode)
379
+
380
+ Audit log: ~/.claudelink/auto-fire.log
190
381
  `);
191
382
  }
383
+ async function uiCommand(stop) {
384
+ const { launchUIIfNeeded, stopUI, getUIStatus } = await Promise.resolve().then(() => __importStar(require("./ui-launcher.js")));
385
+ if (stop) {
386
+ const ok = stopUI();
387
+ console.log(ok ? " Command Center UI stopped." : " Command Center UI is not running.");
388
+ return;
389
+ }
390
+ const status = getUIStatus();
391
+ if (status.running) {
392
+ console.log(` Command Center UI is already running.`);
393
+ console.log(` Open: ${status.url}`);
394
+ return;
395
+ }
396
+ const url = await launchUIIfNeeded({ openBrowser: true });
397
+ if (url) {
398
+ console.log(` Command Center UI launched.`);
399
+ console.log(` Open: ${url}`);
400
+ }
401
+ else {
402
+ console.log(` Could not launch the Command Center UI.`);
403
+ if (process.env.CLAUDELINK_UI === "off") {
404
+ console.log(` CLAUDELINK_UI=off is set. Unset it to enable.`);
405
+ }
406
+ }
407
+ }
192
408
  function showStatus() {
193
409
  const dbPath = path_1.default.join(NEXUS_DIR, "nexus.db");
194
410
  if (!fs_1.default.existsSync(dbPath)) {
@@ -259,6 +475,12 @@ switch (command) {
259
475
  case "status":
260
476
  showStatus();
261
477
  break;
478
+ case "ui":
479
+ uiCommand(args.includes("--stop") || args.includes("stop"));
480
+ break;
481
+ case "install-hooks":
482
+ installHooks(args.includes("--global") ? "global" : "project", args.includes("--uninstall"));
483
+ break;
262
484
  case "reset":
263
485
  resetDB();
264
486
  break;
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
package/dist/db.d.ts CHANGED
@@ -6,6 +6,21 @@ export interface Agent {
6
6
  last_seen: string;
7
7
  pid: number;
8
8
  alive: boolean;
9
+ tty: string | null;
10
+ terminal_app: string | null;
11
+ pane_id: string | null;
12
+ last_seen_active_ts: number | null;
13
+ autonomous_reply: number;
14
+ }
15
+ export interface RegisterOptions {
16
+ tty: string | null;
17
+ terminalApp: string | null;
18
+ paneId: string | null;
19
+ autonomousReply: boolean;
20
+ }
21
+ export interface SendOptions {
22
+ expectsReply?: boolean;
23
+ parentMessageId?: number | null;
9
24
  }
10
25
  export interface Message {
11
26
  id: number;
@@ -15,6 +30,8 @@ export interface Message {
15
30
  content: string;
16
31
  priority: string;
17
32
  created_at: string;
33
+ parent_id: number | null;
34
+ expects_reply: number;
18
35
  }
19
36
  export interface BulletinEntry {
20
37
  id: number;
@@ -27,11 +44,15 @@ export declare class NexusDB {
27
44
  private db;
28
45
  constructor();
29
46
  private migrate;
30
- registerAgent(role: string, description: string | null, pid: number): string;
47
+ registerAgent(role: string, description: string | null, pid: number, opts: RegisterOptions): string;
48
+ getAgentByTty(tty: string): Agent | null;
31
49
  heartbeat(agentId: string): void;
50
+ updateLastSeenActive(agentId: string): void;
51
+ getChainLength(messageId: number): number;
32
52
  getAgents(): Agent[];
33
- sendMessage(fromId: string, toRole: string, content: string, priority?: string): number;
34
- broadcastMessage(fromId: string, content: string): void;
53
+ sendMessage(fromId: string, toRole: string, content: string, priority?: string, opts?: SendOptions): number;
54
+ broadcastMessage(fromId: string, content: string, opts?: SendOptions): void;
55
+ peekInbox(agentId: string): Message[];
35
56
  readInbox(agentId: string): Message[];
36
57
  postBulletin(fromId: string, content: string): void;
37
58
  getBulletin(limit?: number): BulletinEntry[];