conductor-bridge 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +69 -0
- package/dist/bridge/index.d.ts +8 -0
- package/dist/bridge/index.d.ts.map +1 -0
- package/dist/bridge/index.js +8 -0
- package/dist/bridge/index.js.map +1 -0
- package/dist/bridge/json-interchange.d.ts +94 -0
- package/dist/bridge/json-interchange.d.ts.map +1 -0
- package/dist/bridge/json-interchange.js +301 -0
- package/dist/bridge/json-interchange.js.map +1 -0
- package/dist/cli/commands/amend.d.ts +12 -0
- package/dist/cli/commands/amend.d.ts.map +1 -0
- package/dist/cli/commands/amend.js +205 -0
- package/dist/cli/commands/amend.js.map +1 -0
- package/dist/cli/commands/daemon.d.ts +12 -0
- package/dist/cli/commands/daemon.d.ts.map +1 -0
- package/dist/cli/commands/daemon.js +60 -0
- package/dist/cli/commands/daemon.js.map +1 -0
- package/dist/cli/commands/dispatch.d.ts +12 -0
- package/dist/cli/commands/dispatch.d.ts.map +1 -0
- package/dist/cli/commands/dispatch.js +207 -0
- package/dist/cli/commands/dispatch.js.map +1 -0
- package/dist/cli/commands/handoff.d.ts +31 -0
- package/dist/cli/commands/handoff.d.ts.map +1 -0
- package/dist/cli/commands/handoff.js +273 -0
- package/dist/cli/commands/handoff.js.map +1 -0
- package/dist/cli/commands/init.d.ts +12 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +301 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/status.d.ts +12 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/status.js +206 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/index.d.ts +17 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +148 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/handoff/encryption.d.ts +85 -0
- package/dist/handoff/encryption.d.ts.map +1 -0
- package/dist/handoff/encryption.js +308 -0
- package/dist/handoff/encryption.js.map +1 -0
- package/dist/handoff/index.d.ts +8 -0
- package/dist/handoff/index.d.ts.map +1 -0
- package/dist/handoff/index.js +10 -0
- package/dist/handoff/index.js.map +1 -0
- package/dist/handoff/mycelium-arc.d.ts +116 -0
- package/dist/handoff/mycelium-arc.d.ts.map +1 -0
- package/dist/handoff/mycelium-arc.js +410 -0
- package/dist/handoff/mycelium-arc.js.map +1 -0
- package/dist/index.d.ts +38 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +71 -0
- package/dist/index.js.map +1 -0
- package/dist/parsers/index.d.ts +10 -0
- package/dist/parsers/index.d.ts.map +1 -0
- package/dist/parsers/index.js +12 -0
- package/dist/parsers/index.js.map +1 -0
- package/dist/parsers/plan-parser.d.ts +29 -0
- package/dist/parsers/plan-parser.d.ts.map +1 -0
- package/dist/parsers/plan-parser.js +503 -0
- package/dist/parsers/plan-parser.js.map +1 -0
- package/dist/parsers/spec-parser.d.ts +10 -0
- package/dist/parsers/spec-parser.d.ts.map +1 -0
- package/dist/parsers/spec-parser.js +382 -0
- package/dist/parsers/spec-parser.js.map +1 -0
- package/dist/parsers/state-parser.d.ts +21 -0
- package/dist/parsers/state-parser.d.ts.map +1 -0
- package/dist/parsers/state-parser.js +378 -0
- package/dist/parsers/state-parser.js.map +1 -0
- package/dist/parsers/types.d.ts +190 -0
- package/dist/parsers/types.d.ts.map +1 -0
- package/dist/parsers/types.js +7 -0
- package/dist/parsers/types.js.map +1 -0
- package/dist/schemas/cognitive-state.d.ts +1523 -0
- package/dist/schemas/cognitive-state.d.ts.map +1 -0
- package/dist/schemas/cognitive-state.js +328 -0
- package/dist/schemas/cognitive-state.js.map +1 -0
- package/dist/schemas/enums.d.ts +124 -0
- package/dist/schemas/enums.d.ts.map +1 -0
- package/dist/schemas/enums.js +108 -0
- package/dist/schemas/enums.js.map +1 -0
- package/dist/schemas/index.d.ts +9 -0
- package/dist/schemas/index.d.ts.map +1 -0
- package/dist/schemas/index.js +9 -0
- package/dist/schemas/index.js.map +1 -0
- package/dist/sync/adhd-continuity.d.ts +91 -0
- package/dist/sync/adhd-continuity.d.ts.map +1 -0
- package/dist/sync/adhd-continuity.js +302 -0
- package/dist/sync/adhd-continuity.js.map +1 -0
- package/dist/sync/convergence-tracker.d.ts +111 -0
- package/dist/sync/convergence-tracker.d.ts.map +1 -0
- package/dist/sync/convergence-tracker.js +299 -0
- package/dist/sync/convergence-tracker.js.map +1 -0
- package/dist/sync/index.d.ts +11 -0
- package/dist/sync/index.d.ts.map +1 -0
- package/dist/sync/index.js +15 -0
- package/dist/sync/index.js.map +1 -0
- package/dist/sync/state-sync.d.ts +105 -0
- package/dist/sync/state-sync.d.ts.map +1 -0
- package/dist/sync/state-sync.js +403 -0
- package/dist/sync/state-sync.js.map +1 -0
- package/dist/sync/watcher.d.ts +90 -0
- package/dist/sync/watcher.d.ts.map +1 -0
- package/dist/sync/watcher.js +281 -0
- package/dist/sync/watcher.js.map +1 -0
- package/dist/utils/atomic-write.d.ts +31 -0
- package/dist/utils/atomic-write.d.ts.map +1 -0
- package/dist/utils/atomic-write.js +69 -0
- package/dist/utils/atomic-write.js.map +1 -0
- package/dist/utils/error-handling.d.ts +70 -0
- package/dist/utils/error-handling.d.ts.map +1 -0
- package/dist/utils/error-handling.js +109 -0
- package/dist/utils/error-handling.js.map +1 -0
- package/dist/utils/file-lock.d.ts +46 -0
- package/dist/utils/file-lock.d.ts.map +1 -0
- package/dist/utils/file-lock.js +117 -0
- package/dist/utils/file-lock.js.map +1 -0
- package/dist/utils/index.d.ts +10 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +12 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/rlm-navigator.d.ts +160 -0
- package/dist/utils/rlm-navigator.d.ts.map +1 -0
- package/dist/utils/rlm-navigator.js +368 -0
- package/dist/utils/rlm-navigator.js.map +1 -0
- package/dist/utils/safe-path.d.ts +44 -0
- package/dist/utils/safe-path.d.ts.map +1 -0
- package/dist/utils/safe-path.js +96 -0
- package/dist/utils/safe-path.js.map +1 -0
- package/dist/utils/timed-io.d.ts +51 -0
- package/dist/utils/timed-io.d.ts.map +1 -0
- package/dist/utils/timed-io.js +128 -0
- package/dist/utils/timed-io.js.map +1 -0
- package/package.json +88 -0
|
@@ -0,0 +1,403 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* State Sync Module
|
|
3
|
+
*
|
|
4
|
+
* Handles bidirectional synchronization between:
|
|
5
|
+
* - Conductor (Markdown files) → USD Substrate (JSON)
|
|
6
|
+
* - USD Substrate (JSON) → Conductor (Markdown files)
|
|
7
|
+
*
|
|
8
|
+
* Key concepts:
|
|
9
|
+
* - Conductor is source of truth for TASK state (checkboxes)
|
|
10
|
+
* - USD Substrate is source of truth for COGNITIVE state (energy, burnout, momentum)
|
|
11
|
+
* - Sync derives cognitive state from task progress and vice versa
|
|
12
|
+
*
|
|
13
|
+
* DETERMINISM GUARANTEES (ThinkingMachines [He2025] compliance):
|
|
14
|
+
*
|
|
15
|
+
* 1. FIXED MOMENTUM DERIVATION ORDER: Conditions in deriveMomentumFromTasks()
|
|
16
|
+
* are checked in priority order: CRASHED > DECLINING > COLD_START >
|
|
17
|
+
* BUILDING > ROLLING > PEAK. First match wins.
|
|
18
|
+
*
|
|
19
|
+
* 2. FIXED ENERGY DERIVATION ORDER: Conditions in deriveEnergyFromTasks()
|
|
20
|
+
* are checked in order: HIGH > DEPLETED > LOW > MEDIUM (default).
|
|
21
|
+
*
|
|
22
|
+
* 3. SEQUENTIAL SYNC: syncBidirectional() runs Conductor→USD first,
|
|
23
|
+
* then USD→Conductor. Never parallel to prevent race conditions.
|
|
24
|
+
*
|
|
25
|
+
* 4. FILE-ORDER ITERATION: Tasks are processed in markdown file order
|
|
26
|
+
* (line numbers), not by arbitrary collection ordering.
|
|
27
|
+
*
|
|
28
|
+
* Reference: [He2025] "Defeating Nondeterminism in LLM Inference"
|
|
29
|
+
*/
|
|
30
|
+
import { readFile, writeFile } from 'fs/promises';
|
|
31
|
+
import { join } from 'path';
|
|
32
|
+
import { createHash } from 'crypto';
|
|
33
|
+
import { parsePlan, countTasksByState } from '../parsers/plan-parser.js';
|
|
34
|
+
import { parseState } from '../parsers/state-parser.js';
|
|
35
|
+
import { JsonInterchangeWriter, JsonInterchangeReader, } from '../bridge/json-interchange.js';
|
|
36
|
+
import { MomentumPhase, EnergyLevel, BurnoutLevel, ActiveMode, Paradigm, } from '../schemas/enums.js';
|
|
37
|
+
// ============================================================================
|
|
38
|
+
// Momentum Derivation
|
|
39
|
+
// ============================================================================
|
|
40
|
+
/**
|
|
41
|
+
* Derive momentum phase from task completion trajectory.
|
|
42
|
+
*
|
|
43
|
+
* Momentum is about VELOCITY of progress, not just completion count.
|
|
44
|
+
* We look at recent activity patterns to determine phase.
|
|
45
|
+
*/
|
|
46
|
+
export function deriveMomentumFromTasks(plan, recentCompletions = 0, sessionDurationMinutes = 0) {
|
|
47
|
+
const counts = countTasksByState(plan);
|
|
48
|
+
const total = counts.pending + counts.in_progress + counts.complete + counts.blocked;
|
|
49
|
+
if (total === 0) {
|
|
50
|
+
return MomentumPhase.COLD_START;
|
|
51
|
+
}
|
|
52
|
+
const completionRate = counts.complete / total;
|
|
53
|
+
const hasBlockedTasks = counts.blocked > 0;
|
|
54
|
+
const hasActiveTasks = counts.in_progress > 0;
|
|
55
|
+
// Check for crashed state
|
|
56
|
+
if (hasBlockedTasks && !hasActiveTasks && recentCompletions === 0) {
|
|
57
|
+
return MomentumPhase.CRASHED;
|
|
58
|
+
}
|
|
59
|
+
// Check for declining (blocked with some progress)
|
|
60
|
+
if (hasBlockedTasks && completionRate > 0.3) {
|
|
61
|
+
return MomentumPhase.DECLINING;
|
|
62
|
+
}
|
|
63
|
+
// Cold start: Very early in session or no completions
|
|
64
|
+
if (sessionDurationMinutes < 15 && counts.complete < 2) {
|
|
65
|
+
return MomentumPhase.COLD_START;
|
|
66
|
+
}
|
|
67
|
+
// Building: Some progress, active work
|
|
68
|
+
if (completionRate < 0.4 && hasActiveTasks) {
|
|
69
|
+
return MomentumPhase.BUILDING;
|
|
70
|
+
}
|
|
71
|
+
// Rolling: Good progress, sustained activity
|
|
72
|
+
if (completionRate >= 0.4 && completionRate < 0.8 && hasActiveTasks) {
|
|
73
|
+
return MomentumPhase.ROLLING;
|
|
74
|
+
}
|
|
75
|
+
// Peak: High completion, still active
|
|
76
|
+
if (completionRate >= 0.8 && hasActiveTasks) {
|
|
77
|
+
return MomentumPhase.PEAK;
|
|
78
|
+
}
|
|
79
|
+
// All complete
|
|
80
|
+
if (completionRate === 1.0) {
|
|
81
|
+
return MomentumPhase.PEAK;
|
|
82
|
+
}
|
|
83
|
+
// Default to building
|
|
84
|
+
return MomentumPhase.BUILDING;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Derive energy level from task patterns.
|
|
88
|
+
*
|
|
89
|
+
* Energy correlates with:
|
|
90
|
+
* - Task completion velocity (higher = more energy)
|
|
91
|
+
* - Blocked task ratio (higher = lower energy)
|
|
92
|
+
* - Session duration (longer = lower energy)
|
|
93
|
+
*/
|
|
94
|
+
export function deriveEnergyFromTasks(plan, sessionDurationMinutes = 0, recentBlockedCount = 0) {
|
|
95
|
+
const counts = countTasksByState(plan);
|
|
96
|
+
const total = counts.pending + counts.in_progress + counts.complete + counts.blocked;
|
|
97
|
+
if (total === 0) {
|
|
98
|
+
return EnergyLevel.MEDIUM;
|
|
99
|
+
}
|
|
100
|
+
const blockedRatio = counts.blocked / total;
|
|
101
|
+
const completionRate = counts.complete / total;
|
|
102
|
+
// High energy indicators
|
|
103
|
+
if (blockedRatio === 0 &&
|
|
104
|
+
completionRate > 0.3 &&
|
|
105
|
+
sessionDurationMinutes < 120) {
|
|
106
|
+
return EnergyLevel.HIGH;
|
|
107
|
+
}
|
|
108
|
+
// Depleted indicators
|
|
109
|
+
if (blockedRatio > 0.3 ||
|
|
110
|
+
(sessionDurationMinutes > 240 && completionRate < 0.5)) {
|
|
111
|
+
return EnergyLevel.DEPLETED;
|
|
112
|
+
}
|
|
113
|
+
// Low energy indicators
|
|
114
|
+
if (blockedRatio > 0.1 ||
|
|
115
|
+
sessionDurationMinutes > 180 ||
|
|
116
|
+
recentBlockedCount > 2) {
|
|
117
|
+
return EnergyLevel.LOW;
|
|
118
|
+
}
|
|
119
|
+
return EnergyLevel.MEDIUM;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Derive complete cognitive state from task data.
|
|
123
|
+
*/
|
|
124
|
+
export function deriveCognitiveState(plan, sessionDurationMinutes = 0, recentCompletions = 0) {
|
|
125
|
+
const counts = countTasksByState(plan);
|
|
126
|
+
const total = counts.pending + counts.in_progress + counts.complete + counts.blocked;
|
|
127
|
+
const completedTracks = plan.tracks.filter((t) => t.status === 'complete').length;
|
|
128
|
+
return {
|
|
129
|
+
momentum_phase: deriveMomentumFromTasks(plan, recentCompletions, sessionDurationMinutes),
|
|
130
|
+
energy_level: deriveEnergyFromTasks(plan, sessionDurationMinutes),
|
|
131
|
+
progress_percent: total > 0 ? Math.round((counts.complete / total) * 100) : 0,
|
|
132
|
+
tasks_completed: counts.complete,
|
|
133
|
+
tasks_total: total,
|
|
134
|
+
tracks_completed: completedTracks,
|
|
135
|
+
tracks_total: plan.tracks.length,
|
|
136
|
+
has_blocked_tasks: counts.blocked > 0,
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
// ============================================================================
|
|
140
|
+
// Conductor → USD Sync
|
|
141
|
+
// ============================================================================
|
|
142
|
+
/**
|
|
143
|
+
* Sync Conductor state to USD Substrate.
|
|
144
|
+
*
|
|
145
|
+
* Reads plan.md and state.md, derives cognitive state,
|
|
146
|
+
* writes to cognitive_state.json.
|
|
147
|
+
*/
|
|
148
|
+
export async function syncConductorToUSD(config) {
|
|
149
|
+
const changes = [];
|
|
150
|
+
const warnings = [];
|
|
151
|
+
try {
|
|
152
|
+
// Read Conductor files
|
|
153
|
+
const statePath = join(config.conductorDir, 'state.md');
|
|
154
|
+
const stateContent = await readFile(statePath, 'utf-8');
|
|
155
|
+
const stateResult = parseState(stateContent);
|
|
156
|
+
if (!stateResult.success || !stateResult.data) {
|
|
157
|
+
return {
|
|
158
|
+
success: false,
|
|
159
|
+
direction: 'conductor-to-usd',
|
|
160
|
+
changes: [],
|
|
161
|
+
warnings: ['Failed to parse state.md'],
|
|
162
|
+
timestamp: new Date().toISOString(),
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
const state = stateResult.data;
|
|
166
|
+
// Read plan
|
|
167
|
+
const planPath = join(config.conductorDir, state.frontmatter.plan || 'plan.md');
|
|
168
|
+
const planContent = await readFile(planPath, 'utf-8');
|
|
169
|
+
const planResult = parsePlan(planContent);
|
|
170
|
+
if (!planResult.success || !planResult.data) {
|
|
171
|
+
return {
|
|
172
|
+
success: false,
|
|
173
|
+
direction: 'conductor-to-usd',
|
|
174
|
+
changes: [],
|
|
175
|
+
warnings: ['Failed to parse plan.md'],
|
|
176
|
+
timestamp: new Date().toISOString(),
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
const plan = planResult.data;
|
|
180
|
+
// Calculate session duration
|
|
181
|
+
const sessionStart = state.frontmatter.created
|
|
182
|
+
? new Date(state.frontmatter.created)
|
|
183
|
+
: new Date();
|
|
184
|
+
const sessionDuration = Math.round((Date.now() - sessionStart.getTime()) / (1000 * 60));
|
|
185
|
+
// Derive cognitive state from tasks
|
|
186
|
+
const derived = deriveCognitiveState(plan, sessionDuration);
|
|
187
|
+
changes.push(`Derived momentum: ${derived.momentum_phase}`);
|
|
188
|
+
changes.push(`Derived energy: ${derived.energy_level}`);
|
|
189
|
+
changes.push(`Progress: ${derived.progress_percent}%`);
|
|
190
|
+
// Build session state
|
|
191
|
+
const sessionState = {
|
|
192
|
+
session_id: state.frontmatter.session_id,
|
|
193
|
+
timestamp: new Date().toISOString(),
|
|
194
|
+
version: '1.0.0',
|
|
195
|
+
active_mode: ActiveMode.FOCUSED,
|
|
196
|
+
active_paradigm: Paradigm.CORTEX,
|
|
197
|
+
energy_level: derived.energy_level,
|
|
198
|
+
burnout_level: derived.has_blocked_tasks ? BurnoutLevel.YELLOW : BurnoutLevel.GREEN,
|
|
199
|
+
momentum_phase: derived.momentum_phase,
|
|
200
|
+
session_start_goal: state.currentAssignment?.task || '',
|
|
201
|
+
parked_ideas: [],
|
|
202
|
+
active_project_profile: plan.frontmatter.spec.split('/').pop()?.replace('.md', '') || 'default',
|
|
203
|
+
};
|
|
204
|
+
// Build conductor session context
|
|
205
|
+
const conductorSession = {
|
|
206
|
+
conductor_version: '1.0',
|
|
207
|
+
session_id: state.frontmatter.session_id,
|
|
208
|
+
agent: state.frontmatter.agent,
|
|
209
|
+
spec_path: state.frontmatter.spec,
|
|
210
|
+
plan_path: state.frontmatter.plan,
|
|
211
|
+
current_assignment: state.currentAssignment
|
|
212
|
+
? {
|
|
213
|
+
track: state.currentAssignment.track,
|
|
214
|
+
task: state.currentAssignment.task,
|
|
215
|
+
subtask: state.currentAssignment.subtask,
|
|
216
|
+
iteration: state.currentAssignment.iteration,
|
|
217
|
+
}
|
|
218
|
+
: undefined,
|
|
219
|
+
context_files: state.contextFiles,
|
|
220
|
+
scratchpad: state.scratchpad,
|
|
221
|
+
warnings: state.warnings,
|
|
222
|
+
created_at: state.frontmatter.created,
|
|
223
|
+
updated_at: new Date().toISOString(),
|
|
224
|
+
};
|
|
225
|
+
// Write to USD format
|
|
226
|
+
const writer = new JsonInterchangeWriter();
|
|
227
|
+
const doc = writer.createConductorSyncDocument(conductorSession, plan.tracks.map((t) => ({
|
|
228
|
+
id: t.id,
|
|
229
|
+
name: t.name,
|
|
230
|
+
description: t.description,
|
|
231
|
+
status: t.status,
|
|
232
|
+
agent: t.agent,
|
|
233
|
+
dependencies: t.dependencies,
|
|
234
|
+
tasks: t.tasks.map((task) => ({
|
|
235
|
+
id: task.id,
|
|
236
|
+
content: task.content,
|
|
237
|
+
status: task.state,
|
|
238
|
+
track: t.name,
|
|
239
|
+
parent_id: null,
|
|
240
|
+
artifacts: [],
|
|
241
|
+
started_at: null,
|
|
242
|
+
completed_at: task.state === 'complete' ? new Date().toISOString() : null,
|
|
243
|
+
})),
|
|
244
|
+
started_at: t.started || null,
|
|
245
|
+
completed_at: t.completed || null,
|
|
246
|
+
})), sessionState);
|
|
247
|
+
await writer.writeToFile(doc, config.cognitiveStatePath);
|
|
248
|
+
changes.push(`Wrote cognitive state to ${config.cognitiveStatePath}`);
|
|
249
|
+
return {
|
|
250
|
+
success: true,
|
|
251
|
+
direction: 'conductor-to-usd',
|
|
252
|
+
changes,
|
|
253
|
+
warnings,
|
|
254
|
+
timestamp: new Date().toISOString(),
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
catch (error) {
|
|
258
|
+
return {
|
|
259
|
+
success: false,
|
|
260
|
+
direction: 'conductor-to-usd',
|
|
261
|
+
changes,
|
|
262
|
+
warnings: [`Sync failed: ${error instanceof Error ? error.message : String(error)}`],
|
|
263
|
+
timestamp: new Date().toISOString(),
|
|
264
|
+
};
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
// ============================================================================
|
|
268
|
+
// USD → Conductor Sync
|
|
269
|
+
// ============================================================================
|
|
270
|
+
/**
|
|
271
|
+
* Sync USD Substrate state to Conductor.
|
|
272
|
+
*
|
|
273
|
+
* Reads cognitive_state.json, updates state.md with
|
|
274
|
+
* cognitive context (warnings, recommendations).
|
|
275
|
+
*/
|
|
276
|
+
export async function syncUSDToConductor(config) {
|
|
277
|
+
const changes = [];
|
|
278
|
+
const warnings = [];
|
|
279
|
+
try {
|
|
280
|
+
// Read USD state
|
|
281
|
+
const reader = new JsonInterchangeReader();
|
|
282
|
+
const doc = await reader.readFromFile(config.cognitiveStatePath);
|
|
283
|
+
const sessionState = reader.extractSessionState(doc);
|
|
284
|
+
if (!sessionState) {
|
|
285
|
+
return {
|
|
286
|
+
success: false,
|
|
287
|
+
direction: 'usd-to-conductor',
|
|
288
|
+
changes: [],
|
|
289
|
+
warnings: ['No session state found in cognitive_state.json'],
|
|
290
|
+
timestamp: new Date().toISOString(),
|
|
291
|
+
};
|
|
292
|
+
}
|
|
293
|
+
// Read current Conductor state
|
|
294
|
+
const statePath = join(config.conductorDir, 'state.md');
|
|
295
|
+
let stateContent = await readFile(statePath, 'utf-8');
|
|
296
|
+
// Update warnings based on cognitive state
|
|
297
|
+
const newWarnings = [];
|
|
298
|
+
if (sessionState.burnout_level === BurnoutLevel.YELLOW) {
|
|
299
|
+
newWarnings.push('WARN: Burnout level YELLOW - consider taking a break');
|
|
300
|
+
}
|
|
301
|
+
if (sessionState.burnout_level === BurnoutLevel.ORANGE) {
|
|
302
|
+
newWarnings.push('WARN: Burnout level ORANGE - strongly recommend a break');
|
|
303
|
+
}
|
|
304
|
+
if (sessionState.energy_level === EnergyLevel.LOW) {
|
|
305
|
+
newWarnings.push('WARN: Energy level low - switch to easier tasks');
|
|
306
|
+
}
|
|
307
|
+
if (sessionState.energy_level === EnergyLevel.DEPLETED) {
|
|
308
|
+
newWarnings.push('WARN: Energy depleted - recovery mode recommended');
|
|
309
|
+
}
|
|
310
|
+
if (sessionState.momentum_phase === MomentumPhase.CRASHED) {
|
|
311
|
+
newWarnings.push('WARN: Momentum crashed - no judgment, restart tomorrow is fine');
|
|
312
|
+
}
|
|
313
|
+
// Update warnings section in state.md
|
|
314
|
+
if (newWarnings.length > 0) {
|
|
315
|
+
const warningsSection = newWarnings.map((w) => `- ${w}`).join('\n');
|
|
316
|
+
// Replace or add warnings section
|
|
317
|
+
if (stateContent.includes('## Warnings')) {
|
|
318
|
+
stateContent = stateContent.replace(/## Warnings\n[\s\S]*?(?=\n##|$)/, `## Warnings\n\n${warningsSection}\n`);
|
|
319
|
+
}
|
|
320
|
+
changes.push(`Updated warnings: ${newWarnings.length} items`);
|
|
321
|
+
}
|
|
322
|
+
// Update timestamp
|
|
323
|
+
stateContent = stateContent.replace(/^updated: .+$/m, `updated: ${new Date().toISOString()}`);
|
|
324
|
+
await writeFile(statePath, stateContent);
|
|
325
|
+
changes.push('Updated state.md');
|
|
326
|
+
return {
|
|
327
|
+
success: true,
|
|
328
|
+
direction: 'usd-to-conductor',
|
|
329
|
+
changes,
|
|
330
|
+
warnings,
|
|
331
|
+
timestamp: new Date().toISOString(),
|
|
332
|
+
};
|
|
333
|
+
}
|
|
334
|
+
catch (error) {
|
|
335
|
+
return {
|
|
336
|
+
success: false,
|
|
337
|
+
direction: 'usd-to-conductor',
|
|
338
|
+
changes,
|
|
339
|
+
warnings: [`Sync failed: ${error instanceof Error ? error.message : String(error)}`],
|
|
340
|
+
timestamp: new Date().toISOString(),
|
|
341
|
+
};
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
// ============================================================================
|
|
345
|
+
// Bidirectional Sync
|
|
346
|
+
// ============================================================================
|
|
347
|
+
/**
|
|
348
|
+
* Perform bidirectional sync.
|
|
349
|
+
*
|
|
350
|
+
* 1. Read both sources
|
|
351
|
+
* 2. Conductor → USD (task state → cognitive state)
|
|
352
|
+
* 3. USD → Conductor (cognitive warnings → state.md)
|
|
353
|
+
*/
|
|
354
|
+
export async function syncBidirectional(config) {
|
|
355
|
+
const allChanges = [];
|
|
356
|
+
const allWarnings = [];
|
|
357
|
+
// Conductor → USD first
|
|
358
|
+
const toUSD = await syncConductorToUSD(config);
|
|
359
|
+
allChanges.push(...toUSD.changes);
|
|
360
|
+
allWarnings.push(...toUSD.warnings);
|
|
361
|
+
if (!toUSD.success) {
|
|
362
|
+
return {
|
|
363
|
+
success: false,
|
|
364
|
+
direction: 'bidirectional',
|
|
365
|
+
changes: allChanges,
|
|
366
|
+
warnings: allWarnings,
|
|
367
|
+
timestamp: new Date().toISOString(),
|
|
368
|
+
};
|
|
369
|
+
}
|
|
370
|
+
// USD → Conductor
|
|
371
|
+
const toConductor = await syncUSDToConductor(config);
|
|
372
|
+
allChanges.push(...toConductor.changes);
|
|
373
|
+
allWarnings.push(...toConductor.warnings);
|
|
374
|
+
return {
|
|
375
|
+
success: toConductor.success,
|
|
376
|
+
direction: 'bidirectional',
|
|
377
|
+
changes: allChanges,
|
|
378
|
+
warnings: allWarnings,
|
|
379
|
+
timestamp: new Date().toISOString(),
|
|
380
|
+
};
|
|
381
|
+
}
|
|
382
|
+
// ============================================================================
|
|
383
|
+
// Checksum-Based Change Detection
|
|
384
|
+
// ============================================================================
|
|
385
|
+
/**
|
|
386
|
+
* Compute checksum for a file.
|
|
387
|
+
*/
|
|
388
|
+
export async function computeFileChecksum(filePath) {
|
|
389
|
+
try {
|
|
390
|
+
const content = await readFile(filePath, 'utf-8');
|
|
391
|
+
return createHash('sha256').update(content).digest('hex').slice(0, 16);
|
|
392
|
+
}
|
|
393
|
+
catch {
|
|
394
|
+
return '';
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
/**
|
|
398
|
+
* Check if a file has changed since last checksum.
|
|
399
|
+
*/
|
|
400
|
+
export function hasFileChanged(currentChecksum, previousChecksum) {
|
|
401
|
+
return currentChecksum !== previousChecksum && currentChecksum !== '';
|
|
402
|
+
}
|
|
403
|
+
//# sourceMappingURL=state-sync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state-sync.js","sourceRoot":"","sources":["../../src/sync/state-sync.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* File Watcher Daemon
|
|
3
|
+
*
|
|
4
|
+
* Watches .conductor/ directory for changes and triggers auto-sync.
|
|
5
|
+
* Provides real-time bidirectional state synchronization.
|
|
6
|
+
*/
|
|
7
|
+
import { EventEmitter } from 'events';
|
|
8
|
+
import { type SyncConfig, type SyncResult } from './state-sync.js';
|
|
9
|
+
export interface WatcherConfig extends SyncConfig {
|
|
10
|
+
/** Debounce delay in ms */
|
|
11
|
+
debounceMs: number;
|
|
12
|
+
/** Whether to sync on initial start */
|
|
13
|
+
syncOnStart: boolean;
|
|
14
|
+
/** Files to watch */
|
|
15
|
+
watchPatterns: string[];
|
|
16
|
+
/** Files to ignore */
|
|
17
|
+
ignorePatterns: string[];
|
|
18
|
+
}
|
|
19
|
+
export interface WatcherStats {
|
|
20
|
+
startTime: Date;
|
|
21
|
+
syncCount: number;
|
|
22
|
+
lastSyncTime: Date | null;
|
|
23
|
+
lastSyncResult: SyncResult | null;
|
|
24
|
+
errors: string[];
|
|
25
|
+
exchangeCount: number;
|
|
26
|
+
}
|
|
27
|
+
export type WatcherEvent = 'started' | 'stopped' | 'sync' | 'error' | 'change' | 'convergence';
|
|
28
|
+
export declare class ConductorWatcher extends EventEmitter {
|
|
29
|
+
private config;
|
|
30
|
+
private watcher;
|
|
31
|
+
private checksums;
|
|
32
|
+
private debounceTimer;
|
|
33
|
+
private stats;
|
|
34
|
+
private convergenceTracker;
|
|
35
|
+
private isRunning;
|
|
36
|
+
constructor(config: Partial<WatcherConfig>);
|
|
37
|
+
/**
|
|
38
|
+
* Start watching for file changes.
|
|
39
|
+
*/
|
|
40
|
+
start(): Promise<void>;
|
|
41
|
+
/**
|
|
42
|
+
* Stop watching for file changes.
|
|
43
|
+
*/
|
|
44
|
+
stop(): Promise<void>;
|
|
45
|
+
/**
|
|
46
|
+
* Handle file change event.
|
|
47
|
+
*/
|
|
48
|
+
private handleChange;
|
|
49
|
+
/**
|
|
50
|
+
* Handle debounced file change.
|
|
51
|
+
*/
|
|
52
|
+
private onDebouncedChange;
|
|
53
|
+
/**
|
|
54
|
+
* Perform sync with convergence tracking.
|
|
55
|
+
*/
|
|
56
|
+
private syncWithConvergence;
|
|
57
|
+
/**
|
|
58
|
+
* Perform bidirectional sync.
|
|
59
|
+
*/
|
|
60
|
+
sync(): Promise<SyncResult>;
|
|
61
|
+
/**
|
|
62
|
+
* Record sync result in stats.
|
|
63
|
+
*/
|
|
64
|
+
private recordSyncResult;
|
|
65
|
+
/**
|
|
66
|
+
* Handle errors.
|
|
67
|
+
*/
|
|
68
|
+
private handleError;
|
|
69
|
+
/**
|
|
70
|
+
* Capture initial file checksums.
|
|
71
|
+
*/
|
|
72
|
+
private captureChecksums;
|
|
73
|
+
/**
|
|
74
|
+
* Get current stats.
|
|
75
|
+
*/
|
|
76
|
+
getStats(): WatcherStats;
|
|
77
|
+
/**
|
|
78
|
+
* Get convergence glyph.
|
|
79
|
+
*/
|
|
80
|
+
getConvergenceGlyph(): string;
|
|
81
|
+
/**
|
|
82
|
+
* Check if watcher is running.
|
|
83
|
+
*/
|
|
84
|
+
isActive(): boolean;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Create and start a conductor watcher.
|
|
88
|
+
*/
|
|
89
|
+
export declare function createWatcher(conductorDir: string, options?: Partial<WatcherConfig>): Promise<ConductorWatcher>;
|
|
90
|
+
//# sourceMappingURL=watcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watcher.d.ts","sourceRoot":"","sources":["../../src/sync/watcher.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAKL,KAAK,UAAU,EACf,KAAK,UAAU,EAChB,MAAM,iBAAiB,CAAC;AAWzB,MAAM,WAAW,aAAc,SAAQ,UAAU;IAC/C,2BAA2B;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,uCAAuC;IACvC,WAAW,EAAE,OAAO,CAAC;IACrB,qBAAqB;IACrB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,sBAAsB;IACtB,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,IAAI,GAAG,IAAI,CAAC;IAC1B,cAAc,EAAE,UAAU,GAAG,IAAI,CAAC;IAClC,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,MAAM,YAAY,GACpB,SAAS,GACT,SAAS,GACT,MAAM,GACN,OAAO,GACP,QAAQ,GACR,aAAa,CAAC;AA0BlB,qBAAa,gBAAiB,SAAQ,YAAY;IAChD,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,OAAO,CAA0B;IACzC,OAAO,CAAC,SAAS,CAAkC;IACnD,OAAO,CAAC,aAAa,CAA+B;IACpD,OAAO,CAAC,KAAK,CAAe;IAC5B,OAAO,CAAC,kBAAkB,CAA8B;IACxD,OAAO,CAAC,SAAS,CAAkB;gBAEvB,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC;IA0B1C;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAqC5B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAoB3B;;OAEG;IACH,OAAO,CAAC,YAAY;IAcpB;;OAEG;YACW,iBAAiB;IA8B/B;;OAEG;YACW,mBAAmB;IAmDjC;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,UAAU,CAAC;IAMjC;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAYxB;;OAEG;IACH,OAAO,CAAC,WAAW;IAOnB;;OAEG;YACW,gBAAgB;IAgB9B;;OAEG;IACH,QAAQ,IAAI,YAAY;IAIxB;;OAEG;IACH,mBAAmB,IAAI,MAAM;IAI7B;;OAEG;IACH,QAAQ,IAAI,OAAO;CAGpB;AAMD;;GAEG;AACH,wBAAsB,aAAa,CACjC,YAAY,EAAE,MAAM,EACpB,OAAO,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,GAC/B,OAAO,CAAC,gBAAgB,CAAC,CAS3B"}
|