@everywheredev/cli 0.0.5 → 0.0.7
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 +1 -1
- package/dist/index.js +274 -59
- package/package.json +3 -2
- package/scripts/build.mjs +68 -0
- package/dist/agent/agent-loop.d.ts +0 -40
- package/dist/agent/agent-loop.d.ts.map +0 -1
- package/dist/agent/agent-loop.js +0 -162
- package/dist/agent/agent-loop.js.map +0 -1
- package/dist/agent/approval.d.ts +0 -38
- package/dist/agent/approval.d.ts.map +0 -1
- package/dist/agent/approval.js +0 -55
- package/dist/agent/approval.js.map +0 -1
- package/dist/agent/run-tracker.d.ts +0 -26
- package/dist/agent/run-tracker.d.ts.map +0 -1
- package/dist/agent/run-tracker.js +0 -43
- package/dist/agent/run-tracker.js.map +0 -1
- package/dist/auth/device-flow.d.ts +0 -61
- package/dist/auth/device-flow.d.ts.map +0 -1
- package/dist/auth/device-flow.js +0 -141
- package/dist/auth/device-flow.js.map +0 -1
- package/dist/auth/hydra-oauth-auth-provider.d.ts +0 -35
- package/dist/auth/hydra-oauth-auth-provider.d.ts.map +0 -1
- package/dist/auth/hydra-oauth-auth-provider.js +0 -153
- package/dist/auth/hydra-oauth-auth-provider.js.map +0 -1
- package/dist/auth/keychain.d.ts +0 -42
- package/dist/auth/keychain.d.ts.map +0 -1
- package/dist/auth/keychain.js +0 -138
- package/dist/auth/keychain.js.map +0 -1
- package/dist/auth/pkce.d.ts +0 -20
- package/dist/auth/pkce.d.ts.map +0 -1
- package/dist/auth/pkce.js +0 -44
- package/dist/auth/pkce.js.map +0 -1
- package/dist/auth/ports.d.ts +0 -25
- package/dist/auth/ports.d.ts.map +0 -1
- package/dist/auth/ports.js +0 -8
- package/dist/auth/ports.js.map +0 -1
- package/dist/commands/activity.d.ts +0 -17
- package/dist/commands/activity.d.ts.map +0 -1
- package/dist/commands/activity.js +0 -54
- package/dist/commands/activity.js.map +0 -1
- package/dist/commands/agent.d.ts +0 -25
- package/dist/commands/agent.d.ts.map +0 -1
- package/dist/commands/agent.js +0 -80
- package/dist/commands/agent.js.map +0 -1
- package/dist/commands/agents.d.ts +0 -9
- package/dist/commands/agents.d.ts.map +0 -1
- package/dist/commands/agents.js +0 -28
- package/dist/commands/agents.js.map +0 -1
- package/dist/commands/commits.d.ts +0 -16
- package/dist/commands/commits.d.ts.map +0 -1
- package/dist/commands/commits.js +0 -39
- package/dist/commands/commits.js.map +0 -1
- package/dist/commands/diff.d.ts +0 -15
- package/dist/commands/diff.d.ts.map +0 -1
- package/dist/commands/diff.js +0 -27
- package/dist/commands/diff.js.map +0 -1
- package/dist/commands/expose.d.ts +0 -15
- package/dist/commands/expose.d.ts.map +0 -1
- package/dist/commands/expose.js +0 -39
- package/dist/commands/expose.js.map +0 -1
- package/dist/commands/index.d.ts +0 -7
- package/dist/commands/index.d.ts.map +0 -1
- package/dist/commands/index.js +0 -12
- package/dist/commands/index.js.map +0 -1
- package/dist/commands/login.d.ts +0 -9
- package/dist/commands/login.d.ts.map +0 -1
- package/dist/commands/login.js +0 -27
- package/dist/commands/login.js.map +0 -1
- package/dist/commands/logout.d.ts +0 -9
- package/dist/commands/logout.d.ts.map +0 -1
- package/dist/commands/logout.js +0 -24
- package/dist/commands/logout.js.map +0 -1
- package/dist/commands/me.d.ts +0 -10
- package/dist/commands/me.d.ts.map +0 -1
- package/dist/commands/me.js +0 -25
- package/dist/commands/me.js.map +0 -1
- package/dist/commands/open.d.ts +0 -16
- package/dist/commands/open.d.ts.map +0 -1
- package/dist/commands/open.js +0 -34
- package/dist/commands/open.js.map +0 -1
- package/dist/commands/ports.d.ts +0 -75
- package/dist/commands/ports.d.ts.map +0 -1
- package/dist/commands/ports.js +0 -78
- package/dist/commands/ports.js.map +0 -1
- package/dist/commands/profile.d.ts +0 -21
- package/dist/commands/profile.d.ts.map +0 -1
- package/dist/commands/profile.js +0 -93
- package/dist/commands/profile.js.map +0 -1
- package/dist/commands/push.d.ts +0 -18
- package/dist/commands/push.d.ts.map +0 -1
- package/dist/commands/push.js +0 -116
- package/dist/commands/push.js.map +0 -1
- package/dist/commands/registry.d.ts +0 -15
- package/dist/commands/registry.d.ts.map +0 -1
- package/dist/commands/registry.js +0 -45
- package/dist/commands/registry.js.map +0 -1
- package/dist/commands/request.d.ts +0 -25
- package/dist/commands/request.d.ts.map +0 -1
- package/dist/commands/request.js +0 -58
- package/dist/commands/request.js.map +0 -1
- package/dist/commands/resume.d.ts +0 -22
- package/dist/commands/resume.d.ts.map +0 -1
- package/dist/commands/resume.js +0 -69
- package/dist/commands/resume.js.map +0 -1
- package/dist/commands/save.d.ts +0 -34
- package/dist/commands/save.d.ts.map +0 -1
- package/dist/commands/save.js +0 -141
- package/dist/commands/save.js.map +0 -1
- package/dist/commands/session.d.ts +0 -9
- package/dist/commands/session.d.ts.map +0 -1
- package/dist/commands/session.js +0 -282
- package/dist/commands/session.js.map +0 -1
- package/dist/commands/skills/markdown-loader.d.ts +0 -19
- package/dist/commands/skills/markdown-loader.d.ts.map +0 -1
- package/dist/commands/skills/markdown-loader.js +0 -108
- package/dist/commands/skills/markdown-loader.js.map +0 -1
- package/dist/commands/skills/registry.d.ts +0 -23
- package/dist/commands/skills/registry.d.ts.map +0 -1
- package/dist/commands/skills/registry.js +0 -45
- package/dist/commands/skills/registry.js.map +0 -1
- package/dist/commands/terminal.d.ts +0 -19
- package/dist/commands/terminal.d.ts.map +0 -1
- package/dist/commands/terminal.js +0 -39
- package/dist/commands/terminal.js.map +0 -1
- package/dist/commands/tree.d.ts +0 -16
- package/dist/commands/tree.d.ts.map +0 -1
- package/dist/commands/tree.js +0 -44
- package/dist/commands/tree.js.map +0 -1
- package/dist/commands/undo.d.ts +0 -18
- package/dist/commands/undo.d.ts.map +0 -1
- package/dist/commands/undo.js +0 -46
- package/dist/commands/undo.js.map +0 -1
- package/dist/config/config-store.d.ts +0 -19
- package/dist/config/config-store.d.ts.map +0 -1
- package/dist/config/config-store.js +0 -199
- package/dist/config/config-store.js.map +0 -1
- package/dist/config/defaults.d.ts +0 -22
- package/dist/config/defaults.d.ts.map +0 -1
- package/dist/config/defaults.js +0 -38
- package/dist/config/defaults.js.map +0 -1
- package/dist/config/ports.d.ts +0 -60
- package/dist/config/ports.d.ts.map +0 -1
- package/dist/config/ports.js +0 -8
- package/dist/config/ports.js.map +0 -1
- package/dist/config/profile-constants.d.ts +0 -4
- package/dist/config/profile-constants.d.ts.map +0 -1
- package/dist/config/profile-constants.js +0 -10
- package/dist/config/profile-constants.js.map +0 -1
- package/dist/config/profile.d.ts +0 -84
- package/dist/config/profile.d.ts.map +0 -1
- package/dist/config/profile.js +0 -66
- package/dist/config/profile.js.map +0 -1
- package/dist/contract/index.d.ts +0 -193
- package/dist/contract/index.d.ts.map +0 -1
- package/dist/contract/index.js +0 -14
- package/dist/contract/index.js.map +0 -1
- package/dist/core/app.d.ts +0 -35
- package/dist/core/app.d.ts.map +0 -1
- package/dist/core/app.js +0 -86
- package/dist/core/app.js.map +0 -1
- package/dist/core/command-router.d.ts +0 -29
- package/dist/core/command-router.d.ts.map +0 -1
- package/dist/core/command-router.js +0 -61
- package/dist/core/command-router.js.map +0 -1
- package/dist/core/errors.d.ts +0 -39
- package/dist/core/errors.d.ts.map +0 -1
- package/dist/core/errors.js +0 -106
- package/dist/core/errors.js.map +0 -1
- package/dist/core/preflight.d.ts +0 -16
- package/dist/core/preflight.d.ts.map +0 -1
- package/dist/core/preflight.js +0 -38
- package/dist/core/preflight.js.map +0 -1
- package/dist/core/repl.d.ts +0 -18
- package/dist/core/repl.d.ts.map +0 -1
- package/dist/core/repl.js +0 -128
- package/dist/core/repl.js.map +0 -1
- package/dist/di/container.d.ts +0 -13
- package/dist/di/container.d.ts.map +0 -1
- package/dist/di/container.js +0 -160
- package/dist/di/container.js.map +0 -1
- package/dist/di/tokens.d.ts +0 -20
- package/dist/di/tokens.d.ts.map +0 -1
- package/dist/di/tokens.js +0 -22
- package/dist/di/tokens.js.map +0 -1
- package/dist/index.d.ts +0 -9
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/render/ink-renderer.d.ts +0 -28
- package/dist/render/ink-renderer.d.ts.map +0 -1
- package/dist/render/ink-renderer.js +0 -174
- package/dist/render/ink-renderer.js.map +0 -1
- package/dist/render/plain-renderer.d.ts +0 -16
- package/dist/render/plain-renderer.d.ts.map +0 -1
- package/dist/render/plain-renderer.js +0 -38
- package/dist/render/plain-renderer.js.map +0 -1
- package/dist/render/ports.d.ts +0 -12
- package/dist/render/ports.d.ts.map +0 -1
- package/dist/render/ports.js +0 -10
- package/dist/render/ports.js.map +0 -1
- package/dist/render/raw-renderer.d.ts +0 -11
- package/dist/render/raw-renderer.d.ts.map +0 -1
- package/dist/render/raw-renderer.js +0 -68
- package/dist/render/raw-renderer.js.map +0 -1
- package/dist/render/repl-input.d.ts +0 -15
- package/dist/render/repl-input.d.ts.map +0 -1
- package/dist/render/repl-input.js +0 -102
- package/dist/render/repl-input.js.map +0 -1
- package/dist/session/file-session-store.d.ts +0 -26
- package/dist/session/file-session-store.d.ts.map +0 -1
- package/dist/session/file-session-store.js +0 -174
- package/dist/session/file-session-store.js.map +0 -1
- package/dist/session/ports.d.ts +0 -50
- package/dist/session/ports.d.ts.map +0 -1
- package/dist/session/ports.js +0 -6
- package/dist/session/ports.js.map +0 -1
- package/dist/sync/git-sync.d.ts +0 -16
- package/dist/sync/git-sync.d.ts.map +0 -1
- package/dist/sync/git-sync.js +0 -28
- package/dist/sync/git-sync.js.map +0 -1
- package/dist/sync/git.d.ts +0 -12
- package/dist/sync/git.d.ts.map +0 -1
- package/dist/sync/git.js +0 -100
- package/dist/sync/git.js.map +0 -1
- package/dist/sync/reconciler.d.ts +0 -36
- package/dist/sync/reconciler.d.ts.map +0 -1
- package/dist/sync/reconciler.js +0 -143
- package/dist/sync/reconciler.js.map +0 -1
- package/dist/sync/walk.d.ts +0 -23
- package/dist/sync/walk.d.ts.map +0 -1
- package/dist/sync/walk.js +0 -81
- package/dist/sync/walk.js.map +0 -1
- package/dist/sync/watch.d.ts +0 -13
- package/dist/sync/watch.d.ts.map +0 -1
- package/dist/sync/watch.js +0 -75
- package/dist/sync/watch.js.map +0 -1
- package/dist/tools/git-diff.d.ts +0 -16
- package/dist/tools/git-diff.d.ts.map +0 -1
- package/dist/tools/git-diff.js +0 -25
- package/dist/tools/git-diff.js.map +0 -1
- package/dist/tools/http-request.d.ts +0 -25
- package/dist/tools/http-request.d.ts.map +0 -1
- package/dist/tools/http-request.js +0 -41
- package/dist/tools/http-request.js.map +0 -1
- package/dist/tools/index.d.ts +0 -7
- package/dist/tools/index.d.ts.map +0 -1
- package/dist/tools/index.js +0 -22
- package/dist/tools/index.js.map +0 -1
- package/dist/tools/ports.d.ts +0 -58
- package/dist/tools/ports.d.ts.map +0 -1
- package/dist/tools/ports.js +0 -17
- package/dist/tools/ports.js.map +0 -1
- package/dist/tools/read-file.d.ts +0 -16
- package/dist/tools/read-file.d.ts.map +0 -1
- package/dist/tools/read-file.js +0 -24
- package/dist/tools/read-file.js.map +0 -1
- package/dist/tools/registry.d.ts +0 -10
- package/dist/tools/registry.d.ts.map +0 -1
- package/dist/tools/registry.js +0 -28
- package/dist/tools/registry.js.map +0 -1
- package/dist/tools/run-command.d.ts +0 -20
- package/dist/tools/run-command.d.ts.map +0 -1
- package/dist/tools/run-command.js +0 -65
- package/dist/tools/run-command.js.map +0 -1
- package/dist/tools/write-file.d.ts +0 -24
- package/dist/tools/write-file.d.ts.map +0 -1
- package/dist/tools/write-file.js +0 -60
- package/dist/tools/write-file.js.map +0 -1
- package/dist/transport/composite-transport.d.ts +0 -30
- package/dist/transport/composite-transport.d.ts.map +0 -1
- package/dist/transport/composite-transport.js +0 -71
- package/dist/transport/composite-transport.js.map +0 -1
- package/dist/transport/device-browser.d.ts +0 -19
- package/dist/transport/device-browser.d.ts.map +0 -1
- package/dist/transport/device-browser.js +0 -243
- package/dist/transport/device-browser.js.map +0 -1
- package/dist/transport/device-git.d.ts +0 -14
- package/dist/transport/device-git.d.ts.map +0 -1
- package/dist/transport/device-git.js +0 -107
- package/dist/transport/device-git.js.map +0 -1
- package/dist/transport/device-http.d.ts +0 -10
- package/dist/transport/device-http.d.ts.map +0 -1
- package/dist/transport/device-http.js +0 -96
- package/dist/transport/device-http.js.map +0 -1
- package/dist/transport/device-terminal.d.ts +0 -44
- package/dist/transport/device-terminal.d.ts.map +0 -1
- package/dist/transport/device-terminal.js +0 -140
- package/dist/transport/device-terminal.js.map +0 -1
- package/dist/transport/http-transport.d.ts +0 -26
- package/dist/transport/http-transport.d.ts.map +0 -1
- package/dist/transport/http-transport.js +0 -125
- package/dist/transport/http-transport.js.map +0 -1
- package/dist/transport/ports.d.ts +0 -67
- package/dist/transport/ports.d.ts.map +0 -1
- package/dist/transport/ports.js +0 -11
- package/dist/transport/ports.js.map +0 -1
- package/dist/transport/reconnect.d.ts +0 -44
- package/dist/transport/reconnect.d.ts.map +0 -1
- package/dist/transport/reconnect.js +0 -69
- package/dist/transport/reconnect.js.map +0 -1
- package/dist/transport/terminal-transport.d.ts +0 -28
- package/dist/transport/terminal-transport.d.ts.map +0 -1
- package/dist/transport/terminal-transport.js +0 -63
- package/dist/transport/terminal-transport.js.map +0 -1
- package/dist/transport/ws-stream-transport.d.ts +0 -66
- package/dist/transport/ws-stream-transport.d.ts.map +0 -1
- package/dist/transport/ws-stream-transport.js +0 -246
- package/dist/transport/ws-stream-transport.js.map +0 -1
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
// src/tools/run-command.ts — `run_command` tool (exec host-side via a PTY)
|
|
2
|
-
//
|
|
3
|
-
// Side effect: "exec" → gated by the ApprovalGate. The CLI never spawns a process itself
|
|
4
|
-
// (it owns no shell): it asks the host to run the command in a PTY over the WS contract
|
|
5
|
-
// (terminal:create → terminal:input → terminal:data* → terminal:exit) and collects the
|
|
6
|
-
// output. The host enforces Casbin/sandboxing; this tool is a thin, non-interactive driver.
|
|
7
|
-
import { z } from "zod";
|
|
8
|
-
import { ToolResults } from "./ports.js";
|
|
9
|
-
const schema = z.object({
|
|
10
|
-
command: z.string().min(1),
|
|
11
|
-
/** Hard cap so a runaway command cannot hang the agent loop. */
|
|
12
|
-
timeoutMs: z.coerce.number().int().positive().max(600_000).default(120_000),
|
|
13
|
-
});
|
|
14
|
-
export class RunCommandTool {
|
|
15
|
-
name = "run_command";
|
|
16
|
-
summary = "Run a shell command on the host in a PTY (WS terminal:*)";
|
|
17
|
-
schema = schema;
|
|
18
|
-
sideEffect = "exec";
|
|
19
|
-
async execute(ctx) {
|
|
20
|
-
const input = schema.parse(ctx.input);
|
|
21
|
-
const allowed = await ctx.approval.guard({ name: this.name, sideEffect: this.sideEffect });
|
|
22
|
-
if (!allowed)
|
|
23
|
-
return ToolResults.fail(`command "${input.command}" was denied by the approval gate`);
|
|
24
|
-
await ctx.stream.connect();
|
|
25
|
-
await ctx.terminal.create({ cols: 120, rows: 40 });
|
|
26
|
-
return new Promise((resolve) => {
|
|
27
|
-
let buffer = "";
|
|
28
|
-
let settled = false;
|
|
29
|
-
const offData = ctx.terminal.onData((chunk) => {
|
|
30
|
-
buffer += chunk;
|
|
31
|
-
});
|
|
32
|
-
const offExit = ctx.terminal.onExit((code) => settle(code));
|
|
33
|
-
const timer = setTimeout(() => settle(-1, "timed out"), input.timeoutMs);
|
|
34
|
-
const onAbort = () => settle(-1, "aborted");
|
|
35
|
-
ctx.signal.addEventListener("abort", onAbort, { once: true });
|
|
36
|
-
const settle = (code, reason) => {
|
|
37
|
-
if (settled)
|
|
38
|
-
return;
|
|
39
|
-
settled = true;
|
|
40
|
-
clearTimeout(timer);
|
|
41
|
-
offData();
|
|
42
|
-
offExit();
|
|
43
|
-
ctx.signal.removeEventListener("abort", onAbort);
|
|
44
|
-
const output = stripExitMarker(buffer);
|
|
45
|
-
if (reason) {
|
|
46
|
-
resolve(ToolResults.fail(`run_command ${reason} (exit ${code})`, output));
|
|
47
|
-
}
|
|
48
|
-
else if (code === 0) {
|
|
49
|
-
resolve(ToolResults.ok(output, { exitCode: code }));
|
|
50
|
-
}
|
|
51
|
-
else {
|
|
52
|
-
resolve(ToolResults.fail(`command exited with code ${code}`, output));
|
|
53
|
-
}
|
|
54
|
-
};
|
|
55
|
-
// Send the command; a trailing `exit` ensures the PTY terminates so we get terminal:exit.
|
|
56
|
-
ctx.terminal.input(`${input.command}\n`);
|
|
57
|
-
ctx.terminal.input("exit\n");
|
|
58
|
-
});
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
/** Drop the trailing shell `exit` echo and prompt noise from the captured buffer. */
|
|
62
|
-
function stripExitMarker(buf) {
|
|
63
|
-
return buf.replace(/(^|\n)exit\r?\n?$/i, "").trimEnd();
|
|
64
|
-
}
|
|
65
|
-
//# sourceMappingURL=run-command.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"run-command.js","sourceRoot":"","sources":["../../src/tools/run-command.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import { z } from "zod";
|
|
2
|
-
import type { Tool, ToolContext, ToolResult } from "./ports.js";
|
|
3
|
-
export declare class WriteFileTool implements Tool {
|
|
4
|
-
readonly name = "write_file";
|
|
5
|
-
readonly summary = "Write a file to the project (PUT /api/file, mtime-guarded)";
|
|
6
|
-
readonly schema: z.ZodObject<{
|
|
7
|
-
path: z.ZodString;
|
|
8
|
-
content: z.ZodString;
|
|
9
|
-
/** Force-overwrite without a precondition mtime (skip the concurrency check). */
|
|
10
|
-
overwrite: z.ZodDefault<z.ZodBoolean>;
|
|
11
|
-
}, "strip", z.ZodTypeAny, {
|
|
12
|
-
path: string;
|
|
13
|
-
content: string;
|
|
14
|
-
overwrite: boolean;
|
|
15
|
-
}, {
|
|
16
|
-
path: string;
|
|
17
|
-
content: string;
|
|
18
|
-
overwrite?: boolean | undefined;
|
|
19
|
-
}>;
|
|
20
|
-
readonly sideEffect: "write";
|
|
21
|
-
execute(ctx: ToolContext): Promise<ToolResult>;
|
|
22
|
-
private currentMtime;
|
|
23
|
-
}
|
|
24
|
-
//# sourceMappingURL=write-file.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"write-file.d.ts","sourceRoot":"","sources":["../../src/tools/write-file.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,OAAO,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAUhE,qBAAa,aAAc,YAAW,IAAI;IACxC,QAAQ,CAAC,IAAI,gBAAgB;IAC7B,QAAQ,CAAC,OAAO,gEAAgE;IAChF,QAAQ,CAAC,MAAM;;;QAPf,iFAAiF;;;;;;;;;;OAOxD;IACzB,QAAQ,CAAC,UAAU,EAAG,OAAO,CAAU;IAEjC,OAAO,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;YAgCtC,YAAY;CAS3B"}
|
package/dist/tools/write-file.js
DELETED
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
// src/tools/write-file.ts — `write_file` tool → PUT /api/file
|
|
2
|
-
//
|
|
3
|
-
// Side effect: "write" → the ApprovalGate must pass before we apply. Uses mtime optimistic
|
|
4
|
-
// concurrency: it reads the current mtime first so a concurrent edit produces a 409 the agent
|
|
5
|
-
// loop can surface rather than silently clobbering (cli.md §14). The host re-checks Casbin.
|
|
6
|
-
import { z } from "zod";
|
|
7
|
-
import { CliError } from "../core/errors.js";
|
|
8
|
-
import { ToolResults } from "./ports.js";
|
|
9
|
-
const schema = z.object({
|
|
10
|
-
path: z.string().min(1),
|
|
11
|
-
content: z.string(),
|
|
12
|
-
/** Force-overwrite without a precondition mtime (skip the concurrency check). */
|
|
13
|
-
overwrite: z.boolean().default(false),
|
|
14
|
-
});
|
|
15
|
-
export class WriteFileTool {
|
|
16
|
-
name = "write_file";
|
|
17
|
-
summary = "Write a file to the project (PUT /api/file, mtime-guarded)";
|
|
18
|
-
schema = schema;
|
|
19
|
-
sideEffect = "write";
|
|
20
|
-
async execute(ctx) {
|
|
21
|
-
const input = schema.parse(ctx.input);
|
|
22
|
-
// UX gate (the host independently authorizes via Casbin).
|
|
23
|
-
const allowed = await ctx.approval.guard({ name: this.name, sideEffect: this.sideEffect, path: input.path });
|
|
24
|
-
if (!allowed)
|
|
25
|
-
return ToolResults.fail(`write to ${input.path} was denied by the approval gate`);
|
|
26
|
-
let mtime;
|
|
27
|
-
if (!input.overwrite) {
|
|
28
|
-
mtime = await this.currentMtime(ctx, input.path);
|
|
29
|
-
}
|
|
30
|
-
try {
|
|
31
|
-
const written = await ctx.http.put("/api/file", {
|
|
32
|
-
path: input.path,
|
|
33
|
-
content: input.content,
|
|
34
|
-
mtime,
|
|
35
|
-
});
|
|
36
|
-
return ToolResults.ok(`wrote ${written.path} (${input.content.length} bytes)`, {
|
|
37
|
-
path: written.path,
|
|
38
|
-
mtime: written.mtime,
|
|
39
|
-
});
|
|
40
|
-
}
|
|
41
|
-
catch (err) {
|
|
42
|
-
if (err instanceof CliError && err.kind === "conflict") {
|
|
43
|
-
return ToolResults.fail(`conflict: ${input.path} changed on the host since last read — reload or pass overwrite=true`);
|
|
44
|
-
}
|
|
45
|
-
throw err;
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
async currentMtime(ctx, path) {
|
|
49
|
-
try {
|
|
50
|
-
const current = await ctx.http.get("/api/file", { path });
|
|
51
|
-
return current.mtime;
|
|
52
|
-
}
|
|
53
|
-
catch (err) {
|
|
54
|
-
if (err instanceof CliError && err.kind === "not_found")
|
|
55
|
-
return undefined; // new file
|
|
56
|
-
throw err;
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
//# sourceMappingURL=write-file.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"write-file.js","sourceRoot":"","sources":["../../src/tools/write-file.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAC9D,EAAE;AACF,2FAA2F;AAC3F,8FAA8F;AAC9F,4FAA4F;AAE5F,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAE7C,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;IACtB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACvB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,iFAAiF;IACjF,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;CACtC,CAAC,CAAC;AAEH,MAAM,OAAO,aAAa;IACf,IAAI,GAAG,YAAY,CAAC;IACpB,OAAO,GAAG,4DAA4D,CAAC;IACvE,MAAM,GAAG,MAAM,CAAC;IAChB,UAAU,GAAG,OAAgB,CAAC;IAEvC,KAAK,CAAC,OAAO,CAAC,GAAgB;QAC5B,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAEtC,0DAA0D;QAC1D,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QAC7G,IAAI,CAAC,OAAO;YAAE,OAAO,WAAW,CAAC,IAAI,CAAC,YAAY,KAAK,CAAC,IAAI,kCAAkC,CAAC,CAAC;QAEhG,IAAI,KAAyB,CAAC;QAC9B,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;YACrB,KAAK,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACnD,CAAC;QAED,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,GAAG,CAAc,WAAW,EAAE;gBAC3D,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,KAAK;aACN,CAAC,CAAC;YACH,OAAO,WAAW,CAAC,EAAE,CAAC,SAAS,OAAO,CAAC,IAAI,KAAK,KAAK,CAAC,OAAO,CAAC,MAAM,SAAS,EAAE;gBAC7E,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,KAAK,EAAE,OAAO,CAAC,KAAK;aACrB,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,QAAQ,IAAI,GAAG,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;gBACvD,OAAO,WAAW,CAAC,IAAI,CACrB,aAAa,KAAK,CAAC,IAAI,sEAAsE,CAC9F,CAAC;YACJ,CAAC;YACD,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,YAAY,CAAC,GAAgB,EAAE,IAAY;QACvD,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,GAAG,CAAc,WAAW,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;YACvE,OAAO,OAAO,CAAC,KAAK,CAAC;QACvB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,QAAQ,IAAI,GAAG,CAAC,IAAI,KAAK,WAAW;gBAAE,OAAO,SAAS,CAAC,CAAC,WAAW;YACtF,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;CACF"}
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import type { ClientEvent, ClientEventMap, ServerEvent, ServerEventMap } from "../contract/index.js";
|
|
2
|
-
import type { HttpPort, ResumeState, StreamPort, TerminalPort, Transport, Unsubscribe } from "./ports.js";
|
|
3
|
-
export declare class CompositeTransport implements Transport {
|
|
4
|
-
private readonly http;
|
|
5
|
-
private readonly stream;
|
|
6
|
-
private readonly terminal;
|
|
7
|
-
constructor(http: HttpPort, stream: StreamPort, terminal: TerminalPort);
|
|
8
|
-
get<T>(path: string, query?: Record<string, string | number | undefined>): Promise<T>;
|
|
9
|
-
put<T>(path: string, body: unknown): Promise<T>;
|
|
10
|
-
post<T>(path: string, body: unknown): Promise<T>;
|
|
11
|
-
del<T>(path: string): Promise<T>;
|
|
12
|
-
postRaw<T>(path: string, body: Uint8Array, headers?: Record<string, string>): Promise<T>;
|
|
13
|
-
connect(): Promise<void>;
|
|
14
|
-
on<E extends ServerEvent>(event: E, fn: (payload: ServerEventMap[E]) => void): Unsubscribe;
|
|
15
|
-
send<E extends ClientEvent>(event: E, payload: ClientEventMap[E]): void;
|
|
16
|
-
close(): Promise<void>;
|
|
17
|
-
resume(state: ResumeState): Promise<void>;
|
|
18
|
-
get connected(): boolean;
|
|
19
|
-
create(opts: {
|
|
20
|
-
cols?: number;
|
|
21
|
-
rows?: number;
|
|
22
|
-
}): Promise<{
|
|
23
|
-
id: string;
|
|
24
|
-
}>;
|
|
25
|
-
input(data: string): void;
|
|
26
|
-
resize(cols: number, rows: number): void;
|
|
27
|
-
onData(fn: (chunk: string) => void): Unsubscribe;
|
|
28
|
-
onExit(fn: (code: number) => void): Unsubscribe;
|
|
29
|
-
}
|
|
30
|
-
//# sourceMappingURL=composite-transport.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"composite-transport.d.ts","sourceRoot":"","sources":["../../src/transport/composite-transport.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EACV,WAAW,EACX,cAAc,EACd,WAAW,EACX,cAAc,EACf,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EACV,QAAQ,EACR,WAAW,EACX,UAAU,EACV,YAAY,EACZ,SAAS,EACT,WAAW,EACZ,MAAM,YAAY,CAAC;AAEpB,qBAAa,kBAAmB,YAAW,SAAS;IAEhD,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAFR,IAAI,EAAE,QAAQ,EACd,MAAM,EAAE,UAAU,EAClB,QAAQ,EAAE,YAAY;IAIzC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAGrF,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC;IAG/C,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC;IAGhD,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;IAGhC,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAKxF,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAGxB,EAAE,CAAC,CAAC,SAAS,WAAW,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,WAAW;IAG1F,IAAI,CAAC,CAAC,SAAS,WAAW,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,IAAI;IAGvE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAGtB,MAAM,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAGzC,IAAI,SAAS,IAAI,OAAO,CAEvB;IAGD,MAAM,CAAC,IAAI,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;IAGvE,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAGzB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAGxC,MAAM,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,WAAW;IAGhD,MAAM,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,WAAW;CAGhD"}
|
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
// CompositeTransport — the `Transport` façade.
|
|
2
|
-
//
|
|
3
|
-
// ISP in practice: most consumers depend on exactly one of HttpPort / StreamPort / TerminalPort. This
|
|
4
|
-
// façade exists only for the few places (e.g. the AgentLoop host) that genuinely need all three at
|
|
5
|
-
// once. It delegates every method to the corresponding injected port and adds no behavior — keeping
|
|
6
|
-
// SRP intact (each underlying transport still owns its own concern).
|
|
7
|
-
//
|
|
8
|
-
// DIP: it is composed from the three port abstractions at the DI root, never constructing concretes
|
|
9
|
-
// itself, so a test can build a CompositeTransport from fakes.
|
|
10
|
-
export class CompositeTransport {
|
|
11
|
-
http;
|
|
12
|
-
stream;
|
|
13
|
-
terminal;
|
|
14
|
-
constructor(http, stream, terminal) {
|
|
15
|
-
this.http = http;
|
|
16
|
-
this.stream = stream;
|
|
17
|
-
this.terminal = terminal;
|
|
18
|
-
}
|
|
19
|
-
// ── HttpPort ──────────────────────────────────────────────────────────────
|
|
20
|
-
get(path, query) {
|
|
21
|
-
return this.http.get(path, query);
|
|
22
|
-
}
|
|
23
|
-
put(path, body) {
|
|
24
|
-
return this.http.put(path, body);
|
|
25
|
-
}
|
|
26
|
-
post(path, body) {
|
|
27
|
-
return this.http.post(path, body);
|
|
28
|
-
}
|
|
29
|
-
del(path) {
|
|
30
|
-
return this.http.del(path);
|
|
31
|
-
}
|
|
32
|
-
postRaw(path, body, headers) {
|
|
33
|
-
return this.http.postRaw(path, body, headers);
|
|
34
|
-
}
|
|
35
|
-
// ── StreamPort ────────────────────────────────────────────────────────────
|
|
36
|
-
connect() {
|
|
37
|
-
return this.stream.connect();
|
|
38
|
-
}
|
|
39
|
-
on(event, fn) {
|
|
40
|
-
return this.stream.on(event, fn);
|
|
41
|
-
}
|
|
42
|
-
send(event, payload) {
|
|
43
|
-
this.stream.send(event, payload);
|
|
44
|
-
}
|
|
45
|
-
close() {
|
|
46
|
-
return this.stream.close();
|
|
47
|
-
}
|
|
48
|
-
resume(state) {
|
|
49
|
-
return this.stream.resume(state);
|
|
50
|
-
}
|
|
51
|
-
get connected() {
|
|
52
|
-
return this.stream.connected;
|
|
53
|
-
}
|
|
54
|
-
// ── TerminalPort ──────────────────────────────────────────────────────────
|
|
55
|
-
create(opts) {
|
|
56
|
-
return this.terminal.create(opts);
|
|
57
|
-
}
|
|
58
|
-
input(data) {
|
|
59
|
-
this.terminal.input(data);
|
|
60
|
-
}
|
|
61
|
-
resize(cols, rows) {
|
|
62
|
-
this.terminal.resize(cols, rows);
|
|
63
|
-
}
|
|
64
|
-
onData(fn) {
|
|
65
|
-
return this.terminal.onData(fn);
|
|
66
|
-
}
|
|
67
|
-
onExit(fn) {
|
|
68
|
-
return this.terminal.onExit(fn);
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
//# sourceMappingURL=composite-transport.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"composite-transport.js","sourceRoot":"","sources":["../../src/transport/composite-transport.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAC/C,EAAE;AACF,sGAAsG;AACtG,mGAAmG;AACnG,oGAAoG;AACpG,qEAAqE;AACrE,EAAE;AACF,oGAAoG;AACpG,+DAA+D;AAiB/D,MAAM,OAAO,kBAAkB;IAEV;IACA;IACA;IAHnB,YACmB,IAAc,EACd,MAAkB,EAClB,QAAsB;QAFtB,SAAI,GAAJ,IAAI,CAAU;QACd,WAAM,GAAN,MAAM,CAAY;QAClB,aAAQ,GAAR,QAAQ,CAAc;IACtC,CAAC;IAEJ,6EAA6E;IAC7E,GAAG,CAAI,IAAY,EAAE,KAAmD;QACtE,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAI,IAAI,EAAE,KAAK,CAAC,CAAC;IACvC,CAAC;IACD,GAAG,CAAI,IAAY,EAAE,IAAa;QAChC,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAI,IAAI,EAAE,IAAI,CAAC,CAAC;IACtC,CAAC;IACD,IAAI,CAAI,IAAY,EAAE,IAAa;QACjC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAI,IAAI,EAAE,IAAI,CAAC,CAAC;IACvC,CAAC;IACD,GAAG,CAAI,IAAY;QACjB,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAI,IAAI,CAAC,CAAC;IAChC,CAAC;IACD,OAAO,CAAI,IAAY,EAAE,IAAgB,EAAE,OAAgC;QACzE,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAI,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IACnD,CAAC;IAED,6EAA6E;IAC7E,OAAO;QACL,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;IAC/B,CAAC;IACD,EAAE,CAAwB,KAAQ,EAAE,EAAwC;QAC1E,OAAO,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACnC,CAAC;IACD,IAAI,CAAwB,KAAQ,EAAE,OAA0B;QAC9D,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACnC,CAAC;IACD,KAAK;QACH,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;IAC7B,CAAC;IACD,MAAM,CAAC,KAAkB;QACvB,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC;IACD,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;IAC/B,CAAC;IAED,6EAA6E;IAC7E,MAAM,CAAC,IAAsC;QAC3C,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC;IACD,KAAK,CAAC,IAAY;QAChB,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IACD,MAAM,CAAC,IAAY,EAAE,IAAY;QAC/B,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACnC,CAAC;IACD,MAAM,CAAC,EAA2B;QAChC,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAClC,CAAC;IACD,MAAM,CAAC,EAA0B;QAC/B,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAClC,CAAC;CACF"}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import type { WsStreamTransport } from "./ws-stream-transport.js";
|
|
2
|
-
export declare class DeviceBrowserResponder {
|
|
3
|
-
private readonly stream;
|
|
4
|
-
private readonly executablePath;
|
|
5
|
-
private readonly sessions;
|
|
6
|
-
private readonly unsubs;
|
|
7
|
-
constructor(stream: WsStreamTransport, executablePath: string);
|
|
8
|
-
start(): void;
|
|
9
|
-
stop(): void;
|
|
10
|
-
private onOpen;
|
|
11
|
-
private onInput;
|
|
12
|
-
private onNavigate;
|
|
13
|
-
private onResize;
|
|
14
|
-
private onClose;
|
|
15
|
-
private emitNav;
|
|
16
|
-
}
|
|
17
|
-
/** Resolve the device's INSTALLED browser executable (the "real browser on local"). Null if none found. */
|
|
18
|
-
export declare function findChrome(): string | null;
|
|
19
|
-
//# sourceMappingURL=device-browser.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"device-browser.d.ts","sourceRoot":"","sources":["../../src/transport/device-browser.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAmFlE,qBAAa,sBAAsB;IAK/B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,cAAc;IALjC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA8B;IACvD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAyB;gBAG7B,MAAM,EAAE,iBAAiB,EACzB,cAAc,EAAE,MAAM;IAGzC,KAAK,IAAI,IAAI;IAQb,IAAI,IAAI,IAAI;YAOE,MAAM;YAoDN,OAAO;YA4BP,UAAU;YAOV,QAAQ;YAqBR,OAAO;IAQrB,OAAO,CAAC,OAAO;CAMhB;AAiBD,2GAA2G;AAC3G,wBAAgB,UAAU,IAAI,MAAM,GAAG,IAAI,CAQ1C"}
|
|
@@ -1,243 +0,0 @@
|
|
|
1
|
-
// DeviceBrowserResponder — runs a REAL headless browser on this machine and streams it to the dashboard.
|
|
2
|
-
//
|
|
3
|
-
// The dashboard can't embed the user's localhost app reliably (CSP/SPA/redirects/auth), so instead we run
|
|
4
|
-
// the actual browser HERE (the device), render the page with a genuine engine, and stream JPEG frames to
|
|
5
|
-
// the dashboard while injecting its mouse/keyboard back. Because it's a real browser, SPAs, redirects,
|
|
6
|
-
// APIs, and HMR all just work. Frames come from CDP Page.startScreencast (ack-throttled → natural
|
|
7
|
-
// backpressure); input goes through puppeteer's high-level mouse/keyboard.
|
|
8
|
-
//
|
|
9
|
-
// The device:browser:* events are OUTSIDE the frozen contract, so we ride onRaw/sendRaw (like terminal).
|
|
10
|
-
import { createRequire } from "node:module";
|
|
11
|
-
import { existsSync } from "node:fs";
|
|
12
|
-
import * as os from "node:os";
|
|
13
|
-
import { join } from "node:path";
|
|
14
|
-
const MAX_DIM = 2560;
|
|
15
|
-
const MAX_PHYS = 4096; // physical-pixel cap for the screencast (width*dpr), bounds frame size
|
|
16
|
-
const QUALITY = 92; // high enough that JPEG doesn't soften text; still far smaller than PNG
|
|
17
|
-
function clampDpr(raw) {
|
|
18
|
-
if (!raw || !Number.isFinite(raw) || raw < 1)
|
|
19
|
-
return 1;
|
|
20
|
-
return Math.min(raw, 2);
|
|
21
|
-
}
|
|
22
|
-
// CDP screencast caps at PHYSICAL pixels so it captures the HiDPI surface at native resolution (else the
|
|
23
|
-
// dashboard upscales a 1× frame → blur). Logical layout stays width×height; only the pixel buffer grows.
|
|
24
|
-
function screencastParams(width, height, dpr) {
|
|
25
|
-
return {
|
|
26
|
-
format: "jpeg",
|
|
27
|
-
quality: QUALITY,
|
|
28
|
-
maxWidth: Math.min(MAX_PHYS, Math.round(width * dpr)),
|
|
29
|
-
maxHeight: Math.min(MAX_PHYS, Math.round(height * dpr)),
|
|
30
|
-
};
|
|
31
|
-
}
|
|
32
|
-
export class DeviceBrowserResponder {
|
|
33
|
-
stream;
|
|
34
|
-
executablePath;
|
|
35
|
-
sessions = new Map();
|
|
36
|
-
unsubs = [];
|
|
37
|
-
constructor(stream, executablePath) {
|
|
38
|
-
this.stream = stream;
|
|
39
|
-
this.executablePath = executablePath;
|
|
40
|
-
}
|
|
41
|
-
start() {
|
|
42
|
-
this.unsubs.push(this.stream.onRaw("device:browser:open", (p) => void this.onOpen(p).catch(() => { })));
|
|
43
|
-
this.unsubs.push(this.stream.onRaw("device:browser:input", (p) => void this.onInput(p).catch(() => { })));
|
|
44
|
-
this.unsubs.push(this.stream.onRaw("device:browser:navigate", (p) => void this.onNavigate(p).catch(() => { })));
|
|
45
|
-
this.unsubs.push(this.stream.onRaw("device:browser:resize", (p) => void this.onResize(p).catch(() => { })));
|
|
46
|
-
this.unsubs.push(this.stream.onRaw("device:browser:close", (p) => void this.onClose(p).catch(() => { })));
|
|
47
|
-
}
|
|
48
|
-
stop() {
|
|
49
|
-
for (const u of this.unsubs)
|
|
50
|
-
u();
|
|
51
|
-
this.unsubs.length = 0;
|
|
52
|
-
for (const [, s] of this.sessions)
|
|
53
|
-
void s.browser.close().catch(() => undefined);
|
|
54
|
-
this.sessions.clear();
|
|
55
|
-
}
|
|
56
|
-
async onOpen(payload) {
|
|
57
|
-
const req = (payload ?? {});
|
|
58
|
-
const sid = req.sessionId;
|
|
59
|
-
if (!sid)
|
|
60
|
-
return;
|
|
61
|
-
const width = clampDim(req.width, 1280);
|
|
62
|
-
const height = clampDim(req.height, 720);
|
|
63
|
-
const dpr = clampDpr(req.dpr);
|
|
64
|
-
const url = req.url || "http://localhost:3000";
|
|
65
|
-
try {
|
|
66
|
-
const pptr = loadPuppeteer();
|
|
67
|
-
if (!pptr.module)
|
|
68
|
-
throw new Error(pptr.error ?? "puppeteer-core unavailable");
|
|
69
|
-
const browser = await pptr.module.launch({
|
|
70
|
-
executablePath: this.executablePath,
|
|
71
|
-
headless: true,
|
|
72
|
-
defaultViewport: { width, height },
|
|
73
|
-
args: ["--no-sandbox", "--disable-gpu", "--disable-dev-shm-usage", "--hide-scrollbars"],
|
|
74
|
-
});
|
|
75
|
-
const page = await browser.newPage();
|
|
76
|
-
await page.setViewport({ width, height, deviceScaleFactor: dpr });
|
|
77
|
-
const cdp = await page.createCDPSession();
|
|
78
|
-
const session = { browser, page, cdp, lastUrl: url, dpr };
|
|
79
|
-
this.sessions.set(sid, session);
|
|
80
|
-
// Browser exited on its own (crash / manual close) → tell the dashboard.
|
|
81
|
-
browser.on("disconnected", () => {
|
|
82
|
-
if (this.sessions.delete(sid))
|
|
83
|
-
this.stream.sendRaw("device:browser:closed", { sessionId: sid });
|
|
84
|
-
});
|
|
85
|
-
cdp.on("Page.screencastFrame", (frame) => {
|
|
86
|
-
this.stream.sendRaw("device:browser:frame", { sessionId: sid, data: frame.data });
|
|
87
|
-
// Ack AFTER forwarding — CDP withholds the next frame until we ack, throttling to the relay's rate.
|
|
88
|
-
void cdp.send("Page.screencastFrameAck", { sessionId: frame.sessionId }).catch(() => undefined);
|
|
89
|
-
});
|
|
90
|
-
page.on("framenavigated", () => this.emitNav(sid, session));
|
|
91
|
-
// Navigate (don't fail the session on a load error — a real browser just shows its error page).
|
|
92
|
-
await page.goto(url, { waitUntil: "domcontentloaded", timeout: 30_000 }).catch(() => undefined);
|
|
93
|
-
await cdp.send("Page.startScreencast", screencastParams(width, height, dpr));
|
|
94
|
-
this.stream.sendRaw("device:browser:ready", { sessionId: sid });
|
|
95
|
-
this.emitNav(sid, session);
|
|
96
|
-
}
|
|
97
|
-
catch (err) {
|
|
98
|
-
this.sessions.delete(sid);
|
|
99
|
-
this.stream.sendRaw("device:browser:error", {
|
|
100
|
-
sessionId: sid,
|
|
101
|
-
error: err instanceof Error ? err.message : String(err),
|
|
102
|
-
});
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
async onInput(payload) {
|
|
106
|
-
const req = (payload ?? {});
|
|
107
|
-
const s = req.sessionId ? this.sessions.get(req.sessionId) : undefined;
|
|
108
|
-
if (!s)
|
|
109
|
-
return;
|
|
110
|
-
try {
|
|
111
|
-
if (req.type === "mouse") {
|
|
112
|
-
const x = req.x ?? 0;
|
|
113
|
-
const y = req.y ?? 0;
|
|
114
|
-
if (req.action === "move")
|
|
115
|
-
await s.page.mouse.move(x, y);
|
|
116
|
-
else if (req.action === "down")
|
|
117
|
-
await s.page.mouse.down({ button: req.button ?? "left" });
|
|
118
|
-
else if (req.action === "up")
|
|
119
|
-
await s.page.mouse.up({ button: req.button ?? "left" });
|
|
120
|
-
}
|
|
121
|
-
else if (req.type === "scroll") {
|
|
122
|
-
await s.page.mouse.wheel({ deltaX: req.dx ?? 0, deltaY: req.dy ?? 0 });
|
|
123
|
-
}
|
|
124
|
-
else if (req.type === "key" && req.key) {
|
|
125
|
-
// Printable single chars → sendCharacter (reliable insert); named keys (Enter/Backspace/arrows) →
|
|
126
|
-
// down/up. Modifier combos are out of scope for v1.
|
|
127
|
-
if (req.action === "down") {
|
|
128
|
-
if (req.key.length === 1)
|
|
129
|
-
await s.page.keyboard.sendCharacter(req.key);
|
|
130
|
-
else
|
|
131
|
-
await s.page.keyboard.down(req.key);
|
|
132
|
-
}
|
|
133
|
-
else if (req.action === "up" && req.key.length > 1) {
|
|
134
|
-
await s.page.keyboard.up(req.key);
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
catch {
|
|
139
|
-
/* input on a closing page — ignore */
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
async onNavigate(payload) {
|
|
143
|
-
const { sessionId, url } = (payload ?? {});
|
|
144
|
-
const s = sessionId ? this.sessions.get(sessionId) : undefined;
|
|
145
|
-
if (!s || !url)
|
|
146
|
-
return;
|
|
147
|
-
await s.page.goto(url, { waitUntil: "domcontentloaded", timeout: 30_000 }).catch(() => undefined);
|
|
148
|
-
}
|
|
149
|
-
async onResize(payload) {
|
|
150
|
-
const { sessionId, width, height, dpr } = (payload ?? {});
|
|
151
|
-
const s = sessionId ? this.sessions.get(sessionId) : undefined;
|
|
152
|
-
if (!s)
|
|
153
|
-
return;
|
|
154
|
-
const w = clampDim(width, 1280);
|
|
155
|
-
const h = clampDim(height, 720);
|
|
156
|
-
if (dpr !== undefined)
|
|
157
|
-
s.dpr = clampDpr(dpr);
|
|
158
|
-
try {
|
|
159
|
-
await s.page.setViewport({ width: w, height: h, deviceScaleFactor: s.dpr });
|
|
160
|
-
await s.cdp.send("Page.stopScreencast").catch(() => undefined);
|
|
161
|
-
await s.cdp.send("Page.startScreencast", screencastParams(w, h, s.dpr));
|
|
162
|
-
}
|
|
163
|
-
catch {
|
|
164
|
-
/* resizing a closing page — ignore */
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
async onClose(payload) {
|
|
168
|
-
const { sessionId } = (payload ?? {});
|
|
169
|
-
const s = sessionId ? this.sessions.get(sessionId) : undefined;
|
|
170
|
-
if (!s || !sessionId)
|
|
171
|
-
return;
|
|
172
|
-
this.sessions.delete(sessionId);
|
|
173
|
-
await s.browser.close().catch(() => undefined);
|
|
174
|
-
}
|
|
175
|
-
emitNav(sid, s) {
|
|
176
|
-
const url = s.page.url();
|
|
177
|
-
if (url === s.lastUrl)
|
|
178
|
-
return;
|
|
179
|
-
s.lastUrl = url;
|
|
180
|
-
this.stream.sendRaw("device:browser:nav", { sessionId: sid, url });
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
function clampDim(raw, fallback) {
|
|
184
|
-
if (!raw || !Number.isFinite(raw) || raw <= 0)
|
|
185
|
-
return fallback;
|
|
186
|
-
return Math.min(Math.round(raw), MAX_DIM);
|
|
187
|
-
}
|
|
188
|
-
/** Load puppeteer-core at runtime so a missing/broken install degrades gracefully (like node-pty). */
|
|
189
|
-
function loadPuppeteer() {
|
|
190
|
-
try {
|
|
191
|
-
const require = createRequire(import.meta.url);
|
|
192
|
-
return { module: require("puppeteer-core") };
|
|
193
|
-
}
|
|
194
|
-
catch (err) {
|
|
195
|
-
return { error: err instanceof Error ? err.message : String(err) };
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
/** Resolve the device's INSTALLED browser executable (the "real browser on local"). Null if none found. */
|
|
199
|
-
export function findChrome() {
|
|
200
|
-
for (const env of ["PUPPETEER_EXECUTABLE_PATH", "CHROME_PATH"]) {
|
|
201
|
-
const p = process.env[env];
|
|
202
|
-
if (p && existsSync(p))
|
|
203
|
-
return p;
|
|
204
|
-
}
|
|
205
|
-
const candidates = chromeCandidates();
|
|
206
|
-
for (const c of candidates)
|
|
207
|
-
if (existsSync(c))
|
|
208
|
-
return c;
|
|
209
|
-
return null;
|
|
210
|
-
}
|
|
211
|
-
function chromeCandidates() {
|
|
212
|
-
switch (os.platform()) {
|
|
213
|
-
case "darwin":
|
|
214
|
-
return [
|
|
215
|
-
"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome",
|
|
216
|
-
"/Applications/Chromium.app/Contents/MacOS/Chromium",
|
|
217
|
-
"/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge",
|
|
218
|
-
"/Applications/Brave Browser.app/Contents/MacOS/Brave Browser",
|
|
219
|
-
"/Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary",
|
|
220
|
-
];
|
|
221
|
-
case "win32": {
|
|
222
|
-
const pf = process.env["PROGRAMFILES"] ?? "C:\\Program Files";
|
|
223
|
-
const pf86 = process.env["PROGRAMFILES(X86)"] ?? "C:\\Program Files (x86)";
|
|
224
|
-
const local = process.env["LOCALAPPDATA"] ?? join(os.homedir(), "AppData", "Local");
|
|
225
|
-
return [
|
|
226
|
-
join(pf, "Google\\Chrome\\Application\\chrome.exe"),
|
|
227
|
-
join(pf86, "Google\\Chrome\\Application\\chrome.exe"),
|
|
228
|
-
join(local, "Google\\Chrome\\Application\\chrome.exe"),
|
|
229
|
-
join(pf86, "Microsoft\\Edge\\Application\\msedge.exe"),
|
|
230
|
-
];
|
|
231
|
-
}
|
|
232
|
-
default:
|
|
233
|
-
return [
|
|
234
|
-
"/usr/bin/google-chrome",
|
|
235
|
-
"/usr/bin/google-chrome-stable",
|
|
236
|
-
"/usr/bin/chromium",
|
|
237
|
-
"/usr/bin/chromium-browser",
|
|
238
|
-
"/snap/bin/chromium",
|
|
239
|
-
"/usr/bin/microsoft-edge",
|
|
240
|
-
];
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
|
-
//# sourceMappingURL=device-browser.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"device-browser.js","sourceRoot":"","sources":["../../src/transport/device-browser.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import type { WsStreamTransport } from "./ws-stream-transport.js";
|
|
2
|
-
export declare class DeviceGitResponder {
|
|
3
|
-
private readonly stream;
|
|
4
|
-
private readonly cwd;
|
|
5
|
-
private readonly onAfterCheckout?;
|
|
6
|
-
private readonly unsubs;
|
|
7
|
-
constructor(stream: WsStreamTransport, cwd?: string, onAfterCheckout?: (() => Promise<void> | void) | undefined);
|
|
8
|
-
start(): void;
|
|
9
|
-
stop(): void;
|
|
10
|
-
private onRequest;
|
|
11
|
-
private listBranches;
|
|
12
|
-
private unstage;
|
|
13
|
-
}
|
|
14
|
-
//# sourceMappingURL=device-git.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"device-git.d.ts","sourceRoot":"","sources":["../../src/transport/device-git.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAUlE,qBAAa,kBAAkB;IAI3B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,GAAG;IAGpB,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC;IAPnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAyB;gBAG7B,MAAM,EAAE,iBAAiB,EACzB,GAAG,GAAE,MAAsB,EAG3B,eAAe,CAAC,GAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,aAAA;IAG/D,KAAK,IAAI,IAAI;IAIb,IAAI,IAAI,IAAI;YAKE,SAAS;YA2CT,YAAY;YAQZ,OAAO;CAQtB"}
|