pi-forge 0.0.0 → 1.1.4
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/LICENSE +21 -0
- package/README.md +48 -4
- package/bin/pi-forge.mjs +37 -0
- package/dist/client/assets/CodeMirrorEditor-BqaaP1EE.js +34 -0
- package/dist/client/assets/CodeMirrorEditor-BqaaP1EE.js.map +1 -0
- package/dist/client/assets/index-B-529kgJ.css +32 -0
- package/dist/client/assets/index-BzKzxXFs.js +392 -0
- package/dist/client/assets/index-BzKzxXFs.js.map +1 -0
- package/dist/client/assets/workbox-window.prod.es5-BBnX5xw4.js +3 -0
- package/dist/client/assets/workbox-window.prod.es5-BBnX5xw4.js.map +1 -0
- package/dist/client/icons/icon-192.png +0 -0
- package/dist/client/icons/icon-512.png +0 -0
- package/dist/client/icons/icon-maskable-512.png +0 -0
- package/dist/client/icons/icon.svg +9 -0
- package/dist/client/index.html +24 -0
- package/dist/client/manifest.webmanifest +1 -0
- package/dist/client/offline.html +142 -0
- package/dist/client/sw.js +3 -0
- package/dist/client/sw.js.map +1 -0
- package/dist/client/workbox-6d7155ed.js +3 -0
- package/dist/client/workbox-6d7155ed.js.map +1 -0
- package/dist/server/agent-resource-loader.js +126 -0
- package/dist/server/agent-resource-loader.js.map +1 -0
- package/dist/server/attachment-converters.js +96 -0
- package/dist/server/attachment-converters.js.map +1 -0
- package/dist/server/auth.js +209 -0
- package/dist/server/auth.js.map +1 -0
- package/dist/server/compaction-history.js +106 -0
- package/dist/server/compaction-history.js.map +1 -0
- package/dist/server/concurrency.js +49 -0
- package/dist/server/concurrency.js.map +1 -0
- package/dist/server/config-export.js +220 -0
- package/dist/server/config-export.js.map +1 -0
- package/dist/server/config-manager.js +528 -0
- package/dist/server/config-manager.js.map +1 -0
- package/dist/server/config.js +326 -0
- package/dist/server/config.js.map +1 -0
- package/dist/server/conversion-worker.mjs +90 -0
- package/dist/server/diagnostics.js +137 -0
- package/dist/server/diagnostics.js.map +1 -0
- package/dist/server/extensions-discovery.js +147 -0
- package/dist/server/extensions-discovery.js.map +1 -0
- package/dist/server/file-manager.js +734 -0
- package/dist/server/file-manager.js.map +1 -0
- package/dist/server/file-references.js +215 -0
- package/dist/server/file-references.js.map +1 -0
- package/dist/server/file-searcher.js +385 -0
- package/dist/server/file-searcher.js.map +1 -0
- package/dist/server/git-runner.js +684 -0
- package/dist/server/git-runner.js.map +1 -0
- package/dist/server/index.js +468 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/mcp/config.js +133 -0
- package/dist/server/mcp/config.js.map +1 -0
- package/dist/server/mcp/manager.js +351 -0
- package/dist/server/mcp/manager.js.map +1 -0
- package/dist/server/mcp/tool-bridge.js +173 -0
- package/dist/server/mcp/tool-bridge.js.map +1 -0
- package/dist/server/project-manager.js +301 -0
- package/dist/server/project-manager.js.map +1 -0
- package/dist/server/pty-manager.js +354 -0
- package/dist/server/pty-manager.js.map +1 -0
- package/dist/server/routes/_schemas.js +73 -0
- package/dist/server/routes/_schemas.js.map +1 -0
- package/dist/server/routes/auth.js +164 -0
- package/dist/server/routes/auth.js.map +1 -0
- package/dist/server/routes/config.js +1163 -0
- package/dist/server/routes/config.js.map +1 -0
- package/dist/server/routes/control.js +464 -0
- package/dist/server/routes/control.js.map +1 -0
- package/dist/server/routes/exec.js +217 -0
- package/dist/server/routes/exec.js.map +1 -0
- package/dist/server/routes/files.js +847 -0
- package/dist/server/routes/files.js.map +1 -0
- package/dist/server/routes/git.js +837 -0
- package/dist/server/routes/git.js.map +1 -0
- package/dist/server/routes/health.js +97 -0
- package/dist/server/routes/health.js.map +1 -0
- package/dist/server/routes/mcp.js +300 -0
- package/dist/server/routes/mcp.js.map +1 -0
- package/dist/server/routes/projects.js +259 -0
- package/dist/server/routes/projects.js.map +1 -0
- package/dist/server/routes/prompt.js +496 -0
- package/dist/server/routes/prompt.js.map +1 -0
- package/dist/server/routes/sessions.js +783 -0
- package/dist/server/routes/sessions.js.map +1 -0
- package/dist/server/routes/stream.js +69 -0
- package/dist/server/routes/stream.js.map +1 -0
- package/dist/server/routes/terminal.js +335 -0
- package/dist/server/routes/terminal.js.map +1 -0
- package/dist/server/session-registry.js +1197 -0
- package/dist/server/session-registry.js.map +1 -0
- package/dist/server/skill-overrides.js +151 -0
- package/dist/server/skill-overrides.js.map +1 -0
- package/dist/server/skills-export.js +257 -0
- package/dist/server/skills-export.js.map +1 -0
- package/dist/server/sse-bridge.js +220 -0
- package/dist/server/sse-bridge.js.map +1 -0
- package/dist/server/tool-overrides.js +277 -0
- package/dist/server/tool-overrides.js.map +1 -0
- package/dist/server/turn-diff-builder.js +280 -0
- package/dist/server/turn-diff-builder.js.map +1 -0
- package/package.json +53 -12
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessions.js","sourceRoot":"","sources":["../../src/routes/sessions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { resumeSessionById, SessionNotFoundError, SessionTombstonedError, } from "../session-registry.js";
|
|
2
|
+
import { createSSEClient } from "../sse-bridge.js";
|
|
3
|
+
import { errorSchema } from "./_schemas.js";
|
|
4
|
+
/**
|
|
5
|
+
* SSE stream for a session. If the session is in the live registry, attach
|
|
6
|
+
* directly; otherwise auto-resume from disk via resumeSessionById (which
|
|
7
|
+
* walks projects to find the .jsonl and rehydrates an AgentSession). 404
|
|
8
|
+
* only when no project on disk owns the id; 500 with a stable code when
|
|
9
|
+
* the resume itself fails (corrupt JSONL, SDK error).
|
|
10
|
+
*/
|
|
11
|
+
export const streamRoutes = async (fastify) => {
|
|
12
|
+
fastify.get("/sessions/:id/stream", {
|
|
13
|
+
schema: {
|
|
14
|
+
description: "Open an SSE stream for a session. Sends a `snapshot` event on " +
|
|
15
|
+
"connect, then forwards filtered AgentSessionEvents until the " +
|
|
16
|
+
"client disconnects. Auto-resumes the session from disk if it's " +
|
|
17
|
+
"not already live.",
|
|
18
|
+
tags: ["sessions"],
|
|
19
|
+
params: {
|
|
20
|
+
type: "object",
|
|
21
|
+
required: ["id"],
|
|
22
|
+
properties: { id: { type: "string" } },
|
|
23
|
+
},
|
|
24
|
+
// SSE responses don't fit Fastify's response-schema model — see the
|
|
25
|
+
// Phase-5 review notes in REVIEW_FIXES.md. Only the error shapes are
|
|
26
|
+
// declared; the catalog of SSE event types lives in
|
|
27
|
+
// docs/sse-events.md (Phase 17).
|
|
28
|
+
response: {
|
|
29
|
+
404: errorSchema,
|
|
30
|
+
500: errorSchema,
|
|
31
|
+
},
|
|
32
|
+
},
|
|
33
|
+
}, async (req, reply) => {
|
|
34
|
+
// Diagnostic: stream-route entry. Pairs with subagent-discovery /
|
|
35
|
+
// resume-session-found logs in session-registry — seeing all
|
|
36
|
+
// three lines together for a click confirms the click reached
|
|
37
|
+
// the server, found the session, and attached the SSE.
|
|
38
|
+
process.stderr.write(JSON.stringify({
|
|
39
|
+
level: "info",
|
|
40
|
+
time: new Date().toISOString(),
|
|
41
|
+
msg: "stream-route-hit",
|
|
42
|
+
sessionId: req.params.id,
|
|
43
|
+
}) + "\n");
|
|
44
|
+
let live;
|
|
45
|
+
try {
|
|
46
|
+
live = await resumeSessionById(req.params.id);
|
|
47
|
+
}
|
|
48
|
+
catch (err) {
|
|
49
|
+
if (err instanceof SessionNotFoundError) {
|
|
50
|
+
return reply.code(404).send({ error: "session_not_found" });
|
|
51
|
+
}
|
|
52
|
+
if (err instanceof SessionTombstonedError) {
|
|
53
|
+
// The session was disposed within the tombstone window
|
|
54
|
+
// (typically: the operator just deleted it from another
|
|
55
|
+
// tab). 410 Gone tells the SSE client to stop reconnecting
|
|
56
|
+
// — sse-client.ts treats 410 as terminal.
|
|
57
|
+
return reply.code(410).send({ error: "session_tombstoned" });
|
|
58
|
+
}
|
|
59
|
+
// Corrupt JSONL, SDK error during createAgentSession, etc. Log the
|
|
60
|
+
// detail server-side; client gets a stable code without the SDK
|
|
61
|
+
// string in the body.
|
|
62
|
+
req.log.error({ err, sessionId: req.params.id }, "stream resume failed");
|
|
63
|
+
return reply.code(500).send({ error: "resume_failed" });
|
|
64
|
+
}
|
|
65
|
+
createSSEClient(reply, live);
|
|
66
|
+
return reply;
|
|
67
|
+
});
|
|
68
|
+
};
|
|
69
|
+
//# sourceMappingURL=stream.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stream.js","sourceRoot":"","sources":["../../src/routes/stream.ts"],"names":[],"mappings":"AACA,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,sBAAsB,GACvB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,YAAY,GAAuB,KAAK,EAAE,OAAO,EAAE,EAAE;IAChE,OAAO,CAAC,GAAG,CACT,sBAAsB,EACtB;QACE,MAAM,EAAE;YACN,WAAW,EACT,gEAAgE;gBAChE,+DAA+D;gBAC/D,iEAAiE;gBACjE,mBAAmB;YACrB,IAAI,EAAE,CAAC,UAAU,CAAC;YAClB,MAAM,EAAE;gBACN,IAAI,EAAE,QAAQ;gBACd,QAAQ,EAAE,CAAC,IAAI,CAAC;gBAChB,UAAU,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;aACvC;YACD,oEAAoE;YACpE,qEAAqE;YACrE,oDAAoD;YACpD,iCAAiC;YACjC,QAAQ,EAAE;gBACR,GAAG,EAAE,WAAW;gBAChB,GAAG,EAAE,WAAW;aACjB;SACF;KACF,EACD,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE;QACnB,kEAAkE;QAClE,6DAA6D;QAC7D,8DAA8D;QAC9D,uDAAuD;QACvD,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,IAAI,CAAC,SAAS,CAAC;YACb,KAAK,EAAE,MAAM;YACb,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YAC9B,GAAG,EAAE,kBAAkB;YACvB,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE;SACzB,CAAC,GAAG,IAAI,CACV,CAAC;QACF,IAAI,IAAI,CAAC;QACT,IAAI,CAAC;YACH,IAAI,GAAG,MAAM,iBAAiB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAChD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,oBAAoB,EAAE,CAAC;gBACxC,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC,CAAC;YAC9D,CAAC;YACD,IAAI,GAAG,YAAY,sBAAsB,EAAE,CAAC;gBAC1C,uDAAuD;gBACvD,wDAAwD;gBACxD,2DAA2D;gBAC3D,0CAA0C;gBAC1C,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,oBAAoB,EAAE,CAAC,CAAC;YAC/D,CAAC;YACD,mEAAmE;YACnE,gEAAgE;YAChE,sBAAsB;YACtB,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,sBAAsB,CAAC,CAAC;YACzE,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC,CAAC;QAC1D,CAAC;QACD,eAAe,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAC7B,OAAO,KAAK,CAAC;IACf,CAAC,CACF,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -0,0 +1,335 @@
|
|
|
1
|
+
import { stat } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { extractBearer, verifyApiKey, verifyToken } from "../auth.js";
|
|
4
|
+
import { authEnabled } from "../config.js";
|
|
5
|
+
import { getProject } from "../project-manager.js";
|
|
6
|
+
import { attachSink, findPtyByTabId, spawnPty } from "../pty-manager.js";
|
|
7
|
+
/**
|
|
8
|
+
* WebSocket close codes used here. Per RFC 6455 §7.4, codes in
|
|
9
|
+
* [4000, 4999] are for application use; we pick 4401/4403/4404/4500
|
|
10
|
+
* to mirror the HTTP status codes the same scenarios produce on
|
|
11
|
+
* REST routes.
|
|
12
|
+
*/
|
|
13
|
+
const CLOSE_AUTH_REQUIRED = 4401;
|
|
14
|
+
const CLOSE_PROJECT_NOT_FOUND = 4404;
|
|
15
|
+
const CLOSE_INTERNAL_ERROR = 4500;
|
|
16
|
+
function parseClientMessage(raw) {
|
|
17
|
+
if (typeof raw !== "string" && !(raw instanceof Buffer))
|
|
18
|
+
return undefined;
|
|
19
|
+
// Sanity cap: a single keystroke (or paste) over 1 MB is almost
|
|
20
|
+
// certainly a misuse of the channel; refuse rather than block the
|
|
21
|
+
// event loop on a node-pty `write()` of a huge buffer. The server-
|
|
22
|
+
// side ws frame limit is much higher (`@fastify/websocket` defaults
|
|
23
|
+
// to 100 MB), so this is the meaningful guard.
|
|
24
|
+
const MAX_INPUT_BYTES = 1 * 1024 * 1024;
|
|
25
|
+
if (typeof raw === "string" ? raw.length > MAX_INPUT_BYTES : raw.byteLength > MAX_INPUT_BYTES) {
|
|
26
|
+
return undefined;
|
|
27
|
+
}
|
|
28
|
+
let parsed;
|
|
29
|
+
try {
|
|
30
|
+
parsed = JSON.parse(typeof raw === "string" ? raw : raw.toString("utf8"));
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
// Non-JSON WS message — silently drop. The terminal protocol
|
|
34
|
+
// is JSON-only, so this only fires on malformed clients.
|
|
35
|
+
return undefined;
|
|
36
|
+
}
|
|
37
|
+
if (typeof parsed !== "object" || parsed === null)
|
|
38
|
+
return undefined;
|
|
39
|
+
const obj = parsed;
|
|
40
|
+
if (obj.type === "input" && typeof obj.data === "string") {
|
|
41
|
+
return { type: "input", data: obj.data };
|
|
42
|
+
}
|
|
43
|
+
if (obj.type === "resize" &&
|
|
44
|
+
typeof obj.cols === "number" &&
|
|
45
|
+
typeof obj.rows === "number" &&
|
|
46
|
+
Number.isInteger(obj.cols) &&
|
|
47
|
+
Number.isInteger(obj.rows) &&
|
|
48
|
+
obj.cols > 0 &&
|
|
49
|
+
obj.rows > 0 &&
|
|
50
|
+
obj.cols <= 1000 &&
|
|
51
|
+
obj.rows <= 1000) {
|
|
52
|
+
return { type: "resize", cols: obj.cols, rows: obj.rows };
|
|
53
|
+
}
|
|
54
|
+
return undefined;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Auth check inside the WS handler. `@fastify/websocket` v11 DOES run
|
|
58
|
+
* the parent route's preHandlers / onRequest hooks — but the project's
|
|
59
|
+
* global auth hook is registered on `onRequest`, and during a WS
|
|
60
|
+
* upgrade the request `Authorization` header may be absent (browsers
|
|
61
|
+
* cannot set custom headers on `new WebSocket(url)`). We therefore
|
|
62
|
+
* accept either:
|
|
63
|
+
* 1. a Bearer token in `Authorization` (programmatic clients),
|
|
64
|
+
* 2. a `?token=...` query string (browser fallback).
|
|
65
|
+
*
|
|
66
|
+
* The browser-side helper computes #2 from `localStorage` / API key.
|
|
67
|
+
* Either path goes through the same `verifyToken` / `verifyApiKey`
|
|
68
|
+
* checks as REST routes.
|
|
69
|
+
*/
|
|
70
|
+
/**
|
|
71
|
+
* Common Python virtualenv layouts to look for in the project root.
|
|
72
|
+
* Order matters: `.venv` first because it is the modern convention
|
|
73
|
+
* (`uv`, `poetry`, recent `python -m venv` docs all default to it),
|
|
74
|
+
* then the older `venv`, then the legacy `env`. We deliberately do
|
|
75
|
+
* NOT probe `.env` — that name almost always means a dotenv config
|
|
76
|
+
* file, not a virtualenv directory.
|
|
77
|
+
*
|
|
78
|
+
* Each entry's relative path is what we feed to `source` so the
|
|
79
|
+
* activation message stays readable to the user (`source .venv/bin/activate`
|
|
80
|
+
* vs an absolute path that may include their home dir).
|
|
81
|
+
*/
|
|
82
|
+
const VENV_CANDIDATES = [".venv", "venv", "env"];
|
|
83
|
+
/**
|
|
84
|
+
* Look for a Python virtualenv at well-known paths inside `cwd`.
|
|
85
|
+
* Returns the relative path to the activate script (e.g.
|
|
86
|
+
* `.venv/bin/activate`) or undefined if none found.
|
|
87
|
+
*
|
|
88
|
+
* The check is best-effort: any stat error (permission denied,
|
|
89
|
+
* dangling symlink, etc.) is treated as "not a venv" so a transient
|
|
90
|
+
* filesystem issue can never block opening the terminal.
|
|
91
|
+
*/
|
|
92
|
+
async function findVenvActivate(cwd) {
|
|
93
|
+
for (const dir of VENV_CANDIDATES) {
|
|
94
|
+
const rel = `${dir}/bin/activate`;
|
|
95
|
+
try {
|
|
96
|
+
const st = await stat(join(cwd, rel));
|
|
97
|
+
if (st.isFile())
|
|
98
|
+
return rel;
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
// Missing / unreadable — try the next candidate.
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return undefined;
|
|
105
|
+
}
|
|
106
|
+
function authorize(req) {
|
|
107
|
+
if (!authEnabled())
|
|
108
|
+
return true;
|
|
109
|
+
const headerToken = extractBearer(req.headers.authorization);
|
|
110
|
+
const queryToken = typeof req.query?.token === "string"
|
|
111
|
+
? req.query.token
|
|
112
|
+
: undefined;
|
|
113
|
+
const presented = headerToken ?? queryToken;
|
|
114
|
+
if (presented === undefined)
|
|
115
|
+
return false;
|
|
116
|
+
const payload = verifyToken(presented);
|
|
117
|
+
// Initial-login tokens (mustChangePassword:true) are scoped to the
|
|
118
|
+
// change-password endpoint only — refuse to open a PTY for them.
|
|
119
|
+
if (payload !== undefined && !payload.mustChangePassword)
|
|
120
|
+
return true;
|
|
121
|
+
return verifyApiKey(presented);
|
|
122
|
+
}
|
|
123
|
+
export const terminalRoutes = async (fastify) => {
|
|
124
|
+
fastify.get("/terminal", {
|
|
125
|
+
// `public: true` skips the global onRequest auth hook (browsers
|
|
126
|
+
// can't attach an Authorization header to `new WebSocket(url)`,
|
|
127
|
+
// so we accept `?token=` instead — checked inside the handler).
|
|
128
|
+
// `rateLimit` per-IP caps PTY spawning so a buggy or malicious
|
|
129
|
+
// client can't fork-bomb us through reconnects. 10/min is
|
|
130
|
+
// generous (a normal user opens 1-3 terminals per session).
|
|
131
|
+
config: { public: true, rateLimit: { max: 10, timeWindow: "1 minute" } },
|
|
132
|
+
websocket: true,
|
|
133
|
+
schema: {
|
|
134
|
+
// OpenAPI spec entry — Swagger UI doesn't try-it-out WS routes
|
|
135
|
+
// but the description still shows up for discoverability.
|
|
136
|
+
description: "WebSocket endpoint that spawns a PTY in the project's cwd. " +
|
|
137
|
+
"Required: ?projectId=. Optional: ?token= when the browser " +
|
|
138
|
+
"client can't attach an Authorization header. Send " +
|
|
139
|
+
'`{"type":"input","data":"..."}` or ' +
|
|
140
|
+
'`{"type":"resize","cols":N,"rows":N}`. The server sends raw ' +
|
|
141
|
+
"PTY bytes back as text frames; xterm consumes them directly.",
|
|
142
|
+
tags: ["terminal"],
|
|
143
|
+
querystring: {
|
|
144
|
+
type: "object",
|
|
145
|
+
required: ["projectId"],
|
|
146
|
+
properties: {
|
|
147
|
+
projectId: { type: "string", minLength: 1 },
|
|
148
|
+
// Stable client tab id. When the client reconnects with
|
|
149
|
+
// a previously-seen tabId (within the project) the
|
|
150
|
+
// server reattaches to the existing PTY and replays the
|
|
151
|
+
// rolling output buffer instead of spawning a new shell.
|
|
152
|
+
tabId: { type: "string", minLength: 1, maxLength: 128 },
|
|
153
|
+
token: { type: "string" },
|
|
154
|
+
},
|
|
155
|
+
},
|
|
156
|
+
},
|
|
157
|
+
}, async (socket, req) => {
|
|
158
|
+
const log = req.log;
|
|
159
|
+
// Token is in `?token=` (browsers can't attach Authorization on
|
|
160
|
+
// WebSocket upgrades — see authorize() comment). Fastify's
|
|
161
|
+
// default request logger will have already emitted `req.url`
|
|
162
|
+
// including the token; we can't unsend that, but the
|
|
163
|
+
// `disableRequestLogging` for tests + this scrubbing nudge
|
|
164
|
+
// operators toward log redaction. Belt-and-suspenders: the
|
|
165
|
+
// route-level pino is rebound here with a redact rule so any
|
|
166
|
+
// future log line we emit doesn't echo the token, even if
|
|
167
|
+
// someone passes the URL through verbatim.
|
|
168
|
+
try {
|
|
169
|
+
// Mutate the request URL on a best-effort basis so any
|
|
170
|
+
// downstream pino dump that re-reads `req.url` (including
|
|
171
|
+
// the auto-emitted "request completed" line) can't include
|
|
172
|
+
// the token. We do NOT touch req.query — handlers below
|
|
173
|
+
// still need it.
|
|
174
|
+
const u = req.raw.url;
|
|
175
|
+
if (typeof u === "string" && u.includes("token=")) {
|
|
176
|
+
req.raw.url = u.replace(/([?&])token=[^&]*/g, "$1token=REDACTED");
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
catch {
|
|
180
|
+
// ignore — best-effort log scrub
|
|
181
|
+
}
|
|
182
|
+
if (!authorize(req)) {
|
|
183
|
+
socket.close(CLOSE_AUTH_REQUIRED, "auth_required");
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
const project = await getProject(req.query.projectId);
|
|
187
|
+
if (project === undefined) {
|
|
188
|
+
socket.close(CLOSE_PROJECT_NOT_FOUND, "project_not_found");
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
191
|
+
// Reattach path: client supplied a stable `tabId` AND a PTY
|
|
192
|
+
// for that tab in this project is still alive on the server
|
|
193
|
+
// (i.e. previous WS dropped within IDLE_REAP_MS). Skip the
|
|
194
|
+
// spawn — the PTY's rolling buffer will be replayed by
|
|
195
|
+
// attachSink so xterm shows recent output, not just a fresh
|
|
196
|
+
// prompt.
|
|
197
|
+
const requestedTabId = req.query.tabId;
|
|
198
|
+
let managed;
|
|
199
|
+
let reattached = false;
|
|
200
|
+
if (requestedTabId !== undefined) {
|
|
201
|
+
const existing = findPtyByTabId(requestedTabId, project.id);
|
|
202
|
+
if (existing !== undefined) {
|
|
203
|
+
managed = existing;
|
|
204
|
+
reattached = true;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
if (managed === undefined) {
|
|
208
|
+
try {
|
|
209
|
+
managed = spawnPty({
|
|
210
|
+
cwd: project.path,
|
|
211
|
+
tabId: requestedTabId ?? `srv-${Date.now().toString(36)}`,
|
|
212
|
+
projectId: project.id,
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
catch (err) {
|
|
216
|
+
log.error({ err }, "pty spawn failed");
|
|
217
|
+
socket.close(CLOSE_INTERNAL_ERROR, "spawn_failed");
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
log.info({ ptyId: managed.ptyId, tabId: managed.tabId, cwd: project.path, reattached }, reattached ? "terminal reattached" : "terminal opened");
|
|
222
|
+
// Auto-activate a Python virtualenv if the project has one at a
|
|
223
|
+
// conventional path. Only on a fresh spawn — a reattach already
|
|
224
|
+
// has whatever shell state the previous session left behind, and
|
|
225
|
+
// re-sourcing would either no-op (already active) or stomp on a
|
|
226
|
+
// venv the user manually switched to. We write `source <path>`
|
|
227
|
+
// as if the user typed it; using POSIX `.` would also work but
|
|
228
|
+
// `source` reads better in scrollback and bash/zsh (the only
|
|
229
|
+
// shells we ship with) both accept it.
|
|
230
|
+
if (!reattached) {
|
|
231
|
+
const activate = await findVenvActivate(project.path);
|
|
232
|
+
if (activate !== undefined) {
|
|
233
|
+
try {
|
|
234
|
+
managed.process.write(`source ${activate}\n`);
|
|
235
|
+
log.info({ ptyId: managed.ptyId, activate }, "auto-activated venv");
|
|
236
|
+
}
|
|
237
|
+
catch (err) {
|
|
238
|
+
// PTY died between spawn and write — extremely unlikely but
|
|
239
|
+
// not worth tearing down the socket over; the user just
|
|
240
|
+
// gets a non-activated shell.
|
|
241
|
+
log.warn({ err, ptyId: managed.ptyId }, "venv auto-activate write failed");
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
// PTY → client via the manager. attachSink handles the
|
|
246
|
+
// initial buffer replay (recent output before any new
|
|
247
|
+
// streaming) and gives back a detach() we call on socket
|
|
248
|
+
// close — that detach starts the idle reaper but does NOT
|
|
249
|
+
// kill the PTY, so the next reconnect can pick it up.
|
|
250
|
+
//
|
|
251
|
+
// The 4th arg is the "displace previous attachment" callback:
|
|
252
|
+
// if a NEW WebSocket attaches to the same PTY (same tabId from
|
|
253
|
+
// a different browser window), pty-manager calls this to close
|
|
254
|
+
// OUR socket cleanly so we don't end up with two browsers both
|
|
255
|
+
// writing keystrokes into the same shell.
|
|
256
|
+
const closeOnDisplace = () => {
|
|
257
|
+
if (socket.readyState === socket.OPEN || socket.readyState === socket.CONNECTING) {
|
|
258
|
+
socket.close(4409, "replaced_by_new_attach");
|
|
259
|
+
}
|
|
260
|
+
};
|
|
261
|
+
const detach = attachSink(managed.ptyId, (chunk) => {
|
|
262
|
+
if (socket.readyState === socket.OPEN) {
|
|
263
|
+
socket.send(chunk);
|
|
264
|
+
}
|
|
265
|
+
}, undefined, closeOnDisplace);
|
|
266
|
+
if (detach === undefined) {
|
|
267
|
+
log.error({ ptyId: managed.ptyId }, "attachSink failed; pty vanished");
|
|
268
|
+
socket.close(CLOSE_INTERNAL_ERROR, "attach_failed");
|
|
269
|
+
return;
|
|
270
|
+
}
|
|
271
|
+
// The shell really exiting (user typed `exit`, kill -9, etc.)
|
|
272
|
+
// is a terminal-state event distinct from a transient WS
|
|
273
|
+
// drop: there's nothing to reattach to. Close the socket so
|
|
274
|
+
// the client doesn't try to reconnect to a dead PTY.
|
|
275
|
+
const exitDisposable = managed.process.onExit(({ exitCode, signal }) => {
|
|
276
|
+
log.info({ ptyId: managed.ptyId, exitCode, signal }, "terminal exited");
|
|
277
|
+
if (socket.readyState === socket.OPEN || socket.readyState === socket.CONNECTING) {
|
|
278
|
+
socket.close(1000, "pty_exited");
|
|
279
|
+
}
|
|
280
|
+
});
|
|
281
|
+
let disposed = false;
|
|
282
|
+
const cleanup = (reason) => {
|
|
283
|
+
if (disposed)
|
|
284
|
+
return;
|
|
285
|
+
disposed = true;
|
|
286
|
+
detach();
|
|
287
|
+
exitDisposable.dispose();
|
|
288
|
+
// NB: no killPty here. The PTY is intentionally kept alive
|
|
289
|
+
// so a page-refresh / network blip can reattach. The idle
|
|
290
|
+
// reaper inside attachSink will GC it after IDLE_REAP_MS
|
|
291
|
+
// if no reconnect arrives.
|
|
292
|
+
log.info({ ptyId: managed.ptyId, tabId: managed.tabId, reason }, "terminal detached");
|
|
293
|
+
};
|
|
294
|
+
socket.on("message", (raw) => {
|
|
295
|
+
const msg = parseClientMessage(raw);
|
|
296
|
+
if (msg === undefined)
|
|
297
|
+
return;
|
|
298
|
+
// Both write() and resize() can throw synchronously if the
|
|
299
|
+
// underlying PTY died (user `exit`, kill -9, idle reaper)
|
|
300
|
+
// between attach and this message. Without the try/catch the
|
|
301
|
+
// throw bubbles up as an unhandled-rejection-style WS error
|
|
302
|
+
// with no diagnostic for the operator. Close the socket with
|
|
303
|
+
// a distinct code so the client surfaces "terminal died"
|
|
304
|
+
// rather than reconnecting indefinitely.
|
|
305
|
+
if (msg.type === "input") {
|
|
306
|
+
try {
|
|
307
|
+
managed.process.write(msg.data);
|
|
308
|
+
}
|
|
309
|
+
catch (err) {
|
|
310
|
+
log.warn({ err, ptyId: managed.ptyId }, "pty write failed; closing socket");
|
|
311
|
+
if (socket.readyState === socket.OPEN) {
|
|
312
|
+
socket.close(CLOSE_INTERNAL_ERROR, "pty_dead");
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
else {
|
|
317
|
+
try {
|
|
318
|
+
managed.process.resize(msg.cols, msg.rows);
|
|
319
|
+
}
|
|
320
|
+
catch (err) {
|
|
321
|
+
log.warn({ err }, "pty resize failed");
|
|
322
|
+
if (socket.readyState === socket.OPEN) {
|
|
323
|
+
socket.close(CLOSE_INTERNAL_ERROR, "pty_dead");
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
});
|
|
328
|
+
socket.on("close", () => cleanup("ws_close"));
|
|
329
|
+
socket.on("error", (err) => {
|
|
330
|
+
log.warn({ err, ptyId: managed.ptyId }, "terminal websocket error");
|
|
331
|
+
cleanup("ws_error");
|
|
332
|
+
});
|
|
333
|
+
});
|
|
334
|
+
};
|
|
335
|
+
//# sourceMappingURL=terminal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminal.js","sourceRoot":"","sources":["../../src/routes/terminal.ts"],"names":[],"mappings":"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"}
|