clawsec 0.0.1 → 0.0.2
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/src/actions/block.js +2 -2
- package/dist/src/actions/block.js.map +1 -1
- package/dist/src/actions/confirm.d.ts +1 -1
- package/dist/src/actions/confirm.d.ts.map +1 -1
- package/dist/src/actions/confirm.js +57 -26
- package/dist/src/actions/confirm.js.map +1 -1
- package/dist/src/actions/executor.d.ts +3 -1
- package/dist/src/actions/executor.d.ts.map +1 -1
- package/dist/src/actions/executor.js +48 -11
- package/dist/src/actions/executor.js.map +1 -1
- package/dist/src/actions/warn.js +2 -2
- package/dist/src/actions/warn.js.map +1 -1
- package/dist/src/approval/agent-confirm.d.ts +4 -0
- package/dist/src/approval/agent-confirm.d.ts.map +1 -1
- package/dist/src/approval/agent-confirm.js +14 -0
- package/dist/src/approval/agent-confirm.js.map +1 -1
- package/dist/src/approval/store.d.ts +4 -0
- package/dist/src/approval/store.d.ts.map +1 -1
- package/dist/src/approval/store.js +19 -0
- package/dist/src/approval/store.js.map +1 -1
- package/dist/src/config/loader.d.ts +7 -4
- package/dist/src/config/loader.d.ts.map +1 -1
- package/dist/src/config/loader.js +58 -27
- package/dist/src/config/loader.js.map +1 -1
- package/dist/src/config/schema.d.ts +60 -41
- package/dist/src/config/schema.d.ts.map +1 -1
- package/dist/src/config/schema.js +12 -0
- package/dist/src/config/schema.js.map +1 -1
- package/dist/src/config/template-loader.d.ts +34 -0
- package/dist/src/config/template-loader.d.ts.map +1 -0
- package/dist/src/config/template-loader.js +127 -0
- package/dist/src/config/template-loader.js.map +1 -0
- package/dist/src/detectors/destructive/cloud-detector.d.ts +10 -3
- package/dist/src/detectors/destructive/cloud-detector.d.ts.map +1 -1
- package/dist/src/detectors/destructive/cloud-detector.js +45 -5
- package/dist/src/detectors/destructive/cloud-detector.js.map +1 -1
- package/dist/src/detectors/destructive/code-detector.d.ts +9 -2
- package/dist/src/detectors/destructive/code-detector.d.ts.map +1 -1
- package/dist/src/detectors/destructive/code-detector.js +43 -4
- package/dist/src/detectors/destructive/code-detector.js.map +1 -1
- package/dist/src/detectors/destructive/index.d.ts +5 -3
- package/dist/src/detectors/destructive/index.d.ts.map +1 -1
- package/dist/src/detectors/destructive/index.js +42 -10
- package/dist/src/detectors/destructive/index.js.map +1 -1
- package/dist/src/detectors/destructive/shell-detector.d.ts +10 -3
- package/dist/src/detectors/destructive/shell-detector.d.ts.map +1 -1
- package/dist/src/detectors/destructive/shell-detector.js +44 -5
- package/dist/src/detectors/destructive/shell-detector.js.map +1 -1
- package/dist/src/detectors/destructive/types.d.ts +6 -0
- package/dist/src/detectors/destructive/types.d.ts.map +1 -1
- package/dist/src/detectors/exfiltration/cloud-detector.d.ts +3 -2
- package/dist/src/detectors/exfiltration/cloud-detector.d.ts.map +1 -1
- package/dist/src/detectors/exfiltration/cloud-detector.js +21 -3
- package/dist/src/detectors/exfiltration/cloud-detector.js.map +1 -1
- package/dist/src/detectors/exfiltration/http-detector.d.ts +3 -2
- package/dist/src/detectors/exfiltration/http-detector.d.ts.map +1 -1
- package/dist/src/detectors/exfiltration/http-detector.js +21 -3
- package/dist/src/detectors/exfiltration/http-detector.js.map +1 -1
- package/dist/src/detectors/exfiltration/index.d.ts +5 -3
- package/dist/src/detectors/exfiltration/index.d.ts.map +1 -1
- package/dist/src/detectors/exfiltration/index.js +44 -11
- package/dist/src/detectors/exfiltration/index.js.map +1 -1
- package/dist/src/detectors/exfiltration/network-detector.d.ts +3 -2
- package/dist/src/detectors/exfiltration/network-detector.d.ts.map +1 -1
- package/dist/src/detectors/exfiltration/network-detector.js +26 -8
- package/dist/src/detectors/exfiltration/network-detector.js.map +1 -1
- package/dist/src/detectors/exfiltration/types.d.ts +2 -0
- package/dist/src/detectors/exfiltration/types.d.ts.map +1 -1
- package/dist/src/detectors/purchase/domain-detector.d.ts +1 -1
- package/dist/src/detectors/purchase/domain-detector.d.ts.map +1 -1
- package/dist/src/detectors/purchase/domain-detector.js +1 -1
- package/dist/src/detectors/purchase/domain-detector.js.map +1 -1
- package/dist/src/detectors/purchase/form-detector.d.ts +2 -2
- package/dist/src/detectors/purchase/form-detector.d.ts.map +1 -1
- package/dist/src/detectors/purchase/form-detector.js +7 -4
- package/dist/src/detectors/purchase/form-detector.js.map +1 -1
- package/dist/src/detectors/purchase/index.d.ts +5 -3
- package/dist/src/detectors/purchase/index.d.ts.map +1 -1
- package/dist/src/detectors/purchase/index.js +35 -6
- package/dist/src/detectors/purchase/index.js.map +1 -1
- package/dist/src/detectors/purchase/spend-tracker.d.ts +6 -2
- package/dist/src/detectors/purchase/spend-tracker.d.ts.map +1 -1
- package/dist/src/detectors/purchase/spend-tracker.js +19 -3
- package/dist/src/detectors/purchase/spend-tracker.js.map +1 -1
- package/dist/src/detectors/purchase/url-detector.d.ts +2 -2
- package/dist/src/detectors/purchase/url-detector.d.ts.map +1 -1
- package/dist/src/detectors/purchase/url-detector.js +3 -3
- package/dist/src/detectors/purchase/url-detector.js.map +1 -1
- package/dist/src/detectors/secrets/api-key-detector.d.ts +6 -6
- package/dist/src/detectors/secrets/api-key-detector.d.ts.map +1 -1
- package/dist/src/detectors/secrets/api-key-detector.js +33 -7
- package/dist/src/detectors/secrets/api-key-detector.js.map +1 -1
- package/dist/src/detectors/secrets/index.d.ts +5 -3
- package/dist/src/detectors/secrets/index.d.ts.map +1 -1
- package/dist/src/detectors/secrets/index.js +52 -11
- package/dist/src/detectors/secrets/index.js.map +1 -1
- package/dist/src/detectors/secrets/pii-detector.d.ts +2 -2
- package/dist/src/detectors/secrets/pii-detector.d.ts.map +1 -1
- package/dist/src/detectors/secrets/pii-detector.js +3 -3
- package/dist/src/detectors/secrets/pii-detector.js.map +1 -1
- package/dist/src/detectors/secrets/token-detector.d.ts +2 -2
- package/dist/src/detectors/secrets/token-detector.d.ts.map +1 -1
- package/dist/src/detectors/secrets/token-detector.js +3 -3
- package/dist/src/detectors/secrets/token-detector.js.map +1 -1
- package/dist/src/detectors/secrets/types.d.ts +5 -3
- package/dist/src/detectors/secrets/types.d.ts.map +1 -1
- package/dist/src/detectors/website/index.d.ts +5 -3
- package/dist/src/detectors/website/index.d.ts.map +1 -1
- package/dist/src/detectors/website/index.js +21 -6
- package/dist/src/detectors/website/index.js.map +1 -1
- package/dist/src/engine/analyzer.d.ts +3 -1
- package/dist/src/engine/analyzer.d.ts.map +1 -1
- package/dist/src/engine/analyzer.js +66 -10
- package/dist/src/engine/analyzer.js.map +1 -1
- package/dist/src/engine/types.d.ts +4 -1
- package/dist/src/engine/types.d.ts.map +1 -1
- package/dist/src/engine/types.js.map +1 -1
- package/dist/src/hooks/before-agent-start/handler.d.ts +3 -1
- package/dist/src/hooks/before-agent-start/handler.d.ts.map +1 -1
- package/dist/src/hooks/before-agent-start/handler.js +59 -12
- package/dist/src/hooks/before-agent-start/handler.js.map +1 -1
- package/dist/src/hooks/before-tool-call/handler.d.ts +3 -1
- package/dist/src/hooks/before-tool-call/handler.d.ts.map +1 -1
- package/dist/src/hooks/before-tool-call/handler.js +86 -54
- package/dist/src/hooks/before-tool-call/handler.js.map +1 -1
- package/dist/src/hooks/tool-result-persist/handler.d.ts +3 -1
- package/dist/src/hooks/tool-result-persist/handler.d.ts.map +1 -1
- package/dist/src/hooks/tool-result-persist/handler.js +36 -34
- package/dist/src/hooks/tool-result-persist/handler.js.map +1 -1
- package/dist/src/index.d.ts +45 -47
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +120 -96
- package/dist/src/index.js.map +1 -1
- package/dist/src/notifications/index.d.ts.map +1 -1
- package/dist/src/notifications/index.js +2 -1
- package/dist/src/notifications/index.js.map +1 -1
- package/dist/src/notifications/telegram.js +1 -1
- package/dist/src/notifications/telegram.js.map +1 -1
- package/dist/src/notifications/types.d.ts +1 -1
- package/dist/src/notifications/types.d.ts.map +1 -1
- package/dist/src/utils/logger.d.ts +26 -0
- package/dist/src/utils/logger.d.ts.map +1 -0
- package/dist/src/utils/logger.js +76 -0
- package/dist/src/utils/logger.js.map +1 -0
- package/openclaw.plugin.json +7 -22
- package/package.json +8 -2
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
* In-Memory Approval Store
|
|
3
3
|
* Stores and manages pending approval records with TTL and auto-cleanup
|
|
4
4
|
*/
|
|
5
|
+
import { createLogger } from '../utils/logger.js';
|
|
5
6
|
/** Default cleanup interval: 60 seconds */
|
|
6
7
|
const DEFAULT_CLEANUP_INTERVAL_MS = 60_000;
|
|
7
8
|
/**
|
|
@@ -11,8 +12,10 @@ export class InMemoryApprovalStore {
|
|
|
11
12
|
records = new Map();
|
|
12
13
|
cleanupTimer = null;
|
|
13
14
|
removeOnExpiry;
|
|
15
|
+
logger;
|
|
14
16
|
constructor(config = {}) {
|
|
15
17
|
this.removeOnExpiry = config.removeOnExpiry ?? false;
|
|
18
|
+
this.logger = config.logger ?? createLogger(null, null);
|
|
16
19
|
const cleanupInterval = config.cleanupIntervalMs ?? DEFAULT_CLEANUP_INTERVAL_MS;
|
|
17
20
|
if (cleanupInterval > 0) {
|
|
18
21
|
this.startCleanupTimer(cleanupInterval);
|
|
@@ -48,6 +51,7 @@ export class InMemoryApprovalStore {
|
|
|
48
51
|
status: 'pending',
|
|
49
52
|
};
|
|
50
53
|
this.records.set(record.id, fullRecord);
|
|
54
|
+
this.logger.info(`[Approval] Created approval: id=${record.id}, category=${record.detection.category}, severity=${record.detection.severity}, timeout=${new Date(record.expiresAt).toISOString()}`);
|
|
51
55
|
}
|
|
52
56
|
/**
|
|
53
57
|
* Get an approval record by ID
|
|
@@ -56,12 +60,16 @@ export class InMemoryApprovalStore {
|
|
|
56
60
|
get(id) {
|
|
57
61
|
const record = this.records.get(id);
|
|
58
62
|
if (!record) {
|
|
63
|
+
this.logger.debug(`[Approval] Approval not found: id=${id}`);
|
|
59
64
|
return undefined;
|
|
60
65
|
}
|
|
61
66
|
// Check if expired and update status
|
|
62
67
|
if (record.status === 'pending' && Date.now() > record.expiresAt) {
|
|
63
68
|
record.status = 'expired';
|
|
69
|
+
this.logger.warn(`[Approval] Found expired approval: id=${id}`);
|
|
70
|
+
return record;
|
|
64
71
|
}
|
|
72
|
+
this.logger.debug(`[Approval] Found valid approval: id=${id}, status=${record.status}`);
|
|
65
73
|
return record;
|
|
66
74
|
}
|
|
67
75
|
/**
|
|
@@ -71,15 +79,18 @@ export class InMemoryApprovalStore {
|
|
|
71
79
|
approve(id, approvedBy) {
|
|
72
80
|
const record = this.get(id);
|
|
73
81
|
if (!record) {
|
|
82
|
+
this.logger.warn(`[Approval] Cannot approve - approval not found: id=${id}`);
|
|
74
83
|
return false;
|
|
75
84
|
}
|
|
76
85
|
// Can only approve pending records
|
|
77
86
|
if (record.status !== 'pending') {
|
|
87
|
+
this.logger.warn(`[Approval] Cannot approve - not pending: id=${id}, status=${record.status}`);
|
|
78
88
|
return false;
|
|
79
89
|
}
|
|
80
90
|
record.status = 'approved';
|
|
81
91
|
record.approvedBy = approvedBy;
|
|
82
92
|
record.approvedAt = Date.now();
|
|
93
|
+
this.logger.info(`[Approval] Approved: id=${id}, approvedBy=${approvedBy || 'unknown'}`);
|
|
83
94
|
return true;
|
|
84
95
|
}
|
|
85
96
|
/**
|
|
@@ -89,13 +100,16 @@ export class InMemoryApprovalStore {
|
|
|
89
100
|
deny(id) {
|
|
90
101
|
const record = this.get(id);
|
|
91
102
|
if (!record) {
|
|
103
|
+
this.logger.warn(`[Approval] Cannot deny - approval not found: id=${id}`);
|
|
92
104
|
return false;
|
|
93
105
|
}
|
|
94
106
|
// Can only deny pending records
|
|
95
107
|
if (record.status !== 'pending') {
|
|
108
|
+
this.logger.warn(`[Approval] Cannot deny - not pending: id=${id}, status=${record.status}`);
|
|
96
109
|
return false;
|
|
97
110
|
}
|
|
98
111
|
record.status = 'denied';
|
|
112
|
+
this.logger.info(`[Approval] Denied: id=${id}`);
|
|
99
113
|
return true;
|
|
100
114
|
}
|
|
101
115
|
/**
|
|
@@ -111,10 +125,12 @@ export class InMemoryApprovalStore {
|
|
|
111
125
|
cleanup() {
|
|
112
126
|
const now = Date.now();
|
|
113
127
|
const toRemove = [];
|
|
128
|
+
let expiredCount = 0;
|
|
114
129
|
for (const [id, record] of this.records) {
|
|
115
130
|
// Mark expired pending records
|
|
116
131
|
if (record.status === 'pending' && now > record.expiresAt) {
|
|
117
132
|
record.status = 'expired';
|
|
133
|
+
expiredCount++;
|
|
118
134
|
}
|
|
119
135
|
// Optionally remove expired/processed records
|
|
120
136
|
if (this.removeOnExpiry && record.status !== 'pending') {
|
|
@@ -124,6 +140,9 @@ export class InMemoryApprovalStore {
|
|
|
124
140
|
for (const id of toRemove) {
|
|
125
141
|
this.records.delete(id);
|
|
126
142
|
}
|
|
143
|
+
if (expiredCount > 0 || toRemove.length > 0) {
|
|
144
|
+
this.logger.debug(`[Approval] Cleanup: marked ${expiredCount} as expired, removed ${toRemove.length} records`);
|
|
145
|
+
}
|
|
127
146
|
}
|
|
128
147
|
/**
|
|
129
148
|
* Get all pending approval records
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/approval/store.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/approval/store.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import { z } from 'zod';
|
|
6
6
|
import { type ClawsecConfig, type PartialClawsecConfig } from './schema.js';
|
|
7
|
+
import { type Logger } from '../utils/logger.js';
|
|
7
8
|
/**
|
|
8
9
|
* Error thrown when configuration validation fails
|
|
9
10
|
*/
|
|
@@ -69,25 +70,27 @@ export declare function mergeWithDefaults(partial: PartialClawsecConfig): Clawse
|
|
|
69
70
|
*/
|
|
70
71
|
export declare function findConfigFile(startDir?: string): string | null;
|
|
71
72
|
/**
|
|
72
|
-
* Loads configuration from a YAML file.
|
|
73
|
+
* Loads configuration from a YAML file with template inheritance support.
|
|
73
74
|
*
|
|
74
75
|
* If no path is provided, searches for config file in standard locations.
|
|
75
76
|
* If no config file is found, returns default configuration.
|
|
76
77
|
*
|
|
77
78
|
* @param configPath - Optional path to configuration file
|
|
79
|
+
* @param logger - Optional logger instance (creates fallback if not provided)
|
|
78
80
|
* @returns Validated configuration
|
|
79
81
|
* @throws ConfigLoadError if specified file doesn't exist or can't be parsed
|
|
80
82
|
* @throws ConfigValidationError if configuration is invalid
|
|
81
83
|
*/
|
|
82
|
-
export declare function loadConfig(configPath?: string): ClawsecConfig;
|
|
84
|
+
export declare function loadConfig(configPath?: string, logger?: Logger): ClawsecConfig;
|
|
83
85
|
/**
|
|
84
|
-
* Loads configuration from a YAML string.
|
|
86
|
+
* Loads configuration from a YAML string with template inheritance support.
|
|
85
87
|
*
|
|
86
88
|
* @param yamlContent - YAML string to parse
|
|
89
|
+
* @param logger - Optional logger instance (creates fallback if not provided)
|
|
87
90
|
* @returns Validated configuration
|
|
88
91
|
* @throws ConfigValidationError if configuration is invalid
|
|
89
92
|
*/
|
|
90
|
-
export declare function loadConfigFromString(yamlContent: string): ClawsecConfig;
|
|
93
|
+
export declare function loadConfigFromString(yamlContent: string, logger?: Logger): ClawsecConfig;
|
|
91
94
|
/**
|
|
92
95
|
* Loads and merges configuration from multiple sources.
|
|
93
96
|
* Later sources override earlier ones.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../../src/config/loader.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAuB,KAAK,aAAa,EAAE,KAAK,oBAAoB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../../src/config/loader.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAuB,KAAK,aAAa,EAAE,KAAK,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAGjG,OAAO,EAAgB,KAAK,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAM/D;;GAEG;AACH,qBAAa,qBAAsB,SAAQ,KAAK;aAG5B,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;gBADhE,OAAO,EAAE,MAAM,EACC,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAMlE;;OAEG;IACH,MAAM,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC,CAAC,QAAQ,GAAG,qBAAqB;CAUjE;AAED;;GAEG;AACH,qBAAa,eAAgB,SAAQ,KAAK;aAGtB,QAAQ,EAAE,MAAM;aAChB,KAAK,CAAC,EAAE,KAAK;gBAF7B,OAAO,EAAE,MAAM,EACC,QAAQ,EAAE,MAAM,EAChB,KAAK,CAAC,EAAE,KAAK,YAAA;CAKhC;AAMD;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,OAAO,GAAG,aAAa,CAQ7D;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,OAAO,GACd;IAAE,KAAK,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,aAAa,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAc7G;AAMD;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,oBAAoB,GAAG,aAAa,CAI9E;AAiCD;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,QAAQ,GAAE,MAAsB,GAAG,MAAM,GAAG,IAAI,CAuB9E;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,UAAU,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,aAAa,CA0C9E;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,aAAa,CAiCxF;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,GAAG,OAAO,EAAE,oBAAoB,EAAE,GAAG,aAAa,CAQ9E"}
|
|
@@ -7,6 +7,8 @@ import * as path from 'node:path';
|
|
|
7
7
|
import { parse as parseYaml } from 'yaml';
|
|
8
8
|
import { ClawsecConfigSchema } from './schema.js';
|
|
9
9
|
import { getDefaultConfig } from './defaults.js';
|
|
10
|
+
import { loadTemplates, deepMergeConfigs } from './template-loader.js';
|
|
11
|
+
import { createLogger } from '../utils/logger.js';
|
|
10
12
|
// =============================================================================
|
|
11
13
|
// ERROR TYPES
|
|
12
14
|
// =============================================================================
|
|
@@ -155,54 +157,83 @@ export function findConfigFile(startDir = process.cwd()) {
|
|
|
155
157
|
return null;
|
|
156
158
|
}
|
|
157
159
|
/**
|
|
158
|
-
* Loads configuration from a YAML file.
|
|
160
|
+
* Loads configuration from a YAML file with template inheritance support.
|
|
159
161
|
*
|
|
160
162
|
* If no path is provided, searches for config file in standard locations.
|
|
161
163
|
* If no config file is found, returns default configuration.
|
|
162
164
|
*
|
|
163
165
|
* @param configPath - Optional path to configuration file
|
|
166
|
+
* @param logger - Optional logger instance (creates fallback if not provided)
|
|
164
167
|
* @returns Validated configuration
|
|
165
168
|
* @throws ConfigLoadError if specified file doesn't exist or can't be parsed
|
|
166
169
|
* @throws ConfigValidationError if configuration is invalid
|
|
167
170
|
*/
|
|
168
|
-
export function loadConfig(configPath) {
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
//
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
}
|
|
177
|
-
return validateConfig(content);
|
|
171
|
+
export function loadConfig(configPath, logger) {
|
|
172
|
+
const log = logger ?? createLogger(null, null);
|
|
173
|
+
// Determine which config file to use
|
|
174
|
+
const foundPath = configPath ? path.resolve(configPath) : findConfigFile();
|
|
175
|
+
if (!foundPath) {
|
|
176
|
+
// No config file found, return defaults
|
|
177
|
+
log.debug('[Config] No config file found, using defaults');
|
|
178
|
+
return getDefaultConfig();
|
|
178
179
|
}
|
|
179
|
-
|
|
180
|
-
const
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
180
|
+
log.info(`[Config] Loading config from: ${foundPath}`);
|
|
181
|
+
const userConfig = readYamlFile(foundPath);
|
|
182
|
+
// Handle empty file case
|
|
183
|
+
if (userConfig === null || userConfig === undefined) {
|
|
184
|
+
log.warn('[Config] Config file is empty, using defaults');
|
|
185
|
+
return getDefaultConfig();
|
|
186
|
+
}
|
|
187
|
+
// Check for extends field
|
|
188
|
+
if (userConfig.extends && Array.isArray(userConfig.extends) && userConfig.extends.length > 0) {
|
|
189
|
+
log.info(`[Config] Found extends field with ${userConfig.extends.length} templates`);
|
|
190
|
+
// Load all templates
|
|
191
|
+
const templateConfig = loadTemplates(userConfig.extends, log);
|
|
192
|
+
// Merge: templates first, then user config (user overrides templates)
|
|
193
|
+
const merged = deepMergeConfigs(templateConfig, userConfig);
|
|
194
|
+
log.debug('[Config] Merged template config with user config');
|
|
195
|
+
// Remove extends field before validation (not part of final schema)
|
|
196
|
+
delete merged.extends;
|
|
197
|
+
log.debug('[Config] Removed extends field before validation');
|
|
198
|
+
return validateConfig(merged);
|
|
188
199
|
}
|
|
189
|
-
// No
|
|
190
|
-
|
|
200
|
+
// No extends, validate as-is
|
|
201
|
+
log.debug('[Config] No extends field, validating config directly');
|
|
202
|
+
return validateConfig(userConfig);
|
|
191
203
|
}
|
|
192
204
|
/**
|
|
193
|
-
* Loads configuration from a YAML string.
|
|
205
|
+
* Loads configuration from a YAML string with template inheritance support.
|
|
194
206
|
*
|
|
195
207
|
* @param yamlContent - YAML string to parse
|
|
208
|
+
* @param logger - Optional logger instance (creates fallback if not provided)
|
|
196
209
|
* @returns Validated configuration
|
|
197
210
|
* @throws ConfigValidationError if configuration is invalid
|
|
198
211
|
*/
|
|
199
|
-
export function loadConfigFromString(yamlContent) {
|
|
200
|
-
const
|
|
212
|
+
export function loadConfigFromString(yamlContent, logger) {
|
|
213
|
+
const log = logger ?? createLogger(null, null);
|
|
214
|
+
log.debug('[Config] Loading config from string');
|
|
215
|
+
const userConfig = parseYaml(yamlContent);
|
|
201
216
|
// Handle empty content
|
|
202
|
-
if (
|
|
217
|
+
if (userConfig === null || userConfig === undefined) {
|
|
218
|
+
log.warn('[Config] Config string is empty, using defaults');
|
|
203
219
|
return getDefaultConfig();
|
|
204
220
|
}
|
|
205
|
-
|
|
221
|
+
// Check for extends field
|
|
222
|
+
if (userConfig.extends && Array.isArray(userConfig.extends) && userConfig.extends.length > 0) {
|
|
223
|
+
log.info(`[Config] Found extends field with ${userConfig.extends.length} templates`);
|
|
224
|
+
// Load all templates
|
|
225
|
+
const templateConfig = loadTemplates(userConfig.extends, log);
|
|
226
|
+
// Merge: templates first, then user config (user overrides templates)
|
|
227
|
+
const merged = deepMergeConfigs(templateConfig, userConfig);
|
|
228
|
+
log.debug('[Config] Merged template config with user config');
|
|
229
|
+
// Remove extends field before validation (not part of final schema)
|
|
230
|
+
delete merged.extends;
|
|
231
|
+
log.debug('[Config] Removed extends field before validation');
|
|
232
|
+
return validateConfig(merged);
|
|
233
|
+
}
|
|
234
|
+
// No extends, validate as-is
|
|
235
|
+
log.debug('[Config] No extends field, validating config directly');
|
|
236
|
+
return validateConfig(userConfig);
|
|
206
237
|
}
|
|
207
238
|
/**
|
|
208
239
|
* Loads and merges configuration from multiple sources.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../../src/config/loader.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;AAE1C,OAAO,EAAE,mBAAmB,EAAiD,MAAM,aAAa,CAAC;AACjG,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../../src/config/loader.ts"],"names":[],"mappings":"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"}
|