@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/agent-manager.d.ts +69 -0
- package/dist/agent-manager.d.ts.map +1 -0
- package/dist/agent-manager.js +424 -0
- package/dist/agent-manager.js.map +1 -0
- package/dist/cli.d.ts +14 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +203 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +60 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +221 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/runtime-client.d.ts +80 -0
- package/dist/runtime-client.d.ts.map +1 -0
- package/dist/runtime-client.js +347 -0
- package/dist/runtime-client.js.map +1 -0
- package/dist/tymbal-bridge.d.ts +47 -0
- package/dist/tymbal-bridge.d.ts.map +1 -0
- package/dist/tymbal-bridge.js +283 -0
- package/dist/tymbal-bridge.js.map +1 -0
- package/dist/types.d.ts +181 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/package.json +46 -0
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
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
ADDED
|
@@ -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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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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"}
|