devharness 0.9.7 → 0.9.9
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 +15 -0
- package/build/block-events.d.ts +3 -5
- package/build/block-events.d.ts.map +1 -1
- package/build/block-events.js +6 -24
- package/build/block-events.js.map +1 -1
- package/build/block-events.test.js +10 -7
- package/build/block-events.test.js.map +1 -1
- package/build/cdp-manager.d.ts +7 -0
- package/build/cdp-manager.d.ts.map +1 -1
- package/build/cdp-manager.js +9 -0
- package/build/cdp-manager.js.map +1 -1
- package/build/cli/index.d.ts +26 -0
- package/build/cli/index.d.ts.map +1 -0
- package/build/cli/index.js +290 -0
- package/build/cli/index.js.map +1 -0
- package/build/cli/process-tree.d.ts +21 -0
- package/build/cli/process-tree.d.ts.map +1 -0
- package/build/cli/process-tree.js +51 -0
- package/build/cli/process-tree.js.map +1 -0
- package/build/cli/session-match.d.ts +37 -0
- package/build/cli/session-match.d.ts.map +1 -0
- package/build/cli/session-match.js +55 -0
- package/build/cli/session-match.js.map +1 -0
- package/build/cli/session-match.test.d.ts +17 -0
- package/build/cli/session-match.test.d.ts.map +1 -0
- package/build/cli/session-match.test.js +125 -0
- package/build/cli/session-match.test.js.map +1 -0
- package/build/config.d.ts +1 -1
- package/build/config.d.ts.map +1 -1
- package/build/config.js +1 -0
- package/build/config.js.map +1 -1
- package/build/connection-manager.d.ts.map +1 -1
- package/build/connection-manager.js +6 -1
- package/build/connection-manager.js.map +1 -1
- package/build/index.js +57 -4
- package/build/index.js.map +1 -1
- package/build/mcp-supervisor.js +43 -0
- package/build/mcp-supervisor.js.map +1 -1
- package/build/network-monitor.d.ts +13 -2
- package/build/network-monitor.d.ts.map +1 -1
- package/build/network-monitor.js +54 -23
- package/build/network-monitor.js.map +1 -1
- package/build/network-monitor.test.d.ts +11 -0
- package/build/network-monitor.test.d.ts.map +1 -0
- package/build/network-monitor.test.js +151 -0
- package/build/network-monitor.test.js.map +1 -0
- package/build/plugin-session-start-hook.test.d.ts +10 -0
- package/build/plugin-session-start-hook.test.d.ts.map +1 -0
- package/build/plugin-session-start-hook.test.js +187 -0
- package/build/plugin-session-start-hook.test.js.map +1 -0
- package/build/session-endpoint.d.ts +72 -0
- package/build/session-endpoint.d.ts.map +1 -0
- package/build/session-endpoint.js +220 -0
- package/build/session-endpoint.js.map +1 -0
- package/build/session-endpoint.test.d.ts +10 -0
- package/build/session-endpoint.test.d.ts.map +1 -0
- package/build/session-endpoint.test.js +202 -0
- package/build/session-endpoint.test.js.map +1 -0
- package/build/session-events.d.ts +28 -0
- package/build/session-events.d.ts.map +1 -0
- package/build/session-events.js +38 -0
- package/build/session-events.js.map +1 -0
- package/build/session-events.test.d.ts +8 -0
- package/build/session-events.test.d.ts.map +1 -0
- package/build/session-events.test.js +56 -0
- package/build/session-events.test.js.map +1 -0
- package/build/session-identity.d.ts +56 -0
- package/build/session-identity.d.ts.map +1 -0
- package/build/session-identity.js +96 -0
- package/build/session-identity.js.map +1 -0
- package/build/session-identity.test.d.ts +9 -0
- package/build/session-identity.test.d.ts.map +1 -0
- package/build/session-identity.test.js +126 -0
- package/build/session-identity.test.js.map +1 -0
- package/build/session-messages.d.ts +70 -0
- package/build/session-messages.d.ts.map +1 -0
- package/build/session-messages.js +139 -0
- package/build/session-messages.js.map +1 -0
- package/build/tool-response.d.ts +40 -1
- package/build/tool-response.d.ts.map +1 -1
- package/build/tool-response.js.map +1 -1
- package/build/tools/console-tools.d.ts +4 -0
- package/build/tools/console-tools.d.ts.map +1 -1
- package/build/tools/console-tools.js +55 -1
- package/build/tools/console-tools.js.map +1 -1
- package/build/tools/inspect-worker-meta.test.d.ts +9 -0
- package/build/tools/inspect-worker-meta.test.d.ts.map +1 -0
- package/build/tools/inspect-worker-meta.test.js +122 -0
- package/build/tools/inspect-worker-meta.test.js.map +1 -0
- package/build/tools/inspection-tools.d.ts +12 -5
- package/build/tools/inspection-tools.d.ts.map +1 -1
- package/build/tools/inspection-tools.js +86 -5
- package/build/tools/inspection-tools.js.map +1 -1
- package/build/tools/issues-tools.d.ts +3 -3
- package/build/tools/message-tools.d.ts +51 -0
- package/build/tools/message-tools.d.ts.map +1 -0
- package/build/tools/message-tools.js +250 -0
- package/build/tools/message-tools.js.map +1 -0
- package/build/tools/message-tools.test.d.ts +9 -0
- package/build/tools/message-tools.test.d.ts.map +1 -0
- package/build/tools/message-tools.test.js +332 -0
- package/build/tools/message-tools.test.js.map +1 -0
- package/build/tools/network-tools.js +1 -1
- package/build/tools/network-tools.js.map +1 -1
- package/build/tools/replay-tools.d.ts +3 -3
- package/build/tools/server-tools.d.ts +3 -3
- package/build/worker-targets.d.ts +75 -0
- package/build/worker-targets.d.ts.map +1 -0
- package/build/worker-targets.js +171 -0
- package/build/worker-targets.js.map +1 -0
- package/build/worker-targets.test.d.ts +8 -0
- package/build/worker-targets.test.d.ts.map +1 -0
- package/build/worker-targets.test.js +118 -0
- package/build/worker-targets.test.js.map +1 -0
- package/docs/instructions.md +23 -12
- package/docs/messages.md +150 -0
- package/package.json +3 -1
- package/plugin/skills/devharness/SKILL.md +36 -8
- package/plugin/skills/devharness/references/tool-categories.md +8 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"network-monitor.js","sourceRoot":"","sources":["../src/network-monitor.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"network-monitor.js","sourceRoot":"","sources":["../src/network-monitor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auto-attach holds every target related to the page before its first line, so
|
|
3
|
+
* the resume decides whether the target ever runs. On a service worker target
|
|
4
|
+
* `Network.enable` responds only once the target runs, and the target runs only
|
|
5
|
+
* on `Runtime.runIfWaitingForDebugger` - awaiting the enable before sending the
|
|
6
|
+
* resume deadlocks the registration that started the worker. These pin the
|
|
7
|
+
* resume to the same turn as the attach, and pin it to the child session: sent
|
|
8
|
+
* on the page session it lands on the page and leaves the child held.
|
|
9
|
+
*/
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=network-monitor.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"network-monitor.test.d.ts","sourceRoot":"","sources":["../src/network-monitor.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auto-attach holds every target related to the page before its first line, so
|
|
3
|
+
* the resume decides whether the target ever runs. On a service worker target
|
|
4
|
+
* `Network.enable` responds only once the target runs, and the target runs only
|
|
5
|
+
* on `Runtime.runIfWaitingForDebugger` - awaiting the enable before sending the
|
|
6
|
+
* resume deadlocks the registration that started the worker. These pin the
|
|
7
|
+
* resume to the same turn as the attach, and pin it to the child session: sent
|
|
8
|
+
* on the page session it lands on the page and leaves the child held.
|
|
9
|
+
*/
|
|
10
|
+
import { describe, it, expect } from 'vitest';
|
|
11
|
+
import { NetworkMonitor } from './network-monitor.js';
|
|
12
|
+
/** `hangOn` never settles, standing in for a held target's Network.enable. */
|
|
13
|
+
function fakeSession(hangOn) {
|
|
14
|
+
const session = {
|
|
15
|
+
sent: [],
|
|
16
|
+
handlers: new Map(),
|
|
17
|
+
emit(event, payload) {
|
|
18
|
+
session.handlers.get(event)?.(payload);
|
|
19
|
+
},
|
|
20
|
+
send(method, params) {
|
|
21
|
+
session.sent.push({ method, params });
|
|
22
|
+
if (method === hangOn)
|
|
23
|
+
return new Promise(() => { });
|
|
24
|
+
return Promise.resolve({});
|
|
25
|
+
},
|
|
26
|
+
on(event, handler) {
|
|
27
|
+
session.handlers.set(event, handler);
|
|
28
|
+
},
|
|
29
|
+
detached: false,
|
|
30
|
+
detach() {
|
|
31
|
+
session.detached = true;
|
|
32
|
+
return Promise.resolve();
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
return session;
|
|
36
|
+
}
|
|
37
|
+
function fakePage(pageSession, children) {
|
|
38
|
+
// `connection()` and `session()` are read as a synchronous chain by the
|
|
39
|
+
// handler under test, so neither may return a promise.
|
|
40
|
+
pageSession.connection = () => ({
|
|
41
|
+
session: (id) => children.get(id) ?? null,
|
|
42
|
+
});
|
|
43
|
+
return {
|
|
44
|
+
on() { },
|
|
45
|
+
removeAllListeners() { },
|
|
46
|
+
async createCDPSession() { return pageSession; },
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
/** startSocketMonitoring registers the attach handler behind two awaits. */
|
|
50
|
+
async function flush() {
|
|
51
|
+
await new Promise((resolve) => setTimeout(resolve, 0));
|
|
52
|
+
}
|
|
53
|
+
function attachEvent(sessionId, type, waitingForDebugger) {
|
|
54
|
+
return {
|
|
55
|
+
sessionId,
|
|
56
|
+
waitingForDebugger,
|
|
57
|
+
targetInfo: { type, targetId: `t-${sessionId}`, url: `http://localhost/${type}.js` },
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
describe('NetworkMonitor auto-attach resume', () => {
|
|
61
|
+
it('resumes a held target whose Network.enable never responds', async () => {
|
|
62
|
+
const pageSession = fakeSession();
|
|
63
|
+
const child = fakeSession('Network.enable');
|
|
64
|
+
const children = new Map([['sw-1', child]]);
|
|
65
|
+
const monitor = new NetworkMonitor();
|
|
66
|
+
monitor.startMonitoring(fakePage(pageSession, children));
|
|
67
|
+
await flush();
|
|
68
|
+
pageSession.emit('Target.attachedToTarget', attachEvent('sw-1', 'service_worker', true));
|
|
69
|
+
expect(child.sent.map((c) => c.method)).toContain('Runtime.runIfWaitingForDebugger');
|
|
70
|
+
});
|
|
71
|
+
it('sends the resume on the child session, never on the page session', async () => {
|
|
72
|
+
const pageSession = fakeSession();
|
|
73
|
+
const child = fakeSession('Network.enable');
|
|
74
|
+
const monitor = new NetworkMonitor();
|
|
75
|
+
monitor.startMonitoring(fakePage(pageSession, new Map([['sw-1', child]])));
|
|
76
|
+
await flush();
|
|
77
|
+
pageSession.emit('Target.attachedToTarget', attachEvent('sw-1', 'service_worker', true));
|
|
78
|
+
const resume = child.sent.find((c) => c.method === 'Runtime.runIfWaitingForDebugger');
|
|
79
|
+
expect(resume).toBeDefined();
|
|
80
|
+
expect(resume?.params).toBeUndefined();
|
|
81
|
+
expect(pageSession.sent.map((c) => c.method)).not.toContain('Runtime.runIfWaitingForDebugger');
|
|
82
|
+
});
|
|
83
|
+
it('records a socket opened on a held target', async () => {
|
|
84
|
+
const pageSession = fakeSession();
|
|
85
|
+
const child = fakeSession('Network.enable');
|
|
86
|
+
const monitor = new NetworkMonitor();
|
|
87
|
+
monitor.startMonitoring(fakePage(pageSession, new Map([['sw-1', child]])));
|
|
88
|
+
await flush();
|
|
89
|
+
pageSession.emit('Target.attachedToTarget', attachEvent('sw-1', 'service_worker', true));
|
|
90
|
+
child.emit('Network.webSocketCreated', { requestId: '1', url: 'wss://example.test/sync' });
|
|
91
|
+
const sockets = monitor.getSockets();
|
|
92
|
+
expect(sockets).toHaveLength(1);
|
|
93
|
+
expect(sockets[0].target).toBe('service_worker');
|
|
94
|
+
expect(sockets[0].sessionId).toBe('sw-1');
|
|
95
|
+
});
|
|
96
|
+
it('sends no resume for a target that is not held', async () => {
|
|
97
|
+
const pageSession = fakeSession();
|
|
98
|
+
const child = fakeSession();
|
|
99
|
+
const monitor = new NetworkMonitor();
|
|
100
|
+
monitor.startMonitoring(fakePage(pageSession, new Map([['w-1', child]])));
|
|
101
|
+
await flush();
|
|
102
|
+
pageSession.emit('Target.attachedToTarget', attachEvent('w-1', 'worker', false));
|
|
103
|
+
expect(child.sent.map((c) => c.method)).toEqual(['Network.enable']);
|
|
104
|
+
});
|
|
105
|
+
});
|
|
106
|
+
describe('NetworkMonitor.stopMonitoring', () => {
|
|
107
|
+
async function monitored() {
|
|
108
|
+
const pageSession = fakeSession();
|
|
109
|
+
const child = fakeSession('Network.enable');
|
|
110
|
+
const monitor = new NetworkMonitor();
|
|
111
|
+
const page = fakePage(pageSession, new Map([['sw-1', child]]));
|
|
112
|
+
monitor.startMonitoring(page);
|
|
113
|
+
await flush();
|
|
114
|
+
pageSession.emit('Target.attachedToTarget', attachEvent('sw-1', 'service_worker', true));
|
|
115
|
+
return { monitor, page, pageSession, child };
|
|
116
|
+
}
|
|
117
|
+
it('disarms the auto-attach, which releases every held target with it', async () => {
|
|
118
|
+
const { monitor, page, pageSession } = await monitored();
|
|
119
|
+
await monitor.stopMonitoring(page);
|
|
120
|
+
const disarm = pageSession.sent.filter((c) => c.method === 'Target.setAutoAttach').pop();
|
|
121
|
+
expect(disarm?.params).toMatchObject({ autoAttach: false });
|
|
122
|
+
expect(pageSession.detached).toBe(true);
|
|
123
|
+
});
|
|
124
|
+
// Chrome detaches every auto-attached child as the disarm lands, so the
|
|
125
|
+
// detach events arrive DURING the teardown - which is the only window where
|
|
126
|
+
// the guard is reachable.
|
|
127
|
+
it('leaves a socket recorded before the stop reading as open', async () => {
|
|
128
|
+
const { monitor, page, pageSession, child } = await monitored();
|
|
129
|
+
child.emit('Network.webSocketCreated', { requestId: '1', url: 'wss://example.test/sync' });
|
|
130
|
+
const send = pageSession.send;
|
|
131
|
+
pageSession.send = (method, params) => {
|
|
132
|
+
const result = send(method, params);
|
|
133
|
+
if (method === 'Target.setAutoAttach' && params?.autoAttach === false) {
|
|
134
|
+
pageSession.emit('Target.detachedFromTarget', { sessionId: 'sw-1' });
|
|
135
|
+
}
|
|
136
|
+
return result;
|
|
137
|
+
};
|
|
138
|
+
await monitor.stopMonitoring(page);
|
|
139
|
+
expect(monitor.getSockets()[0].closedAt).toBeUndefined();
|
|
140
|
+
});
|
|
141
|
+
it('arms a fresh session when monitoring is turned back on', async () => {
|
|
142
|
+
const { monitor, page, pageSession } = await monitored();
|
|
143
|
+
await monitor.stopMonitoring(page);
|
|
144
|
+
pageSession.sent.length = 0;
|
|
145
|
+
monitor.startMonitoring(page);
|
|
146
|
+
await flush();
|
|
147
|
+
const rearm = pageSession.sent.filter((c) => c.method === 'Target.setAutoAttach').pop();
|
|
148
|
+
expect(rearm?.params).toMatchObject({ autoAttach: true });
|
|
149
|
+
});
|
|
150
|
+
});
|
|
151
|
+
//# sourceMappingURL=network-monitor.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"network-monitor.test.js","sourceRoot":"","sources":["../src/network-monitor.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAYtD,8EAA8E;AAC9E,SAAS,WAAW,CAAC,MAAe;IAClC,MAAM,OAAO,GAAgB;QAC3B,IAAI,EAAE,EAAE;QACR,QAAQ,EAAE,IAAI,GAAG,EAAE;QACnB,IAAI,CAAC,KAAK,EAAE,OAAO;YACjB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;QACzC,CAAC;QACD,IAAI,CAAC,MAAM,EAAE,MAAM;YACjB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;YACtC,IAAI,MAAM,KAAK,MAAM;gBAAE,OAAO,IAAI,OAAO,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YACpD,OAAO,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC7B,CAAC;QACD,EAAE,CAAC,KAAK,EAAE,OAAO;YACf,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QACvC,CAAC;QACD,QAAQ,EAAE,KAAK;QACf,MAAM;YACJ,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;YACxB,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;QAC3B,CAAC;KACF,CAAC;IACF,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,QAAQ,CAAC,WAAwB,EAAE,QAAkC;IAC5E,wEAAwE;IACxE,uDAAuD;IACtD,WAAmB,CAAC,UAAU,GAAG,GAAG,EAAE,CAAC,CAAC;QACvC,OAAO,EAAE,CAAC,EAAU,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI;KAClD,CAAC,CAAC;IACH,OAAO;QACL,EAAE,KAAyD,CAAC;QAC5D,kBAAkB,KAAgB,CAAC;QACnC,KAAK,CAAC,gBAAgB,KAAK,OAAO,WAAW,CAAC,CAAC,CAAC;KACjD,CAAC;AACJ,CAAC;AAED,4EAA4E;AAC5E,KAAK,UAAU,KAAK;IAClB,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;AACzD,CAAC;AAED,SAAS,WAAW,CAAC,SAAiB,EAAE,IAAY,EAAE,kBAA2B;IAC/E,OAAO;QACL,SAAS;QACT,kBAAkB;QAClB,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,SAAS,EAAE,EAAE,GAAG,EAAE,oBAAoB,IAAI,KAAK,EAAE;KACrF,CAAC;AACJ,CAAC;AAED,QAAQ,CAAC,mCAAmC,EAAE,GAAG,EAAE;IACjD,EAAE,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;QACzE,MAAM,WAAW,GAAG,WAAW,EAAE,CAAC;QAClC,MAAM,KAAK,GAAG,WAAW,CAAC,gBAAgB,CAAC,CAAC;QAC5C,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;QAC5C,MAAM,OAAO,GAAG,IAAI,cAAc,EAAE,CAAC;QAErC,OAAO,CAAC,eAAe,CAAC,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAQ,CAAC,CAAC;QAChE,MAAM,KAAK,EAAE,CAAC;QACd,WAAW,CAAC,IAAI,CAAC,yBAAyB,EAAE,WAAW,CAAC,MAAM,EAAE,gBAAgB,EAAE,IAAI,CAAC,CAAC,CAAC;QAEzF,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,iCAAiC,CAAC,CAAC;IACvF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kEAAkE,EAAE,KAAK,IAAI,EAAE;QAChF,MAAM,WAAW,GAAG,WAAW,EAAE,CAAC;QAClC,MAAM,KAAK,GAAG,WAAW,CAAC,gBAAgB,CAAC,CAAC;QAC5C,MAAM,OAAO,GAAG,IAAI,cAAc,EAAE,CAAC;QAErC,OAAO,CAAC,eAAe,CAAC,QAAQ,CAAC,WAAW,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,CAAQ,CAAC,CAAC;QAClF,MAAM,KAAK,EAAE,CAAC;QACd,WAAW,CAAC,IAAI,CAAC,yBAAyB,EAAE,WAAW,CAAC,MAAM,EAAE,gBAAgB,EAAE,IAAI,CAAC,CAAC,CAAC;QAEzF,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,iCAAiC,CAAC,CAAC;QACtF,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;QAC7B,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,aAAa,EAAE,CAAC;QACvC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,iCAAiC,CAAC,CAAC;IACjG,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;QACxD,MAAM,WAAW,GAAG,WAAW,EAAE,CAAC;QAClC,MAAM,KAAK,GAAG,WAAW,CAAC,gBAAgB,CAAC,CAAC;QAC5C,MAAM,OAAO,GAAG,IAAI,cAAc,EAAE,CAAC;QAErC,OAAO,CAAC,eAAe,CAAC,QAAQ,CAAC,WAAW,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,CAAQ,CAAC,CAAC;QAClF,MAAM,KAAK,EAAE,CAAC;QACd,WAAW,CAAC,IAAI,CAAC,yBAAyB,EAAE,WAAW,CAAC,MAAM,EAAE,gBAAgB,EAAE,IAAI,CAAC,CAAC,CAAC;QACzF,KAAK,CAAC,IAAI,CAAC,0BAA0B,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,GAAG,EAAE,yBAAyB,EAAE,CAAC,CAAC;QAE3F,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;QACrC,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAChC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QACjD,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;QAC7D,MAAM,WAAW,GAAG,WAAW,EAAE,CAAC;QAClC,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;QAC5B,MAAM,OAAO,GAAG,IAAI,cAAc,EAAE,CAAC;QAErC,OAAO,CAAC,eAAe,CAAC,QAAQ,CAAC,WAAW,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAQ,CAAC,CAAC;QACjF,MAAM,KAAK,EAAE,CAAC;QACd,WAAW,CAAC,IAAI,CAAC,yBAAyB,EAAE,WAAW,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;QAEjF,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,+BAA+B,EAAE,GAAG,EAAE;IAC7C,KAAK,UAAU,SAAS;QACtB,MAAM,WAAW,GAAG,WAAW,EAAE,CAAC;QAClC,MAAM,KAAK,GAAG,WAAW,CAAC,gBAAgB,CAAC,CAAC;QAC5C,MAAM,OAAO,GAAG,IAAI,cAAc,EAAE,CAAC;QACrC,MAAM,IAAI,GAAG,QAAQ,CAAC,WAAW,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/D,OAAO,CAAC,eAAe,CAAC,IAAW,CAAC,CAAC;QACrC,MAAM,KAAK,EAAE,CAAC;QACd,WAAW,CAAC,IAAI,CAAC,yBAAyB,EAAE,WAAW,CAAC,MAAM,EAAE,gBAAgB,EAAE,IAAI,CAAC,CAAC,CAAC;QACzF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;IAC/C,CAAC;IAED,EAAE,CAAC,mEAAmE,EAAE,KAAK,IAAI,EAAE;QACjF,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,MAAM,SAAS,EAAE,CAAC;QAEzD,MAAM,OAAO,CAAC,cAAc,CAAC,IAAW,CAAC,CAAC;QAE1C,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,sBAAsB,CAAC,CAAC,GAAG,EAAE,CAAC;QACzF,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,aAAa,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;QAC5D,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,wEAAwE;IACxE,4EAA4E;IAC5E,0BAA0B;IAC1B,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;QACxE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,MAAM,SAAS,EAAE,CAAC;QAChE,KAAK,CAAC,IAAI,CAAC,0BAA0B,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,GAAG,EAAE,yBAAyB,EAAE,CAAC,CAAC;QAC3F,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC;QAC9B,WAAW,CAAC,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE;YACpC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YACpC,IAAI,MAAM,KAAK,sBAAsB,IAAK,MAAc,EAAE,UAAU,KAAK,KAAK,EAAE,CAAC;gBAC/E,WAAW,CAAC,IAAI,CAAC,2BAA2B,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;YACvE,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC,CAAC;QAEF,MAAM,OAAO,CAAC,cAAc,CAAC,IAAW,CAAC,CAAC;QAE1C,MAAM,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,aAAa,EAAE,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;QACtE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,MAAM,SAAS,EAAE,CAAC;QACzD,MAAM,OAAO,CAAC,cAAc,CAAC,IAAW,CAAC,CAAC;QAC1C,WAAW,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;QAE5B,OAAO,CAAC,eAAe,CAAC,IAAW,CAAC,CAAC;QACrC,MAAM,KAAK,EAAE,CAAC;QAEd,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,sBAAsB,CAAC,CAAC,GAAG,EAAE,CAAC;QACxF,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,aAAa,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for the plugin's SessionStart hook.
|
|
3
|
+
*
|
|
4
|
+
* The script cannot import from this package - it runs before any devharness
|
|
5
|
+
* server exists - so it re-derives the event stream path from the same rule.
|
|
6
|
+
* The case that matters most is the one asserting the two agree: nothing else
|
|
7
|
+
* would catch the convention changing on one side only.
|
|
8
|
+
*/
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=plugin-session-start-hook.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-session-start-hook.test.d.ts","sourceRoot":"","sources":["../src/plugin-session-start-hook.test.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for the plugin's SessionStart hook.
|
|
3
|
+
*
|
|
4
|
+
* The script cannot import from this package - it runs before any devharness
|
|
5
|
+
* server exists - so it re-derives the event stream path from the same rule.
|
|
6
|
+
* The case that matters most is the one asserting the two agree: nothing else
|
|
7
|
+
* would catch the convention changing on one side only.
|
|
8
|
+
*/
|
|
9
|
+
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
10
|
+
import { execFileSync } from 'child_process';
|
|
11
|
+
import { mkdtempSync, mkdirSync, writeFileSync, readFileSync, statSync, chmodSync, rmSync, existsSync, readdirSync } from 'fs';
|
|
12
|
+
import { tmpdir } from 'os';
|
|
13
|
+
import { join, dirname } from 'path';
|
|
14
|
+
import { initializePaths } from './helpers/paths.js';
|
|
15
|
+
import { getEventStreamPath } from './session-events.js';
|
|
16
|
+
const HOOK = join(process.cwd(), 'plugin', 'hooks', 'session-start.mjs');
|
|
17
|
+
const SESSION_ID = '2e9119bf-672e-4ad8-89c1-f44fcd1060d8';
|
|
18
|
+
let dir;
|
|
19
|
+
let previousDir;
|
|
20
|
+
/**
|
|
21
|
+
* Run the hook the way Claude Code does: event JSON on stdin, and read back
|
|
22
|
+
* the additionalContext it emits. Empty output means the hook declined to say
|
|
23
|
+
* anything, which is its response to every input it must not act on.
|
|
24
|
+
*/
|
|
25
|
+
function runHook(input, env = {}) {
|
|
26
|
+
const raw = execFileSync('node', [HOOK], {
|
|
27
|
+
input,
|
|
28
|
+
encoding: 'utf-8',
|
|
29
|
+
env: { ...process.env, DEVHARNESS_DIR: dir, ...env },
|
|
30
|
+
});
|
|
31
|
+
if (!raw.trim())
|
|
32
|
+
return '';
|
|
33
|
+
return JSON.parse(raw).hookSpecificOutput.additionalContext;
|
|
34
|
+
}
|
|
35
|
+
/** A `devharness` on PATH that reports `version`, or one that reports nothing. */
|
|
36
|
+
function fakeCliOnPath(version) {
|
|
37
|
+
const binDir = join(dir, 'bin');
|
|
38
|
+
mkdirSync(binDir, { recursive: true });
|
|
39
|
+
const script = version === null ? 'echo not-a-version' : `echo ${version}`;
|
|
40
|
+
writeFileSync(join(binDir, 'devharness'), `#!/bin/sh\n${script}\n`);
|
|
41
|
+
chmodSync(join(binDir, 'devharness'), 0o755);
|
|
42
|
+
return { PATH: `${binDir}:${process.env.PATH}` };
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* A PATH with node on it and nothing else, so the hook can run while finding
|
|
46
|
+
* no `devharness`. Emptying PATH entirely would take node with it.
|
|
47
|
+
*/
|
|
48
|
+
const NO_CLI_PATH = { PATH: dirname(process.execPath) };
|
|
49
|
+
/** A plugin root whose .mcp.json pins `version`. */
|
|
50
|
+
function pluginRootPinning(version) {
|
|
51
|
+
const root = join(dir, 'plugin');
|
|
52
|
+
mkdirSync(root, { recursive: true });
|
|
53
|
+
writeFileSync(join(root, '.mcp.json'), JSON.stringify({
|
|
54
|
+
mcpServers: { devharness: { command: 'npx', args: ['-y', `devharness@${version}`] } },
|
|
55
|
+
}));
|
|
56
|
+
return { CLAUDE_PLUGIN_ROOT: root };
|
|
57
|
+
}
|
|
58
|
+
beforeEach(() => {
|
|
59
|
+
previousDir = process.env.DEVHARNESS_DIR;
|
|
60
|
+
dir = mkdtempSync(join(tmpdir(), 'devharness-hook-'));
|
|
61
|
+
process.env.DEVHARNESS_DIR = dir;
|
|
62
|
+
initializePaths();
|
|
63
|
+
});
|
|
64
|
+
afterEach(() => {
|
|
65
|
+
if (previousDir === undefined)
|
|
66
|
+
delete process.env.DEVHARNESS_DIR;
|
|
67
|
+
else
|
|
68
|
+
process.env.DEVHARNESS_DIR = previousDir;
|
|
69
|
+
initializePaths();
|
|
70
|
+
rmSync(dir, { recursive: true, force: true });
|
|
71
|
+
});
|
|
72
|
+
describe('session-start hook', () => {
|
|
73
|
+
it('names the same stream path the server writes to', () => {
|
|
74
|
+
const output = runHook(JSON.stringify({ session_id: SESSION_ID, hook_event_name: 'SessionStart' }));
|
|
75
|
+
expect(output).toContain(getEventStreamPath('2e9119bf'));
|
|
76
|
+
});
|
|
77
|
+
it('emits additionalContext, not bare stdout', () => {
|
|
78
|
+
const raw = execFileSync('node', [HOOK], {
|
|
79
|
+
input: JSON.stringify({ session_id: SESSION_ID }),
|
|
80
|
+
encoding: 'utf-8',
|
|
81
|
+
env: { ...process.env, DEVHARNESS_DIR: dir },
|
|
82
|
+
});
|
|
83
|
+
expect(JSON.parse(raw).hookSpecificOutput.hookEventName).toBe('SessionStart');
|
|
84
|
+
});
|
|
85
|
+
it('creates the file, so a watch has something to tail before the server starts', () => {
|
|
86
|
+
runHook(JSON.stringify({ session_id: SESSION_ID }));
|
|
87
|
+
expect(existsSync(getEventStreamPath('2e9119bf'))).toBe(true);
|
|
88
|
+
});
|
|
89
|
+
it('prints a Monitor call carrying every field the tool requires', () => {
|
|
90
|
+
const output = runHook(JSON.stringify({ session_id: SESSION_ID }));
|
|
91
|
+
expect(output).toContain('tail -f -n0');
|
|
92
|
+
// command, description, persistent and timeout_ms are all required by the
|
|
93
|
+
// Monitor schema; a call missing one is rejected, not merely suboptimal.
|
|
94
|
+
expect(output).toMatch(/Monitor\(\{[^}]*command:/);
|
|
95
|
+
expect(output).toContain('description: "devharness events"');
|
|
96
|
+
expect(output).toContain('persistent: true');
|
|
97
|
+
expect(output).toContain('timeout_ms:');
|
|
98
|
+
});
|
|
99
|
+
it('honours DEVHARNESS_DIR, so a relocated state root is still found', () => {
|
|
100
|
+
const output = runHook(JSON.stringify({ session_id: SESSION_ID }));
|
|
101
|
+
expect(output).toContain(join(dir, 'events', '2e9119bf.jsonl'));
|
|
102
|
+
});
|
|
103
|
+
});
|
|
104
|
+
describe('session-start hook - inputs it must not act on', () => {
|
|
105
|
+
it('says nothing for input that is not JSON', () => {
|
|
106
|
+
expect(runHook('not json')).toBe('');
|
|
107
|
+
});
|
|
108
|
+
it('says nothing for empty input', () => {
|
|
109
|
+
expect(runHook('')).toBe('');
|
|
110
|
+
});
|
|
111
|
+
it('says nothing when the event carries no session id', () => {
|
|
112
|
+
expect(runHook(JSON.stringify({ hook_event_name: 'SessionStart' }))).toBe('');
|
|
113
|
+
});
|
|
114
|
+
it('writes nothing for an id that would escape the events directory', () => {
|
|
115
|
+
expect(runHook(JSON.stringify({ session_id: '../../escape' }))).toBe('');
|
|
116
|
+
expect(existsSync(join(dir, 'events'))).toBe(false);
|
|
117
|
+
});
|
|
118
|
+
it('writes nothing for an id that is not a string', () => {
|
|
119
|
+
expect(runHook(JSON.stringify({ session_id: 42 }))).toBe('');
|
|
120
|
+
expect(existsSync(join(dir, 'events'))).toBe(false);
|
|
121
|
+
});
|
|
122
|
+
});
|
|
123
|
+
describe('session-start hook - what it leaves behind', () => {
|
|
124
|
+
it('creates exactly one file, named for the session', () => {
|
|
125
|
+
runHook(JSON.stringify({ session_id: SESSION_ID }));
|
|
126
|
+
expect(readdirSync(join(dir, 'events'))).toEqual(['2e9119bf.jsonl']);
|
|
127
|
+
});
|
|
128
|
+
});
|
|
129
|
+
describe('session-start hook - recording the current conversation', () => {
|
|
130
|
+
const SOCKET = { CLAUDE_CODE_MESSAGING_SOCKET: '/tmp/cc-socks/61220.sock' };
|
|
131
|
+
function recorded() {
|
|
132
|
+
return JSON.parse(readFileSync(join(dir, 'clients', '61220.json'), 'utf-8'));
|
|
133
|
+
}
|
|
134
|
+
it('writes the conversation id where the server reads it', () => {
|
|
135
|
+
runHook(JSON.stringify({ session_id: SESSION_ID }), SOCKET);
|
|
136
|
+
expect(recorded().sessionId).toBe(SESSION_ID);
|
|
137
|
+
});
|
|
138
|
+
it('overwrites it when a clear brings a new conversation', () => {
|
|
139
|
+
runHook(JSON.stringify({ session_id: SESSION_ID }), SOCKET);
|
|
140
|
+
runHook(JSON.stringify({ session_id: 'bbbbbbbb-9999-0000-1111-222222222222' }), SOCKET);
|
|
141
|
+
expect(recorded().sessionId).toBe('bbbbbbbb-9999-0000-1111-222222222222');
|
|
142
|
+
});
|
|
143
|
+
it('writes the record owner-only', () => {
|
|
144
|
+
runHook(JSON.stringify({ session_id: SESSION_ID }), SOCKET);
|
|
145
|
+
expect(statSync(join(dir, 'clients', '61220.json')).mode & 0o777).toBe(0o600);
|
|
146
|
+
});
|
|
147
|
+
it('still names the stream when no socket identifies the client', () => {
|
|
148
|
+
const output = runHook(JSON.stringify({ session_id: SESSION_ID }), { CLAUDE_CODE_MESSAGING_SOCKET: '' });
|
|
149
|
+
expect(output).toContain('2e9119bf.jsonl');
|
|
150
|
+
expect(existsSync(join(dir, 'clients'))).toBe(false);
|
|
151
|
+
});
|
|
152
|
+
});
|
|
153
|
+
describe('session-start hook - the CLI on PATH', () => {
|
|
154
|
+
const payload = JSON.stringify({ session_id: SESSION_ID });
|
|
155
|
+
it('says nothing about the CLI when the installed version matches the pin', () => {
|
|
156
|
+
const output = runHook(payload, { ...pluginRootPinning('1.2.3'), ...fakeCliOnPath('1.2.3') });
|
|
157
|
+
expect(output).not.toMatch(/npm i -g/);
|
|
158
|
+
expect(output).not.toMatch(/not on PATH/);
|
|
159
|
+
});
|
|
160
|
+
it('reports a drift between the installed version and the pin', () => {
|
|
161
|
+
const output = runHook(payload, { ...pluginRootPinning('1.2.3'), ...fakeCliOnPath('1.0.0') });
|
|
162
|
+
expect(output).toContain('on PATH is 1.0.0');
|
|
163
|
+
expect(output).toContain('pins 1.2.3');
|
|
164
|
+
expect(output).toContain('npm i -g devharness@1.2.3');
|
|
165
|
+
});
|
|
166
|
+
it('reports a build too old to state its version', () => {
|
|
167
|
+
const output = runHook(payload, { ...pluginRootPinning('1.2.3'), ...fakeCliOnPath(null) });
|
|
168
|
+
expect(output).toContain('reports no version');
|
|
169
|
+
expect(output).toContain('predates the 1.2.3');
|
|
170
|
+
});
|
|
171
|
+
it('offers both the npx form and the install when nothing is on PATH', () => {
|
|
172
|
+
const output = runHook(payload, { ...pluginRootPinning('1.2.3'), ...NO_CLI_PATH });
|
|
173
|
+
expect(output).toContain('not on PATH');
|
|
174
|
+
expect(output).toContain('npx -y devharness@1.2.3');
|
|
175
|
+
expect(output).toContain('npm i -g devharness@1.2.3');
|
|
176
|
+
});
|
|
177
|
+
it('leaves the version out of its advice when no plugin root names a pin', () => {
|
|
178
|
+
const output = runHook(payload, { ...NO_CLI_PATH });
|
|
179
|
+
expect(output).toContain('npm i -g devharness');
|
|
180
|
+
expect(output).not.toMatch(/devharness@\d/);
|
|
181
|
+
});
|
|
182
|
+
it('never installs anything itself', () => {
|
|
183
|
+
const output = runHook(payload, { ...pluginRootPinning('1.2.3'), ...NO_CLI_PATH });
|
|
184
|
+
expect(output).toContain('do not run it unasked');
|
|
185
|
+
});
|
|
186
|
+
});
|
|
187
|
+
//# sourceMappingURL=plugin-session-start-hook.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-session-start-hook.test.js","sourceRoot":"","sources":["../src/plugin-session-start-hook.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session endpoint - the private channel a CLI process uses to run a tool
|
|
3
|
+
* inside this MCP session, against the connections this session already holds.
|
|
4
|
+
*
|
|
5
|
+
* A unix socket, not a TCP port. The tools reachable here evaluate JavaScript
|
|
6
|
+
* in the session's browser and read its cookies; a web page can reach a
|
|
7
|
+
* localhost port and cannot open a socket file, so the address type is the
|
|
8
|
+
* access control.
|
|
9
|
+
*
|
|
10
|
+
* On Windows the address is a named pipe. Node's `net` API is identical for
|
|
11
|
+
* both, and libuv rejects remote clients, but a pipe carries no mode bits -
|
|
12
|
+
* the 0600 guarantee holds on POSIX only.
|
|
13
|
+
*/
|
|
14
|
+
/** What a CLI needs to recognise this session and reach it. */
|
|
15
|
+
export interface SessionRecord {
|
|
16
|
+
pid: number;
|
|
17
|
+
ppid: number;
|
|
18
|
+
cwd: string;
|
|
19
|
+
sessionId?: string;
|
|
20
|
+
shortId?: string;
|
|
21
|
+
/** Socket path or named pipe this session listens on. */
|
|
22
|
+
address: string;
|
|
23
|
+
startedAt: number;
|
|
24
|
+
}
|
|
25
|
+
/** One request on the socket: run this tool with these arguments. */
|
|
26
|
+
export interface EndpointRequest {
|
|
27
|
+
tool: string;
|
|
28
|
+
args: Record<string, unknown>;
|
|
29
|
+
}
|
|
30
|
+
/** The reply. `response` is the tool's own MCP response, content and _meta
|
|
31
|
+
* intact, so a CLI prints exactly what an MCP client would receive. */
|
|
32
|
+
export interface EndpointReply {
|
|
33
|
+
ok: boolean;
|
|
34
|
+
response?: unknown;
|
|
35
|
+
error?: string;
|
|
36
|
+
}
|
|
37
|
+
export interface SessionEndpoint {
|
|
38
|
+
address: string;
|
|
39
|
+
presencePath: string;
|
|
40
|
+
/** Rewrite the presence record - the short id arrives after the listener
|
|
41
|
+
* starts, and a CLI matching on it needs the current value. */
|
|
42
|
+
refresh(identity: Partial<SessionRecord>): Promise<void>;
|
|
43
|
+
close(): Promise<void>;
|
|
44
|
+
}
|
|
45
|
+
/** Owned by this feature alone: `~/.devharness/sessions/` already holds the
|
|
46
|
+
* supervisor presence records `server-claims.ts` writes, under a different
|
|
47
|
+
* schema. */
|
|
48
|
+
export declare function getEndpointsDir(): string;
|
|
49
|
+
export declare function getPresencePath(pid: number): string;
|
|
50
|
+
/** The listen address for `pid`: a named pipe on Windows, a socket file under
|
|
51
|
+
* the sessions directory otherwise, falling back to the temp directory when
|
|
52
|
+
* that path would exceed the sockaddr limit. */
|
|
53
|
+
export declare function getEndpointAddress(pid: number): string;
|
|
54
|
+
/** Every session record on disk, newest first. Records naming a dead process
|
|
55
|
+
* are dropped and their files removed: a killed session leaves both behind,
|
|
56
|
+
* and a CLI matching against one would dial a socket nothing is listening on. */
|
|
57
|
+
export declare function listSessionRecords(): SessionRecord[];
|
|
58
|
+
export interface StartSessionEndpointOptions {
|
|
59
|
+
executeToolCall: (toolName: string, args: Record<string, unknown>, abortSignal?: AbortSignal) => Promise<unknown>;
|
|
60
|
+
identity: Omit<SessionRecord, 'address' | 'startedAt'>;
|
|
61
|
+
/** Resolves once the server has finished recovering managed state. A call
|
|
62
|
+
* arriving before that would run against a half-initialised server manager,
|
|
63
|
+
* which the MCP request handler already waits out. */
|
|
64
|
+
awaitReady?: () => Promise<void>;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Listen for CLI tool calls and publish the presence record that locates this
|
|
68
|
+
* session. Returns null when the listener cannot bind - the MCP session keeps
|
|
69
|
+
* working, the CLI just cannot reach it.
|
|
70
|
+
*/
|
|
71
|
+
export declare function startSessionEndpoint(options: StartSessionEndpointOptions): Promise<SessionEndpoint | null>;
|
|
72
|
+
//# sourceMappingURL=session-endpoint.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-endpoint.d.ts","sourceRoot":"","sources":["../src/session-endpoint.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAQH,+DAA+D;AAC/D,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,yDAAyD;IACzD,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qEAAqE;AACrE,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B;AAED;wEACwE;AACxE,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,OAAO,CAAC;IACZ,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB;oEACgE;IAChE,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAMD;;cAEc;AACd,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED;;iDAEiD;AACjD,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAOtD;AAED;;kFAEkF;AAClF,wBAAgB,kBAAkB,IAAI,aAAa,EAAE,CAkCpD;AAED,MAAM,WAAW,2BAA2B;IAC1C,eAAe,EAAE,CACf,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,WAAW,CAAC,EAAE,WAAW,KACtB,OAAO,CAAC,OAAO,CAAC,CAAC;IACtB,QAAQ,EAAE,IAAI,CAAC,aAAa,EAAE,SAAS,GAAG,WAAW,CAAC,CAAC;IACvD;;2DAEuD;IACvD,UAAU,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAClC;AAED;;;;GAIG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,2BAA2B,GACnC,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAwDjC"}
|