@renseiai/agentfactory 0.8.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.
- package/LICENSE +21 -0
- package/README.md +125 -0
- package/dist/src/config/index.d.ts +3 -0
- package/dist/src/config/index.d.ts.map +1 -0
- package/dist/src/config/index.js +1 -0
- package/dist/src/config/repository-config.d.ts +44 -0
- package/dist/src/config/repository-config.d.ts.map +1 -0
- package/dist/src/config/repository-config.js +88 -0
- package/dist/src/config/repository-config.test.d.ts +2 -0
- package/dist/src/config/repository-config.test.d.ts.map +1 -0
- package/dist/src/config/repository-config.test.js +249 -0
- package/dist/src/deployment/deployment-checker.d.ts +110 -0
- package/dist/src/deployment/deployment-checker.d.ts.map +1 -0
- package/dist/src/deployment/deployment-checker.js +242 -0
- package/dist/src/deployment/index.d.ts +3 -0
- package/dist/src/deployment/index.d.ts.map +1 -0
- package/dist/src/deployment/index.js +2 -0
- package/dist/src/frontend/index.d.ts +2 -0
- package/dist/src/frontend/index.d.ts.map +1 -0
- package/dist/src/frontend/index.js +1 -0
- package/dist/src/frontend/types.d.ts +106 -0
- package/dist/src/frontend/types.d.ts.map +1 -0
- package/dist/src/frontend/types.js +11 -0
- package/dist/src/governor/decision-engine.d.ts +52 -0
- package/dist/src/governor/decision-engine.d.ts.map +1 -0
- package/dist/src/governor/decision-engine.js +220 -0
- package/dist/src/governor/decision-engine.test.d.ts +2 -0
- package/dist/src/governor/decision-engine.test.d.ts.map +1 -0
- package/dist/src/governor/decision-engine.test.js +629 -0
- package/dist/src/governor/event-bus.d.ts +43 -0
- package/dist/src/governor/event-bus.d.ts.map +1 -0
- package/dist/src/governor/event-bus.js +8 -0
- package/dist/src/governor/event-deduplicator.d.ts +43 -0
- package/dist/src/governor/event-deduplicator.d.ts.map +1 -0
- package/dist/src/governor/event-deduplicator.js +53 -0
- package/dist/src/governor/event-driven-governor.d.ts +131 -0
- package/dist/src/governor/event-driven-governor.d.ts.map +1 -0
- package/dist/src/governor/event-driven-governor.js +379 -0
- package/dist/src/governor/event-driven-governor.test.d.ts +2 -0
- package/dist/src/governor/event-driven-governor.test.d.ts.map +1 -0
- package/dist/src/governor/event-driven-governor.test.js +673 -0
- package/dist/src/governor/event-types.d.ts +78 -0
- package/dist/src/governor/event-types.d.ts.map +1 -0
- package/dist/src/governor/event-types.js +32 -0
- package/dist/src/governor/governor-types.d.ts +82 -0
- package/dist/src/governor/governor-types.d.ts.map +1 -0
- package/dist/src/governor/governor-types.js +21 -0
- package/dist/src/governor/governor.d.ts +100 -0
- package/dist/src/governor/governor.d.ts.map +1 -0
- package/dist/src/governor/governor.js +262 -0
- package/dist/src/governor/governor.test.d.ts +2 -0
- package/dist/src/governor/governor.test.d.ts.map +1 -0
- package/dist/src/governor/governor.test.js +514 -0
- package/dist/src/governor/human-touchpoints.d.ts +131 -0
- package/dist/src/governor/human-touchpoints.d.ts.map +1 -0
- package/dist/src/governor/human-touchpoints.js +251 -0
- package/dist/src/governor/human-touchpoints.test.d.ts +2 -0
- package/dist/src/governor/human-touchpoints.test.d.ts.map +1 -0
- package/dist/src/governor/human-touchpoints.test.js +366 -0
- package/dist/src/governor/in-memory-event-bus.d.ts +29 -0
- package/dist/src/governor/in-memory-event-bus.d.ts.map +1 -0
- package/dist/src/governor/in-memory-event-bus.js +79 -0
- package/dist/src/governor/index.d.ts +14 -0
- package/dist/src/governor/index.d.ts.map +1 -0
- package/dist/src/governor/index.js +13 -0
- package/dist/src/governor/override-parser.d.ts +60 -0
- package/dist/src/governor/override-parser.d.ts.map +1 -0
- package/dist/src/governor/override-parser.js +98 -0
- package/dist/src/governor/override-parser.test.d.ts +2 -0
- package/dist/src/governor/override-parser.test.d.ts.map +1 -0
- package/dist/src/governor/override-parser.test.js +312 -0
- package/dist/src/governor/platform-adapter.d.ts +69 -0
- package/dist/src/governor/platform-adapter.d.ts.map +1 -0
- package/dist/src/governor/platform-adapter.js +11 -0
- package/dist/src/governor/processing-state.d.ts +66 -0
- package/dist/src/governor/processing-state.d.ts.map +1 -0
- package/dist/src/governor/processing-state.js +43 -0
- package/dist/src/governor/processing-state.test.d.ts +2 -0
- package/dist/src/governor/processing-state.test.d.ts.map +1 -0
- package/dist/src/governor/processing-state.test.js +96 -0
- package/dist/src/governor/top-of-funnel.d.ts +118 -0
- package/dist/src/governor/top-of-funnel.d.ts.map +1 -0
- package/dist/src/governor/top-of-funnel.js +168 -0
- package/dist/src/governor/top-of-funnel.test.d.ts +2 -0
- package/dist/src/governor/top-of-funnel.test.d.ts.map +1 -0
- package/dist/src/governor/top-of-funnel.test.js +331 -0
- package/dist/src/index.d.ts +11 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +10 -0
- package/dist/src/linear-cli.d.ts +38 -0
- package/dist/src/linear-cli.d.ts.map +1 -0
- package/dist/src/linear-cli.js +674 -0
- package/dist/src/logger.d.ts +117 -0
- package/dist/src/logger.d.ts.map +1 -0
- package/dist/src/logger.js +430 -0
- package/dist/src/manifest/generate.d.ts +20 -0
- package/dist/src/manifest/generate.d.ts.map +1 -0
- package/dist/src/manifest/generate.js +65 -0
- package/dist/src/manifest/index.d.ts +4 -0
- package/dist/src/manifest/index.d.ts.map +1 -0
- package/dist/src/manifest/index.js +2 -0
- package/dist/src/manifest/route-manifest.d.ts +34 -0
- package/dist/src/manifest/route-manifest.d.ts.map +1 -0
- package/dist/src/manifest/route-manifest.js +148 -0
- package/dist/src/orchestrator/activity-emitter.d.ts +119 -0
- package/dist/src/orchestrator/activity-emitter.d.ts.map +1 -0
- package/dist/src/orchestrator/activity-emitter.js +306 -0
- package/dist/src/orchestrator/api-activity-emitter.d.ts +167 -0
- package/dist/src/orchestrator/api-activity-emitter.d.ts.map +1 -0
- package/dist/src/orchestrator/api-activity-emitter.js +417 -0
- package/dist/src/orchestrator/heartbeat-writer.d.ts +57 -0
- package/dist/src/orchestrator/heartbeat-writer.d.ts.map +1 -0
- package/dist/src/orchestrator/heartbeat-writer.js +137 -0
- package/dist/src/orchestrator/index.d.ts +20 -0
- package/dist/src/orchestrator/index.d.ts.map +1 -0
- package/dist/src/orchestrator/index.js +22 -0
- package/dist/src/orchestrator/log-analyzer.d.ts +160 -0
- package/dist/src/orchestrator/log-analyzer.d.ts.map +1 -0
- package/dist/src/orchestrator/log-analyzer.js +572 -0
- package/dist/src/orchestrator/log-config.d.ts +39 -0
- package/dist/src/orchestrator/log-config.d.ts.map +1 -0
- package/dist/src/orchestrator/log-config.js +45 -0
- package/dist/src/orchestrator/orchestrator.d.ts +316 -0
- package/dist/src/orchestrator/orchestrator.d.ts.map +1 -0
- package/dist/src/orchestrator/orchestrator.js +3290 -0
- package/dist/src/orchestrator/parse-work-result.d.ts +16 -0
- package/dist/src/orchestrator/parse-work-result.d.ts.map +1 -0
- package/dist/src/orchestrator/parse-work-result.js +135 -0
- package/dist/src/orchestrator/parse-work-result.test.d.ts +2 -0
- package/dist/src/orchestrator/parse-work-result.test.d.ts.map +1 -0
- package/dist/src/orchestrator/parse-work-result.test.js +234 -0
- package/dist/src/orchestrator/progress-logger.d.ts +72 -0
- package/dist/src/orchestrator/progress-logger.d.ts.map +1 -0
- package/dist/src/orchestrator/progress-logger.js +135 -0
- package/dist/src/orchestrator/session-logger.d.ts +159 -0
- package/dist/src/orchestrator/session-logger.d.ts.map +1 -0
- package/dist/src/orchestrator/session-logger.js +275 -0
- package/dist/src/orchestrator/state-recovery.d.ts +96 -0
- package/dist/src/orchestrator/state-recovery.d.ts.map +1 -0
- package/dist/src/orchestrator/state-recovery.js +302 -0
- package/dist/src/orchestrator/state-types.d.ts +165 -0
- package/dist/src/orchestrator/state-types.d.ts.map +1 -0
- package/dist/src/orchestrator/state-types.js +7 -0
- package/dist/src/orchestrator/stream-parser.d.ts +151 -0
- package/dist/src/orchestrator/stream-parser.d.ts.map +1 -0
- package/dist/src/orchestrator/stream-parser.js +137 -0
- package/dist/src/orchestrator/types.d.ts +232 -0
- package/dist/src/orchestrator/types.d.ts.map +1 -0
- package/dist/src/orchestrator/types.js +4 -0
- package/dist/src/orchestrator/validate-git-remote.test.d.ts +2 -0
- package/dist/src/orchestrator/validate-git-remote.test.d.ts.map +1 -0
- package/dist/src/orchestrator/validate-git-remote.test.js +61 -0
- package/dist/src/providers/a2a-auth.d.ts +81 -0
- package/dist/src/providers/a2a-auth.d.ts.map +1 -0
- package/dist/src/providers/a2a-auth.js +188 -0
- package/dist/src/providers/a2a-auth.test.d.ts +2 -0
- package/dist/src/providers/a2a-auth.test.d.ts.map +1 -0
- package/dist/src/providers/a2a-auth.test.js +232 -0
- package/dist/src/providers/a2a-provider.d.ts +254 -0
- package/dist/src/providers/a2a-provider.d.ts.map +1 -0
- package/dist/src/providers/a2a-provider.integration.test.d.ts +9 -0
- package/dist/src/providers/a2a-provider.integration.test.d.ts.map +1 -0
- package/dist/src/providers/a2a-provider.integration.test.js +665 -0
- package/dist/src/providers/a2a-provider.js +811 -0
- package/dist/src/providers/a2a-provider.test.d.ts +2 -0
- package/dist/src/providers/a2a-provider.test.d.ts.map +1 -0
- package/dist/src/providers/a2a-provider.test.js +681 -0
- package/dist/src/providers/amp-provider.d.ts +20 -0
- package/dist/src/providers/amp-provider.d.ts.map +1 -0
- package/dist/src/providers/amp-provider.js +24 -0
- package/dist/src/providers/claude-provider.d.ts +18 -0
- package/dist/src/providers/claude-provider.d.ts.map +1 -0
- package/dist/src/providers/claude-provider.js +437 -0
- package/dist/src/providers/codex-provider.d.ts +133 -0
- package/dist/src/providers/codex-provider.d.ts.map +1 -0
- package/dist/src/providers/codex-provider.js +381 -0
- package/dist/src/providers/codex-provider.test.d.ts +2 -0
- package/dist/src/providers/codex-provider.test.d.ts.map +1 -0
- package/dist/src/providers/codex-provider.test.js +387 -0
- package/dist/src/providers/index.d.ts +44 -0
- package/dist/src/providers/index.d.ts.map +1 -0
- package/dist/src/providers/index.js +85 -0
- package/dist/src/providers/spring-ai-provider.d.ts +90 -0
- package/dist/src/providers/spring-ai-provider.d.ts.map +1 -0
- package/dist/src/providers/spring-ai-provider.integration.test.d.ts +13 -0
- package/dist/src/providers/spring-ai-provider.integration.test.d.ts.map +1 -0
- package/dist/src/providers/spring-ai-provider.integration.test.js +351 -0
- package/dist/src/providers/spring-ai-provider.js +317 -0
- package/dist/src/providers/spring-ai-provider.test.d.ts +2 -0
- package/dist/src/providers/spring-ai-provider.test.d.ts.map +1 -0
- package/dist/src/providers/spring-ai-provider.test.js +200 -0
- package/dist/src/providers/types.d.ts +165 -0
- package/dist/src/providers/types.d.ts.map +1 -0
- package/dist/src/providers/types.js +13 -0
- package/dist/src/templates/adapters.d.ts +51 -0
- package/dist/src/templates/adapters.d.ts.map +1 -0
- package/dist/src/templates/adapters.js +104 -0
- package/dist/src/templates/adapters.test.d.ts +2 -0
- package/dist/src/templates/adapters.test.d.ts.map +1 -0
- package/dist/src/templates/adapters.test.js +165 -0
- package/dist/src/templates/agent-definition.d.ts +85 -0
- package/dist/src/templates/agent-definition.d.ts.map +1 -0
- package/dist/src/templates/agent-definition.js +97 -0
- package/dist/src/templates/agent-definition.test.d.ts +2 -0
- package/dist/src/templates/agent-definition.test.d.ts.map +1 -0
- package/dist/src/templates/agent-definition.test.js +209 -0
- package/dist/src/templates/index.d.ts +14 -0
- package/dist/src/templates/index.d.ts.map +1 -0
- package/dist/src/templates/index.js +11 -0
- package/dist/src/templates/loader.d.ts +41 -0
- package/dist/src/templates/loader.d.ts.map +1 -0
- package/dist/src/templates/loader.js +114 -0
- package/dist/src/templates/registry.d.ts +80 -0
- package/dist/src/templates/registry.d.ts.map +1 -0
- package/dist/src/templates/registry.js +177 -0
- package/dist/src/templates/registry.test.d.ts +2 -0
- package/dist/src/templates/registry.test.d.ts.map +1 -0
- package/dist/src/templates/registry.test.js +198 -0
- package/dist/src/templates/renderer.d.ts +29 -0
- package/dist/src/templates/renderer.d.ts.map +1 -0
- package/dist/src/templates/renderer.js +35 -0
- package/dist/src/templates/strategy-templates.test.d.ts +2 -0
- package/dist/src/templates/strategy-templates.test.d.ts.map +1 -0
- package/dist/src/templates/strategy-templates.test.js +619 -0
- package/dist/src/templates/types.d.ts +233 -0
- package/dist/src/templates/types.d.ts.map +1 -0
- package/dist/src/templates/types.js +127 -0
- package/dist/src/templates/types.test.d.ts +2 -0
- package/dist/src/templates/types.test.d.ts.map +1 -0
- package/dist/src/templates/types.test.js +232 -0
- package/dist/src/tools/index.d.ts +6 -0
- package/dist/src/tools/index.d.ts.map +1 -0
- package/dist/src/tools/index.js +3 -0
- package/dist/src/tools/linear-runner.d.ts +34 -0
- package/dist/src/tools/linear-runner.d.ts.map +1 -0
- package/dist/src/tools/linear-runner.js +700 -0
- package/dist/src/tools/plugins/linear.d.ts +9 -0
- package/dist/src/tools/plugins/linear.d.ts.map +1 -0
- package/dist/src/tools/plugins/linear.js +138 -0
- package/dist/src/tools/registry.d.ts +9 -0
- package/dist/src/tools/registry.d.ts.map +1 -0
- package/dist/src/tools/registry.js +18 -0
- package/dist/src/tools/types.d.ts +18 -0
- package/dist/src/tools/types.d.ts.map +1 -0
- package/dist/src/tools/types.js +1 -0
- package/package.json +78 -0
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Heartbeat Writer
|
|
3
|
+
*
|
|
4
|
+
* Periodically writes heartbeat state to the .agent/ directory.
|
|
5
|
+
* Uses atomic writes (temp file + rename) to prevent corruption.
|
|
6
|
+
*/
|
|
7
|
+
import { writeFileSync, renameSync, existsSync, mkdirSync } from 'fs';
|
|
8
|
+
import { resolve, dirname } from 'path';
|
|
9
|
+
// Default heartbeat interval: 10 seconds
|
|
10
|
+
const DEFAULT_HEARTBEAT_INTERVAL_MS = 10000;
|
|
11
|
+
/**
|
|
12
|
+
* HeartbeatWriter periodically writes heartbeat state to enable crash detection
|
|
13
|
+
*/
|
|
14
|
+
export class HeartbeatWriter {
|
|
15
|
+
config;
|
|
16
|
+
heartbeatPath;
|
|
17
|
+
intervalHandle = null;
|
|
18
|
+
lastActivityType = 'idle';
|
|
19
|
+
lastActivityTimestamp;
|
|
20
|
+
toolCallsCount = 0;
|
|
21
|
+
currentOperation = null;
|
|
22
|
+
stopped = false;
|
|
23
|
+
constructor(config) {
|
|
24
|
+
this.config = {
|
|
25
|
+
...config,
|
|
26
|
+
intervalMs: config.intervalMs ?? DEFAULT_HEARTBEAT_INTERVAL_MS,
|
|
27
|
+
};
|
|
28
|
+
this.heartbeatPath = resolve(this.config.agentDir, 'heartbeat.json');
|
|
29
|
+
this.lastActivityTimestamp = Date.now();
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Start the heartbeat writer
|
|
33
|
+
* Immediately writes the first heartbeat, then starts the interval
|
|
34
|
+
*/
|
|
35
|
+
start() {
|
|
36
|
+
if (this.stopped) {
|
|
37
|
+
throw new Error('HeartbeatWriter has been stopped and cannot be restarted');
|
|
38
|
+
}
|
|
39
|
+
if (this.intervalHandle) {
|
|
40
|
+
return; // Already running
|
|
41
|
+
}
|
|
42
|
+
// Ensure the directory exists
|
|
43
|
+
const dir = dirname(this.heartbeatPath);
|
|
44
|
+
if (!existsSync(dir)) {
|
|
45
|
+
mkdirSync(dir, { recursive: true });
|
|
46
|
+
}
|
|
47
|
+
// Write initial heartbeat
|
|
48
|
+
this.writeHeartbeat();
|
|
49
|
+
// Start interval
|
|
50
|
+
this.intervalHandle = setInterval(() => {
|
|
51
|
+
this.writeHeartbeat();
|
|
52
|
+
}, this.config.intervalMs);
|
|
53
|
+
// Don't prevent the process from exiting
|
|
54
|
+
this.intervalHandle.unref();
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Stop the heartbeat writer
|
|
58
|
+
* Should be called when the agent exits
|
|
59
|
+
*/
|
|
60
|
+
stop() {
|
|
61
|
+
this.stopped = true;
|
|
62
|
+
if (this.intervalHandle) {
|
|
63
|
+
clearInterval(this.intervalHandle);
|
|
64
|
+
this.intervalHandle = null;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Update the last activity type
|
|
69
|
+
* Call this when the agent does something
|
|
70
|
+
*/
|
|
71
|
+
updateActivity(type, operation) {
|
|
72
|
+
this.lastActivityType = type;
|
|
73
|
+
this.lastActivityTimestamp = Date.now();
|
|
74
|
+
this.currentOperation = operation ?? null;
|
|
75
|
+
if (type === 'tool_use') {
|
|
76
|
+
this.toolCallsCount++;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Record a tool call
|
|
81
|
+
*/
|
|
82
|
+
recordToolCall(toolName) {
|
|
83
|
+
this.updateActivity('tool_use', toolName);
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Record thinking activity
|
|
87
|
+
*/
|
|
88
|
+
recordThinking() {
|
|
89
|
+
this.updateActivity('thinking');
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Write the heartbeat file atomically
|
|
93
|
+
*/
|
|
94
|
+
writeHeartbeat() {
|
|
95
|
+
const memoryUsage = process.memoryUsage();
|
|
96
|
+
const now = Date.now();
|
|
97
|
+
const state = {
|
|
98
|
+
timestamp: now,
|
|
99
|
+
pid: this.config.pid,
|
|
100
|
+
memoryUsageMB: Math.round(memoryUsage.heapUsed / 1024 / 1024),
|
|
101
|
+
uptime: Math.floor((now - this.config.startTime) / 1000),
|
|
102
|
+
lastActivityType: this.lastActivityType,
|
|
103
|
+
lastActivityTimestamp: this.lastActivityTimestamp,
|
|
104
|
+
toolCallsCount: this.toolCallsCount,
|
|
105
|
+
currentOperation: this.currentOperation,
|
|
106
|
+
};
|
|
107
|
+
// Write atomically: temp file then rename
|
|
108
|
+
const tempPath = `${this.heartbeatPath}.tmp`;
|
|
109
|
+
try {
|
|
110
|
+
writeFileSync(tempPath, JSON.stringify(state, null, 2));
|
|
111
|
+
renameSync(tempPath, this.heartbeatPath);
|
|
112
|
+
}
|
|
113
|
+
catch (error) {
|
|
114
|
+
// Silently ignore write errors - heartbeat is best-effort
|
|
115
|
+
// The file might be locked or the directory might have been removed
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Create a heartbeat writer for an agent
|
|
121
|
+
*/
|
|
122
|
+
export function createHeartbeatWriter(config) {
|
|
123
|
+
return new HeartbeatWriter(config);
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Parse environment variable for heartbeat interval
|
|
127
|
+
*/
|
|
128
|
+
export function getHeartbeatIntervalFromEnv() {
|
|
129
|
+
const envValue = process.env.AGENT_HEARTBEAT_INTERVAL_MS;
|
|
130
|
+
if (envValue) {
|
|
131
|
+
const parsed = parseInt(envValue, 10);
|
|
132
|
+
if (!isNaN(parsed) && parsed > 0) {
|
|
133
|
+
return parsed;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
return DEFAULT_HEARTBEAT_INTERVAL_MS;
|
|
137
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export type { OrchestratorConfig, OrchestratorIssue, AgentProcess, OrchestratorEvents, SpawnAgentOptions, OrchestratorResult, OrchestratorStreamConfig, StopAgentResult, ForwardPromptResult, InjectMessageResult, SpawnAgentWithResumeOptions, WorkTypeTimeoutConfig, AgentWorkResult, } from './types.js';
|
|
2
|
+
export type { ClaudeStreamEvent, ClaudeInitEvent, ClaudeSystemEvent, ClaudeAssistantEvent, ClaudeToolUseEvent, ClaudeToolResultEvent, ClaudeResultEvent, ClaudeErrorEvent, ClaudeTodoItem, ClaudeUserEvent, ClaudeEvent, ClaudeStreamHandlers, } from './stream-parser.js';
|
|
3
|
+
export type { ActivityEmitterConfig } from './activity-emitter.js';
|
|
4
|
+
export type { ApiActivityEmitterConfig, ProgressMilestone } from './api-activity-emitter.js';
|
|
5
|
+
export type { WorktreeState, WorktreeStatus, HeartbeatState, HeartbeatActivityType, TodosState, TodoItem, TodoStatus, ProgressLogEntry, ProgressEventType, RecoveryCheckResult, HeartbeatWriterConfig, ProgressLoggerConfig, } from './state-types.js';
|
|
6
|
+
export type { LogAnalysisConfig } from './log-config.js';
|
|
7
|
+
export type { SessionEventType, SessionEvent, SessionMetadata, SessionLoggerConfig, } from './session-logger.js';
|
|
8
|
+
export type { PatternType, PatternSeverity, AnalyzedPattern, AnalysisResult, SuggestedIssue, TrackedIssue, DeduplicationStore, } from './log-analyzer.js';
|
|
9
|
+
export { AgentOrchestrator, createOrchestrator, getWorktreeIdentifier, validateGitRemote } from './orchestrator.js';
|
|
10
|
+
export { ClaudeStreamParser, createStreamParser } from './stream-parser.js';
|
|
11
|
+
export { ActivityEmitter, createActivityEmitter } from './activity-emitter.js';
|
|
12
|
+
export { ApiActivityEmitter, createApiActivityEmitter } from './api-activity-emitter.js';
|
|
13
|
+
export { HeartbeatWriter, createHeartbeatWriter, getHeartbeatIntervalFromEnv, } from './heartbeat-writer.js';
|
|
14
|
+
export { ProgressLogger, createProgressLogger } from './progress-logger.js';
|
|
15
|
+
export { getAgentDir, getStatePath, getHeartbeatPath, getTodosPath, isHeartbeatFresh, readWorktreeState, readHeartbeat, readTodos, checkRecovery, initializeAgentDir, writeState, updateState, writeTodos, createInitialState, buildRecoveryPrompt, getHeartbeatTimeoutFromEnv, getMaxRecoveryAttemptsFromEnv, getTaskListId, } from './state-recovery.js';
|
|
16
|
+
export { getLogAnalysisConfig, isSessionLoggingEnabled, isAutoAnalyzeEnabled, } from './log-config.js';
|
|
17
|
+
export { SessionLogger, createSessionLogger, readSessionMetadata, readSessionEvents, } from './session-logger.js';
|
|
18
|
+
export { parseWorkResult } from './parse-work-result.js';
|
|
19
|
+
export { LogAnalyzer, createLogAnalyzer } from './log-analyzer.js';
|
|
20
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/orchestrator/index.ts"],"names":[],"mappings":"AACA,YAAY,EACV,kBAAkB,EAClB,iBAAiB,EACjB,YAAY,EACZ,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,wBAAwB,EACxB,eAAe,EACf,mBAAmB,EACnB,mBAAmB,EACnB,2BAA2B,EAC3B,qBAAqB,EACrB,eAAe,GAChB,MAAM,YAAY,CAAA;AAGnB,YAAY,EACV,iBAAiB,EACjB,eAAe,EACf,iBAAiB,EACjB,oBAAoB,EACpB,kBAAkB,EAClB,qBAAqB,EACrB,iBAAiB,EACjB,gBAAgB,EAChB,cAAc,EACd,eAAe,EACf,WAAW,EACX,oBAAoB,GACrB,MAAM,oBAAoB,CAAA;AAG3B,YAAY,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAA;AAGlE,YAAY,EAAE,wBAAwB,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;AAG5F,YAAY,EACV,aAAa,EACb,cAAc,EACd,cAAc,EACd,qBAAqB,EACrB,UAAU,EACV,QAAQ,EACR,UAAU,EACV,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACnB,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,kBAAkB,CAAA;AAGzB,YAAY,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AAGxD,YAAY,EACV,gBAAgB,EAChB,YAAY,EACZ,eAAe,EACf,mBAAmB,GACpB,MAAM,qBAAqB,CAAA;AAG5B,YAAY,EACV,WAAW,EACX,eAAe,EACf,eAAe,EACf,cAAc,EACd,cAAc,EACd,YAAY,EACZ,kBAAkB,GACnB,MAAM,mBAAmB,CAAA;AAG1B,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAGnH,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AAG3E,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAA;AAG9E,OAAO,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAA;AAGxF,OAAO,EACL,eAAe,EACf,qBAAqB,EACrB,2BAA2B,GAC5B,MAAM,uBAAuB,CAAA;AAG9B,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAA;AAG3E,OAAO,EACL,WAAW,EACX,YAAY,EACZ,gBAAgB,EAChB,YAAY,EACZ,gBAAgB,EAChB,iBAAiB,EACjB,aAAa,EACb,SAAS,EACT,aAAa,EACb,kBAAkB,EAClB,UAAU,EACV,WAAW,EACX,UAAU,EACV,kBAAkB,EAClB,mBAAmB,EACnB,0BAA0B,EAC1B,6BAA6B,EAC7B,aAAa,GACd,MAAM,qBAAqB,CAAA;AAG5B,OAAO,EACL,oBAAoB,EACpB,uBAAuB,EACvB,oBAAoB,GACrB,MAAM,iBAAiB,CAAA;AAGxB,OAAO,EACL,aAAa,EACb,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,qBAAqB,CAAA;AAG5B,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAGxD,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
// Orchestrator
|
|
2
|
+
export { AgentOrchestrator, createOrchestrator, getWorktreeIdentifier, validateGitRemote } from './orchestrator.js';
|
|
3
|
+
// Stream Parser
|
|
4
|
+
export { ClaudeStreamParser, createStreamParser } from './stream-parser.js';
|
|
5
|
+
// Activity Emitter
|
|
6
|
+
export { ActivityEmitter, createActivityEmitter } from './activity-emitter.js';
|
|
7
|
+
// API Activity Emitter (for remote workers proxying through API)
|
|
8
|
+
export { ApiActivityEmitter, createApiActivityEmitter } from './api-activity-emitter.js';
|
|
9
|
+
// Heartbeat Writer (for crash detection)
|
|
10
|
+
export { HeartbeatWriter, createHeartbeatWriter, getHeartbeatIntervalFromEnv, } from './heartbeat-writer.js';
|
|
11
|
+
// Progress Logger (for debugging)
|
|
12
|
+
export { ProgressLogger, createProgressLogger } from './progress-logger.js';
|
|
13
|
+
// State Recovery (for crash recovery)
|
|
14
|
+
export { getAgentDir, getStatePath, getHeartbeatPath, getTodosPath, isHeartbeatFresh, readWorktreeState, readHeartbeat, readTodos, checkRecovery, initializeAgentDir, writeState, updateState, writeTodos, createInitialState, buildRecoveryPrompt, getHeartbeatTimeoutFromEnv, getMaxRecoveryAttemptsFromEnv, getTaskListId, } from './state-recovery.js';
|
|
15
|
+
// Log Config
|
|
16
|
+
export { getLogAnalysisConfig, isSessionLoggingEnabled, isAutoAnalyzeEnabled, } from './log-config.js';
|
|
17
|
+
// Session Logger
|
|
18
|
+
export { SessionLogger, createSessionLogger, readSessionMetadata, readSessionEvents, } from './session-logger.js';
|
|
19
|
+
// Work Result Parser (for QA/acceptance pass/fail detection)
|
|
20
|
+
export { parseWorkResult } from './parse-work-result.js';
|
|
21
|
+
// Log Analyzer
|
|
22
|
+
export { LogAnalyzer, createLogAnalyzer } from './log-analyzer.js';
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Log Analyzer
|
|
3
|
+
*
|
|
4
|
+
* Analyzes session logs for errors and improvement opportunities.
|
|
5
|
+
* Can automatically create deduplicated Linear issues.
|
|
6
|
+
*/
|
|
7
|
+
import { type SessionMetadata } from './session-logger.js';
|
|
8
|
+
import { type LogAnalysisConfig } from './log-config.js';
|
|
9
|
+
/**
|
|
10
|
+
* Pattern types for categorization
|
|
11
|
+
*/
|
|
12
|
+
export type PatternType = 'permission' | 'tool_issue' | 'tool_misuse' | 'performance' | 'repeated_failure' | 'approval_required';
|
|
13
|
+
/**
|
|
14
|
+
* Severity levels for patterns
|
|
15
|
+
*/
|
|
16
|
+
export type PatternSeverity = 'low' | 'medium' | 'high' | 'critical';
|
|
17
|
+
/**
|
|
18
|
+
* An analyzed pattern/issue from session logs
|
|
19
|
+
*/
|
|
20
|
+
export interface AnalyzedPattern {
|
|
21
|
+
/** Type of pattern */
|
|
22
|
+
type: PatternType;
|
|
23
|
+
/** Severity level */
|
|
24
|
+
severity: PatternSeverity;
|
|
25
|
+
/** Short title for the issue */
|
|
26
|
+
title: string;
|
|
27
|
+
/** Detailed description */
|
|
28
|
+
description: string;
|
|
29
|
+
/** Example error messages */
|
|
30
|
+
examples: string[];
|
|
31
|
+
/** How many times this occurred */
|
|
32
|
+
occurrences: number;
|
|
33
|
+
/** Related tool (if applicable) */
|
|
34
|
+
tool?: string;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Result of analyzing a session
|
|
38
|
+
*/
|
|
39
|
+
export interface AnalysisResult {
|
|
40
|
+
/** Session ID that was analyzed */
|
|
41
|
+
sessionId: string;
|
|
42
|
+
/** Session metadata */
|
|
43
|
+
metadata: SessionMetadata;
|
|
44
|
+
/** Detected patterns */
|
|
45
|
+
patterns: AnalyzedPattern[];
|
|
46
|
+
/** Total events analyzed */
|
|
47
|
+
eventsAnalyzed: number;
|
|
48
|
+
/** Total errors found */
|
|
49
|
+
errorsFound: number;
|
|
50
|
+
/** Suggested issues to create */
|
|
51
|
+
suggestedIssues: SuggestedIssue[];
|
|
52
|
+
/** Unix timestamp of analysis */
|
|
53
|
+
analyzedAt: number;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* A suggested issue to create in Linear
|
|
57
|
+
*/
|
|
58
|
+
export interface SuggestedIssue {
|
|
59
|
+
/** Deterministic signature for deduplication */
|
|
60
|
+
signature: string;
|
|
61
|
+
/** Issue title */
|
|
62
|
+
title: string;
|
|
63
|
+
/** Issue description (markdown) */
|
|
64
|
+
description: string;
|
|
65
|
+
/** Work type (Bug, Feature, Chore) */
|
|
66
|
+
workType: 'Bug' | 'Feature' | 'Chore';
|
|
67
|
+
/** Labels to apply */
|
|
68
|
+
labels: string[];
|
|
69
|
+
/** Source patterns that led to this suggestion */
|
|
70
|
+
sourcePatterns: PatternType[];
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Tracked issue in the deduplication store
|
|
74
|
+
*/
|
|
75
|
+
export interface TrackedIssue {
|
|
76
|
+
/** Linear issue ID (UUID) */
|
|
77
|
+
linearIssueId: string;
|
|
78
|
+
/** Human-readable identifier (e.g., SUP-123) */
|
|
79
|
+
linearIdentifier: string;
|
|
80
|
+
/** Unix timestamp when first created */
|
|
81
|
+
createdAt: number;
|
|
82
|
+
/** Unix timestamp when last seen */
|
|
83
|
+
lastSeenAt: number;
|
|
84
|
+
/** How many sessions have had this issue */
|
|
85
|
+
sessionCount: number;
|
|
86
|
+
/** Session IDs that had this issue */
|
|
87
|
+
sessionIds: string[];
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Deduplication store structure
|
|
91
|
+
*/
|
|
92
|
+
export interface DeduplicationStore {
|
|
93
|
+
issues: Record<string, TrackedIssue>;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* LogAnalyzer class for analyzing session logs
|
|
97
|
+
*/
|
|
98
|
+
export declare class LogAnalyzer {
|
|
99
|
+
private readonly config;
|
|
100
|
+
private readonly sessionsDir;
|
|
101
|
+
private readonly processedDir;
|
|
102
|
+
private readonly analysisDir;
|
|
103
|
+
private readonly deduplicationPath;
|
|
104
|
+
private linearClient?;
|
|
105
|
+
constructor(config?: Partial<LogAnalysisConfig>);
|
|
106
|
+
/**
|
|
107
|
+
* Initialize directories and Linear client
|
|
108
|
+
*/
|
|
109
|
+
initialize(linearApiKey?: string): void;
|
|
110
|
+
/**
|
|
111
|
+
* Get list of session IDs that haven't been analyzed yet
|
|
112
|
+
*/
|
|
113
|
+
getUnprocessedSessions(): string[];
|
|
114
|
+
/**
|
|
115
|
+
* Analyze a single session
|
|
116
|
+
*/
|
|
117
|
+
analyzeSession(sessionId: string): AnalysisResult | null;
|
|
118
|
+
/**
|
|
119
|
+
* Detect patterns in events
|
|
120
|
+
*/
|
|
121
|
+
private detectPatterns;
|
|
122
|
+
/**
|
|
123
|
+
* Detect repeated failures (same error 3+ times)
|
|
124
|
+
*/
|
|
125
|
+
private detectRepeatedFailures;
|
|
126
|
+
/**
|
|
127
|
+
* Generate suggested issues from patterns
|
|
128
|
+
*/
|
|
129
|
+
private generateSuggestedIssues;
|
|
130
|
+
/**
|
|
131
|
+
* Mark a session as processed
|
|
132
|
+
*/
|
|
133
|
+
markProcessed(sessionId: string, result: AnalysisResult): void;
|
|
134
|
+
/**
|
|
135
|
+
* Load the deduplication store
|
|
136
|
+
*/
|
|
137
|
+
loadDeduplicationStore(): DeduplicationStore;
|
|
138
|
+
/**
|
|
139
|
+
* Save the deduplication store
|
|
140
|
+
*/
|
|
141
|
+
saveDeduplicationStore(store: DeduplicationStore): void;
|
|
142
|
+
/**
|
|
143
|
+
* Create or update issues in Linear
|
|
144
|
+
* Returns created/updated issue identifiers
|
|
145
|
+
*/
|
|
146
|
+
createIssues(suggestions: SuggestedIssue[], sessionId: string, dryRun?: boolean): Promise<Array<{
|
|
147
|
+
signature: string;
|
|
148
|
+
identifier: string;
|
|
149
|
+
created: boolean;
|
|
150
|
+
}>>;
|
|
151
|
+
/**
|
|
152
|
+
* Cleanup old logs based on retention policy
|
|
153
|
+
*/
|
|
154
|
+
cleanupOldLogs(): number;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Create and initialize a log analyzer
|
|
158
|
+
*/
|
|
159
|
+
export declare function createLogAnalyzer(config?: Partial<LogAnalysisConfig>, linearApiKey?: string): LogAnalyzer;
|
|
160
|
+
//# sourceMappingURL=log-analyzer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log-analyzer.d.ts","sourceRoot":"","sources":["../../../src/orchestrator/log-analyzer.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAoBH,OAAO,EAGL,KAAK,eAAe,EAErB,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAwB,KAAK,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AAE9E;;GAEG;AACH,MAAM,MAAM,WAAW,GACnB,YAAY,GACZ,YAAY,GACZ,aAAa,GACb,aAAa,GACb,kBAAkB,GAClB,mBAAmB,CAAA;AAEvB;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAA;AAEpE;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,sBAAsB;IACtB,IAAI,EAAE,WAAW,CAAA;IACjB,qBAAqB;IACrB,QAAQ,EAAE,eAAe,CAAA;IACzB,gCAAgC;IAChC,KAAK,EAAE,MAAM,CAAA;IACb,2BAA2B;IAC3B,WAAW,EAAE,MAAM,CAAA;IACnB,6BAA6B;IAC7B,QAAQ,EAAE,MAAM,EAAE,CAAA;IAClB,mCAAmC;IACnC,WAAW,EAAE,MAAM,CAAA;IACnB,mCAAmC;IACnC,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,mCAAmC;IACnC,SAAS,EAAE,MAAM,CAAA;IACjB,uBAAuB;IACvB,QAAQ,EAAE,eAAe,CAAA;IACzB,wBAAwB;IACxB,QAAQ,EAAE,eAAe,EAAE,CAAA;IAC3B,4BAA4B;IAC5B,cAAc,EAAE,MAAM,CAAA;IACtB,yBAAyB;IACzB,WAAW,EAAE,MAAM,CAAA;IACnB,iCAAiC;IACjC,eAAe,EAAE,cAAc,EAAE,CAAA;IACjC,iCAAiC;IACjC,UAAU,EAAE,MAAM,CAAA;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,gDAAgD;IAChD,SAAS,EAAE,MAAM,CAAA;IACjB,kBAAkB;IAClB,KAAK,EAAE,MAAM,CAAA;IACb,mCAAmC;IACnC,WAAW,EAAE,MAAM,CAAA;IACnB,sCAAsC;IACtC,QAAQ,EAAE,KAAK,GAAG,SAAS,GAAG,OAAO,CAAA;IACrC,sBAAsB;IACtB,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,kDAAkD;IAClD,cAAc,EAAE,WAAW,EAAE,CAAA;CAC9B;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,6BAA6B;IAC7B,aAAa,EAAE,MAAM,CAAA;IACrB,gDAAgD;IAChD,gBAAgB,EAAE,MAAM,CAAA;IACxB,wCAAwC;IACxC,SAAS,EAAE,MAAM,CAAA;IACjB,oCAAoC;IACpC,UAAU,EAAE,MAAM,CAAA;IAClB,4CAA4C;IAC5C,YAAY,EAAE,MAAM,CAAA;IACpB,sCAAsC;IACtC,UAAU,EAAE,MAAM,EAAE,CAAA;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAA;CACrC;AA4JD;;GAEG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmB;IAC1C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAQ;IACpC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAQ;IACrC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAQ;IACpC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAQ;IAC1C,OAAO,CAAC,YAAY,CAAC,CAAmB;gBAE5B,MAAM,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC;IAQ/C;;OAEG;IACH,UAAU,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI;IAevC;;OAEG;IACH,sBAAsB,IAAI,MAAM,EAAE;IA2BlC;;OAEG;IACH,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI;IAqCxD;;OAEG;IACH,OAAO,CAAC,cAAc;IAsCtB;;OAEG;IACH,OAAO,CAAC,sBAAsB;IA6C9B;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAwF/B;;OAEG;IACH,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,GAAG,IAAI;IAK9D;;OAEG;IACH,sBAAsB,IAAI,kBAAkB;IAY5C;;OAEG;IACH,sBAAsB,CAAC,KAAK,EAAE,kBAAkB,GAAG,IAAI;IAIvD;;;OAGG;IACG,YAAY,CAChB,WAAW,EAAE,cAAc,EAAE,EAC7B,SAAS,EAAE,MAAM,EACjB,MAAM,UAAQ,GACb,OAAO,CAAC,KAAK,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IA2F9E;;OAEG;IACH,cAAc,IAAI,MAAM;CA8CzB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,EACnC,YAAY,CAAC,EAAE,MAAM,GACpB,WAAW,CAIb"}
|