fusion-agent 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (142) hide show
  1. package/README.md +467 -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,184 @@
1
+ import { ServiceConnectionOptions } from '../live-debugger/service-connector';
2
+ export interface KubernetesConnectionOptions {
3
+ type: 'kubernetes';
4
+ /** Pod name, deployment name, or label selector (e.g. "app=my-api") */
5
+ selector: string;
6
+ /** Kubernetes namespace (default: 'default') */
7
+ namespace?: string;
8
+ /** Number of log lines to tail initially (default: 100) */
9
+ tail?: number;
10
+ /** Path to kubeconfig file */
11
+ kubeconfig?: string;
12
+ /** kubectl context to use */
13
+ context?: string;
14
+ }
15
+ export interface LogFileConnectionOptions {
16
+ type: 'log-file';
17
+ filePath: string;
18
+ tailLines?: number;
19
+ }
20
+ /** Union of all connection option types understood by the cluster monitor. */
21
+ export type AllServiceConnectionOptions = ServiceConnectionOptions | KubernetesConnectionOptions | LogFileConnectionOptions;
22
+ export interface ServiceTarget {
23
+ /** Human-readable service name (used in notifications and logs) */
24
+ name: string;
25
+ /** How to connect to / tail the service's output */
26
+ connection: AllServiceConnectionOptions;
27
+ }
28
+ /** Operating mode for the cluster monitor */
29
+ export type MonitorMode = 'auto-fix' | 'notify-only' | 'human-in-loop';
30
+ export interface RemediationRule {
31
+ id: string;
32
+ name: string;
33
+ description: string;
34
+ /** Regex pattern (or plain substring) matched against log lines to trigger this rule */
35
+ trigger: string;
36
+ /** Action to execute when the trigger matches */
37
+ action: RemediationAction;
38
+ /** Higher value = evaluated first (default: 0) */
39
+ priority?: number;
40
+ /** When true this rule always requires human approval even in auto-fix mode */
41
+ requireApproval?: boolean;
42
+ }
43
+ export type RemediationAction = {
44
+ type: 'restart-pod';
45
+ namespace?: string;
46
+ selector?: string;
47
+ } | {
48
+ type: 'scale-deployment';
49
+ replicas: number;
50
+ namespace?: string;
51
+ } | {
52
+ type: 'exec-command';
53
+ command: string;
54
+ args?: string[];
55
+ } | {
56
+ type: 'kubectl';
57
+ subcommand: string;
58
+ args?: string[];
59
+ } | {
60
+ type: 'docker';
61
+ subcommand: string;
62
+ args?: string[];
63
+ } | {
64
+ type: 'ai-fix';
65
+ systemPromptAddendum?: string;
66
+ } | {
67
+ type: 'notify-only';
68
+ };
69
+ export interface AvoidanceRule {
70
+ id: string;
71
+ description: string;
72
+ /** Regex or keyword describing the class of operation to prohibit */
73
+ pattern: string;
74
+ }
75
+ export interface ClusterRules {
76
+ /**
77
+ * Rules defining what the agent is allowed to auto-fix.
78
+ * If empty, the agent will never auto-fix anything.
79
+ */
80
+ canAutoFix: RemediationRule[];
81
+ /**
82
+ * Rules defining what the agent MUST NOT do.
83
+ * Injected into the AI system prompt as hard constraints.
84
+ */
85
+ avoid: AvoidanceRule[];
86
+ /**
87
+ * Action-type strings that always require human approval,
88
+ * regardless of individual rule settings.
89
+ */
90
+ requireApproval?: string[];
91
+ }
92
+ export interface SlackNotificationConfig {
93
+ enabled: boolean;
94
+ webhookUrl: string;
95
+ channel?: string;
96
+ username?: string;
97
+ }
98
+ export interface WebhookNotificationConfig {
99
+ enabled: boolean;
100
+ url: string;
101
+ method?: 'POST' | 'PUT';
102
+ headers?: Record<string, string>;
103
+ }
104
+ export interface TeamsNotificationConfig {
105
+ enabled: boolean;
106
+ webhookUrl: string;
107
+ }
108
+ export interface PagerDutyNotificationConfig {
109
+ enabled: boolean;
110
+ integrationKey: string;
111
+ severity?: 'critical' | 'error' | 'warning' | 'info';
112
+ }
113
+ export interface EmailNotificationConfig {
114
+ enabled: boolean;
115
+ /** HTTP API endpoint for an email gateway (e.g. SendGrid, Mailgun) */
116
+ gatewayUrl: string;
117
+ headers?: Record<string, string>;
118
+ to: string[];
119
+ from?: string;
120
+ }
121
+ export interface NotificationConfig {
122
+ slack?: SlackNotificationConfig;
123
+ webhook?: WebhookNotificationConfig;
124
+ teams?: TeamsNotificationConfig;
125
+ pagerduty?: PagerDutyNotificationConfig;
126
+ email?: EmailNotificationConfig;
127
+ }
128
+ export interface ClusterMonitorConfig {
129
+ /** Explicit list of services to watch */
130
+ services: ServiceTarget[];
131
+ /** When true, auto-discover all deployments in `namespace` (Kubernetes only) */
132
+ monitorAll?: boolean;
133
+ /** Kubernetes namespace used for service discovery */
134
+ namespace?: string;
135
+ /** AI provider name */
136
+ provider: string;
137
+ model?: string;
138
+ apiKey: string;
139
+ /** Remediation and avoidance rules */
140
+ rules: ClusterRules;
141
+ /** Notification channels */
142
+ notifications?: NotificationConfig;
143
+ /** Operating mode */
144
+ mode: MonitorMode;
145
+ /** Lines to accumulate before triggering AI analysis (default: 20) */
146
+ batchSize?: number;
147
+ /** Seconds to wait before flushing a partial batch (default: 30) */
148
+ maxWaitSeconds?: number;
149
+ /** Max consecutive auto-fixes before requiring human approval (default: 3) */
150
+ maxConsecutiveAutoFixes?: number;
151
+ /**
152
+ * Custom regex pattern to detect error lines in logs.
153
+ * Defaults to: error|exception|fatal|critical|traceback|panic|fail|oom|killed|crash
154
+ */
155
+ errorKeywordsPattern?: string;
156
+ }
157
+ export interface DetectedFailure {
158
+ id: string;
159
+ serviceName: string;
160
+ timestamp: string;
161
+ logLines: string[];
162
+ errorSummary: string;
163
+ aiAnalysis?: string;
164
+ proposedFix?: string;
165
+ appliedRule?: RemediationRule;
166
+ status: 'detected' | 'analyzing' | 'proposed' | 'auto-fixed' | 'human-approved' | 'human-rejected' | 'skipped';
167
+ }
168
+ export interface HITLRequest {
169
+ failure: DetectedFailure;
170
+ proposedFix: string;
171
+ affectedRule?: RemediationRule;
172
+ timestamp: string;
173
+ }
174
+ export interface HITLResponse {
175
+ failureId: string;
176
+ decision: 'approve' | 'reject' | 'debug-more';
177
+ comment?: string;
178
+ }
179
+ export interface ClusterRulesFile {
180
+ version?: string;
181
+ rules: ClusterRules;
182
+ notifications?: NotificationConfig;
183
+ }
184
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/cluster-monitor/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/cluster-monitor/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,47 @@
1
+ export * from './providers';
2
+ export * from './session';
3
+ export * from './speckits';
4
+ export { LiveDebugger, LogWatcher, ServiceConnector } from './live-debugger';
5
+ export type { LiveDebuggerOptions, ServiceConnectionOptions } from './live-debugger';
6
+ export { ClusterMonitor, RemediationEngine, NotificationManager, KubernetesConnector, discoverServices, loadClusterRules, validateClusterRules, findMatchingRule, avoidanceRulesToSystemPrompt, DEFAULT_CLUSTER_RULES } from './cluster-monitor';
7
+ export type { ClusterMonitorConfig, ServiceTarget, AllServiceConnectionOptions, KubernetesConnectionOptions, LogFileConnectionOptions, MonitorMode, ClusterRules, RemediationRule, RemediationAction, AvoidanceRule, NotificationConfig, DetectedFailure, HITLRequest, HITLResponse, ClusterRulesFile, RemediationResult, NotificationMessage } from './cluster-monitor';
8
+ export { createWebServer } from './web/server';
9
+ export { loadConfig, saveConfig } from './utils/config';
10
+ export type { AIAgentConfig, GuardrailConfig } from './utils/config';
11
+ export { gatherProjectContext, getDirectoryStructure, createChange, applyChange, revertChange } from './utils/file-ops';
12
+ import { AIAgentConfig } from './utils/config';
13
+ import { SessionManager } from './session/session-manager';
14
+ import { SessionConfig } from './session/session';
15
+ import { Session } from './session/session';
16
+ export interface AgentCLIOptions extends Partial<AIAgentConfig> {
17
+ sessionsDir?: string;
18
+ }
19
+ /**
20
+ * Main programmatic API for fusion-agent.
21
+ */
22
+ export declare class AgentCLI {
23
+ private config;
24
+ readonly sessionManager: SessionManager;
25
+ constructor(options?: AgentCLIOptions);
26
+ /**
27
+ * Create a new agent session.
28
+ */
29
+ createSession(config: Partial<SessionConfig> & {
30
+ name: string;
31
+ }): Session;
32
+ /**
33
+ * Load an existing session by ID.
34
+ */
35
+ loadSession(sessionId: string): Session;
36
+ /**
37
+ * Quick one-shot chat without managing sessions.
38
+ */
39
+ chat(message: string, options?: {
40
+ provider?: string;
41
+ model?: string;
42
+ speckit?: string;
43
+ stream?: boolean;
44
+ onChunk?: (c: string) => void;
45
+ }): Promise<string>;
46
+ }
47
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAC7E,YAAY,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AACrF,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,4BAA4B,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AACjP,YAAY,EAAE,oBAAoB,EAAE,aAAa,EAAE,2BAA2B,EAAE,2BAA2B,EAAE,wBAAwB,EAAE,WAAW,EAAE,YAAY,EAAE,eAAe,EAAE,iBAAiB,EAAE,aAAa,EAAE,kBAAkB,EAAE,eAAe,EAAE,WAAW,EAAE,YAAY,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACzW,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACxD,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACrE,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAExH,OAAO,EAAc,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE3D,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAK5C,MAAM,WAAW,eAAgB,SAAQ,OAAO,CAAC,aAAa,CAAC;IAC7D,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,qBAAa,QAAQ;IACnB,OAAO,CAAC,MAAM,CAAgB;IAC9B,SAAgB,cAAc,EAAE,cAAc,CAAC;gBAEnC,OAAO,GAAE,eAAoB;IAMzC;;OAEG;IACH,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO;IAmBzE;;OAEG;IACH,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAIvC;;OAEG;IACG,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;KAAO,GAAG,OAAO,CAAC,MAAM,CAAC;CAkBrK"}
package/dist/index.js ADDED
@@ -0,0 +1,115 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ var __importDefault = (this && this.__importDefault) || function (mod) {
17
+ return (mod && mod.__esModule) ? mod : { "default": mod };
18
+ };
19
+ Object.defineProperty(exports, "__esModule", { value: true });
20
+ exports.AgentCLI = exports.revertChange = exports.applyChange = exports.createChange = exports.getDirectoryStructure = exports.gatherProjectContext = exports.saveConfig = exports.loadConfig = exports.createWebServer = exports.DEFAULT_CLUSTER_RULES = exports.avoidanceRulesToSystemPrompt = exports.findMatchingRule = exports.validateClusterRules = exports.loadClusterRules = exports.discoverServices = exports.KubernetesConnector = exports.NotificationManager = exports.RemediationEngine = exports.ClusterMonitor = exports.ServiceConnector = exports.LogWatcher = exports.LiveDebugger = void 0;
21
+ // Main library entry point
22
+ __exportStar(require("./providers"), exports);
23
+ __exportStar(require("./session"), exports);
24
+ __exportStar(require("./speckits"), exports);
25
+ var live_debugger_1 = require("./live-debugger");
26
+ Object.defineProperty(exports, "LiveDebugger", { enumerable: true, get: function () { return live_debugger_1.LiveDebugger; } });
27
+ Object.defineProperty(exports, "LogWatcher", { enumerable: true, get: function () { return live_debugger_1.LogWatcher; } });
28
+ Object.defineProperty(exports, "ServiceConnector", { enumerable: true, get: function () { return live_debugger_1.ServiceConnector; } });
29
+ var cluster_monitor_1 = require("./cluster-monitor");
30
+ Object.defineProperty(exports, "ClusterMonitor", { enumerable: true, get: function () { return cluster_monitor_1.ClusterMonitor; } });
31
+ Object.defineProperty(exports, "RemediationEngine", { enumerable: true, get: function () { return cluster_monitor_1.RemediationEngine; } });
32
+ Object.defineProperty(exports, "NotificationManager", { enumerable: true, get: function () { return cluster_monitor_1.NotificationManager; } });
33
+ Object.defineProperty(exports, "KubernetesConnector", { enumerable: true, get: function () { return cluster_monitor_1.KubernetesConnector; } });
34
+ Object.defineProperty(exports, "discoverServices", { enumerable: true, get: function () { return cluster_monitor_1.discoverServices; } });
35
+ Object.defineProperty(exports, "loadClusterRules", { enumerable: true, get: function () { return cluster_monitor_1.loadClusterRules; } });
36
+ Object.defineProperty(exports, "validateClusterRules", { enumerable: true, get: function () { return cluster_monitor_1.validateClusterRules; } });
37
+ Object.defineProperty(exports, "findMatchingRule", { enumerable: true, get: function () { return cluster_monitor_1.findMatchingRule; } });
38
+ Object.defineProperty(exports, "avoidanceRulesToSystemPrompt", { enumerable: true, get: function () { return cluster_monitor_1.avoidanceRulesToSystemPrompt; } });
39
+ Object.defineProperty(exports, "DEFAULT_CLUSTER_RULES", { enumerable: true, get: function () { return cluster_monitor_1.DEFAULT_CLUSTER_RULES; } });
40
+ var server_1 = require("./web/server");
41
+ Object.defineProperty(exports, "createWebServer", { enumerable: true, get: function () { return server_1.createWebServer; } });
42
+ var config_1 = require("./utils/config");
43
+ Object.defineProperty(exports, "loadConfig", { enumerable: true, get: function () { return config_1.loadConfig; } });
44
+ Object.defineProperty(exports, "saveConfig", { enumerable: true, get: function () { return config_1.saveConfig; } });
45
+ var file_ops_1 = require("./utils/file-ops");
46
+ Object.defineProperty(exports, "gatherProjectContext", { enumerable: true, get: function () { return file_ops_1.gatherProjectContext; } });
47
+ Object.defineProperty(exports, "getDirectoryStructure", { enumerable: true, get: function () { return file_ops_1.getDirectoryStructure; } });
48
+ Object.defineProperty(exports, "createChange", { enumerable: true, get: function () { return file_ops_1.createChange; } });
49
+ Object.defineProperty(exports, "applyChange", { enumerable: true, get: function () { return file_ops_1.applyChange; } });
50
+ Object.defineProperty(exports, "revertChange", { enumerable: true, get: function () { return file_ops_1.revertChange; } });
51
+ const config_2 = require("./utils/config");
52
+ const providers_1 = require("./providers");
53
+ const session_manager_1 = require("./session/session-manager");
54
+ const speckits_1 = require("./speckits");
55
+ const os_1 = __importDefault(require("os"));
56
+ const path_1 = __importDefault(require("path"));
57
+ /**
58
+ * Main programmatic API for fusion-agent.
59
+ */
60
+ class AgentCLI {
61
+ constructor(options = {}) {
62
+ this.config = (0, config_2.loadConfig)(options);
63
+ const sessionsDir = options.sessionsDir || this.config.sessionDir || path_1.default.join(os_1.default.homedir(), '.fusion-agent', 'sessions');
64
+ this.sessionManager = new session_manager_1.SessionManager(sessionsDir);
65
+ }
66
+ /**
67
+ * Create a new agent session.
68
+ */
69
+ createSession(config) {
70
+ const speckit = config.speckit ? speckits_1.SPECKITS[config.speckit] : undefined;
71
+ const fullConfig = {
72
+ provider: config.provider || this.config.provider,
73
+ model: config.model || this.config.model || '',
74
+ guardrails: (config.guardrails || this.config.guardrails || []).map((g) => ({
75
+ id: g.id || `gr-${Date.now()}-${Math.random().toString(36).slice(2, 7)}`,
76
+ type: g.type,
77
+ value: g.value,
78
+ description: g.description,
79
+ })),
80
+ systemPrompt: config.systemPrompt || speckit?.systemPrompt,
81
+ projectDir: config.projectDir || process.cwd(),
82
+ speckit: config.speckit,
83
+ name: config.name,
84
+ };
85
+ return this.sessionManager.createSession(fullConfig, this.config.apiKey);
86
+ }
87
+ /**
88
+ * Load an existing session by ID.
89
+ */
90
+ loadSession(sessionId) {
91
+ return this.sessionManager.loadSession(sessionId, this.config.apiKey);
92
+ }
93
+ /**
94
+ * Quick one-shot chat without managing sessions.
95
+ */
96
+ async chat(message, options = {}) {
97
+ const speckit = options.speckit ? speckits_1.SPECKITS[options.speckit] : undefined;
98
+ const provider = (0, providers_1.createProvider)({
99
+ provider: (options.provider || this.config.provider),
100
+ model: options.model || this.config.model,
101
+ apiKey: this.config.apiKey,
102
+ });
103
+ const result = await provider.complete({
104
+ messages: [
105
+ { role: 'system', content: speckit?.systemPrompt || 'You are a helpful AI coding assistant.' },
106
+ { role: 'user', content: message },
107
+ ],
108
+ stream: options.stream,
109
+ onChunk: options.onChunk,
110
+ });
111
+ return result.content;
112
+ }
113
+ }
114
+ exports.AgentCLI = AgentCLI;
115
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import { EventEmitter } from 'events';
2
+ import { Session } from '../session/session';
3
+ import { ServiceConnectionOptions } from './service-connector';
4
+ export interface LiveDebuggerOptions {
5
+ session: Session;
6
+ /** How many log lines to accumulate before analyzing (default: 20) */
7
+ batchSize?: number;
8
+ /** Max seconds to wait before analyzing accumulated lines (default: 30) */
9
+ maxWaitSeconds?: number;
10
+ onAnalysis?: (analysis: string) => void;
11
+ onLog?: (line: string) => void;
12
+ }
13
+ export declare class LiveDebugger extends EventEmitter {
14
+ private session;
15
+ private batchSize;
16
+ private maxWaitSeconds;
17
+ private logBatch;
18
+ private flushTimer?;
19
+ private connector?;
20
+ private analyzing;
21
+ constructor(options: LiveDebuggerOptions);
22
+ watchLogFile(filePath: string, tailLines?: number): void;
23
+ connectToService(options: ServiceConnectionOptions): void;
24
+ private handleLine;
25
+ private flush;
26
+ analyzeNow(customPrompt?: string): Promise<string>;
27
+ stop(): void;
28
+ }
29
+ export { LogWatcher } from './log-watcher';
30
+ export { ServiceConnector } from './service-connector';
31
+ export type { ServiceConnectionOptions } from './service-connector';
32
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/live-debugger/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAE7C,OAAO,EAAoB,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAGjF,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,sEAAsE;IACtE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2EAA2E;IAC3E,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAChC;AAED,qBAAa,YAAa,SAAQ,YAAY;IAC5C,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAgB;IAChC,OAAO,CAAC,UAAU,CAAC,CAAgC;IACnD,OAAO,CAAC,SAAS,CAAC,CAAgC;IAClD,OAAO,CAAC,SAAS,CAAS;gBAEd,OAAO,EAAE,mBAAmB;IAUxC,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,SAAK,GAAG,IAAI;IAOpD,gBAAgB,CAAC,OAAO,EAAE,wBAAwB,GAAG,IAAI;IAWzD,OAAO,CAAC,UAAU;YAaJ,KAAK;IAuCb,UAAU,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAqBxD,IAAI,IAAI,IAAI;CAUb;AAED,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,YAAY,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,119 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ServiceConnector = exports.LogWatcher = exports.LiveDebugger = void 0;
4
+ const events_1 = require("events");
5
+ const log_watcher_1 = require("./log-watcher");
6
+ const service_connector_1 = require("./service-connector");
7
+ const logger_1 = require("../utils/logger");
8
+ class LiveDebugger extends events_1.EventEmitter {
9
+ constructor(options) {
10
+ super();
11
+ this.logBatch = [];
12
+ this.analyzing = false;
13
+ this.session = options.session;
14
+ this.batchSize = options.batchSize ?? 20;
15
+ this.maxWaitSeconds = options.maxWaitSeconds ?? 30;
16
+ if (options.onAnalysis)
17
+ this.on('analysis', options.onAnalysis);
18
+ if (options.onLog)
19
+ this.on('log', options.onLog);
20
+ }
21
+ watchLogFile(filePath, tailLines = 50) {
22
+ const watcher = new log_watcher_1.LogWatcher({ filePath, tailLines });
23
+ watcher.on('line', (line) => this.handleLine(line));
24
+ watcher.start();
25
+ this.connector = watcher;
26
+ }
27
+ connectToService(options) {
28
+ const connector = new service_connector_1.ServiceConnector(options);
29
+ connector.on('line', (line) => this.handleLine(line));
30
+ connector.on('exit', (code) => {
31
+ logger_1.logger.info(`Service exited with code: ${code}`);
32
+ this.emit('exit', code);
33
+ });
34
+ connector.start();
35
+ this.connector = connector;
36
+ }
37
+ handleLine(line) {
38
+ this.emit('log', line);
39
+ this.logBatch.push(line);
40
+ // Reset flush timer
41
+ if (this.flushTimer)
42
+ clearTimeout(this.flushTimer);
43
+ this.flushTimer = setTimeout(() => { void this.flush(); }, this.maxWaitSeconds * 1000);
44
+ if (this.logBatch.length >= this.batchSize) {
45
+ void this.flush();
46
+ }
47
+ }
48
+ async flush() {
49
+ if (this.analyzing || this.logBatch.length === 0)
50
+ return;
51
+ const lines = [...this.logBatch];
52
+ this.logBatch = [];
53
+ if (this.flushTimer) {
54
+ clearTimeout(this.flushTimer);
55
+ this.flushTimer = undefined;
56
+ }
57
+ this.analyzing = true;
58
+ const errorKeywords = /error|exception|fatal|critical|traceback|panic|fail/i;
59
+ const hasErrors = lines.some((l) => errorKeywords.test(l));
60
+ if (!hasErrors) {
61
+ this.analyzing = false;
62
+ return;
63
+ }
64
+ const logContent = lines.join('\n');
65
+ const prompt = `Analyze the following log output from a running service. Identify any errors, their root causes, and provide specific code fixes if possible.\n\n\`\`\`\n${logContent}\n\`\`\``;
66
+ try {
67
+ let analysis = '';
68
+ await this.session.chat(prompt, {
69
+ stream: true,
70
+ onChunk: (chunk) => {
71
+ analysis += chunk;
72
+ this.emit('analysis-chunk', chunk);
73
+ },
74
+ });
75
+ this.emit('analysis', analysis);
76
+ }
77
+ catch (err) {
78
+ logger_1.logger.error(`Live debugger analysis error: ${err}`);
79
+ }
80
+ finally {
81
+ this.analyzing = false;
82
+ }
83
+ }
84
+ async analyzeNow(customPrompt) {
85
+ const lines = [...this.logBatch];
86
+ this.logBatch = [];
87
+ const logContent = lines.join('\n');
88
+ const prompt = customPrompt ||
89
+ `Analyze these logs and identify any issues:\n\n\`\`\`\n${logContent}\n\`\`\``;
90
+ let analysis = '';
91
+ await this.session.chat(prompt, {
92
+ stream: true,
93
+ onChunk: (chunk) => {
94
+ analysis += chunk;
95
+ this.emit('analysis-chunk', chunk);
96
+ },
97
+ });
98
+ this.emit('analysis', analysis);
99
+ return analysis;
100
+ }
101
+ stop() {
102
+ if (this.flushTimer)
103
+ clearTimeout(this.flushTimer);
104
+ if (this.connector) {
105
+ if (this.connector instanceof log_watcher_1.LogWatcher) {
106
+ this.connector.stop();
107
+ }
108
+ else {
109
+ this.connector.stop();
110
+ }
111
+ }
112
+ }
113
+ }
114
+ exports.LiveDebugger = LiveDebugger;
115
+ var log_watcher_2 = require("./log-watcher");
116
+ Object.defineProperty(exports, "LogWatcher", { enumerable: true, get: function () { return log_watcher_2.LogWatcher; } });
117
+ var service_connector_2 = require("./service-connector");
118
+ Object.defineProperty(exports, "ServiceConnector", { enumerable: true, get: function () { return service_connector_2.ServiceConnector; } });
119
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/live-debugger/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { EventEmitter } from 'events';
2
+ export interface LogWatcherOptions {
3
+ filePath: string;
4
+ /** Lines to send as initial context (default: 50) */
5
+ tailLines?: number;
6
+ onLine?: (line: string) => void;
7
+ }
8
+ export declare class LogWatcher extends EventEmitter {
9
+ private filePath;
10
+ private tailLines;
11
+ private watcher?;
12
+ private fileSize;
13
+ private buffer;
14
+ constructor(options: LogWatcherOptions);
15
+ start(): void;
16
+ private onFileChange;
17
+ stop(): void;
18
+ }
19
+ //# sourceMappingURL=log-watcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log-watcher.d.ts","sourceRoot":"","sources":["../../src/live-debugger/log-watcher.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAItC,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,qDAAqD;IACrD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACjC;AAED,qBAAa,UAAW,SAAQ,YAAY;IAC1C,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,OAAO,CAAC,CAAoC;IACpD,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,MAAM,CAAM;gBAER,OAAO,EAAE,iBAAiB;IAStC,KAAK,IAAI,IAAI;IAoBb,OAAO,CAAC,YAAY;IAiCpB,IAAI,IAAI,IAAI;CAOb"}
@@ -0,0 +1,77 @@
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.LogWatcher = void 0;
7
+ const fs_1 = __importDefault(require("fs"));
8
+ const events_1 = require("events");
9
+ const chokidar_1 = __importDefault(require("chokidar"));
10
+ const logger_1 = require("../utils/logger");
11
+ class LogWatcher extends events_1.EventEmitter {
12
+ constructor(options) {
13
+ super();
14
+ this.fileSize = 0;
15
+ this.buffer = '';
16
+ this.filePath = options.filePath;
17
+ this.tailLines = options.tailLines ?? 50;
18
+ if (options.onLine) {
19
+ this.on('line', options.onLine);
20
+ }
21
+ }
22
+ start() {
23
+ if (!fs_1.default.existsSync(this.filePath)) {
24
+ throw new Error(`Log file not found: ${this.filePath}`);
25
+ }
26
+ // Emit tail of existing content
27
+ const content = fs_1.default.readFileSync(this.filePath, 'utf-8');
28
+ const lines = content.split('\n').filter(Boolean);
29
+ const tailLines = lines.slice(-this.tailLines);
30
+ for (const line of tailLines) {
31
+ this.emit('line', line);
32
+ }
33
+ this.fileSize = fs_1.default.statSync(this.filePath).size;
34
+ this.watcher = chokidar_1.default.watch(this.filePath, { persistent: true });
35
+ this.watcher.on('change', () => this.onFileChange());
36
+ logger_1.logger.debug(`Log watcher started: ${this.filePath}`);
37
+ }
38
+ onFileChange() {
39
+ try {
40
+ const stat = fs_1.default.statSync(this.filePath);
41
+ if (stat.size < this.fileSize) {
42
+ // File was truncated/rotated
43
+ this.fileSize = 0;
44
+ this.buffer = '';
45
+ }
46
+ const newSize = stat.size;
47
+ if (newSize <= this.fileSize)
48
+ return;
49
+ const fd = fs_1.default.openSync(this.filePath, 'r');
50
+ const chunkSize = newSize - this.fileSize;
51
+ const buf = Buffer.alloc(chunkSize);
52
+ fs_1.default.readSync(fd, buf, 0, chunkSize, this.fileSize);
53
+ fs_1.default.closeSync(fd);
54
+ this.fileSize = newSize;
55
+ const newContent = this.buffer + buf.toString('utf-8');
56
+ const lines = newContent.split('\n');
57
+ this.buffer = lines.pop() || '';
58
+ for (const line of lines) {
59
+ if (line.trim()) {
60
+ this.emit('line', line);
61
+ }
62
+ }
63
+ }
64
+ catch (err) {
65
+ logger_1.logger.error(`Log watcher error: ${err}`);
66
+ }
67
+ }
68
+ stop() {
69
+ if (this.watcher) {
70
+ this.watcher.close();
71
+ this.watcher = undefined;
72
+ }
73
+ logger_1.logger.debug(`Log watcher stopped: ${this.filePath}`);
74
+ }
75
+ }
76
+ exports.LogWatcher = LogWatcher;
77
+ //# sourceMappingURL=log-watcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log-watcher.js","sourceRoot":"","sources":["../../src/live-debugger/log-watcher.ts"],"names":[],"mappings":"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"}