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.
Files changed (146) hide show
  1. package/dist/src/actions/block.js +2 -2
  2. package/dist/src/actions/block.js.map +1 -1
  3. package/dist/src/actions/confirm.d.ts +1 -1
  4. package/dist/src/actions/confirm.d.ts.map +1 -1
  5. package/dist/src/actions/confirm.js +57 -26
  6. package/dist/src/actions/confirm.js.map +1 -1
  7. package/dist/src/actions/executor.d.ts +3 -1
  8. package/dist/src/actions/executor.d.ts.map +1 -1
  9. package/dist/src/actions/executor.js +48 -11
  10. package/dist/src/actions/executor.js.map +1 -1
  11. package/dist/src/actions/warn.js +2 -2
  12. package/dist/src/actions/warn.js.map +1 -1
  13. package/dist/src/approval/agent-confirm.d.ts +4 -0
  14. package/dist/src/approval/agent-confirm.d.ts.map +1 -1
  15. package/dist/src/approval/agent-confirm.js +14 -0
  16. package/dist/src/approval/agent-confirm.js.map +1 -1
  17. package/dist/src/approval/store.d.ts +4 -0
  18. package/dist/src/approval/store.d.ts.map +1 -1
  19. package/dist/src/approval/store.js +19 -0
  20. package/dist/src/approval/store.js.map +1 -1
  21. package/dist/src/config/loader.d.ts +7 -4
  22. package/dist/src/config/loader.d.ts.map +1 -1
  23. package/dist/src/config/loader.js +58 -27
  24. package/dist/src/config/loader.js.map +1 -1
  25. package/dist/src/config/schema.d.ts +60 -41
  26. package/dist/src/config/schema.d.ts.map +1 -1
  27. package/dist/src/config/schema.js +12 -0
  28. package/dist/src/config/schema.js.map +1 -1
  29. package/dist/src/config/template-loader.d.ts +34 -0
  30. package/dist/src/config/template-loader.d.ts.map +1 -0
  31. package/dist/src/config/template-loader.js +127 -0
  32. package/dist/src/config/template-loader.js.map +1 -0
  33. package/dist/src/detectors/destructive/cloud-detector.d.ts +10 -3
  34. package/dist/src/detectors/destructive/cloud-detector.d.ts.map +1 -1
  35. package/dist/src/detectors/destructive/cloud-detector.js +45 -5
  36. package/dist/src/detectors/destructive/cloud-detector.js.map +1 -1
  37. package/dist/src/detectors/destructive/code-detector.d.ts +9 -2
  38. package/dist/src/detectors/destructive/code-detector.d.ts.map +1 -1
  39. package/dist/src/detectors/destructive/code-detector.js +43 -4
  40. package/dist/src/detectors/destructive/code-detector.js.map +1 -1
  41. package/dist/src/detectors/destructive/index.d.ts +5 -3
  42. package/dist/src/detectors/destructive/index.d.ts.map +1 -1
  43. package/dist/src/detectors/destructive/index.js +42 -10
  44. package/dist/src/detectors/destructive/index.js.map +1 -1
  45. package/dist/src/detectors/destructive/shell-detector.d.ts +10 -3
  46. package/dist/src/detectors/destructive/shell-detector.d.ts.map +1 -1
  47. package/dist/src/detectors/destructive/shell-detector.js +44 -5
  48. package/dist/src/detectors/destructive/shell-detector.js.map +1 -1
  49. package/dist/src/detectors/destructive/types.d.ts +6 -0
  50. package/dist/src/detectors/destructive/types.d.ts.map +1 -1
  51. package/dist/src/detectors/exfiltration/cloud-detector.d.ts +3 -2
  52. package/dist/src/detectors/exfiltration/cloud-detector.d.ts.map +1 -1
  53. package/dist/src/detectors/exfiltration/cloud-detector.js +21 -3
  54. package/dist/src/detectors/exfiltration/cloud-detector.js.map +1 -1
  55. package/dist/src/detectors/exfiltration/http-detector.d.ts +3 -2
  56. package/dist/src/detectors/exfiltration/http-detector.d.ts.map +1 -1
  57. package/dist/src/detectors/exfiltration/http-detector.js +21 -3
  58. package/dist/src/detectors/exfiltration/http-detector.js.map +1 -1
  59. package/dist/src/detectors/exfiltration/index.d.ts +5 -3
  60. package/dist/src/detectors/exfiltration/index.d.ts.map +1 -1
  61. package/dist/src/detectors/exfiltration/index.js +44 -11
  62. package/dist/src/detectors/exfiltration/index.js.map +1 -1
  63. package/dist/src/detectors/exfiltration/network-detector.d.ts +3 -2
  64. package/dist/src/detectors/exfiltration/network-detector.d.ts.map +1 -1
  65. package/dist/src/detectors/exfiltration/network-detector.js +26 -8
  66. package/dist/src/detectors/exfiltration/network-detector.js.map +1 -1
  67. package/dist/src/detectors/exfiltration/types.d.ts +2 -0
  68. package/dist/src/detectors/exfiltration/types.d.ts.map +1 -1
  69. package/dist/src/detectors/purchase/domain-detector.d.ts +1 -1
  70. package/dist/src/detectors/purchase/domain-detector.d.ts.map +1 -1
  71. package/dist/src/detectors/purchase/domain-detector.js +1 -1
  72. package/dist/src/detectors/purchase/domain-detector.js.map +1 -1
  73. package/dist/src/detectors/purchase/form-detector.d.ts +2 -2
  74. package/dist/src/detectors/purchase/form-detector.d.ts.map +1 -1
  75. package/dist/src/detectors/purchase/form-detector.js +7 -4
  76. package/dist/src/detectors/purchase/form-detector.js.map +1 -1
  77. package/dist/src/detectors/purchase/index.d.ts +5 -3
  78. package/dist/src/detectors/purchase/index.d.ts.map +1 -1
  79. package/dist/src/detectors/purchase/index.js +35 -6
  80. package/dist/src/detectors/purchase/index.js.map +1 -1
  81. package/dist/src/detectors/purchase/spend-tracker.d.ts +6 -2
  82. package/dist/src/detectors/purchase/spend-tracker.d.ts.map +1 -1
  83. package/dist/src/detectors/purchase/spend-tracker.js +19 -3
  84. package/dist/src/detectors/purchase/spend-tracker.js.map +1 -1
  85. package/dist/src/detectors/purchase/url-detector.d.ts +2 -2
  86. package/dist/src/detectors/purchase/url-detector.d.ts.map +1 -1
  87. package/dist/src/detectors/purchase/url-detector.js +3 -3
  88. package/dist/src/detectors/purchase/url-detector.js.map +1 -1
  89. package/dist/src/detectors/secrets/api-key-detector.d.ts +6 -6
  90. package/dist/src/detectors/secrets/api-key-detector.d.ts.map +1 -1
  91. package/dist/src/detectors/secrets/api-key-detector.js +33 -7
  92. package/dist/src/detectors/secrets/api-key-detector.js.map +1 -1
  93. package/dist/src/detectors/secrets/index.d.ts +5 -3
  94. package/dist/src/detectors/secrets/index.d.ts.map +1 -1
  95. package/dist/src/detectors/secrets/index.js +52 -11
  96. package/dist/src/detectors/secrets/index.js.map +1 -1
  97. package/dist/src/detectors/secrets/pii-detector.d.ts +2 -2
  98. package/dist/src/detectors/secrets/pii-detector.d.ts.map +1 -1
  99. package/dist/src/detectors/secrets/pii-detector.js +3 -3
  100. package/dist/src/detectors/secrets/pii-detector.js.map +1 -1
  101. package/dist/src/detectors/secrets/token-detector.d.ts +2 -2
  102. package/dist/src/detectors/secrets/token-detector.d.ts.map +1 -1
  103. package/dist/src/detectors/secrets/token-detector.js +3 -3
  104. package/dist/src/detectors/secrets/token-detector.js.map +1 -1
  105. package/dist/src/detectors/secrets/types.d.ts +5 -3
  106. package/dist/src/detectors/secrets/types.d.ts.map +1 -1
  107. package/dist/src/detectors/website/index.d.ts +5 -3
  108. package/dist/src/detectors/website/index.d.ts.map +1 -1
  109. package/dist/src/detectors/website/index.js +21 -6
  110. package/dist/src/detectors/website/index.js.map +1 -1
  111. package/dist/src/engine/analyzer.d.ts +3 -1
  112. package/dist/src/engine/analyzer.d.ts.map +1 -1
  113. package/dist/src/engine/analyzer.js +66 -10
  114. package/dist/src/engine/analyzer.js.map +1 -1
  115. package/dist/src/engine/types.d.ts +4 -1
  116. package/dist/src/engine/types.d.ts.map +1 -1
  117. package/dist/src/engine/types.js.map +1 -1
  118. package/dist/src/hooks/before-agent-start/handler.d.ts +3 -1
  119. package/dist/src/hooks/before-agent-start/handler.d.ts.map +1 -1
  120. package/dist/src/hooks/before-agent-start/handler.js +59 -12
  121. package/dist/src/hooks/before-agent-start/handler.js.map +1 -1
  122. package/dist/src/hooks/before-tool-call/handler.d.ts +3 -1
  123. package/dist/src/hooks/before-tool-call/handler.d.ts.map +1 -1
  124. package/dist/src/hooks/before-tool-call/handler.js +86 -54
  125. package/dist/src/hooks/before-tool-call/handler.js.map +1 -1
  126. package/dist/src/hooks/tool-result-persist/handler.d.ts +3 -1
  127. package/dist/src/hooks/tool-result-persist/handler.d.ts.map +1 -1
  128. package/dist/src/hooks/tool-result-persist/handler.js +36 -34
  129. package/dist/src/hooks/tool-result-persist/handler.js.map +1 -1
  130. package/dist/src/index.d.ts +45 -47
  131. package/dist/src/index.d.ts.map +1 -1
  132. package/dist/src/index.js +120 -96
  133. package/dist/src/index.js.map +1 -1
  134. package/dist/src/notifications/index.d.ts.map +1 -1
  135. package/dist/src/notifications/index.js +2 -1
  136. package/dist/src/notifications/index.js.map +1 -1
  137. package/dist/src/notifications/telegram.js +1 -1
  138. package/dist/src/notifications/telegram.js.map +1 -1
  139. package/dist/src/notifications/types.d.ts +1 -1
  140. package/dist/src/notifications/types.d.ts.map +1 -1
  141. package/dist/src/utils/logger.d.ts +26 -0
  142. package/dist/src/utils/logger.d.ts.map +1 -0
  143. package/dist/src/utils/logger.js +76 -0
  144. package/dist/src/utils/logger.js.map +1 -0
  145. package/openclaw.plugin.json +7 -22
  146. 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":"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"}
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;AAOjG;;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;;;;;;;;;;GAUG;AACH,wBAAgB,UAAU,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,aAAa,CA8B7D;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,aAAa,CASvE;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,GAAG,OAAO,EAAE,oBAAoB,EAAE,GAAG,aAAa,CAQ9E"}
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
- // If explicit path provided, load from that path
170
- if (configPath) {
171
- const resolvedPath = path.resolve(configPath);
172
- const content = readYamlFile(resolvedPath);
173
- // Handle empty file case
174
- if (content === null || content === undefined) {
175
- return getDefaultConfig();
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
- // Try to find config file
180
- const foundPath = findConfigFile();
181
- if (foundPath) {
182
- const content = readYamlFile(foundPath);
183
- // Handle empty file case
184
- if (content === null || content === undefined) {
185
- return getDefaultConfig();
186
- }
187
- return validateConfig(content);
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 config file found, return defaults
190
- return getDefaultConfig();
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 content = parseYaml(yamlContent);
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 (content === null || content === undefined) {
217
+ if (userConfig === null || userConfig === undefined) {
218
+ log.warn('[Config] Config string is empty, using defaults');
203
219
  return getDefaultConfig();
204
220
  }
205
- return validateConfig(content);
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":"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"}
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../../src/config/loader.ts"],"names":[],"mappings":"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"}