alaska-ai 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 +56 -0
- package/dist/adapters/slack.d.ts +130 -0
- package/dist/adapters/slack.js +1484 -0
- package/dist/adapters/slack.js.map +1 -0
- package/dist/backends/claude.d.ts +78 -0
- package/dist/backends/claude.js +452 -0
- package/dist/backends/claude.js.map +1 -0
- package/dist/backends/codex.d.ts +53 -0
- package/dist/backends/codex.js +324 -0
- package/dist/backends/codex.js.map +1 -0
- package/dist/cli/init.d.ts +50 -0
- package/dist/cli/init.js +386 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/prompt.d.ts +31 -0
- package/dist/cli/prompt.js +145 -0
- package/dist/cli/prompt.js.map +1 -0
- package/dist/cli/start.d.ts +28 -0
- package/dist/cli/start.js +522 -0
- package/dist/cli/start.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +65 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/callbacks.d.ts +32 -0
- package/dist/mcp/callbacks.js +181 -0
- package/dist/mcp/callbacks.js.map +1 -0
- package/dist/mcp/config.d.ts +15 -0
- package/dist/mcp/config.js +22 -0
- package/dist/mcp/config.js.map +1 -0
- package/dist/mcp/entry.d.ts +13 -0
- package/dist/mcp/entry.js +119 -0
- package/dist/mcp/entry.js.map +1 -0
- package/dist/mcp/file-browser.d.ts +15 -0
- package/dist/mcp/file-browser.js +135 -0
- package/dist/mcp/file-browser.js.map +1 -0
- package/dist/mcp/ipc-server.d.ts +64 -0
- package/dist/mcp/ipc-server.js +380 -0
- package/dist/mcp/ipc-server.js.map +1 -0
- package/dist/mcp/preview-server.d.ts +33 -0
- package/dist/mcp/preview-server.js +254 -0
- package/dist/mcp/preview-server.js.map +1 -0
- package/dist/mcp/server.d.ts +51 -0
- package/dist/mcp/server.js +257 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tunnel.d.ts +17 -0
- package/dist/mcp/tunnel.js +154 -0
- package/dist/mcp/tunnel.js.map +1 -0
- package/dist/router.d.ts +113 -0
- package/dist/router.js +511 -0
- package/dist/router.js.map +1 -0
- package/dist/sandbox-policy.d.ts +6 -0
- package/dist/sandbox-policy.js +46 -0
- package/dist/sandbox-policy.js.map +1 -0
- package/dist/scheduler.d.ts +42 -0
- package/dist/scheduler.js +169 -0
- package/dist/scheduler.js.map +1 -0
- package/dist/store.d.ts +95 -0
- package/dist/store.js +353 -0
- package/dist/store.js.map +1 -0
- package/dist/types/adapter.d.ts +50 -0
- package/dist/types/adapter.js +9 -0
- package/dist/types/adapter.js.map +1 -0
- package/dist/types/backend.d.ts +73 -0
- package/dist/types/backend.js +8 -0
- package/dist/types/backend.js.map +1 -0
- package/dist/types/events.d.ts +47 -0
- package/dist/types/events.js +9 -0
- package/dist/types/events.js.map +1 -0
- package/dist/utils.d.ts +59 -0
- package/dist/utils.js +272 -0
- package/dist/utils.js.map +1 -0
- package/package.json +50 -0
|
@@ -0,0 +1,522 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* start 鈥?Launch the bridge process.
|
|
3
|
+
*
|
|
4
|
+
* Reads config from ./, loads tokens from environment,
|
|
5
|
+
* creates the router and messaging adapters, and starts listening.
|
|
6
|
+
* On subsequent interactive runs, shows a settings menu before starting.
|
|
7
|
+
*/
|
|
8
|
+
import * as path from 'node:path';
|
|
9
|
+
import * as fs from 'node:fs';
|
|
10
|
+
import * as clack from '@clack/prompts';
|
|
11
|
+
import { createStore } from '../store.js';
|
|
12
|
+
import { Router } from '../router.js';
|
|
13
|
+
import { CodexBackend } from '../backends/codex.js';
|
|
14
|
+
import { SlackAdapter } from '../adapters/slack.js';
|
|
15
|
+
import { runInit, inputTokens, detectBackend, mergeEnvFile, detectTunnelTools, } from './init.js';
|
|
16
|
+
import { startIpcServer } from '../mcp/ipc-server.js';
|
|
17
|
+
import { createCallbackHandler, closeAllFileBrowsers } from '../mcp/callbacks.js';
|
|
18
|
+
import { closeAllTunnels } from '../mcp/tunnel.js';
|
|
19
|
+
import { closeAllPreviews } from '../mcp/preview-server.js';
|
|
20
|
+
import { getMcpConfig } from '../mcp/config.js';
|
|
21
|
+
import { Scheduler } from '../scheduler.js';
|
|
22
|
+
import { requireSandboxRoot, validateSandboxRoot } from '../sandbox-policy.js';
|
|
23
|
+
/** Get a required setting or throw if not configured. */
|
|
24
|
+
async function requireSetting(store, key) {
|
|
25
|
+
const value = await store.getSetting(key);
|
|
26
|
+
if (!value) {
|
|
27
|
+
throw new Error(`Missing required setting '${key}'. Run the setup wizard first.`);
|
|
28
|
+
}
|
|
29
|
+
return value;
|
|
30
|
+
}
|
|
31
|
+
function normalizePlatforms(rawPlatforms) {
|
|
32
|
+
return rawPlatforms.filter((p) => p === 'slack');
|
|
33
|
+
}
|
|
34
|
+
import { getDbPath, getEnvPath } from '../utils.js';
|
|
35
|
+
function isInteractiveTerminal() {
|
|
36
|
+
return Boolean(process.stdin.isTTY && process.stdout.isTTY);
|
|
37
|
+
}
|
|
38
|
+
/** Load .env.local file into process.env (simple key=value parser). */
|
|
39
|
+
export function loadEnvFile(envPath) {
|
|
40
|
+
const vars = {};
|
|
41
|
+
if (!fs.existsSync(envPath)) {
|
|
42
|
+
return vars;
|
|
43
|
+
}
|
|
44
|
+
const content = fs.readFileSync(envPath, 'utf-8');
|
|
45
|
+
for (const line of content.split('\n')) {
|
|
46
|
+
const trimmed = line.trim();
|
|
47
|
+
if (!trimmed || trimmed.startsWith('#'))
|
|
48
|
+
continue;
|
|
49
|
+
const eqIndex = trimmed.indexOf('=');
|
|
50
|
+
if (eqIndex === -1)
|
|
51
|
+
continue;
|
|
52
|
+
const key = trimmed.substring(0, eqIndex).trim();
|
|
53
|
+
let value = trimmed.substring(eqIndex + 1).trim();
|
|
54
|
+
// Strip surrounding quotes (double or single)
|
|
55
|
+
if (value.length >= 2 &&
|
|
56
|
+
((value[0] === '"' && value[value.length - 1] === '"') ||
|
|
57
|
+
(value[0] === "'" && value[value.length - 1] === "'"))) {
|
|
58
|
+
value = value.slice(1, -1);
|
|
59
|
+
}
|
|
60
|
+
vars[key] = value;
|
|
61
|
+
process.env[key] = value;
|
|
62
|
+
}
|
|
63
|
+
return vars;
|
|
64
|
+
}
|
|
65
|
+
/** Create a backend factory that produces the right backend based on name. */
|
|
66
|
+
export function createBackendFactory() {
|
|
67
|
+
// const useLegacy = process.env.ALASKA_LEGACY_BACKEND === '1';
|
|
68
|
+
return (backendName) => {
|
|
69
|
+
switch (backendName) {
|
|
70
|
+
// case 'claude':
|
|
71
|
+
// if (useLegacy) {
|
|
72
|
+
// console.log('[start] using legacy CLI backend (ALASKA_LEGACY_BACKEND=1)');
|
|
73
|
+
// return new ClaudeBackend();
|
|
74
|
+
// }
|
|
75
|
+
// return new ClaudeSdkBackend();
|
|
76
|
+
case 'codex':
|
|
77
|
+
return new CodexBackend();
|
|
78
|
+
default:
|
|
79
|
+
throw new Error(`Unknown backend: ${backendName}`);
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Show the settings menu for `alaska-ai configure`.
|
|
85
|
+
* Handles the chosen action (add platform, update tokens, etc.)
|
|
86
|
+
* and reminds the user to restart the bridge if it's running.
|
|
87
|
+
*/
|
|
88
|
+
async function handleConfigMenu(dbPath, envPath) {
|
|
89
|
+
const store = createStore();
|
|
90
|
+
try {
|
|
91
|
+
const platformsJson = await store.getSetting('platforms');
|
|
92
|
+
const parsedPlatforms = platformsJson ? JSON.parse(platformsJson) : [];
|
|
93
|
+
const platforms = normalizePlatforms(parsedPlatforms);
|
|
94
|
+
if (parsedPlatforms.length !== platforms.length) {
|
|
95
|
+
await store.setSetting('platforms', JSON.stringify(platforms));
|
|
96
|
+
}
|
|
97
|
+
const defaultBackend = await requireSetting(store, 'default_backend');
|
|
98
|
+
clack.intro('Alaska 鈥?Configure');
|
|
99
|
+
const options = [];
|
|
100
|
+
const allPlatforms = ['slack'];
|
|
101
|
+
const unconfigured = allPlatforms.filter((p) => !platforms.includes(p));
|
|
102
|
+
if (unconfigured.length > 0) {
|
|
103
|
+
const names = unconfigured.map((p) => p.charAt(0).toUpperCase() + p.slice(1));
|
|
104
|
+
options.push({
|
|
105
|
+
label: 'Add a platform',
|
|
106
|
+
value: 'add_platform',
|
|
107
|
+
hint: names.join(', '),
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
if (platforms.length > 0) {
|
|
111
|
+
const names = platforms.map((p) => p.charAt(0).toUpperCase() + p.slice(1));
|
|
112
|
+
options.push({
|
|
113
|
+
label: 'Update tokens',
|
|
114
|
+
value: 'update_tokens',
|
|
115
|
+
hint: names.join(', '),
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
options.push({
|
|
119
|
+
label: 'Change default backend',
|
|
120
|
+
value: 'change_backend',
|
|
121
|
+
hint: `current: ${defaultBackend}`,
|
|
122
|
+
});
|
|
123
|
+
// Projects root
|
|
124
|
+
const currentRoot = await store.getSetting('projects_root');
|
|
125
|
+
if (currentRoot) {
|
|
126
|
+
options.push({
|
|
127
|
+
label: 'Change projects root',
|
|
128
|
+
value: 'projects_root',
|
|
129
|
+
hint: currentRoot,
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
options.push({
|
|
134
|
+
label: 'Set projects root',
|
|
135
|
+
value: 'projects_root',
|
|
136
|
+
hint: 'not set',
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
// Show tunnel tool status
|
|
140
|
+
const { hasCloudflared, hasNgrok } = detectTunnelTools();
|
|
141
|
+
const previewHint = hasCloudflared || hasNgrok
|
|
142
|
+
? `${hasCloudflared ? 'cloudflared' : ''}${hasCloudflared && hasNgrok ? ', ' : ''}${hasNgrok ? 'ngrok' : ''} detected`
|
|
143
|
+
: 'not configured';
|
|
144
|
+
options.push({
|
|
145
|
+
label: 'Set up file sharing',
|
|
146
|
+
value: 'setup_previews',
|
|
147
|
+
hint: previewHint,
|
|
148
|
+
});
|
|
149
|
+
options.push({ label: 'Re-run full setup', value: 'rerun_setup' });
|
|
150
|
+
options.push({ label: 'Exit', value: 'exit' });
|
|
151
|
+
const action = await clack.select({
|
|
152
|
+
message: 'What would you like to do?',
|
|
153
|
+
options,
|
|
154
|
+
});
|
|
155
|
+
if (clack.isCancel(action)) {
|
|
156
|
+
clack.cancel('Cancelled.');
|
|
157
|
+
process.exit(0);
|
|
158
|
+
}
|
|
159
|
+
const RESTART_HINT = 'If the bridge is running, restart it for changes to take effect.';
|
|
160
|
+
switch (action) {
|
|
161
|
+
case 'exit':
|
|
162
|
+
clack.outro('Goodbye!');
|
|
163
|
+
process.exit(0);
|
|
164
|
+
return;
|
|
165
|
+
case 'add_platform': {
|
|
166
|
+
let platformToAdd;
|
|
167
|
+
if (unconfigured.length === 1) {
|
|
168
|
+
platformToAdd = unconfigured[0];
|
|
169
|
+
clack.log.info(`Adding ${platformToAdd.charAt(0).toUpperCase() + platformToAdd.slice(1)}...`);
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
const selected = await clack.select({
|
|
173
|
+
message: 'Which platform do you want to add?',
|
|
174
|
+
options: unconfigured.map((p) => ({
|
|
175
|
+
label: p.charAt(0).toUpperCase() + p.slice(1),
|
|
176
|
+
value: p,
|
|
177
|
+
})),
|
|
178
|
+
});
|
|
179
|
+
if (clack.isCancel(selected)) {
|
|
180
|
+
clack.cancel('Cancelled.');
|
|
181
|
+
process.exit(0);
|
|
182
|
+
}
|
|
183
|
+
platformToAdd = selected;
|
|
184
|
+
}
|
|
185
|
+
const tokens = await inputTokens(null, [platformToAdd]);
|
|
186
|
+
mergeEnvFile(envPath, tokens);
|
|
187
|
+
platforms.push(platformToAdd);
|
|
188
|
+
await store.setSetting('platforms', JSON.stringify(platforms));
|
|
189
|
+
clack.log.success(`${platformToAdd.charAt(0).toUpperCase() + platformToAdd.slice(1)} added. ${RESTART_HINT}`);
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
case 'update_tokens': {
|
|
193
|
+
let platformsToUpdate;
|
|
194
|
+
if (platforms.length === 1) {
|
|
195
|
+
platformsToUpdate = [platforms[0]];
|
|
196
|
+
}
|
|
197
|
+
else {
|
|
198
|
+
const selected = await clack.select({
|
|
199
|
+
message: 'Which platform tokens do you want to update?',
|
|
200
|
+
options: [
|
|
201
|
+
...platforms.map((p) => ({
|
|
202
|
+
label: p.charAt(0).toUpperCase() + p.slice(1),
|
|
203
|
+
value: p,
|
|
204
|
+
})),
|
|
205
|
+
{ label: 'Both', value: 'both' },
|
|
206
|
+
],
|
|
207
|
+
});
|
|
208
|
+
if (clack.isCancel(selected)) {
|
|
209
|
+
clack.cancel('Cancelled.');
|
|
210
|
+
process.exit(0);
|
|
211
|
+
}
|
|
212
|
+
platformsToUpdate =
|
|
213
|
+
selected === 'both' ? [...platforms] : [selected];
|
|
214
|
+
}
|
|
215
|
+
const tokens = await inputTokens(null, platformsToUpdate);
|
|
216
|
+
mergeEnvFile(envPath, tokens);
|
|
217
|
+
clack.log.success(`Tokens updated. ${RESTART_HINT}`);
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
case 'change_backend': {
|
|
221
|
+
const newBackend = await detectBackend(null);
|
|
222
|
+
await store.setSetting('default_backend', newBackend);
|
|
223
|
+
clack.log.success(`Default backend changed to ${newBackend}. ${RESTART_HINT}`);
|
|
224
|
+
return;
|
|
225
|
+
}
|
|
226
|
+
case 'projects_root': {
|
|
227
|
+
if (currentRoot) {
|
|
228
|
+
const rootAction = await clack.select({
|
|
229
|
+
message: `Projects root is currently: ${currentRoot}`,
|
|
230
|
+
options: [
|
|
231
|
+
{ label: 'Change', value: 'change' },
|
|
232
|
+
{ label: 'Cancel', value: 'cancel' },
|
|
233
|
+
],
|
|
234
|
+
});
|
|
235
|
+
if (clack.isCancel(rootAction) || rootAction === 'cancel') {
|
|
236
|
+
return;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
const newRoot = await clack.text({
|
|
240
|
+
message: 'Sandbox root directory (absolute path)',
|
|
241
|
+
validate: (input) => {
|
|
242
|
+
if (!input)
|
|
243
|
+
return 'Path is required';
|
|
244
|
+
try {
|
|
245
|
+
validateSandboxRoot(input);
|
|
246
|
+
return undefined;
|
|
247
|
+
}
|
|
248
|
+
catch (err) {
|
|
249
|
+
return err.message;
|
|
250
|
+
}
|
|
251
|
+
},
|
|
252
|
+
});
|
|
253
|
+
if (clack.isCancel(newRoot)) {
|
|
254
|
+
return;
|
|
255
|
+
}
|
|
256
|
+
const resolved = validateSandboxRoot(newRoot);
|
|
257
|
+
await store.setSetting('projects_root', resolved);
|
|
258
|
+
clack.log.success(`Sandbox root set to ${resolved}. ${RESTART_HINT}`);
|
|
259
|
+
return;
|
|
260
|
+
}
|
|
261
|
+
case 'setup_previews': {
|
|
262
|
+
const tunnels = detectTunnelTools();
|
|
263
|
+
if (tunnels.hasCloudflared && tunnels.hasNgrok) {
|
|
264
|
+
clack.log.success('cloudflared and ngrok detected 鈥?previews will work automatically. Will prefer cloudflared.');
|
|
265
|
+
}
|
|
266
|
+
else if (tunnels.hasCloudflared) {
|
|
267
|
+
clack.log.success('cloudflared detected 鈥?previews will work automatically.');
|
|
268
|
+
}
|
|
269
|
+
else if (tunnels.hasNgrok) {
|
|
270
|
+
clack.log.success('ngrok detected 鈥?previews will work automatically.');
|
|
271
|
+
}
|
|
272
|
+
else {
|
|
273
|
+
const installSteps = [
|
|
274
|
+
'No tunnel tool found. Install one to enable previews:',
|
|
275
|
+
'',
|
|
276
|
+
' cloudflared (recommended 鈥?free, no account needed):',
|
|
277
|
+
' brew install cloudflared',
|
|
278
|
+
'',
|
|
279
|
+
' ngrok:',
|
|
280
|
+
' brew install ngrok',
|
|
281
|
+
].join('\n');
|
|
282
|
+
clack.note(installSteps, 'Install a tunnel tool');
|
|
283
|
+
clack.log.info('Install one of these, then start the bridge 鈥?previews will work automatically.');
|
|
284
|
+
}
|
|
285
|
+
return;
|
|
286
|
+
}
|
|
287
|
+
case 'rerun_setup': {
|
|
288
|
+
const confirm = await clack.confirm({
|
|
289
|
+
message: 'This will erase all settings, tokens, and project connections. Continue?',
|
|
290
|
+
initialValue: false,
|
|
291
|
+
});
|
|
292
|
+
if (clack.isCancel(confirm) || !confirm) {
|
|
293
|
+
return;
|
|
294
|
+
}
|
|
295
|
+
store.close();
|
|
296
|
+
const dbDir = path.dirname(dbPath);
|
|
297
|
+
fs.rmSync(dbDir, { recursive: true, force: true });
|
|
298
|
+
if (fs.existsSync(envPath))
|
|
299
|
+
fs.rmSync(envPath);
|
|
300
|
+
await runInit();
|
|
301
|
+
clack.log.info(RESTART_HINT);
|
|
302
|
+
return;
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
finally {
|
|
307
|
+
try {
|
|
308
|
+
store.close();
|
|
309
|
+
}
|
|
310
|
+
catch (err) {
|
|
311
|
+
// Already closed (e.g. rerun_setup closes it before wiping)
|
|
312
|
+
console.error(`[start] error closing store: ${err.message}`);
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
/**
|
|
317
|
+
* Launch the bridge process.
|
|
318
|
+
*/
|
|
319
|
+
export async function runStart(deps) {
|
|
320
|
+
const dbPath = deps?.dbPath ?? getDbPath();
|
|
321
|
+
const envPath = deps?.envPath ?? getEnvPath();
|
|
322
|
+
const dryRun = deps?.dryRun ?? false;
|
|
323
|
+
const interactive = isInteractiveTerminal();
|
|
324
|
+
// Auto-run init if not set up yet (first run or incomplete setup)
|
|
325
|
+
if (!fs.existsSync(path.dirname(dbPath))) {
|
|
326
|
+
if (interactive) {
|
|
327
|
+
console.log('[start] first run detected 鈥?running setup wizard...\n');
|
|
328
|
+
await runInit();
|
|
329
|
+
}
|
|
330
|
+
else {
|
|
331
|
+
console.error('[start] first run requires interactive setup. Run "alaska-ai init" in an interactive terminal first.');
|
|
332
|
+
process.exit(1);
|
|
333
|
+
return;
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
else {
|
|
337
|
+
// Directory exists but setup may be incomplete (e.g. user cancelled configure)
|
|
338
|
+
const checkStore = createStore();
|
|
339
|
+
const hasConfig = await checkStore.getSetting('platforms');
|
|
340
|
+
const hasRoot = await checkStore.getSetting('projects_root');
|
|
341
|
+
checkStore.close();
|
|
342
|
+
if (!hasConfig || !hasRoot) {
|
|
343
|
+
if (interactive) {
|
|
344
|
+
console.log('[start] setup not complete 鈥?running setup wizard...\n');
|
|
345
|
+
await runInit();
|
|
346
|
+
}
|
|
347
|
+
else {
|
|
348
|
+
const missing = [
|
|
349
|
+
!hasConfig ? 'platforms' : null,
|
|
350
|
+
!hasRoot ? 'projects_root' : null,
|
|
351
|
+
].filter(Boolean).join(', ');
|
|
352
|
+
console.error(`[start] setup incomplete (${missing}). Run "alaska-ai init" in an interactive terminal first.`);
|
|
353
|
+
process.exit(1);
|
|
354
|
+
return;
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
// Load environment variables
|
|
359
|
+
const env = loadEnvFile(envPath);
|
|
360
|
+
console.log('[start] loaded environment from', envPath);
|
|
361
|
+
// Initialize persistence store
|
|
362
|
+
const store = createStore();
|
|
363
|
+
// Read config from settings
|
|
364
|
+
const platformsJson = await store.getSetting('platforms');
|
|
365
|
+
if (!platformsJson) {
|
|
366
|
+
console.error('[start] no platforms configured. Run "alaska-ai start" to set up.');
|
|
367
|
+
store.close();
|
|
368
|
+
process.exit(1);
|
|
369
|
+
return;
|
|
370
|
+
}
|
|
371
|
+
const parsedPlatforms = JSON.parse(platformsJson);
|
|
372
|
+
const platforms = normalizePlatforms(parsedPlatforms);
|
|
373
|
+
if (parsedPlatforms.length !== platforms.length) {
|
|
374
|
+
await store.setSetting('platforms', JSON.stringify(platforms));
|
|
375
|
+
}
|
|
376
|
+
if (platforms.length === 0) {
|
|
377
|
+
console.error('[start] no supported platforms configured. Run "alaska-ai configure" and add Slack.');
|
|
378
|
+
store.close();
|
|
379
|
+
process.exit(1);
|
|
380
|
+
return;
|
|
381
|
+
}
|
|
382
|
+
const defaultBackend = await requireSetting(store, 'default_backend');
|
|
383
|
+
const sandboxRoot = await requireSandboxRoot(store);
|
|
384
|
+
console.log(`[start] platforms: ${platforms.join(', ')}`);
|
|
385
|
+
console.log(`[start] default backend: ${defaultBackend}`);
|
|
386
|
+
console.log(`[start] sandbox root: ${sandboxRoot}`);
|
|
387
|
+
// --- Start IPC server for MCP callbacks ---
|
|
388
|
+
const adapterMap = new Map();
|
|
389
|
+
const ipcHandler = createCallbackHandler({ adapters: adapterMap, store });
|
|
390
|
+
const ipcServer = await startIpcServer(ipcHandler);
|
|
391
|
+
console.log(`[start] IPC server listening on port ${ipcServer.port}`);
|
|
392
|
+
// Resolve the dist/ directory (where compiled JS lives)
|
|
393
|
+
const distDir = path.resolve(path.dirname(new URL(import.meta.url).pathname), '..');
|
|
394
|
+
const entryScriptPath = path.join(distDir, 'mcp', 'entry.js');
|
|
395
|
+
// Create mcpConfigFactory that generates per-session MCP config
|
|
396
|
+
const backendFactory = createBackendFactory();
|
|
397
|
+
const router = new Router(store, backendFactory, {
|
|
398
|
+
ipc: { port: ipcServer.port, secret: ipcServer.secret },
|
|
399
|
+
hookScriptDir: distDir,
|
|
400
|
+
mcpConfigFactory: (ctx) => {
|
|
401
|
+
const config = getMcpConfig(entryScriptPath, ctx, {
|
|
402
|
+
port: ipcServer.port,
|
|
403
|
+
secret: ipcServer.secret,
|
|
404
|
+
});
|
|
405
|
+
return config;
|
|
406
|
+
},
|
|
407
|
+
});
|
|
408
|
+
if (dryRun) {
|
|
409
|
+
console.log('[start] dry run 鈥?skipping adapter startup');
|
|
410
|
+
await ipcServer.close();
|
|
411
|
+
store.close();
|
|
412
|
+
return;
|
|
413
|
+
}
|
|
414
|
+
const adapterList = [];
|
|
415
|
+
// Set up Slack adapter if configured
|
|
416
|
+
if (platforms.includes('slack')) {
|
|
417
|
+
const botToken = env.SLACK_BOT_TOKEN ?? process.env.SLACK_BOT_TOKEN;
|
|
418
|
+
const appToken = env.SLACK_APP_TOKEN ?? process.env.SLACK_APP_TOKEN;
|
|
419
|
+
if (!botToken || !appToken) {
|
|
420
|
+
console.error('[start] Slack tokens not found. Check .env.local or environment variables.');
|
|
421
|
+
await ipcServer.close();
|
|
422
|
+
store.close();
|
|
423
|
+
process.exit(1);
|
|
424
|
+
return;
|
|
425
|
+
}
|
|
426
|
+
const slack = new SlackAdapter({
|
|
427
|
+
botToken,
|
|
428
|
+
appToken,
|
|
429
|
+
router,
|
|
430
|
+
store,
|
|
431
|
+
});
|
|
432
|
+
adapterMap.set('slack', slack);
|
|
433
|
+
adapterList.push({ name: 'slack', start: () => slack.start(), stop: () => slack.stop() });
|
|
434
|
+
}
|
|
435
|
+
// Start all adapters 鈥?if any adapter fails, exit the bridge (don't run half-broken)
|
|
436
|
+
for (const adapter of adapterList) {
|
|
437
|
+
try {
|
|
438
|
+
await adapter.start();
|
|
439
|
+
console.log(`[start] ${adapter.name} adapter started`);
|
|
440
|
+
}
|
|
441
|
+
catch (err) {
|
|
442
|
+
console.error(`[start] failed to start ${adapter.name}:`, err);
|
|
443
|
+
await ipcServer.close();
|
|
444
|
+
store.close();
|
|
445
|
+
process.exit(1);
|
|
446
|
+
return;
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
// --- Start scheduler for scheduled sessions ---
|
|
450
|
+
const tickIntervalSetting = await store.getSetting('scheduler_tick_interval_ms');
|
|
451
|
+
const tickIntervalMs = tickIntervalSetting ? parseInt(tickIntervalSetting, 10) : undefined;
|
|
452
|
+
const scheduler = new Scheduler(store, router, adapterMap, tickIntervalMs ? { tickIntervalMs } : undefined);
|
|
453
|
+
scheduler.start();
|
|
454
|
+
console.log(`[start] bridge is running 鈥?listening on ${adapterList.map((a) => a.name).join(', ')}`);
|
|
455
|
+
// Show next-steps guidance
|
|
456
|
+
const platformNames = adapterList.map((a) => a.name.charAt(0).toUpperCase() + a.name.slice(1));
|
|
457
|
+
const nextSteps = [
|
|
458
|
+
'',
|
|
459
|
+
` Ready on ${platformNames.join(' and ')}!`,
|
|
460
|
+
'',
|
|
461
|
+
' Next steps:',
|
|
462
|
+
' 1. Use /project new my-app to create a project inside the sandbox root, or /project connect <path-under-root>',
|
|
463
|
+
' 2. Send a message in that channel 鈥?the bot will respond via your coding backend',
|
|
464
|
+
'',
|
|
465
|
+
' Press Ctrl+C to stop the bridge.',
|
|
466
|
+
'',
|
|
467
|
+
];
|
|
468
|
+
console.log(nextSteps.join('\n'));
|
|
469
|
+
// Handle graceful shutdown
|
|
470
|
+
const shutdown = async () => {
|
|
471
|
+
console.log('[start] shutting down...');
|
|
472
|
+
// Stop scheduler
|
|
473
|
+
scheduler.stop();
|
|
474
|
+
// Stop all active backend sessions
|
|
475
|
+
await router.shutdown();
|
|
476
|
+
// Close tunnels, file browsers, and preview servers
|
|
477
|
+
closeAllTunnels();
|
|
478
|
+
closeAllPreviews();
|
|
479
|
+
await closeAllFileBrowsers();
|
|
480
|
+
// Close IPC server
|
|
481
|
+
await ipcServer.close();
|
|
482
|
+
console.log('[start] IPC server closed');
|
|
483
|
+
// Disconnect all messaging platform adapters
|
|
484
|
+
for (const adapter of adapterList) {
|
|
485
|
+
try {
|
|
486
|
+
await adapter.stop();
|
|
487
|
+
console.log(`[start] ${adapter.name} adapter stopped`);
|
|
488
|
+
}
|
|
489
|
+
catch (err) {
|
|
490
|
+
console.error(`[start] error stopping ${adapter.name} during shutdown: ${err.message}`);
|
|
491
|
+
}
|
|
492
|
+
}
|
|
493
|
+
store.close();
|
|
494
|
+
console.log('[start] shutdown complete');
|
|
495
|
+
process.exit(0);
|
|
496
|
+
};
|
|
497
|
+
process.on('SIGTERM', shutdown);
|
|
498
|
+
process.on('SIGINT', shutdown);
|
|
499
|
+
}
|
|
500
|
+
/**
|
|
501
|
+
* alaska-ai configure 鈥?Show the settings menu.
|
|
502
|
+
*/
|
|
503
|
+
export async function runConfigure() {
|
|
504
|
+
const dbPath = getDbPath();
|
|
505
|
+
const envPath = getEnvPath();
|
|
506
|
+
if (!fs.existsSync(path.dirname(dbPath))) {
|
|
507
|
+
console.log('[configure] no configuration found 鈥?running setup wizard...\n');
|
|
508
|
+
await runInit();
|
|
509
|
+
return;
|
|
510
|
+
}
|
|
511
|
+
// Check if setup has been completed 鈥?if not, run the wizard instead
|
|
512
|
+
const store = createStore();
|
|
513
|
+
const hasBackend = await store.getSetting('platforms');
|
|
514
|
+
store.close();
|
|
515
|
+
if (!hasBackend) {
|
|
516
|
+
console.log('[configure] setup not complete 鈥?running setup wizard first...\n');
|
|
517
|
+
await runInit();
|
|
518
|
+
return;
|
|
519
|
+
}
|
|
520
|
+
await handleConfigMenu(dbPath, envPath);
|
|
521
|
+
}
|
|
522
|
+
//# sourceMappingURL=start.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start.js","sourceRoot":"","sources":["../../src/cli/start.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.d.ts
ADDED
package/dist/cli.js
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { createRequire } from 'node:module';
|
|
3
|
+
import { runInit } from './cli/init.js';
|
|
4
|
+
import { runConfigure, runStart } from './cli/start.js';
|
|
5
|
+
function getVersion() {
|
|
6
|
+
try {
|
|
7
|
+
const require = createRequire(import.meta.url);
|
|
8
|
+
const pkg = require('../package.json');
|
|
9
|
+
return pkg.version ?? '0.0.0';
|
|
10
|
+
}
|
|
11
|
+
catch {
|
|
12
|
+
return '0.0.0';
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
function printHelp() {
|
|
16
|
+
console.log([
|
|
17
|
+
'alaska-ai',
|
|
18
|
+
'',
|
|
19
|
+
'Usage:',
|
|
20
|
+
' alaska-ai start',
|
|
21
|
+
' alaska-ai configure',
|
|
22
|
+
' alaska-ai init',
|
|
23
|
+
'',
|
|
24
|
+
'Commands:',
|
|
25
|
+
' start Start the bridge process (default command)',
|
|
26
|
+
' configure Open interactive settings menu',
|
|
27
|
+
' init Run first-time setup wizard',
|
|
28
|
+
'',
|
|
29
|
+
'Options:',
|
|
30
|
+
' -h, --help Show help',
|
|
31
|
+
' -v, --version Show version',
|
|
32
|
+
].join('\n'));
|
|
33
|
+
}
|
|
34
|
+
async function main() {
|
|
35
|
+
const command = process.argv[2];
|
|
36
|
+
if (command === '-h' || command === '--help') {
|
|
37
|
+
printHelp();
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
if (command === '-v' || command === '--version') {
|
|
41
|
+
console.log(getVersion());
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
if (!command || command === 'start') {
|
|
45
|
+
await runStart();
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
if (command === 'configure') {
|
|
49
|
+
await runConfigure();
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
if (command === 'init') {
|
|
53
|
+
await runInit();
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
console.error(`[cli] unknown command: ${command}`);
|
|
57
|
+
printHelp();
|
|
58
|
+
process.exit(1);
|
|
59
|
+
}
|
|
60
|
+
main().catch((err) => {
|
|
61
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
62
|
+
console.error(`[cli] fatal error: ${message}`);
|
|
63
|
+
process.exit(1);
|
|
64
|
+
});
|
|
65
|
+
//# 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":";AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAExD,SAAS,UAAU;IACjB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC/C,MAAM,GAAG,GAAG,OAAO,CAAC,iBAAiB,CAAyB,CAAC;QAC/D,OAAO,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,CAAC;IACjB,CAAC;AACH,CAAC;AAED,SAAS,SAAS;IAChB,OAAO,CAAC,GAAG,CAAC;QACV,WAAW;QACX,EAAE;QACF,QAAQ;QACR,mBAAmB;QACnB,uBAAuB;QACvB,kBAAkB;QAClB,EAAE;QACF,WAAW;QACX,0DAA0D;QAC1D,8CAA8C;QAC9C,2CAA2C;QAC3C,EAAE;QACF,UAAU;QACV,6BAA6B;QAC7B,gCAAgC;KACjC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAEhC,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;QAC7C,SAAS,EAAE,CAAC;QACZ,OAAO;IACT,CAAC;IAED,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,WAAW,EAAE,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;QAC1B,OAAO;IACT,CAAC;IAED,IAAI,CAAC,OAAO,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;QACpC,MAAM,QAAQ,EAAE,CAAC;QACjB,OAAO;IACT,CAAC;IAED,IAAI,OAAO,KAAK,WAAW,EAAE,CAAC;QAC5B,MAAM,YAAY,EAAE,CAAC;QACrB,OAAO;IACT,CAAC;IAED,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;QACvB,MAAM,OAAO,EAAE,CAAC;QAChB,OAAO;IACT,CAAC;IAED,OAAO,CAAC,KAAK,CAAC,0BAA0B,OAAO,EAAE,CAAC,CAAC;IACnD,SAAS,EAAE,CAAC;IACZ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACjE,OAAO,CAAC,KAAK,CAAC,sBAAsB,OAAO,EAAE,CAAC,CAAC;IAC/C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function main(): Promise<void>;
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,KAAK,UAAU,IAAI;IACtB,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;AACtC,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,GAAG,CAAC,CAAC;IAC5C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|