@kraki/head 0.1.0 → 0.2.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 ADDED
@@ -0,0 +1,84 @@
1
+ <p align="center">
2
+ <a href="https://github.com/corelli18512/kraki">
3
+ <img src="https://raw.githubusercontent.com/corelli18512/kraki/main/logo.png" alt="Kraki" width="140">
4
+ </a>
5
+ </p>
6
+
7
+ <p align="center">
8
+ <a href="https://github.com/corelli18512/kraki">GitHub repository</a>
9
+ </p>
10
+
11
+ # @kraki/head
12
+
13
+ Thin encrypted relay that forwards messages between tentacles and apps.
14
+
15
+ > Preview: `@kraki/head` is still early-stage. Expect breaking changes while the hosted and self-hosted flows stabilize.
16
+
17
+ Use `@kraki/head` when you want to self-host the Kraki relay instead of using the hosted default.
18
+
19
+ ## Install
20
+
21
+ Run it once with `npx`:
22
+
23
+ ```bash
24
+ npx @kraki/head
25
+ ```
26
+
27
+ Or install it globally:
28
+
29
+ ```bash
30
+ npm i -g @kraki/head
31
+ kraki-relay
32
+ ```
33
+
34
+ ## Quick start
35
+
36
+ Start a local relay:
37
+
38
+ ```bash
39
+ npx @kraki/head
40
+ ```
41
+
42
+ By default the relay listens on `ws://localhost:4000` and stores user/device data in `kraki-head.db`.
43
+
44
+ Enable GitHub login for the web app:
45
+
46
+ ```bash
47
+ GITHUB_CLIENT_ID=your_client_id \
48
+ GITHUB_CLIENT_SECRET=your_client_secret \
49
+ npx @kraki/head --auth github
50
+ ```
51
+
52
+ ## What the relay does
53
+
54
+ The relay has three jobs:
55
+
56
+ 1. **Authenticate** — verify device identity on connect
57
+ 2. **Forward blobs** — route unicast and broadcast envelopes to the right WebSocket connections
58
+ 3. **Track identity** — maintain users and devices tables
59
+
60
+ It stores no messages, no sessions, and no content. All message bodies are encrypted blobs that the relay cannot read.
61
+
62
+ ## Useful options
63
+
64
+ ```bash
65
+ kraki-relay --port 8080
66
+ kraki-relay --db /path/to/kraki-head.db
67
+ kraki-relay --auth open
68
+ kraki-relay --auth github
69
+ kraki-relay --log debug
70
+ ```
71
+
72
+ ## Auth methods
73
+
74
+ The relay supports multiple authentication methods as a discriminated union: `github_token`, `github_oauth`, `pairing`, `challenge`, `apikey`, and `open`.
75
+
76
+ ## Package naming
77
+
78
+ - `@kraki/head` installs the `kraki-relay` CLI
79
+ - `@kraki/tentacle` installs the `kraki` CLI
80
+
81
+ ## Links
82
+
83
+ - Main docs: `https://github.com/corelli18512/kraki/blob/main/README.md`
84
+ - Security model: `https://github.com/corelli18512/kraki/blob/main/SECURITY.md`
package/dist/cli.d.ts CHANGED
@@ -5,13 +5,11 @@
5
5
  * Usage:
6
6
  * npx @kraki/head
7
7
  * npx @kraki/head --port 8080
8
- * npx @kraki/head --auth github --e2e true
9
8
  *
10
9
  * Environment variables:
11
10
  * PORT Server port (default: 4000)
12
11
  * DB_PATH SQLite database path (default: kraki-head.db)
13
12
  * AUTH_MODE Auth mode: open | github | apikey (default: open)
14
- * E2E_MODE Enable E2E encryption: true | false (default: false)
15
13
  * API_KEY API key for apikey auth mode
16
14
  * GITHUB_CLIENT_ID GitHub OAuth App client ID (for web login)
17
15
  * GITHUB_CLIENT_SECRET GitHub OAuth App client secret (for web login)
package/dist/cli.js CHANGED
@@ -5,13 +5,11 @@
5
5
  * Usage:
6
6
  * npx @kraki/head
7
7
  * npx @kraki/head --port 8080
8
- * npx @kraki/head --auth github --e2e true
9
8
  *
10
9
  * Environment variables:
11
10
  * PORT Server port (default: 4000)
12
11
  * DB_PATH SQLite database path (default: kraki-head.db)
13
12
  * AUTH_MODE Auth mode: open | github | apikey (default: open)
14
- * E2E_MODE Enable E2E encryption: true | false (default: false)
15
13
  * API_KEY API key for apikey auth mode
16
14
  * GITHUB_CLIENT_ID GitHub OAuth App client ID (for web login)
