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":"git-runner.js","sourceRoot":"","sources":["../src/git-runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,468 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { mkdir } from "node:fs/promises";
|
|
3
|
+
import { pathToFileURL } from "node:url";
|
|
4
|
+
import Fastify from "fastify";
|
|
5
|
+
import cors from "@fastify/cors";
|
|
6
|
+
import rateLimit from "@fastify/rate-limit";
|
|
7
|
+
import fastifyStatic from "@fastify/static";
|
|
8
|
+
import swagger from "@fastify/swagger";
|
|
9
|
+
import swaggerUi from "@fastify/swagger-ui";
|
|
10
|
+
import websocket from "@fastify/websocket";
|
|
11
|
+
import multipart from "@fastify/multipart";
|
|
12
|
+
import { config, authEnabled } from "./config.js";
|
|
13
|
+
import { installDiagnostics } from "./diagnostics.js";
|
|
14
|
+
import { extractBearer, verifyApiKey, verifyToken } from "./auth.js";
|
|
15
|
+
import { healthRoutes } from "./routes/health.js";
|
|
16
|
+
import { authRoutes } from "./routes/auth.js";
|
|
17
|
+
import { projectRoutes } from "./routes/projects.js";
|
|
18
|
+
import { sessionRoutes } from "./routes/sessions.js";
|
|
19
|
+
import { streamRoutes } from "./routes/stream.js";
|
|
20
|
+
import { promptRoutes } from "./routes/prompt.js";
|
|
21
|
+
import { controlRoutes } from "./routes/control.js";
|
|
22
|
+
import { configRoutes } from "./routes/config.js";
|
|
23
|
+
import { fileRoutes } from "./routes/files.js";
|
|
24
|
+
import { gitRoutes } from "./routes/git.js";
|
|
25
|
+
import { execRoutes } from "./routes/exec.js";
|
|
26
|
+
import { mcpRoutes } from "./routes/mcp.js";
|
|
27
|
+
import { terminalRoutes } from "./routes/terminal.js";
|
|
28
|
+
import { disposeAll as disposeAllMcp, loadGlobal as loadGlobalMcp } from "./mcp/manager.js";
|
|
29
|
+
import { disposeAllSessions } from "./session-registry.js";
|
|
30
|
+
import { disposeAllPtys, installPtyExitHandler } from "./pty-manager.js";
|
|
31
|
+
import { logSecretHygieneState } from "./agent-resource-loader.js";
|
|
32
|
+
export async function buildServer() {
|
|
33
|
+
// Install before Fastify so unhandledRejection handlers from this
|
|
34
|
+
// module are first in line — they print full cause chains for
|
|
35
|
+
// errors the SDK swallows (TLS handshake failures, DNS errors,
|
|
36
|
+
// ECONNREFUSED, etc.) which would otherwise surface as a terse
|
|
37
|
+
// "Connection Error" with no underlying detail.
|
|
38
|
+
installDiagnostics();
|
|
39
|
+
const fastify = Fastify({
|
|
40
|
+
logger: {
|
|
41
|
+
level: config.logLevel,
|
|
42
|
+
// Scrub the `?token=...` query param from logged URLs. Browsers can't
|
|
43
|
+
// attach Authorization headers to a WebSocket upgrade, so the terminal
|
|
44
|
+
// route ferries its short-TTL JWT in the query string. Without this
|
|
45
|
+
// serializer Fastify's default "incoming request" line logs the URL
|
|
46
|
+
// verbatim, which puts the token into stdout / journald / log shippers.
|
|
47
|
+
serializers: {
|
|
48
|
+
req(req) {
|
|
49
|
+
const url = req.url ?? "";
|
|
50
|
+
const safeUrl = url.includes("token=")
|
|
51
|
+
? url.replace(/([?&])token=[^&]*/g, "$1token=REDACTED")
|
|
52
|
+
: url;
|
|
53
|
+
return {
|
|
54
|
+
method: req.method,
|
|
55
|
+
url: safeUrl,
|
|
56
|
+
hostname: req.hostname,
|
|
57
|
+
remoteAddress: req.ip,
|
|
58
|
+
};
|
|
59
|
+
},
|
|
60
|
+
},
|
|
61
|
+
// Belt-and-suspenders redaction of secret-shaped log fields. Pino's
|
|
62
|
+
// redact runs across every log line (not just the `req` serializer),
|
|
63
|
+
// so an operator-supplied API key in a request body — or a JWT in
|
|
64
|
+
// an Authorization header that bypasses the serializer — never lands
|
|
65
|
+
// in stdout / journald / log shippers in cleartext.
|
|
66
|
+
//
|
|
67
|
+
// Wildcard syntax (`body.providers["*"].apiKey`) follows pino's
|
|
68
|
+
// documented JSONPath-lite — only key segments separated by `.` and
|
|
69
|
+
// `[*]` patterns work; deeper nesting needs explicit paths.
|
|
70
|
+
redact: {
|
|
71
|
+
paths: [
|
|
72
|
+
"headers.authorization",
|
|
73
|
+
"req.headers.authorization",
|
|
74
|
+
"body.password",
|
|
75
|
+
"body.apiKey",
|
|
76
|
+
'body.providers["*"].apiKey',
|
|
77
|
+
'body.providers["*"].apiKeyCommand',
|
|
78
|
+
],
|
|
79
|
+
censor: "[REDACTED]",
|
|
80
|
+
remove: false,
|
|
81
|
+
},
|
|
82
|
+
},
|
|
83
|
+
disableRequestLogging: config.isTest,
|
|
84
|
+
trustProxy: config.trustProxy,
|
|
85
|
+
// Phase 14 attachment uploads can be up to 8 × 10 MB = 80 MB per
|
|
86
|
+
// request before the per-file `fileSize` cap fires per-part. Lift
|
|
87
|
+
// Fastify's default 1 MB bodyLimit so the request reaches the
|
|
88
|
+
// multipart parser, which then enforces the per-file limit and
|
|
89
|
+
// marks oversize files via `file.truncated`. Pad with a little
|
|
90
|
+
// headroom for boundary + field overhead.
|
|
91
|
+
//
|
|
92
|
+
// Memory worst case: a single request hits ~80 MB of file bytes
|
|
93
|
+
// PLUS ~107 MB of base64-expanded image strings held in memory
|
|
94
|
+
// before they pass to the SDK — call it ~190 MB resident. Single-
|
|
95
|
+
// tenant assumption keeps this acceptable; do NOT raise the
|
|
96
|
+
// bodyLimit further without revisiting `parseMultipart` to stream
|
|
97
|
+
// attachments to disk instead of buffering.
|
|
98
|
+
bodyLimit: 100 * 1024 * 1024,
|
|
99
|
+
});
|
|
100
|
+
// Install the PTY exit handler — was previously fired at module-load
|
|
101
|
+
// of pty-manager.ts, which made test isolation harder (every unit
|
|
102
|
+
// test that imported the module also installed the handler). The
|
|
103
|
+
// production server installs it explicitly here.
|
|
104
|
+
installPtyExitHandler();
|
|
105
|
+
await fastify.register(cors, {
|
|
106
|
+
// Default to `true` (reflect request origin) so the same-origin browser
|
|
107
|
+
// workflow described in the dev plan works without extra config.
|
|
108
|
+
// `false` (the previous default) blocks all CORS preflights, including
|
|
109
|
+
// the dev proxy. Pin to a specific origin via CORS_ORIGIN in production.
|
|
110
|
+
origin: config.corsOrigin ?? true,
|
|
111
|
+
credentials: false,
|
|
112
|
+
});
|
|
113
|
+
// Rate limiting is per-route only — no global cap by design. The login
|
|
114
|
+
// route applies its own limit via route-level `config.rateLimit`.
|
|
115
|
+
await fastify.register(rateLimit, { global: false });
|
|
116
|
+
// Security headers — set on every response, both API and static.
|
|
117
|
+
// Done as an onSend hook rather than via @fastify/helmet to avoid the
|
|
118
|
+
// extra dep; the set we need is small and stable.
|
|
119
|
+
//
|
|
120
|
+
// CSP rationale (see also packages/client/index.html):
|
|
121
|
+
// - script-src 'self' 'wasm-unsafe-eval' — Vite's bundle plus the
|
|
122
|
+
// hash-wasm module the upload path uses for SHA-256 streaming.
|
|
123
|
+
// 'wasm-unsafe-eval' permits WebAssembly.compile/instantiate ONLY;
|
|
124
|
+
// it does NOT re-enable JS eval/new Function (those still require
|
|
125
|
+
// the broader 'unsafe-eval'). Vite dev server doesn't apply our
|
|
126
|
+
// CSP, so this surfaces only on deployed instances.
|
|
127
|
+
// - style-src 'self' — Tailwind v4 emits external CSS to /assets;
|
|
128
|
+
// no inline <style> tags are rendered. We split inline-style
|
|
129
|
+
// attribute (style="...") allowance to style-src-attr so a
|
|
130
|
+
// hypothetical CSP-bypass via inline-script can't also inject
|
|
131
|
+
// a hostile <style> block.
|
|
132
|
+
// - style-src-attr 'unsafe-inline' — React's `style={{...}}` prop
|
|
133
|
+
// in RootErrorBoundary + CodeMirror's inline cursor/selection
|
|
134
|
+
// styles compile to style="..." attributes. Keep also on
|
|
135
|
+
// style-src for Safari < 15.4 which falls back to it.
|
|
136
|
+
// - img-src 'self' data: blob: — chat attachments + diff inline icons.
|
|
137
|
+
// - connect-src 'self' — same-origin only. Browsers normalize
|
|
138
|
+
// ws://same-host to the page origin, so 'self' covers the
|
|
139
|
+
// integrated terminal WS without granting open-to-any-host
|
|
140
|
+
// reach to a hypothetical bypass script.
|
|
141
|
+
// - worker-src 'self' blob: — Vite PWA service worker.
|
|
142
|
+
// - object-src 'none', base-uri 'self', frame-ancestors 'none' —
|
|
143
|
+
// defense in depth against legacy / clickjacking surfaces.
|
|
144
|
+
fastify.addHook("onSend", async (_req, reply) => {
|
|
145
|
+
reply.header("X-Content-Type-Options", "nosniff");
|
|
146
|
+
reply.header("Referrer-Policy", "strict-origin-when-cross-origin");
|
|
147
|
+
reply.header("X-Frame-Options", "DENY");
|
|
148
|
+
// HSTS is harmless on plain HTTP (browsers ignore it without TLS),
|
|
149
|
+
// useful behind a TLS proxy. 180 days is a balance: long enough to
|
|
150
|
+
// matter, short enough that an operator can recover from accidentally
|
|
151
|
+
// setting up HTTPS wrong.
|
|
152
|
+
reply.header("Strict-Transport-Security", "max-age=15552000; includeSubDomains");
|
|
153
|
+
reply.header("Content-Security-Policy", [
|
|
154
|
+
"default-src 'self'",
|
|
155
|
+
"script-src 'self' 'wasm-unsafe-eval'",
|
|
156
|
+
// Keep 'unsafe-inline' on style-src for Safari < 15.4 which
|
|
157
|
+
// falls back to it for inline style attributes. Newer browsers
|
|
158
|
+
// honor the tighter style-src-attr below.
|
|
159
|
+
"style-src 'self' 'unsafe-inline'",
|
|
160
|
+
"style-src-attr 'unsafe-inline'",
|
|
161
|
+
"img-src 'self' data: blob:",
|
|
162
|
+
"font-src 'self' data:",
|
|
163
|
+
"connect-src 'self'",
|
|
164
|
+
"worker-src 'self' blob:",
|
|
165
|
+
"object-src 'none'",
|
|
166
|
+
"base-uri 'self'",
|
|
167
|
+
"frame-ancestors 'none'",
|
|
168
|
+
].join("; "));
|
|
169
|
+
});
|
|
170
|
+
// WebSocket support for the integrated terminal (Phase 11). Must be
|
|
171
|
+
// registered before any route uses `{ websocket: true }`. Inherits
|
|
172
|
+
// the same listening server as Fastify; no extra port needed.
|
|
173
|
+
await fastify.register(websocket);
|
|
174
|
+
// Multipart support for the prompt route's attachment handling
|
|
175
|
+
// (Phase 14). Per-file cap is enforced via `limits.fileSize`; routes
|
|
176
|
+
// that don't expect attachments will reject multipart with a typed
|
|
177
|
+
// 415 from Fastify's content-type matching, so this register is
|
|
178
|
+
// safe to apply globally.
|
|
179
|
+
await fastify.register(multipart, {
|
|
180
|
+
limits: {
|
|
181
|
+
fileSize: 20 * 1024 * 1024, // 20 MB / file — must match MAX_FILE_BYTES in routes/prompt.ts
|
|
182
|
+
// Tightened from 8 → 6 after security review: the prompt route
|
|
183
|
+
// accepts at most 4 images + 4 text files, so 6 is the smallest
|
|
184
|
+
// cap that doesn't constrain real use (one operator may hit
|
|
185
|
+
// 4-images / 2-text or vice versa). Keeps multipart parsing
|
|
186
|
+
// bounded as defense in depth.
|
|
187
|
+
files: 6,
|
|
188
|
+
fields: 8,
|
|
189
|
+
},
|
|
190
|
+
attachFieldsToBody: false,
|
|
191
|
+
// Default `throwFileSizeLimit: true` makes the plugin throw
|
|
192
|
+
// RequestFileTooLargeError → Fastify renders a generic 413 with
|
|
193
|
+
// "Payload Too Large", losing our typed error code. Set false so
|
|
194
|
+
// the plugin instead marks `file.truncated: true` and lets our
|
|
195
|
+
// route handler decide the response shape.
|
|
196
|
+
throwFileSizeLimit: false,
|
|
197
|
+
});
|
|
198
|
+
await fastify.register(swagger, {
|
|
199
|
+
openapi: {
|
|
200
|
+
info: { title: "pi-forge API", version: "1.0.0" },
|
|
201
|
+
components: {
|
|
202
|
+
securitySchemes: {
|
|
203
|
+
bearerAuth: { type: "http", scheme: "bearer" },
|
|
204
|
+
},
|
|
205
|
+
},
|
|
206
|
+
security: [{ bearerAuth: [] }],
|
|
207
|
+
},
|
|
208
|
+
});
|
|
209
|
+
// Bootstrap script injected into the swagger UI page. Resolves an
|
|
210
|
+
// auth token in priority order — URL ?token=, then sessionStorage
|
|
211
|
+
// (set by an earlier visit), then localStorage["pi-forge/auth-
|
|
212
|
+
// token"] (the JWT the main UI persisted on login). Same-origin so
|
|
213
|
+
// the localStorage read is allowed. Then patches fetch() to attach
|
|
214
|
+
// the token as a Bearer header on every call swagger UI makes to
|
|
215
|
+
// /api/v1/*.
|
|
216
|
+
//
|
|
217
|
+
// Cleanup: if the token came from ?token=, strip it from the URL
|
|
218
|
+
// via history.replaceState so it doesn't sit in the URL bar /
|
|
219
|
+
// browser history. The sessionStorage stash is for in-tab nav only;
|
|
220
|
+
// closing the tab clears it.
|
|
221
|
+
//
|
|
222
|
+
// No-op when no token is found anywhere (e.g. unauthenticated
|
|
223
|
+
// visitor with auth disabled — fetch is left unpatched).
|
|
224
|
+
const swaggerThemeJs = `(function () {
|
|
225
|
+
try {
|
|
226
|
+
var url = new URL(window.location.href);
|
|
227
|
+
var qpToken = url.searchParams.get("token");
|
|
228
|
+
if (qpToken && qpToken.length > 0) {
|
|
229
|
+
sessionStorage.setItem("pi-forge/docs-token", qpToken);
|
|
230
|
+
url.searchParams.delete("token");
|
|
231
|
+
window.history.replaceState({}, document.title, url.toString());
|
|
232
|
+
}
|
|
233
|
+
var token =
|
|
234
|
+
sessionStorage.getItem("pi-forge/docs-token") ||
|
|
235
|
+
localStorage.getItem("pi-forge/auth-token");
|
|
236
|
+
if (token && window.fetch) {
|
|
237
|
+
var origFetch = window.fetch.bind(window);
|
|
238
|
+
window.fetch = function (input, init) {
|
|
239
|
+
init = init || {};
|
|
240
|
+
var url2 = typeof input === "string" ? input : input.url;
|
|
241
|
+
if (url2 && url2.indexOf("/api/v1/") !== -1) {
|
|
242
|
+
init.headers = new Headers(init.headers || {});
|
|
243
|
+
if (!init.headers.has("Authorization")) {
|
|
244
|
+
init.headers.set("Authorization", "Bearer " + token);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
return origFetch(input, init);
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
} catch (err) {
|
|
251
|
+
console.warn("pi-forge docs auth bootstrap failed:", err);
|
|
252
|
+
}
|
|
253
|
+
})();`;
|
|
254
|
+
await fastify.register(swaggerUi, {
|
|
255
|
+
routePrefix: "/api/docs",
|
|
256
|
+
uiConfig: { docExpansion: "list", persistAuthorization: true },
|
|
257
|
+
theme: {
|
|
258
|
+
js: [{ filename: "pi-forge-auth.js", content: swaggerThemeJs }],
|
|
259
|
+
},
|
|
260
|
+
});
|
|
261
|
+
/**
|
|
262
|
+
* Auth gate. Applies to:
|
|
263
|
+
* - All `/api/v1/*` routes that are NOT marked `config.public: true`
|
|
264
|
+
* (those are health, auth/login, auth/status — see route definitions).
|
|
265
|
+
* - `/api/docs*` — the OpenAPI UI and JSON spec leak the route catalogue,
|
|
266
|
+
* so they are gated when auth is enabled. (Closes the Phase-8 deferred
|
|
267
|
+
* item.) When auth is disabled (UI_PASSWORD and API_KEY both unset),
|
|
268
|
+
* /api/docs is open — useful for local dev.
|
|
269
|
+
*
|
|
270
|
+
* Token check: accepts a valid JWT or a constant-time-matched API key.
|
|
271
|
+
*/
|
|
272
|
+
fastify.addHook("onRequest", async (req, reply) => {
|
|
273
|
+
const url = req.url;
|
|
274
|
+
const path = url.split("?")[0] ?? url;
|
|
275
|
+
// /api/docs* gating — these are not Fastify-defined routes (they're
|
|
276
|
+
// injected by @fastify/swagger-ui) so we can't rely on route config.
|
|
277
|
+
// Three layered checks:
|
|
278
|
+
// 1. EXPOSE_DOCS=false → 404 unconditionally (production default).
|
|
279
|
+
// 2. Auth disabled + EXPOSE_DOCS=true → open (dev default).
|
|
280
|
+
// 3. Auth enabled → require a valid token even when docs are exposed.
|
|
281
|
+
const isDocs = path === "/api/docs" || path.startsWith("/api/docs/");
|
|
282
|
+
if (isDocs) {
|
|
283
|
+
if (!config.exposeDocs) {
|
|
284
|
+
reply.code(404).send({ error: "not_found" });
|
|
285
|
+
return;
|
|
286
|
+
}
|
|
287
|
+
// The /api/docs static UI (HTML / JS / CSS / OpenAPI spec) is
|
|
288
|
+
// open when EXPOSE_DOCS=true, regardless of auth. Browsers
|
|
289
|
+
// can't attach an Authorization header on top-level
|
|
290
|
+
// navigation, so gating the UI page itself on a Bearer header
|
|
291
|
+
// would 401 every logged-in user who hits /api/docs from a
|
|
292
|
+
// new tab. The route catalog the docs page exposes is the
|
|
293
|
+
// same one this project's CLAUDE.md / repo already publish, so
|
|
294
|
+
// the asset-level exposure is the same as before.
|
|
295
|
+
//
|
|
296
|
+
// Real protection lives at the actual API surface: every
|
|
297
|
+
// /api/v1/* call swagger UI makes still goes through the
|
|
298
|
+
// auth gate below. The injected theme bootstrap (see
|
|
299
|
+
// swaggerThemeJs) reads the JWT/API-key out of localStorage
|
|
300
|
+
// (same-origin) — or the one-shot ?token=<...> query param
|
|
301
|
+
// the Settings → "API Docs ↗" button passes — and injects
|
|
302
|
+
// it as a Bearer header on every fetch swagger UI issues.
|
|
303
|
+
return;
|
|
304
|
+
}
|
|
305
|
+
if (!path.startsWith("/api/v1/"))
|
|
306
|
+
return;
|
|
307
|
+
// Route-level public marker — set on health and auth routes via
|
|
308
|
+
// schema/config (see those route files).
|
|
309
|
+
const routeConfig = req.routeOptions?.config;
|
|
310
|
+
if (routeConfig?.public === true)
|
|
311
|
+
return;
|
|
312
|
+
if (!authEnabled())
|
|
313
|
+
return;
|
|
314
|
+
const presented = extractBearer(req.headers.authorization);
|
|
315
|
+
if (presented === undefined) {
|
|
316
|
+
reply.code(401).send({ error: "missing_token" });
|
|
317
|
+
return;
|
|
318
|
+
}
|
|
319
|
+
const tokenPayload = verifyToken(presented);
|
|
320
|
+
if (tokenPayload !== undefined) {
|
|
321
|
+
// Initial-login tokens (issued because the user authenticated
|
|
322
|
+
// with the env-supplied UI_PASSWORD and REQUIRE_PASSWORD_CHANGE
|
|
323
|
+
// is on) are scoped to the change-password endpoint only. Every
|
|
324
|
+
// other API call returns 403 with a stable code the client uses
|
|
325
|
+
// to render the change-password screen.
|
|
326
|
+
if (tokenPayload.mustChangePassword) {
|
|
327
|
+
reply.code(403).send({
|
|
328
|
+
error: "must_change_password",
|
|
329
|
+
message: "this token is scoped to POST /auth/change-password — change " +
|
|
330
|
+
"the initial password before calling other endpoints",
|
|
331
|
+
});
|
|
332
|
+
return;
|
|
333
|
+
}
|
|
334
|
+
return;
|
|
335
|
+
}
|
|
336
|
+
if (verifyApiKey(presented))
|
|
337
|
+
return;
|
|
338
|
+
reply.code(401).send({ error: "invalid_token" });
|
|
339
|
+
});
|
|
340
|
+
await fastify.register(async (api) => {
|
|
341
|
+
await api.register(healthRoutes);
|
|
342
|
+
await api.register(authRoutes);
|
|
343
|
+
await api.register(projectRoutes);
|
|
344
|
+
await api.register(sessionRoutes);
|
|
345
|
+
await api.register(streamRoutes);
|
|
346
|
+
await api.register(promptRoutes);
|
|
347
|
+
await api.register(controlRoutes);
|
|
348
|
+
await api.register(configRoutes);
|
|
349
|
+
await api.register(fileRoutes);
|
|
350
|
+
await api.register(gitRoutes);
|
|
351
|
+
await api.register(execRoutes);
|
|
352
|
+
await api.register(mcpRoutes);
|
|
353
|
+
await api.register(terminalRoutes);
|
|
354
|
+
}, { prefix: "/api/v1" });
|
|
355
|
+
// ---- static client (production) ----
|
|
356
|
+
// In Docker / `npm run build && node dist/index.js`, Fastify serves the
|
|
357
|
+
// Vite build directly so the whole app runs on a single port. In dev,
|
|
358
|
+
// Vite owns :5173 and proxies to us, so we skip this when the dist
|
|
359
|
+
// directory doesn't exist (or `SERVE_CLIENT=false`).
|
|
360
|
+
//
|
|
361
|
+
// SPA fallback: any non-/api/* GET that didn't match a static asset
|
|
362
|
+
// returns `index.html` so the React Router-less hash-free URLs (e.g.
|
|
363
|
+
// bookmarked deep links) hydrate the SPA instead of 404ing.
|
|
364
|
+
if (config.serveClient && existsSync(config.clientDistPath)) {
|
|
365
|
+
// onSend hook tags the right Cache-Control by request path. Doing it
|
|
366
|
+
// here (rather than @fastify/static's `setHeaders`) is reliable because
|
|
367
|
+
// it runs after the static plugin sets its default `max-age=0`, so we
|
|
368
|
+
// overwrite cleanly. /assets/ paths are content-addressed by Vite, so
|
|
369
|
+
// they're year-long immutable; index.html (which is what / and any
|
|
370
|
+
// SPA-fallback path returns) must always revalidate so a fresh deploy
|
|
371
|
+
// lands on the next reload.
|
|
372
|
+
fastify.addHook("onSend", async (req, reply) => {
|
|
373
|
+
const path = req.url.split("?")[0] ?? req.url;
|
|
374
|
+
// API responses already control their own caching headers (or
|
|
375
|
+
// intentionally don't); skip the static-asset branching for them.
|
|
376
|
+
if (path.startsWith("/api/"))
|
|
377
|
+
return;
|
|
378
|
+
if (path.startsWith("/assets/")) {
|
|
379
|
+
reply.header("Cache-Control", "public, max-age=31536000, immutable");
|
|
380
|
+
}
|
|
381
|
+
else if (reply.getHeader("content-type")?.toString().startsWith("text/html") === true) {
|
|
382
|
+
reply.header("Cache-Control", "no-cache");
|
|
383
|
+
}
|
|
384
|
+
});
|
|
385
|
+
await fastify.register(fastifyStatic, {
|
|
386
|
+
root: config.clientDistPath,
|
|
387
|
+
index: "index.html",
|
|
388
|
+
});
|
|
389
|
+
fastify.setNotFoundHandler((req, reply) => {
|
|
390
|
+
const path = req.url.split("?")[0] ?? req.url;
|
|
391
|
+
// The API surface explicitly 404s — never fall through to the SPA.
|
|
392
|
+
if (path.startsWith("/api/")) {
|
|
393
|
+
return reply.code(404).send({ error: "not_found" });
|
|
394
|
+
}
|
|
395
|
+
// SPA fallback: bare GETs without a file extension are deep links
|
|
396
|
+
// (/projects/abc, /sessions/xyz). Anything with an extension that
|
|
397
|
+
// got here is a missing static asset and should 404 honestly so
|
|
398
|
+
// the browser surfaces it instead of silently rendering the shell.
|
|
399
|
+
const lastSegment = path.split("/").pop() ?? "";
|
|
400
|
+
const looksLikeAsset = lastSegment.includes(".");
|
|
401
|
+
if (req.method !== "GET" || looksLikeAsset) {
|
|
402
|
+
return reply.code(404).send({ error: "not_found" });
|
|
403
|
+
}
|
|
404
|
+
return reply.code(200).type("text/html").sendFile("index.html");
|
|
405
|
+
});
|
|
406
|
+
fastify.log.info({ root: config.clientDistPath }, "serving client from disk");
|
|
407
|
+
}
|
|
408
|
+
else {
|
|
409
|
+
fastify.log.info({ dist: config.clientDistPath, exists: existsSync(config.clientDistPath) }, "client dist not served (dev mode or SERVE_CLIENT=false)");
|
|
410
|
+
}
|
|
411
|
+
// Clean teardown on fastify.close() (called by both graceful shutdown and
|
|
412
|
+
// tests via `await fastify.close()`). Disposes every live session, which
|
|
413
|
+
// will also become load-bearing in Phase 5 to flush SSE clients.
|
|
414
|
+
fastify.addHook("onClose", async () => {
|
|
415
|
+
await disposeAllSessions();
|
|
416
|
+
disposeAllPtys();
|
|
417
|
+
await disposeAllMcp();
|
|
418
|
+
});
|
|
419
|
+
// Boot-time MCP load. Eagerly connects every enabled GLOBAL server
|
|
420
|
+
// so /mcp/settings reports honest connection counts before the
|
|
421
|
+
// first session is created. Project-scope servers load lazily on
|
|
422
|
+
// first session-create per project. Failure here is non-fatal —
|
|
423
|
+
// a bad mcp.json shouldn't keep pi-forge from booting.
|
|
424
|
+
loadGlobalMcp().catch((err) => {
|
|
425
|
+
fastify.log.error({ err }, "mcp: initial load failed");
|
|
426
|
+
});
|
|
427
|
+
return fastify;
|
|
428
|
+
}
|
|
429
|
+
export async function start() {
|
|
430
|
+
// Ensure the workspace + forge data dirs exist before anything
|
|
431
|
+
// tries to write under them. mkdir(recursive:true) is a no-op on an
|
|
432
|
+
// existing dir, so this is safe to run on every boot. We do NOT
|
|
433
|
+
// create PI_CONFIG_DIR — that's the SDK's territory and the SDK
|
|
434
|
+
// creates it itself on first auth/models read.
|
|
435
|
+
for (const dir of [config.workspacePath, config.forgeDataDir]) {
|
|
436
|
+
try {
|
|
437
|
+
await mkdir(dir, { recursive: true });
|
|
438
|
+
}
|
|
439
|
+
catch (err) {
|
|
440
|
+
// EACCES on `/workspace` (the legacy default) was the most common
|
|
441
|
+
// dev startup failure. Surface a clear hint instead of letting
|
|
442
|
+
// Fastify start in a broken state.
|
|
443
|
+
console.error(`[pi-forge] failed to create directory ${dir}:`, err.message);
|
|
444
|
+
console.error(`[pi-forge] hint: set WORKSPACE_PATH/FORGE_DATA_DIR to a writable location`);
|
|
445
|
+
process.exit(1);
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
const fastify = await buildServer();
|
|
449
|
+
// One-line confirmation of optional security knobs that are easy to
|
|
450
|
+
// typo or forget to wire through. If you add another opt-in
|
|
451
|
+
// behavioral toggle here, log its state too — operators should be
|
|
452
|
+
// able to grep container logs for the answer to "did my env var
|
|
453
|
+
// take effect" without sending a test prompt.
|
|
454
|
+
logSecretHygieneState();
|
|
455
|
+
try {
|
|
456
|
+
await fastify.listen({ port: config.port, host: config.host });
|
|
457
|
+
fastify.log.info(`pi-forge server listening on :${config.port}`);
|
|
458
|
+
}
|
|
459
|
+
catch (err) {
|
|
460
|
+
fastify.log.error(err);
|
|
461
|
+
process.exit(1);
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
const isMainModule = process.argv[1] !== undefined && import.meta.url === pathToFileURL(process.argv[1]).href;
|
|
465
|
+
if (isMainModule) {
|
|
466
|
+
void start();
|
|
467
|
+
}
|
|
468
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|