@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.
Files changed (242) hide show
  1. package/bin/cli.ts +168 -0
  2. package/bin/ctl.ts +528 -0
  3. package/bin/generate-token.ts +28 -0
  4. package/dist/apple-touch-icon.png +0 -0
  5. package/dist/assets/AgentsPage-DCFhrJ28.js +13 -0
  6. package/dist/assets/CronManager-EGwLJONv.js +1 -0
  7. package/dist/assets/IntegrationsPage-CTMRnbQS.js +1 -0
  8. package/dist/assets/LinearOAuthSettingsPage-CgQFMIgr.js +1 -0
  9. package/dist/assets/LinearSettingsPage-C9nok1qi.js +1 -0
  10. package/dist/assets/Playground-BV3k0RbV.js +109 -0
  11. package/dist/assets/PromptsPage-CFojqNKP.js +4 -0
  12. package/dist/assets/RunsPage-DUJ1QUSa.js +1 -0
  13. package/dist/assets/SandboxManager-CrVQ-VU_.js +8 -0
  14. package/dist/assets/SettingsPage-D1fPCL19.js +1 -0
  15. package/dist/assets/TailscalePage-D06cyvyC.js +1 -0
  16. package/dist/assets/index-BhUa1e6X.css +1 -0
  17. package/dist/assets/index-DkqeP-R9.js +134 -0
  18. package/dist/assets/sw-register-BibwRdvC.js +1 -0
  19. package/dist/assets/workbox-window.prod.es5-BIl4cyR9.js +2 -0
  20. package/dist/favicon.svg +8 -0
  21. package/dist/fonts/MesloLGSNerdFontMono-Bold.woff2 +0 -0
  22. package/dist/fonts/MesloLGSNerdFontMono-Regular.woff2 +0 -0
  23. package/dist/icon-192.png +0 -0
  24. package/dist/icon-512.png +0 -0
  25. package/dist/index.html +20 -0
  26. package/dist/logo-codex.svg +14 -0
  27. package/dist/logo-docker.svg +4 -0
  28. package/dist/logo.svg +14 -0
  29. package/dist/manifest.json +24 -0
  30. package/dist/sw.js +2 -0
  31. package/package.json +104 -0
  32. package/server/agent-cron-migrator.test.ts +610 -0
  33. package/server/agent-cron-migrator.ts +85 -0
  34. package/server/agent-executor.test.ts +1108 -0
  35. package/server/agent-executor.ts +346 -0
  36. package/server/agent-store.test.ts +588 -0
  37. package/server/agent-store.ts +185 -0
  38. package/server/agent-types.ts +138 -0
  39. package/server/ai-validation-settings.test.ts +128 -0
  40. package/server/ai-validation-settings.ts +35 -0
  41. package/server/ai-validator.test.ts +387 -0
  42. package/server/ai-validator.ts +271 -0
  43. package/server/auth-manager.test.ts +83 -0
  44. package/server/auth-manager.ts +150 -0
  45. package/server/auto-namer.test.ts +252 -0
  46. package/server/auto-namer.ts +78 -0
  47. package/server/backend-adapter.test.ts +38 -0
  48. package/server/backend-adapter.ts +54 -0
  49. package/server/cache-headers.test.ts +98 -0
  50. package/server/cache-headers.ts +61 -0
  51. package/server/claude-adapter.test.ts +1363 -0
  52. package/server/claude-adapter.ts +889 -0
  53. package/server/claude-container-auth.test.ts +44 -0
  54. package/server/claude-container-auth.ts +30 -0
  55. package/server/claude-protocol-contract.test.ts +71 -0
  56. package/server/claude-protocol-drift.test.ts +78 -0
  57. package/server/claude-session-discovery.test.ts +132 -0
  58. package/server/claude-session-discovery.ts +157 -0
  59. package/server/claude-session-history.test.ts +158 -0
  60. package/server/claude-session-history.ts +410 -0
  61. package/server/cli-launcher.test.ts +1343 -0
  62. package/server/cli-launcher.ts +1298 -0
  63. package/server/cli.test.ts +16 -0
  64. package/server/codex-adapter.test.ts +5545 -0
  65. package/server/codex-adapter.ts +3062 -0
  66. package/server/codex-container-auth.test.ts +50 -0
  67. package/server/codex-container-auth.ts +24 -0
  68. package/server/codex-home.test.ts +61 -0
  69. package/server/codex-home.ts +26 -0
  70. package/server/codex-protocol-contract.test.ts +96 -0
  71. package/server/codex-protocol-drift.test.ts +123 -0
  72. package/server/codex-ws-proxy.cjs +226 -0
  73. package/server/commands-discovery.test.ts +179 -0
  74. package/server/commands-discovery.ts +81 -0
  75. package/server/constants.ts +7 -0
  76. package/server/container-manager.test.ts +1211 -0
  77. package/server/container-manager.ts +1053 -0
  78. package/server/cron-scheduler.test.ts +957 -0
  79. package/server/cron-scheduler.ts +243 -0
  80. package/server/cron-store.test.ts +422 -0
  81. package/server/cron-store.ts +148 -0
  82. package/server/cron-types.ts +63 -0
  83. package/server/env-manager.test.ts +268 -0
  84. package/server/env-manager.ts +161 -0
  85. package/server/event-bus-types.ts +64 -0
  86. package/server/event-bus.test.ts +244 -0
  87. package/server/event-bus.ts +124 -0
  88. package/server/execution-store.test.ts +307 -0
  89. package/server/execution-store.ts +170 -0
  90. package/server/fs-utils.ts +15 -0
  91. package/server/git-utils.test.ts +938 -0
  92. package/server/git-utils.ts +421 -0
  93. package/server/github-pr.test.ts +498 -0
  94. package/server/github-pr.ts +379 -0
  95. package/server/image-pull-manager.test.ts +303 -0
  96. package/server/image-pull-manager.ts +279 -0
  97. package/server/index.ts +396 -0
  98. package/server/linear-agent-bridge.test.ts +1157 -0
  99. package/server/linear-agent-bridge.ts +629 -0
  100. package/server/linear-agent.test.ts +473 -0
  101. package/server/linear-agent.ts +479 -0
  102. package/server/linear-cache.test.ts +136 -0
  103. package/server/linear-cache.ts +113 -0
  104. package/server/linear-connections.test.ts +350 -0
  105. package/server/linear-connections.ts +231 -0
  106. package/server/linear-credential-migration.test.ts +337 -0
  107. package/server/linear-credential-migration.ts +63 -0
  108. package/server/linear-oauth-connections-migration.test.ts +268 -0
  109. package/server/linear-oauth-connections.test.ts +365 -0
  110. package/server/linear-oauth-connections.ts +294 -0
  111. package/server/linear-project-manager.test.ts +162 -0
  112. package/server/linear-project-manager.ts +111 -0
  113. package/server/linear-prompt-builder.test.ts +74 -0
  114. package/server/linear-prompt-builder.ts +61 -0
  115. package/server/linear-staging.test.ts +276 -0
  116. package/server/linear-staging.ts +142 -0
  117. package/server/logger.test.ts +393 -0
  118. package/server/logger.ts +259 -0
  119. package/server/metrics-collector.test.ts +413 -0
  120. package/server/metrics-collector.ts +350 -0
  121. package/server/metrics-types.ts +108 -0
  122. package/server/middleware/managed-auth.test.ts +264 -0
  123. package/server/middleware/managed-auth.ts +195 -0
  124. package/server/novnc-proxy.test.ts +333 -0
  125. package/server/novnc-proxy.ts +99 -0
  126. package/server/path-resolver.test.ts +552 -0
  127. package/server/path-resolver.ts +186 -0
  128. package/server/paths.test.ts +31 -0
  129. package/server/paths.ts +11 -0
  130. package/server/pr-poller.test.ts +191 -0
  131. package/server/pr-poller.ts +162 -0
  132. package/server/prompt-manager.test.ts +211 -0
  133. package/server/prompt-manager.ts +211 -0
  134. package/server/protocol/claude-upstream/README.md +19 -0
  135. package/server/protocol/claude-upstream/sdk.d.ts.txt +1943 -0
  136. package/server/protocol/codex-upstream/ClientNotification.ts.txt +5 -0
  137. package/server/protocol/codex-upstream/ClientRequest.ts.txt +60 -0
  138. package/server/protocol/codex-upstream/README.md +18 -0
  139. package/server/protocol/codex-upstream/ServerNotification.ts.txt +41 -0
  140. package/server/protocol/codex-upstream/ServerRequest.ts.txt +16 -0
  141. package/server/protocol/codex-upstream/v2/DynamicToolCallParams.ts.txt +6 -0
  142. package/server/protocol/codex-upstream/v2/DynamicToolCallResponse.ts.txt +6 -0
  143. package/server/protocol-monitor.ts +50 -0
  144. package/server/recorder.test.ts +454 -0
  145. package/server/recorder.ts +374 -0
  146. package/server/recording-hub/compat-validator.test.ts +150 -0
  147. package/server/recording-hub/compat-validator.ts +284 -0
  148. package/server/recording-hub/diagnostics.test.ts +140 -0
  149. package/server/recording-hub/diagnostics.ts +299 -0
  150. package/server/recording-hub/hub-config.test.ts +44 -0
  151. package/server/recording-hub/hub-config.ts +19 -0
  152. package/server/recording-hub/hub-routes.test.ts +417 -0
  153. package/server/recording-hub/hub-routes.ts +236 -0
  154. package/server/recording-hub/hub-store.test.ts +262 -0
  155. package/server/recording-hub/hub-store.ts +265 -0
  156. package/server/recording-hub/replay-adapter.test.ts +294 -0
  157. package/server/recording-hub/replay-adapter.ts +207 -0
  158. package/server/relay-client.test.ts +337 -0
  159. package/server/relay-client.ts +320 -0
  160. package/server/replay.test.ts +200 -0
  161. package/server/replay.ts +78 -0
  162. package/server/routes/agent-routes.test.ts +1400 -0
  163. package/server/routes/agent-routes.ts +409 -0
  164. package/server/routes/cron-routes.test.ts +881 -0
  165. package/server/routes/cron-routes.ts +103 -0
  166. package/server/routes/env-routes.test.ts +383 -0
  167. package/server/routes/env-routes.ts +95 -0
  168. package/server/routes/fs-routes.test.ts +1198 -0
  169. package/server/routes/fs-routes.ts +605 -0
  170. package/server/routes/git-routes.test.ts +813 -0
  171. package/server/routes/git-routes.ts +97 -0
  172. package/server/routes/linear-agent-routes.test.ts +721 -0
  173. package/server/routes/linear-agent-routes.ts +304 -0
  174. package/server/routes/linear-connection-routes.test.ts +927 -0
  175. package/server/routes/linear-connection-routes.ts +244 -0
  176. package/server/routes/linear-oauth-connection-routes.test.ts +406 -0
  177. package/server/routes/linear-oauth-connection-routes.ts +129 -0
  178. package/server/routes/linear-routes.test.ts +1510 -0
  179. package/server/routes/linear-routes.ts +953 -0
  180. package/server/routes/metrics-routes.test.ts +103 -0
  181. package/server/routes/metrics-routes.ts +13 -0
  182. package/server/routes/prompt-routes.ts +67 -0
  183. package/server/routes/sandbox-routes.test.ts +513 -0
  184. package/server/routes/sandbox-routes.ts +127 -0
  185. package/server/routes/settings-routes.ts +270 -0
  186. package/server/routes/skills-routes.test.ts +690 -0
  187. package/server/routes/skills-routes.ts +100 -0
  188. package/server/routes/system-routes.test.ts +637 -0
  189. package/server/routes/system-routes.ts +228 -0
  190. package/server/routes/tailscale-routes.test.ts +176 -0
  191. package/server/routes/tailscale-routes.ts +22 -0
  192. package/server/routes.test.ts +4655 -0
  193. package/server/routes.ts +1277 -0
  194. package/server/sandbox-manager.test.ts +378 -0
  195. package/server/sandbox-manager.ts +168 -0
  196. package/server/service.test.ts +1419 -0
  197. package/server/service.ts +718 -0
  198. package/server/session-creation-service.test.ts +661 -0
  199. package/server/session-creation-service.ts +473 -0
  200. package/server/session-git-info.ts +104 -0
  201. package/server/session-linear-issues.test.ts +118 -0
  202. package/server/session-linear-issues.ts +88 -0
  203. package/server/session-names.test.ts +94 -0
  204. package/server/session-names.ts +67 -0
  205. package/server/session-orchestrator.test.ts +1784 -0
  206. package/server/session-orchestrator.ts +973 -0
  207. package/server/session-state-machine.test.ts +606 -0
  208. package/server/session-state-machine.ts +207 -0
  209. package/server/session-store.test.ts +290 -0
  210. package/server/session-store.ts +146 -0
  211. package/server/session-types.ts +509 -0
  212. package/server/settings-manager.test.ts +275 -0
  213. package/server/settings-manager.ts +173 -0
  214. package/server/tailscale-manager.test.ts +553 -0
  215. package/server/tailscale-manager.ts +451 -0
  216. package/server/terminal-manager.ts +240 -0
  217. package/server/update-checker.test.ts +306 -0
  218. package/server/update-checker.ts +197 -0
  219. package/server/usage-limits.test.ts +536 -0
  220. package/server/usage-limits.ts +225 -0
  221. package/server/worktree-tracker.test.ts +243 -0
  222. package/server/worktree-tracker.ts +84 -0
  223. package/server/ws-auth.test.ts +59 -0
  224. package/server/ws-auth.ts +41 -0
  225. package/server/ws-bridge-browser-ingest.test.ts +272 -0
  226. package/server/ws-bridge-browser-ingest.ts +72 -0
  227. package/server/ws-bridge-browser.ts +112 -0
  228. package/server/ws-bridge-cli-ingest.test.ts +302 -0
  229. package/server/ws-bridge-cli-ingest.ts +81 -0
  230. package/server/ws-bridge-codex.test.ts +1837 -0
  231. package/server/ws-bridge-codex.ts +266 -0
  232. package/server/ws-bridge-controls.test.ts +124 -0
  233. package/server/ws-bridge-controls.ts +20 -0
  234. package/server/ws-bridge-persist.test.ts +296 -0
  235. package/server/ws-bridge-persist.ts +66 -0
  236. package/server/ws-bridge-publish.test.ts +234 -0
  237. package/server/ws-bridge-publish.ts +79 -0
  238. package/server/ws-bridge-replay.test.ts +44 -0
  239. package/server/ws-bridge-replay.ts +61 -0
  240. package/server/ws-bridge-types.ts +106 -0
  241. package/server/ws-bridge.test.ts +4777 -0
  242. 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
+ }