dev3000 0.0.185 → 0.0.187
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 +102 -13
- package/bin/dev3000 +1 -2
- package/dist/cdp-monitor.d.ts +7 -12
- package/dist/cdp-monitor.d.ts.map +1 -1
- package/dist/cdp-monitor.js +86 -170
- package/dist/cdp-monitor.js.map +1 -1
- package/dist/cli.d.ts +1 -2
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +1 -1369
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +1 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -1
- package/dist/index.js.map +1 -1
- package/dist/portless.d.ts +10 -0
- package/dist/portless.d.ts.map +1 -1
- package/dist/portless.js +44 -1
- package/dist/portless.js.map +1 -1
- package/dist/runtime/bridge.d.ts +26 -0
- package/dist/runtime/bridge.d.ts.map +1 -0
- package/dist/runtime/bridge.js +340 -0
- package/dist/runtime/bridge.js.map +1 -0
- package/dist/runtime/chrome-isolation.d.ts +16 -0
- package/dist/runtime/chrome-isolation.d.ts.map +1 -0
- package/dist/runtime/chrome-isolation.js +97 -0
- package/dist/runtime/chrome-isolation.js.map +1 -0
- package/dist/runtime/cli.js +116 -26
- package/dist/runtime/cli.js.map +1 -1
- package/dist/runtime/event-views.d.ts +21 -0
- package/dist/runtime/event-views.d.ts.map +1 -0
- package/dist/runtime/event-views.js +53 -0
- package/dist/runtime/event-views.js.map +1 -0
- package/dist/runtime/harness.d.ts +16 -0
- package/dist/runtime/harness.d.ts.map +1 -0
- package/dist/runtime/harness.js +68 -0
- package/dist/runtime/harness.js.map +1 -0
- package/dist/runtime/local-proxy.d.ts +12 -0
- package/dist/runtime/local-proxy.d.ts.map +1 -0
- package/dist/runtime/local-proxy.js +114 -0
- package/dist/runtime/local-proxy.js.map +1 -0
- package/dist/runtime/runtime.d.ts +14 -0
- package/dist/runtime/runtime.d.ts.map +1 -1
- package/dist/runtime/runtime.js +82 -21
- package/dist/runtime/runtime.js.map +1 -1
- package/dist/runtime/sandbox-agent.d.ts +6 -0
- package/dist/runtime/sandbox-agent.d.ts.map +1 -0
- package/dist/runtime/sandbox-agent.js +35 -0
- package/dist/runtime/sandbox-agent.js.map +1 -0
- package/dist/runtime/sandbox-command.d.ts +9 -0
- package/dist/runtime/sandbox-command.d.ts.map +1 -0
- package/dist/runtime/sandbox-command.js +101 -0
- package/dist/runtime/sandbox-command.js.map +1 -0
- package/dist/runtime/sandbox-proxy.d.ts +11 -0
- package/dist/runtime/sandbox-proxy.d.ts.map +1 -0
- package/dist/runtime/sandbox-proxy.js +123 -0
- package/dist/runtime/sandbox-proxy.js.map +1 -0
- package/dist/runtime/sandbox-sessions.d.ts +31 -0
- package/dist/runtime/sandbox-sessions.d.ts.map +1 -0
- package/dist/runtime/sandbox-sessions.js +102 -0
- package/dist/runtime/sandbox-sessions.js.map +1 -0
- package/dist/runtime/sandbox.d.ts +21 -0
- package/dist/runtime/sandbox.d.ts.map +1 -0
- package/dist/runtime/sandbox.js +481 -0
- package/dist/runtime/sandbox.js.map +1 -0
- package/dist/utils/agent-browser.d.ts +2 -120
- package/dist/utils/agent-browser.d.ts.map +1 -1
- package/dist/utils/agent-browser.js +13 -376
- package/dist/utils/agent-browser.js.map +1 -1
- package/dist/utils/project-name.d.ts +11 -1
- package/dist/utils/project-name.d.ts.map +1 -1
- package/dist/utils/project-name.js +14 -1
- package/dist/utils/project-name.js.map +1 -1
- package/package.json +13 -22
- package/skills/d3k/SKILL.md +23 -1
- package/dist/commands/crawl.d.ts +0 -12
- package/dist/commands/crawl.d.ts.map +0 -1
- package/dist/commands/crawl.js +0 -101
- package/dist/commands/crawl.js.map +0 -1
- package/dist/commands/errors.d.ts +0 -14
- package/dist/commands/errors.d.ts.map +0 -1
- package/dist/commands/errors.js +0 -246
- package/dist/commands/errors.js.map +0 -1
- package/dist/commands/fix.d.ts +0 -13
- package/dist/commands/fix.d.ts.map +0 -1
- package/dist/commands/fix.js +0 -219
- package/dist/commands/fix.js.map +0 -1
- package/dist/commands/logs.d.ts +0 -13
- package/dist/commands/logs.d.ts.map +0 -1
- package/dist/commands/logs.js +0 -146
- package/dist/commands/logs.js.map +0 -1
- package/dist/commands/resume.d.ts +0 -11
- package/dist/commands/resume.d.ts.map +0 -1
- package/dist/commands/resume.js +0 -75
- package/dist/commands/resume.js.map +0 -1
- package/dist/commands/status.d.ts +0 -21
- package/dist/commands/status.d.ts.map +0 -1
- package/dist/commands/status.js +0 -44
- package/dist/commands/status.js.map +0 -1
- package/dist/components/AgentSelector.d.ts +0 -12
- package/dist/components/AgentSelector.d.ts.map +0 -1
- package/dist/components/AgentSelector.js +0 -99
- package/dist/components/AgentSelector.js.map +0 -1
- package/dist/components/PackageSelector.d.ts +0 -13
- package/dist/components/PackageSelector.d.ts.map +0 -1
- package/dist/components/PackageSelector.js +0 -79
- package/dist/components/PackageSelector.js.map +0 -1
- package/dist/constants/log-colors.d.ts +0 -43
- package/dist/constants/log-colors.d.ts.map +0 -1
- package/dist/constants/log-colors.js +0 -59
- package/dist/constants/log-colors.js.map +0 -1
- package/dist/dev-environment.d.ts +0 -187
- package/dist/dev-environment.d.ts.map +0 -1
- package/dist/dev-environment.js +0 -2248
- package/dist/dev-environment.js.map +0 -1
- package/dist/screencast-manager.d.ts +0 -78
- package/dist/screencast-manager.d.ts.map +0 -1
- package/dist/screencast-manager.js +0 -529
- package/dist/screencast-manager.js.map +0 -1
- package/dist/services/parsers/error-detectors/base.d.ts +0 -24
- package/dist/services/parsers/error-detectors/base.d.ts.map +0 -1
- package/dist/services/parsers/error-detectors/base.js +0 -44
- package/dist/services/parsers/error-detectors/base.js.map +0 -1
- package/dist/services/parsers/error-detectors/index.d.ts +0 -6
- package/dist/services/parsers/error-detectors/index.d.ts.map +0 -1
- package/dist/services/parsers/error-detectors/index.js +0 -6
- package/dist/services/parsers/error-detectors/index.js.map +0 -1
- package/dist/services/parsers/error-detectors/nextjs.d.ts +0 -9
- package/dist/services/parsers/error-detectors/nextjs.d.ts.map +0 -1
- package/dist/services/parsers/error-detectors/nextjs.js +0 -52
- package/dist/services/parsers/error-detectors/nextjs.js.map +0 -1
- package/dist/services/parsers/index.d.ts +0 -9
- package/dist/services/parsers/index.d.ts.map +0 -1
- package/dist/services/parsers/index.js +0 -10
- package/dist/services/parsers/index.js.map +0 -1
- package/dist/services/parsers/log-parsers/base.d.ts +0 -26
- package/dist/services/parsers/log-parsers/base.d.ts.map +0 -1
- package/dist/services/parsers/log-parsers/base.js +0 -6
- package/dist/services/parsers/log-parsers/base.js.map +0 -1
- package/dist/services/parsers/log-parsers/index.d.ts +0 -6
- package/dist/services/parsers/log-parsers/index.d.ts.map +0 -1
- package/dist/services/parsers/log-parsers/index.js +0 -5
- package/dist/services/parsers/log-parsers/index.js.map +0 -1
- package/dist/services/parsers/log-parsers/standard.d.ts +0 -9
- package/dist/services/parsers/log-parsers/standard.d.ts.map +0 -1
- package/dist/services/parsers/log-parsers/standard.js +0 -17
- package/dist/services/parsers/log-parsers/standard.js.map +0 -1
- package/dist/services/parsers/output-processor.d.ts +0 -39
- package/dist/services/parsers/output-processor.d.ts.map +0 -1
- package/dist/services/parsers/output-processor.js +0 -54
- package/dist/services/parsers/output-processor.js.map +0 -1
- package/dist/skills/d3k/internal-skill.md +0 -32
- package/dist/skills/index.d.ts +0 -54
- package/dist/skills/index.d.ts.map +0 -1
- package/dist/skills/index.js +0 -214
- package/dist/skills/index.js.map +0 -1
- package/dist/src/tui-interface-impl.tsx +0 -644
- package/dist/tui-interface-impl.d.ts +0 -30
- package/dist/tui-interface-impl.d.ts.map +0 -1
- package/dist/tui-interface-impl.js +0 -403
- package/dist/tui-interface-impl.js.map +0 -1
- package/dist/tui-interface-opentui.d.ts +0 -33
- package/dist/tui-interface-opentui.d.ts.map +0 -1
- package/dist/tui-interface-opentui.js +0 -1128
- package/dist/tui-interface-opentui.js.map +0 -1
- package/dist/tui-interface.d.ts +0 -38
- package/dist/tui-interface.d.ts.map +0 -1
- package/dist/tui-interface.js +0 -84
- package/dist/tui-interface.js.map +0 -1
- package/dist/utils/agent-detection.d.ts +0 -17
- package/dist/utils/agent-detection.d.ts.map +0 -1
- package/dist/utils/agent-detection.js +0 -81
- package/dist/utils/agent-detection.js.map +0 -1
- package/dist/utils/agent-selection.d.ts +0 -25
- package/dist/utils/agent-selection.d.ts.map +0 -1
- package/dist/utils/agent-selection.js +0 -73
- package/dist/utils/agent-selection.js.map +0 -1
- package/dist/utils/browser-command-argv.d.ts +0 -19
- package/dist/utils/browser-command-argv.d.ts.map +0 -1
- package/dist/utils/browser-command-argv.js +0 -149
- package/dist/utils/browser-command-argv.js.map +0 -1
- package/dist/utils/build-version.d.ts +0 -2
- package/dist/utils/build-version.d.ts.map +0 -1
- package/dist/utils/build-version.js +0 -8
- package/dist/utils/build-version.js.map +0 -1
- package/dist/utils/cli-options.d.ts +0 -5
- package/dist/utils/cli-options.d.ts.map +0 -1
- package/dist/utils/cli-options.js +0 -36
- package/dist/utils/cli-options.js.map +0 -1
- package/dist/utils/d3k-dir.d.ts +0 -3
- package/dist/utils/d3k-dir.d.ts.map +0 -1
- package/dist/utils/d3k-dir.js +0 -12
- package/dist/utils/d3k-dir.js.map +0 -1
- package/dist/utils/d3k-skill-installer.d.ts +0 -4
- package/dist/utils/d3k-skill-installer.d.ts.map +0 -1
- package/dist/utils/d3k-skill-installer.js +0 -30
- package/dist/utils/d3k-skill-installer.js.map +0 -1
- package/dist/utils/log-filename.d.ts +0 -30
- package/dist/utils/log-filename.d.ts.map +0 -1
- package/dist/utils/log-filename.js +0 -60
- package/dist/utils/log-filename.js.map +0 -1
- package/dist/utils/project-detector.d.ts +0 -25
- package/dist/utils/project-detector.d.ts.map +0 -1
- package/dist/utils/project-detector.js +0 -153
- package/dist/utils/project-detector.js.map +0 -1
- package/dist/utils/project-metadata.d.ts +0 -4
- package/dist/utils/project-metadata.d.ts.map +0 -1
- package/dist/utils/project-metadata.js +0 -48
- package/dist/utils/project-metadata.js.map +0 -1
- package/dist/utils/repo-validate.d.ts +0 -2
- package/dist/utils/repo-validate.d.ts.map +0 -1
- package/dist/utils/repo-validate.js +0 -10
- package/dist/utils/repo-validate.js.map +0 -1
- package/dist/utils/session.d.ts +0 -19
- package/dist/utils/session.d.ts.map +0 -1
- package/dist/utils/session.js +0 -65
- package/dist/utils/session.js.map +0 -1
- package/dist/utils/skill-installer.d.ts +0 -65
- package/dist/utils/skill-installer.d.ts.map +0 -1
- package/dist/utils/skill-installer.js +0 -265
- package/dist/utils/skill-installer.js.map +0 -1
- package/dist/utils/timestamp.d.ts +0 -20
- package/dist/utils/timestamp.d.ts.map +0 -1
- package/dist/utils/timestamp.js +0 -57
- package/dist/utils/timestamp.js.map +0 -1
- package/dist/utils/tmux-helpers.d.ts +0 -36
- package/dist/utils/tmux-helpers.d.ts.map +0 -1
- package/dist/utils/tmux-helpers.js +0 -118
- package/dist/utils/tmux-helpers.js.map +0 -1
- package/dist/utils/user-config.d.ts +0 -12
- package/dist/utils/user-config.d.ts.map +0 -1
- package/dist/utils/user-config.js +0 -46
- package/dist/utils/user-config.js.map +0 -1
- package/dist/utils/version-check.d.ts +0 -52
- package/dist/utils/version-check.d.ts.map +0 -1
- package/dist/utils/version-check.js +0 -304
- package/dist/utils/version-check.js.map +0 -1
- package/src/tui-interface-impl.tsx +0 -644
package/dist/runtime/cli.js
CHANGED
|
@@ -1,42 +1,88 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { spawn } from "node:child_process";
|
|
2
|
+
import { spawn, spawnSync } from "node:child_process";
|
|
3
|
+
import { readFileSync } from "node:fs";
|
|
3
4
|
import { Command } from "commander";
|
|
4
5
|
import { getPortlessProxyStatus, installPortlessService } from "../portless.js";
|
|
5
6
|
import { getAgentBrowserBinaryPath } from "../utils/agent-browser.js";
|
|
7
|
+
import { readRecentEvents, selectEventView } from "./event-views.js";
|
|
8
|
+
import { parseHarness } from "./harness.js";
|
|
6
9
|
import { startRuntime } from "./runtime.js";
|
|
10
|
+
import { addSandboxProjectOptions, registerSandboxCommand, runSandboxProject } from "./sandbox-command.js";
|
|
7
11
|
import { queryRuntime, readRuntimeSession } from "./session.js";
|
|
8
|
-
// The skill helper acquires this package outside the target pnpm workspace.
|
|
9
|
-
// Restore the app cwd before any command resolves project/session state, and
|
|
10
|
-
// do not pass this bootstrap-only setting to the app or browser.
|
|
11
12
|
if (process.env.D3K_BOOTSTRAP_CWD) {
|
|
12
13
|
process.chdir(process.env.D3K_BOOTSTRAP_CWD);
|
|
13
14
|
delete process.env.D3K_BOOTSTRAP_CWD;
|
|
14
15
|
}
|
|
15
16
|
const print = (value) => console.log(JSON.stringify(value));
|
|
17
|
+
const version = JSON.parse(readFileSync(new URL("../../package.json", import.meta.url), "utf8")).version;
|
|
16
18
|
const program = new Command()
|
|
17
|
-
.name("d3k
|
|
18
|
-
.
|
|
19
|
+
.name("d3k")
|
|
20
|
+
.version(version)
|
|
21
|
+
.description("Dev server and managed browser with a bounded, in-memory event timeline");
|
|
22
|
+
registerSandboxCommand(program);
|
|
23
|
+
addSandboxProjectOptions(program)
|
|
24
|
+
.option("--command <command>", "Remote dev command")
|
|
25
|
+
.option("--headless", "Run local Chrome headlessly")
|
|
26
|
+
.action(runSandboxProject);
|
|
27
|
+
function positiveInteger(value) {
|
|
28
|
+
const parsed = Number(value);
|
|
29
|
+
if (!Number.isSafeInteger(parsed) || parsed < 1)
|
|
30
|
+
throw new Error("Expected a positive integer");
|
|
31
|
+
return parsed;
|
|
32
|
+
}
|
|
33
|
+
program
|
|
34
|
+
.command("sandbox-serve", { hidden: true })
|
|
35
|
+
.option("--command <command>")
|
|
36
|
+
.option("--startup-timeout <ms>", "Server startup deadline in milliseconds", "300000")
|
|
37
|
+
.action(async (options) => {
|
|
38
|
+
let input = "";
|
|
39
|
+
for await (const chunk of process.stdin) {
|
|
40
|
+
input += chunk.toString();
|
|
41
|
+
if (input.length > 8192)
|
|
42
|
+
throw new Error("Sandbox configuration too large");
|
|
43
|
+
}
|
|
44
|
+
const sandbox = JSON.parse(input);
|
|
45
|
+
if (!sandbox ||
|
|
46
|
+
![sandbox.serverPort, sandbox.bridgePort].every((port) => Number.isSafeInteger(port) && port > 0 && port <= 65535) ||
|
|
47
|
+
sandbox.serverPort === sandbox.bridgePort)
|
|
48
|
+
throw new Error("Invalid sandbox ports");
|
|
49
|
+
await startRuntime({ command: options.command, startupTimeout: positiveInteger(options.startupTimeout), sandbox });
|
|
50
|
+
});
|
|
19
51
|
program
|
|
20
52
|
.command("start")
|
|
21
|
-
.
|
|
53
|
+
.description("Start the local app and browser; retain this process while testing")
|
|
54
|
+
.option("--harness <name>", "Run fx, codex, or claude in this terminal when ready", parseHarness)
|
|
55
|
+
.option("--command <command>", "Dev command (defaults to the package manager's dev script)")
|
|
22
56
|
.option("--headless", "Headless browser for CI")
|
|
23
57
|
.option("--servers-only", "Intentionally omit browser monitoring")
|
|
24
|
-
.option("--startup-timeout <ms>", "Server startup deadline", "120000")
|
|
58
|
+
.option("--startup-timeout <ms>", "Server startup deadline in milliseconds", "120000")
|
|
59
|
+
.option("--browser-navigation-timeout <ms>", "Browser navigation deadline in milliseconds", "30000")
|
|
60
|
+
.option("--browser <path>", "Browser executable path")
|
|
61
|
+
.option("--profile-dir <dir>", "Browser profile directory (defaults to the project profile)")
|
|
62
|
+
.option("--debug", "Browser diagnostic output")
|
|
25
63
|
.action(async (options) => {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
64
|
+
if (options.serversOnly && (options.headless || options.browser || options.profileDir || options.harness))
|
|
65
|
+
throw new Error("--servers-only cannot be combined with browser options");
|
|
66
|
+
if (options.harness && !process.stdin.isTTY)
|
|
67
|
+
throw new Error("--harness requires an interactive terminal");
|
|
68
|
+
await startRuntime({
|
|
69
|
+
...options,
|
|
70
|
+
startupTimeout: positiveInteger(options.startupTimeout),
|
|
71
|
+
browserNavigationTimeout: positiveInteger(options.browserNavigationTimeout)
|
|
72
|
+
});
|
|
30
73
|
});
|
|
31
|
-
program
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
74
|
+
program
|
|
75
|
+
.command("status")
|
|
76
|
+
.description("Show live runtime status")
|
|
77
|
+
.option("--json", "Output JSON (also the default)")
|
|
78
|
+
.action(async () => {
|
|
79
|
+
if (!readRuntimeSession())
|
|
80
|
+
return print({ running: false, ready: false });
|
|
36
81
|
print(await queryRuntime("/status"));
|
|
37
82
|
});
|
|
38
83
|
program
|
|
39
84
|
.command("events")
|
|
85
|
+
.description("Read timeline events after a cursor")
|
|
40
86
|
.option("--after <cursor>", "Read after this sequence number", "0")
|
|
41
87
|
.option("--session <id>", "Previous session id, to detect resets")
|
|
42
88
|
.option("--limit <count>", "Maximum events, 1–500", "100")
|
|
@@ -52,9 +98,46 @@ program
|
|
|
52
98
|
params.set("level", options.level);
|
|
53
99
|
print(await queryRuntime(`/events?${params}`));
|
|
54
100
|
});
|
|
55
|
-
|
|
101
|
+
for (const errors of [false, true]) {
|
|
102
|
+
const command = program
|
|
103
|
+
.command(errors ? "errors" : "logs")
|
|
104
|
+
.description(errors ? "Show recent errors from the live timeline" : "Show recent events from the live timeline")
|
|
105
|
+
.option("-n, --count <count>", "Number of matching events, 1–500", errors ? "10" : "50")
|
|
106
|
+
.option("--json", "Include event cursor and evidence-gap metadata as JSON");
|
|
107
|
+
if (errors)
|
|
108
|
+
command.option("-c, --context", "Include up to five preceding events per error");
|
|
109
|
+
else
|
|
110
|
+
command.option("--type <source>", "Filter by server, browser, runtime, or all", "all");
|
|
111
|
+
command.action(async (options) => {
|
|
112
|
+
const source = options.type && options.type !== "all" ? options.type : undefined;
|
|
113
|
+
if (source && !["server", "browser", "runtime"].includes(source))
|
|
114
|
+
throw new Error("Invalid event source");
|
|
115
|
+
const count = positiveInteger(options.count);
|
|
116
|
+
if (count > 500)
|
|
117
|
+
throw new Error("count must be 1–500");
|
|
118
|
+
const view = selectEventView(await readRecentEvents(queryRuntime), {
|
|
119
|
+
count,
|
|
120
|
+
source,
|
|
121
|
+
errors,
|
|
122
|
+
context: options.context
|
|
123
|
+
});
|
|
124
|
+
if (options.json)
|
|
125
|
+
return print(view);
|
|
126
|
+
if (view.dropped)
|
|
127
|
+
console.log(`[runtime] ${view.dropped} earlier events are no longer retained`);
|
|
128
|
+
for (const event of view.events)
|
|
129
|
+
console.log(`${event.timestamp} [${event.source}/${event.level}] ${event.message}`);
|
|
130
|
+
if (!view.events.length)
|
|
131
|
+
console.log("No matching events in the retained timeline.");
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
program
|
|
135
|
+
.command("stop")
|
|
136
|
+
.description("Stop this project's app and browser")
|
|
137
|
+
.action(async () => print(await queryRuntime("/stop", process.cwd(), "POST")));
|
|
56
138
|
program
|
|
57
139
|
.command("browser")
|
|
140
|
+
.description("Drive the runtime's monitored browser with agent-browser")
|
|
58
141
|
.allowUnknownOption()
|
|
59
142
|
.argument("[args...]")
|
|
60
143
|
.action(async (args) => {
|
|
@@ -67,22 +150,29 @@ program
|
|
|
67
150
|
await new Promise((resolveRun, reject) => {
|
|
68
151
|
const child = spawn(getAgentBrowserBinaryPath(), ["--session", `d3k-${session.sessionId}`, "--cdp", port, ...args], { stdio: "inherit" });
|
|
69
152
|
child.on("error", reject);
|
|
70
|
-
child.on("exit", (code) => {
|
|
71
|
-
if (code !== 0)
|
|
72
|
-
reject(new Error(`agent-browser exited ${code}`));
|
|
73
|
-
else
|
|
74
|
-
resolveRun();
|
|
75
|
-
});
|
|
153
|
+
child.on("exit", (code) => (code !== 0 ? reject(new Error(`agent-browser exited ${code}`)) : resolveRun()));
|
|
76
154
|
});
|
|
77
155
|
});
|
|
78
|
-
const portless = program.command("portless");
|
|
79
|
-
portless
|
|
156
|
+
const portless = program.command("portless").description("Prepare canonical local HTTPS");
|
|
157
|
+
portless
|
|
158
|
+
.command("status")
|
|
159
|
+
.option("--json", "Output JSON (also the default)")
|
|
160
|
+
.action(() => print(getPortlessProxyStatus()));
|
|
80
161
|
portless.command("setup").action(async () => {
|
|
81
162
|
const result = await installPortlessService();
|
|
82
163
|
print(result);
|
|
83
164
|
if (!result.success)
|
|
84
165
|
process.exitCode = 1;
|
|
85
166
|
});
|
|
167
|
+
program
|
|
168
|
+
.command("upgrade")
|
|
169
|
+
.description("Explicitly upgrade the global package with Bun")
|
|
170
|
+
.action(() => {
|
|
171
|
+
const result = spawnSync("bun", ["add", "--global", "dev3000@latest"], { stdio: "inherit", shell: false });
|
|
172
|
+
if (result.error)
|
|
173
|
+
throw result.error;
|
|
174
|
+
process.exitCode = result.status ?? 1;
|
|
175
|
+
});
|
|
86
176
|
program.parseAsync().catch((error) => {
|
|
87
177
|
console.error(JSON.stringify({ error: error instanceof Error ? error.message : String(error) }));
|
|
88
178
|
process.exitCode = 1;
|
package/dist/runtime/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/runtime/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/runtime/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { TimelineEvent } from "./timeline.js";
|
|
2
|
+
export interface EventPage {
|
|
3
|
+
sessionId: string;
|
|
4
|
+
events: TimelineEvent[];
|
|
5
|
+
cursor: number;
|
|
6
|
+
latest: number;
|
|
7
|
+
oldest: number;
|
|
8
|
+
reset: boolean;
|
|
9
|
+
dropped: number;
|
|
10
|
+
hasMore: boolean;
|
|
11
|
+
}
|
|
12
|
+
/** Select recent events while preserving chronological context and evidence-gap metadata. */
|
|
13
|
+
export declare function selectEventView(page: EventPage, options: {
|
|
14
|
+
count: number;
|
|
15
|
+
source?: string;
|
|
16
|
+
errors?: boolean;
|
|
17
|
+
context?: boolean;
|
|
18
|
+
}): EventPage;
|
|
19
|
+
/** Read at most the retained buffer, fenced at the status cursor so active traffic cannot cause endless paging. */
|
|
20
|
+
export declare function readRecentEvents(query: (path: string) => Promise<unknown>): Promise<EventPage>;
|
|
21
|
+
//# sourceMappingURL=event-views.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-views.d.ts","sourceRoot":"","sources":["../../src/runtime/event-views.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAElD,MAAM,WAAW,SAAS;IACxB,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,aAAa,EAAE,CAAA;IACvB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,OAAO,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,OAAO,CAAA;CACjB;AAED,6FAA6F;AAC7F,wBAAgB,eAAe,CAC7B,IAAI,EAAE,SAAS,EACf,OAAO,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GAC/E,SAAS,CAgBX;AAED,mHAAmH;AACnH,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC,CA+BpG"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/** Select recent events while preserving chronological context and evidence-gap metadata. */
|
|
2
|
+
export function selectEventView(page, options) {
|
|
3
|
+
if (!Number.isSafeInteger(options.count) || options.count < 1 || options.count > 500)
|
|
4
|
+
throw new Error("count must be 1–500");
|
|
5
|
+
const matches = page.events
|
|
6
|
+
.filter((event) => (!options.source || event.source === options.source) && (!options.errors || event.level === "error"))
|
|
7
|
+
.slice(-options.count);
|
|
8
|
+
const selected = new Set(matches.map((event) => event.seq));
|
|
9
|
+
if (options.context) {
|
|
10
|
+
for (const match of matches) {
|
|
11
|
+
const index = page.events.findIndex((event) => event.seq === match.seq);
|
|
12
|
+
for (const event of page.events.slice(Math.max(0, index - 5), index))
|
|
13
|
+
selected.add(event.seq);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
return { ...page, events: page.events.filter((event) => selected.has(event.seq)) };
|
|
17
|
+
}
|
|
18
|
+
/** Read at most the retained buffer, fenced at the status cursor so active traffic cannot cause endless paging. */
|
|
19
|
+
export async function readRecentEvents(query) {
|
|
20
|
+
const status = (await query("/status"));
|
|
21
|
+
let cursor = Math.max(0, status.cursor - 5000);
|
|
22
|
+
let combined;
|
|
23
|
+
for (let index = 0; index < 10; index++) {
|
|
24
|
+
const page = (await query(`/events?after=${cursor}&limit=500&sessionId=${encodeURIComponent(status.sessionId)}`));
|
|
25
|
+
if (page.reset)
|
|
26
|
+
throw new Error("Runtime restarted while reading events; retry against the new session");
|
|
27
|
+
const events = page.events.filter((event) => event.seq <= status.cursor);
|
|
28
|
+
combined = combined
|
|
29
|
+
? {
|
|
30
|
+
...combined,
|
|
31
|
+
events: [...combined.events, ...events],
|
|
32
|
+
dropped: combined.dropped + page.dropped,
|
|
33
|
+
cursor: Math.min(page.cursor, status.cursor),
|
|
34
|
+
hasMore: page.cursor < status.cursor
|
|
35
|
+
}
|
|
36
|
+
: {
|
|
37
|
+
...page,
|
|
38
|
+
events,
|
|
39
|
+
latest: status.cursor,
|
|
40
|
+
cursor: Math.min(page.cursor, status.cursor),
|
|
41
|
+
hasMore: page.cursor < status.cursor
|
|
42
|
+
};
|
|
43
|
+
if (page.cursor >= status.cursor || !page.hasMore)
|
|
44
|
+
break;
|
|
45
|
+
if (page.cursor <= cursor)
|
|
46
|
+
throw new Error("Event cursor did not advance");
|
|
47
|
+
cursor = page.cursor;
|
|
48
|
+
}
|
|
49
|
+
if (!combined)
|
|
50
|
+
throw new Error("No event response");
|
|
51
|
+
return combined;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=event-views.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-views.js","sourceRoot":"","sources":["../../src/runtime/event-views.ts"],"names":[],"mappings":"AAaA,6FAA6F;AAC7F,MAAM,UAAU,eAAe,CAC7B,IAAe,EACf,OAAgF;IAEhF,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,KAAK,GAAG,CAAC,IAAI,OAAO,CAAC,KAAK,GAAG,GAAG;QAClF,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAA;IACxC,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM;SACxB,MAAM,CACL,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,KAAK,OAAO,CAAC,CAChH;SACA,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;IACxB,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAA;IAC3D,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,KAAK,KAAK,CAAC,GAAG,CAAC,CAAA;YACvE,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC;gBAAE,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QAC/F,CAAC;IACH,CAAC;IACD,OAAO,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAAA;AACpF,CAAC;AAED,mHAAmH;AACnH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,KAAyC;IAC9E,MAAM,MAAM,GAAG,CAAC,MAAM,KAAK,CAAC,SAAS,CAAC,CAA0C,CAAA;IAChF,IAAI,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,CAAA;IAC9C,IAAI,QAA+B,CAAA;IACnC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC;QACxC,MAAM,IAAI,GAAG,CAAC,MAAM,KAAK,CACvB,iBAAiB,MAAM,wBAAwB,kBAAkB,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CACtF,CAAc,CAAA;QACf,IAAI,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,uEAAuE,CAAC,CAAA;QACxG,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,CAAA;QACxE,QAAQ,GAAG,QAAQ;YACjB,CAAC,CAAC;gBACE,GAAG,QAAQ;gBACX,MAAM,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,GAAG,MAAM,CAAC;gBACvC,OAAO,EAAE,QAAQ,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO;gBACxC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC;gBAC5C,OAAO,EAAE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM;aACrC;YACH,CAAC,CAAC;gBACE,GAAG,IAAI;gBACP,MAAM;gBACN,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC;gBAC5C,OAAO,EAAE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM;aACrC,CAAA;QACL,IAAI,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,MAAK;QACxD,IAAI,IAAI,CAAC,MAAM,IAAI,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAA;QAC1E,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;IACtB,CAAC;IACD,IAAI,CAAC,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAA;IACnD,OAAO,QAAQ,CAAA;AACjB,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export declare const HARNESS_NAMES: readonly ["fx", "codex", "claude"];
|
|
2
|
+
export type Harness = (typeof HARNESS_NAMES)[number];
|
|
3
|
+
export declare function parseHarness(value: string): Harness;
|
|
4
|
+
export declare const bundledSkillPath: string;
|
|
5
|
+
export declare function harnessSkill(): string;
|
|
6
|
+
export declare function harnessInvocation(harness: Harness, skillPath: string, contextDirectory: string): {
|
|
7
|
+
binary: "claude" | "codex" | "fx";
|
|
8
|
+
args: string[];
|
|
9
|
+
};
|
|
10
|
+
/** Only fixed binaries and argument arrays; the selection never passes through a shell. */
|
|
11
|
+
export declare function launchLocalHarness(harness: Harness, cwd: string, signal: AbortSignal): Promise<void>;
|
|
12
|
+
export declare function runHarnessProcess(binary: string, args: string[], options: {
|
|
13
|
+
cwd: string;
|
|
14
|
+
signal: AbortSignal;
|
|
15
|
+
}): Promise<void>;
|
|
16
|
+
//# sourceMappingURL=harness.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"harness.d.ts","sourceRoot":"","sources":["../../src/runtime/harness.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,aAAa,YAAI,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAU,CAAA;AAC/D,MAAM,MAAM,OAAO,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAA;AACpD,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAInD;AACD,eAAO,MAAM,gBAAgB,QAAuE,CAAA;AACpG,wBAAgB,YAAY,IAAI,MAAM,CAErC;AACD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM;IAGpF,MAAM;IAAW,IAAI;EAC/B;AAED,2FAA2F;AAC3F,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAa1G;AAED,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,WAAW,CAAA;CAAE,GAC5C,OAAO,CAAC,IAAI,CAAC,CAyBf"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from "node:fs";
|
|
3
|
+
import { tmpdir } from "node:os";
|
|
4
|
+
import { join } from "node:path";
|
|
5
|
+
import { fileURLToPath } from "node:url";
|
|
6
|
+
import { InvalidArgumentError } from "commander";
|
|
7
|
+
export const HARNESS_NAMES = ["fx", "codex", "claude"];
|
|
8
|
+
export function parseHarness(value) {
|
|
9
|
+
if (!HARNESS_NAMES.includes(value))
|
|
10
|
+
throw new InvalidArgumentError(`Choose a harness: ${HARNESS_NAMES.join(", ")}`);
|
|
11
|
+
return value;
|
|
12
|
+
}
|
|
13
|
+
export const bundledSkillPath = fileURLToPath(new URL("../../skills/d3k/SKILL.md", import.meta.url));
|
|
14
|
+
export function harnessSkill() {
|
|
15
|
+
return `${readFileSync(bundledSkillPath, "utf8").replace(/Use `node <skill-directory>.*?## Prepare/s, "Use `d3k` as `runtime` below, from the project root. The runtime is already running; reuse it.\n\n## Prepare")}\n\n## Harness startup\n\nThe d3k runtime is already running in this workspace. Read its status and use its monitored browser and timeline; do not start another runtime. Await the user's instructions before modifying code. Use d3k status, d3k browser, and d3k events from the project directory.\n`;
|
|
16
|
+
}
|
|
17
|
+
export function harnessInvocation(harness, skillPath, contextDirectory) {
|
|
18
|
+
parseHarness(harness);
|
|
19
|
+
const prompt = `Load the d3k skill by reading ${skillPath}. The d3k runtime is already running in this workspace. Use its existing browser and timeline; do not start another runtime. Await further instruction.`;
|
|
20
|
+
return { binary: harness, args: harness === "fx" ? ["--add-dir", contextDirectory] : [prompt] };
|
|
21
|
+
}
|
|
22
|
+
/** Only fixed binaries and argument arrays; the selection never passes through a shell. */
|
|
23
|
+
export async function launchLocalHarness(harness, cwd, signal) {
|
|
24
|
+
if (!process.stdin.isTTY)
|
|
25
|
+
throw new Error("--harness requires an interactive terminal");
|
|
26
|
+
const directory = mkdtempSync(join(tmpdir(), "d3k-harness-"));
|
|
27
|
+
const skillDirectory = join(directory, ".fx", "skills", "d3k");
|
|
28
|
+
mkdirSync(skillDirectory, { recursive: true });
|
|
29
|
+
const skillPath = join(skillDirectory, "SKILL.md");
|
|
30
|
+
writeFileSync(skillPath, harnessSkill(), { mode: 0o600 });
|
|
31
|
+
const invocation = harnessInvocation(harness, skillPath, directory);
|
|
32
|
+
try {
|
|
33
|
+
await runHarnessProcess(invocation.binary, invocation.args, { cwd, signal });
|
|
34
|
+
}
|
|
35
|
+
finally {
|
|
36
|
+
rmSync(directory, { recursive: true, force: true });
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
export async function runHarnessProcess(binary, args, options) {
|
|
40
|
+
if (options.signal.aborted)
|
|
41
|
+
return;
|
|
42
|
+
await new Promise((resolve, reject) => {
|
|
43
|
+
const child = spawn(binary, args, { cwd: options.cwd, stdio: "inherit", shell: false });
|
|
44
|
+
let timer;
|
|
45
|
+
const abort = () => {
|
|
46
|
+
child.kill("SIGTERM");
|
|
47
|
+
timer = setTimeout(() => child.kill("SIGKILL"), 1000);
|
|
48
|
+
timer.unref();
|
|
49
|
+
};
|
|
50
|
+
options.signal.addEventListener("abort", abort, { once: true });
|
|
51
|
+
const cleanup = () => {
|
|
52
|
+
options.signal.removeEventListener("abort", abort);
|
|
53
|
+
clearTimeout(timer);
|
|
54
|
+
};
|
|
55
|
+
child.on("error", (error) => {
|
|
56
|
+
cleanup();
|
|
57
|
+
reject(new Error(`Could not launch ${binary}: ${error.message}. Install and authenticate the harness first.`));
|
|
58
|
+
});
|
|
59
|
+
child.on("exit", (code) => {
|
|
60
|
+
cleanup();
|
|
61
|
+
if (options.signal.aborted || code === 0)
|
|
62
|
+
resolve();
|
|
63
|
+
else
|
|
64
|
+
reject(new Error(`${binary} exited with code ${code}`));
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=harness.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"harness.js","sourceRoot":"","sources":["../../src/runtime/harness.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { ConnectionOptions } from "node:tls";
|
|
2
|
+
/** The browser keeps a stable local origin; only the transport host changes for Vercel routing. */
|
|
3
|
+
export declare function startLocalProxy(options: {
|
|
4
|
+
appUrl: string;
|
|
5
|
+
upstreamUrl: string;
|
|
6
|
+
token: string;
|
|
7
|
+
ca?: ConnectionOptions["ca"];
|
|
8
|
+
}): Promise<{
|
|
9
|
+
port: number;
|
|
10
|
+
close: () => Promise<void>;
|
|
11
|
+
}>;
|
|
12
|
+
//# sourceMappingURL=local-proxy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-proxy.d.ts","sourceRoot":"","sources":["../../src/runtime/local-proxy.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAA;AAEjD,mGAAmG;AACnG,wBAAsB,eAAe,CAAC,OAAO,EAAE;IAC7C,MAAM,EAAE,MAAM,CAAA;IACd,WAAW,EAAE,MAAM,CAAA;IACnB,KAAK,EAAE,MAAM,CAAA;IACb,EAAE,CAAC,EAAE,iBAAiB,CAAC,IAAI,CAAC,CAAA;CAC7B;;;GAkHA"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { createServer } from "node:http";
|
|
2
|
+
import { Agent, request as httpsRequest } from "node:https";
|
|
3
|
+
/** The browser keeps a stable local origin; only the transport host changes for Vercel routing. */
|
|
4
|
+
export async function startLocalProxy(options) {
|
|
5
|
+
const origin = new URL(options.appUrl);
|
|
6
|
+
const target = new URL(options.upstreamUrl);
|
|
7
|
+
if (origin.protocol !== "https:" || target.protocol !== "https:")
|
|
8
|
+
throw new Error("Proxy origins must use HTTPS");
|
|
9
|
+
const sockets = new Set();
|
|
10
|
+
const agent = new Agent({ keepAlive: true, ca: options.ca });
|
|
11
|
+
const validPath = (path) => !!path?.startsWith("/") && !path.startsWith("//");
|
|
12
|
+
const headers = (input) => ({
|
|
13
|
+
...input,
|
|
14
|
+
host: target.host,
|
|
15
|
+
"x-forwarded-host": origin.host,
|
|
16
|
+
"x-forwarded-proto": "https",
|
|
17
|
+
"x-d3k-proxy-token": options.token
|
|
18
|
+
});
|
|
19
|
+
const server = createServer((incoming, response) => {
|
|
20
|
+
if (incoming.headers.host !== origin.host) {
|
|
21
|
+
response.writeHead(421).end();
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
if (!validPath(incoming.url)) {
|
|
25
|
+
response.writeHead(400).end();
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
const upstream = httpsRequest(target, { method: incoming.method, path: incoming.url, headers: headers(incoming.headers), agent }, (result) => {
|
|
29
|
+
const output = { ...result.headers };
|
|
30
|
+
if (output.location) {
|
|
31
|
+
try {
|
|
32
|
+
const location = new URL(output.location, new URL(incoming.url || "/", target));
|
|
33
|
+
if (location.origin === target.origin)
|
|
34
|
+
output.location = `${origin.origin}${location.pathname}${location.search}${location.hash}`;
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
// Invalid application redirects must not crash the companion.
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
if (output["set-cookie"])
|
|
41
|
+
output["set-cookie"] = output["set-cookie"].map((cookie) => cookie.replace(/;\s*Domain=([^;]+)/gi, (field, domain) => domain.replace(/^\./, "").toLowerCase() === target.hostname ? "" : field));
|
|
42
|
+
response.writeHead(result.statusCode || 502, output);
|
|
43
|
+
result.pipe(response);
|
|
44
|
+
result.on("error", () => response.destroy());
|
|
45
|
+
});
|
|
46
|
+
upstream.on("error", () => response.headersSent ? response.destroy() : response.writeHead(502).end("Sandbox unavailable"));
|
|
47
|
+
incoming.on("aborted", () => upstream.destroy());
|
|
48
|
+
response.on("close", () => upstream.destroy());
|
|
49
|
+
incoming.pipe(upstream);
|
|
50
|
+
});
|
|
51
|
+
server.on("connection", (socket) => {
|
|
52
|
+
sockets.add(socket);
|
|
53
|
+
socket.on("close", () => sockets.delete(socket));
|
|
54
|
+
});
|
|
55
|
+
server.on("upgrade", (incoming, client, head) => {
|
|
56
|
+
if (incoming.headers.host !== origin.host ||
|
|
57
|
+
!validPath(incoming.url) ||
|
|
58
|
+
(incoming.headers.origin && incoming.headers.origin !== origin.origin)) {
|
|
59
|
+
client.end("HTTP/1.1 403 Forbidden\r\nConnection: close\r\n\r\n");
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
const upstream = httpsRequest(target, {
|
|
63
|
+
method: incoming.method,
|
|
64
|
+
path: incoming.url,
|
|
65
|
+
headers: headers(incoming.headers),
|
|
66
|
+
agent
|
|
67
|
+
});
|
|
68
|
+
upstream.on("upgrade", (response, remote, remoteHead) => {
|
|
69
|
+
sockets.add(remote);
|
|
70
|
+
remote.on("close", () => {
|
|
71
|
+
sockets.delete(remote);
|
|
72
|
+
client.destroy();
|
|
73
|
+
});
|
|
74
|
+
remote.on("error", () => client.destroy());
|
|
75
|
+
client.on("error", () => remote.destroy());
|
|
76
|
+
client.on("close", () => remote.destroy());
|
|
77
|
+
const lines = response.rawHeaders.reduce((output, field, index, raw) => {
|
|
78
|
+
if (!(index % 2))
|
|
79
|
+
output.push(`${field}: ${raw[index + 1]}`);
|
|
80
|
+
return output;
|
|
81
|
+
}, []);
|
|
82
|
+
client.write(`HTTP/1.1 ${response.statusCode} ${response.statusMessage}\r\n${lines.join("\r\n")}\r\n\r\n`);
|
|
83
|
+
if (remoteHead.length)
|
|
84
|
+
client.write(remoteHead);
|
|
85
|
+
if (head.length)
|
|
86
|
+
remote.write(head);
|
|
87
|
+
client.pipe(remote).pipe(client);
|
|
88
|
+
});
|
|
89
|
+
upstream.on("response", (response) => {
|
|
90
|
+
response.resume();
|
|
91
|
+
client.end(`HTTP/1.1 ${response.statusCode || 502} Upstream response\r\nConnection: close\r\n\r\n`);
|
|
92
|
+
});
|
|
93
|
+
upstream.on("error", () => client.destroy());
|
|
94
|
+
client.on("close", () => upstream.destroy());
|
|
95
|
+
upstream.end();
|
|
96
|
+
});
|
|
97
|
+
await new Promise((resolve, reject) => {
|
|
98
|
+
server.once("error", reject);
|
|
99
|
+
server.listen(0, "127.0.0.1", resolve);
|
|
100
|
+
});
|
|
101
|
+
const address = server.address();
|
|
102
|
+
if (!address || typeof address === "string")
|
|
103
|
+
throw new Error("Local proxy did not bind");
|
|
104
|
+
return {
|
|
105
|
+
port: address.port,
|
|
106
|
+
close: async () => {
|
|
107
|
+
agent.destroy();
|
|
108
|
+
for (const socket of sockets)
|
|
109
|
+
socket.destroy();
|
|
110
|
+
await new Promise((resolve) => server.close(() => resolve()));
|
|
111
|
+
}
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=local-proxy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-proxy.js","sourceRoot":"","sources":["../../src/runtime/local-proxy.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,23 @@
|
|
|
1
|
+
import { type Harness } from "./harness.js";
|
|
1
2
|
export interface RuntimeOptions {
|
|
2
3
|
command?: string;
|
|
4
|
+
harness?: Harness;
|
|
3
5
|
cwd?: string;
|
|
4
6
|
headless?: boolean;
|
|
5
7
|
serversOnly?: boolean;
|
|
6
8
|
startupTimeout?: number;
|
|
9
|
+
browserNavigationTimeout?: number;
|
|
10
|
+
browser?: string;
|
|
11
|
+
profileDir?: string;
|
|
12
|
+
debug?: boolean;
|
|
13
|
+
/** Sandbox mode uses the companion’s stable local HTTPS origin; only the companion needs Portless. */
|
|
14
|
+
sandbox?: {
|
|
15
|
+
appUrl: string;
|
|
16
|
+
serverPort: number;
|
|
17
|
+
bridgePort: number;
|
|
18
|
+
token: string;
|
|
19
|
+
proxyToken?: string;
|
|
20
|
+
};
|
|
7
21
|
}
|
|
8
22
|
/** Own the server, browser, and evidence until the retained process is stopped. */
|
|
9
23
|
export declare function startRuntime(options?: RuntimeOptions): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/runtime/runtime.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/runtime/runtime.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAE,KAAK,OAAO,EAAoC,MAAM,cAAc,CAAA;AAmB7E,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,wBAAwB,CAAC,EAAE,MAAM,CAAA;IACjC,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,sGAAsG;IACtG,OAAO,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CACzG;AAmCD,mFAAmF;AACnF,wBAAsB,YAAY,CAAC,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CA8U9E"}
|