polyai-agent 1.0.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.
Files changed (142) hide show
  1. package/README.md +464 -0
  2. package/REQUIREMENTS.md +158 -0
  3. package/dist/cli.d.ts +3 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +500 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/cluster-monitor/cluster-monitor.d.ts +49 -0
  8. package/dist/cluster-monitor/cluster-monitor.d.ts.map +1 -0
  9. package/dist/cluster-monitor/cluster-monitor.js +374 -0
  10. package/dist/cluster-monitor/cluster-monitor.js.map +1 -0
  11. package/dist/cluster-monitor/index.d.ts +9 -0
  12. package/dist/cluster-monitor/index.d.ts.map +1 -0
  13. package/dist/cluster-monitor/index.js +19 -0
  14. package/dist/cluster-monitor/index.js.map +1 -0
  15. package/dist/cluster-monitor/kubernetes-connector.d.ts +21 -0
  16. package/dist/cluster-monitor/kubernetes-connector.d.ts.map +1 -0
  17. package/dist/cluster-monitor/kubernetes-connector.js +109 -0
  18. package/dist/cluster-monitor/kubernetes-connector.js.map +1 -0
  19. package/dist/cluster-monitor/notifications.d.ts +26 -0
  20. package/dist/cluster-monitor/notifications.d.ts.map +1 -0
  21. package/dist/cluster-monitor/notifications.js +182 -0
  22. package/dist/cluster-monitor/notifications.js.map +1 -0
  23. package/dist/cluster-monitor/remediation.d.ts +33 -0
  24. package/dist/cluster-monitor/remediation.d.ts.map +1 -0
  25. package/dist/cluster-monitor/remediation.js +134 -0
  26. package/dist/cluster-monitor/remediation.js.map +1 -0
  27. package/dist/cluster-monitor/rules.d.ts +26 -0
  28. package/dist/cluster-monitor/rules.d.ts.map +1 -0
  29. package/dist/cluster-monitor/rules.js +133 -0
  30. package/dist/cluster-monitor/rules.js.map +1 -0
  31. package/dist/cluster-monitor/types.d.ts +184 -0
  32. package/dist/cluster-monitor/types.d.ts.map +1 -0
  33. package/dist/cluster-monitor/types.js +3 -0
  34. package/dist/cluster-monitor/types.js.map +1 -0
  35. package/dist/index.d.ts +47 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +115 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/live-debugger/index.d.ts +32 -0
  40. package/dist/live-debugger/index.d.ts.map +1 -0
  41. package/dist/live-debugger/index.js +119 -0
  42. package/dist/live-debugger/index.js.map +1 -0
  43. package/dist/live-debugger/log-watcher.d.ts +19 -0
  44. package/dist/live-debugger/log-watcher.d.ts.map +1 -0
  45. package/dist/live-debugger/log-watcher.js +77 -0
  46. package/dist/live-debugger/log-watcher.js.map +1 -0
  47. package/dist/live-debugger/service-connector.d.ts +33 -0
  48. package/dist/live-debugger/service-connector.d.ts.map +1 -0
  49. package/dist/live-debugger/service-connector.js +123 -0
  50. package/dist/live-debugger/service-connector.js.map +1 -0
  51. package/dist/providers/anthropic.d.ts +9 -0
  52. package/dist/providers/anthropic.d.ts.map +1 -0
  53. package/dist/providers/anthropic.js +71 -0
  54. package/dist/providers/anthropic.js.map +1 -0
  55. package/dist/providers/base.d.ts +29 -0
  56. package/dist/providers/base.d.ts.map +1 -0
  57. package/dist/providers/base.js +14 -0
  58. package/dist/providers/base.js.map +1 -0
  59. package/dist/providers/gemini.d.ts +11 -0
  60. package/dist/providers/gemini.d.ts.map +1 -0
  61. package/dist/providers/gemini.js +73 -0
  62. package/dist/providers/gemini.js.map +1 -0
  63. package/dist/providers/index.d.ts +14 -0
  64. package/dist/providers/index.d.ts.map +1 -0
  65. package/dist/providers/index.js +38 -0
  66. package/dist/providers/index.js.map +1 -0
  67. package/dist/providers/openai.d.ts +9 -0
  68. package/dist/providers/openai.d.ts.map +1 -0
  69. package/dist/providers/openai.js +59 -0
  70. package/dist/providers/openai.js.map +1 -0
  71. package/dist/session/guardrails.d.ts +20 -0
  72. package/dist/session/guardrails.d.ts.map +1 -0
  73. package/dist/session/guardrails.js +83 -0
  74. package/dist/session/guardrails.js.map +1 -0
  75. package/dist/session/index.d.ts +6 -0
  76. package/dist/session/index.d.ts.map +1 -0
  77. package/dist/session/index.js +12 -0
  78. package/dist/session/index.js.map +1 -0
  79. package/dist/session/session-manager.d.ts +15 -0
  80. package/dist/session/session-manager.d.ts.map +1 -0
  81. package/dist/session/session-manager.js +89 -0
  82. package/dist/session/session-manager.js.map +1 -0
  83. package/dist/session/session.d.ts +63 -0
  84. package/dist/session/session.d.ts.map +1 -0
  85. package/dist/session/session.js +123 -0
  86. package/dist/session/session.js.map +1 -0
  87. package/dist/speckits/base.d.ts +9 -0
  88. package/dist/speckits/base.d.ts.map +1 -0
  89. package/dist/speckits/base.js +3 -0
  90. package/dist/speckits/base.js.map +1 -0
  91. package/dist/speckits/cluster-debugger.d.ts +3 -0
  92. package/dist/speckits/cluster-debugger.d.ts.map +1 -0
  93. package/dist/speckits/cluster-debugger.js +48 -0
  94. package/dist/speckits/cluster-debugger.js.map +1 -0
  95. package/dist/speckits/code-review.d.ts +3 -0
  96. package/dist/speckits/code-review.d.ts.map +1 -0
  97. package/dist/speckits/code-review.js +41 -0
  98. package/dist/speckits/code-review.js.map +1 -0
  99. package/dist/speckits/debugger.d.ts +3 -0
  100. package/dist/speckits/debugger.d.ts.map +1 -0
  101. package/dist/speckits/debugger.js +38 -0
  102. package/dist/speckits/debugger.js.map +1 -0
  103. package/dist/speckits/index.d.ts +11 -0
  104. package/dist/speckits/index.d.ts.map +1 -0
  105. package/dist/speckits/index.js +40 -0
  106. package/dist/speckits/index.js.map +1 -0
  107. package/dist/speckits/more-speckits.d.ts +6 -0
  108. package/dist/speckits/more-speckits.d.ts.map +1 -0
  109. package/dist/speckits/more-speckits.js +136 -0
  110. package/dist/speckits/more-speckits.js.map +1 -0
  111. package/dist/speckits/vibe-coder.d.ts +3 -0
  112. package/dist/speckits/vibe-coder.d.ts.map +1 -0
  113. package/dist/speckits/vibe-coder.js +32 -0
  114. package/dist/speckits/vibe-coder.js.map +1 -0
  115. package/dist/utils/config.d.ts +18 -0
  116. package/dist/utils/config.d.ts.map +1 -0
  117. package/dist/utils/config.js +107 -0
  118. package/dist/utils/config.js.map +1 -0
  119. package/dist/utils/file-ops.d.ts +15 -0
  120. package/dist/utils/file-ops.d.ts.map +1 -0
  121. package/dist/utils/file-ops.js +109 -0
  122. package/dist/utils/file-ops.js.map +1 -0
  123. package/dist/utils/logger.d.ts +4 -0
  124. package/dist/utils/logger.d.ts.map +1 -0
  125. package/dist/utils/logger.js +25 -0
  126. package/dist/utils/logger.js.map +1 -0
  127. package/dist/web/public/css/app.css +370 -0
  128. package/dist/web/public/index.html +91 -0
  129. package/dist/web/public/js/app.js +212 -0
  130. package/dist/web/routes/sessions.d.ts +4 -0
  131. package/dist/web/routes/sessions.d.ts.map +1 -0
  132. package/dist/web/routes/sessions.js +51 -0
  133. package/dist/web/routes/sessions.js.map +1 -0
  134. package/dist/web/routes/settings.d.ts +3 -0
  135. package/dist/web/routes/settings.d.ts.map +1 -0
  136. package/dist/web/routes/settings.js +33 -0
  137. package/dist/web/routes/settings.js.map +1 -0
  138. package/dist/web/server.d.ts +16 -0
  139. package/dist/web/server.d.ts.map +1 -0
  140. package/dist/web/server.js +76 -0
  141. package/dist/web/server.js.map +1 -0
  142. package/package.json +86 -0
