@redplanethq/corebrain 2.8.13 → 2.8.14
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/dist/commands/coding/list.js +1 -1
- package/dist/commands/coding/list.js.map +1 -1
- package/dist/commands/coding/setup.d.ts +2 -1
- package/dist/commands/coding/setup.d.ts.map +1 -1
- package/dist/commands/coding/setup.js +1 -24
- package/dist/commands/coding/setup.js.map +1 -1
- package/dist/commands/folder/add.d.ts +13 -0
- package/dist/commands/folder/add.d.ts.map +1 -0
- package/dist/commands/folder/add.js +71 -0
- package/dist/commands/folder/add.js.map +1 -0
- package/dist/commands/folder/index.d.ts +3 -0
- package/dist/commands/folder/index.d.ts.map +1 -0
- package/dist/commands/folder/index.js +5 -0
- package/dist/commands/folder/index.js.map +1 -0
- package/dist/commands/folder/list.d.ts +8 -0
- package/dist/commands/folder/list.d.ts.map +1 -0
- package/dist/commands/folder/list.js +39 -0
- package/dist/commands/folder/list.js.map +1 -0
- package/dist/commands/folder/remove.d.ts +10 -0
- package/dist/commands/folder/remove.d.ts.map +1 -0
- package/dist/commands/folder/remove.js +29 -0
- package/dist/commands/folder/remove.js.map +1 -0
- package/dist/commands/folder/scope.d.ts +13 -0
- package/dist/commands/folder/scope.d.ts.map +1 -0
- package/dist/commands/folder/scope.js +61 -0
- package/dist/commands/folder/scope.js.map +1 -0
- package/dist/commands/gateway/config.d.ts +1 -1
- package/dist/commands/gateway/config.d.ts.map +1 -1
- package/dist/commands/gateway/config.js +122 -116
- package/dist/commands/gateway/config.js.map +1 -1
- package/dist/commands/gateway/register.d.ts +37 -0
- package/dist/commands/gateway/register.d.ts.map +1 -0
- package/dist/commands/gateway/register.js +132 -0
- package/dist/commands/gateway/register.js.map +1 -0
- package/dist/commands/gateway/start.d.ts +2 -1
- package/dist/commands/gateway/start.d.ts.map +1 -1
- package/dist/commands/gateway/start.js +73 -6
- package/dist/commands/gateway/start.js.map +1 -1
- package/dist/commands/gateway/status.d.ts.map +1 -1
- package/dist/commands/gateway/status.js +10 -1
- package/dist/commands/gateway/status.js.map +1 -1
- package/dist/commands/gateway/stop.d.ts.map +1 -1
- package/dist/commands/gateway/stop.js +11 -0
- package/dist/commands/gateway/stop.js.map +1 -1
- package/dist/config/folders.d.ts +20 -0
- package/dist/config/folders.d.ts.map +1 -0
- package/dist/config/folders.js +114 -0
- package/dist/config/folders.js.map +1 -0
- package/dist/server/api/auth.d.ts +17 -0
- package/dist/server/api/auth.d.ts.map +1 -0
- package/dist/server/api/auth.js +45 -0
- package/dist/server/api/auth.js.map +1 -0
- package/dist/server/api/browser/cdp.d.ts +18 -0
- package/dist/server/api/browser/cdp.d.ts.map +1 -0
- package/dist/server/api/browser/cdp.js +137 -0
- package/dist/server/api/browser/cdp.js.map +1 -0
- package/dist/server/api/browser/index.d.ts +3 -0
- package/dist/server/api/browser/index.d.ts.map +1 -0
- package/dist/server/api/browser/index.js +10 -0
- package/dist/server/api/browser/index.js.map +1 -0
- package/dist/server/api/browser/launch.d.ts +17 -0
- package/dist/server/api/browser/launch.d.ts.map +1 -0
- package/dist/server/api/browser/launch.js +41 -0
- package/dist/server/api/browser/launch.js.map +1 -0
- package/dist/server/api/coding/coding_spawn.d.ts +22 -0
- package/dist/server/api/coding/coding_spawn.d.ts.map +1 -0
- package/dist/server/api/coding/coding_spawn.js +121 -0
- package/dist/server/api/coding/coding_spawn.js.map +1 -0
- package/dist/server/api/coding/coding_xterm_session.d.ts +3 -0
- package/dist/server/api/coding/coding_xterm_session.d.ts.map +1 -0
- package/dist/server/api/coding/coding_xterm_session.js +163 -0
- package/dist/server/api/coding/coding_xterm_session.js.map +1 -0
- package/dist/server/api/coding/index.d.ts +10 -0
- package/dist/server/api/coding/index.d.ts.map +1 -0
- package/dist/server/api/coding/index.js +17 -0
- package/dist/server/api/coding/index.js.map +1 -0
- package/dist/server/api/exec/index.d.ts +3 -0
- package/dist/server/api/exec/index.d.ts.map +1 -0
- package/dist/server/api/exec/index.js +6 -0
- package/dist/server/api/exec/index.js.map +1 -0
- package/dist/server/api/files/index.d.ts +3 -0
- package/dist/server/api/files/index.d.ts.map +1 -0
- package/dist/server/api/files/index.js +6 -0
- package/dist/server/api/files/index.js.map +1 -0
- package/dist/server/api/folders/index.d.ts +14 -0
- package/dist/server/api/folders/index.d.ts.map +1 -0
- package/dist/server/api/folders/index.js +161 -0
- package/dist/server/api/folders/index.js.map +1 -0
- package/dist/server/api/manifest-builder.d.ts +13 -0
- package/dist/server/api/manifest-builder.d.ts.map +1 -0
- package/dist/server/api/manifest-builder.js +155 -0
- package/dist/server/api/manifest-builder.js.map +1 -0
- package/dist/server/api/ops.d.ts +3 -0
- package/dist/server/api/ops.d.ts.map +1 -0
- package/dist/server/api/ops.js +32 -0
- package/dist/server/api/ops.js.map +1 -0
- package/dist/server/api/server.d.ts +9 -0
- package/dist/server/api/server.d.ts.map +1 -0
- package/dist/server/api/server.js +66 -0
- package/dist/server/api/server.js.map +1 -0
- package/dist/server/api/shell/index.d.ts +17 -0
- package/dist/server/api/shell/index.d.ts.map +1 -0
- package/dist/server/api/shell/index.js +61 -0
- package/dist/server/api/shell/index.js.map +1 -0
- package/dist/server/api/tool-group.d.ts +21 -0
- package/dist/server/api/tool-group.d.ts.map +1 -0
- package/dist/server/api/tool-group.js +23 -0
- package/dist/server/api/tool-group.js.map +1 -0
- package/dist/server/api/tunnels/ngrok.d.ts +10 -0
- package/dist/server/api/tunnels/ngrok.d.ts.map +1 -0
- package/dist/server/api/tunnels/ngrok.js +33 -0
- package/dist/server/api/tunnels/ngrok.js.map +1 -0
- package/dist/server/api/tunnels/tailscale.d.ts +12 -0
- package/dist/server/api/tunnels/tailscale.d.ts.map +1 -0
- package/dist/server/api/tunnels/tailscale.js +49 -0
- package/dist/server/api/tunnels/tailscale.js.map +1 -0
- package/dist/server/api/utils/index.d.ts +3 -0
- package/dist/server/api/utils/index.d.ts.map +1 -0
- package/dist/server/api/utils/index.js +6 -0
- package/dist/server/api/utils/index.js.map +1 -0
- package/dist/server/gateway-entry.d.ts +2 -2
- package/dist/server/gateway-entry.js +43 -106
- package/dist/server/gateway-entry.js.map +1 -1
- package/dist/server/gateway-log.d.ts +10 -0
- package/dist/server/gateway-log.d.ts.map +1 -0
- package/dist/server/gateway-log.js +33 -0
- package/dist/server/gateway-log.js.map +1 -0
- package/dist/server/pty/manager.d.ts +75 -0
- package/dist/server/pty/manager.d.ts.map +1 -0
- package/dist/server/pty/manager.js +280 -0
- package/dist/server/pty/manager.js.map +1 -0
- package/dist/server/tools/coding-tools.d.ts.map +1 -1
- package/dist/server/tools/coding-tools.js +56 -17
- package/dist/server/tools/coding-tools.js.map +1 -1
- package/dist/server/tools/exec-tools.d.ts.map +1 -1
- package/dist/server/tools/exec-tools.js +30 -3
- package/dist/server/tools/exec-tools.js.map +1 -1
- package/dist/server/tools/files-tools.d.ts +8 -0
- package/dist/server/tools/files-tools.d.ts.map +1 -0
- package/dist/server/tools/files-tools.js +523 -0
- package/dist/server/tools/files-tools.js.map +1 -0
- package/dist/server/tools/scope-error.d.ts +8 -0
- package/dist/server/tools/scope-error.d.ts.map +1 -0
- package/dist/server/tools/scope-error.js +11 -0
- package/dist/server/tools/scope-error.js.map +1 -0
- package/dist/types/config.d.ts +15 -3
- package/dist/types/config.d.ts.map +1 -1
- package/dist/utils/agent-templates.d.ts +18 -0
- package/dist/utils/agent-templates.d.ts.map +1 -0
- package/dist/utils/agent-templates.js +59 -0
- package/dist/utils/agent-templates.js.map +1 -0
- package/dist/utils/browser-manager.d.ts +20 -0
- package/dist/utils/browser-manager.d.ts.map +1 -1
- package/dist/utils/browser-manager.js +76 -0
- package/dist/utils/browser-manager.js.map +1 -1
- package/dist/utils/coding-agents/codex.d.ts +5 -8
- package/dist/utils/coding-agents/codex.d.ts.map +1 -1
- package/dist/utils/coding-agents/codex.js +6 -26
- package/dist/utils/coding-agents/codex.js.map +1 -1
- package/dist/utils/coding-runner.d.ts +13 -9
- package/dist/utils/coding-runner.d.ts.map +1 -1
- package/dist/utils/coding-runner.js +45 -78
- package/dist/utils/coding-runner.js.map +1 -1
- package/dist/utils/env-bootstrap.d.ts +29 -0
- package/dist/utils/env-bootstrap.d.ts.map +1 -0
- package/dist/utils/env-bootstrap.js +204 -0
- package/dist/utils/env-bootstrap.js.map +1 -0
- package/package.json +8 -1
- package/dist/commands/coding/close.d.ts +0 -11
- package/dist/commands/coding/close.d.ts.map +0 -1
- package/dist/commands/coding/close.js +0 -76
- package/dist/commands/coding/close.js.map +0 -1
- package/dist/commands/coding/resume.d.ts +0 -12
- package/dist/commands/coding/resume.d.ts.map +0 -1
- package/dist/commands/coding/resume.js +0 -86
- package/dist/commands/coding/resume.js.map +0 -1
- package/dist/commands/coding/start.d.ts +0 -17
- package/dist/commands/coding/start.d.ts.map +0 -1
- package/dist/commands/coding/start.js +0 -135
- package/dist/commands/coding/start.js.map +0 -1
- package/dist/server/gateway-client.d.ts +0 -84
- package/dist/server/gateway-client.d.ts.map +0 -1
- package/dist/server/gateway-client.js +0 -340
- package/dist/server/gateway-client.js.map +0 -1
- package/dist/server/tools/imessage-tools.d.ts +0 -34
- package/dist/server/tools/imessage-tools.d.ts.map +0 -1
- package/dist/server/tools/imessage-tools.js +0 -262
- package/dist/server/tools/imessage-tools.js.map +0 -1
- package/dist/utils/app-bundle.d.ts +0 -25
- package/dist/utils/app-bundle.d.ts.map +0 -1
- package/dist/utils/app-bundle.js +0 -117
- package/dist/utils/app-bundle.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-group.d.ts","sourceRoot":"","sources":["../../../src/server/api/tool-group.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,kBAAkB,EAAC,MAAM,SAAS,CAAC;AAEhD,UAAU,QAAQ;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACpB;AAED,UAAU,UAAU;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAED,KAAK,QAAQ,GAAG,CACf,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC3B,OAAO,CAAC,UAAU,CAAC,GAAG,UAAU,CAAC;AAEtC;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAClC,KAAK,EAAE,QAAQ,EAAE,EACjB,OAAO,EAAE,QAAQ,GACf,kBAAkB,CAcpB"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Build a Fastify plugin that exposes one POST route per tool in `tools`,
|
|
3
|
+
* each at path `/{tool.name}` — e.g. /api/coding/coding_ask.
|
|
4
|
+
*
|
|
5
|
+
* The plugin is meant to be registered with a prefix:
|
|
6
|
+
* app.register(makeToolGroupRoutes(codingTools, executeCodingTool), { prefix: '/api/coding' });
|
|
7
|
+
*/
|
|
8
|
+
export function makeToolGroupRoutes(tools, execute) {
|
|
9
|
+
return async (app) => {
|
|
10
|
+
for (const tool of tools) {
|
|
11
|
+
app.post(`/${tool.name}`, async (req, reply) => {
|
|
12
|
+
const params = req.body ?? {};
|
|
13
|
+
const result = await execute(tool.name, params);
|
|
14
|
+
if (!result.success) {
|
|
15
|
+
reply.code(400);
|
|
16
|
+
return { ok: false, error: { code: 'TOOL_ERROR', message: result.error ?? 'unknown' } };
|
|
17
|
+
}
|
|
18
|
+
return { ok: true, result: result.result };
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=tool-group.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-group.js","sourceRoot":"","sources":["../../../src/server/api/tool-group.ts"],"names":[],"mappings":"AAkBA;;;;;;GAMG;AACH,MAAM,UAAU,mBAAmB,CAClC,KAAiB,EACjB,OAAiB;IAEjB,OAAO,KAAK,EAAE,GAAG,EAAE,EAAE;QACpB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YAC1B,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE;gBAC9C,MAAM,MAAM,GAAI,GAAG,CAAC,IAAuC,IAAI,EAAE,CAAC;gBAClE,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;gBAChD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;oBACrB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;oBAChB,OAAO,EAAC,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAC,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,IAAI,SAAS,EAAC,EAAC,CAAC;gBACrF,CAAC;gBACD,OAAO,EAAC,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAC,CAAC;YAC1C,CAAC,CAAC,CAAC;QACJ,CAAC;IACF,CAAC,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Start `ngrok http <port>` and discover the public HTTPS URL via ngrok's
|
|
3
|
+
* local API on 127.0.0.1:4040. Requires the `ngrok` CLI on PATH and an
|
|
4
|
+
* auth token configured (`ngrok config add-authtoken <token>`).
|
|
5
|
+
*/
|
|
6
|
+
export declare function startNgrok(port: number): Promise<{
|
|
7
|
+
url: string;
|
|
8
|
+
pid: number;
|
|
9
|
+
}>;
|
|
10
|
+
//# sourceMappingURL=ngrok.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ngrok.d.ts","sourceRoot":"","sources":["../../../../src/server/api/tunnels/ngrok.ts"],"names":[],"mappings":"AAaA;;;;GAIG;AACH,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAC,CAAC,CA0BlF"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
import { setTimeout as sleep } from 'node:timers/promises';
|
|
3
|
+
/**
|
|
4
|
+
* Start `ngrok http <port>` and discover the public HTTPS URL via ngrok's
|
|
5
|
+
* local API on 127.0.0.1:4040. Requires the `ngrok` CLI on PATH and an
|
|
6
|
+
* auth token configured (`ngrok config add-authtoken <token>`).
|
|
7
|
+
*/
|
|
8
|
+
export async function startNgrok(port) {
|
|
9
|
+
const child = spawn('ngrok', ['http', String(port), '--log=stdout'], {
|
|
10
|
+
stdio: 'ignore',
|
|
11
|
+
detached: true,
|
|
12
|
+
});
|
|
13
|
+
child.unref();
|
|
14
|
+
const deadline = Date.now() + 15_000;
|
|
15
|
+
while (Date.now() < deadline) {
|
|
16
|
+
await sleep(500);
|
|
17
|
+
try {
|
|
18
|
+
const res = await fetch('http://127.0.0.1:4040/api/tunnels');
|
|
19
|
+
if (!res.ok)
|
|
20
|
+
continue;
|
|
21
|
+
const json = (await res.json());
|
|
22
|
+
const tunnel = (json.tunnels ?? []).find((t) => t.proto === 'https');
|
|
23
|
+
if (tunnel?.public_url) {
|
|
24
|
+
return { url: tunnel.public_url, pid: child.pid ?? 0 };
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
/* not up yet */
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
throw new Error('ngrok did not expose a public URL within 15s. Is the `ngrok` CLI installed and `ngrok config add-authtoken <token>` run?');
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=ngrok.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ngrok.js","sourceRoot":"","sources":["../../../../src/server/api/tunnels/ngrok.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,KAAK,EAAC,MAAM,oBAAoB,CAAC;AACzC,OAAO,EAAC,UAAU,IAAI,KAAK,EAAC,MAAM,sBAAsB,CAAC;AAYzD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAY;IAC5C,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,cAAc,CAAC,EAAE;QACpE,KAAK,EAAE,QAAQ;QACf,QAAQ,EAAE,IAAI;KACd,CAAC,CAAC;IACH,KAAK,CAAC,KAAK,EAAE,CAAC;IAEd,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC;IACrC,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;QAC9B,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;QACjB,IAAI,CAAC;YACJ,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,mCAAmC,CAAC,CAAC;YAC7D,IAAI,CAAC,GAAG,CAAC,EAAE;gBAAE,SAAS;YACtB,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAyB,CAAC;YACxD,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,OAAO,CAAC,CAAC;YACrE,IAAI,MAAM,EAAE,UAAU,EAAE,CAAC;gBACxB,OAAO,EAAC,GAAG,EAAE,MAAM,CAAC,UAAU,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,IAAI,CAAC,EAAC,CAAC;YACtD,CAAC;QACF,CAAC;QAAC,MAAM,CAAC;YACR,gBAAgB;QACjB,CAAC;IACF,CAAC;IAED,MAAM,IAAI,KAAK,CACd,0HAA0H,CAC1H,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Start `tailscale funnel` pointing at the given local port.
|
|
3
|
+
* Requires:
|
|
4
|
+
* - `tailscale` CLI on PATH
|
|
5
|
+
* - Tailscale funnel enabled for the tailnet (see https://tailscale.com/kb/1223/funnel)
|
|
6
|
+
* Returns the public HTTPS URL + the child process PID (for teardown).
|
|
7
|
+
*/
|
|
8
|
+
export declare function startTailscaleFunnel(port: number): Promise<{
|
|
9
|
+
url: string;
|
|
10
|
+
pid: number;
|
|
11
|
+
}>;
|
|
12
|
+
//# sourceMappingURL=tailscale.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tailscale.d.ts","sourceRoot":"","sources":["../../../../src/server/api/tunnels/tailscale.ts"],"names":[],"mappings":"AAKA;;;;;;GAMG;AACH,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAC,CAAC,CA0C5F"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { spawn, exec as execCb } from 'node:child_process';
|
|
2
|
+
import { promisify } from 'node:util';
|
|
3
|
+
const exec = promisify(execCb);
|
|
4
|
+
/**
|
|
5
|
+
* Start `tailscale funnel` pointing at the given local port.
|
|
6
|
+
* Requires:
|
|
7
|
+
* - `tailscale` CLI on PATH
|
|
8
|
+
* - Tailscale funnel enabled for the tailnet (see https://tailscale.com/kb/1223/funnel)
|
|
9
|
+
* Returns the public HTTPS URL + the child process PID (for teardown).
|
|
10
|
+
*/
|
|
11
|
+
export async function startTailscaleFunnel(port) {
|
|
12
|
+
// Verify tailscale is installed
|
|
13
|
+
try {
|
|
14
|
+
await exec('command -v tailscale');
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
throw new Error('`tailscale` not found on PATH. Install from https://tailscale.com/download and run `tailscale login` first.');
|
|
18
|
+
}
|
|
19
|
+
// Start funnel in background
|
|
20
|
+
const child = spawn('tailscale', ['funnel', '--bg', String(port)], {
|
|
21
|
+
stdio: 'ignore',
|
|
22
|
+
detached: true,
|
|
23
|
+
});
|
|
24
|
+
child.unref();
|
|
25
|
+
// Give tailscale a moment to register the funnel
|
|
26
|
+
await new Promise((r) => setTimeout(r, 1500));
|
|
27
|
+
// Fetch status to discover the public URL
|
|
28
|
+
let url = null;
|
|
29
|
+
for (let i = 0; i < 10; i++) {
|
|
30
|
+
try {
|
|
31
|
+
const { stdout } = await exec('tailscale funnel status');
|
|
32
|
+
// Match the first https URL (tailscale prints the funnel mapping there)
|
|
33
|
+
const match = stdout.match(/https:\/\/[^\s]+/);
|
|
34
|
+
if (match) {
|
|
35
|
+
url = match[0].replace(/[),\]]+$/, '');
|
|
36
|
+
break;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
/* transient; retry */
|
|
41
|
+
}
|
|
42
|
+
await new Promise((r) => setTimeout(r, 500));
|
|
43
|
+
}
|
|
44
|
+
if (!url) {
|
|
45
|
+
throw new Error('tailscale funnel started but no public URL appeared within 5s');
|
|
46
|
+
}
|
|
47
|
+
return { url, pid: child.pid ?? 0 };
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=tailscale.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tailscale.js","sourceRoot":"","sources":["../../../../src/server/api/tunnels/tailscale.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,KAAK,EAAE,IAAI,IAAI,MAAM,EAAC,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAC,SAAS,EAAC,MAAM,WAAW,CAAC;AAEpC,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;AAE/B;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,IAAY;IACtD,gCAAgC;IAChC,IAAI,CAAC;QACJ,MAAM,IAAI,CAAC,sBAAsB,CAAC,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACR,MAAM,IAAI,KAAK,CACd,6GAA6G,CAC7G,CAAC;IACH,CAAC;IAED,6BAA6B;IAC7B,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE;QAClE,KAAK,EAAE,QAAQ;QACf,QAAQ,EAAE,IAAI;KACd,CAAC,CAAC;IACH,KAAK,CAAC,KAAK,EAAE,CAAC;IAEd,iDAAiD;IACjD,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;IAE9C,0CAA0C;IAC1C,IAAI,GAAG,GAAkB,IAAI,CAAC;IAC9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7B,IAAI,CAAC;YACJ,MAAM,EAAC,MAAM,EAAC,GAAG,MAAM,IAAI,CAAC,yBAAyB,CAAC,CAAC;YACvD,wEAAwE;YACxE,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;YAC/C,IAAI,KAAK,EAAE,CAAC;gBACX,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;gBACvC,MAAM;YACP,CAAC;QACF,CAAC;QAAC,MAAM,CAAC;YACR,sBAAsB;QACvB,CAAC;QACD,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;IAC9C,CAAC;IAED,IAAI,CAAC,GAAG,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAC;IAClF,CAAC;IAED,OAAO,EAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,IAAI,CAAC,EAAC,CAAC;AACnC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/server/api/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,kBAAkB,EAAC,MAAM,SAAS,CAAC;AAIhD,eAAO,MAAM,WAAW,EAAE,kBAEzB,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { utilsTools, executeUtilsTool } from '../../../server/tools/utils-tools.js';
|
|
2
|
+
import { makeToolGroupRoutes } from '../tool-group.js';
|
|
3
|
+
export const utilsRoutes = async (app) => {
|
|
4
|
+
await app.register(makeToolGroupRoutes(utilsTools, executeUtilsTool));
|
|
5
|
+
};
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/server/api/utils/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,UAAU,EAAE,gBAAgB,EAAC,MAAM,4BAA4B,CAAC;AACxE,OAAO,EAAC,mBAAmB,EAAC,MAAM,eAAe,CAAC;AAElD,MAAM,CAAC,MAAM,WAAW,GAAuB,KAAK,EAAE,GAAG,EAAE,EAAE;IAC5D,MAAM,GAAG,CAAC,QAAQ,CAAC,mBAAmB,CAAC,UAAU,EAAE,gBAAgB,CAAC,CAAC,CAAC;AACvE,CAAC,CAAC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
/**
|
|
3
|
-
* Gateway
|
|
4
|
-
*
|
|
3
|
+
* Gateway daemon entry point. Runs as a background process via launchd/systemd
|
|
4
|
+
* and serves the local HTTP + WebSocket API on the configured port.
|
|
5
5
|
*/
|
|
6
6
|
export {};
|
|
7
7
|
//# sourceMappingURL=gateway-entry.d.ts.map
|
|
@@ -1,138 +1,75 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
/**
|
|
3
|
-
* Gateway
|
|
4
|
-
*
|
|
3
|
+
* Gateway daemon entry point. Runs as a background process via launchd/systemd
|
|
4
|
+
* and serves the local HTTP + WebSocket API on the configured port.
|
|
5
5
|
*/
|
|
6
|
-
import { writeFileSync,
|
|
7
|
-
import { join } from 'node:path';
|
|
8
|
-
import { hostname } from 'node:os';
|
|
9
|
-
import { GatewayClient } from './gateway-client.js';
|
|
10
|
-
import { getConfig } from '../config/index.js';
|
|
6
|
+
import { writeFileSync, existsSync, statSync, unlinkSync } from 'node:fs';
|
|
11
7
|
import { getPreferences, updatePreferences } from '../config/preferences.js';
|
|
12
|
-
import {
|
|
13
|
-
|
|
14
|
-
|
|
8
|
+
import { startServer } from './api/server.js';
|
|
9
|
+
import { ptyManager } from './pty/manager.js';
|
|
10
|
+
import { gatewayLog, GATEWAY_LOG_FILE } from './gateway-log.js';
|
|
15
11
|
const LOG_MAX_AGE_DAYS = 3;
|
|
16
|
-
// Ensure log directory exists
|
|
17
|
-
if (!existsSync(LOG_DIR)) {
|
|
18
|
-
mkdirSync(LOG_DIR, { recursive: true });
|
|
19
|
-
}
|
|
20
|
-
/**
|
|
21
|
-
* Clear log file if it's older than LOG_MAX_AGE_DAYS
|
|
22
|
-
*/
|
|
23
12
|
function clearOldLogs() {
|
|
24
13
|
try {
|
|
25
|
-
if (!existsSync(
|
|
14
|
+
if (!existsSync(GATEWAY_LOG_FILE))
|
|
26
15
|
return;
|
|
27
|
-
|
|
28
|
-
const stats = statSync(LOG_FILE);
|
|
16
|
+
const stats = statSync(GATEWAY_LOG_FILE);
|
|
29
17
|
const ageMs = Date.now() - stats.mtime.getTime();
|
|
30
18
|
const maxAgeMs = LOG_MAX_AGE_DAYS * 24 * 60 * 60 * 1000;
|
|
31
19
|
if (ageMs > maxAgeMs) {
|
|
32
|
-
unlinkSync(
|
|
33
|
-
|
|
34
|
-
writeFileSync(LOG_FILE, `[${new Date().toISOString()}] Log file cleared (was older than ${LOG_MAX_AGE_DAYS} days)\n`);
|
|
20
|
+
unlinkSync(GATEWAY_LOG_FILE);
|
|
21
|
+
writeFileSync(GATEWAY_LOG_FILE, `[${new Date().toISOString()}] Log file cleared (was older than ${LOG_MAX_AGE_DAYS} days)\n`);
|
|
35
22
|
}
|
|
36
23
|
}
|
|
37
24
|
catch {
|
|
38
|
-
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
function log(message) {
|
|
42
|
-
const timestamp = new Date().toISOString();
|
|
43
|
-
const logMessage = `[${timestamp}] ${message}\n`;
|
|
44
|
-
try {
|
|
45
|
-
writeFileSync(LOG_FILE, logMessage, { flag: 'a' });
|
|
46
|
-
}
|
|
47
|
-
catch {
|
|
48
|
-
// If logging fails, at least try stderr
|
|
49
|
-
process.stderr.write(logMessage);
|
|
25
|
+
/* ignore rotation errors */
|
|
50
26
|
}
|
|
51
27
|
}
|
|
28
|
+
// Local alias so the existing `log(...)` call sites keep working. The shared
|
|
29
|
+
// module owns the file + append semantics.
|
|
30
|
+
const log = gatewayLog;
|
|
52
31
|
async function main() {
|
|
53
|
-
// Clear old logs at startup
|
|
54
32
|
clearOldLogs();
|
|
55
|
-
log(
|
|
56
|
-
// Load config and preferences
|
|
57
|
-
const config = getConfig();
|
|
33
|
+
log('Starting gateway daemon...');
|
|
58
34
|
const prefs = getPreferences();
|
|
59
|
-
const
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
log(`Description: ${gatewayDescription}`);
|
|
67
|
-
if (!config.auth?.apiKey || !config.auth?.url) {
|
|
68
|
-
log('ERROR: Not authenticated. Run `corebrain login` first.');
|
|
69
|
-
process.exit(1);
|
|
35
|
+
const gw = prefs.gateway;
|
|
36
|
+
const port = Number(process.env.COREBRAIN_GATEWAY_HTTP_PORT ?? gw?.httpPort ?? 7787);
|
|
37
|
+
log(`Port: ${port}`);
|
|
38
|
+
log(`Gateway id: ${gw?.id ?? '(unregistered)'}`);
|
|
39
|
+
log(`Gateway name: ${gw?.name ?? '(unnamed)'}`);
|
|
40
|
+
if (!gw?.securityKeyHash) {
|
|
41
|
+
log('WARNING: No securityKey configured. Run `corebrain gateway register` first — every request will return 401 until a key is set.');
|
|
70
42
|
}
|
|
71
|
-
|
|
72
|
-
|
|
43
|
+
try {
|
|
44
|
+
await startServer({ port, log });
|
|
73
45
|
}
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
description: gatewayDescription,
|
|
82
|
-
logger: log, // Pass logger to GatewayClient for tool call logging
|
|
83
|
-
onConnect: () => {
|
|
84
|
-
log('Connected to gateway server');
|
|
85
|
-
},
|
|
86
|
-
onReady: (gatewayId) => {
|
|
87
|
-
log(`Gateway ready with ID: ${gatewayId}`);
|
|
88
|
-
log(`PID: ${process.pid}`);
|
|
89
|
-
},
|
|
90
|
-
onDisconnect: () => {
|
|
91
|
-
log('Disconnected from gateway server, will attempt reconnection...');
|
|
92
|
-
},
|
|
93
|
-
onError: (error) => {
|
|
94
|
-
log(`Gateway error: ${error.message}`);
|
|
95
|
-
},
|
|
96
|
-
onMaxReconnectReached: () => {
|
|
97
|
-
log('Max reconnection attempts (10) reached. Updating status and shutting down...');
|
|
98
|
-
// Update gateway status to disconnected
|
|
99
|
-
const currentPrefs = getPreferences();
|
|
100
|
-
if (currentPrefs.gateway) {
|
|
101
|
-
updatePreferences({
|
|
102
|
-
gateway: {
|
|
103
|
-
...currentPrefs.gateway,
|
|
104
|
-
pid: 0,
|
|
105
|
-
startedAt: 0,
|
|
106
|
-
serviceInstalled: false,
|
|
107
|
-
},
|
|
108
|
-
});
|
|
109
|
-
}
|
|
110
|
-
log('Gateway status updated to disconnected. Exiting...');
|
|
111
|
-
process.exit(1);
|
|
112
|
-
},
|
|
113
|
-
});
|
|
114
|
-
// Connect
|
|
115
|
-
client.connect();
|
|
116
|
-
// Handle graceful shutdown
|
|
117
|
-
const shutdown = () => {
|
|
118
|
-
log('Shutting down gateway client...');
|
|
119
|
-
client.disconnect();
|
|
46
|
+
catch (err) {
|
|
47
|
+
log(`Failed to start HTTP server: ${err.message}`);
|
|
48
|
+
process.exit(1);
|
|
49
|
+
}
|
|
50
|
+
const shutdown = (signal) => {
|
|
51
|
+
log(`Shutting down (${signal})...`);
|
|
52
|
+
ptyManager.killAll();
|
|
120
53
|
process.exit(0);
|
|
121
54
|
};
|
|
122
|
-
process.on('SIGTERM', shutdown);
|
|
123
|
-
process.on('SIGINT', shutdown);
|
|
124
|
-
// Handle uncaught errors
|
|
55
|
+
process.on('SIGTERM', () => shutdown('SIGTERM'));
|
|
56
|
+
process.on('SIGINT', () => shutdown('SIGINT'));
|
|
125
57
|
process.on('uncaughtException', (err) => {
|
|
126
58
|
log(`Uncaught exception: ${err.message}`);
|
|
127
59
|
log(err.stack || '');
|
|
128
|
-
process.exit(1);
|
|
129
60
|
});
|
|
130
61
|
process.on('unhandledRejection', (reason) => {
|
|
131
|
-
log(`Unhandled rejection: ${reason}`);
|
|
132
|
-
|
|
62
|
+
log(`Unhandled rejection: ${reason instanceof Error ? reason.message : String(reason)}`);
|
|
63
|
+
});
|
|
64
|
+
updatePreferences({
|
|
65
|
+
gateway: {
|
|
66
|
+
...(prefs.gateway ?? { pid: 0, startedAt: 0 }),
|
|
67
|
+
pid: process.pid,
|
|
68
|
+
startedAt: Date.now(),
|
|
69
|
+
httpPort: port,
|
|
70
|
+
},
|
|
133
71
|
});
|
|
134
|
-
|
|
135
|
-
log('Gateway client started, waiting for tool calls...');
|
|
72
|
+
log(`Gateway daemon ready on :${port}`);
|
|
136
73
|
}
|
|
137
74
|
main();
|
|
138
75
|
//# sourceMappingURL=gateway-entry.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gateway-entry.js","sourceRoot":"","sources":["../../src/server/gateway-entry.ts"],"names":[],"mappings":";AACA;;;GAGG;AAEH,OAAO,EAAC,aAAa,EAAE,
|
|
1
|
+
{"version":3,"file":"gateway-entry.js","sourceRoot":"","sources":["../../src/server/gateway-entry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Append a line to `~/.corebrain/logs/gateway.log`. Safe to call from any
|
|
3
|
+
* module in the gateway process — shared with the daemon entrypoint's own
|
|
4
|
+
* logger so everything ends up in one place.
|
|
5
|
+
*
|
|
6
|
+
* Falls back to stderr if the file isn't writable.
|
|
7
|
+
*/
|
|
8
|
+
export declare function gatewayLog(message: string): void;
|
|
9
|
+
export declare const GATEWAY_LOG_FILE: string;
|
|
10
|
+
//# sourceMappingURL=gateway-log.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gateway-log.d.ts","sourceRoot":"","sources":["../../src/server/gateway-log.ts"],"names":[],"mappings":"AAgBA;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAQhD;AAED,eAAO,MAAM,gBAAgB,QAAW,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { writeFileSync, mkdirSync, existsSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { getConfigPath } from '../config/paths.js';
|
|
4
|
+
const LOG_DIR = join(getConfigPath(), 'logs');
|
|
5
|
+
const LOG_FILE = join(LOG_DIR, 'gateway.log');
|
|
6
|
+
let ensured = false;
|
|
7
|
+
function ensureDir() {
|
|
8
|
+
if (ensured)
|
|
9
|
+
return;
|
|
10
|
+
if (!existsSync(LOG_DIR)) {
|
|
11
|
+
mkdirSync(LOG_DIR, { recursive: true });
|
|
12
|
+
}
|
|
13
|
+
ensured = true;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Append a line to `~/.corebrain/logs/gateway.log`. Safe to call from any
|
|
17
|
+
* module in the gateway process — shared with the daemon entrypoint's own
|
|
18
|
+
* logger so everything ends up in one place.
|
|
19
|
+
*
|
|
20
|
+
* Falls back to stderr if the file isn't writable.
|
|
21
|
+
*/
|
|
22
|
+
export function gatewayLog(message) {
|
|
23
|
+
ensureDir();
|
|
24
|
+
const line = `[${new Date().toISOString()}] ${message}\n`;
|
|
25
|
+
try {
|
|
26
|
+
writeFileSync(LOG_FILE, line, { flag: 'a' });
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
process.stderr.write(line);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
export const GATEWAY_LOG_FILE = LOG_FILE;
|
|
33
|
+
//# sourceMappingURL=gateway-log.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gateway-log.js","sourceRoot":"","sources":["../../src/server/gateway-log.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,aAAa,EAAE,SAAS,EAAE,UAAU,EAAC,MAAM,SAAS,CAAC;AAC7D,OAAO,EAAC,IAAI,EAAC,MAAM,WAAW,CAAC;AAC/B,OAAO,EAAC,aAAa,EAAC,MAAM,gBAAgB,CAAC;AAE7C,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,EAAE,EAAE,MAAM,CAAC,CAAC;AAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;AAE9C,IAAI,OAAO,GAAG,KAAK,CAAC;AACpB,SAAS,SAAS;IACjB,IAAI,OAAO;QAAE,OAAO;IACpB,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1B,SAAS,CAAC,OAAO,EAAE,EAAC,SAAS,EAAE,IAAI,EAAC,CAAC,CAAC;IACvC,CAAC;IACD,OAAO,GAAG,IAAI,CAAC;AAChB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,UAAU,CAAC,OAAe;IACzC,SAAS,EAAE,CAAC;IACZ,MAAM,IAAI,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,OAAO,IAAI,CAAC;IAC1D,IAAI,CAAC;QACJ,aAAa,CAAC,QAAQ,EAAE,IAAI,EAAE,EAAC,IAAI,EAAE,GAAG,EAAC,CAAC,CAAC;IAC5C,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;AACF,CAAC;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAG,QAAQ,CAAC"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { type IPty } from 'node-pty';
|
|
2
|
+
export type PtySubscriber = (data: string) => void;
|
|
3
|
+
export type ExitSubscriber = (info: {
|
|
4
|
+
exitCode: number;
|
|
5
|
+
signal?: number;
|
|
6
|
+
}) => void;
|
|
7
|
+
interface PtyHandle {
|
|
8
|
+
pty: IPty;
|
|
9
|
+
outputBuffer: Buffer;
|
|
10
|
+
pendingUtf8: Buffer;
|
|
11
|
+
createdAt: number;
|
|
12
|
+
cancelled: boolean;
|
|
13
|
+
exited: boolean;
|
|
14
|
+
exitInfo?: {
|
|
15
|
+
exitCode: number;
|
|
16
|
+
signal?: number;
|
|
17
|
+
};
|
|
18
|
+
subscribers: Set<PtySubscriber>;
|
|
19
|
+
exitSubscribers: Set<ExitSubscriber>;
|
|
20
|
+
lastActivityAt: number;
|
|
21
|
+
meta: {
|
|
22
|
+
command: string;
|
|
23
|
+
args: string[];
|
|
24
|
+
cwd: string;
|
|
25
|
+
agent?: string;
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
export interface SpawnOptions {
|
|
29
|
+
sessionId: string;
|
|
30
|
+
command: string;
|
|
31
|
+
args: string[];
|
|
32
|
+
cwd: string;
|
|
33
|
+
env?: Record<string, string>;
|
|
34
|
+
cols?: number;
|
|
35
|
+
rows?: number;
|
|
36
|
+
agent?: string;
|
|
37
|
+
}
|
|
38
|
+
export interface AttachResult {
|
|
39
|
+
replayed: string;
|
|
40
|
+
exited: boolean;
|
|
41
|
+
exitInfo?: {
|
|
42
|
+
exitCode: number;
|
|
43
|
+
signal?: number;
|
|
44
|
+
};
|
|
45
|
+
meta: PtyHandle['meta'];
|
|
46
|
+
createdAt: number;
|
|
47
|
+
pid: number;
|
|
48
|
+
detach: () => void;
|
|
49
|
+
}
|
|
50
|
+
declare class PtyManager {
|
|
51
|
+
private handles;
|
|
52
|
+
spawn(opts: SpawnOptions): {
|
|
53
|
+
pid: number;
|
|
54
|
+
};
|
|
55
|
+
/**
|
|
56
|
+
* Attach a subscriber to an existing session. Replays scrollback synchronously,
|
|
57
|
+
* then streams new bytes via onData. Returns null if no session exists.
|
|
58
|
+
*/
|
|
59
|
+
attach(sessionId: string, onData: PtySubscriber, onExit?: ExitSubscriber): AttachResult | null;
|
|
60
|
+
write(sessionId: string, data: string): boolean;
|
|
61
|
+
resize(sessionId: string, cols: number, rows: number): boolean;
|
|
62
|
+
kill(sessionId: string, signal?: string): boolean;
|
|
63
|
+
killAll(): void;
|
|
64
|
+
isRunning(sessionId: string): boolean;
|
|
65
|
+
getPid(sessionId: string): number | undefined;
|
|
66
|
+
getLastActivity(sessionId: string): number | undefined;
|
|
67
|
+
/**
|
|
68
|
+
* Drop handles that have aged out past MAX_AGE_MS and whose process has
|
|
69
|
+
* already exited. Live PTYs are never reaped — only observed as stale.
|
|
70
|
+
*/
|
|
71
|
+
reap(): void;
|
|
72
|
+
}
|
|
73
|
+
export declare const ptyManager: PtyManager;
|
|
74
|
+
export {};
|
|
75
|
+
//# sourceMappingURL=manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../../src/server/pty/manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,KAAK,IAAI,EAAC,MAAM,UAAU,CAAC;AA2GtD,MAAM,MAAM,aAAa,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;AACnD,MAAM,MAAM,cAAc,GAAG,CAAC,IAAI,EAAE;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAC,KAAK,IAAI,CAAC;AAEjF,UAAU,SAAS;IAClB,GAAG,EAAE,IAAI,CAAC;IACV,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAC,CAAC;IAC/C,WAAW,EAAE,GAAG,CAAC,aAAa,CAAC,CAAC;IAChC,eAAe,EAAE,GAAG,CAAC,cAAc,CAAC,CAAC;IACrC,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE;QACL,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,MAAM,EAAE,CAAC;QACf,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;CACF;AAED,MAAM,WAAW,YAAY;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,YAAY;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAC,CAAC;IAC/C,IAAI,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,IAAI,CAAC;CACnB;AAED,cAAM,UAAU;IACf,OAAO,CAAC,OAAO,CAAgC;IAE/C,KAAK,CAAC,IAAI,EAAE,YAAY,GAAG;QAAC,GAAG,EAAE,MAAM,CAAA;KAAC;IA4FxC;;;OAGG;IACH,MAAM,CACL,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,aAAa,EACrB,MAAM,CAAC,EAAE,cAAc,GACrB,YAAY,GAAG,IAAI;IA8BtB,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO;IAO/C,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO;IAW9D,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,GAAE,MAAkB,GAAG,OAAO;IAY5D,OAAO,IAAI,IAAI;IAMf,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAKrC,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAK7C,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAItD;;;OAGG;IACH,IAAI,IAAI,IAAI;CAQZ;AAED,eAAO,MAAM,UAAU,YAAmB,CAAC"}
|