heyhank 0.1.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 (199) hide show
  1. package/README.md +40 -0
  2. package/bin/cli.ts +168 -0
  3. package/bin/ctl.ts +528 -0
  4. package/bin/generate-token.ts +28 -0
  5. package/dist/apple-touch-icon.png +0 -0
  6. package/dist/assets/AgentsPage-BPhirnCe.js +7 -0
  7. package/dist/assets/AssistantPage-DJ-cMQfb.js +1 -0
  8. package/dist/assets/CronManager-DDbz-yiT.js +1 -0
  9. package/dist/assets/HelpPage-DMfkzERp.js +1 -0
  10. package/dist/assets/IntegrationsPage-CrOitCmJ.js +1 -0
  11. package/dist/assets/MediaPage-CE5rdvkC.js +1 -0
  12. package/dist/assets/PlatformDashboard-Do6F0O2p.js +1 -0
  13. package/dist/assets/Playground-Fc5cdc5p.js +109 -0
  14. package/dist/assets/ProcessPanel-CslEiZkI.js +2 -0
  15. package/dist/assets/PromptsPage-D2EhsdNO.js +4 -0
  16. package/dist/assets/RunsPage-C5BZF5Rx.js +1 -0
  17. package/dist/assets/SandboxManager-a1AVI5q2.js +8 -0
  18. package/dist/assets/SettingsPage-DirhjQrJ.js +51 -0
  19. package/dist/assets/SocialMediaPage-DBuM28vD.js +1 -0
  20. package/dist/assets/TailscalePage-CHiFhZXF.js +1 -0
  21. package/dist/assets/TelephonyPage-x0VV0fOo.js +1 -0
  22. package/dist/assets/TerminalPage-Drwyrnfd.js +1 -0
  23. package/dist/assets/gemini-audio-t-TSU-To.js +17 -0
  24. package/dist/assets/gemini-live-client-C7rqAW7G.js +166 -0
  25. package/dist/assets/index-C8M_PUmX.css +32 -0
  26. package/dist/assets/index-CEqZnThB.js +204 -0
  27. package/dist/assets/sw-register-LSSpj6RU.js +1 -0
  28. package/dist/assets/time-ago-B6r_l9u1.js +1 -0
  29. package/dist/assets/workbox-window.prod.es5-BIl4cyR9.js +2 -0
  30. package/dist/favicon-32-original.png +0 -0
  31. package/dist/favicon-32.png +0 -0
  32. package/dist/favicon.ico +0 -0
  33. package/dist/favicon.svg +8 -0
  34. package/dist/fonts/MesloLGSNerdFontMono-Bold.woff2 +0 -0
  35. package/dist/fonts/MesloLGSNerdFontMono-Regular.woff2 +0 -0
  36. package/dist/heyhank-mascot-poster.png +0 -0
  37. package/dist/heyhank-mascot.mp4 +0 -0
  38. package/dist/heyhank-mascot.webm +0 -0
  39. package/dist/icon-192-original.png +0 -0
  40. package/dist/icon-192.png +0 -0
  41. package/dist/icon-512-original.png +0 -0
  42. package/dist/icon-512.png +0 -0
  43. package/dist/index.html +21 -0
  44. package/dist/logo-192.png +0 -0
  45. package/dist/logo-512.png +0 -0
  46. package/dist/logo-codex.svg +14 -0
  47. package/dist/logo-docker.svg +4 -0
  48. package/dist/logo-original.png +0 -0
  49. package/dist/logo.png +0 -0
  50. package/dist/logo.svg +14 -0
  51. package/dist/manifest.json +24 -0
  52. package/dist/push-sw.js +34 -0
  53. package/dist/sw.js +1 -0
  54. package/dist/workbox-d2a0910a.js +1 -0
  55. package/package.json +109 -0
  56. package/server/agent-cron-migrator.ts +85 -0
  57. package/server/agent-executor.ts +357 -0
  58. package/server/agent-store.ts +185 -0
  59. package/server/agent-timeout.ts +107 -0
  60. package/server/agent-types.ts +122 -0
  61. package/server/ai-validation-settings.ts +37 -0
  62. package/server/ai-validator.ts +181 -0
  63. package/server/anthropic-provider-migration.ts +48 -0
  64. package/server/assistant-store.ts +272 -0
  65. package/server/auth-manager.ts +150 -0
  66. package/server/auto-approve.ts +153 -0
  67. package/server/auto-namer.ts +36 -0
  68. package/server/backend-adapter.ts +54 -0
  69. package/server/cache-headers.ts +61 -0
  70. package/server/calendar-service.ts +434 -0
  71. package/server/claude-adapter.ts +889 -0
  72. package/server/claude-container-auth.ts +30 -0
  73. package/server/claude-session-discovery.ts +157 -0
  74. package/server/claude-session-history.ts +410 -0
  75. package/server/cli-launcher.ts +1303 -0
  76. package/server/codex-adapter.ts +3027 -0
  77. package/server/codex-container-auth.ts +24 -0
  78. package/server/codex-home.ts +27 -0
  79. package/server/codex-ws-proxy.cjs +226 -0
  80. package/server/commands-discovery.ts +81 -0
  81. package/server/constants.ts +7 -0
  82. package/server/container-manager.ts +1053 -0
  83. package/server/cost-tracker.ts +222 -0
  84. package/server/cron-scheduler.ts +243 -0
  85. package/server/cron-store.ts +148 -0
  86. package/server/cron-types.ts +63 -0
  87. package/server/email-service.ts +354 -0
  88. package/server/env-manager.ts +161 -0
  89. package/server/event-bus-types.ts +75 -0
  90. package/server/event-bus.ts +124 -0
  91. package/server/execution-store.ts +170 -0
  92. package/server/federation/node-connection.ts +190 -0
  93. package/server/federation/node-manager.ts +366 -0
  94. package/server/federation/node-store.ts +86 -0
  95. package/server/federation/node-types.ts +121 -0
  96. package/server/fs-utils.ts +15 -0
  97. package/server/git-utils.ts +421 -0
  98. package/server/github-pr.ts +379 -0
  99. package/server/google-media.ts +342 -0
  100. package/server/image-pull-manager.ts +279 -0
  101. package/server/index.ts +491 -0
  102. package/server/internal-ai.ts +237 -0
  103. package/server/kill-switch.ts +99 -0
  104. package/server/llm-providers.ts +342 -0
  105. package/server/logger.ts +259 -0
  106. package/server/mcp-registry.ts +401 -0
  107. package/server/message-bus.ts +271 -0
  108. package/server/message-delivery.ts +128 -0
  109. package/server/metrics-collector.ts +350 -0
  110. package/server/metrics-types.ts +108 -0
  111. package/server/middleware/managed-auth.ts +195 -0
  112. package/server/novnc-proxy.ts +99 -0
  113. package/server/path-resolver.ts +186 -0
  114. package/server/paths.ts +13 -0
  115. package/server/pr-poller.ts +162 -0
  116. package/server/prompt-manager.ts +211 -0
  117. package/server/protocol/claude-upstream/README.md +19 -0
  118. package/server/protocol/claude-upstream/sdk.d.ts.txt +1943 -0
  119. package/server/protocol/codex-upstream/ClientNotification.ts.txt +5 -0
  120. package/server/protocol/codex-upstream/ClientRequest.ts.txt +60 -0
  121. package/server/protocol/codex-upstream/README.md +18 -0
  122. package/server/protocol/codex-upstream/ServerNotification.ts.txt +41 -0
  123. package/server/protocol/codex-upstream/ServerRequest.ts.txt +16 -0
  124. package/server/protocol/codex-upstream/v2/DynamicToolCallParams.ts.txt +6 -0
  125. package/server/protocol/codex-upstream/v2/DynamicToolCallResponse.ts.txt +6 -0
  126. package/server/protocol-monitor.ts +50 -0
  127. package/server/provider-manager.ts +111 -0
  128. package/server/provider-registry.ts +393 -0
  129. package/server/push-notifications.ts +221 -0
  130. package/server/recorder.ts +374 -0
  131. package/server/recording-hub/compat-validator.ts +284 -0
  132. package/server/recording-hub/diagnostics.ts +299 -0
  133. package/server/recording-hub/hub-config.ts +19 -0
  134. package/server/recording-hub/hub-routes.ts +236 -0
  135. package/server/recording-hub/hub-store.ts +265 -0
  136. package/server/recording-hub/replay-adapter.ts +207 -0
  137. package/server/relay-client.ts +320 -0
  138. package/server/reminder-scheduler.ts +38 -0
  139. package/server/replay.ts +78 -0
  140. package/server/routes/agent-routes.ts +264 -0
  141. package/server/routes/assistant-routes.ts +90 -0
  142. package/server/routes/cron-routes.ts +103 -0
  143. package/server/routes/env-routes.ts +95 -0
  144. package/server/routes/federation-routes.ts +76 -0
  145. package/server/routes/fs-routes.ts +622 -0
  146. package/server/routes/git-routes.ts +97 -0
  147. package/server/routes/llm-routes.ts +166 -0
  148. package/server/routes/media-routes.ts +135 -0
  149. package/server/routes/metrics-routes.ts +13 -0
  150. package/server/routes/platform-routes.ts +1379 -0
  151. package/server/routes/prompt-routes.ts +67 -0
  152. package/server/routes/provider-routes.ts +109 -0
  153. package/server/routes/sandbox-routes.ts +127 -0
  154. package/server/routes/settings-routes.ts +285 -0
  155. package/server/routes/skills-routes.ts +100 -0
  156. package/server/routes/socialmedia-routes.ts +208 -0
  157. package/server/routes/system-routes.ts +228 -0
  158. package/server/routes/tailscale-routes.ts +22 -0
  159. package/server/routes/telephony-routes.ts +259 -0
  160. package/server/routes.ts +1379 -0
  161. package/server/sandbox-manager.ts +168 -0
  162. package/server/service.ts +718 -0
  163. package/server/session-creation-service.ts +457 -0
  164. package/server/session-git-info.ts +104 -0
  165. package/server/session-names.ts +67 -0
  166. package/server/session-orchestrator.ts +824 -0
  167. package/server/session-state-machine.ts +207 -0
  168. package/server/session-store.ts +146 -0
  169. package/server/session-types.ts +511 -0
  170. package/server/settings-manager.ts +149 -0
  171. package/server/shared-context.ts +157 -0
  172. package/server/socialmedia/adapter.ts +15 -0
  173. package/server/socialmedia/adapters/ayrshare-adapter.ts +169 -0
  174. package/server/socialmedia/adapters/buffer-adapter.ts +299 -0
  175. package/server/socialmedia/adapters/postiz-adapter.ts +298 -0
  176. package/server/socialmedia/manager.ts +227 -0
  177. package/server/socialmedia/store.ts +98 -0
  178. package/server/socialmedia/types.ts +89 -0
  179. package/server/tailscale-manager.ts +451 -0
  180. package/server/telephony/audio-bridge.ts +331 -0
  181. package/server/telephony/call-manager.ts +457 -0
  182. package/server/telephony/call-types.ts +108 -0
  183. package/server/telephony/telephony-store.ts +119 -0
  184. package/server/terminal-manager.ts +240 -0
  185. package/server/update-checker.ts +192 -0
  186. package/server/usage-limits.ts +225 -0
  187. package/server/web-push.d.ts +51 -0
  188. package/server/worktree-tracker.ts +84 -0
  189. package/server/ws-auth.ts +41 -0
  190. package/server/ws-bridge-browser-ingest.ts +72 -0
  191. package/server/ws-bridge-browser.ts +112 -0
  192. package/server/ws-bridge-cli-ingest.ts +81 -0
  193. package/server/ws-bridge-codex.ts +266 -0
  194. package/server/ws-bridge-controls.ts +20 -0
  195. package/server/ws-bridge-persist.ts +66 -0
  196. package/server/ws-bridge-publish.ts +79 -0
  197. package/server/ws-bridge-replay.ts +61 -0
  198. package/server/ws-bridge-types.ts +121 -0
  199. package/server/ws-bridge.ts +1240 -0
