@hellcoder/companion 0.96.0
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/bin/cli.ts +168 -0
- package/bin/ctl.ts +528 -0
- package/bin/generate-token.ts +28 -0
- package/dist/apple-touch-icon.png +0 -0
- package/dist/assets/AgentsPage-DCFhrJ28.js +13 -0
- package/dist/assets/CronManager-EGwLJONv.js +1 -0
- package/dist/assets/IntegrationsPage-CTMRnbQS.js +1 -0
- package/dist/assets/LinearOAuthSettingsPage-CgQFMIgr.js +1 -0
- package/dist/assets/LinearSettingsPage-C9nok1qi.js +1 -0
- package/dist/assets/Playground-BV3k0RbV.js +109 -0
- package/dist/assets/PromptsPage-CFojqNKP.js +4 -0
- package/dist/assets/RunsPage-DUJ1QUSa.js +1 -0
- package/dist/assets/SandboxManager-CrVQ-VU_.js +8 -0
- package/dist/assets/SettingsPage-D1fPCL19.js +1 -0
- package/dist/assets/TailscalePage-D06cyvyC.js +1 -0
- package/dist/assets/index-BhUa1e6X.css +1 -0
- package/dist/assets/index-DkqeP-R9.js +134 -0
- package/dist/assets/sw-register-BibwRdvC.js +1 -0
- package/dist/assets/workbox-window.prod.es5-BIl4cyR9.js +2 -0
- package/dist/favicon.svg +8 -0
- package/dist/fonts/MesloLGSNerdFontMono-Bold.woff2 +0 -0
- package/dist/fonts/MesloLGSNerdFontMono-Regular.woff2 +0 -0
- package/dist/icon-192.png +0 -0
- package/dist/icon-512.png +0 -0
- package/dist/index.html +20 -0
- package/dist/logo-codex.svg +14 -0
- package/dist/logo-docker.svg +4 -0
- package/dist/logo.svg +14 -0
- package/dist/manifest.json +24 -0
- package/dist/sw.js +2 -0
- package/package.json +104 -0
- package/server/agent-cron-migrator.test.ts +610 -0
- package/server/agent-cron-migrator.ts +85 -0
- package/server/agent-executor.test.ts +1108 -0
- package/server/agent-executor.ts +346 -0
- package/server/agent-store.test.ts +588 -0
- package/server/agent-store.ts +185 -0
- package/server/agent-types.ts +138 -0
- package/server/ai-validation-settings.test.ts +128 -0
- package/server/ai-validation-settings.ts +35 -0
- package/server/ai-validator.test.ts +387 -0
- package/server/ai-validator.ts +271 -0
- package/server/auth-manager.test.ts +83 -0
- package/server/auth-manager.ts +150 -0
- package/server/auto-namer.test.ts +252 -0
- package/server/auto-namer.ts +78 -0
- package/server/backend-adapter.test.ts +38 -0
- package/server/backend-adapter.ts +54 -0
- package/server/cache-headers.test.ts +98 -0
- package/server/cache-headers.ts +61 -0
- package/server/claude-adapter.test.ts +1363 -0
- package/server/claude-adapter.ts +889 -0
- package/server/claude-container-auth.test.ts +44 -0
- package/server/claude-container-auth.ts +30 -0
- package/server/claude-protocol-contract.test.ts +71 -0
- package/server/claude-protocol-drift.test.ts +78 -0
- package/server/claude-session-discovery.test.ts +132 -0
- package/server/claude-session-discovery.ts +157 -0
- package/server/claude-session-history.test.ts +158 -0
- package/server/claude-session-history.ts +410 -0
- package/server/cli-launcher.test.ts +1343 -0
- package/server/cli-launcher.ts +1298 -0
- package/server/cli.test.ts +16 -0
- package/server/codex-adapter.test.ts +5545 -0
- package/server/codex-adapter.ts +3062 -0
- package/server/codex-container-auth.test.ts +50 -0
- package/server/codex-container-auth.ts +24 -0
- package/server/codex-home.test.ts +61 -0
- package/server/codex-home.ts +26 -0
- package/server/codex-protocol-contract.test.ts +96 -0
- package/server/codex-protocol-drift.test.ts +123 -0
- package/server/codex-ws-proxy.cjs +226 -0
- package/server/commands-discovery.test.ts +179 -0
- package/server/commands-discovery.ts +81 -0
- package/server/constants.ts +7 -0
- package/server/container-manager.test.ts +1211 -0
- package/server/container-manager.ts +1053 -0
- package/server/cron-scheduler.test.ts +957 -0
- package/server/cron-scheduler.ts +243 -0
- package/server/cron-store.test.ts +422 -0
- package/server/cron-store.ts +148 -0
- package/server/cron-types.ts +63 -0
- package/server/env-manager.test.ts +268 -0
- package/server/env-manager.ts +161 -0
- package/server/event-bus-types.ts +64 -0
- package/server/event-bus.test.ts +244 -0
- package/server/event-bus.ts +124 -0
- package/server/execution-store.test.ts +307 -0
- package/server/execution-store.ts +170 -0
- package/server/fs-utils.ts +15 -0
- package/server/git-utils.test.ts +938 -0
- package/server/git-utils.ts +421 -0
- package/server/github-pr.test.ts +498 -0
- package/server/github-pr.ts +379 -0
- package/server/image-pull-manager.test.ts +303 -0
- package/server/image-pull-manager.ts +279 -0
- package/server/index.ts +396 -0
- package/server/linear-agent-bridge.test.ts +1157 -0
- package/server/linear-agent-bridge.ts +629 -0
- package/server/linear-agent.test.ts +473 -0
- package/server/linear-agent.ts +479 -0
- package/server/linear-cache.test.ts +136 -0
- package/server/linear-cache.ts +113 -0
- package/server/linear-connections.test.ts +350 -0
- package/server/linear-connections.ts +231 -0
- package/server/linear-credential-migration.test.ts +337 -0
- package/server/linear-credential-migration.ts +63 -0
- package/server/linear-oauth-connections-migration.test.ts +268 -0
- package/server/linear-oauth-connections.test.ts +365 -0
- package/server/linear-oauth-connections.ts +294 -0
- package/server/linear-project-manager.test.ts +162 -0
- package/server/linear-project-manager.ts +111 -0
- package/server/linear-prompt-builder.test.ts +74 -0
- package/server/linear-prompt-builder.ts +61 -0
- package/server/linear-staging.test.ts +276 -0
- package/server/linear-staging.ts +142 -0
- package/server/logger.test.ts +393 -0
- package/server/logger.ts +259 -0
- package/server/metrics-collector.test.ts +413 -0
- package/server/metrics-collector.ts +350 -0
- package/server/metrics-types.ts +108 -0
- package/server/middleware/managed-auth.test.ts +264 -0
- package/server/middleware/managed-auth.ts +195 -0
- package/server/novnc-proxy.test.ts +333 -0
- package/server/novnc-proxy.ts +99 -0
- package/server/path-resolver.test.ts +552 -0
- package/server/path-resolver.ts +186 -0
- package/server/paths.test.ts +31 -0
- package/server/paths.ts +11 -0
- package/server/pr-poller.test.ts +191 -0
- package/server/pr-poller.ts +162 -0
- package/server/prompt-manager.test.ts +211 -0
- package/server/prompt-manager.ts +211 -0
- package/server/protocol/claude-upstream/README.md +19 -0
- package/server/protocol/claude-upstream/sdk.d.ts.txt +1943 -0
- package/server/protocol/codex-upstream/ClientNotification.ts.txt +5 -0
- package/server/protocol/codex-upstream/ClientRequest.ts.txt +60 -0
- package/server/protocol/codex-upstream/README.md +18 -0
- package/server/protocol/codex-upstream/ServerNotification.ts.txt +41 -0
- package/server/protocol/codex-upstream/ServerRequest.ts.txt +16 -0
- package/server/protocol/codex-upstream/v2/DynamicToolCallParams.ts.txt +6 -0
- package/server/protocol/codex-upstream/v2/DynamicToolCallResponse.ts.txt +6 -0
- package/server/protocol-monitor.ts +50 -0
- package/server/recorder.test.ts +454 -0
- package/server/recorder.ts +374 -0
- package/server/recording-hub/compat-validator.test.ts +150 -0
- package/server/recording-hub/compat-validator.ts +284 -0
- package/server/recording-hub/diagnostics.test.ts +140 -0
- package/server/recording-hub/diagnostics.ts +299 -0
- package/server/recording-hub/hub-config.test.ts +44 -0
- package/server/recording-hub/hub-config.ts +19 -0
- package/server/recording-hub/hub-routes.test.ts +417 -0
- package/server/recording-hub/hub-routes.ts +236 -0
- package/server/recording-hub/hub-store.test.ts +262 -0
- package/server/recording-hub/hub-store.ts +265 -0
- package/server/recording-hub/replay-adapter.test.ts +294 -0
- package/server/recording-hub/replay-adapter.ts +207 -0
- package/server/relay-client.test.ts +337 -0
- package/server/relay-client.ts +320 -0
- package/server/replay.test.ts +200 -0
- package/server/replay.ts +78 -0
- package/server/routes/agent-routes.test.ts +1400 -0
- package/server/routes/agent-routes.ts +409 -0
- package/server/routes/cron-routes.test.ts +881 -0
- package/server/routes/cron-routes.ts +103 -0
- package/server/routes/env-routes.test.ts +383 -0
- package/server/routes/env-routes.ts +95 -0
- package/server/routes/fs-routes.test.ts +1198 -0
- package/server/routes/fs-routes.ts +605 -0
- package/server/routes/git-routes.test.ts +813 -0
- package/server/routes/git-routes.ts +97 -0
- package/server/routes/linear-agent-routes.test.ts +721 -0
- package/server/routes/linear-agent-routes.ts +304 -0
- package/server/routes/linear-connection-routes.test.ts +927 -0
- package/server/routes/linear-connection-routes.ts +244 -0
- package/server/routes/linear-oauth-connection-routes.test.ts +406 -0
- package/server/routes/linear-oauth-connection-routes.ts +129 -0
- package/server/routes/linear-routes.test.ts +1510 -0
- package/server/routes/linear-routes.ts +953 -0
- package/server/routes/metrics-routes.test.ts +103 -0
- package/server/routes/metrics-routes.ts +13 -0
- package/server/routes/prompt-routes.ts +67 -0
- package/server/routes/sandbox-routes.test.ts +513 -0
- package/server/routes/sandbox-routes.ts +127 -0
- package/server/routes/settings-routes.ts +270 -0
- package/server/routes/skills-routes.test.ts +690 -0
- package/server/routes/skills-routes.ts +100 -0
- package/server/routes/system-routes.test.ts +637 -0
- package/server/routes/system-routes.ts +228 -0
- package/server/routes/tailscale-routes.test.ts +176 -0
- package/server/routes/tailscale-routes.ts +22 -0
- package/server/routes.test.ts +4655 -0
- package/server/routes.ts +1277 -0
- package/server/sandbox-manager.test.ts +378 -0
- package/server/sandbox-manager.ts +168 -0
- package/server/service.test.ts +1419 -0
- package/server/service.ts +718 -0
- package/server/session-creation-service.test.ts +661 -0
- package/server/session-creation-service.ts +473 -0
- package/server/session-git-info.ts +104 -0
- package/server/session-linear-issues.test.ts +118 -0
- package/server/session-linear-issues.ts +88 -0
- package/server/session-names.test.ts +94 -0
- package/server/session-names.ts +67 -0
- package/server/session-orchestrator.test.ts +1784 -0
- package/server/session-orchestrator.ts +973 -0
- package/server/session-state-machine.test.ts +606 -0
- package/server/session-state-machine.ts +207 -0
- package/server/session-store.test.ts +290 -0
- package/server/session-store.ts +146 -0
- package/server/session-types.ts +509 -0
- package/server/settings-manager.test.ts +275 -0
- package/server/settings-manager.ts +173 -0
- package/server/tailscale-manager.test.ts +553 -0
- package/server/tailscale-manager.ts +451 -0
- package/server/terminal-manager.ts +240 -0
- package/server/update-checker.test.ts +306 -0
- package/server/update-checker.ts +197 -0
- package/server/usage-limits.test.ts +536 -0
- package/server/usage-limits.ts +225 -0
- package/server/worktree-tracker.test.ts +243 -0
- package/server/worktree-tracker.ts +84 -0
- package/server/ws-auth.test.ts +59 -0
- package/server/ws-auth.ts +41 -0
- package/server/ws-bridge-browser-ingest.test.ts +272 -0
- package/server/ws-bridge-browser-ingest.ts +72 -0
- package/server/ws-bridge-browser.ts +112 -0
- package/server/ws-bridge-cli-ingest.test.ts +302 -0
- package/server/ws-bridge-cli-ingest.ts +81 -0
- package/server/ws-bridge-codex.test.ts +1837 -0
- package/server/ws-bridge-codex.ts +266 -0
- package/server/ws-bridge-controls.test.ts +124 -0
- package/server/ws-bridge-controls.ts +20 -0
- package/server/ws-bridge-persist.test.ts +296 -0
- package/server/ws-bridge-persist.ts +66 -0
- package/server/ws-bridge-publish.test.ts +234 -0
- package/server/ws-bridge-publish.ts +79 -0
- package/server/ws-bridge-replay.test.ts +44 -0
- package/server/ws-bridge-replay.ts +61 -0
- package/server/ws-bridge-types.ts +106 -0
- package/server/ws-bridge.test.ts +4777 -0
- package/server/ws-bridge.ts +1279 -0
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { Hono } from "hono";
|
|
3
|
+
import { cacheControlMiddleware } from "./cache-headers.js";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Unit tests for the Cache-Control middleware.
|
|
7
|
+
*
|
|
8
|
+
* Uses a minimal Hono app with mock routes that return 200 for known paths.
|
|
9
|
+
* The middleware runs after the route handler (via await next()) and sets
|
|
10
|
+
* Cache-Control headers based on the request path.
|
|
11
|
+
*
|
|
12
|
+
* Validates that:
|
|
13
|
+
* - sw.js and workbox files get no-cache (browsers must check for updates)
|
|
14
|
+
* - index.html gets no-cache (SW update detection depends on fresh HTML)
|
|
15
|
+
* - manifest.json gets no-cache
|
|
16
|
+
* - Vite hashed assets get immutable caching (content-hashed filenames)
|
|
17
|
+
* - Font files get immutable caching
|
|
18
|
+
* - Icons/images get 1-day cache
|
|
19
|
+
* - API routes get no Cache-Control header (handled by network, not static)
|
|
20
|
+
*/
|
|
21
|
+
function createTestApp() {
|
|
22
|
+
const app = new Hono();
|
|
23
|
+
app.use("/*", cacheControlMiddleware());
|
|
24
|
+
|
|
25
|
+
// Mock routes that simulate serveStatic behavior
|
|
26
|
+
app.get("/sw.js", (c) => c.text("// sw"));
|
|
27
|
+
app.get("/workbox-abc123.js", (c) => c.text("// workbox"));
|
|
28
|
+
app.get("/", (c) => c.html("<html></html>"));
|
|
29
|
+
app.get("/index.html", (c) => c.html("<html></html>"));
|
|
30
|
+
app.get("/manifest.json", (c) => c.json({}));
|
|
31
|
+
app.get("/assets/index-abc123.js", (c) => c.text("// js"));
|
|
32
|
+
app.get("/assets/style-def456.css", (c) => c.text("/* css */"));
|
|
33
|
+
app.get("/fonts/MesloLGSNerdFontMono-Regular.woff2", (c) => c.body("font"));
|
|
34
|
+
app.get("/icon-192.png", (c) => c.body("png"));
|
|
35
|
+
app.get("/favicon.svg", (c) => c.body("svg"));
|
|
36
|
+
app.get("/api/sessions", (c) => c.json([]));
|
|
37
|
+
|
|
38
|
+
return app;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
describe("cacheControlMiddleware", () => {
|
|
42
|
+
const app = createTestApp();
|
|
43
|
+
|
|
44
|
+
it("sets no-cache for /sw.js", async () => {
|
|
45
|
+
const res = await app.request("/sw.js");
|
|
46
|
+
expect(res.headers.get("Cache-Control")).toBe("no-cache");
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
it("sets no-cache for workbox runtime files", async () => {
|
|
50
|
+
const res = await app.request("/workbox-abc123.js");
|
|
51
|
+
expect(res.headers.get("Cache-Control")).toBe("no-cache");
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
it("sets no-cache for / (index.html root)", async () => {
|
|
55
|
+
const res = await app.request("/");
|
|
56
|
+
expect(res.headers.get("Cache-Control")).toBe("no-cache");
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
it("sets no-cache for /index.html", async () => {
|
|
60
|
+
const res = await app.request("/index.html");
|
|
61
|
+
expect(res.headers.get("Cache-Control")).toBe("no-cache");
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
it("sets no-cache for /manifest.json", async () => {
|
|
65
|
+
const res = await app.request("/manifest.json");
|
|
66
|
+
expect(res.headers.get("Cache-Control")).toBe("no-cache");
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
it("sets immutable max-age for Vite hashed JS assets", async () => {
|
|
70
|
+
const res = await app.request("/assets/index-abc123.js");
|
|
71
|
+
expect(res.headers.get("Cache-Control")).toBe("public, max-age=31536000, immutable");
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
it("sets immutable max-age for Vite hashed CSS assets", async () => {
|
|
75
|
+
const res = await app.request("/assets/style-def456.css");
|
|
76
|
+
expect(res.headers.get("Cache-Control")).toBe("public, max-age=31536000, immutable");
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
it("sets immutable max-age for woff2 font files", async () => {
|
|
80
|
+
const res = await app.request("/fonts/MesloLGSNerdFontMono-Regular.woff2");
|
|
81
|
+
expect(res.headers.get("Cache-Control")).toBe("public, max-age=31536000, immutable");
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
it("sets 1-day cache for PNG icons", async () => {
|
|
85
|
+
const res = await app.request("/icon-192.png");
|
|
86
|
+
expect(res.headers.get("Cache-Control")).toBe("public, max-age=86400");
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
it("sets 1-day cache for SVG files", async () => {
|
|
90
|
+
const res = await app.request("/favicon.svg");
|
|
91
|
+
expect(res.headers.get("Cache-Control")).toBe("public, max-age=86400");
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
it("does not set Cache-Control for API routes", async () => {
|
|
95
|
+
const res = await app.request("/api/sessions");
|
|
96
|
+
expect(res.headers.get("Cache-Control")).toBeNull();
|
|
97
|
+
});
|
|
98
|
+
});
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import type { MiddlewareHandler } from "hono";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Hono middleware that sets Cache-Control headers for production static assets.
|
|
5
|
+
*
|
|
6
|
+
* Must be registered BEFORE serveStatic so it can modify the response headers
|
|
7
|
+
* after the static file is served (via await next()).
|
|
8
|
+
*
|
|
9
|
+
* Header strategy:
|
|
10
|
+
* - sw.js / workbox-*.js: no-cache (browser must revalidate on each load)
|
|
11
|
+
* - index.html: no-cache (fresh HTML triggers SW update detection)
|
|
12
|
+
* - manifest.json: no-cache (browser checks on each visit)
|
|
13
|
+
* - /assets/*: immutable, 1 year (Vite content-hashed filenames)
|
|
14
|
+
* - /fonts/*.woff2: immutable, 1 year (stable font files)
|
|
15
|
+
* - Icons/images: 1 day cache
|
|
16
|
+
*/
|
|
17
|
+
export function cacheControlMiddleware(): MiddlewareHandler {
|
|
18
|
+
return async (c, next) => {
|
|
19
|
+
await next();
|
|
20
|
+
|
|
21
|
+
// Only set cache headers on successful responses
|
|
22
|
+
if (c.res.status !== 200) return;
|
|
23
|
+
|
|
24
|
+
const path = c.req.path;
|
|
25
|
+
|
|
26
|
+
// Service worker files: browsers must always revalidate
|
|
27
|
+
if (path === "/sw.js" || path.startsWith("/workbox-")) {
|
|
28
|
+
c.header("Cache-Control", "no-cache");
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// index.html (served for / and /index.html): must be fresh
|
|
33
|
+
if (path === "/" || path === "/index.html") {
|
|
34
|
+
c.header("Cache-Control", "no-cache");
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// manifest.json: must be fresh
|
|
39
|
+
if (path === "/manifest.json") {
|
|
40
|
+
c.header("Cache-Control", "no-cache");
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// Vite hashed assets: immutable (filename changes on content change)
|
|
45
|
+
if (path.startsWith("/assets/")) {
|
|
46
|
+
c.header("Cache-Control", "public, max-age=31536000, immutable");
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// Font files: immutable
|
|
51
|
+
if (path.startsWith("/fonts/") && path.endsWith(".woff2")) {
|
|
52
|
+
c.header("Cache-Control", "public, max-age=31536000, immutable");
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// Other static files (icons, images): cache for 1 day
|
|
57
|
+
if (path.endsWith(".png") || path.endsWith(".svg") || path.endsWith(".ico")) {
|
|
58
|
+
c.header("Cache-Control", "public, max-age=86400");
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
}
|