@miriad-systems/backend 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/dist/cli.js ADDED
@@ -0,0 +1,203 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Local Runtime CLI
4
+ *
5
+ * Run CAST agents on your local machine.
6
+ *
7
+ * Commands:
8
+ * auth <connection-string> - Authenticate with CAST
9
+ * start [--name <name>] - Start the runtime
10
+ * status - Show runtime status
11
+ * agents - List active agents
12
+ */
13
+ import { RuntimeClient } from './runtime-client.js';
14
+ import { loadConfig, initFromConnectionString, getConfigPath, } from './config.js';
15
+ // =============================================================================
16
+ // Help Text
17
+ // =============================================================================
18
+ const HELP = `
19
+ Miriad Backend - Run CAST agents on your local machine
20
+
21
+ Usage:
22
+ npx @miriad-systems/backend auth <connection-string> Authenticate with CAST
23
+ npx @miriad-systems/backend start [options] Start the runtime
24
+ npx @miriad-systems/backend status Show runtime status
25
+ npx @miriad-systems/backend agents List active agents
26
+ npx @miriad-systems/backend help Show this help message
27
+
28
+ Commands:
29
+ auth <connection-string>
30
+ Authenticate with CAST using a connection string from the UI.
31
+ Example: npx @miriad-systems/backend auth "cast://bst_xxx@api.cast.dev/space_abc"
32
+
33
+ start [--name <name>]
34
+ Start the runtime and connect to CAST.
35
+ Options:
36
+ --name <name> Runtime name (default: hostname)
37
+
38
+ status
39
+ Show the runtime configuration and connection status.
40
+
41
+ agents
42
+ List all active agents on this runtime.
43
+
44
+ Configuration:
45
+ Config is stored at: ~/.config/miriad/config.json
46
+
47
+ Environment Variables:
48
+ ANTHROPIC_API_KEY Required for Claude Agent SDK
49
+ `;
50
+ // =============================================================================
51
+ // Commands
52
+ // =============================================================================
53
+ async function cmdAuth(args) {
54
+ const connectionString = args[0];
55
+ if (!connectionString) {
56
+ console.error('Error: Connection string required');
57
+ console.error('Usage: npx @miriad-systems/backend auth "cast://bst_xxx@api.cast.dev/space_abc"');
58
+ process.exit(1);
59
+ }
60
+ // Check for --name flag
61
+ let name;
62
+ const nameIdx = args.indexOf('--name');
63
+ if (nameIdx !== -1 && args[nameIdx + 1]) {
64
+ name = args[nameIdx + 1];
65
+ }
66
+ try {
67
+ await initFromConnectionString(connectionString, name);
68
+ console.log('\nAuthentication successful!');
69
+ console.log('Run "npx @miriad-systems/backend start" to connect.');
70
+ }
71
+ catch (error) {
72
+ console.error('Authentication failed:', error.message);
73
+ process.exit(1);
74
+ }
75
+ }
76
+ async function cmdStart(args) {
77
+ // Validate API key
78
+ if (!process.env.ANTHROPIC_API_KEY) {
79
+ console.error('Error: ANTHROPIC_API_KEY environment variable is required');
80
+ process.exit(1);
81
+ }
82
+ // Load config
83
+ const config = await loadConfig();
84
+ if (!config) {
85
+ console.error('Error: Not authenticated. Run "npx @miriad-systems/backend auth" first.');
86
+ process.exit(1);
87
+ }
88
+ // Check for --name flag to override
89
+ const nameIdx = args.indexOf('--name');
90
+ if (nameIdx !== -1 && args[nameIdx + 1]) {
91
+ config.name = args[nameIdx + 1];
92
+ }
93
+ console.log('Starting local runtime...');
94
+ console.log(` Runtime: ${config.name} (${config.credentials.runtimeId})`);
95
+ console.log(` Space: ${config.spaceId}`);
96
+ console.log(` Workspace: ${config.workspace.basePath}`);
97
+ console.log();
98
+ // Create and connect runtime client
99
+ const client = new RuntimeClient({
100
+ config,
101
+ onConnected: () => {
102
+ console.log('Runtime ready. Waiting for agents...');
103
+ },
104
+ onDisconnected: (code, reason) => {
105
+ console.log(`Disconnected: ${code} ${reason}`);
106
+ },
107
+ onError: () => {
108
+ // Error already logged by RuntimeClient with clean formatting
109
+ },
110
+ });
111
+ // Handle shutdown signals
112
+ const shutdown = async () => {
113
+ console.log('\nShutting down...');
114
+ await client.disconnect();
115
+ process.exit(0);
116
+ };
117
+ process.on('SIGINT', shutdown);
118
+ process.on('SIGTERM', shutdown);
119
+ try {
120
+ await client.connect();
121
+ // Keep process alive
122
+ console.log('Press Ctrl+C to stop.');
123
+ }
124
+ catch {
125
+ // Error already logged by RuntimeClient
126
+ // Don't exit - let reconnection handle it
127
+ }
128
+ }
129
+ async function cmdStatus() {
130
+ const config = await loadConfig();
131
+ if (!config) {
132
+ console.log('Status: Not configured');
133
+ console.log(`Config file: ${getConfigPath()}`);
134
+ console.log('\nRun "npx @miriad-systems/backend auth" to configure.');
135
+ return;
136
+ }
137
+ console.log('Local Runtime Status');
138
+ console.log('====================');
139
+ console.log();
140
+ console.log(`Runtime ID: ${config.credentials.runtimeId}`);
141
+ console.log(`Runtime Name: ${config.name}`);
142
+ console.log(`Space: ${config.spaceId}`);
143
+ console.log(`Server: ${config.credentials.serverId}`);
144
+ console.log(`API URL: ${config.credentials.apiUrl}`);
145
+ console.log(`WebSocket URL: ${config.credentials.wsUrl}`);
146
+ console.log(`Workspace: ${config.workspace.basePath}`);
147
+ console.log(`Configured: ${config.createdAt}`);
148
+ console.log();
149
+ console.log(`Config file: ${getConfigPath()}`);
150
+ console.log();
151
+ console.log('Note: To see active agents, start the runtime and check the UI.');
152
+ }
153
+ async function cmdAgents() {
154
+ const config = await loadConfig();
155
+ if (!config) {
156
+ console.error('Error: Not configured. Run "npx @miriad-systems/backend auth" first.');
157
+ process.exit(1);
158
+ }
159
+ console.log('Active Agents');
160
+ console.log('=============');
161
+ console.log();
162
+ console.log('Note: This command shows agents only when the runtime is running.');
163
+ console.log('Use "npx @miriad-systems/backend start" to start the runtime first.');
164
+ console.log();
165
+ console.log('To see agent status, check the CAST UI or runtime logs.');
166
+ }
167
+ function cmdHelp() {
168
+ console.log(HELP);
169
+ }
170
+ // =============================================================================
171
+ // Main
172
+ // =============================================================================
173
+ async function main() {
174
+ const args = process.argv.slice(2);
175
+ const command = args[0];
176
+ if (!command || command === 'help' || command === '--help' || command === '-h') {
177
+ cmdHelp();
178
+ process.exit(0);
179
+ }
180
+ switch (command) {
181
+ case 'auth':
182
+ await cmdAuth(args.slice(1));
183
+ break;
184
+ case 'start':
185
+ await cmdStart(args.slice(1));
186
+ break;
187
+ case 'status':
188
+ await cmdStatus();
189
+ break;
190
+ case 'agents':
191
+ await cmdAgents();
192
+ break;
193
+ default:
194
+ console.error(`Unknown command: ${command}`);
195
+ console.error('Run "npx @miriad-systems/backend help" for usage.');
196
+ process.exit(1);
197
+ }
198
+ }
199
+ main().catch((error) => {
200
+ console.error('Fatal error:', error);
201
+ process.exit(1);
202
+ });
203
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Configuration Module
3
+ *
4
+ * Handles reading/writing runtime config from ~/.config/miriad/config.json
5
+ * and API interactions for bootstrap exchange.
6
+ */
7
+ import type { RuntimeConfig, BootstrapResponse, ParsedConnectionString } from './types.js';
8
+ export declare function getApiProtocol(host: string): 'http' | 'https';
9
+ export declare function getWsProtocol(host: string): 'ws' | 'wss';
10
+ /**
11
+ * Parse a CAST connection string.
12
+ * Format: cast://<token>@<host>/<spaceId>
13
+ * Example: cast://bst_abc123@api.cast.dev/space_xyz
14
+ */
15
+ export declare function parseConnectionString(connectionString: string): ParsedConnectionString;
16
+ /**
17
+ * Load runtime config from disk.
18
+ * Returns null if no config file exists.
19
+ * Expands tilde (~) in workspace.basePath.
20
+ */
21
+ export declare function loadConfig(): Promise<RuntimeConfig | null>;
22
+ /**
23
+ * Save runtime config to disk.
24
+ */
25
+ export declare function saveConfig(config: RuntimeConfig): Promise<void>;
26
+ /**
27
+ * Delete stored config.
28
+ */
29
+ export declare function deleteConfig(): Promise<void>;
30
+ /**
31
+ * Get config file path (for display).
32
+ */
33
+ export declare function getConfigPath(): string;
34
+ /**
35
+ * Generate a ULID for message/frame IDs.
36
+ * Uses the standard ulid library which maintains monotonicity within the same
37
+ * millisecond (increments random portion instead of generating new random).
38
+ */
39
+ export declare function generateId(): string;
40
+ /**
41
+ * Generate a runtime ID (rt_ prefix).
42
+ * Uses ULID for the unique portion, truncated to fit VARCHAR(26) column.
43
+ * Format: rt_ (3 chars) + 23 char ULID fragment = 26 chars
44
+ */
45
+ export declare function generateRuntimeId(): string;
46
+ /**
47
+ * Exchange a bootstrap token for server credentials.
48
+ */
49
+ export declare function exchangeBootstrapToken(host: string, bootstrapToken: string): Promise<BootstrapResponse>;
50
+ /**
51
+ * Initialize runtime config from a connection string.
52
+ * Parses the string, exchanges the bootstrap token, generates runtimeId,
53
+ * and saves config.
54
+ */
55
+ export declare function initFromConnectionString(connectionString: string, runtimeName?: string): Promise<RuntimeConfig>;
56
+ export declare function getMachineInfo(): {
57
+ os: string;
58
+ hostname: string;
59
+ };
60
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAyD3F,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAE7D;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,KAAK,CAExD;AAMD;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,gBAAgB,EAAE,MAAM,GAAG,sBAAsB,CAWtF;AAMD;;;;GAIG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAehE;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAGrE;AAED;;GAEG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAQlD;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAMD;;;;GAIG;AACH,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAG1C;AAMD;;GAEG;AACH,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,MAAM,EACZ,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,iBAAiB,CAAC,CAwB5B;AAMD;;;;GAIG;AACH,wBAAsB,wBAAwB,CAC5C,gBAAgB,EAAE,MAAM,EACxB,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,aAAa,CAAC,CA0CxB;AAMD,wBAAgB,cAAc,IAAI;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAKjE"}
package/dist/config.js ADDED
@@ -0,0 +1,221 @@
1
+ /**
2
+ * Configuration Module
3
+ *
4
+ * Handles reading/writing runtime config from ~/.config/miriad/config.json
5
+ * and API interactions for bootstrap exchange.
6
+ */
7
+ import { mkdir, readFile, writeFile, unlink } from 'node:fs/promises';
8
+ import { homedir, hostname, platform } from 'node:os';
9
+ import { dirname, join } from 'node:path';
10
+ import { ulid } from 'ulid';
11
+ // =============================================================================
12
+ // Configuration Paths
13
+ // =============================================================================
14
+ const CONFIG_DIR = join(homedir(), '.config', 'miriad');
15
+ const CONFIG_FILE = join(CONFIG_DIR, 'config.json');
16
+ const DEFAULT_WORKSPACE_BASE = '/tmp/cast-agents';
17
+ /**
18
+ * Expand tilde (~) to home directory in paths.
19
+ */
20
+ function expandTilde(path) {
21
+ if (path.startsWith('~/')) {
22
+ return join(homedir(), path.slice(2));
23
+ }
24
+ if (path === '~') {
25
+ return homedir();
26
+ }
27
+ return path;
28
+ }
29
+ function detectEnvironment(host) {
30
+ const hostLower = host.toLowerCase();
31
+ if (hostLower.includes('localhost') || hostLower.startsWith('127.')) {
32
+ return 'local';
33
+ }
34
+ if (hostLower.includes('staging')) {
35
+ return 'staging';
36
+ }
37
+ return 'production';
38
+ }
39
+ function getEnvironmentConfig(env) {
40
+ switch (env) {
41
+ case 'local':
42
+ return { apiProtocol: 'http', wsProtocol: 'ws' };
43
+ case 'staging':
44
+ case 'production':
45
+ default:
46
+ return { apiProtocol: 'https', wsProtocol: 'wss' };
47
+ }
48
+ }
49
+ export function getApiProtocol(host) {
50
+ return getEnvironmentConfig(detectEnvironment(host)).apiProtocol;
51
+ }
52
+ export function getWsProtocol(host) {
53
+ return getEnvironmentConfig(detectEnvironment(host)).wsProtocol;
54
+ }
55
+ // =============================================================================
56
+ // Connection String Parsing
57
+ // =============================================================================
58
+ /**
59
+ * Parse a CAST connection string.
60
+ * Format: cast://<token>@<host>/<spaceId>
61
+ * Example: cast://bst_abc123@api.cast.dev/space_xyz
62
+ */
63
+ export function parseConnectionString(connectionString) {
64
+ const match = connectionString.match(/^cast:\/\/([^@]+)@([^/]+)\/(.+)$/);
65
+ if (!match) {
66
+ throw new Error(`Invalid connection string format. Expected: cast://<token>@<host>/<spaceId>`);
67
+ }
68
+ const [, bootstrapToken, host, spaceId] = match;
69
+ return { host, bootstrapToken, spaceId };
70
+ }
71
+ // =============================================================================
72
+ // Config Storage
73
+ // =============================================================================
74
+ /**
75
+ * Load runtime config from disk.
76
+ * Returns null if no config file exists.
77
+ * Expands tilde (~) in workspace.basePath.
78
+ */
79
+ export async function loadConfig() {
80
+ try {
81
+ const content = await readFile(CONFIG_FILE, 'utf-8');
82
+ const config = JSON.parse(content);
83
+ // Expand tilde in workspace basePath
84
+ if (config.workspace?.basePath) {
85
+ config.workspace.basePath = expandTilde(config.workspace.basePath);
86
+ }
87
+ return config;
88
+ }
89
+ catch (error) {
90
+ if (error.code === 'ENOENT') {
91
+ return null;
92
+ }
93
+ throw error;
94
+ }
95
+ }
96
+ /**
97
+ * Save runtime config to disk.
98
+ */
99
+ export async function saveConfig(config) {
100
+ await mkdir(dirname(CONFIG_FILE), { recursive: true });
101
+ await writeFile(CONFIG_FILE, JSON.stringify(config, null, 2), { mode: 0o600 });
102
+ }
103
+ /**
104
+ * Delete stored config.
105
+ */
106
+ export async function deleteConfig() {
107
+ try {
108
+ await unlink(CONFIG_FILE);
109
+ }
110
+ catch (error) {
111
+ if (error.code !== 'ENOENT') {
112
+ throw error;
113
+ }
114
+ }
115
+ }
116
+ /**
117
+ * Get config file path (for display).
118
+ */
119
+ export function getConfigPath() {
120
+ return CONFIG_FILE;
121
+ }
122
+ // =============================================================================
123
+ // ULID Generation
124
+ // =============================================================================
125
+ /**
126
+ * Generate a ULID for message/frame IDs.
127
+ * Uses the standard ulid library which maintains monotonicity within the same
128
+ * millisecond (increments random portion instead of generating new random).
129
+ */
130
+ export function generateId() {
131
+ return ulid();
132
+ }
133
+ /**
134
+ * Generate a runtime ID (rt_ prefix).
135
+ * Uses ULID for the unique portion, truncated to fit VARCHAR(26) column.
136
+ * Format: rt_ (3 chars) + 23 char ULID fragment = 26 chars
137
+ */
138
+ export function generateRuntimeId() {
139
+ // Take first 23 chars of ULID to fit in 26 char limit with rt_ prefix
140
+ return `rt_${ulid().substring(0, 23)}`;
141
+ }
142
+ // =============================================================================
143
+ // API Interactions
144
+ // =============================================================================
145
+ /**
146
+ * Exchange a bootstrap token for server credentials.
147
+ */
148
+ export async function exchangeBootstrapToken(host, bootstrapToken) {
149
+ const protocol = getApiProtocol(host);
150
+ const url = `${protocol}://${host}/api/runtimes/auth/bootstrap`;
151
+ const response = await fetch(url, {
152
+ method: 'POST',
153
+ headers: { 'Content-Type': 'application/json' },
154
+ body: JSON.stringify({ bootstrapToken }),
155
+ });
156
+ if (!response.ok) {
157
+ if (response.status === 400) {
158
+ throw new Error('Invalid bootstrap token format.');
159
+ }
160
+ if (response.status === 401) {
161
+ throw new Error('Bootstrap token is invalid or expired.');
162
+ }
163
+ if (response.status === 409) {
164
+ throw new Error('Bootstrap token has already been used.');
165
+ }
166
+ throw new Error(`Bootstrap exchange failed: ${response.statusText}`);
167
+ }
168
+ return (await response.json());
169
+ }
170
+ // =============================================================================
171
+ // Auth Flow
172
+ // =============================================================================
173
+ /**
174
+ * Initialize runtime config from a connection string.
175
+ * Parses the string, exchanges the bootstrap token, generates runtimeId,
176
+ * and saves config.
177
+ */
178
+ export async function initFromConnectionString(connectionString, runtimeName) {
179
+ const parsed = parseConnectionString(connectionString);
180
+ console.log(`Connecting to ${parsed.host}...`);
181
+ // Exchange bootstrap token for credentials
182
+ const response = await exchangeBootstrapToken(parsed.host, parsed.bootstrapToken);
183
+ // Generate stable runtime ID
184
+ const runtimeId = generateRuntimeId();
185
+ // Determine runtime name
186
+ const name = runtimeName ?? hostname();
187
+ // Build API and WS URLs
188
+ const apiProtocol = getApiProtocol(response.host);
189
+ const wsProtocol = getWsProtocol(response.wsHost);
190
+ const config = {
191
+ spaceId: response.spaceId,
192
+ name,
193
+ credentials: {
194
+ runtimeId,
195
+ serverId: response.serverId,
196
+ secret: response.secret,
197
+ apiUrl: `${apiProtocol}://${response.host}`,
198
+ wsUrl: `${wsProtocol}://${response.wsHost}`,
199
+ },
200
+ workspace: {
201
+ basePath: DEFAULT_WORKSPACE_BASE,
202
+ },
203
+ createdAt: new Date().toISOString(),
204
+ };
205
+ await saveConfig(config);
206
+ console.log(`Config saved to ${CONFIG_FILE}`);
207
+ console.log(`Runtime ID: ${config.credentials.runtimeId}`);
208
+ console.log(`Runtime name: ${config.name}`);
209
+ console.log(`Space: ${config.spaceId}`);
210
+ return config;
211
+ }
212
+ // =============================================================================
213
+ // Machine Info
214
+ // =============================================================================
215
+ export function getMachineInfo() {
216
+ return {
217
+ os: platform(),
218
+ hostname: hostname(),
219
+ };
220
+ }
221
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * @miriad-systems/backend
3
+ *
4
+ * Run CAST agents on your local machine.
5
+ */
6
+ export { RuntimeClient, type RuntimeClientConfig, type RuntimeStatus } from './runtime-client.js';
7
+ export { AgentManager, type AgentManagerConfig, parseAgentId } from './agent-manager.js';
8
+ export { TymbalBridge, type TymbalBridgeConfig } from './tymbal-bridge.js';
9
+ export { loadConfig, saveConfig, deleteConfig, getConfigPath, initFromConnectionString, parseConnectionString, generateId, generateRuntimeId, getMachineInfo, getApiProtocol, getWsProtocol, } from './config.js';
10
+ export * from './types.js';
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,aAAa,EAAE,KAAK,mBAAmB,EAAE,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAClG,OAAO,EAAE,YAAY,EAAE,KAAK,kBAAkB,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACzF,OAAO,EAAE,YAAY,EAAE,KAAK,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC3E,OAAO,EACL,UAAU,EACV,UAAU,EACV,YAAY,EACZ,aAAa,EACb,wBAAwB,EACxB,qBAAqB,EACrB,UAAU,EACV,iBAAiB,EACjB,cAAc,EACd,cAAc,EACd,aAAa,GACd,MAAM,aAAa,CAAC;AACrB,cAAc,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,11 @@
1
+ /**
2
+ * @miriad-systems/backend
3
+ *
4
+ * Run CAST agents on your local machine.
5
+ */
6
+ export { RuntimeClient } from './runtime-client.js';
7
+ export { AgentManager, parseAgentId } from './agent-manager.js';
8
+ export { TymbalBridge } from './tymbal-bridge.js';
9
+ export { loadConfig, saveConfig, deleteConfig, getConfigPath, initFromConnectionString, parseConnectionString, generateId, generateRuntimeId, getMachineInfo, getApiProtocol, getWsProtocol, } from './config.js';
10
+ export * from './types.js';
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,aAAa,EAAgD,MAAM,qBAAqB,CAAC;AAClG,OAAO,EAAE,YAAY,EAA2B,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACzF,OAAO,EAAE,YAAY,EAA2B,MAAM,oBAAoB,CAAC;AAC3E,OAAO,EACL,UAAU,EACV,UAAU,EACV,YAAY,EACZ,aAAa,EACb,wBAAwB,EACxB,qBAAqB,EACrB,UAAU,EACV,iBAAiB,EACjB,cAAc,EACd,cAAc,EACd,aAAa,GACd,MAAM,aAAa,CAAC;AACrB,cAAc,YAAY,CAAC"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Runtime Client
3
+ *
4
+ * Manages the WebSocket connection to the CAST backend.
5
+ * Handles the LocalRuntime protocol: authentication, message routing,
6
+ * and agent lifecycle coordination.
7
+ */
8
+ import { AgentManager } from './agent-manager.js';
9
+ import type { RuntimeConfig } from './types.js';
10
+ export interface RuntimeClientConfig {
11
+ config: RuntimeConfig;
12
+ onConnected?: () => void;
13
+ onDisconnected?: (code: number, reason: string) => void;
14
+ onError?: (error: Error) => void;
15
+ }
16
+ export type RuntimeStatus = 'disconnected' | 'connecting' | 'connected' | 'ready';
17
+ export declare class RuntimeClient {
18
+ private readonly runtimeConfig;
19
+ private readonly agentManager;
20
+ private ws;
21
+ private status;
22
+ private reconnectAttempts;
23
+ private reconnectTimeout;
24
+ private heartbeatInterval;
25
+ /** Heartbeat interval in milliseconds (30 seconds) */
26
+ private static readonly HEARTBEAT_INTERVAL_MS;
27
+ private readonly onConnected?;
28
+ private readonly onDisconnected?;
29
+ private readonly onError?;
30
+ constructor(config: RuntimeClientConfig);
31
+ /**
32
+ * Get current runtime status.
33
+ */
34
+ getStatus(): RuntimeStatus;
35
+ /**
36
+ * Get agent manager for status queries.
37
+ */
38
+ getAgentManager(): AgentManager;
39
+ /**
40
+ * Connect to the backend.
41
+ */
42
+ connect(): Promise<void>;
43
+ /**
44
+ * Disconnect from the backend.
45
+ */
46
+ disconnect(): Promise<void>;
47
+ private handleMessage;
48
+ private handleActivate;
49
+ private handleDeliverMessage;
50
+ private handleSuspend;
51
+ private send;
52
+ private sendRuntimeReady;
53
+ private sendCheckin;
54
+ private sendFrame;
55
+ private sendPong;
56
+ /**
57
+ * Re-checkin all active agents after reconnection.
58
+ * This notifies the backend about agents that survived the disconnect.
59
+ */
60
+ private reCheckinActiveAgents;
61
+ /**
62
+ * Start periodic heartbeat for all online agents.
63
+ */
64
+ private startHeartbeatInterval;
65
+ /**
66
+ * Stop the heartbeat interval.
67
+ */
68
+ private stopHeartbeatInterval;
69
+ /**
70
+ * Send heartbeats for all online agents.
71
+ */
72
+ private sendHeartbeats;
73
+ /**
74
+ * Format common connection errors into clean single-line messages.
75
+ * Returns null for unexpected errors that should show full stack trace.
76
+ */
77
+ private formatConnectionError;
78
+ private scheduleReconnect;
79
+ }
80
+ //# sourceMappingURL=runtime-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-client.d.ts","sourceRoot":"","sources":["../src/runtime-client.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,OAAO,KAAK,EACV,aAAa,EAWd,MAAM,YAAY,CAAC;AAMpB,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,aAAa,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;IACzB,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACxD,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAClC;AAED,MAAM,MAAM,aAAa,GAAG,cAAc,GAAG,YAAY,GAAG,WAAW,GAAG,OAAO,CAAC;AAMlF,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;IAC9C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAe;IAE5C,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,MAAM,CAAiC;IAC/C,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,gBAAgB,CAA8C;IACtE,OAAO,CAAC,iBAAiB,CAA+C;IAExE,sDAAsD;IACtD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,qBAAqB,CAAS;IAEtD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAa;IAC1C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAyC;IACzE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAyB;gBAEtC,MAAM,EAAE,mBAAmB;IAiBvC;;OAEG;IACH,SAAS,IAAI,aAAa;IAI1B;;OAEG;IACH,eAAe,IAAI,YAAY;IAI/B;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IA0D9B;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAwBjC,OAAO,CAAC,aAAa;YA8CP,cAAc;YAKd,oBAAoB;YAKpB,aAAa;IAS3B,OAAO,CAAC,IAAI;IAQZ,OAAO,CAAC,gBAAgB;IAgBxB,OAAO,CAAC,WAAW;IASnB,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,QAAQ;IAQhB;;;OAGG;IACH,OAAO,CAAC,qBAAqB;IAmB7B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAW9B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAQ7B;;OAEG;IACH,OAAO,CAAC,cAAc;IAqBtB;;;OAGG;IACH,OAAO,CAAC,qBAAqB;IA+C7B,OAAO,CAAC,iBAAiB;CAmB1B"}