package/README.md ADDED
@@ -0,0 +1,40 @@
1
+ # HeyHank
2
+
3
+ Self-hosted web UI for running Claude Code and Codex agents. Multi-session management with streaming, tool call visibility, and permission control.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ bunx heyhank
9
+ ```
10
+
11
+ Requires [Bun](https://bun.sh) v1.0+.
12
+
13
+ ## Usage
14
+
15
+ ```bash
16
+ # Start the server
17
+ heyhank serve
18
+
19
+ # Install as background service
20
+ heyhank install
21
+
22
+ # Check status
23
+ heyhank status
24
+ ```
25
+
26
+ ## Features
27
+
28
+ - **Multi-Session Chat** — Run multiple Claude Code / Codex sessions simultaneously
29
+ - **Gemini Live Voice Assistant** — Hands-free voice control with tool calling
30
+ - **Scheduled Agents** — Cron-based agent automation
31
+ - **Media Generation** — Image (Imagen 4) and video (Veo 3.1) generation
32
+ - **Social Media** — Multi-backend posting (Postiz, Buffer, Ayrshare)
33
+ - **Telephony** — Voice calls via FreeSWITCH SIP integration
34
+ - **Federation** — Connect multiple HeyHank instances across machines
35
+ - **Tailscale Funnel** — Public HTTPS access without port forwarding
36
+ - **PWA** — Installable on mobile and desktop
37
+
38
+ ## License
39
+
40
+ MIT
package/bin/cli.ts ADDED
@@ -0,0 +1,168 @@
1
+ #!/usr/bin/env bun
2
+ import { dirname, resolve } from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+
5
+ // Package root so the server can find dist/ regardless of CWD
6
+ const __dirname = dirname(fileURLToPath(import.meta.url));
7
+ process.env.__COMPANION_PACKAGE_ROOT = resolve(__dirname, "..");
8
+
9
+ const command = process.argv[2];
10
+
11
+ // Management subcommands that delegate to ctl.ts
12
+ const CTL_COMMANDS = new Set([
13
+ "sessions", "envs", "cron", "skills", "settings", "assistant", "ctl-help",
14
+ ]);
15
+
16
+ function printUsage(): void {
17
+ console.log(`
18
+ Usage: heyhank [command]
19
+
20
+ Server commands:
21
+ (none) Start the server in foreground (default)
22
+ serve Start the server in foreground
23
+ start Start the background service
24
+ install Install as a background service (launchd/systemd)
25
+ stop Stop the background service
26
+ restart Restart the background service
27
+ uninstall Remove the background service
28
+ status Show service status (or use 'companion status' when server is running)
29
+ logs Tail service log files
30
+ help Show this help message
31
+
32
+ Management commands (requires running server):
33
+ sessions Manage sessions (list, create, kill, relaunch, archive, rename, send-message)
34
+ envs Manage environment profiles (list, get, create, update, delete)
35
+ cron Manage scheduled jobs (list, get, create, update, delete, toggle, run)
36
+ skills Manage Claude Code skills (list, get, create, update, delete)
37
+ settings Manage settings (get, set)
38
+ assistant Manage the Companion Assistant (status, launch, stop, config)
39
+
40
+ Options:
41
+ --port <n> Override the default port (default: 3456)
42
+ `);
43
+ }
44
+
45
+ switch (command) {
46
+ case "help":
47
+ case "-h":
48
+ case "--help":
49
+ printUsage();
50
+ break;
51
+
52
+ case "serve": {
53
+ process.env.NODE_ENV = process.env.NODE_ENV || "production";
54
+ await import("../server/index.ts");
55
+ break;
56
+ }
57
+
58
+ case "start": {
59
+ // Internal service process should stay in foreground server mode.
60
+ const forceForeground = process.argv.includes("--foreground");
61
+ const launchedByInit = (() => {
62
+ if (process.ppid === 1) return true;
63
+ // User-level systemd (systemctl --user) spawns services from a
64
+ // per-user systemd process whose ppid != 1. Detect it via /proc.
65
+ try {
66
+ const { readFileSync } = require("node:fs");
67
+ const comm = readFileSync(`/proc/${process.ppid}/comm`, "utf-8").trim();
68
+ return comm === "systemd";
69
+ } catch {
70
+ return false;
71
+ }
72
+ })();
73
+ if (forceForeground || launchedByInit) {
74
+ process.env.NODE_ENV = process.env.NODE_ENV || "production";
75
+ await import("../server/index.ts");
76
+ break;
77
+ }
78
+ const { start } = await import("../server/service.js");
79
+ await start();
80
+ break;
81
+ }
82
+
83
+ case "install": {
84
+ const { install } = await import("../server/service.js");
85
+ const portIdx = process.argv.indexOf("--port");
86
+ const rawPort = portIdx !== -1 ? Number(process.argv[portIdx + 1]) : undefined;
87
+ const port = rawPort && !Number.isNaN(rawPort) ? rawPort : undefined;
88
+ await install({ port });
89
+ break;
90
+ }
91
+
92
+ case "uninstall": {
93
+ const { uninstall } = await import("../server/service.js");
94
+ await uninstall();
95
+ break;
96
+ }
97
+
98
+ case "status": {
99
+ // Try management API first (server running), fall back to service status
100
+ try {
101
+ const { handleCtlCommand } = await import("./ctl.js");
102
+ await handleCtlCommand("status", process.argv.slice(3));
103
+ } catch {
104
+ // Server not running — show service status
105
+ const { status } = await import("../server/service.js");
106
+ const result = await status();
107
+ if (!result.installed) {
108
+ console.log("The Companion is not installed as a service.");
109
+ console.log("Run: companion install");
110
+ } else if (result.running) {
111
+ console.log(`The Companion is running (PID: ${result.pid})`);
112
+ console.log(` URL: http://localhost:${result.port}`);
113
+ } else {
114
+ console.log("The Companion is installed but not running.");
115
+ console.log("Check logs at ~/.heyhank/logs/");
116
+ }
117
+ }
118
+ break;
119
+ }
120
+
121
+ case "stop": {
122
+ const { stop } = await import("../server/service.js");
123
+ await stop();
124
+ break;
125
+ }
126
+
127
+ case "restart": {
128
+ const { restart } = await import("../server/service.js");
129
+ await restart();
130
+ break;
131
+ }
132
+
133
+ case "logs": {
134
+ const { join } = await import("node:path");
135
+ const { homedir } = await import("node:os");
136
+ const { spawn } = await import("node:child_process");
137
+ const logFile = join(homedir(), ".heyhank/logs/heyhank.log");
138
+ const errFile = join(homedir(), ".heyhank/logs/heyhank.error.log");
139
+ const { existsSync } = await import("node:fs");
140
+ if (!existsSync(logFile) && !existsSync(errFile)) {
141
+ console.error("No log files found at ~/.heyhank/logs/");
142
+ console.error("The service may not have been started yet.");
143
+ process.exit(1);
144
+ }
145
+ console.log("Tailing logs from ~/.heyhank/logs/");
146
+ const tail = spawn("tail", ["-f", logFile, errFile], { stdio: "inherit" });
147
+ tail.on("exit", () => process.exit(0));
148
+ break;
149
+ }
150
+
151
+ case undefined: {
152
+ // Default: start server in foreground
153
+ process.env.NODE_ENV = process.env.NODE_ENV || "production";
154
+ await import("../server/index.ts");
155
+ break;
156
+ }
157
+
158
+ default: {
159
+ if (command && CTL_COMMANDS.has(command)) {
160
+ const { handleCtlCommand } = await import("./ctl.js");
161
+ await handleCtlCommand(command, process.argv.slice(3));
162
+ } else {
163
+ console.error(`Unknown command: ${command}`);
164
+ printUsage();
165
+ process.exit(1);
166
+ }
167
+ }
168
+ }