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.
- package/README.md +40 -0
- 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-BPhirnCe.js +7 -0
- package/dist/assets/AssistantPage-DJ-cMQfb.js +1 -0
- package/dist/assets/CronManager-DDbz-yiT.js +1 -0
- package/dist/assets/HelpPage-DMfkzERp.js +1 -0
- package/dist/assets/IntegrationsPage-CrOitCmJ.js +1 -0
- package/dist/assets/MediaPage-CE5rdvkC.js +1 -0
- package/dist/assets/PlatformDashboard-Do6F0O2p.js +1 -0
- package/dist/assets/Playground-Fc5cdc5p.js +109 -0
- package/dist/assets/ProcessPanel-CslEiZkI.js +2 -0
- package/dist/assets/PromptsPage-D2EhsdNO.js +4 -0
- package/dist/assets/RunsPage-C5BZF5Rx.js +1 -0
- package/dist/assets/SandboxManager-a1AVI5q2.js +8 -0
- package/dist/assets/SettingsPage-DirhjQrJ.js +51 -0
- package/dist/assets/SocialMediaPage-DBuM28vD.js +1 -0
- package/dist/assets/TailscalePage-CHiFhZXF.js +1 -0
- package/dist/assets/TelephonyPage-x0VV0fOo.js +1 -0
- package/dist/assets/TerminalPage-Drwyrnfd.js +1 -0
- package/dist/assets/gemini-audio-t-TSU-To.js +17 -0
- package/dist/assets/gemini-live-client-C7rqAW7G.js +166 -0
- package/dist/assets/index-C8M_PUmX.css +32 -0
- package/dist/assets/index-CEqZnThB.js +204 -0
- package/dist/assets/sw-register-LSSpj6RU.js +1 -0
- package/dist/assets/time-ago-B6r_l9u1.js +1 -0
- package/dist/assets/workbox-window.prod.es5-BIl4cyR9.js +2 -0
- package/dist/favicon-32-original.png +0 -0
- package/dist/favicon-32.png +0 -0
- package/dist/favicon.ico +0 -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/heyhank-mascot-poster.png +0 -0
- package/dist/heyhank-mascot.mp4 +0 -0
- package/dist/heyhank-mascot.webm +0 -0
- package/dist/icon-192-original.png +0 -0
- package/dist/icon-192.png +0 -0
- package/dist/icon-512-original.png +0 -0
- package/dist/icon-512.png +0 -0
- package/dist/index.html +21 -0
- package/dist/logo-192.png +0 -0
- package/dist/logo-512.png +0 -0
- package/dist/logo-codex.svg +14 -0
- package/dist/logo-docker.svg +4 -0
- package/dist/logo-original.png +0 -0
- package/dist/logo.png +0 -0
- package/dist/logo.svg +14 -0
- package/dist/manifest.json +24 -0
- package/dist/push-sw.js +34 -0
- package/dist/sw.js +1 -0
- package/dist/workbox-d2a0910a.js +1 -0
- package/package.json +109 -0
- package/server/agent-cron-migrator.ts +85 -0
- package/server/agent-executor.ts +357 -0
- package/server/agent-store.ts +185 -0
- package/server/agent-timeout.ts +107 -0
- package/server/agent-types.ts +122 -0
- package/server/ai-validation-settings.ts +37 -0
- package/server/ai-validator.ts +181 -0
- package/server/anthropic-provider-migration.ts +48 -0
- package/server/assistant-store.ts +272 -0
- package/server/auth-manager.ts +150 -0
- package/server/auto-approve.ts +153 -0
- package/server/auto-namer.ts +36 -0
- package/server/backend-adapter.ts +54 -0
- package/server/cache-headers.ts +61 -0
- package/server/calendar-service.ts +434 -0
- package/server/claude-adapter.ts +889 -0
- package/server/claude-container-auth.ts +30 -0
- package/server/claude-session-discovery.ts +157 -0
- package/server/claude-session-history.ts +410 -0
- package/server/cli-launcher.ts +1303 -0
- package/server/codex-adapter.ts +3027 -0
- package/server/codex-container-auth.ts +24 -0
- package/server/codex-home.ts +27 -0
- package/server/codex-ws-proxy.cjs +226 -0
- package/server/commands-discovery.ts +81 -0
- package/server/constants.ts +7 -0
- package/server/container-manager.ts +1053 -0
- package/server/cost-tracker.ts +222 -0
- package/server/cron-scheduler.ts +243 -0
- package/server/cron-store.ts +148 -0
- package/server/cron-types.ts +63 -0
- package/server/email-service.ts +354 -0
- package/server/env-manager.ts +161 -0
- package/server/event-bus-types.ts +75 -0
- package/server/event-bus.ts +124 -0
- package/server/execution-store.ts +170 -0
- package/server/federation/node-connection.ts +190 -0
- package/server/federation/node-manager.ts +366 -0
- package/server/federation/node-store.ts +86 -0
- package/server/federation/node-types.ts +121 -0
- package/server/fs-utils.ts +15 -0
- package/server/git-utils.ts +421 -0
- package/server/github-pr.ts +379 -0
- package/server/google-media.ts +342 -0
- package/server/image-pull-manager.ts +279 -0
- package/server/index.ts +491 -0
- package/server/internal-ai.ts +237 -0
- package/server/kill-switch.ts +99 -0
- package/server/llm-providers.ts +342 -0
- package/server/logger.ts +259 -0
- package/server/mcp-registry.ts +401 -0
- package/server/message-bus.ts +271 -0
- package/server/message-delivery.ts +128 -0
- package/server/metrics-collector.ts +350 -0
- package/server/metrics-types.ts +108 -0
- package/server/middleware/managed-auth.ts +195 -0
- package/server/novnc-proxy.ts +99 -0
- package/server/path-resolver.ts +186 -0
- package/server/paths.ts +13 -0
- package/server/pr-poller.ts +162 -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/provider-manager.ts +111 -0
- package/server/provider-registry.ts +393 -0
- package/server/push-notifications.ts +221 -0
- package/server/recorder.ts +374 -0
- package/server/recording-hub/compat-validator.ts +284 -0
- package/server/recording-hub/diagnostics.ts +299 -0
- package/server/recording-hub/hub-config.ts +19 -0
- package/server/recording-hub/hub-routes.ts +236 -0
- package/server/recording-hub/hub-store.ts +265 -0
- package/server/recording-hub/replay-adapter.ts +207 -0
- package/server/relay-client.ts +320 -0
- package/server/reminder-scheduler.ts +38 -0
- package/server/replay.ts +78 -0
- package/server/routes/agent-routes.ts +264 -0
- package/server/routes/assistant-routes.ts +90 -0
- package/server/routes/cron-routes.ts +103 -0
- package/server/routes/env-routes.ts +95 -0
- package/server/routes/federation-routes.ts +76 -0
- package/server/routes/fs-routes.ts +622 -0
- package/server/routes/git-routes.ts +97 -0
- package/server/routes/llm-routes.ts +166 -0
- package/server/routes/media-routes.ts +135 -0
- package/server/routes/metrics-routes.ts +13 -0
- package/server/routes/platform-routes.ts +1379 -0
- package/server/routes/prompt-routes.ts +67 -0
- package/server/routes/provider-routes.ts +109 -0
- package/server/routes/sandbox-routes.ts +127 -0
- package/server/routes/settings-routes.ts +285 -0
- package/server/routes/skills-routes.ts +100 -0
- package/server/routes/socialmedia-routes.ts +208 -0
- package/server/routes/system-routes.ts +228 -0
- package/server/routes/tailscale-routes.ts +22 -0
- package/server/routes/telephony-routes.ts +259 -0
- package/server/routes.ts +1379 -0
- package/server/sandbox-manager.ts +168 -0
- package/server/service.ts +718 -0
- package/server/session-creation-service.ts +457 -0
- package/server/session-git-info.ts +104 -0
- package/server/session-names.ts +67 -0
- package/server/session-orchestrator.ts +824 -0
- package/server/session-state-machine.ts +207 -0
- package/server/session-store.ts +146 -0
- package/server/session-types.ts +511 -0
- package/server/settings-manager.ts +149 -0
- package/server/shared-context.ts +157 -0
- package/server/socialmedia/adapter.ts +15 -0
- package/server/socialmedia/adapters/ayrshare-adapter.ts +169 -0
- package/server/socialmedia/adapters/buffer-adapter.ts +299 -0
- package/server/socialmedia/adapters/postiz-adapter.ts +298 -0
- package/server/socialmedia/manager.ts +227 -0
- package/server/socialmedia/store.ts +98 -0
- package/server/socialmedia/types.ts +89 -0
- package/server/tailscale-manager.ts +451 -0
- package/server/telephony/audio-bridge.ts +331 -0
- package/server/telephony/call-manager.ts +457 -0
- package/server/telephony/call-types.ts +108 -0
- package/server/telephony/telephony-store.ts +119 -0
- package/server/terminal-manager.ts +240 -0
- package/server/update-checker.ts +192 -0
- package/server/usage-limits.ts +225 -0
- package/server/web-push.d.ts +51 -0
- package/server/worktree-tracker.ts +84 -0
- package/server/ws-auth.ts +41 -0
- package/server/ws-bridge-browser-ingest.ts +72 -0
- package/server/ws-bridge-browser.ts +112 -0
- package/server/ws-bridge-cli-ingest.ts +81 -0
- package/server/ws-bridge-codex.ts +266 -0
- package/server/ws-bridge-controls.ts +20 -0
- package/server/ws-bridge-persist.ts +66 -0
- package/server/ws-bridge-publish.ts +79 -0
- package/server/ws-bridge-replay.ts +61 -0
- package/server/ws-bridge-types.ts +121 -0
- 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
|
+
}
|