@nodetool-ai/config 0.7.0-rc.11

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.
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Environment diagnostics — T-CFG-4.
3
+ *
4
+ * Enumerates registered settings and reports their status with
5
+ * masked values for secrets.
6
+ */
7
+ import { type SettingStatus } from "./settings.js";
8
+ export interface DiagnosticResult {
9
+ key: string;
10
+ group: string;
11
+ isSet: boolean;
12
+ isSecret: boolean;
13
+ maskedValue: string | null;
14
+ description: string;
15
+ }
16
+ /**
17
+ * Mask a secret value: show first 4 + last 4 chars with `***` in between.
18
+ * For short values (<=8 chars), mask entirely as `***`.
19
+ */
20
+ export declare function maskSecret(value: string): string;
21
+ /**
22
+ * Diagnose the current environment by checking all registered settings.
23
+ *
24
+ * @param settings Optional override — defaults to `getSettings()`.
25
+ */
26
+ export declare function diagnoseEnvironment(settings?: SettingStatus[]): DiagnosticResult[];
27
+ //# sourceMappingURL=diagnostics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnostics.d.ts","sourceRoot":"","sources":["../src/diagnostics.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAe,KAAK,aAAa,EAAE,MAAM,eAAe,CAAC;AAEhE,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAKhD;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,CAAC,EAAE,aAAa,EAAE,GACzB,gBAAgB,EAAE,CAqBpB"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Environment diagnostics — T-CFG-4.
3
+ *
4
+ * Enumerates registered settings and reports their status with
5
+ * masked values for secrets.
6
+ */
7
+ import { getSettings } from "./settings.js";
8
+ /**
9
+ * Mask a secret value: show first 4 + last 4 chars with `***` in between.
10
+ * For short values (<=8 chars), mask entirely as `***`.
11
+ */
12
+ export function maskSecret(value) {
13
+ if (value.length <= 8) {
14
+ return "***";
15
+ }
16
+ return `${value.slice(0, 4)}***${value.slice(-4)}`;
17
+ }
18
+ /**
19
+ * Diagnose the current environment by checking all registered settings.
20
+ *
21
+ * @param settings Optional override — defaults to `getSettings()`.
22
+ */
23
+ export function diagnoseEnvironment(settings) {
24
+ const resolved = settings ?? getSettings();
25
+ return resolved.map((setting) => {
26
+ const envValue = process.env[setting.envVar];
27
+ const isSet = !!envValue;
28
+ let maskedValue = null;
29
+ if (isSet && envValue) {
30
+ maskedValue = setting.isSecret ? maskSecret(envValue) : envValue;
31
+ }
32
+ return {
33
+ key: setting.envVar,
34
+ group: setting.group,
35
+ isSet,
36
+ isSecret: setting.isSecret,
37
+ maskedValue,
38
+ description: setting.description
39
+ };
40
+ });
41
+ }
42
+ //# sourceMappingURL=diagnostics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../src/diagnostics.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,WAAW,EAAsB,MAAM,eAAe,CAAC;AAWhE;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,KAAa;IACtC,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QACtB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACrD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CACjC,QAA0B;IAE1B,MAAM,QAAQ,GAAG,QAAQ,IAAI,WAAW,EAAE,CAAC;IAE3C,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;QAC9B,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC7C,MAAM,KAAK,GAAG,CAAC,CAAC,QAAQ,CAAC;QAEzB,IAAI,WAAW,GAAkB,IAAI,CAAC;QACtC,IAAI,KAAK,IAAI,QAAQ,EAAE,CAAC;YACtB,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;QACnE,CAAC;QAED,OAAO;YACL,GAAG,EAAE,OAAO,CAAC,MAAM;YACnB,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,KAAK;YACL,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,WAAW;YACX,WAAW,EAAE,OAAO,CAAC,WAAW;SACjC,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Load environment files in the correct order.
3
+ * System env vars always take precedence over file values.
4
+ *
5
+ * @param rootDir - Directory containing .env files. Defaults to cwd.
6
+ */
7
+ export declare function loadEnvironment(rootDir?: string): void;
8
+ /**
9
+ * Get an environment variable value.
10
+ * Falls back to process.env if loadEnvironment hasn't been called.
11
+ */
12
+ export declare function getEnv(key: string, defaultValue?: string): string | undefined;
13
+ /**
14
+ * Get a required environment variable. Throws if not set.
15
+ */
16
+ export declare function requireEnv(key: string): string;
17
+ /**
18
+ * Reset the loader state (for testing).
19
+ */
20
+ export declare function resetEnvironment(): void;
21
+ //# sourceMappingURL=environment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"environment.d.ts","sourceRoot":"","sources":["../src/environment.ts"],"names":[],"mappings":"AAaA;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAqCtD;AAED;;;GAGG;AACH,wBAAgB,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAK7E;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAM9C;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CAGvC"}
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Environment loader — T-CFG-1.
3
+ *
4
+ * Loads .env files in order: .env, .env.{NODE_ENV}, .env.{NODE_ENV}.local
5
+ * Later files override earlier ones. System env vars always win.
6
+ */
7
+ import { config as dotenvConfig } from "dotenv";
8
+ import { existsSync } from "node:fs";
9
+ import { resolve } from "node:path";
10
+ let loaded = false;
11
+ const envStore = new Map();
12
+ /**
13
+ * Load environment files in the correct order.
14
+ * System env vars always take precedence over file values.
15
+ *
16
+ * @param rootDir - Directory containing .env files. Defaults to cwd.
17
+ */
18
+ export function loadEnvironment(rootDir) {
19
+ const root = rootDir ?? process.cwd();
20
+ const nodeEnv = process.env.NODE_ENV ?? "development";
21
+ // Load files in order: .env, .env.{NODE_ENV}, .env.{NODE_ENV}.local
22
+ const files = [
23
+ resolve(root, ".env"),
24
+ resolve(root, `.env.${nodeEnv}`),
25
+ resolve(root, `.env.${nodeEnv}.local`)
26
+ ];
27
+ // Start fresh
28
+ envStore.clear();
29
+ // Snapshot system env before loading files
30
+ const systemEnv = { ...process.env };
31
+ for (const file of files) {
32
+ if (existsSync(file)) {
33
+ const result = dotenvConfig({ path: file, override: true });
34
+ if (result.parsed) {
35
+ for (const [key, value] of Object.entries(result.parsed)) {
36
+ envStore.set(key, value);
37
+ }
38
+ }
39
+ }
40
+ }
41
+ // System env always wins — restore original system values on top
42
+ for (const [key, value] of Object.entries(systemEnv)) {
43
+ if (value !== undefined) {
44
+ envStore.set(key, value);
45
+ process.env[key] = value;
46
+ }
47
+ }
48
+ loaded = true;
49
+ }
50
+ /**
51
+ * Get an environment variable value.
52
+ * Falls back to process.env if loadEnvironment hasn't been called.
53
+ */
54
+ export function getEnv(key, defaultValue) {
55
+ if (loaded) {
56
+ return envStore.get(key) ?? defaultValue;
57
+ }
58
+ return process.env[key] ?? defaultValue;
59
+ }
60
+ /**
61
+ * Get a required environment variable. Throws if not set.
62
+ */
63
+ export function requireEnv(key) {
64
+ const value = getEnv(key);
65
+ if (value === undefined || value === "") {
66
+ throw new Error(`Required environment variable ${key} is not set`);
67
+ }
68
+ return value;
69
+ }
70
+ /**
71
+ * Reset the loader state (for testing).
72
+ */
73
+ export function resetEnvironment() {
74
+ envStore.clear();
75
+ loaded = false;
76
+ }
77
+ //# sourceMappingURL=environment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"environment.js","sourceRoot":"","sources":["../src/environment.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,MAAM,IAAI,YAAY,EAAE,MAAM,QAAQ,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,IAAI,MAAM,GAAG,KAAK,CAAC;AACnB,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;AAE3C;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,OAAgB;IAC9C,MAAM,IAAI,GAAG,OAAO,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACtC,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,aAAa,CAAC;IAEtD,oEAAoE;IACpE,MAAM,KAAK,GAAG;QACZ,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;QACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,OAAO,EAAE,CAAC;QAChC,OAAO,CAAC,IAAI,EAAE,QAAQ,OAAO,QAAQ,CAAC;KACvC,CAAC;IAEF,cAAc;IACd,QAAQ,CAAC,KAAK,EAAE,CAAC;IAEjB,2CAA2C;IAC3C,MAAM,SAAS,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAErC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACrB,MAAM,MAAM,GAAG,YAAY,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;YAC5D,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;gBAClB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;oBACzD,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;gBAC3B,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,iEAAiE;IACjE,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QACrD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,MAAM,GAAG,IAAI,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,MAAM,CAAC,GAAW,EAAE,YAAqB;IACvD,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,YAAY,CAAC;IAC3C,CAAC;IACD,OAAO,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,YAAY,CAAC;AAC1C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,GAAW;IACpC,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAC1B,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;QACxC,MAAM,IAAI,KAAK,CAAC,iCAAiC,GAAG,aAAa,CAAC,CAAC;IACrE,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB;IAC9B,QAAQ,CAAC,KAAK,EAAE,CAAC;IACjB,MAAM,GAAG,KAAK,CAAC;AACjB,CAAC"}
@@ -0,0 +1,6 @@
1
+ export { loadEnvironment, getEnv, requireEnv, resetEnvironment } from "./environment.js";
2
+ export { registerSetting, getSettings, clearSettings, type SettingDefinition, type SettingStatus } from "./settings.js";
3
+ export { configureLogging, getLogLevel, createLogger, type LogLevel, type LoggingOptions, type Logger } from "./logging.js";
4
+ export { diagnoseEnvironment, maskSecret, type DiagnosticResult } from "./diagnostics.js";
5
+ export { getNodetoolDataDir, getDefaultDbPath, getDefaultVectorstoreDbPath, getDefaultAssetsPath, getDefaultTransformersJsCacheDir, getAssetFilePath, getAssetDomain, getTempDomain, buildAssetUrl } from "./paths.js";
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,MAAM,EACN,UAAU,EACV,gBAAgB,EACjB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,eAAe,EACf,WAAW,EACX,aAAa,EACb,KAAK,iBAAiB,EACtB,KAAK,aAAa,EACnB,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,gBAAgB,EAChB,WAAW,EACX,YAAY,EACZ,KAAK,QAAQ,EACb,KAAK,cAAc,EACnB,KAAK,MAAM,EACZ,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,mBAAmB,EACnB,UAAU,EACV,KAAK,gBAAgB,EACtB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,2BAA2B,EAC3B,oBAAoB,EACpB,gCAAgC,EAChC,gBAAgB,EAChB,cAAc,EACd,aAAa,EACb,aAAa,EACd,MAAM,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,6 @@
1
+ export { loadEnvironment, getEnv, requireEnv, resetEnvironment } from "./environment.js";
2
+ export { registerSetting, getSettings, clearSettings } from "./settings.js";
3
+ export { configureLogging, getLogLevel, createLogger } from "./logging.js";
4
+ export { diagnoseEnvironment, maskSecret } from "./diagnostics.js";
5
+ export { getNodetoolDataDir, getDefaultDbPath, getDefaultVectorstoreDbPath, getDefaultAssetsPath, getDefaultTransformersJsCacheDir, getAssetFilePath, getAssetDomain, getTempDomain, buildAssetUrl } from "./paths.js";
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,MAAM,EACN,UAAU,EACV,gBAAgB,EACjB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,eAAe,EACf,WAAW,EACX,aAAa,EAGd,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,gBAAgB,EAChB,WAAW,EACX,YAAY,EAIb,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,mBAAmB,EACnB,UAAU,EAEX,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,2BAA2B,EAC3B,oBAAoB,EACpB,gCAAgC,EAChC,gBAAgB,EAChB,cAAc,EACd,aAAa,EACb,aAAa,EACd,MAAM,YAAY,CAAC"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Logging — matches Python's nodetool logging format.
3
+ *
4
+ * Usage:
5
+ * import { createLogger } from "@nodetool-ai/config";
6
+ * const log = createLogger("nodetool.kernel.runner");
7
+ * log.info("Workflow started", { jobId });
8
+ * log.debug("Node executing", { nodeId, type });
9
+ */
10
+ export type LogLevel = "debug" | "info" | "warn" | "error";
11
+ export interface Logger {
12
+ debug(msg: string, ...args: unknown[]): void;
13
+ info(msg: string, ...args: unknown[]): void;
14
+ warn(msg: string, ...args: unknown[]): void;
15
+ error(msg: string, ...args: unknown[]): void;
16
+ }
17
+ export interface LoggingOptions {
18
+ level?: LogLevel;
19
+ }
20
+ /**
21
+ * Configure the global log level.
22
+ * Priority: explicit option > NODETOOL_LOG_LEVEL env > LOG_LEVEL env > "info"
23
+ *
24
+ * If NODETOOL_LOG_FILE is set, logs are written to that file instead of stderr.
25
+ * This is useful when the terminal is controlled by a TUI (e.g. Ink).
26
+ */
27
+ export declare function configureLogging(opts?: LoggingOptions): void;
28
+ /** Get the current global log level. */
29
+ export declare function getLogLevel(): LogLevel;
30
+ /**
31
+ * Create a named logger. Mirrors Python's logging.getLogger(__name__).
32
+ *
33
+ * @param name Module/component name, e.g. "nodetool.kernel.runner"
34
+ */
35
+ export declare function createLogger(name: string): Logger;
36
+ //# sourceMappingURL=logging.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logging.d.ts","sourceRoot":"","sources":["../src/logging.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAE3D,MAAM,WAAW,MAAM;IACrB,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAC7C,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAC5C,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAC5C,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;CAC9C;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,QAAQ,CAAC;CAClB;AAeD;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,GAAE,cAAmB,GAAG,IAAI,CAqBhE;AAED,wCAAwC;AACxC,wBAAgB,WAAW,IAAI,QAAQ,CAEtC;AAqFD;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAOjD"}
@@ -0,0 +1,140 @@
1
+ /**
2
+ * Logging — matches Python's nodetool logging format.
3
+ *
4
+ * Usage:
5
+ * import { createLogger } from "@nodetool-ai/config";
6
+ * const log = createLogger("nodetool.kernel.runner");
7
+ * log.info("Workflow started", { jobId });
8
+ * log.debug("Node executing", { nodeId, type });
9
+ */
10
+ import { openSync, writeSync } from "node:fs";
11
+ const VALID_LEVELS = ["debug", "info", "warn", "error"];
12
+ const LEVEL_NUM = {
13
+ debug: 0,
14
+ info: 1,
15
+ warn: 2,
16
+ error: 3
17
+ };
18
+ let currentLevel = "info";
19
+ /** File descriptor for log output. Defaults to stderr; set via NODETOOL_LOG_FILE. */
20
+ let logFd = null;
21
+ /**
22
+ * Configure the global log level.
23
+ * Priority: explicit option > NODETOOL_LOG_LEVEL env > LOG_LEVEL env > "info"
24
+ *
25
+ * If NODETOOL_LOG_FILE is set, logs are written to that file instead of stderr.
26
+ * This is useful when the terminal is controlled by a TUI (e.g. Ink).
27
+ */
28
+ export function configureLogging(opts = {}) {
29
+ if (opts.level) {
30
+ currentLevel = opts.level;
31
+ }
32
+ else {
33
+ const envLevel = (process.env["NODETOOL_LOG_LEVEL"] ??
34
+ process.env["LOG_LEVEL"] ??
35
+ "info").toLowerCase();
36
+ currentLevel = VALID_LEVELS.includes(envLevel) ? envLevel : "info";
37
+ }
38
+ // Open log file if configured (lazy import to keep module lightweight)
39
+ const logFile = process.env["NODETOOL_LOG_FILE"];
40
+ if (logFile && logFd === null) {
41
+ try {
42
+ logFd = openSync(logFile, "a");
43
+ }
44
+ catch {
45
+ // Fall back to stderr silently
46
+ }
47
+ }
48
+ }
49
+ /** Get the current global log level. */
50
+ export function getLogLevel() {
51
+ return currentLevel;
52
+ }
53
+ // Colour support
54
+ const USE_COLOR = process.stderr.isTTY && !process.env["NO_COLOR"];
55
+ const C = {
56
+ reset: USE_COLOR ? "\x1b[0m" : "",
57
+ dim: USE_COLOR ? "\x1b[2m" : "",
58
+ gray: USE_COLOR ? "\x1b[90m" : "",
59
+ green: USE_COLOR ? "\x1b[32m" : "",
60
+ yellow: USE_COLOR ? "\x1b[33m" : "",
61
+ red: USE_COLOR ? "\x1b[31m" : "",
62
+ cyan: USE_COLOR ? "\x1b[36m" : ""
63
+ };
64
+ const LEVEL_COLOR = {
65
+ debug: C.gray,
66
+ info: C.green,
67
+ warn: C.yellow,
68
+ error: C.red
69
+ };
70
+ function timestamp() {
71
+ const d = new Date();
72
+ const hh = String(d.getHours()).padStart(2, "0");
73
+ const mm = String(d.getMinutes()).padStart(2, "0");
74
+ const ss = String(d.getSeconds()).padStart(2, "0");
75
+ return `${hh}:${mm}:${ss}`;
76
+ }
77
+ // JSON.stringify replacer that unwraps Error instances — their own fields
78
+ // (`message`, `stack`, `name`) are non-enumerable, so the default serializer
79
+ // produces "{}". Without this, nested errors like `{ provider, error }` lose
80
+ // all diagnostic information in the log output.
81
+ function jsonReplacer(_key, value) {
82
+ if (value instanceof Error) {
83
+ return {
84
+ name: value.name,
85
+ message: value.message,
86
+ ...(value.stack ? { stack: value.stack } : {}),
87
+ ...(value.cause !== undefined ? { cause: value.cause } : {})
88
+ };
89
+ }
90
+ return value;
91
+ }
92
+ function formatArgs(args) {
93
+ if (args.length === 0)
94
+ return "";
95
+ return (" " +
96
+ args
97
+ .map((a) => {
98
+ if (a instanceof Error)
99
+ return a.stack ?? a.message;
100
+ if (typeof a === "object" && a !== null) {
101
+ try {
102
+ return JSON.stringify(a, jsonReplacer);
103
+ }
104
+ catch {
105
+ return String(a);
106
+ }
107
+ }
108
+ return String(a);
109
+ })
110
+ .join(" "));
111
+ }
112
+ function write(level, name, msg, args) {
113
+ if (LEVEL_NUM[level] < LEVEL_NUM[currentLevel])
114
+ return;
115
+ const lc = LEVEL_COLOR[level];
116
+ const ts = `${C.dim}${timestamp()}${C.reset}`;
117
+ const lv = `${lc}${level.toUpperCase().padEnd(5)}${C.reset}`;
118
+ const nm = `${C.cyan}${name}${C.reset}`;
119
+ const line = `${ts} | ${lv} | ${nm} | ${msg}${formatArgs(args)}\n`;
120
+ if (logFd !== null) {
121
+ writeSync(logFd, line);
122
+ }
123
+ else {
124
+ process.stderr.write(line);
125
+ }
126
+ }
127
+ /**
128
+ * Create a named logger. Mirrors Python's logging.getLogger(__name__).
129
+ *
130
+ * @param name Module/component name, e.g. "nodetool.kernel.runner"
131
+ */
132
+ export function createLogger(name) {
133
+ return {
134
+ debug: (msg, ...args) => write("debug", name, msg, args),
135
+ info: (msg, ...args) => write("info", name, msg, args),
136
+ warn: (msg, ...args) => write("warn", name, msg, args),
137
+ error: (msg, ...args) => write("error", name, msg, args)
138
+ };
139
+ }
140
+ //# sourceMappingURL=logging.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logging.js","sourceRoot":"","sources":["../src/logging.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Platform-aware paths for Nodetool data files.
3
+ *
4
+ * Single source of truth for default file locations so callers don't need to
5
+ * re-implement OS detection or XDG logic.
6
+ *
7
+ * Priority: explicit env var > platform default.
8
+ */
9
+ /**
10
+ * Base directory for all Nodetool user data.
11
+ *
12
+ * Must match Python's get_system_data_path() in nodetool-core so both
13
+ * runtimes read/write the same database and assets.
14
+ *
15
+ * - Windows: %APPDATA%\nodetool (e.g. C:\Users\<name>\AppData\Roaming\nodetool)
16
+ * - macOS/Linux: $XDG_DATA_HOME/nodetool (fallback: ~/.local/share/nodetool)
17
+ */
18
+ export declare function getNodetoolDataDir(): string;
19
+ /** Default path for the main SQLite database. Override with DB_PATH. */
20
+ export declare function getDefaultDbPath(): string;
21
+ /** Default path for the vector store database. Override with VECTORSTORE_DB_PATH. */
22
+ export declare function getDefaultVectorstoreDbPath(): string;
23
+ /** Default path for local asset storage. Override with ASSET_FOLDER or STORAGE_PATH. */
24
+ export declare function getDefaultAssetsPath(): string;
25
+ /**
26
+ * Default cache directory for the `@huggingface/transformers` (Transformers.js)
27
+ * runtime. Override with TRANSFORMERS_JS_CACHE_DIR.
28
+ *
29
+ * Transformers.js uses its own flat layout (`{cacheDir}/{repo_id}/{file_path}`)
30
+ * which is incompatible with the Python `huggingface_hub` cache, so we keep it
31
+ * under the Nodetool data directory rather than alongside `~/.cache/huggingface`.
32
+ */
33
+ export declare function getDefaultTransformersJsCacheDir(): string;
34
+ /**
35
+ * Public domain for permanent assets (set via ASSET_DOMAIN env var).
36
+ *
37
+ * When set, asset URLs are built as `https://<domain>/<key>` instead of
38
+ * `/api/storage/<key>`. Accepts bare hostnames (`assets.nodetool.ai`) or
39
+ * full origins (`https://assets.nodetool.ai`). Returns `undefined` when not
40
+ * configured.
41
+ */
42
+ export declare function getAssetDomain(): string | undefined;
43
+ /**
44
+ * Public domain for temporary assets (set via TEMP_DOMAIN env var).
45
+ *
46
+ * Applied to keys with the `temp/` prefix. Accepts bare hostnames or full
47
+ * origins. Returns `undefined` when not configured, in which case temp URLs
48
+ * fall back to `ASSET_DOMAIN` (if set) or the `/api/storage/` path.
49
+ */
50
+ export declare function getTempDomain(): string | undefined;
51
+ /**
52
+ * Return the absolute filesystem path for a storage key.
53
+ *
54
+ * Use this on the server side whenever you need to read an asset from disk.
55
+ * Never pass the result to a browser client — use `buildAssetUrl` for that.
56
+ */
57
+ export declare function getAssetFilePath(key: string): string;
58
+ /**
59
+ * Build a **client-facing** URL for an asset identified by its storage key.
60
+ *
61
+ * The key is the storage-relative path (e.g. `abc.png` or `temp/uuid.png`).
62
+ * When ASSET_DOMAIN / TEMP_DOMAIN are configured, returns an absolute CDN URL.
63
+ * Otherwise returns `/api/storage/<key>` — a dev-mode path that the browser
64
+ * can reach via the Vite proxy or the local HTTP server.
65
+ *
66
+ * Do NOT use this for server-side file reads. Use `getAssetFilePath` instead.
67
+ */
68
+ export declare function buildAssetUrl(key: string): string;
69
+ //# sourceMappingURL=paths.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAY3C;AAED,wEAAwE;AACxE,wBAAgB,gBAAgB,IAAI,MAAM,CAIzC;AAED,qFAAqF;AACrF,wBAAgB,2BAA2B,IAAI,MAAM,CAKpD;AAED,wFAAwF;AACxF,wBAAgB,oBAAoB,IAAI,MAAM,CAM7C;AAED;;;;;;;GAOG;AACH,wBAAgB,gCAAgC,IAAI,MAAM,CAKzD;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,IAAI,MAAM,GAAG,SAAS,CAGnD;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,IAAI,MAAM,GAAG,SAAS,CAGlD;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAoBjD"}
package/dist/paths.js ADDED
@@ -0,0 +1,114 @@
1
+ /**
2
+ * Platform-aware paths for Nodetool data files.
3
+ *
4
+ * Single source of truth for default file locations so callers don't need to
5
+ * re-implement OS detection or XDG logic.
6
+ *
7
+ * Priority: explicit env var > platform default.
8
+ */
9
+ import { join } from "node:path";
10
+ import { homedir } from "node:os";
11
+ /**
12
+ * Base directory for all Nodetool user data.
13
+ *
14
+ * Must match Python's get_system_data_path() in nodetool-core so both
15
+ * runtimes read/write the same database and assets.
16
+ *
17
+ * - Windows: %APPDATA%\nodetool (e.g. C:\Users\<name>\AppData\Roaming\nodetool)
18
+ * - macOS/Linux: $XDG_DATA_HOME/nodetool (fallback: ~/.local/share/nodetool)
19
+ */
20
+ export function getNodetoolDataDir() {
21
+ if (process.platform === "win32") {
22
+ return join(process.env["APPDATA"] ?? join(homedir(), "AppData", "Roaming"), "nodetool");
23
+ }
24
+ // macOS and Linux: use XDG standard to match Python side
25
+ return join(process.env["XDG_DATA_HOME"] ?? join(homedir(), ".local", "share"), "nodetool");
26
+ }
27
+ /** Default path for the main SQLite database. Override with DB_PATH. */
28
+ export function getDefaultDbPath() {
29
+ return (process.env["DB_PATH"] ?? join(getNodetoolDataDir(), "nodetool.sqlite3"));
30
+ }
31
+ /** Default path for the vector store database. Override with VECTORSTORE_DB_PATH. */
32
+ export function getDefaultVectorstoreDbPath() {
33
+ return (process.env["VECTORSTORE_DB_PATH"] ??
34
+ join(getNodetoolDataDir(), "vectorstore.db"));
35
+ }
36
+ /** Default path for local asset storage. Override with ASSET_FOLDER or STORAGE_PATH. */
37
+ export function getDefaultAssetsPath() {
38
+ return (process.env["ASSET_FOLDER"] ??
39
+ process.env["STORAGE_PATH"] ??
40
+ join(getNodetoolDataDir(), "assets"));
41
+ }
42
+ /**
43
+ * Default cache directory for the `@huggingface/transformers` (Transformers.js)
44
+ * runtime. Override with TRANSFORMERS_JS_CACHE_DIR.
45
+ *
46
+ * Transformers.js uses its own flat layout (`{cacheDir}/{repo_id}/{file_path}`)
47
+ * which is incompatible with the Python `huggingface_hub` cache, so we keep it
48
+ * under the Nodetool data directory rather than alongside `~/.cache/huggingface`.
49
+ */
50
+ export function getDefaultTransformersJsCacheDir() {
51
+ return (process.env["TRANSFORMERS_JS_CACHE_DIR"] ??
52
+ join(getNodetoolDataDir(), "transformers-js-cache"));
53
+ }
54
+ /**
55
+ * Public domain for permanent assets (set via ASSET_DOMAIN env var).
56
+ *
57
+ * When set, asset URLs are built as `https://<domain>/<key>` instead of
58
+ * `/api/storage/<key>`. Accepts bare hostnames (`assets.nodetool.ai`) or
59
+ * full origins (`https://assets.nodetool.ai`). Returns `undefined` when not
60
+ * configured.
61
+ */
62
+ export function getAssetDomain() {
63
+ const value = process.env["ASSET_DOMAIN"];
64
+ return value && value.trim() !== "" ? value.trim() : undefined;
65
+ }
66
+ /**
67
+ * Public domain for temporary assets (set via TEMP_DOMAIN env var).
68
+ *
69
+ * Applied to keys with the `temp/` prefix. Accepts bare hostnames or full
70
+ * origins. Returns `undefined` when not configured, in which case temp URLs
71
+ * fall back to `ASSET_DOMAIN` (if set) or the `/api/storage/` path.
72
+ */
73
+ export function getTempDomain() {
74
+ const value = process.env["TEMP_DOMAIN"];
75
+ return value && value.trim() !== "" ? value.trim() : undefined;
76
+ }
77
+ /**
78
+ * Return the absolute filesystem path for a storage key.
79
+ *
80
+ * Use this on the server side whenever you need to read an asset from disk.
81
+ * Never pass the result to a browser client — use `buildAssetUrl` for that.
82
+ */
83
+ export function getAssetFilePath(key) {
84
+ return join(getDefaultAssetsPath(), key.replace(/^\/+/, ""));
85
+ }
86
+ /**
87
+ * Build a **client-facing** URL for an asset identified by its storage key.
88
+ *
89
+ * The key is the storage-relative path (e.g. `abc.png` or `temp/uuid.png`).
90
+ * When ASSET_DOMAIN / TEMP_DOMAIN are configured, returns an absolute CDN URL.
91
+ * Otherwise returns `/api/storage/<key>` — a dev-mode path that the browser
92
+ * can reach via the Vite proxy or the local HTTP server.
93
+ *
94
+ * Do NOT use this for server-side file reads. Use `getAssetFilePath` instead.
95
+ */
96
+ export function buildAssetUrl(key) {
97
+ const normalized = key.replace(/^\/+/, "");
98
+ const isTemp = normalized.startsWith("temp/");
99
+ const domain = isTemp
100
+ ? (getTempDomain() ?? getAssetDomain())
101
+ : getAssetDomain();
102
+ if (!domain) {
103
+ return `/api/storage/${normalized}`;
104
+ }
105
+ const origin = /^https?:\/\//i.test(domain) ? domain : `https://${domain}`;
106
+ const trimmedOrigin = origin.replace(/\/+$/, "");
107
+ // When serving from a dedicated temp domain, the `temp/` prefix is
108
+ // redundant — the domain itself identifies the bucket.
109
+ const path = isTemp && getTempDomain() !== undefined
110
+ ? normalized.slice("temp/".length)
111
+ : normalized;
112
+ return `${trimmedOrigin}/${path}`;
113
+ }
114
+ //# sourceMappingURL=paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Settings registry — T-CFG-2.
3
+ *
4
+ * Registers configuration settings and reports their configured status.
5
+ */
6
+ export interface SettingDefinition {
7
+ package: string;
8
+ envVar: string;
9
+ group: string;
10
+ description: string;
11
+ isSecret: boolean;
12
+ }
13
+ export interface SettingStatus extends SettingDefinition {
14
+ configured: boolean;
15
+ }
16
+ /**
17
+ * Register a configuration setting.
18
+ */
19
+ export declare function registerSetting(definition: SettingDefinition): void;
20
+ /**
21
+ * Get all registered settings with their configured status.
22
+ * A setting is configured if its env var has a non-empty value.
23
+ */
24
+ export declare function getSettings(): SettingStatus[];
25
+ /**
26
+ * Clear all registered settings (for testing).
27
+ */
28
+ export declare function clearSettings(): void;
29
+ //# sourceMappingURL=settings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../src/settings.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,aAAc,SAAQ,iBAAiB;IACtD,UAAU,EAAE,OAAO,CAAC;CACrB;AAID;;GAEG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,iBAAiB,GAAG,IAAI,CAEnE;AAED;;;GAGG;AACH,wBAAgB,WAAW,IAAI,aAAa,EAAE,CAK7C;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,IAAI,CAEpC"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Settings registry — T-CFG-2.
3
+ *
4
+ * Registers configuration settings and reports their configured status.
5
+ */
6
+ const registry = new Map();
7
+ /**
8
+ * Register a configuration setting.
9
+ */
10
+ export function registerSetting(definition) {
11
+ registry.set(definition.envVar, definition);
12
+ }
13
+ /**
14
+ * Get all registered settings with their configured status.
15
+ * A setting is configured if its env var has a non-empty value.
16
+ */
17
+ export function getSettings() {
18
+ return Array.from(registry.values()).map((def) => ({
19
+ ...def,
20
+ configured: !!process.env[def.envVar]
21
+ }));
22
+ }
23
+ /**
24
+ * Clear all registered settings (for testing).
25
+ */
26
+ export function clearSettings() {
27
+ registry.clear();
28
+ }
29
+ //# sourceMappingURL=settings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings.js","sourceRoot":"","sources":["../src/settings.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAcH,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA6B,CAAC;AAEtD;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,UAA6B;IAC3D,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;AAC9C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW;IACzB,OAAO,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACjD,GAAG,GAAG;QACN,UAAU,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC;KACtC,CAAC,CAAC,CAAC;AACN,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa;IAC3B,QAAQ,CAAC,KAAK,EAAE,CAAC;AACnB,CAAC"}
package/package.json ADDED
@@ -0,0 +1,44 @@
1
+ {
2
+ "name": "@nodetool-ai/config",
3
+ "version": "0.7.0-rc.11",
4
+ "type": "module",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "scripts": {
8
+ "build": "node ../../scripts/build-typescript-workspace.mjs",
9
+ "test": "vitest run",
10
+ "lint": "tsc --noEmit"
11
+ },
12
+ "dependencies": {
13
+ "dotenv": "^16.4.0"
14
+ },
15
+ "devDependencies": {
16
+ "vitest": "^4.1.2",
17
+ "typescript": "^5.7.2"
18
+ },
19
+ "exports": {
20
+ ".": {
21
+ "nodetool-dev": "./src/index.ts",
22
+ "types": "./dist/index.d.ts",
23
+ "import": "./dist/index.js",
24
+ "default": "./dist/index.js"
25
+ }
26
+ },
27
+ "license": "MIT",
28
+ "repository": {
29
+ "type": "git",
30
+ "url": "https://github.com/nodetool-ai/nodetool.git",
31
+ "directory": "packages/config"
32
+ },
33
+ "homepage": "https://nodetool.ai",
34
+ "bugs": {
35
+ "url": "https://github.com/nodetool-ai/nodetool/issues"
36
+ },
37
+ "publishConfig": {
38
+ "access": "public"
39
+ },
40
+ "files": [
41
+ "dist",
42
+ "README.md"
43
+ ]
44
+ }