17
15
  * GITHUB_CLIENT_SECRET GitHub OAuth App client secret (for web login)
@@ -19,24 +17,24 @@
19
17
  * LOG_PATH Log file path (optional)
20
18
  */
21
19
  import { config as dotenvConfig } from 'dotenv';
20
+ import { readFileSync } from 'fs';
22
21
  import { resolve, dirname } from 'path';
23
22
  import { fileURLToPath } from 'url';
24
23
  // Load .env from the head package directory (works regardless of cwd)
25
24
  const __dirname = dirname(fileURLToPath(import.meta.url));
26
25
  dotenvConfig({ path: resolve(__dirname, '..', '.env') });
26
+ const pkg = JSON.parse(readFileSync(resolve(__dirname, '..', 'package.json'), 'utf-8'));
27
+ const VERSION = pkg.version;
27
28
  import { createServer } from 'http';
28
29
  import { Storage } from './storage.js';
29
- import { ChannelManager } from './channel-manager.js';
30
- import { Router } from './router.js';
31
30
  import { HeadServer } from './server.js';
32
31
  import { GitHubAuthProvider, OpenAuthProvider, ApiKeyAuthProvider, ThrottledAuthProvider } from './auth.js';
33
32
  import { Logger, setGlobalLogger } from './logger.js';
34
- const VERSION = '0.1.0';
35
33
  // --- CLI flags ---
36
34
  const args = process.argv.slice(2);
37
35
  if (args.includes('--help') || args.includes('-h')) {
38
36
  console.log(`
39
- 🦑 @kraki/head v${VERSION}
37
+ 🦑 @kraki/head v${VERSION} — CLI entry point for the Kraki relay server.
40
38
 
41
39
  Usage: kraki-relay [options]
42
40
 
@@ -44,7 +42,6 @@ if (args.includes('--help') || args.includes('-h')) {
44
42
  --port <n> Server port (default: 4000, env: PORT)
45
43
  --db <path> SQLite database path (default: kraki-head.db, env: DB_PATH)
46
44
  --auth <mode> Auth mode: open | github | apikey (default: open, env: AUTH_MODE)
47
- --e2e <bool> Enable E2E encryption (default: false, env: E2E_MODE)
48
45
  --log <level> Log level: debug | info | warn | error (default: info)
49
46
  --help, -h Show this help
50
47
  --version, -v Show version
@@ -71,7 +68,6 @@ const AUTH_MODES = flag('auth', process.env.AUTH_MODE || 'open').split(',').map(
71
68
  const API_KEY = process.env.API_KEY;
72
69
  const GITHUB_CLIENT_ID = process.env.GITHUB_CLIENT_ID;
73
70
  const GITHUB_CLIENT_SECRET = process.env.GITHUB_CLIENT_SECRET;
74
- const E2E = flag('e2e', process.env.E2E_MODE || 'false') === 'true';
75
71
  const PAIRING = process.env.PAIRING_ENABLED !== 'false'; // default true
76
72
  const LOG_LEVEL = flag('log', process.env.LOG_LEVEL || 'info');
77
73
  const LOG_PATH = process.env.LOG_PATH;
@@ -121,13 +117,10 @@ setGlobalLogger(logger);
121
117
  logger.info('Kraki Head starting...');
122
118
  const authProviders = createAuthProviders();
123
119
  const storage = new Storage(DB_PATH);
124
- const cm = new ChannelManager(storage);
125
- const router = new Router(cm);
126
- const head = new HeadServer(cm, router, {
120
+ const head = new HeadServer(storage, {
127
121
  authProviders,
128
- authModes: AUTH_MODES,
129
- e2e: E2E,
130
122
  pairingEnabled: PAIRING,
123
+ version: VERSION,
131
124
  });
132
125
  const httpServer = createServer((req, res) => {
133
126
  res.writeHead(200, { 'Content-Type': 'application/json' });
@@ -138,7 +131,6 @@ httpServer.listen(PORT, () => {
138
131
  logger.info(`Kraki Head listening on port ${PORT}`, {
139
132
  ws: `ws://localhost:${PORT}`,
140
133
  auth: AUTH_MODES.join(', '),
141
- e2e: E2E,
142
134
  pairing: PAIRING,
143
135
  db: DB_PATH,
144
136
  });
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,6 +1,4 @@
1
1
  export { Storage } from './storage.js';
2
- export { ChannelManager } from './channel-manager.js';
3
- export { Router } from './router.js';
4
2
  export { HeadServer } from './server.js';
5
3
  export type { HeadServerOptions } from './server.js';
6
4
  export { GitHubAuthProvider, OpenAuthProvider, ApiKeyAuthProvider, ThrottledAuthProvider } from './auth.js';
