@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,302 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* State Recovery
|
|
3
|
+
*
|
|
4
|
+
* Detects and recovers agent state from the .agent/ directory.
|
|
5
|
+
* Enables crash recovery and duplicate agent prevention.
|
|
6
|
+
*/
|
|
7
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';
|
|
8
|
+
import { resolve } from 'path';
|
|
9
|
+
// Default heartbeat timeout: 30 seconds
|
|
10
|
+
const DEFAULT_HEARTBEAT_TIMEOUT_MS = 30000;
|
|
11
|
+
// Default max recovery attempts
|
|
12
|
+
const DEFAULT_MAX_RECOVERY_ATTEMPTS = 3;
|
|
13
|
+
/**
|
|
14
|
+
* Get the .agent directory path for a worktree
|
|
15
|
+
*/
|
|
16
|
+
export function getAgentDir(worktreePath) {
|
|
17
|
+
return resolve(worktreePath, '.agent');
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Get the path to the state.json file
|
|
21
|
+
*/
|
|
22
|
+
export function getStatePath(worktreePath) {
|
|
23
|
+
return resolve(getAgentDir(worktreePath), 'state.json');
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Get the path to the heartbeat.json file
|
|
27
|
+
*/
|
|
28
|
+
export function getHeartbeatPath(worktreePath) {
|
|
29
|
+
return resolve(getAgentDir(worktreePath), 'heartbeat.json');
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Get the path to the todos.json file
|
|
33
|
+
*/
|
|
34
|
+
export function getTodosPath(worktreePath) {
|
|
35
|
+
return resolve(getAgentDir(worktreePath), 'todos.json');
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Read and parse a JSON file safely
|
|
39
|
+
*/
|
|
40
|
+
function readJsonSafe(path) {
|
|
41
|
+
try {
|
|
42
|
+
if (!existsSync(path))
|
|
43
|
+
return null;
|
|
44
|
+
const content = readFileSync(path, 'utf-8');
|
|
45
|
+
return JSON.parse(content);
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Check if a heartbeat is fresh (agent is alive)
|
|
53
|
+
*/
|
|
54
|
+
export function isHeartbeatFresh(heartbeat, timeoutMs = DEFAULT_HEARTBEAT_TIMEOUT_MS) {
|
|
55
|
+
if (!heartbeat)
|
|
56
|
+
return false;
|
|
57
|
+
const age = Date.now() - heartbeat.timestamp;
|
|
58
|
+
return age < timeoutMs;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Read the current state from a worktree
|
|
62
|
+
*/
|
|
63
|
+
export function readWorktreeState(worktreePath) {
|
|
64
|
+
return readJsonSafe(getStatePath(worktreePath));
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Read the current heartbeat from a worktree
|
|
68
|
+
*/
|
|
69
|
+
export function readHeartbeat(worktreePath) {
|
|
70
|
+
return readJsonSafe(getHeartbeatPath(worktreePath));
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Read the current todos from a worktree
|
|
74
|
+
*/
|
|
75
|
+
export function readTodos(worktreePath) {
|
|
76
|
+
return readJsonSafe(getTodosPath(worktreePath));
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Check if recovery is possible for a worktree
|
|
80
|
+
*/
|
|
81
|
+
export function checkRecovery(worktreePath, options = {}) {
|
|
82
|
+
const heartbeatTimeoutMs = options.heartbeatTimeoutMs ?? DEFAULT_HEARTBEAT_TIMEOUT_MS;
|
|
83
|
+
const maxRecoveryAttempts = options.maxRecoveryAttempts ?? DEFAULT_MAX_RECOVERY_ATTEMPTS;
|
|
84
|
+
const agentDir = getAgentDir(worktreePath);
|
|
85
|
+
// Check if .agent directory exists
|
|
86
|
+
if (!existsSync(agentDir)) {
|
|
87
|
+
return {
|
|
88
|
+
canRecover: false,
|
|
89
|
+
agentAlive: false,
|
|
90
|
+
reason: 'no_state',
|
|
91
|
+
message: 'No .agent directory found in worktree',
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
// Read state
|
|
95
|
+
const state = readWorktreeState(worktreePath);
|
|
96
|
+
if (!state) {
|
|
97
|
+
return {
|
|
98
|
+
canRecover: false,
|
|
99
|
+
agentAlive: false,
|
|
100
|
+
reason: 'no_state',
|
|
101
|
+
message: 'No state.json found in .agent directory',
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
// Validate state
|
|
105
|
+
if (!state.issueId || !state.issueIdentifier) {
|
|
106
|
+
return {
|
|
107
|
+
canRecover: false,
|
|
108
|
+
agentAlive: false,
|
|
109
|
+
state,
|
|
110
|
+
reason: 'invalid_state',
|
|
111
|
+
message: 'State is missing required fields (issueId, issueIdentifier)',
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
// Read heartbeat
|
|
115
|
+
const heartbeat = readHeartbeat(worktreePath);
|
|
116
|
+
// Check if agent is alive
|
|
117
|
+
if (isHeartbeatFresh(heartbeat, heartbeatTimeoutMs)) {
|
|
118
|
+
return {
|
|
119
|
+
canRecover: false,
|
|
120
|
+
agentAlive: true,
|
|
121
|
+
state,
|
|
122
|
+
heartbeat: heartbeat,
|
|
123
|
+
reason: 'agent_alive',
|
|
124
|
+
message: `Agent is still running (PID: ${heartbeat.pid}, last heartbeat: ${new Date(heartbeat.timestamp).toISOString()})`,
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
// Check recovery attempts
|
|
128
|
+
if (state.recoveryAttempts >= maxRecoveryAttempts) {
|
|
129
|
+
return {
|
|
130
|
+
canRecover: false,
|
|
131
|
+
agentAlive: false,
|
|
132
|
+
state,
|
|
133
|
+
heartbeat: heartbeat ?? undefined,
|
|
134
|
+
reason: 'max_attempts',
|
|
135
|
+
message: `Maximum recovery attempts reached (${state.recoveryAttempts}/${maxRecoveryAttempts})`,
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
// Recovery is possible
|
|
139
|
+
const todos = readTodos(worktreePath);
|
|
140
|
+
return {
|
|
141
|
+
canRecover: true,
|
|
142
|
+
agentAlive: false,
|
|
143
|
+
state,
|
|
144
|
+
heartbeat: heartbeat ?? undefined,
|
|
145
|
+
todos: todos ?? undefined,
|
|
146
|
+
message: `Recovery possible (attempt ${state.recoveryAttempts + 1}/${maxRecoveryAttempts})`,
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Initialize the .agent directory for a worktree
|
|
151
|
+
*/
|
|
152
|
+
export function initializeAgentDir(worktreePath) {
|
|
153
|
+
const agentDir = getAgentDir(worktreePath);
|
|
154
|
+
if (!existsSync(agentDir)) {
|
|
155
|
+
mkdirSync(agentDir, { recursive: true });
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Write the state.json file
|
|
160
|
+
*/
|
|
161
|
+
export function writeState(worktreePath, state) {
|
|
162
|
+
const statePath = getStatePath(worktreePath);
|
|
163
|
+
initializeAgentDir(worktreePath);
|
|
164
|
+
writeFileSync(statePath, JSON.stringify(state, null, 2));
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Update specific fields in the state
|
|
168
|
+
*/
|
|
169
|
+
export function updateState(worktreePath, updates) {
|
|
170
|
+
const current = readWorktreeState(worktreePath);
|
|
171
|
+
if (!current)
|
|
172
|
+
return null;
|
|
173
|
+
const updated = {
|
|
174
|
+
...current,
|
|
175
|
+
...updates,
|
|
176
|
+
lastUpdatedAt: Date.now(),
|
|
177
|
+
};
|
|
178
|
+
writeState(worktreePath, updated);
|
|
179
|
+
return updated;
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Write the todos.json file
|
|
183
|
+
*/
|
|
184
|
+
export function writeTodos(worktreePath, todos) {
|
|
185
|
+
const todosPath = getTodosPath(worktreePath);
|
|
186
|
+
initializeAgentDir(worktreePath);
|
|
187
|
+
writeFileSync(todosPath, JSON.stringify(todos, null, 2));
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Create initial state for a new agent
|
|
191
|
+
*/
|
|
192
|
+
export function createInitialState(options) {
|
|
193
|
+
const now = Date.now();
|
|
194
|
+
const taskListId = getTaskListId(options.issueIdentifier, options.workType);
|
|
195
|
+
return {
|
|
196
|
+
issueId: options.issueId,
|
|
197
|
+
issueIdentifier: options.issueIdentifier,
|
|
198
|
+
linearSessionId: options.linearSessionId,
|
|
199
|
+
providerSessionId: null,
|
|
200
|
+
workType: options.workType,
|
|
201
|
+
prompt: options.prompt,
|
|
202
|
+
startedAt: now,
|
|
203
|
+
status: 'initializing',
|
|
204
|
+
currentPhase: null,
|
|
205
|
+
lastUpdatedAt: now,
|
|
206
|
+
recoveryAttempts: 0,
|
|
207
|
+
workerId: options.workerId ?? null,
|
|
208
|
+
pid: options.pid ?? null,
|
|
209
|
+
taskListId,
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Generate the task list ID for a worktree (matches orchestrator format)
|
|
214
|
+
*
|
|
215
|
+
* @param issueIdentifier - Issue identifier (e.g., "SUP-123")
|
|
216
|
+
* @param workType - Work type suffix (e.g., "development" -> "DEV")
|
|
217
|
+
* @returns Task list ID (e.g., "SUP-123-DEV")
|
|
218
|
+
*/
|
|
219
|
+
export function getTaskListId(issueIdentifier, workType) {
|
|
220
|
+
const suffixMap = {
|
|
221
|
+
research: 'RES',
|
|
222
|
+
'backlog-creation': 'BC',
|
|
223
|
+
development: 'DEV',
|
|
224
|
+
inflight: 'INF',
|
|
225
|
+
coordination: 'COORD',
|
|
226
|
+
qa: 'QA',
|
|
227
|
+
acceptance: 'AC',
|
|
228
|
+
refinement: 'REF',
|
|
229
|
+
'refinement-coordination': 'REF-COORD',
|
|
230
|
+
'qa-coordination': 'QA-COORD',
|
|
231
|
+
'acceptance-coordination': 'AC-COORD',
|
|
232
|
+
};
|
|
233
|
+
return `${issueIdentifier}-${suffixMap[workType]}`;
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Build a recovery prompt for resuming crashed work
|
|
237
|
+
*/
|
|
238
|
+
export function buildRecoveryPrompt(state, todos) {
|
|
239
|
+
const lines = [];
|
|
240
|
+
lines.push(`Resume work on ${state.issueIdentifier}.`);
|
|
241
|
+
lines.push('');
|
|
242
|
+
lines.push('RECOVERY CONTEXT:');
|
|
243
|
+
lines.push(`- Previous work type: ${state.workType}`);
|
|
244
|
+
lines.push(`- Last status: ${state.status}`);
|
|
245
|
+
if (state.currentPhase) {
|
|
246
|
+
lines.push(`- Last phase: ${state.currentPhase}`);
|
|
247
|
+
}
|
|
248
|
+
lines.push(`- Recovery attempt: ${state.recoveryAttempts + 1}`);
|
|
249
|
+
// Include task list ID for Claude Code Tasks integration
|
|
250
|
+
const taskListId = getTaskListId(state.issueIdentifier, state.workType);
|
|
251
|
+
lines.push(`- Task list ID: ${taskListId}`);
|
|
252
|
+
lines.push('');
|
|
253
|
+
// Note about Claude Code Tasks persistence
|
|
254
|
+
lines.push('TASK STATE:');
|
|
255
|
+
lines.push(`Your task list is preserved at: ~/.claude/tasks/${taskListId}/`);
|
|
256
|
+
lines.push('Use TaskList to see the current state of pending/completed tasks.');
|
|
257
|
+
lines.push('');
|
|
258
|
+
if (todos && todos.items.length > 0) {
|
|
259
|
+
lines.push('PREVIOUS TODO LIST (legacy):');
|
|
260
|
+
for (const item of todos.items) {
|
|
261
|
+
const statusIcon = item.status === 'completed' ? '\u2713' :
|
|
262
|
+
item.status === 'in_progress' ? '\u2192' : '\u25CB';
|
|
263
|
+
lines.push(` ${statusIcon} [${item.status}] ${item.content}`);
|
|
264
|
+
}
|
|
265
|
+
lines.push('');
|
|
266
|
+
}
|
|
267
|
+
lines.push('INSTRUCTIONS:');
|
|
268
|
+
lines.push('1. Run TaskList to see any pending tasks from the previous session');
|
|
269
|
+
lines.push('2. Check git status to see what has been done');
|
|
270
|
+
lines.push('3. Review the codebase for any partial changes');
|
|
271
|
+
lines.push('4. Continue from where the previous session left off');
|
|
272
|
+
lines.push('5. If work appears complete, verify and create PR if needed');
|
|
273
|
+
lines.push('');
|
|
274
|
+
lines.push(`Original prompt: ${state.prompt}`);
|
|
275
|
+
return lines.join('\n');
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* Parse environment variable for heartbeat timeout
|
|
279
|
+
*/
|
|
280
|
+
export function getHeartbeatTimeoutFromEnv() {
|
|
281
|
+
const envValue = process.env.AGENT_HEARTBEAT_TIMEOUT_MS;
|
|
282
|
+
if (envValue) {
|
|
283
|
+
const parsed = parseInt(envValue, 10);
|
|
284
|
+
if (!isNaN(parsed) && parsed > 0) {
|
|
285
|
+
return parsed;
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
return DEFAULT_HEARTBEAT_TIMEOUT_MS;
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* Parse environment variable for max recovery attempts
|
|
292
|
+
*/
|
|
293
|
+
export function getMaxRecoveryAttemptsFromEnv() {
|
|
294
|
+
const envValue = process.env.AGENT_MAX_RECOVERY_ATTEMPTS;
|
|
295
|
+
if (envValue) {
|
|
296
|
+
const parsed = parseInt(envValue, 10);
|
|
297
|
+
if (!isNaN(parsed) && parsed > 0) {
|
|
298
|
+
return parsed;
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
return DEFAULT_MAX_RECOVERY_ATTEMPTS;
|
|
302
|
+
}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Worktree State Types
|
|
3
|
+
*
|
|
4
|
+
* Types for persisting agent state to the .agent/ directory within each worktree.
|
|
5
|
+
* This enables crash recovery, heartbeat monitoring, and progress tracking.
|
|
6
|
+
*/
|
|
7
|
+
import type { AgentWorkType } from '@renseiai/agentfactory-linear';
|
|
8
|
+
/**
|
|
9
|
+
* Status of the agent's work in the worktree
|
|
10
|
+
*/
|
|
11
|
+
export type WorktreeStatus = 'initializing' | 'running' | 'completing' | 'completed' | 'failed' | 'stopped';
|
|
12
|
+
/**
|
|
13
|
+
* Primary state file for the worktree
|
|
14
|
+
* Stored at: .agent/state.json
|
|
15
|
+
*/
|
|
16
|
+
export interface WorktreeState {
|
|
17
|
+
/** Linear issue ID (UUID) */
|
|
18
|
+
issueId: string;
|
|
19
|
+
/** Human-readable issue identifier (e.g., SUP-123) */
|
|
20
|
+
issueIdentifier: string;
|
|
21
|
+
/** Linear AgentSession ID (if available) */
|
|
22
|
+
linearSessionId: string | null;
|
|
23
|
+
/** Provider CLI session ID for --resume (if available) */
|
|
24
|
+
providerSessionId: string | null;
|
|
25
|
+
/** Type of work being performed */
|
|
26
|
+
workType: AgentWorkType;
|
|
27
|
+
/** The prompt that was given to the agent */
|
|
28
|
+
prompt: string;
|
|
29
|
+
/** Unix timestamp when work started */
|
|
30
|
+
startedAt: number;
|
|
31
|
+
/** Current status of the work */
|
|
32
|
+
status: WorktreeStatus;
|
|
33
|
+
/** Human-readable description of current activity */
|
|
34
|
+
currentPhase: string | null;
|
|
35
|
+
/** Unix timestamp of last state update */
|
|
36
|
+
lastUpdatedAt: number;
|
|
37
|
+
/** Number of times recovery has been attempted */
|
|
38
|
+
recoveryAttempts: number;
|
|
39
|
+
/** Worker ID if running on a remote worker */
|
|
40
|
+
workerId: string | null;
|
|
41
|
+
/** Process ID of the agent */
|
|
42
|
+
pid: number | null;
|
|
43
|
+
/** Error message if status is 'failed' */
|
|
44
|
+
errorMessage?: string;
|
|
45
|
+
/** PR URL if one was created */
|
|
46
|
+
pullRequestUrl?: string;
|
|
47
|
+
/**
|
|
48
|
+
* Claude Code Task List ID for intra-session task coordination
|
|
49
|
+
* Format: {issueIdentifier}-{WORKTYPE} (e.g., "SUP-123-DEV")
|
|
50
|
+
* Enables task persistence across crashes and subagent coordination
|
|
51
|
+
*/
|
|
52
|
+
taskListId?: string;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Activity type for heartbeat tracking
|
|
56
|
+
*/
|
|
57
|
+
export type HeartbeatActivityType = 'tool_use' | 'thinking' | 'waiting' | 'idle';
|
|
58
|
+
/**
|
|
59
|
+
* Heartbeat state file for liveness detection
|
|
60
|
+
* Stored at: .agent/heartbeat.json
|
|
61
|
+
* Updated every 10 seconds while the agent is running
|
|
62
|
+
*/
|
|
63
|
+
export interface HeartbeatState {
|
|
64
|
+
/** Unix timestamp of this heartbeat */
|
|
65
|
+
timestamp: number;
|
|
66
|
+
/** Process ID of the agent */
|
|
67
|
+
pid: number;
|
|
68
|
+
/** Memory usage in megabytes */
|
|
69
|
+
memoryUsageMB: number;
|
|
70
|
+
/** Uptime in seconds since agent started */
|
|
71
|
+
uptime: number;
|
|
72
|
+
/** Type of last detected activity */
|
|
73
|
+
lastActivityType: HeartbeatActivityType;
|
|
74
|
+
/** Unix timestamp of last activity */
|
|
75
|
+
lastActivityTimestamp: number;
|
|
76
|
+
/** Total number of tool calls made so far */
|
|
77
|
+
toolCallsCount: number;
|
|
78
|
+
/** Current operation being performed (if any) */
|
|
79
|
+
currentOperation: string | null;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Todo item status (mirrors TodoWrite tool)
|
|
83
|
+
*/
|
|
84
|
+
export type TodoStatus = 'pending' | 'in_progress' | 'completed';
|
|
85
|
+
/**
|
|
86
|
+
* Todo item (mirrors TodoWrite tool structure)
|
|
87
|
+
*/
|
|
88
|
+
export interface TodoItem {
|
|
89
|
+
/** Task description (imperative form) */
|
|
90
|
+
content: string;
|
|
91
|
+
/** Current status */
|
|
92
|
+
status: TodoStatus;
|
|
93
|
+
/** Present continuous form for display */
|
|
94
|
+
activeForm: string;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Persisted todo list state
|
|
98
|
+
* Stored at: .agent/todos.json
|
|
99
|
+
* Synced with TodoWrite tool calls
|
|
100
|
+
*/
|
|
101
|
+
export interface TodosState {
|
|
102
|
+
/** Unix timestamp of last update */
|
|
103
|
+
updatedAt: number;
|
|
104
|
+
/** Current todo items */
|
|
105
|
+
items: TodoItem[];
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Progress log entry type
|
|
109
|
+
*/
|
|
110
|
+
export type ProgressEventType = 'start' | 'phase' | 'tool' | 'error' | 'recovery' | 'complete' | 'stop';
|
|
111
|
+
/**
|
|
112
|
+
* Progress log entry
|
|
113
|
+
* Appended to: .agent/progress.log
|
|
114
|
+
* Format: timestamp|event_type|details
|
|
115
|
+
*/
|
|
116
|
+
export interface ProgressLogEntry {
|
|
117
|
+
/** Unix timestamp */
|
|
118
|
+
timestamp: number;
|
|
119
|
+
/** Type of event */
|
|
120
|
+
eventType: ProgressEventType;
|
|
121
|
+
/** Event details (JSON stringified if object) */
|
|
122
|
+
details: string;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Result of checking for recoverable state in a worktree
|
|
126
|
+
*/
|
|
127
|
+
export interface RecoveryCheckResult {
|
|
128
|
+
/** Whether recovery is possible */
|
|
129
|
+
canRecover: boolean;
|
|
130
|
+
/** Whether an agent is currently alive (heartbeat fresh) */
|
|
131
|
+
agentAlive: boolean;
|
|
132
|
+
/** The state if found */
|
|
133
|
+
state?: WorktreeState;
|
|
134
|
+
/** The heartbeat if found */
|
|
135
|
+
heartbeat?: HeartbeatState;
|
|
136
|
+
/** The todos if found */
|
|
137
|
+
todos?: TodosState;
|
|
138
|
+
/** Reason why recovery is not possible */
|
|
139
|
+
reason?: 'no_state' | 'agent_alive' | 'max_attempts' | 'invalid_state';
|
|
140
|
+
/** Human-readable message */
|
|
141
|
+
message: string;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Configuration for heartbeat writer
|
|
145
|
+
*/
|
|
146
|
+
export interface HeartbeatWriterConfig {
|
|
147
|
+
/** Directory path to write heartbeat to */
|
|
148
|
+
agentDir: string;
|
|
149
|
+
/** Process ID of the agent */
|
|
150
|
+
pid: number;
|
|
151
|
+
/** Interval between heartbeats in milliseconds (default: 10000) */
|
|
152
|
+
intervalMs?: number;
|
|
153
|
+
/** Start time of the agent (for uptime calculation) */
|
|
154
|
+
startTime: number;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Configuration for progress logger
|
|
158
|
+
*/
|
|
159
|
+
export interface ProgressLoggerConfig {
|
|
160
|
+
/** Directory path to write progress log to */
|
|
161
|
+
agentDir: string;
|
|
162
|
+
/** Maximum log file size in bytes before rotation (default: 1MB) */
|
|
163
|
+
maxSizeBytes?: number;
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=state-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state-types.d.ts","sourceRoot":"","sources":["../../../src/orchestrator/state-types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Claude Stream-JSON Parser
|
|
3
|
+
*
|
|
4
|
+
* @deprecated This module is dead code — providers now emit normalized AgentEvents
|
|
5
|
+
* directly (see providers/types.ts). Activity emitters consume AgentEvent streams,
|
|
6
|
+
* not ClaudeStreamEvent. Retained for backward compatibility of public type exports.
|
|
7
|
+
* Will be removed in v1.0.
|
|
8
|
+
*
|
|
9
|
+
* Parses Claude's stream-json output format and maps events to handler callbacks.
|
|
10
|
+
* The stream-json format emits newline-delimited JSON events during execution.
|
|
11
|
+
*
|
|
12
|
+
* Event types:
|
|
13
|
+
* - init: Initial message with configuration
|
|
14
|
+
* - system: System messages and prompts
|
|
15
|
+
* - assistant: Assistant text output (partial/streaming)
|
|
16
|
+
* - tool_use: Tool being invoked
|
|
17
|
+
* - tool_result: Result from tool execution
|
|
18
|
+
* - result: Final result when complete
|
|
19
|
+
* - error: Error events
|
|
20
|
+
*/
|
|
21
|
+
/** Base event structure */
|
|
22
|
+
export interface ClaudeStreamEvent {
|
|
23
|
+
type: string;
|
|
24
|
+
timestamp?: string;
|
|
25
|
+
}
|
|
26
|
+
/** Initialization event */
|
|
27
|
+
export interface ClaudeInitEvent extends ClaudeStreamEvent {
|
|
28
|
+
type: 'init';
|
|
29
|
+
message: string;
|
|
30
|
+
sessionId?: string;
|
|
31
|
+
}
|
|
32
|
+
/** System message event */
|
|
33
|
+
export interface ClaudeSystemEvent extends ClaudeStreamEvent {
|
|
34
|
+
type: 'system';
|
|
35
|
+
message: string;
|
|
36
|
+
subtype?: 'prompt' | 'info' | 'warning';
|
|
37
|
+
}
|
|
38
|
+
/** Assistant text output event */
|
|
39
|
+
export interface ClaudeAssistantEvent extends ClaudeStreamEvent {
|
|
40
|
+
type: 'assistant';
|
|
41
|
+
message: string;
|
|
42
|
+
partial?: boolean;
|
|
43
|
+
}
|
|
44
|
+
/** Tool use event - when Claude invokes a tool */
|
|
45
|
+
export interface ClaudeToolUseEvent extends ClaudeStreamEvent {
|
|
46
|
+
type: 'tool_use';
|
|
47
|
+
tool: string;
|
|
48
|
+
input: Record<string, unknown>;
|
|
49
|
+
tool_use_id?: string;
|
|
50
|
+
}
|
|
51
|
+
/** Tool result event - when tool execution completes */
|
|
52
|
+
export interface ClaudeToolResultEvent extends ClaudeStreamEvent {
|
|
53
|
+
type: 'tool_result';
|
|
54
|
+
tool: string;
|
|
55
|
+
output: string;
|
|
56
|
+
tool_use_id?: string;
|
|
57
|
+
is_error?: boolean;
|
|
58
|
+
}
|
|
59
|
+
/** Final result event */
|
|
60
|
+
export interface ClaudeResultEvent extends ClaudeStreamEvent {
|
|
61
|
+
type: 'result';
|
|
62
|
+
result: string;
|
|
63
|
+
cost?: {
|
|
64
|
+
input_tokens: number;
|
|
65
|
+
output_tokens: number;
|
|
66
|
+
};
|
|
67
|
+
duration_ms?: number;
|
|
68
|
+
}
|
|
69
|
+
/** Error event */
|
|
70
|
+
export interface ClaudeErrorEvent extends ClaudeStreamEvent {
|
|
71
|
+
type: 'error';
|
|
72
|
+
error: {
|
|
73
|
+
message: string;
|
|
74
|
+
code?: string;
|
|
75
|
+
details?: unknown;
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
/** Todo item in a user event */
|
|
79
|
+
export interface ClaudeTodoItem {
|
|
80
|
+
content: string;
|
|
81
|
+
status: 'pending' | 'in_progress' | 'completed';
|
|
82
|
+
activeForm: string;
|
|
83
|
+
}
|
|
84
|
+
/** User event - contains tool results including todo updates */
|
|
85
|
+
export interface ClaudeUserEvent extends ClaudeStreamEvent {
|
|
86
|
+
type: 'user';
|
|
87
|
+
message?: {
|
|
88
|
+
role: 'user';
|
|
89
|
+
content?: Array<{
|
|
90
|
+
tool_use_id?: string;
|
|
91
|
+
type?: string;
|
|
92
|
+
content?: string;
|
|
93
|
+
}>;
|
|
94
|
+
};
|
|
95
|
+
tool_use_result?: {
|
|
96
|
+
oldTodos?: ClaudeTodoItem[];
|
|
97
|
+
newTodos?: ClaudeTodoItem[];
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
/** Union of all Claude stream event types */
|
|
101
|
+
export type ClaudeEvent = ClaudeInitEvent | ClaudeSystemEvent | ClaudeAssistantEvent | ClaudeToolUseEvent | ClaudeToolResultEvent | ClaudeResultEvent | ClaudeErrorEvent | ClaudeUserEvent | ClaudeStreamEvent;
|
|
102
|
+
/** Event handlers for Claude stream events */
|
|
103
|
+
export interface ClaudeStreamHandlers {
|
|
104
|
+
onInit?: (event: ClaudeInitEvent) => void | Promise<void>;
|
|
105
|
+
onSystem?: (event: ClaudeSystemEvent) => void | Promise<void>;
|
|
106
|
+
onAssistant?: (event: ClaudeAssistantEvent) => void | Promise<void>;
|
|
107
|
+
onToolUse?: (event: ClaudeToolUseEvent) => void | Promise<void>;
|
|
108
|
+
onToolResult?: (event: ClaudeToolResultEvent) => void | Promise<void>;
|
|
109
|
+
onResult?: (event: ClaudeResultEvent) => void | Promise<void>;
|
|
110
|
+
onError?: (event: ClaudeErrorEvent) => void | Promise<void>;
|
|
111
|
+
onUser?: (event: ClaudeUserEvent) => void | Promise<void>;
|
|
112
|
+
onTodo?: (newTodos: ClaudeTodoItem[], oldTodos: ClaudeTodoItem[]) => void | Promise<void>;
|
|
113
|
+
onUnknown?: (event: ClaudeStreamEvent) => void | Promise<void>;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Claude Stream Parser
|
|
117
|
+
*
|
|
118
|
+
* @deprecated Providers now emit normalized AgentEvents directly.
|
|
119
|
+
* Activity emitters consume AgentEvent streams, not ClaudeStreamEvent.
|
|
120
|
+
* This class is retained for backward compatibility and will be removed in v1.0.
|
|
121
|
+
*/
|
|
122
|
+
export declare class ClaudeStreamParser {
|
|
123
|
+
private buffer;
|
|
124
|
+
private handlers;
|
|
125
|
+
constructor(handlers?: ClaudeStreamHandlers);
|
|
126
|
+
/**
|
|
127
|
+
* Feed raw data from stdout into the parser
|
|
128
|
+
*/
|
|
129
|
+
feed(data: Buffer | string): Promise<void>;
|
|
130
|
+
/**
|
|
131
|
+
* Flush any remaining buffered data
|
|
132
|
+
*/
|
|
133
|
+
flush(): Promise<void>;
|
|
134
|
+
/**
|
|
135
|
+
* Parse a single JSON line and dispatch to appropriate handler
|
|
136
|
+
*/
|
|
137
|
+
private parseLine;
|
|
138
|
+
/**
|
|
139
|
+
* Dispatch an event to the appropriate handler
|
|
140
|
+
*/
|
|
141
|
+
private dispatchEvent;
|
|
142
|
+
/**
|
|
143
|
+
* Handle user events, extracting todo updates if present
|
|
144
|
+
*/
|
|
145
|
+
private handleUserEvent;
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Create a new Claude stream parser instance
|
|
149
|
+
*/
|
|
150
|
+
export declare function createStreamParser(handlers: ClaudeStreamHandlers): ClaudeStreamParser;
|
|
151
|
+
//# sourceMappingURL=stream-parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stream-parser.d.ts","sourceRoot":"","sources":["../../../src/orchestrator/stream-parser.ts"],"names":[],"mappings":"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"}
|