@@ -0,0 +1,182 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.NotificationManager = void 0;
7
+ const axios_1 = __importDefault(require("axios"));
8
+ const logger_1 = require("../utils/logger");
9
+ // ── Notification manager ──────────────────────────────────────────────────────
10
+ /**
11
+ * Dispatches notifications to every enabled channel (Slack, Webhook, Teams,
12
+ * PagerDuty, Email) in parallel.
13
+ */
14
+ class NotificationManager {
15
+ constructor(config) {
16
+ this.config = config;
17
+ }
18
+ async send(message) {
19
+ const tasks = [];
20
+ if (this.config.slack?.enabled)
21
+ tasks.push(this.sendSlack(message));
22
+ if (this.config.webhook?.enabled)
23
+ tasks.push(this.sendWebhook(message));
24
+ if (this.config.teams?.enabled)
25
+ tasks.push(this.sendTeams(message));
26
+ if (this.config.pagerduty?.enabled)
27
+ tasks.push(this.sendPagerDuty(message));
28
+ if (this.config.email?.enabled)
29
+ tasks.push(this.sendEmail(message));
30
+ await Promise.allSettled(tasks);
31
+ }
32
+ // ── Helpers ────────────────────────────────────────────────────────────────
33
+ /** Build the human-in-the-loop body text used by every channel. */
34
+ buildHITLText(message) {
35
+ const hitl = message.hitlRequest;
36
+ if (!hitl)
37
+ return message.body;
38
+ const logSnippet = hitl.failure.logLines.slice(-10).join('\n');
39
+ return [
40
+ `*Service:* ${message.service}`,
41
+ `*Error:* ${hitl.failure.errorSummary}`,
42
+ '',
43
+ '*Recent logs:*',
44
+ '```',
45
+ logSnippet,
46
+ '```',
47
+ '',
48
+ '*AI analysis:*',
49
+ hitl.failure.aiAnalysis || '_(analyzing)_',
50
+ '',
51
+ '*Proposed fix:*',
52
+ hitl.proposedFix,
53
+ '',
54
+ `_Reply \`approve ${hitl.failure.id}\`, \`reject ${hitl.failure.id}\`, or \`debug ${hitl.failure.id}\` to respond._`,
55
+ ].join('\n');
56
+ }
57
+ // ── Channel senders ────────────────────────────────────────────────────────
58
+ async sendSlack(message) {
59
+ const cfg = this.config.slack;
60
+ const color = message.severity === 'critical' || message.severity === 'error'
61
+ ? 'danger'
62
+ : message.severity === 'warning'
63
+ ? 'warning'
64
+ : 'good';
65
+ const payload = {
66
+ attachments: [
67
+ {
68
+ color,
69
+ title: message.title,
70
+ text: this.buildHITLText(message),
71
+ ts: Math.floor(Date.now() / 1000),
72
+ },
73
+ ],
74
+ };
75
+ if (cfg.channel)
76
+ payload.channel = cfg.channel;
77
+ if (cfg.username)
78
+ payload.username = cfg.username;
79
+ try {
80
+ await axios_1.default.post(cfg.webhookUrl, payload);
81
+ logger_1.logger.debug(`Slack notification sent: ${message.title}`);
82
+ }
83
+ catch (err) {
84
+ logger_1.logger.error(`Failed to send Slack notification: ${err}`);
85
+ }
86
+ }
87
+ async sendWebhook(message) {
88
+ const cfg = this.config.webhook;
89
+ const payload = {
90
+ title: message.title,
91
+ body: message.body,
92
+ severity: message.severity,
93
+ service: message.service,
94
+ timestamp: new Date().toISOString(),
95
+ hitlRequest: message.hitlRequest,
96
+ failure: message.failure,
97
+ };
98
+ try {
99
+ await axios_1.default.request({
100
+ method: cfg.method || 'POST',
101
+ url: cfg.url,
102
+ headers: cfg.headers,
103
+ data: payload,
104
+ });
105
+ logger_1.logger.debug(`Webhook notification sent: ${message.title}`);
106
+ }
107
+ catch (err) {
108
+ logger_1.logger.error(`Failed to send webhook notification: ${err}`);
109
+ }
110
+ }
111
+ async sendTeams(message) {
112
+ const cfg = this.config.teams;
113
+ const themeColor = message.severity === 'critical'
114
+ ? 'FF0000'
115
+ : message.severity === 'error'
116
+ ? 'FF8C00'
117
+ : '00B050';
118
+ const payload = {
119
+ '@type': 'MessageCard',
120
+ '@context': 'https://schema.org/extensions',
121
+ themeColor,
122
+ summary: message.title,
123
+ sections: [
124
+ {
125
+ activityTitle: message.title,
126
+ activitySubtitle: `Service: ${message.service}`,
127
+ text: this.buildHITLText(message),
128
+ },
129
+ ],
130
+ };
131
+ try {
132
+ await axios_1.default.post(cfg.webhookUrl, payload);
133
+ logger_1.logger.debug(`Teams notification sent: ${message.title}`);
134
+ }
135
+ catch (err) {
136
+ logger_1.logger.error(`Failed to send Teams notification: ${err}`);
137
+ }
138
+ }
139
+ async sendPagerDuty(message) {
140
+ const cfg = this.config.pagerduty;
141
+ const payload = {
142
+ routing_key: cfg.integrationKey,
143
+ event_action: 'trigger',
144
+ dedup_key: message.failure?.id,
145
+ payload: {
146
+ summary: message.title,
147
+ severity: cfg.severity || 'error',
148
+ source: message.service,
149
+ custom_details: {
150
+ body: message.body,
151
+ analysis: message.hitlRequest?.failure.aiAnalysis,
152
+ proposedFix: message.hitlRequest?.proposedFix,
153
+ },
154
+ },
155
+ };
156
+ try {
157
+ await axios_1.default.post('https://events.pagerduty.com/v2/enqueue', payload);
158
+ logger_1.logger.debug(`PagerDuty notification sent: ${message.title}`);
159
+ }
160
+ catch (err) {
161
+ logger_1.logger.error(`Failed to send PagerDuty notification: ${err}`);
162
+ }
163
+ }
164
+ async sendEmail(message) {
165
+ const cfg = this.config.email;
166
+ const payload = {
167
+ to: cfg.to,
168
+ from: cfg.from,
169
+ subject: message.title,
170
+ text: this.buildHITLText(message),
171
+ };
172
+ try {
173
+ await axios_1.default.post(cfg.gatewayUrl, payload, { headers: cfg.headers });
174
+ logger_1.logger.debug(`Email notification sent: ${message.title}`);
175
+ }
176
+ catch (err) {
177
+ logger_1.logger.error(`Failed to send email notification: ${err}`);
178
+ }
179
+ }
180
+ }
181
+ exports.NotificationManager = NotificationManager;
182
+ //# sourceMappingURL=notifications.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notifications.js","sourceRoot":"","sources":["../../src/cluster-monitor/notifications.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import { Session } from '../session/session';
2
+ import { ClusterRules, RemediationRule, RemediationAction, DetectedFailure } from './types';
3
+ export interface RemediationResult {
4
+ success: boolean;
5
+ action: string;
6
+ output?: string;
7
+ error?: string;
8
+ requiresApproval: boolean;
9
+ }
10
+ /**
11
+ * Analyses failures with AI and executes (or proposes) remediation actions
12
+ * subject to the ClusterRules constraints.
13
+ */
14
+ export declare class RemediationEngine {
15
+ private session;
16
+ private rules;
17
+ constructor(session: Session, rules: ClusterRules);
18
+ /**
19
+ * Ask the AI to analyse the failure and return a proposed fix as a string.
20
+ */
21
+ analyzeAndProposeFix(failure: DetectedFailure): Promise<string>;
22
+ /** Return the highest-priority rule that matches these log lines, or null. */
23
+ findApplicableRule(failure: DetectedFailure): RemediationRule | null;
24
+ /**
25
+ * Returns true if this rule (or its action type) requires human approval
26
+ * even when running in auto-fix mode.
27
+ */
28
+ requiresApproval(rule: RemediationRule): boolean;
29
+ /** Execute a concrete remediation action and return the result. */
30
+ applyAction(action: RemediationAction, failure: DetectedFailure): Promise<RemediationResult>;
31
+ private exec;
32
+ }
33
+ //# sourceMappingURL=remediation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remediation.d.ts","sourceRoot":"","sources":["../../src/cluster-monitor/remediation.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EACL,YAAY,EACZ,eAAe,EACf,iBAAiB,EACjB,eAAe,EAChB,MAAM,SAAS,CAAC;AAMjB,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAID;;;GAGG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,KAAK,CAAe;gBAEhB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY;IAOjD;;OAEG;IACG,oBAAoB,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC;IAkCrE,8EAA8E;IAC9E,kBAAkB,CAAC,OAAO,EAAE,eAAe,GAAG,eAAe,GAAG,IAAI;IAIpE;;;OAGG;IACH,gBAAgB,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO;IAQhD,mEAAmE;IAC7D,WAAW,CACf,MAAM,EAAE,iBAAiB,EACzB,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,iBAAiB,CAAC;IAsD7B,OAAO,CAAC,IAAI;CAmBb"}
@@ -0,0 +1,134 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RemediationEngine = void 0;
4
+ const child_process_1 = require("child_process");
5
+ const rules_1 = require("./rules");
6
+ const logger_1 = require("../utils/logger");
7
+ // ── Remediation engine ────────────────────────────────────────────────────────
8
+ /**
9
+ * Analyses failures with AI and executes (or proposes) remediation actions
10
+ * subject to the ClusterRules constraints.
11
+ */
12
+ class RemediationEngine {
13
+ constructor(session, rules) {
14
+ this.session = session;
15
+ this.rules = rules;
16
+ }
17
+ // ── AI analysis ────────────────────────────────────────────────────────────
18
+ /**
19
+ * Ask the AI to analyse the failure and return a proposed fix as a string.
20
+ */
21
+ async analyzeAndProposeFix(failure) {
22
+ const avoidanceContext = (0, rules_1.avoidanceRulesToSystemPrompt)(this.rules.avoid);
23
+ const logText = failure.logLines.join('\n');
24
+ const prompt = [
25
+ `You are analyzing logs from service "${failure.serviceName}" running in a cluster.`,
26
+ '',
27
+ 'Recent log output:',
28
+ '```',
29
+ logText,
30
+ '```',
31
+ '',
32
+ `Error summary: ${failure.errorSummary}`,
33
+ '',
34
+ 'Please:',
35
+ '1. Identify the root cause',
36
+ '2. Explain why it is happening',
37
+ '3. Propose a concrete, minimal fix',
38
+ '4. Rate confidence: low / medium / high',
39
+ '5. Rate risk: low / medium / high',
40
+ '',
41
+ ...(avoidanceContext ? [avoidanceContext] : []),
42
+ ].join('\n');
43
+ let analysis = '';
44
+ await this.session.chat(prompt, {
45
+ stream: true,
46
+ onChunk: (chunk) => { analysis += chunk; },
47
+ });
48
+ return analysis;
49
+ }
50
+ // ── Rule helpers ────────────────────────────────────────────────────────────
51
+ /** Return the highest-priority rule that matches these log lines, or null. */
52
+ findApplicableRule(failure) {
53
+ return (0, rules_1.findMatchingRule)(failure.logLines, this.rules.canAutoFix);
54
+ }
55
+ /**
56
+ * Returns true if this rule (or its action type) requires human approval
57
+ * even when running in auto-fix mode.
58
+ */
59
+ requiresApproval(rule) {
60
+ if (rule.requireApproval)
61
+ return true;
62
+ if (this.rules.requireApproval?.includes(rule.action.type))
63
+ return true;
64
+ return false;
65
+ }
66
+ // ── Action execution ────────────────────────────────────────────────────────
67
+ /** Execute a concrete remediation action and return the result. */
68
+ async applyAction(action, failure) {
69
+ logger_1.logger.info(`Applying remediation action "${action.type}" for ${failure.serviceName}`);
70
+ switch (action.type) {
71
+ case 'restart-pod':
72
+ return this.exec('kubectl', [
73
+ 'rollout', 'restart',
74
+ ...(action.namespace ? ['-n', action.namespace] : []),
75
+ action.selector || `deployment/${failure.serviceName}`,
76
+ ]);
77
+ case 'scale-deployment':
78
+ return this.exec('kubectl', [
79
+ 'scale',
80
+ ...(action.namespace ? ['-n', action.namespace] : []),
81
+ `deployment/${failure.serviceName}`,
82
+ `--replicas=${action.replicas}`,
83
+ ]);
84
+ case 'kubectl':
85
+ return this.exec('kubectl', [action.subcommand, ...(action.args || [])]);
86
+ case 'docker':
87
+ return this.exec('docker', [action.subcommand, ...(action.args || [])]);
88
+ case 'exec-command':
89
+ return this.exec(action.command, action.args || []);
90
+ case 'ai-fix':
91
+ // AI-generated code changes always surface for human review
92
+ return {
93
+ success: true,
94
+ action: 'ai-fix',
95
+ output: failure.proposedFix || failure.aiAnalysis || 'No fix available.',
96
+ requiresApproval: true,
97
+ };
98
+ case 'notify-only':
99
+ return { success: true, action: 'notify-only', output: 'Notification sent.', requiresApproval: false };
100
+ default: {
101
+ const unknownType = action.type;
102
+ return {
103
+ success: false,
104
+ action: unknownType,
105
+ error: `Unknown action type: ${unknownType}`,
106
+ requiresApproval: false,
107
+ };
108
+ }
109
+ }
110
+ }
111
+ // ── Helpers ────────────────────────────────────────────────────────────────
112
+ exec(cmd, args) {
113
+ return new Promise((resolve) => {
114
+ const child = (0, child_process_1.spawn)(cmd, args, { stdio: ['ignore', 'pipe', 'pipe'] });
115
+ let stdout = '';
116
+ let stderr = '';
117
+ child.stdout?.on('data', (d) => { stdout += d.toString(); });
118
+ child.stderr?.on('data', (d) => { stderr += d.toString(); });
119
+ child.on('close', (code) => {
120
+ if (code === 0) {
121
+ resolve({ success: true, action: `${cmd} ${args.join(' ')}`, output: stdout.trim(), requiresApproval: false });
122
+ }
123
+ else {
124
+ resolve({ success: false, action: `${cmd} ${args.join(' ')}`, error: stderr.trim() || `Exit code ${code}`, requiresApproval: false });
125
+ }
126
+ });
127
+ child.on('error', (err) => {
128
+ resolve({ success: false, action: `${cmd} ${args.join(' ')}`, error: err.message, requiresApproval: false });
129
+ });
130
+ });
131
+ }
132
+ }
133
+ exports.RemediationEngine = RemediationEngine;
134
+ //# sourceMappingURL=remediation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remediation.js","sourceRoot":"","sources":["../../src/cluster-monitor/remediation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import { ClusterRules, ClusterRulesFile, RemediationRule, AvoidanceRule } from './types';
2
+ /**
3
+ * Load cluster rules from a YAML or JSON file.
4
+ * Throws if the file is missing or cannot be parsed.
5
+ */
6
+ export declare function loadClusterRules(filePath: string): ClusterRulesFile;
7
+ /**
8
+ * Validate a raw (possibly partial) rules file object and fill in defaults.
9
+ */
10
+ export declare function validateClusterRules(raw: Partial<ClusterRulesFile>): ClusterRulesFile;
11
+ /**
12
+ * Find the highest-priority remediation rule whose trigger matches the given log lines.
13
+ * Returns null if no rule matches.
14
+ */
15
+ export declare function findMatchingRule(logLines: string[], rules: RemediationRule[]): RemediationRule | null;
16
+ /**
17
+ * Convert avoidance rules into a system-prompt section the AI must honour.
18
+ */
19
+ export declare function avoidanceRulesToSystemPrompt(avoid: AvoidanceRule[]): string;
20
+ /**
21
+ * Conservative default rules shipped with the library.
22
+ * No auto-fix actions are enabled by default (opt-in model).
23
+ * Only hard avoidance constraints are set.
24
+ */
25
+ export declare const DEFAULT_CLUSTER_RULES: ClusterRules;
26
+ //# sourceMappingURL=rules.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rules.d.ts","sourceRoot":"","sources":["../../src/cluster-monitor/rules.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,eAAe,EACf,aAAa,EACd,MAAM,SAAS,CAAC;AAIjB;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,gBAAgB,CAYnE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,gBAAgB,CAuBrF;AAID;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,EAAE,EAClB,KAAK,EAAE,eAAe,EAAE,GACvB,eAAe,GAAG,IAAI,CAiBxB;AAID;;GAEG;AACH,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,aAAa,EAAE,GAAG,MAAM,CAQ3E;AAID;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,EAAE,YA+BnC,CAAC"}
@@ -0,0 +1,133 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.DEFAULT_CLUSTER_RULES = void 0;
7
+ exports.loadClusterRules = loadClusterRules;
8
+ exports.validateClusterRules = validateClusterRules;
9
+ exports.findMatchingRule = findMatchingRule;
10
+ exports.avoidanceRulesToSystemPrompt = avoidanceRulesToSystemPrompt;
11
+ const fs_1 = __importDefault(require("fs"));
12
+ const path_1 = __importDefault(require("path"));
13
+ const js_yaml_1 = __importDefault(require("js-yaml"));
14
+ // ── File loading ─────────────────────────────────────────────────────────────
15
+ /**
16
+ * Load cluster rules from a YAML or JSON file.
17
+ * Throws if the file is missing or cannot be parsed.
18
+ */
19
+ function loadClusterRules(filePath) {
20
+ const absPath = path_1.default.resolve(filePath);
21
+ if (!fs_1.default.existsSync(absPath)) {
22
+ throw new Error(`Cluster rules file not found: ${absPath}`);
23
+ }
24
+ const content = fs_1.default.readFileSync(absPath, 'utf-8');
25
+ const ext = path_1.default.extname(absPath).toLowerCase();
26
+ const raw = ext === '.yaml' || ext === '.yml'
27
+ ? js_yaml_1.default.load(content)
28
+ : JSON.parse(content);
29
+ return validateClusterRules(raw);
30
+ }
31
+ /**
32
+ * Validate a raw (possibly partial) rules file object and fill in defaults.
33
+ */
34
+ function validateClusterRules(raw) {
35
+ const rawRules = raw.rules || {};
36
+ return {
37
+ version: raw.version || '1.0',
38
+ rules: {
39
+ canAutoFix: (rawRules.canAutoFix || []).map((r, i) => ({
40
+ id: r.id || `rule-${i}`,
41
+ name: r.name || `Rule ${i}`,
42
+ description: r.description || '',
43
+ trigger: r.trigger || '',
44
+ action: r.action || { type: 'notify-only' },
45
+ priority: r.priority ?? 0,
46
+ requireApproval: r.requireApproval ?? false,
47
+ })),
48
+ avoid: (rawRules.avoid || []).map((a, i) => ({
49
+ id: a.id || `avoid-${i}`,
50
+ description: a.description || '',
51
+ pattern: a.pattern || '',
52
+ })),
53
+ requireApproval: rawRules.requireApproval || [],
54
+ },
55
+ notifications: raw.notifications,
56
+ };
57
+ }
58
+ // ── Rule matching ─────────────────────────────────────────────────────────────
59
+ /**
60
+ * Find the highest-priority remediation rule whose trigger matches the given log lines.
61
+ * Returns null if no rule matches.
62
+ */
63
+ function findMatchingRule(logLines, rules) {
64
+ if (!logLines.length || !rules.length)
65
+ return null;
66
+ const logText = logLines.join('\n');
67
+ const sorted = [...rules].sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0));
68
+ for (const rule of sorted) {
69
+ let matched;
70
+ try {
71
+ matched = new RegExp(rule.trigger, 'i').test(logText);
72
+ }
73
+ catch {
74
+ // Trigger is not a valid regex — fall back to case-insensitive substring
75
+ matched = logText.toLowerCase().includes(rule.trigger.toLowerCase());
76
+ }
77
+ if (matched)
78
+ return rule;
79
+ }
80
+ return null;
81
+ }
82
+ // ── System-prompt helpers ─────────────────────────────────────────────────────
83
+ /**
84
+ * Convert avoidance rules into a system-prompt section the AI must honour.
85
+ */
86
+ function avoidanceRulesToSystemPrompt(avoid) {
87
+ if (!avoid.length)
88
+ return '';
89
+ return [
90
+ '## CLUSTER REMEDIATION CONSTRAINTS (MUST FOLLOW)',
91
+ 'You MUST NOT perform any of the following operations:',
92
+ ...avoid.map((a) => `- ${a.description}`),
93
+ 'Violating any of the above is STRICTLY PROHIBITED.',
94
+ ].join('\n');
95
+ }
96
+ // ── Safe defaults ─────────────────────────────────────────────────────────────
97
+ /**
98
+ * Conservative default rules shipped with the library.
99
+ * No auto-fix actions are enabled by default (opt-in model).
100
+ * Only hard avoidance constraints are set.
101
+ */
102
+ exports.DEFAULT_CLUSTER_RULES = {
103
+ canAutoFix: [],
104
+ avoid: [
105
+ {
106
+ id: 'avoid-delete-db',
107
+ description: 'Do not delete databases, persistent volumes, or any storage resources',
108
+ pattern: 'delete.*pv|delete.*pvc|drop.*database|truncate.*table',
109
+ },
110
+ {
111
+ id: 'avoid-delete-secrets',
112
+ description: 'Do not delete Kubernetes Secrets or ConfigMaps',
113
+ pattern: 'delete.*secret|delete.*configmap',
114
+ },
115
+ {
116
+ id: 'avoid-scale-zero',
117
+ description: 'Do not scale any deployment to zero replicas',
118
+ pattern: 'scale.*replicas.*0',
119
+ },
120
+ {
121
+ id: 'avoid-delete-namespace',
122
+ description: 'Do not delete namespaces or cluster-level resources',
123
+ pattern: 'delete.*namespace',
124
+ },
125
+ {
126
+ id: 'avoid-all-at-once',
127
+ description: 'Do not stop or delete all services simultaneously',
128
+ pattern: 'delete all|stop all|remove all',
129
+ },
130
+ ],
131
+ requireApproval: ['database-migration', 'config-change', 'dependency-update'],
132
+ };
133
+ //# sourceMappingURL=rules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rules.js","sourceRoot":"","sources":["../../src/cluster-monitor/rules.ts"],"names":[],"mappings":"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"}