package/dist/index.js CHANGED
@@ -1,6 +1,4 @@
1
1
  export { Storage } from './storage.js';
2
- export { ChannelManager } from './channel-manager.js';
3
- export { Router } from './router.js';
4
2
  export { HeadServer } from './server.js';
5
3
  export { GitHubAuthProvider, OpenAuthProvider, ApiKeyAuthProvider, ThrottledAuthProvider } from './auth.js';
6
4
  export { Logger, getLogger, setGlobalLogger } from './logger.js';
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAE5G,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAE5G,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC"}
package/dist/server.d.ts CHANGED
@@ -1,78 +1,48 @@
1
1
  import { WebSocket } from 'ws';
2
2
  import type { Server } from 'http';
3
- import { ChannelManager } from './channel-manager.js';
4
- import { Router } from './router.js';
3
+ import { Storage } from './storage.js';
5
4
  import type { AuthProvider } from './auth.js';
6
5
  export interface HeadServerOptions {
7
- /** Auth providers keyed by mode name. Falls back to authProvider if set. */
8
6
  authProviders?: Map<string, AuthProvider>;
9
- /** Supported auth mode names (for auth_info response) */
10
- authModes?: string[];
11
- /** Legacy single auth provider (used if authProviders not set) */
12
7
  authProvider?: AuthProvider;
13
- /** Enable E2E encryption mode */
14
- e2e: boolean;
15
- /** Max WebSocket message size in bytes. Default: 10MB */
16
8
  maxPayload?: number;
17
- /** Ping interval in ms. Default: 30000 (30s). Set 0 to disable. */
18
- pingInterval?: number;
19
- /** Pong timeout in ms. Default: 10000 (10s) */
20
- pongTimeout?: number;
21
- /** Allow QR pairing for adding devices. Default: true */
22
9
  pairingEnabled?: boolean;
23
- /** Pairing token TTL in seconds. Default: 300 (5 min) */
24
10
  pairingTtl?: number;
11
+ version?: string;
25
12
  }
26
13
  export declare class HeadServer {
27
14
  private wss;
28
- private cm;
29
- private router;
15
+ private storage;
30
16
  private options;
17
+ private static readonly PING_INTERVAL;
18
+ private connections;
19
+ private pairingTokens;
20
+ private userByDevice;
31
21
  private clients;
32
22
  private pingTimer;
33
- /** Dedup: track recently seen client message IDs to prevent duplicates */
34
- private recentClientMsgIds;
35
- private dedupCleanupTimer;
36
- constructor(cm: ChannelManager, router: Router, options: HeadServerOptions);
37
- /** Resolve the auth provider (multi-provider or legacy single). */
23
+ constructor(storage: Storage, options: HeadServerOptions);
24
+ private startPingInterval;
38
25
  private getAuthProvider;
39
- /** Get supported auth mode names. */
40
- private getAuthModes;
41
- /** Resolve auth provider by mode name (for multi-provider). */
42
26
  private getAuthProviderForMode;
43
- /** Get the GitHub OAuth client ID if configured (for auth_info_response). */
44
27
  private getGitHubClientId;
45
- /** Find the GitHubAuthProvider in the provider chain (unwrapping throttle). */
46
28
  private findGitHubProvider;
47
- /** Resolve the channel owner's user info for auth_ok. */
48
- private getChannelOwnerUser;
49
- /**
50
- * Attach to an HTTP server for upgrade handling.
51
- */
52
29
  attach(server: Server): void;
53
- /**
54
- * Accept a raw WebSocket connection (for testing without HTTP server).
55
- */
56
30
  acceptConnection(ws: WebSocket): void;
57
31
  private onConnection;
58
32
  private onMessage;
59
- private handleCreatePairingToken;
60
- private handleDeleteSession;
61
- /**
62
- * One-shot pairing token request. Validates auth token inline,
63
- * creates a pairing token, responds, and requires no device registration.
64
- */
65
- private handleRequestPairingToken;
33
+ private handleUnicast;
34
+ private handleBroadcast;
35
+ private removeConnection;
36
+ private sendAuthError;
66
37
  private handleAuth;
67
38
  private handlePairingAuth;
68
39
  private handleChallengeResponse;
40
+ private completeAuth;
41
+ private handleCreatePairingToken;
42
+ private handleRequestPairingToken;
43
+ private broadcastDeviceJoined;
44
+ private broadcastDeviceLeft;
45
+ private getDeviceSummaries;
69
46
  private sendError;
70
- private startPingInterval;
71
- private startDedupCleanup;
72
- /** Guard against unbounded dedup set growth */
73
- private trackClientMsgId;
74
- /**
75
- * Close the server and all connections.
76
- */
77
47
  close(): void;
78
48
  }