@alvax-ai/opc 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/commands/run.d.ts +11 -0
- package/dist/commands/run.d.ts.map +1 -0
- package/dist/commands/run.js +121 -0
- package/dist/commands/run.js.map +1 -0
- package/dist/config/env.d.ts +3 -0
- package/dist/config/env.d.ts.map +1 -0
- package/dist/config/env.js +17 -0
- package/dist/config/env.js.map +1 -0
- package/dist/config/home.d.ts +18 -0
- package/dist/config/home.d.ts.map +1 -0
- package/dist/config/home.js +53 -0
- package/dist/config/home.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +30 -0
- package/dist/index.js.map +1 -0
- package/dist/startup-banner.d.ts +9 -0
- package/dist/startup-banner.d.ts.map +1 -0
- package/dist/startup-banner.js +24 -0
- package/dist/startup-banner.js.map +1 -0
- package/package.json +53 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"AAaA,KAAK,UAAU,GAAG;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,CAAC;AA4EF,wBAAsB,UAAU,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CA2DhE"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import open from "open";
|
|
4
|
+
import pc from "picocolors";
|
|
5
|
+
import { loadAlvaxEnvFile } from "../config/env.js";
|
|
6
|
+
import { describeLocalInstancePaths, expandHomePrefix, resolveAlvaxHomeDir, resolveAlvaxInstanceId, } from "../config/home.js";
|
|
7
|
+
import { printBrowserFallback, printStartupBanner } from "../startup-banner.js";
|
|
8
|
+
function setDefaultEnv(key, value) {
|
|
9
|
+
if (process.env[key]?.trim())
|
|
10
|
+
return;
|
|
11
|
+
process.env[key] = value;
|
|
12
|
+
}
|
|
13
|
+
function setOptionEnv(key, value) {
|
|
14
|
+
const trimmed = value?.trim();
|
|
15
|
+
if (!trimmed)
|
|
16
|
+
return;
|
|
17
|
+
process.env[key] = trimmed;
|
|
18
|
+
}
|
|
19
|
+
function parsePort(raw) {
|
|
20
|
+
if (raw === undefined)
|
|
21
|
+
return undefined;
|
|
22
|
+
const value = raw.trim();
|
|
23
|
+
const parsed = Number(value);
|
|
24
|
+
if (!Number.isInteger(parsed) || parsed < 1 || parsed > 65535) {
|
|
25
|
+
throw new Error(`Invalid port '${raw}'. Expected a number between 1 and 65535.`);
|
|
26
|
+
}
|
|
27
|
+
return String(parsed);
|
|
28
|
+
}
|
|
29
|
+
function resolveHomeOverride(opts) {
|
|
30
|
+
const raw = opts.home?.trim() || opts.dataDir?.trim();
|
|
31
|
+
if (!raw)
|
|
32
|
+
return null;
|
|
33
|
+
return path.resolve(expandHomePrefix(raw));
|
|
34
|
+
}
|
|
35
|
+
async function importServerEntry() {
|
|
36
|
+
// Keep the specifier widened so CLI typecheck does not compile server source.
|
|
37
|
+
const serverPackageName = "@alvax-ai/server";
|
|
38
|
+
const mod = await import(serverPackageName);
|
|
39
|
+
const startServer = mod.startServer;
|
|
40
|
+
if (typeof startServer !== "function") {
|
|
41
|
+
throw new Error("@alvax-ai/server did not export startServer(). Rebuild or reinstall Alvax.");
|
|
42
|
+
}
|
|
43
|
+
return { startServer };
|
|
44
|
+
}
|
|
45
|
+
async function openBrowser(url) {
|
|
46
|
+
try {
|
|
47
|
+
await open(url);
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
printBrowserFallback(url);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
async function presentStartedServer(startedServer, opts) {
|
|
54
|
+
printStartupBanner({
|
|
55
|
+
apiUrl: startedServer.apiUrl,
|
|
56
|
+
uiUrl: startedServer.uiUrl,
|
|
57
|
+
uiMode: startedServer.uiMode,
|
|
58
|
+
});
|
|
59
|
+
const browserUrl = startedServer.uiUrl;
|
|
60
|
+
if (browserUrl) {
|
|
61
|
+
if (opts.open !== false) {
|
|
62
|
+
await openBrowser(browserUrl);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
console.log(pc.yellow(`UI is disabled. API URL: ${startedServer.apiUrl}`));
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
export async function runCommand(opts) {
|
|
70
|
+
const homeOverride = resolveHomeOverride(opts);
|
|
71
|
+
if (homeOverride)
|
|
72
|
+
process.env.ALVAX_HOME = homeOverride;
|
|
73
|
+
process.env.ALVAX_HOME = resolveAlvaxHomeDir();
|
|
74
|
+
const instanceId = resolveAlvaxInstanceId(opts.instance);
|
|
75
|
+
process.env.ALVAX_INSTANCE_ID = instanceId;
|
|
76
|
+
const paths = describeLocalInstancePaths(instanceId);
|
|
77
|
+
fs.mkdirSync(paths.instanceRoot, { recursive: true });
|
|
78
|
+
loadAlvaxEnvFile(instanceId);
|
|
79
|
+
setOptionEnv("ALVAX_HOST", opts.host);
|
|
80
|
+
setOptionEnv("ALVAX_PORT", parsePort(opts.port));
|
|
81
|
+
setDefaultEnv("ALVAX_HOST", "127.0.0.1");
|
|
82
|
+
setDefaultEnv("ALVAX_PORT", "3100");
|
|
83
|
+
setDefaultEnv("ALVAX_UI_MODE", "static");
|
|
84
|
+
setDefaultEnv("ALVAX_CONSOLE_LOG_LEVEL", process.env.ALVAX_LOG_LEVEL?.trim() || "warn");
|
|
85
|
+
setDefaultEnv("ALVAX_HTTP_SUCCESS_LOGS", "false");
|
|
86
|
+
console.log(pc.cyan("Starting Alvax..."));
|
|
87
|
+
let startedServer = null;
|
|
88
|
+
let startPromise = null;
|
|
89
|
+
let shuttingDown = false;
|
|
90
|
+
const shutdown = (signal) => {
|
|
91
|
+
if (shuttingDown)
|
|
92
|
+
return;
|
|
93
|
+
shuttingDown = true;
|
|
94
|
+
void (async () => {
|
|
95
|
+
try {
|
|
96
|
+
await startPromise?.catch(() => { });
|
|
97
|
+
await startedServer?.stop();
|
|
98
|
+
}
|
|
99
|
+
catch (err) {
|
|
100
|
+
console.error(`Failed to stop Alvax cleanly after ${signal}:`, err instanceof Error ? err.message : String(err));
|
|
101
|
+
}
|
|
102
|
+
finally {
|
|
103
|
+
process.exit(0);
|
|
104
|
+
}
|
|
105
|
+
})();
|
|
106
|
+
};
|
|
107
|
+
process.once("SIGINT", () => shutdown("SIGINT"));
|
|
108
|
+
process.once("SIGTERM", () => shutdown("SIGTERM"));
|
|
109
|
+
startPromise = (async () => {
|
|
110
|
+
const { startServer } = await importServerEntry();
|
|
111
|
+
const server = await startServer();
|
|
112
|
+
startedServer = server;
|
|
113
|
+
if (shuttingDown) {
|
|
114
|
+
await server.stop();
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
await presentStartedServer(server, opts);
|
|
118
|
+
})();
|
|
119
|
+
await startPromise;
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=run.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/config/env.ts"],"names":[],"mappings":"AAMA,wBAAgB,mBAAmB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAE/D;AAED,wBAAgB,gBAAgB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAO1D"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import { config as loadDotenv } from "dotenv";
|
|
3
|
+
import { resolveDefaultEnvPath } from "./home.js";
|
|
4
|
+
const loadedEnvFiles = new Set();
|
|
5
|
+
export function resolveAlvaxEnvFile(instanceId) {
|
|
6
|
+
return resolveDefaultEnvPath(instanceId);
|
|
7
|
+
}
|
|
8
|
+
export function loadAlvaxEnvFile(instanceId) {
|
|
9
|
+
const filePath = resolveAlvaxEnvFile(instanceId);
|
|
10
|
+
if (loadedEnvFiles.has(filePath))
|
|
11
|
+
return;
|
|
12
|
+
if (!fs.existsSync(filePath))
|
|
13
|
+
return;
|
|
14
|
+
loadedEnvFiles.add(filePath);
|
|
15
|
+
loadDotenv({ path: filePath, override: false, quiet: true });
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=env.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/config/env.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAElD,MAAM,cAAc,GAAG,IAAI,GAAG,EAAU,CAAC;AAEzC,MAAM,UAAU,mBAAmB,CAAC,UAAmB;IACrD,OAAO,qBAAqB,CAAC,UAAU,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,UAAmB;IAClD,MAAM,QAAQ,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC;IACjD,IAAI,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC;QAAE,OAAO;IACzC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO;IAErC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC7B,UAAU,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAC/D,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export declare function expandHomePrefix(value: string): string;
|
|
2
|
+
export declare function resolveAlvaxHomeDir(): string;
|
|
3
|
+
export declare function resolveAlvaxInstanceId(override?: string): string;
|
|
4
|
+
export declare function resolveAlvaxInstanceRoot(instanceId?: string): string;
|
|
5
|
+
export declare function resolveDefaultEmbeddedPostgresDir(instanceId?: string): string;
|
|
6
|
+
export declare function resolveDefaultStorageDir(instanceId?: string): string;
|
|
7
|
+
export declare function resolveDefaultLogsDir(instanceId?: string): string;
|
|
8
|
+
export declare function resolveDefaultEnvPath(instanceId?: string): string;
|
|
9
|
+
export declare function describeLocalInstancePaths(instanceId?: string): {
|
|
10
|
+
homeDir: string;
|
|
11
|
+
instanceId: string;
|
|
12
|
+
instanceRoot: string;
|
|
13
|
+
envPath: string;
|
|
14
|
+
embeddedPostgresDataDir: string;
|
|
15
|
+
logDir: string;
|
|
16
|
+
storageDir: string;
|
|
17
|
+
};
|
|
18
|
+
//# sourceMappingURL=home.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"home.d.ts","sourceRoot":"","sources":["../../src/config/home.ts"],"names":[],"mappings":"AAMA,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAItD;AAED,wBAAgB,mBAAmB,IAAI,MAAM,CAI5C;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAQhE;AAED,wBAAgB,wBAAwB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAEpE;AAED,wBAAgB,iCAAiC,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAE7E;AAED,wBAAgB,wBAAwB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAEpE;AAED,wBAAgB,qBAAqB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAEjE;AAED,wBAAgB,qBAAqB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAEjE;AAED,wBAAgB,0BAA0B,CAAC,UAAU,CAAC,EAAE,MAAM;;;;;;;;EAY7D"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import os from "node:os";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
const DEFAULT_INSTANCE_ID = "default";
|
|
4
|
+
const INSTANCE_ID_RE = /^[a-zA-Z0-9_-]+$/;
|
|
5
|
+
export function expandHomePrefix(value) {
|
|
6
|
+
if (value === "~")
|
|
7
|
+
return os.homedir();
|
|
8
|
+
if (value.startsWith("~/"))
|
|
9
|
+
return path.resolve(os.homedir(), value.slice(2));
|
|
10
|
+
return value;
|
|
11
|
+
}
|
|
12
|
+
export function resolveAlvaxHomeDir() {
|
|
13
|
+
const envHome = process.env.ALVAX_HOME?.trim();
|
|
14
|
+
if (envHome)
|
|
15
|
+
return path.resolve(expandHomePrefix(envHome));
|
|
16
|
+
return path.resolve(os.homedir(), ".alvax");
|
|
17
|
+
}
|
|
18
|
+
export function resolveAlvaxInstanceId(override) {
|
|
19
|
+
const raw = override?.trim() || process.env.ALVAX_INSTANCE_ID?.trim() || DEFAULT_INSTANCE_ID;
|
|
20
|
+
if (!INSTANCE_ID_RE.test(raw)) {
|
|
21
|
+
throw new Error(`Invalid instance id '${raw}'. Allowed characters: letters, numbers, '_' and '-'.`);
|
|
22
|
+
}
|
|
23
|
+
return raw;
|
|
24
|
+
}
|
|
25
|
+
export function resolveAlvaxInstanceRoot(instanceId) {
|
|
26
|
+
return path.resolve(resolveAlvaxHomeDir(), "instances", resolveAlvaxInstanceId(instanceId));
|
|
27
|
+
}
|
|
28
|
+
export function resolveDefaultEmbeddedPostgresDir(instanceId) {
|
|
29
|
+
return path.resolve(resolveAlvaxInstanceRoot(instanceId), "db");
|
|
30
|
+
}
|
|
31
|
+
export function resolveDefaultStorageDir(instanceId) {
|
|
32
|
+
return path.resolve(resolveAlvaxInstanceRoot(instanceId), "data", "storage");
|
|
33
|
+
}
|
|
34
|
+
export function resolveDefaultLogsDir(instanceId) {
|
|
35
|
+
return path.resolve(resolveAlvaxInstanceRoot(instanceId), "logs");
|
|
36
|
+
}
|
|
37
|
+
export function resolveDefaultEnvPath(instanceId) {
|
|
38
|
+
return path.resolve(resolveAlvaxInstanceRoot(instanceId), ".env");
|
|
39
|
+
}
|
|
40
|
+
export function describeLocalInstancePaths(instanceId) {
|
|
41
|
+
const resolvedInstanceId = resolveAlvaxInstanceId(instanceId);
|
|
42
|
+
const instanceRoot = resolveAlvaxInstanceRoot(resolvedInstanceId);
|
|
43
|
+
return {
|
|
44
|
+
homeDir: resolveAlvaxHomeDir(),
|
|
45
|
+
instanceId: resolvedInstanceId,
|
|
46
|
+
instanceRoot,
|
|
47
|
+
envPath: resolveDefaultEnvPath(resolvedInstanceId),
|
|
48
|
+
embeddedPostgresDataDir: resolveDefaultEmbeddedPostgresDir(resolvedInstanceId),
|
|
49
|
+
logDir: resolveDefaultLogsDir(resolvedInstanceId),
|
|
50
|
+
storageDir: resolveDefaultStorageDir(resolvedInstanceId),
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=home.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"home.js","sourceRoot":"","sources":["../../src/config/home.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,mBAAmB,GAAG,SAAS,CAAC;AACtC,MAAM,cAAc,GAAG,kBAAkB,CAAC;AAE1C,MAAM,UAAU,gBAAgB,CAAC,KAAa;IAC5C,IAAI,KAAK,KAAK,GAAG;QAAE,OAAO,EAAE,CAAC,OAAO,EAAE,CAAC;IACvC,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9E,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,mBAAmB;IACjC,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC;IAC/C,IAAI,OAAO;QAAE,OAAO,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC;IAC5D,OAAO,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,QAAiB;IACtD,MAAM,GAAG,GAAG,QAAQ,EAAE,IAAI,EAAE,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,IAAI,EAAE,IAAI,mBAAmB,CAAC;IAC7F,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CACb,wBAAwB,GAAG,uDAAuD,CACnF,CAAC;IACJ,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,UAAmB;IAC1D,OAAO,IAAI,CAAC,OAAO,CAAC,mBAAmB,EAAE,EAAE,WAAW,EAAE,sBAAsB,CAAC,UAAU,CAAC,CAAC,CAAC;AAC9F,CAAC;AAED,MAAM,UAAU,iCAAiC,CAAC,UAAmB;IACnE,OAAO,IAAI,CAAC,OAAO,CAAC,wBAAwB,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC,CAAC;AAClE,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,UAAmB;IAC1D,OAAO,IAAI,CAAC,OAAO,CAAC,wBAAwB,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;AAC/E,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,UAAmB;IACvD,OAAO,IAAI,CAAC,OAAO,CAAC,wBAAwB,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC,CAAC;AACpE,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,UAAmB;IACvD,OAAO,IAAI,CAAC,OAAO,CAAC,wBAAwB,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC,CAAC;AACpE,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,UAAmB;IAC5D,MAAM,kBAAkB,GAAG,sBAAsB,CAAC,UAAU,CAAC,CAAC;IAC9D,MAAM,YAAY,GAAG,wBAAwB,CAAC,kBAAkB,CAAC,CAAC;IAClE,OAAO;QACL,OAAO,EAAE,mBAAmB,EAAE;QAC9B,UAAU,EAAE,kBAAkB;QAC9B,YAAY;QACZ,OAAO,EAAE,qBAAqB,CAAC,kBAAkB,CAAC;QAClD,uBAAuB,EAAE,iCAAiC,CAAC,kBAAkB,CAAC;QAC9E,MAAM,EAAE,qBAAqB,CAAC,kBAAkB,CAAC;QACjD,UAAU,EAAE,wBAAwB,CAAC,kBAAkB,CAAC;KACzD,CAAC;AACJ,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAIA,eAAO,MAAM,UAAU,UAAU,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Command } from "commander";
|
|
3
|
+
import { runCommand } from "./commands/run.js";
|
|
4
|
+
export const cliVersion = "0.1.0";
|
|
5
|
+
const program = new Command();
|
|
6
|
+
program
|
|
7
|
+
.name("alvax-opc")
|
|
8
|
+
.description("Alvax OPC command line interface")
|
|
9
|
+
.version(cliVersion);
|
|
10
|
+
program
|
|
11
|
+
.command("run")
|
|
12
|
+
.description("Start the local Alvax server")
|
|
13
|
+
.option("-i, --instance <id>", "Local instance id (default: default)")
|
|
14
|
+
.option("--home <path>", "Alvax home directory root (default: ~/.alvax)")
|
|
15
|
+
.option("-d, --data-dir <path>", "Alias for --home")
|
|
16
|
+
.option("--host <host>", "Server host (default: 127.0.0.1)")
|
|
17
|
+
.option("--port <port>", "Server port (default: 3100)")
|
|
18
|
+
.option("--no-open", "Do not open the browser automatically")
|
|
19
|
+
.action(runCommand);
|
|
20
|
+
async function main() {
|
|
21
|
+
try {
|
|
22
|
+
await program.parseAsync();
|
|
23
|
+
}
|
|
24
|
+
catch (err) {
|
|
25
|
+
console.error(err instanceof Error ? err.message : String(err));
|
|
26
|
+
process.exit(1);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
void main();
|
|
30
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C,MAAM,CAAC,MAAM,UAAU,GAAG,OAAO,CAAC;AAElC,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,WAAW,CAAC;KACjB,WAAW,CAAC,kCAAkC,CAAC;KAC/C,OAAO,CAAC,UAAU,CAAC,CAAC;AAEvB,OAAO;KACJ,OAAO,CAAC,KAAK,CAAC;KACd,WAAW,CAAC,8BAA8B,CAAC;KAC3C,MAAM,CAAC,qBAAqB,EAAE,sCAAsC,CAAC;KACrE,MAAM,CAAC,eAAe,EAAE,+CAA+C,CAAC;KACxE,MAAM,CAAC,uBAAuB,EAAE,kBAAkB,CAAC;KACnD,MAAM,CAAC,eAAe,EAAE,kCAAkC,CAAC;KAC3D,MAAM,CAAC,eAAe,EAAE,6BAA6B,CAAC;KACtD,MAAM,CAAC,WAAW,EAAE,uCAAuC,CAAC;KAC5D,MAAM,CAAC,UAAU,CAAC,CAAC;AAEtB,KAAK,UAAU,IAAI;IACjB,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC;IAC7B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,KAAK,IAAI,EAAE,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
type StartupBannerOptions = {
|
|
2
|
+
apiUrl: string;
|
|
3
|
+
uiUrl: string | null;
|
|
4
|
+
uiMode: string;
|
|
5
|
+
};
|
|
6
|
+
export declare function printStartupBanner(opts: StartupBannerOptions): void;
|
|
7
|
+
export declare function printBrowserFallback(url: string): void;
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=startup-banner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"startup-banner.d.ts","sourceRoot":"","sources":["../src/startup-banner.ts"],"names":[],"mappings":"AAAA,KAAK,oBAAoB,GAAG;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAaF,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,oBAAoB,GAAG,IAAI,CAYnE;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAEtD"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
const ansi = {
|
|
2
|
+
reset: "\x1b[0m",
|
|
3
|
+
dim: "\x1b[2m",
|
|
4
|
+
green: "\x1b[32m",
|
|
5
|
+
yellow: "\x1b[33m",
|
|
6
|
+
};
|
|
7
|
+
function color(text, c) {
|
|
8
|
+
return `${ansi[c]}${text}${ansi.reset}`;
|
|
9
|
+
}
|
|
10
|
+
export function printStartupBanner(opts) {
|
|
11
|
+
const url = opts.uiUrl ?? opts.apiUrl;
|
|
12
|
+
const label = opts.uiMode === "none" ? "API URL" : "Open";
|
|
13
|
+
const lines = [
|
|
14
|
+
"",
|
|
15
|
+
color("Alvax is running", "green"),
|
|
16
|
+
`${color(label, "dim")}: ${url}`,
|
|
17
|
+
"",
|
|
18
|
+
];
|
|
19
|
+
console.log(lines.join("\n"));
|
|
20
|
+
}
|
|
21
|
+
export function printBrowserFallback(url) {
|
|
22
|
+
console.log(`${color("Browser did not open automatically.", "yellow")} Open manually: ${url}`);
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=startup-banner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"startup-banner.js","sourceRoot":"","sources":["../src/startup-banner.ts"],"names":[],"mappings":"AAMA,MAAM,IAAI,GAAG;IACX,KAAK,EAAE,SAAS;IAChB,GAAG,EAAE,SAAS;IACd,KAAK,EAAE,UAAU;IACjB,MAAM,EAAE,UAAU;CACnB,CAAC;AAEF,SAAS,KAAK,CAAC,IAAY,EAAE,CAAoB;IAC/C,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAA0B;IAC3D,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC;IACtC,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC;IAE1D,MAAM,KAAK,GAAG;QACZ,EAAE;QACF,KAAK,CAAC,kBAAkB,EAAE,OAAO,CAAC;QAClC,GAAG,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,GAAG,EAAE;QAChC,EAAE;KACH,CAAC;IAEF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,GAAW;IAC9C,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,qCAAqC,EAAE,QAAQ,CAAC,mBAAmB,GAAG,EAAE,CAAC,CAAC;AACjG,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@alvax-ai/opc",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Alvax OPC command line interface",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"alvax-opc": "./dist/index.js"
|
|
8
|
+
},
|
|
9
|
+
"keywords": [
|
|
10
|
+
"alvax",
|
|
11
|
+
"agents",
|
|
12
|
+
"orchestration",
|
|
13
|
+
"cli"
|
|
14
|
+
],
|
|
15
|
+
"license": "MIT",
|
|
16
|
+
"homepage": "https://github.com/varlife/alvax-mono-v2",
|
|
17
|
+
"bugs": {
|
|
18
|
+
"url": "https://github.com/varlife/alvax-mono-v2/issues"
|
|
19
|
+
},
|
|
20
|
+
"repository": {
|
|
21
|
+
"type": "git",
|
|
22
|
+
"url": "https://github.com/varlife/alvax-mono-v2",
|
|
23
|
+
"directory": "packages/cli"
|
|
24
|
+
},
|
|
25
|
+
"files": [
|
|
26
|
+
"dist"
|
|
27
|
+
],
|
|
28
|
+
"publishConfig": {
|
|
29
|
+
"access": "public"
|
|
30
|
+
},
|
|
31
|
+
"engines": {
|
|
32
|
+
"node": ">=20"
|
|
33
|
+
},
|
|
34
|
+
"dependencies": {
|
|
35
|
+
"@alvax-ai/db": "0.1.0",
|
|
36
|
+
"@alvax-ai/server": "0.1.0",
|
|
37
|
+
"commander": "^13.1.0",
|
|
38
|
+
"dotenv": "^17.0.1",
|
|
39
|
+
"open": "^11.0.0",
|
|
40
|
+
"picocolors": "^1.1.1"
|
|
41
|
+
},
|
|
42
|
+
"devDependencies": {
|
|
43
|
+
"@types/node": "^25.6.0",
|
|
44
|
+
"tsx": "^4.21.0",
|
|
45
|
+
"typescript": "^6.0.2"
|
|
46
|
+
},
|
|
47
|
+
"scripts": {
|
|
48
|
+
"dev": "tsx --conditions development src/index.ts",
|
|
49
|
+
"build": "tsc && chmod +x dist/index.js",
|
|
50
|
+
"typecheck": "tsc --noEmit",
|
|
51
|
+
"clean": "rm -rf dist"
|
|
52
|
+
}
|
|
53
|
+
}
|