agent-life-bridge 0.1.1
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/.env.example +20 -0
- package/LICENSE +21 -0
- package/README.md +350 -0
- package/bin/agent-life-bridge.mjs +13 -0
- package/config.example.json +130 -0
- package/config.multi-agent.example.json +88 -0
- package/dist/agents/agent-life-session-map-store.d.ts +21 -0
- package/dist/agents/agent-life-session-map-store.d.ts.map +1 -0
- package/dist/agents/agent-life-session-map-store.js +78 -0
- package/dist/agents/agent-life-session-map-store.js.map +1 -0
- package/dist/agents/agent-resolver.d.ts +12 -0
- package/dist/agents/agent-resolver.d.ts.map +1 -0
- package/dist/agents/agent-resolver.js +114 -0
- package/dist/agents/agent-resolver.js.map +1 -0
- package/dist/agents/agent-router.d.ts +8 -0
- package/dist/agents/agent-router.d.ts.map +1 -0
- package/dist/agents/agent-router.js +72 -0
- package/dist/agents/agent-router.js.map +1 -0
- package/dist/agents/cli-backends.d.ts +25 -0
- package/dist/agents/cli-backends.d.ts.map +1 -0
- package/dist/agents/cli-backends.js +252 -0
- package/dist/agents/cli-backends.js.map +1 -0
- package/dist/agents/cli-output.d.ts +43 -0
- package/dist/agents/cli-output.d.ts.map +1 -0
- package/dist/agents/cli-output.js +352 -0
- package/dist/agents/cli-output.js.map +1 -0
- package/dist/agents/cli-runner.d.ts +32 -0
- package/dist/agents/cli-runner.d.ts.map +1 -0
- package/dist/agents/cli-runner.js +861 -0
- package/dist/agents/cli-runner.js.map +1 -0
- package/dist/agents/cli-session-store.d.ts +53 -0
- package/dist/agents/cli-session-store.d.ts.map +1 -0
- package/dist/agents/cli-session-store.js +263 -0
- package/dist/agents/cli-session-store.js.map +1 -0
- package/dist/agents/codex-app-server-runtime.d.ts +80 -0
- package/dist/agents/codex-app-server-runtime.d.ts.map +1 -0
- package/dist/agents/codex-app-server-runtime.js +1049 -0
- package/dist/agents/codex-app-server-runtime.js.map +1 -0
- package/dist/agents/fch-runtime-context.d.ts +28 -0
- package/dist/agents/fch-runtime-context.d.ts.map +1 -0
- package/dist/agents/fch-runtime-context.js +65 -0
- package/dist/agents/fch-runtime-context.js.map +1 -0
- package/dist/agents/model-selection.d.ts +28 -0
- package/dist/agents/model-selection.d.ts.map +1 -0
- package/dist/agents/model-selection.js +40 -0
- package/dist/agents/model-selection.js.map +1 -0
- package/dist/agents/models-config.d.ts +28 -0
- package/dist/agents/models-config.d.ts.map +1 -0
- package/dist/agents/models-config.js +43 -0
- package/dist/agents/models-config.js.map +1 -0
- package/dist/channels/agent-life.d.ts +9 -0
- package/dist/channels/agent-life.d.ts.map +1 -0
- package/dist/channels/agent-life.js +407 -0
- package/dist/channels/agent-life.js.map +1 -0
- package/dist/channels/command-gating.d.ts +20 -0
- package/dist/channels/command-gating.d.ts.map +1 -0
- package/dist/channels/command-gating.js +43 -0
- package/dist/channels/command-gating.js.map +1 -0
- package/dist/channels/draft-stream-controls.d.ts +21 -0
- package/dist/channels/draft-stream-controls.d.ts.map +1 -0
- package/dist/channels/draft-stream-controls.js +43 -0
- package/dist/channels/draft-stream-controls.js.map +1 -0
- package/dist/channels/draft-stream-loop.d.ts +31 -0
- package/dist/channels/draft-stream-loop.d.ts.map +1 -0
- package/dist/channels/draft-stream-loop.js +60 -0
- package/dist/channels/draft-stream-loop.js.map +1 -0
- package/dist/channels/mention-gating.d.ts +18 -0
- package/dist/channels/mention-gating.d.ts.map +1 -0
- package/dist/channels/mention-gating.js +20 -0
- package/dist/channels/mention-gating.js.map +1 -0
- package/dist/channels/registry.d.ts +5 -0
- package/dist/channels/registry.d.ts.map +1 -0
- package/dist/channels/registry.js +14 -0
- package/dist/channels/registry.js.map +1 -0
- package/dist/channels/run-state-machine.d.ts +21 -0
- package/dist/channels/run-state-machine.d.ts.map +1 -0
- package/dist/channels/run-state-machine.js +41 -0
- package/dist/channels/run-state-machine.js.map +1 -0
- package/dist/channels/session-envelope.d.ts +5 -0
- package/dist/channels/session-envelope.d.ts.map +1 -0
- package/dist/channels/session-envelope.js +16 -0
- package/dist/channels/session-envelope.js.map +1 -0
- package/dist/channels/session-id.d.ts +3 -0
- package/dist/channels/session-id.d.ts.map +1 -0
- package/dist/channels/session-id.js +11 -0
- package/dist/channels/session-id.js.map +1 -0
- package/dist/channels/session.d.ts +18 -0
- package/dist/channels/session.d.ts.map +1 -0
- package/dist/channels/session.js +35 -0
- package/dist/channels/session.js.map +1 -0
- package/dist/channels/typing-lifecycle.d.ts +16 -0
- package/dist/channels/typing-lifecycle.d.ts.map +1 -0
- package/dist/channels/typing-lifecycle.js +31 -0
- package/dist/channels/typing-lifecycle.js.map +1 -0
- package/dist/cli/cmd-add-agent.d.ts +19 -0
- package/dist/cli/cmd-add-agent.d.ts.map +1 -0
- package/dist/cli/cmd-add-agent.js +362 -0
- package/dist/cli/cmd-add-agent.js.map +1 -0
- package/dist/cli/cmd-config.d.ts +3 -0
- package/dist/cli/cmd-config.d.ts.map +1 -0
- package/dist/cli/cmd-config.js +16 -0
- package/dist/cli/cmd-config.js.map +1 -0
- package/dist/cli/cmd-doctor.d.ts +3 -0
- package/dist/cli/cmd-doctor.d.ts.map +1 -0
- package/dist/cli/cmd-doctor.js +127 -0
- package/dist/cli/cmd-doctor.js.map +1 -0
- package/dist/cli/cmd-logs.d.ts +3 -0
- package/dist/cli/cmd-logs.d.ts.map +1 -0
- package/dist/cli/cmd-logs.js +26 -0
- package/dist/cli/cmd-logs.js.map +1 -0
- package/dist/cli/cmd-onboard.d.ts +5 -0
- package/dist/cli/cmd-onboard.d.ts.map +1 -0
- package/dist/cli/cmd-onboard.js +53 -0
- package/dist/cli/cmd-onboard.js.map +1 -0
- package/dist/cli/cmd-restart.d.ts +3 -0
- package/dist/cli/cmd-restart.d.ts.map +1 -0
- package/dist/cli/cmd-restart.js +22 -0
- package/dist/cli/cmd-restart.js.map +1 -0
- package/dist/cli/cmd-start.d.ts +19 -0
- package/dist/cli/cmd-start.d.ts.map +1 -0
- package/dist/cli/cmd-start.js +783 -0
- package/dist/cli/cmd-start.js.map +1 -0
- package/dist/cli/cmd-status.d.ts +3 -0
- package/dist/cli/cmd-status.d.ts.map +1 -0
- package/dist/cli/cmd-status.js +16 -0
- package/dist/cli/cmd-status.js.map +1 -0
- package/dist/cli/cmd-stop.d.ts +9 -0
- package/dist/cli/cmd-stop.d.ts.map +1 -0
- package/dist/cli/cmd-stop.js +59 -0
- package/dist/cli/cmd-stop.js.map +1 -0
- package/dist/cli/cmd-update.d.ts +3 -0
- package/dist/cli/cmd-update.d.ts.map +1 -0
- package/dist/cli/cmd-update.js +127 -0
- package/dist/cli/cmd-update.js.map +1 -0
- package/dist/cli/cmd-version.d.ts +4 -0
- package/dist/cli/cmd-version.d.ts.map +1 -0
- package/dist/cli/cmd-version.js +12 -0
- package/dist/cli/cmd-version.js.map +1 -0
- package/dist/cli/pid-file.d.ts +23 -0
- package/dist/cli/pid-file.d.ts.map +1 -0
- package/dist/cli/pid-file.js +136 -0
- package/dist/cli/pid-file.js.map +1 -0
- package/dist/cli/run-main.d.ts +16 -0
- package/dist/cli/run-main.d.ts.map +1 -0
- package/dist/cli/run-main.js +114 -0
- package/dist/cli/run-main.js.map +1 -0
- package/dist/cli/update-check.d.ts +15 -0
- package/dist/cli/update-check.d.ts.map +1 -0
- package/dist/cli/update-check.js +187 -0
- package/dist/cli/update-check.js.map +1 -0
- package/dist/commands/prefix-router.d.ts +17 -0
- package/dist/commands/prefix-router.d.ts.map +1 -0
- package/dist/commands/prefix-router.js +79 -0
- package/dist/commands/prefix-router.js.map +1 -0
- package/dist/config/agent-dirs.d.ts +24 -0
- package/dist/config/agent-dirs.d.ts.map +1 -0
- package/dist/config/agent-dirs.js +71 -0
- package/dist/config/agent-dirs.js.map +1 -0
- package/dist/config/config.d.ts +4 -0
- package/dist/config/config.d.ts.map +1 -0
- package/dist/config/config.js +42 -0
- package/dist/config/config.js.map +1 -0
- package/dist/config/default-config.d.ts +9 -0
- package/dist/config/default-config.d.ts.map +1 -0
- package/dist/config/default-config.js +94 -0
- package/dist/config/default-config.js.map +1 -0
- package/dist/config/env-vars.d.ts +15 -0
- package/dist/config/env-vars.d.ts.map +1 -0
- package/dist/config/env-vars.js +16 -0
- package/dist/config/env-vars.js.map +1 -0
- package/dist/config/merge-config.d.ts +7 -0
- package/dist/config/merge-config.d.ts.map +1 -0
- package/dist/config/merge-config.js +45 -0
- package/dist/config/merge-config.js.map +1 -0
- package/dist/config/paths.d.ts +25 -0
- package/dist/config/paths.d.ts.map +1 -0
- package/dist/config/paths.js +31 -0
- package/dist/config/paths.js.map +1 -0
- package/dist/config/zod-schema.d.ts +3114 -0
- package/dist/config/zod-schema.d.ts.map +1 -0
- package/dist/config/zod-schema.js +217 -0
- package/dist/config/zod-schema.js.map +1 -0
- package/dist/entry.d.ts +3 -0
- package/dist/entry.d.ts.map +1 -0
- package/dist/entry.js +70 -0
- package/dist/entry.js.map +1 -0
- package/dist/logger.d.ts +5 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +42 -0
- package/dist/logger.js.map +1 -0
- package/dist/types/index.d.ts +215 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/package.json +62 -0
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { parseArgs } from 'node:util';
|
|
2
|
+
export function parseCliArgs(argv = process.argv.slice(2)) {
|
|
3
|
+
const validCommands = new Set([
|
|
4
|
+
'start', 'stop', 'status', 'onboard', 'add-agent', 'restart', 'doctor', 'logs', 'config', 'update', 'version', 'help',
|
|
5
|
+
]);
|
|
6
|
+
const normalizedArgv = argv.map(arg => (arg === '--verson' ? '--version' : arg));
|
|
7
|
+
const { values, positionals, tokens } = parseArgs({
|
|
8
|
+
args: normalizedArgv,
|
|
9
|
+
options: {
|
|
10
|
+
config: { type: 'string', short: 'c' },
|
|
11
|
+
daemon: { type: 'boolean', short: 'd', default: false },
|
|
12
|
+
help: { type: 'boolean', short: 'h', default: false },
|
|
13
|
+
version: { type: 'boolean', short: 'v', default: false },
|
|
14
|
+
'account-id': { type: 'string' },
|
|
15
|
+
'create-account': { type: 'string' },
|
|
16
|
+
'account-gateway-url': { type: 'string' },
|
|
17
|
+
'account-bot-token': { type: 'string' },
|
|
18
|
+
},
|
|
19
|
+
allowPositionals: true,
|
|
20
|
+
strict: false,
|
|
21
|
+
tokens: true,
|
|
22
|
+
});
|
|
23
|
+
const knownOptions = new Set([
|
|
24
|
+
'config',
|
|
25
|
+
'daemon',
|
|
26
|
+
'help',
|
|
27
|
+
'version',
|
|
28
|
+
'account-id',
|
|
29
|
+
'create-account',
|
|
30
|
+
'account-gateway-url',
|
|
31
|
+
'account-bot-token',
|
|
32
|
+
]);
|
|
33
|
+
const unknownOptions = new Set();
|
|
34
|
+
for (const token of tokens) {
|
|
35
|
+
if (token.kind !== 'option')
|
|
36
|
+
continue;
|
|
37
|
+
if (knownOptions.has(token.name))
|
|
38
|
+
continue;
|
|
39
|
+
unknownOptions.add(token.rawName);
|
|
40
|
+
}
|
|
41
|
+
if (unknownOptions.size > 0) {
|
|
42
|
+
throw new Error(`Unknown option(s): ${Array.from(unknownOptions).join(', ')}\nRun \`alb help\` for usage.`);
|
|
43
|
+
}
|
|
44
|
+
const first = positionals[0];
|
|
45
|
+
let command = 'start';
|
|
46
|
+
let rest = positionals;
|
|
47
|
+
if (first && validCommands.has(first)) {
|
|
48
|
+
command = first;
|
|
49
|
+
rest = positionals.slice(1);
|
|
50
|
+
}
|
|
51
|
+
if (values.help) {
|
|
52
|
+
command = 'help';
|
|
53
|
+
}
|
|
54
|
+
else if (values.version) {
|
|
55
|
+
command = 'version';
|
|
56
|
+
}
|
|
57
|
+
return {
|
|
58
|
+
command,
|
|
59
|
+
config: values.config ?? (rest[0] && !validCommands.has(rest[0]) ? rest[0] : undefined),
|
|
60
|
+
daemon: Boolean(values.daemon),
|
|
61
|
+
help: Boolean(values.help),
|
|
62
|
+
version: Boolean(values.version),
|
|
63
|
+
accountId: values['account-id'],
|
|
64
|
+
createAccount: values['create-account'],
|
|
65
|
+
accountGatewayUrl: values['account-gateway-url'],
|
|
66
|
+
accountBotToken: values['account-bot-token'],
|
|
67
|
+
rest,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
export function printHelp() {
|
|
71
|
+
console.log(`
|
|
72
|
+
alb - Local Agent Gateway for agent-life
|
|
73
|
+
|
|
74
|
+
Usage:
|
|
75
|
+
alb <command> [options]
|
|
76
|
+
|
|
77
|
+
Commands:
|
|
78
|
+
start Start the gateway (foreground by default)
|
|
79
|
+
stop Stop a running daemon
|
|
80
|
+
restart Restart the gateway
|
|
81
|
+
status Show connection and runtime status
|
|
82
|
+
onboard Interactive setup wizard
|
|
83
|
+
add-agent Add an agent to the current config
|
|
84
|
+
doctor Diagnose environment (network, CLI tools, API keys)
|
|
85
|
+
logs View recent logs
|
|
86
|
+
config Show current configuration
|
|
87
|
+
update Update the installed CLI
|
|
88
|
+
version Show package version
|
|
89
|
+
help Show this help
|
|
90
|
+
|
|
91
|
+
Options:
|
|
92
|
+
-c, --config <path> Path to config.json
|
|
93
|
+
-d, --daemon Run as background daemon (with 'start')
|
|
94
|
+
-h, --help Show this help
|
|
95
|
+
-v, --version Show package version
|
|
96
|
+
--account-id <id> Bind add-agent to an existing agent-life account
|
|
97
|
+
--create-account <id> Create a new agent-life account while adding an agent
|
|
98
|
+
--account-gateway-url <url> Gateway URL for --create-account
|
|
99
|
+
--account-bot-token <token> Bot token for --create-account
|
|
100
|
+
|
|
101
|
+
Examples:
|
|
102
|
+
alb start # Start in foreground
|
|
103
|
+
alb start --daemon # Start as daemon
|
|
104
|
+
alb start -c ./my-config.json # Start with custom config
|
|
105
|
+
alb restart --daemon # Restart in daemon mode
|
|
106
|
+
alb onboard # Interactive setup
|
|
107
|
+
alb add-agent # Add a named agent
|
|
108
|
+
alb update # Update the installed CLI
|
|
109
|
+
alb add-agent --account-id office-bot
|
|
110
|
+
alb add-agent --create-account office-bot --account-gateway-url https://agent-life.example.com --account-bot-token bot_xxx
|
|
111
|
+
alb doctor # Check environment
|
|
112
|
+
`.trim());
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=run-main.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-main.js","sourceRoot":"","sources":["../../src/cli/run-main.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { CliArgs } from './run-main.js';
|
|
2
|
+
import type { Logger } from '../types/index.js';
|
|
3
|
+
type UpdateCheckOptions = {
|
|
4
|
+
env?: NodeJS.ProcessEnv;
|
|
5
|
+
isInteractive?: boolean;
|
|
6
|
+
logger?: Logger;
|
|
7
|
+
};
|
|
8
|
+
export declare function shouldCheckForUpdates(args: CliArgs, options?: UpdateCheckOptions): boolean;
|
|
9
|
+
export declare function compareVersions(left: string, right: string): number;
|
|
10
|
+
export declare function shouldNotifyAboutUpdate(currentVersion: string, latestVersion: string | null | undefined, notifiedVersion?: string | null): boolean;
|
|
11
|
+
export declare function maybeNotifyAboutUpdate(args: CliArgs): void;
|
|
12
|
+
export declare function maybeNotifyAboutUpdateWithLogger(args: CliArgs, logger: Logger): void;
|
|
13
|
+
export declare function fetchLatestVersionFromNpm(): Promise<string>;
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=update-check.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-check.d.ts","sourceRoot":"","sources":["../../src/cli/update-check.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AAG5C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAY/C,KAAK,kBAAkB,GAAG;IACxB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAA;IACvB,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB,CAAA;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAQ9F;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAanE;AAED,wBAAgB,uBAAuB,CACrC,cAAc,EAAE,MAAM,EACtB,aAAa,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EACxC,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,GAC9B,OAAO,CAIT;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAM1D;AAED,wBAAgB,gCAAgC,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAMpF;AAED,wBAAsB,yBAAyB,IAAI,OAAO,CAAC,MAAM,CAAC,CA6CjE"}
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
2
|
+
import { spawn } from 'node:child_process';
|
|
3
|
+
import { stdin, stdout } from 'node:process';
|
|
4
|
+
import { join } from 'node:path';
|
|
5
|
+
import { DATA_DIR } from '../config/paths.js';
|
|
6
|
+
import { getPackageVersion } from './cmd-version.js';
|
|
7
|
+
const UPDATE_CHECK_STATE_PATH = join(DATA_DIR, 'update-check.json');
|
|
8
|
+
const UPDATE_CHECK_TTL_MS = 12 * 60 * 60 * 1000;
|
|
9
|
+
const UPDATE_PACKAGE_NAME = 'agent-life-bridge';
|
|
10
|
+
export function shouldCheckForUpdates(args, options = {}) {
|
|
11
|
+
const env = options.env ?? process.env;
|
|
12
|
+
const isInteractive = options.isInteractive ?? (stdin.isTTY && stdout.isTTY);
|
|
13
|
+
const isDaemon = env.AGENT_LIFE_BRIDGE_DAEMON === '1';
|
|
14
|
+
if (env.AGENT_LIFE_BRIDGE_SKIP_UPDATE_CHECK === '1')
|
|
15
|
+
return false;
|
|
16
|
+
if (!isInteractive && !isDaemon)
|
|
17
|
+
return false;
|
|
18
|
+
return args.command === 'start' || args.command === 'restart';
|
|
19
|
+
}
|
|
20
|
+
export function compareVersions(left, right) {
|
|
21
|
+
const leftParts = normalizeVersion(left);
|
|
22
|
+
const rightParts = normalizeVersion(right);
|
|
23
|
+
const length = Math.max(leftParts.length, rightParts.length);
|
|
24
|
+
for (let index = 0; index < length; index += 1) {
|
|
25
|
+
const leftPart = leftParts[index] ?? 0;
|
|
26
|
+
const rightPart = rightParts[index] ?? 0;
|
|
27
|
+
if (leftPart > rightPart)
|
|
28
|
+
return 1;
|
|
29
|
+
if (leftPart < rightPart)
|
|
30
|
+
return -1;
|
|
31
|
+
}
|
|
32
|
+
return 0;
|
|
33
|
+
}
|
|
34
|
+
export function shouldNotifyAboutUpdate(currentVersion, latestVersion, notifiedVersion) {
|
|
35
|
+
if (!latestVersion)
|
|
36
|
+
return false;
|
|
37
|
+
if (compareVersions(latestVersion, currentVersion) <= 0)
|
|
38
|
+
return false;
|
|
39
|
+
return latestVersion !== notifiedVersion;
|
|
40
|
+
}
|
|
41
|
+
export function maybeNotifyAboutUpdate(args) {
|
|
42
|
+
if (!shouldCheckForUpdates(args)) {
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
void runUpdateCheckNotice().catch(() => undefined);
|
|
46
|
+
}
|
|
47
|
+
export function maybeNotifyAboutUpdateWithLogger(args, logger) {
|
|
48
|
+
if (!shouldCheckForUpdates(args, { logger })) {
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
void runUpdateCheckNotice({ logger }).catch(() => undefined);
|
|
52
|
+
}
|
|
53
|
+
export async function fetchLatestVersionFromNpm() {
|
|
54
|
+
const npmCommand = process.platform === 'win32' ? 'npm.cmd' : 'npm';
|
|
55
|
+
return await new Promise((resolve, reject) => {
|
|
56
|
+
let stdoutBuffer = '';
|
|
57
|
+
let stderrBuffer = '';
|
|
58
|
+
const child = spawn(npmCommand, ['view', UPDATE_PACKAGE_NAME, 'version', '--json'], {
|
|
59
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
60
|
+
windowsHide: true,
|
|
61
|
+
});
|
|
62
|
+
const timeout = setTimeout(() => {
|
|
63
|
+
child.kill();
|
|
64
|
+
reject(new Error('Timed out while checking npm registry'));
|
|
65
|
+
}, 5000);
|
|
66
|
+
child.stdout.on('data', (chunk) => {
|
|
67
|
+
stdoutBuffer += chunk.toString();
|
|
68
|
+
});
|
|
69
|
+
child.stderr.on('data', (chunk) => {
|
|
70
|
+
stderrBuffer += chunk.toString();
|
|
71
|
+
});
|
|
72
|
+
child.on('error', (error) => {
|
|
73
|
+
clearTimeout(timeout);
|
|
74
|
+
reject(error);
|
|
75
|
+
});
|
|
76
|
+
child.on('exit', (code) => {
|
|
77
|
+
clearTimeout(timeout);
|
|
78
|
+
if (code !== 0) {
|
|
79
|
+
reject(new Error(stderrBuffer.trim() || `npm exited with code ${code}`));
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
const version = parseNpmVersion(stdoutBuffer);
|
|
83
|
+
if (!version) {
|
|
84
|
+
reject(new Error('Unable to parse npm version output'));
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
resolve(version);
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
async function runUpdateCheckNotice(options = {}) {
|
|
92
|
+
const currentVersion = getPackageVersion();
|
|
93
|
+
const state = readUpdateCheckState();
|
|
94
|
+
const latestVersion = await resolveLatestVersion(currentVersion, state);
|
|
95
|
+
if (latestVersion && shouldNotifyAboutUpdate(currentVersion, latestVersion, state.notifiedVersion)) {
|
|
96
|
+
emitUpdateNotice(currentVersion, latestVersion, options);
|
|
97
|
+
writeUpdateCheckState({
|
|
98
|
+
lastCheckedAt: Date.now(),
|
|
99
|
+
latestVersion,
|
|
100
|
+
notifiedVersion: latestVersion,
|
|
101
|
+
});
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
if (!latestVersion || compareVersions(latestVersion, currentVersion) <= 0) {
|
|
105
|
+
writeUpdateCheckState({
|
|
106
|
+
lastCheckedAt: Date.now(),
|
|
107
|
+
latestVersion: latestVersion ?? currentVersion,
|
|
108
|
+
notifiedVersion: undefined,
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
function emitUpdateNotice(currentVersion, latestVersion, options) {
|
|
113
|
+
const env = options.env ?? process.env;
|
|
114
|
+
const isInteractive = options.isInteractive ?? (stdin.isTTY && stdout.isTTY);
|
|
115
|
+
const isDaemon = env.AGENT_LIFE_BRIDGE_DAEMON === '1';
|
|
116
|
+
const message = `New ${UPDATE_PACKAGE_NAME} version ${latestVersion} is available (current: ${currentVersion}). Run \`alb update\` to upgrade.`;
|
|
117
|
+
if (isDaemon && options.logger) {
|
|
118
|
+
options.logger.warn({ currentVersion, latestVersion }, message);
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
if (isInteractive) {
|
|
122
|
+
console.log(`\n${message}\n`);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
async function resolveLatestVersion(currentVersion, state) {
|
|
126
|
+
const now = Date.now();
|
|
127
|
+
const cachedLatest = state.latestVersion ?? null;
|
|
128
|
+
const isStale = !state.lastCheckedAt || now - state.lastCheckedAt >= UPDATE_CHECK_TTL_MS;
|
|
129
|
+
if (!isStale && cachedLatest) {
|
|
130
|
+
return cachedLatest;
|
|
131
|
+
}
|
|
132
|
+
try {
|
|
133
|
+
const latestVersion = await fetchLatestVersionFromNpm();
|
|
134
|
+
writeUpdateCheckState({
|
|
135
|
+
...state,
|
|
136
|
+
lastCheckedAt: now,
|
|
137
|
+
latestVersion,
|
|
138
|
+
notifiedVersion: latestVersion === state.notifiedVersion ? state.notifiedVersion : undefined,
|
|
139
|
+
});
|
|
140
|
+
return latestVersion;
|
|
141
|
+
}
|
|
142
|
+
catch {
|
|
143
|
+
writeUpdateCheckState({
|
|
144
|
+
...state,
|
|
145
|
+
lastCheckedAt: now,
|
|
146
|
+
latestVersion: cachedLatest ?? currentVersion,
|
|
147
|
+
});
|
|
148
|
+
return cachedLatest;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
function parseNpmVersion(raw) {
|
|
152
|
+
const trimmed = raw.trim();
|
|
153
|
+
if (!trimmed)
|
|
154
|
+
return null;
|
|
155
|
+
try {
|
|
156
|
+
const parsed = JSON.parse(trimmed);
|
|
157
|
+
return typeof parsed === 'string' ? parsed : null;
|
|
158
|
+
}
|
|
159
|
+
catch {
|
|
160
|
+
return trimmed;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
function readUpdateCheckState() {
|
|
164
|
+
if (!existsSync(UPDATE_CHECK_STATE_PATH)) {
|
|
165
|
+
return {};
|
|
166
|
+
}
|
|
167
|
+
try {
|
|
168
|
+
return JSON.parse(readFileSync(UPDATE_CHECK_STATE_PATH, 'utf-8'));
|
|
169
|
+
}
|
|
170
|
+
catch {
|
|
171
|
+
return {};
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
function writeUpdateCheckState(state) {
|
|
175
|
+
mkdirSync(DATA_DIR, { recursive: true });
|
|
176
|
+
writeFileSync(UPDATE_CHECK_STATE_PATH, `${JSON.stringify(state, null, 2)}\n`, 'utf-8');
|
|
177
|
+
}
|
|
178
|
+
function normalizeVersion(version) {
|
|
179
|
+
return version
|
|
180
|
+
.trim()
|
|
181
|
+
.replace(/^v/i, '')
|
|
182
|
+
.split('-', 1)[0]
|
|
183
|
+
.split('.')
|
|
184
|
+
.map(part => Number.parseInt(part, 10))
|
|
185
|
+
.map(part => (Number.isFinite(part) ? part : 0));
|
|
186
|
+
}
|
|
187
|
+
//# sourceMappingURL=update-check.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-check.js","sourceRoot":"","sources":["../../src/cli/update-check.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export type RoutedCommand = {
|
|
2
|
+
kind: 'plain';
|
|
3
|
+
raw: string;
|
|
4
|
+
} | {
|
|
5
|
+
kind: 'bridge';
|
|
6
|
+
command: string;
|
|
7
|
+
argsText: string;
|
|
8
|
+
isLegacyAlias: boolean;
|
|
9
|
+
canonicalText: string;
|
|
10
|
+
} | {
|
|
11
|
+
kind: 'cli';
|
|
12
|
+
command: string;
|
|
13
|
+
argsText: string;
|
|
14
|
+
forwardedText: string;
|
|
15
|
+
};
|
|
16
|
+
export declare function routeCommandText(text: string): RoutedCommand;
|
|
17
|
+
//# sourceMappingURL=prefix-router.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prefix-router.d.ts","sourceRoot":"","sources":["../../src/commands/prefix-router.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,aAAa,GACrB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,OAAO,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,GACpG;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,CAAA;AAgD7E,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CAgD5D"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
const CLI_COMMANDS_ALLOW_ARGS = new Set([
|
|
2
|
+
'commit',
|
|
3
|
+
]);
|
|
4
|
+
function tokenizeArgs(argsText) {
|
|
5
|
+
return argsText.match(/"[^"\\]*(?:\\.[^"\\]*)*"|'[^'\\]*(?:\\.[^'\\]*)*'|\S+/g) ?? [];
|
|
6
|
+
}
|
|
7
|
+
function sanitizeCliArgs(command, argsText) {
|
|
8
|
+
if (!argsText.trim()) {
|
|
9
|
+
return '';
|
|
10
|
+
}
|
|
11
|
+
if (!CLI_COMMANDS_ALLOW_ARGS.has(command)) {
|
|
12
|
+
return '';
|
|
13
|
+
}
|
|
14
|
+
const tokens = tokenizeArgs(argsText);
|
|
15
|
+
const keptTokens = [];
|
|
16
|
+
let expectingOptionValue = false;
|
|
17
|
+
for (const token of tokens) {
|
|
18
|
+
if (token.startsWith('@')) {
|
|
19
|
+
break;
|
|
20
|
+
}
|
|
21
|
+
if (expectingOptionValue) {
|
|
22
|
+
keptTokens.push(token);
|
|
23
|
+
expectingOptionValue = false;
|
|
24
|
+
continue;
|
|
25
|
+
}
|
|
26
|
+
if (!token.startsWith('-')) {
|
|
27
|
+
break;
|
|
28
|
+
}
|
|
29
|
+
keptTokens.push(token);
|
|
30
|
+
if (!token.includes('=')) {
|
|
31
|
+
expectingOptionValue = true;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return keptTokens.join(' ');
|
|
35
|
+
}
|
|
36
|
+
export function routeCommandText(text) {
|
|
37
|
+
const trimmed = text.trim();
|
|
38
|
+
if (!trimmed.startsWith('/')) {
|
|
39
|
+
return { kind: 'plain', raw: text };
|
|
40
|
+
}
|
|
41
|
+
const match = /^\/(\S+)(?:\s+([\s\S]*))?$/.exec(trimmed);
|
|
42
|
+
if (!match) {
|
|
43
|
+
return { kind: 'plain', raw: text };
|
|
44
|
+
}
|
|
45
|
+
const token = match[1].trim();
|
|
46
|
+
const normalizedToken = token.toLowerCase();
|
|
47
|
+
const argsText = match[2]?.trim() ?? '';
|
|
48
|
+
if (normalizedToken === 'new') {
|
|
49
|
+
return {
|
|
50
|
+
kind: 'bridge',
|
|
51
|
+
command: 'new',
|
|
52
|
+
argsText,
|
|
53
|
+
isLegacyAlias: true,
|
|
54
|
+
canonicalText: argsText ? `/br:new ${argsText}` : '/br:new',
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
if (normalizedToken.startsWith('br:')) {
|
|
58
|
+
const command = normalizedToken.slice(3);
|
|
59
|
+
return {
|
|
60
|
+
kind: 'bridge',
|
|
61
|
+
command,
|
|
62
|
+
argsText,
|
|
63
|
+
isLegacyAlias: false,
|
|
64
|
+
canonicalText: argsText ? `/br:${command} ${argsText}` : `/br:${command}`,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
if (normalizedToken.startsWith('cli:')) {
|
|
68
|
+
const command = normalizedToken.slice(4);
|
|
69
|
+
const sanitizedArgsText = sanitizeCliArgs(command, argsText);
|
|
70
|
+
return {
|
|
71
|
+
kind: 'cli',
|
|
72
|
+
command,
|
|
73
|
+
argsText: sanitizedArgsText,
|
|
74
|
+
forwardedText: sanitizedArgsText ? `/${command} ${sanitizedArgsText}` : `/${command}`,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
return { kind: 'plain', raw: text };
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=prefix-router.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prefix-router.js","sourceRoot":"","sources":["../../src/commands/prefix-router.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ensure data directories exist.
|
|
3
|
+
*
|
|
4
|
+
* ~/.agent-life-bridge/
|
|
5
|
+
* ├── data/
|
|
6
|
+
* │ ├── sessions/
|
|
7
|
+
* │ ├── files/
|
|
8
|
+
* │ └── logs/
|
|
9
|
+
* ├── agents/
|
|
10
|
+
* │ ├── {agentId}/
|
|
11
|
+
* │ │ └── cli-sessions.json
|
|
12
|
+
* │ └── ...
|
|
13
|
+
* └── skills/
|
|
14
|
+
*/
|
|
15
|
+
export declare function ensureDataDirs(tempDir?: string): void;
|
|
16
|
+
/**
|
|
17
|
+
* Ensure per-agent state directories exist.
|
|
18
|
+
* Validates that no two agents share the same state directory.
|
|
19
|
+
*
|
|
20
|
+
* On first run, migrates the legacy
|
|
21
|
+
* ~/.agent-life-bridge/data/sessions/cli-sessions.json → agents/{defaultAgentId}/cli-sessions.json
|
|
22
|
+
*/
|
|
23
|
+
export declare function ensureAgentStateDirs(agentIds: string[], defaultAgentId: string): void;
|
|
24
|
+
//# sourceMappingURL=agent-dirs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-dirs.d.ts","sourceRoot":"","sources":["../../src/config/agent-dirs.ts"],"names":[],"mappings":"AAaA;;;;;;;;;;;;;GAaG;AACH,wBAAgB,cAAc,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAgBrD;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,cAAc,EAAE,MAAM,GAAG,IAAI,CAoBrF"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { mkdirSync, existsSync, copyFileSync } from 'node:fs';
|
|
2
|
+
import { resolve } from 'node:path';
|
|
3
|
+
import { DATA_DIR, DATA_SESSIONS_DIR, DATA_CLI_SESSION_STORE_PATH, DATA_FILES_DIR, DATA_LOGS_DIR, DATA_SKILLS_DIR, agentStatePath, agentSessionStorePath, } from './paths.js';
|
|
4
|
+
/**
|
|
5
|
+
* Ensure data directories exist.
|
|
6
|
+
*
|
|
7
|
+
* ~/.agent-life-bridge/
|
|
8
|
+
* ├── data/
|
|
9
|
+
* │ ├── sessions/
|
|
10
|
+
* │ ├── files/
|
|
11
|
+
* │ └── logs/
|
|
12
|
+
* ├── agents/
|
|
13
|
+
* │ ├── {agentId}/
|
|
14
|
+
* │ │ └── cli-sessions.json
|
|
15
|
+
* │ └── ...
|
|
16
|
+
* └── skills/
|
|
17
|
+
*/
|
|
18
|
+
export function ensureDataDirs(tempDir) {
|
|
19
|
+
const dirs = [
|
|
20
|
+
DATA_DIR,
|
|
21
|
+
DATA_SESSIONS_DIR,
|
|
22
|
+
DATA_FILES_DIR,
|
|
23
|
+
DATA_LOGS_DIR,
|
|
24
|
+
DATA_SKILLS_DIR,
|
|
25
|
+
tempDir,
|
|
26
|
+
].filter(Boolean);
|
|
27
|
+
for (const dir of dirs) {
|
|
28
|
+
const resolved = resolve(dir);
|
|
29
|
+
if (!existsSync(resolved)) {
|
|
30
|
+
mkdirSync(resolved, { recursive: true });
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Ensure per-agent state directories exist.
|
|
36
|
+
* Validates that no two agents share the same state directory.
|
|
37
|
+
*
|
|
38
|
+
* On first run, migrates the legacy
|
|
39
|
+
* ~/.agent-life-bridge/data/sessions/cli-sessions.json → agents/{defaultAgentId}/cli-sessions.json
|
|
40
|
+
*/
|
|
41
|
+
export function ensureAgentStateDirs(agentIds, defaultAgentId) {
|
|
42
|
+
const seen = new Map();
|
|
43
|
+
for (const agentId of agentIds) {
|
|
44
|
+
const dir = resolve(agentStatePath(agentId));
|
|
45
|
+
const existing = seen.get(dir);
|
|
46
|
+
if (existing) {
|
|
47
|
+
throw new Error(`Agent state directory conflict: agents "${existing}" and "${agentId}" resolve to the same path: ${dir}`);
|
|
48
|
+
}
|
|
49
|
+
seen.set(dir, agentId);
|
|
50
|
+
if (!existsSync(dir)) {
|
|
51
|
+
mkdirSync(dir, { recursive: true });
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
// Migrate legacy session store to the default agent's directory
|
|
55
|
+
migrateLegacySessionStore(defaultAgentId);
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* If the legacy cli-sessions.json exists and the default agent's store doesn't,
|
|
59
|
+
* copy the legacy file into the default agent's state directory.
|
|
60
|
+
*/
|
|
61
|
+
function migrateLegacySessionStore(defaultAgentId) {
|
|
62
|
+
const legacyPath = resolve(DATA_CLI_SESSION_STORE_PATH);
|
|
63
|
+
if (!existsSync(legacyPath))
|
|
64
|
+
return;
|
|
65
|
+
const targetPath = resolve(agentSessionStorePath(defaultAgentId));
|
|
66
|
+
if (existsSync(targetPath))
|
|
67
|
+
return;
|
|
68
|
+
// Copy (not move) — keep legacy file as backup until confirmed working
|
|
69
|
+
copyFileSync(legacyPath, targetPath);
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=agent-dirs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-dirs.js","sourceRoot":"","sources":["../../src/config/agent-dirs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAc,YAAY,EAAE,MAAM,SAAS,CAAA;AACzE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EACL,QAAQ,EACR,iBAAiB,EACjB,2BAA2B,EAC3B,cAAc,EACd,aAAa,EACb,eAAe,EACf,cAAc,EACd,qBAAqB,GACtB,MAAM,YAAY,CAAA;AAEnB;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,cAAc,CAAC,OAAgB;IAC7C,MAAM,IAAI,GAAG;QACX,QAAQ;QACR,iBAAiB;QACjB,cAAc;QACd,aAAa;QACb,eAAe;QACf,OAAO;KACR,CAAC,MAAM,CAAC,OAAO,CAAa,CAAA;IAE7B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,CAAA;QAC7B,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QAC1C,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB,CAAC,QAAkB,EAAE,cAAsB;IAC7E,MAAM,IAAI,GAAG,IAAI,GAAG,EAAkB,CAAA;IAEtC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,GAAG,GAAG,OAAO,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAA;QAC5C,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QAC9B,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CACb,2CAA2C,QAAQ,UAAU,OAAO,+BAA+B,GAAG,EAAE,CACzG,CAAA;QACH,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;QAEtB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACrB,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QACrC,CAAC;IACH,CAAC;IAED,gEAAgE;IAChE,yBAAyB,CAAC,cAAc,CAAC,CAAA;AAC3C,CAAC;AAED;;;GAGG;AACH,SAAS,yBAAyB,CAAC,cAAsB;IACvD,MAAM,UAAU,GAAG,OAAO,CAAC,2BAA2B,CAAC,CAAA;IACvD,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,OAAM;IAEnC,MAAM,UAAU,GAAG,OAAO,CAAC,qBAAqB,CAAC,cAAc,CAAC,CAAC,CAAA;IACjE,IAAI,UAAU,CAAC,UAAU,CAAC;QAAE,OAAM;IAElC,uEAAuE;IACvE,YAAY,CAAC,UAAU,EAAE,UAAU,CAAC,CAAA;AACtC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/config/config.ts"],"names":[],"mappings":"AAEA,OAAO,EAAmB,KAAK,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAKjE,wBAAgB,iBAAiB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAiBpE;AAED,wBAAgB,UAAU,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAsBzD"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { readFileSync, existsSync } from 'node:fs';
|
|
2
|
+
import { resolve } from 'node:path';
|
|
3
|
+
import { AppConfigSchema } from './zod-schema.js';
|
|
4
|
+
import { readEnvOverrides } from './env-vars.js';
|
|
5
|
+
import { mergeWithEnv } from './merge-config.js';
|
|
6
|
+
import { DATA_CONFIG_PATH } from './paths.js';
|
|
7
|
+
export function resolveConfigPath(configPath) {
|
|
8
|
+
const env = readEnvOverrides();
|
|
9
|
+
const paths = [
|
|
10
|
+
configPath,
|
|
11
|
+
env.configPath,
|
|
12
|
+
'./config.json',
|
|
13
|
+
DATA_CONFIG_PATH,
|
|
14
|
+
].filter(Boolean);
|
|
15
|
+
for (const candidate of paths) {
|
|
16
|
+
const resolved = resolve(candidate);
|
|
17
|
+
if (existsSync(resolved)) {
|
|
18
|
+
return resolved;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
export function loadConfig(configPath) {
|
|
24
|
+
const env = readEnvOverrides();
|
|
25
|
+
let rawConfig = {};
|
|
26
|
+
const resolvedConfigPath = resolveConfigPath(configPath);
|
|
27
|
+
if (resolvedConfigPath) {
|
|
28
|
+
const content = readFileSync(resolvedConfigPath, 'utf-8').replace(/^\uFEFF/, '');
|
|
29
|
+
rawConfig = JSON.parse(content);
|
|
30
|
+
}
|
|
31
|
+
// Merge environment variable overrides
|
|
32
|
+
const merged = mergeWithEnv(rawConfig, env);
|
|
33
|
+
const result = AppConfigSchema.safeParse(merged);
|
|
34
|
+
if (!result.success) {
|
|
35
|
+
const issues = result.error.issues
|
|
36
|
+
.map(i => ` ${i.path.join('.')}: ${i.message}`)
|
|
37
|
+
.join('\n');
|
|
38
|
+
throw new Error(`Configuration error:\n${issues}`);
|
|
39
|
+
}
|
|
40
|
+
return result.data;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,eAAe,EAAkB,MAAM,iBAAiB,CAAA;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAE7C,MAAM,UAAU,iBAAiB,CAAC,UAAmB;IACnD,MAAM,GAAG,GAAG,gBAAgB,EAAE,CAAA;IAC9B,MAAM,KAAK,GAAG;QACZ,UAAU;QACV,GAAG,CAAC,UAAU;QACd,eAAe;QACf,gBAAgB;KACjB,CAAC,MAAM,CAAC,OAAO,CAAa,CAAA;IAE7B,KAAK,MAAM,SAAS,IAAI,KAAK,EAAE,CAAC;QAC9B,MAAM,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC,CAAA;QACnC,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzB,OAAO,QAAQ,CAAA;QACjB,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAA;AACb,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,UAAmB;IAC5C,MAAM,GAAG,GAAG,gBAAgB,EAAE,CAAA;IAE9B,IAAI,SAAS,GAA4B,EAAE,CAAA;IAC3C,MAAM,kBAAkB,GAAG,iBAAiB,CAAC,UAAU,CAAC,CAAA;IACxD,IAAI,kBAAkB,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,YAAY,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAA;QAChF,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAA4B,CAAA;IAC5D,CAAC;IAED,uCAAuC;IACvC,MAAM,MAAM,GAAG,YAAY,CAAC,SAAS,EAAE,GAAG,CAAC,CAAA;IAE3C,MAAM,MAAM,GAAG,eAAe,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;IAChD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM;aAC/B,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;aAC/C,IAAI,CAAC,IAAI,CAAC,CAAA;QACb,MAAM,IAAI,KAAK,CAAC,yBAAyB,MAAM,EAAE,CAAC,CAAA;IACpD,CAAC;IAED,OAAO,MAAM,CAAC,IAAI,CAAA;AACpB,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type AppConfig } from './zod-schema.js';
|
|
2
|
+
export declare const ONBOARD_MODEL_CHOICES: readonly ["claude-cli/opus-4.6", "codex-cli/gpt-5.4", "qwen-cli/qwen3-coder-plus", "anthropic/claude-sonnet-4-6"];
|
|
3
|
+
export interface CreateDefaultConfigParams {
|
|
4
|
+
gatewayUrl: string;
|
|
5
|
+
botToken: string;
|
|
6
|
+
selectedModel: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function createDefaultConfig({ gatewayUrl, botToken, selectedModel, }: CreateDefaultConfigParams): AppConfig;
|
|
9
|
+
//# sourceMappingURL=default-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"default-config.d.ts","sourceRoot":"","sources":["../../src/config/default-config.ts"],"names":[],"mappings":"AAEA,OAAO,EAA6E,KAAK,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAE3H,eAAO,MAAM,qBAAqB,mHAKxB,CAAA;AAEV,MAAM,WAAW,yBAAyB;IACxC,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAA;IAChB,aAAa,EAAE,MAAM,CAAA;CACtB;AA+CD,wBAAgB,mBAAmB,CAAC,EAClC,UAAU,EACV,QAAQ,EACR,aAAa,GACd,EAAE,yBAAyB,GAAG,SAAS,CA4CvC"}
|