clawborrator-mcp 0.0.32 → 0.0.33
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
|
@@ -60,7 +60,7 @@ ends up in the spawned project automatically.
|
|
|
60
60
|
1. Reads env config; loads channel token.
|
|
61
61
|
2. Opens WSS to `<HUB_URL>/channel` with `Authorization: Bearer <CHANNEL_TOKEN>`.
|
|
62
62
|
3. Sends `register` with host / cwd / pid / version; receives `welcome` with sessionId + routingName.
|
|
63
|
-
4. Writes `<cwd>/.claude/clawborrator.
|
|
63
|
+
4. Writes `<cwd>/.claude/clawborrator/runtime.json` (mode 0600) so per-event hook spawns can find the active session.
|
|
64
64
|
5. Maintains the WS with heartbeat ping/pong; reconnects with exponential backoff (1s/2s/5s/15s/30s/60s).
|
|
65
65
|
6. Listens for hub-side messages: `prompt` (cross-session route), `permission_response`, `peers_update`, `bye`, `error`.
|
|
66
66
|
7. Dispatches MCP tool calls (see below) over the same WS.
|
|
@@ -68,7 +68,7 @@ ends up in the spawned project automatically.
|
|
|
68
68
|
|
|
69
69
|
**Short-lived hook path** (`--hook=<HookName>` flag):
|
|
70
70
|
1. Reads JSON payload from stdin (Claude Code's hook protocol).
|
|
71
|
-
2. Locates the active sidecar
|
|
71
|
+
2. Locates the active sidecar at `.claude/clawborrator/runtime.json`.
|
|
72
72
|
3. Maps the hook name to a clawborrator event (e.g. `PreToolUse` → `tail/PreToolUse`, `UserPromptSubmit` → `chat/prompt`).
|
|
73
73
|
4. POSTs to `<HUB_URL>/api/channel/event` with the channel token from the sidecar.
|
|
74
74
|
5. Echoes stdin to stdout so Claude's hook chain stays intact.
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
*/
|
|
8
8
|
export declare function loadPersistedSessionId(cwd: string): string | null;
|
|
9
9
|
/**
|
|
10
|
-
* Write
|
|
10
|
+
* Write identity.json after a successful welcome. Also drops a
|
|
11
11
|
* sibling .gitignore on first creation so the dir as a whole stays
|
|
12
12
|
* out of source control.
|
|
13
13
|
*/
|
|
@@ -17,7 +17,7 @@ export declare function savePersistedSession(cwd: string, info: {
|
|
|
17
17
|
hubUrl?: string;
|
|
18
18
|
}): void;
|
|
19
19
|
/**
|
|
20
|
-
* Delete
|
|
21
|
-
*
|
|
20
|
+
* Delete identity.json. Currently unused — kept for symmetry / future
|
|
21
|
+
* operator-driven `claw session reset` flows.
|
|
22
22
|
*/
|
|
23
23
|
export declare function deletePersistedSession(cwd: string): void;
|
|
@@ -1,11 +1,19 @@
|
|
|
1
|
-
// Persist the hub-issued session
|
|
2
|
-
// fresh `claude` boot in the same project rebinds to the existing
|
|
1
|
+
// Persist the hub-issued session identity across MCP process restarts
|
|
2
|
+
// so a fresh `claude` boot in the same project rebinds to the existing
|
|
3
3
|
// session row instead of minting a sibling row with the same routing
|
|
4
4
|
// name. This is what eliminates the "@driver appears 5 times in
|
|
5
5
|
// list_peers / session ls" duplicate-row class of bug.
|
|
6
6
|
//
|
|
7
|
+
// Forward-only rename in 0.0.33: this file used to live at
|
|
8
|
+
// `<cwd>/.claude/clawborrator/session.json` (and a separate hook
|
|
9
|
+
// runtime sidecar lived at `<cwd>/.claude/clawborrator.session.json`).
|
|
10
|
+
// Both have been moved into the `clawborrator/` subdir and given
|
|
11
|
+
// purpose-named filenames so they no longer look like typos of each
|
|
12
|
+
// other. The daemon's clean_stale + destroy paths nuke the legacy
|
|
13
|
+
// names as well, so existing sessions don't leak cruft when restarted.
|
|
14
|
+
//
|
|
7
15
|
// Storage shape:
|
|
8
|
-
// <cwd>/.claude/clawborrator/
|
|
16
|
+
// <cwd>/.claude/clawborrator/identity.json
|
|
9
17
|
// {
|
|
10
18
|
// "sessionId": "<uuid>",
|
|
11
19
|
// "routingName": "@<slug>",
|
|
@@ -14,13 +22,13 @@
|
|
|
14
22
|
// }
|
|
15
23
|
//
|
|
16
24
|
// Plus a sibling `.gitignore` ("*\n") inside the same directory so the
|
|
17
|
-
//
|
|
25
|
+
// identity file (which contains nothing secret, but is per-machine
|
|
18
26
|
// runtime state) never leaks into commits.
|
|
19
27
|
import { readFileSync, writeFileSync, existsSync, mkdirSync, unlinkSync } from 'node:fs';
|
|
20
28
|
import { resolve } from 'node:path';
|
|
21
29
|
import { log } from './log.js';
|
|
22
30
|
const REL_DIR = '.claude/clawborrator';
|
|
23
|
-
const REL_FILE = '.claude/clawborrator/
|
|
31
|
+
const REL_FILE = '.claude/clawborrator/identity.json';
|
|
24
32
|
const REL_GI = '.claude/clawborrator/.gitignore';
|
|
25
33
|
const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
26
34
|
/**
|
|
@@ -49,7 +57,7 @@ export function loadPersistedSessionId(cwd) {
|
|
|
49
57
|
}
|
|
50
58
|
}
|
|
51
59
|
/**
|
|
52
|
-
* Write
|
|
60
|
+
* Write identity.json after a successful welcome. Also drops a
|
|
53
61
|
* sibling .gitignore on first creation so the dir as a whole stays
|
|
54
62
|
* out of source control.
|
|
55
63
|
*/
|
|
@@ -75,8 +83,8 @@ export function savePersistedSession(cwd, info) {
|
|
|
75
83
|
}
|
|
76
84
|
}
|
|
77
85
|
/**
|
|
78
|
-
* Delete
|
|
79
|
-
*
|
|
86
|
+
* Delete identity.json. Currently unused — kept for symmetry / future
|
|
87
|
+
* operator-driven `claw session reset` flows.
|
|
80
88
|
*/
|
|
81
89
|
export function deletePersistedSession(cwd) {
|
|
82
90
|
const path = resolve(cwd, REL_FILE);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"persisted-session.js","sourceRoot":"","sources":["../src/persisted-session.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,
|
|
1
|
+
{"version":3,"file":"persisted-session.js","sourceRoot":"","sources":["../src/persisted-session.ts"],"names":[],"mappings":"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"}
|
package/dist/sidecar.js
CHANGED
|
@@ -3,7 +3,14 @@
|
|
|
3
3
|
// Code's hook system) read this file to know which session to
|
|
4
4
|
// attribute their event to and which hub to POST to.
|
|
5
5
|
//
|
|
6
|
-
// Path: <cwd>/.claude/clawborrator.
|
|
6
|
+
// Path: <cwd>/.claude/clawborrator/runtime.json. Mode 0600 on POSIX.
|
|
7
|
+
//
|
|
8
|
+
// Forward-only rename in 0.0.33: previously at
|
|
9
|
+
// `<cwd>/.claude/clawborrator.session.json` (a flat file that looked
|
|
10
|
+
// like a typo of identity.json). Now under the same `clawborrator/`
|
|
11
|
+
// subdir as identity.json with a purpose-named filename. The daemon's
|
|
12
|
+
// clean_stale + destroy paths nuke the legacy flat-file location as
|
|
13
|
+
// well, so existing sessions don't leak cruft on restart.
|
|
7
14
|
//
|
|
8
15
|
// Storing the channel-token plaintext here matters: hooks need it to
|
|
9
16
|
// authenticate to /api/channel/event. The risk surface is the same
|
|
@@ -13,10 +20,14 @@ import { resolve } from 'node:path';
|
|
|
13
20
|
import { mkdirSync, writeFileSync, readFileSync, unlinkSync, chmodSync, existsSync } from 'node:fs';
|
|
14
21
|
import { log } from './log.js';
|
|
15
22
|
function sidecarPath(cwd) {
|
|
16
|
-
return resolve(cwd, '.claude', 'clawborrator.
|
|
23
|
+
return resolve(cwd, '.claude', 'clawborrator', 'runtime.json');
|
|
17
24
|
}
|
|
18
25
|
export function writeSidecar(payload) {
|
|
19
|
-
|
|
26
|
+
// Mkdir the clawborrator/ subdir (used to be just .claude/, but
|
|
27
|
+
// runtime.json now lives alongside identity.json under
|
|
28
|
+
// clawborrator/). The daemon's write_persisted_session creates this
|
|
29
|
+
// dir at preflight too — both calls are idempotent with recursive.
|
|
30
|
+
const dir = resolve(payload.cwd, '.claude', 'clawborrator');
|
|
20
31
|
try {
|
|
21
32
|
if (!existsSync(dir))
|
|
22
33
|
mkdirSync(dir, { recursive: true, mode: 0o700 });
|
package/dist/sidecar.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sidecar.js","sourceRoot":"","sources":["../src/sidecar.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,kEAAkE;AAClE,8DAA8D;AAC9D,qDAAqD;AACrD,EAAE;AACF,qEAAqE;AACrE,EAAE;AACF,qEAAqE;AACrE,mEAAmE;AACnE,mEAAmE;AACnE,+DAA+D;AAE/D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACpG,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAY/B,SAAS,WAAW,CAAC,GAAW;IAC9B,OAAO,OAAO,CAAC,GAAG,EAAE,SAAS,EAAE,
|
|
1
|
+
{"version":3,"file":"sidecar.js","sourceRoot":"","sources":["../src/sidecar.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,kEAAkE;AAClE,8DAA8D;AAC9D,qDAAqD;AACrD,EAAE;AACF,qEAAqE;AACrE,EAAE;AACF,+CAA+C;AAC/C,qEAAqE;AACrE,oEAAoE;AACpE,sEAAsE;AACtE,oEAAoE;AACpE,0DAA0D;AAC1D,EAAE;AACF,qEAAqE;AACrE,mEAAmE;AACnE,mEAAmE;AACnE,+DAA+D;AAE/D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACpG,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAY/B,SAAS,WAAW,CAAC,GAAW;IAC9B,OAAO,OAAO,CAAC,GAAG,EAAE,SAAS,EAAE,cAAc,EAAE,cAAc,CAAC,CAAC;AACjE,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,OAAuB;IAClD,gEAAgE;IAChE,uDAAuD;IACvD,oEAAoE;IACpE,mEAAmE;IACnE,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,SAAS,EAAE,cAAc,CAAC,CAAC;IAC5D,IAAI,CAAC;QACH,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QACvE,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACtC,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAC9E,IAAI,CAAC;YAAC,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,aAAa,CAAC,CAAC;QACvD,GAAG,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;IACxC,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,GAAG,CAAC,IAAI,CAAC,sBAAsB,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACzD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,GAAW;IACvC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,UAAU,CAAC,IAAI,CAAC;YAAE,UAAU,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC;IAAC,MAAM,CAAC,CAAC,aAAa,CAAC,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,GAAW;IACrC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC;QACnD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAmB,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,8DAA8D;AAC9D,8DAA8D;AAC9D,kEAAkE;AAClE,gEAAgE;AAChE,gEAAgE;AAChE,8DAA8D;AAC9D,iEAAiE;AACjE,iEAAiE;AACjE,8DAA8D;AAC9D,8BAA8B;AAC9B,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC;AAC5B,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "clawborrator-mcp",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.33",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "clawborrator channel for hub_v1 — MCP server that connects Claude Code to a hub over WebSocket, with hooks for activity capture and tools for cross-session routing.",
|
|
6
6
|
"license": "MIT",
|