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.
Files changed (134) hide show
  1. package/README.md +69 -0
  2. package/dist/bridge/index.d.ts +8 -0
  3. package/dist/bridge/index.d.ts.map +1 -0
  4. package/dist/bridge/index.js +8 -0
  5. package/dist/bridge/index.js.map +1 -0
  6. package/dist/bridge/json-interchange.d.ts +94 -0
  7. package/dist/bridge/json-interchange.d.ts.map +1 -0
  8. package/dist/bridge/json-interchange.js +301 -0
  9. package/dist/bridge/json-interchange.js.map +1 -0
  10. package/dist/cli/commands/amend.d.ts +12 -0
  11. package/dist/cli/commands/amend.d.ts.map +1 -0
  12. package/dist/cli/commands/amend.js +205 -0
  13. package/dist/cli/commands/amend.js.map +1 -0
  14. package/dist/cli/commands/daemon.d.ts +12 -0
  15. package/dist/cli/commands/daemon.d.ts.map +1 -0
  16. package/dist/cli/commands/daemon.js +60 -0
  17. package/dist/cli/commands/daemon.js.map +1 -0
  18. package/dist/cli/commands/dispatch.d.ts +12 -0
  19. package/dist/cli/commands/dispatch.d.ts.map +1 -0
  20. package/dist/cli/commands/dispatch.js +207 -0
  21. package/dist/cli/commands/dispatch.js.map +1 -0
  22. package/dist/cli/commands/handoff.d.ts +31 -0
  23. package/dist/cli/commands/handoff.d.ts.map +1 -0
  24. package/dist/cli/commands/handoff.js +273 -0
  25. package/dist/cli/commands/handoff.js.map +1 -0
  26. package/dist/cli/commands/init.d.ts +12 -0
  27. package/dist/cli/commands/init.d.ts.map +1 -0
  28. package/dist/cli/commands/init.js +301 -0
  29. package/dist/cli/commands/init.js.map +1 -0
  30. package/dist/cli/commands/status.d.ts +12 -0
  31. package/dist/cli/commands/status.d.ts.map +1 -0
  32. package/dist/cli/commands/status.js +206 -0
  33. package/dist/cli/commands/status.js.map +1 -0
  34. package/dist/cli/index.d.ts +17 -0
  35. package/dist/cli/index.d.ts.map +1 -0
  36. package/dist/cli/index.js +148 -0
  37. package/dist/cli/index.js.map +1 -0
  38. package/dist/handoff/encryption.d.ts +85 -0
  39. package/dist/handoff/encryption.d.ts.map +1 -0
  40. package/dist/handoff/encryption.js +308 -0
  41. package/dist/handoff/encryption.js.map +1 -0
  42. package/dist/handoff/index.d.ts +8 -0
  43. package/dist/handoff/index.d.ts.map +1 -0
  44. package/dist/handoff/index.js +10 -0
  45. package/dist/handoff/index.js.map +1 -0
  46. package/dist/handoff/mycelium-arc.d.ts +116 -0
  47. package/dist/handoff/mycelium-arc.d.ts.map +1 -0
  48. package/dist/handoff/mycelium-arc.js +410 -0
  49. package/dist/handoff/mycelium-arc.js.map +1 -0
  50. package/dist/index.d.ts +38 -0
  51. package/dist/index.d.ts.map +1 -0
  52. package/dist/index.js +71 -0
  53. package/dist/index.js.map +1 -0
  54. package/dist/parsers/index.d.ts +10 -0
  55. package/dist/parsers/index.d.ts.map +1 -0
  56. package/dist/parsers/index.js +12 -0
  57. package/dist/parsers/index.js.map +1 -0
  58. package/dist/parsers/plan-parser.d.ts +29 -0
  59. package/dist/parsers/plan-parser.d.ts.map +1 -0
  60. package/dist/parsers/plan-parser.js +503 -0
  61. package/dist/parsers/plan-parser.js.map +1 -0
  62. package/dist/parsers/spec-parser.d.ts +10 -0
  63. package/dist/parsers/spec-parser.d.ts.map +1 -0
  64. package/dist/parsers/spec-parser.js +382 -0
  65. package/dist/parsers/spec-parser.js.map +1 -0
  66. package/dist/parsers/state-parser.d.ts +21 -0
  67. package/dist/parsers/state-parser.d.ts.map +1 -0
  68. package/dist/parsers/state-parser.js +378 -0
  69. package/dist/parsers/state-parser.js.map +1 -0
  70. package/dist/parsers/types.d.ts +190 -0
  71. package/dist/parsers/types.d.ts.map +1 -0
  72. package/dist/parsers/types.js +7 -0
  73. package/dist/parsers/types.js.map +1 -0
  74. package/dist/schemas/cognitive-state.d.ts +1523 -0
  75. package/dist/schemas/cognitive-state.d.ts.map +1 -0
  76. package/dist/schemas/cognitive-state.js +328 -0
  77. package/dist/schemas/cognitive-state.js.map +1 -0
  78. package/dist/schemas/enums.d.ts +124 -0
  79. package/dist/schemas/enums.d.ts.map +1 -0
  80. package/dist/schemas/enums.js +108 -0
  81. package/dist/schemas/enums.js.map +1 -0
  82. package/dist/schemas/index.d.ts +9 -0
  83. package/dist/schemas/index.d.ts.map +1 -0
  84. package/dist/schemas/index.js +9 -0
  85. package/dist/schemas/index.js.map +1 -0
  86. package/dist/sync/adhd-continuity.d.ts +91 -0
  87. package/dist/sync/adhd-continuity.d.ts.map +1 -0
  88. package/dist/sync/adhd-continuity.js +302 -0
  89. package/dist/sync/adhd-continuity.js.map +1 -0
  90. package/dist/sync/convergence-tracker.d.ts +111 -0
  91. package/dist/sync/convergence-tracker.d.ts.map +1 -0
  92. package/dist/sync/convergence-tracker.js +299 -0
  93. package/dist/sync/convergence-tracker.js.map +1 -0
  94. package/dist/sync/index.d.ts +11 -0
  95. package/dist/sync/index.d.ts.map +1 -0
  96. package/dist/sync/index.js +15 -0
  97. package/dist/sync/index.js.map +1 -0
  98. package/dist/sync/state-sync.d.ts +105 -0
  99. package/dist/sync/state-sync.d.ts.map +1 -0
  100. package/dist/sync/state-sync.js +403 -0
  101. package/dist/sync/state-sync.js.map +1 -0
  102. package/dist/sync/watcher.d.ts +90 -0
  103. package/dist/sync/watcher.d.ts.map +1 -0
  104. package/dist/sync/watcher.js +281 -0
  105. package/dist/sync/watcher.js.map +1 -0
  106. package/dist/utils/atomic-write.d.ts +31 -0
  107. package/dist/utils/atomic-write.d.ts.map +1 -0
  108. package/dist/utils/atomic-write.js +69 -0
  109. package/dist/utils/atomic-write.js.map +1 -0
  110. package/dist/utils/error-handling.d.ts +70 -0
  111. package/dist/utils/error-handling.d.ts.map +1 -0
  112. package/dist/utils/error-handling.js +109 -0
  113. package/dist/utils/error-handling.js.map +1 -0
  114. package/dist/utils/file-lock.d.ts +46 -0
  115. package/dist/utils/file-lock.d.ts.map +1 -0
  116. package/dist/utils/file-lock.js +117 -0
  117. package/dist/utils/file-lock.js.map +1 -0
  118. package/dist/utils/index.d.ts +10 -0
  119. package/dist/utils/index.d.ts.map +1 -0
  120. package/dist/utils/index.js +12 -0
  121. package/dist/utils/index.js.map +1 -0
  122. package/dist/utils/rlm-navigator.d.ts +160 -0
  123. package/dist/utils/rlm-navigator.d.ts.map +1 -0
  124. package/dist/utils/rlm-navigator.js +368 -0
  125. package/dist/utils/rlm-navigator.js.map +1 -0
  126. package/dist/utils/safe-path.d.ts +44 -0
  127. package/dist/utils/safe-path.d.ts.map +1 -0
  128. package/dist/utils/safe-path.js +96 -0
  129. package/dist/utils/safe-path.js.map +1 -0
  130. package/dist/utils/timed-io.d.ts +51 -0
  131. package/dist/utils/timed-io.d.ts.map +1 -0
  132. package/dist/utils/timed-io.js +128 -0
  133. package/dist/utils/timed-io.js.map +1 -0
  134. 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"}