@intutic/sync-daemon 1.6.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 +73 -0
- package/dist/brainIndexer.d.ts +51 -0
- package/dist/brainIndexer.d.ts.map +1 -0
- package/dist/brainIndexer.js +148 -0
- package/dist/brainIndexer.js.map +1 -0
- package/dist/configReader.d.ts +46 -0
- package/dist/configReader.d.ts.map +1 -0
- package/dist/configReader.js +133 -0
- package/dist/configReader.js.map +1 -0
- package/dist/configWriter.d.ts +53 -0
- package/dist/configWriter.d.ts.map +1 -0
- package/dist/configWriter.js +503 -0
- package/dist/configWriter.js.map +1 -0
- package/dist/harness/aiderConfigMerger.d.ts +27 -0
- package/dist/harness/aiderConfigMerger.d.ts.map +1 -0
- package/dist/harness/aiderConfigMerger.js +139 -0
- package/dist/harness/aiderConfigMerger.js.map +1 -0
- package/dist/harness/antigravityHooks.d.ts +43 -0
- package/dist/harness/antigravityHooks.d.ts.map +1 -0
- package/dist/harness/antigravityHooks.js +193 -0
- package/dist/harness/antigravityHooks.js.map +1 -0
- package/dist/harness/claudeCodeHooks.d.ts +59 -0
- package/dist/harness/claudeCodeHooks.d.ts.map +1 -0
- package/dist/harness/claudeCodeHooks.js +414 -0
- package/dist/harness/claudeCodeHooks.js.map +1 -0
- package/dist/harness/claudeDesktopHooks.d.ts +30 -0
- package/dist/harness/claudeDesktopHooks.d.ts.map +1 -0
- package/dist/harness/claudeDesktopHooks.js +267 -0
- package/dist/harness/claudeDesktopHooks.js.map +1 -0
- package/dist/harness/clineHooks.d.ts +23 -0
- package/dist/harness/clineHooks.d.ts.map +1 -0
- package/dist/harness/clineHooks.js +169 -0
- package/dist/harness/clineHooks.js.map +1 -0
- package/dist/harness/continueHooks.d.ts +33 -0
- package/dist/harness/continueHooks.d.ts.map +1 -0
- package/dist/harness/continueHooks.js +124 -0
- package/dist/harness/continueHooks.js.map +1 -0
- package/dist/harness/cursorHooks.d.ts +27 -0
- package/dist/harness/cursorHooks.d.ts.map +1 -0
- package/dist/harness/cursorHooks.js +221 -0
- package/dist/harness/cursorHooks.js.map +1 -0
- package/dist/harness/cursorHooksJson.d.ts +29 -0
- package/dist/harness/cursorHooksJson.d.ts.map +1 -0
- package/dist/harness/cursorHooksJson.js +130 -0
- package/dist/harness/cursorHooksJson.js.map +1 -0
- package/dist/harness/gooseHardener.d.ts +39 -0
- package/dist/harness/gooseHardener.d.ts.map +1 -0
- package/dist/harness/gooseHardener.js +152 -0
- package/dist/harness/gooseHardener.js.map +1 -0
- package/dist/harness/gooseHooks.d.ts +24 -0
- package/dist/harness/gooseHooks.d.ts.map +1 -0
- package/dist/harness/gooseHooks.js +175 -0
- package/dist/harness/gooseHooks.js.map +1 -0
- package/dist/harness/gooseHooksWriter.d.ts +27 -0
- package/dist/harness/gooseHooksWriter.d.ts.map +1 -0
- package/dist/harness/gooseHooksWriter.js +147 -0
- package/dist/harness/gooseHooksWriter.js.map +1 -0
- package/dist/harness/hermesHooks.d.ts +31 -0
- package/dist/harness/hermesHooks.d.ts.map +1 -0
- package/dist/harness/hermesHooks.js +245 -0
- package/dist/harness/hermesHooks.js.map +1 -0
- package/dist/harness/mcpAutoWrite.d.ts +35 -0
- package/dist/harness/mcpAutoWrite.d.ts.map +1 -0
- package/dist/harness/mcpAutoWrite.js +334 -0
- package/dist/harness/mcpAutoWrite.js.map +1 -0
- package/dist/harness/n8nHooks.d.ts +28 -0
- package/dist/harness/n8nHooks.d.ts.map +1 -0
- package/dist/harness/n8nHooks.js +205 -0
- package/dist/harness/n8nHooks.js.map +1 -0
- package/dist/harness/openWebuiHooks.d.ts +31 -0
- package/dist/harness/openWebuiHooks.d.ts.map +1 -0
- package/dist/harness/openWebuiHooks.js +166 -0
- package/dist/harness/openWebuiHooks.js.map +1 -0
- package/dist/harness/openclawHooks.d.ts +34 -0
- package/dist/harness/openclawHooks.d.ts.map +1 -0
- package/dist/harness/openclawHooks.js +296 -0
- package/dist/harness/openclawHooks.js.map +1 -0
- package/dist/harness/openhandsHooks.d.ts +24 -0
- package/dist/harness/openhandsHooks.d.ts.map +1 -0
- package/dist/harness/openhandsHooks.js +178 -0
- package/dist/harness/openhandsHooks.js.map +1 -0
- package/dist/harness/openhandsHooksWriter.d.ts +23 -0
- package/dist/harness/openhandsHooksWriter.d.ts.map +1 -0
- package/dist/harness/openhandsHooksWriter.js +146 -0
- package/dist/harness/openhandsHooksWriter.js.map +1 -0
- package/dist/harness/piHooks.d.ts +32 -0
- package/dist/harness/piHooks.d.ts.map +1 -0
- package/dist/harness/piHooks.js +257 -0
- package/dist/harness/piHooks.js.map +1 -0
- package/dist/harness/rooCodeHooks.d.ts +31 -0
- package/dist/harness/rooCodeHooks.d.ts.map +1 -0
- package/dist/harness/rooCodeHooks.js +300 -0
- package/dist/harness/rooCodeHooks.js.map +1 -0
- package/dist/harness/windsurfHooks.d.ts +27 -0
- package/dist/harness/windsurfHooks.d.ts.map +1 -0
- package/dist/harness/windsurfHooks.js +202 -0
- package/dist/harness/windsurfHooks.js.map +1 -0
- package/dist/hashReporter.d.ts +33 -0
- package/dist/hashReporter.d.ts.map +1 -0
- package/dist/hashReporter.js +69 -0
- package/dist/hashReporter.js.map +1 -0
- package/dist/index.d.ts +43 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +43 -0
- package/dist/index.js.map +1 -0
- package/dist/integrityStore.d.ts +43 -0
- package/dist/integrityStore.d.ts.map +1 -0
- package/dist/integrityStore.js +94 -0
- package/dist/integrityStore.js.map +1 -0
- package/dist/lib/complianceProbes.d.ts +39 -0
- package/dist/lib/complianceProbes.d.ts.map +1 -0
- package/dist/lib/complianceProbes.js +115 -0
- package/dist/lib/complianceProbes.js.map +1 -0
- package/dist/lib/processPoller.d.ts +2 -0
- package/dist/lib/processPoller.d.ts.map +1 -0
- package/dist/lib/processPoller.js +87 -0
- package/dist/lib/processPoller.js.map +1 -0
- package/dist/lib/runtimeEnv.d.ts +49 -0
- package/dist/lib/runtimeEnv.d.ts.map +1 -0
- package/dist/lib/runtimeEnv.js +70 -0
- package/dist/lib/runtimeEnv.js.map +1 -0
- package/dist/skillWriter.d.ts +24 -0
- package/dist/skillWriter.d.ts.map +1 -0
- package/dist/skillWriter.js +112 -0
- package/dist/skillWriter.js.map +1 -0
- package/dist/syncLoop.d.ts +70 -0
- package/dist/syncLoop.d.ts.map +1 -0
- package/dist/syncLoop.js +546 -0
- package/dist/syncLoop.js.map +1 -0
- package/dist/trajectoryMonitor.d.ts +126 -0
- package/dist/trajectoryMonitor.d.ts.map +1 -0
- package/dist/trajectoryMonitor.js +291 -0
- package/dist/trajectoryMonitor.js.map +1 -0
- package/dist/watcher/driftWatcher.d.ts +25 -0
- package/dist/watcher/driftWatcher.d.ts.map +1 -0
- package/dist/watcher/driftWatcher.js +72 -0
- package/dist/watcher/driftWatcher.js.map +1 -0
- package/dist/watcher/settingsGuard.d.ts +32 -0
- package/dist/watcher/settingsGuard.d.ts.map +1 -0
- package/dist/watcher/settingsGuard.js +250 -0
- package/dist/watcher/settingsGuard.js.map +1 -0
- package/dist/wsClient.d.ts +49 -0
- package/dist/wsClient.d.ts.map +1 -0
- package/dist/wsClient.js +149 -0
- package/dist/wsClient.js.map +1 -0
- package/package.json +96 -0
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* settingsGuard.ts — Multi-harness governance config tamper detection & restoration.
|
|
3
|
+
*
|
|
4
|
+
* Expanded from Claude Code-only to cover all 18 Intutic-supported harnesses.
|
|
5
|
+
* Called by the drift watcher whenever any protected governance config file changes.
|
|
6
|
+
*
|
|
7
|
+
* Behaviour per path type:
|
|
8
|
+
* - JSON hook files (Cursor, Cline, OpenHands, Goose): validate marker presence, restore.
|
|
9
|
+
* - Immutable files (Goose plugin): log governance_override_attempt incident instead of restoring.
|
|
10
|
+
* - Text rules (.roorules, .clinerules): restore from last-written hash.
|
|
11
|
+
* - Settings files (VS Code, Aider, claude_desktop_config.json): detect drift, restore.
|
|
12
|
+
*
|
|
13
|
+
* LLD #14 — settingsGuard.ts
|
|
14
|
+
* HLD §3.14 — Three-Tier Defense Cascade (Tier 1 Native Gating)
|
|
15
|
+
*
|
|
16
|
+
* @module
|
|
17
|
+
*/
|
|
18
|
+
import * as fs from 'node:fs/promises';
|
|
19
|
+
import * as path from 'node:path';
|
|
20
|
+
import * as os from 'node:os';
|
|
21
|
+
import * as crypto from 'node:crypto';
|
|
22
|
+
import { createLogger } from '@intutic/logger';
|
|
23
|
+
import { updatePreToolUseHooks, parseSopConstraints } from '../harness/claudeCodeHooks.js';
|
|
24
|
+
import { writeClineHooks } from '../harness/clineHooks.js';
|
|
25
|
+
import { writeCursorHooks } from '../harness/cursorHooks.js';
|
|
26
|
+
import { writeOpenHandsHooks } from '../harness/openhandsHooks.js';
|
|
27
|
+
import { writeGooseHooks } from '../harness/gooseHooks.js';
|
|
28
|
+
import { writeWindsurfHooks } from '../harness/windsurfHooks.js';
|
|
29
|
+
import { isImmutable } from '../harness/gooseHardener.js';
|
|
30
|
+
const log = createLogger('sync-settings-guard');
|
|
31
|
+
/** Marker embedded in every Intutic-generated hook command. */
|
|
32
|
+
const HOOK_MARKER = '.intutic/hooks/';
|
|
33
|
+
const home = os.homedir();
|
|
34
|
+
// ─── All protected paths, grouped by harness ─────────────────────────
|
|
35
|
+
/** Returns the full list of protected paths to watch. */
|
|
36
|
+
export function buildProtectedPaths(workspaceRoot) {
|
|
37
|
+
return [
|
|
38
|
+
// ── Claude Code ──────────────────────────────────────────────────
|
|
39
|
+
path.join(home, '.claude', 'settings.json'),
|
|
40
|
+
path.join(workspaceRoot, '.claude', 'settings.json'),
|
|
41
|
+
// ── Cursor (3 levels) ────────────────────────────────────────────
|
|
42
|
+
'/etc/cursor/hooks.json',
|
|
43
|
+
path.join(home, '.cursor', 'hooks.json'),
|
|
44
|
+
path.join(workspaceRoot, '.cursor', 'hooks.json'),
|
|
45
|
+
// ── Windsurf ─────────────────────────────────────────────────────
|
|
46
|
+
path.join(home, '.codeium', 'windsurf', 'hooks.json'),
|
|
47
|
+
path.join(home, '.codeium', 'windsurf', 'settings.json'),
|
|
48
|
+
path.join(workspaceRoot, '.windsurf', 'hooks.json'),
|
|
49
|
+
// ── Cline ────────────────────────────────────────────────────────
|
|
50
|
+
path.join(workspaceRoot, '.clinerules', 'hooks', 'hooks.json'),
|
|
51
|
+
// ── OpenHands ────────────────────────────────────────────────────
|
|
52
|
+
path.join(workspaceRoot, '.openhands', 'hooks.json'),
|
|
53
|
+
// ── Goose (immutable — incident on tamper, not silent restore) ───
|
|
54
|
+
path.join(home, '.agents', 'plugins', 'intutic-governance', 'hooks', 'hooks.json'),
|
|
55
|
+
// ── Roo Code ─────────────────────────────────────────────────────
|
|
56
|
+
path.join(workspaceRoot, '.roorules'),
|
|
57
|
+
// ── VS Code settings (Cline / Roo Code) ──────────────────────────
|
|
58
|
+
path.join(home, '.config', 'Code', 'User', 'settings.json'),
|
|
59
|
+
path.join(home, 'Library', 'Application Support', 'Code', 'User', 'settings.json'),
|
|
60
|
+
path.join(workspaceRoot, '.vscode', 'settings.json'),
|
|
61
|
+
// ── Claude Desktop ────────────────────────────────────────────────
|
|
62
|
+
path.join(home, 'Library', 'Application Support', 'Claude', 'claude_desktop_config.json'),
|
|
63
|
+
path.join(home, '.config', 'Claude', 'claude_desktop_config.json'),
|
|
64
|
+
// ── Antigravity ───────────────────────────────────────────────────
|
|
65
|
+
path.join(workspaceRoot, '.gemini', 'settings.json'),
|
|
66
|
+
];
|
|
67
|
+
}
|
|
68
|
+
// ─── Public entry point ──────────────────────────────────────────────
|
|
69
|
+
/**
|
|
70
|
+
* Inspect any protected governance config file and restore if tampered.
|
|
71
|
+
*
|
|
72
|
+
* @param changedPath - Absolute path of the file that changed.
|
|
73
|
+
* @param workspaceRoot - Workspace root for restoration helpers.
|
|
74
|
+
* @param sops - Current SOP list.
|
|
75
|
+
* @param proxyUrl - Current proxy URL.
|
|
76
|
+
* @param settings - Optional passthrough settings.
|
|
77
|
+
* @returns true if tampering was detected.
|
|
78
|
+
*/
|
|
79
|
+
export async function guardSettingsFile(changedPath, workspaceRoot, sops, proxyUrl = '', settings) {
|
|
80
|
+
// ── Goose plugin: immutable file tamper → incident, not restore ───
|
|
81
|
+
if (changedPath.includes('intutic-governance')) {
|
|
82
|
+
if (await isImmutable(changedPath)) {
|
|
83
|
+
log.error({ action: 'governance_override_attempt', path: changedPath }, 'SECURITY: Immutable Goose governance file was modified — OS immutable flag bypassed. Emitting incident.');
|
|
84
|
+
// Resolve workspace ID from process env or local runtime-env file
|
|
85
|
+
let workspaceId = process.env.INTUTIC_WORKSPACE_ID || '';
|
|
86
|
+
if (!workspaceId) {
|
|
87
|
+
try {
|
|
88
|
+
const envPath = path.join(workspaceRoot, '.intutic', 'runtime-env');
|
|
89
|
+
const content = await fs.readFile(envPath, 'utf8');
|
|
90
|
+
const match = content.match(/INTUTIC_WORKSPACE_ID=(.+)/);
|
|
91
|
+
if (match && match[1]) {
|
|
92
|
+
workspaceId = match[1].trim();
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
workspaceId = 'unknown';
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
// Emit incident to control plane via local hook-events queue
|
|
100
|
+
try {
|
|
101
|
+
const tamperEntry = JSON.stringify({
|
|
102
|
+
event: 'config_tamper',
|
|
103
|
+
toolName: 'goose_plugin',
|
|
104
|
+
reason: 'SECURITY: Immutable Goose governance file was modified — OS immutable flag bypassed.',
|
|
105
|
+
workspaceId,
|
|
106
|
+
filePath: changedPath,
|
|
107
|
+
timestamp: new Date().toISOString(),
|
|
108
|
+
incidentId: crypto.createHash('sha1').update(changedPath + Date.now()).digest('hex').slice(0, 16),
|
|
109
|
+
}) + '\n';
|
|
110
|
+
const hookEventsJsonl = path.join(os.homedir(), '.intutic', 'events', 'hook-events.jsonl');
|
|
111
|
+
await fs.appendFile(hookEventsJsonl, tamperEntry, { flag: 'a' });
|
|
112
|
+
}
|
|
113
|
+
catch (err) {
|
|
114
|
+
log.warn({ err }, 'Failed to write Goose tamper incident to hook-events log');
|
|
115
|
+
}
|
|
116
|
+
return true;
|
|
117
|
+
}
|
|
118
|
+
// Not immutable (install in progress or first write) — restore normally
|
|
119
|
+
await writeGooseHooks(proxyUrl);
|
|
120
|
+
return true;
|
|
121
|
+
}
|
|
122
|
+
// ── Claude Code settings.json ─────────────────────────────────────
|
|
123
|
+
if (changedPath.includes('.claude') && changedPath.endsWith('settings.json')) {
|
|
124
|
+
return guardClaudeCodeSettings(changedPath, workspaceRoot, sops, settings);
|
|
125
|
+
}
|
|
126
|
+
// ── Cursor hooks.json ─────────────────────────────────────────────
|
|
127
|
+
if (changedPath.includes('.cursor') && changedPath.endsWith('hooks.json')) {
|
|
128
|
+
return guardJsonHookFile(changedPath, 'cursor', async () => {
|
|
129
|
+
await writeCursorHooks(workspaceRoot, proxyUrl, '', changedPath.startsWith('/etc'));
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
// ── Windsurf hooks.json ───────────────────────────────────────────
|
|
133
|
+
if ((changedPath.includes('.codeium') || changedPath.includes('.windsurf')) && changedPath.endsWith('hooks.json')) {
|
|
134
|
+
return guardJsonHookFile(changedPath, 'windsurf', async () => {
|
|
135
|
+
await writeWindsurfHooks(workspaceRoot, proxyUrl);
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
// ── Cline hooks.json ──────────────────────────────────────────────
|
|
139
|
+
if (changedPath.includes('.clinerules') && changedPath.endsWith('hooks.json')) {
|
|
140
|
+
return guardJsonHookFile(changedPath, 'cline', async () => {
|
|
141
|
+
await writeClineHooks(workspaceRoot, proxyUrl);
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
// ── OpenHands hooks.json ──────────────────────────────────────────
|
|
145
|
+
if (changedPath.includes('.openhands') && changedPath.endsWith('hooks.json')) {
|
|
146
|
+
return guardJsonHookFile(changedPath, 'openhands', async () => {
|
|
147
|
+
await writeOpenHandsHooks(workspaceRoot, proxyUrl);
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
// ── All other paths: file deleted or corrupted → log drift incident
|
|
151
|
+
const exists = await fileExists(changedPath);
|
|
152
|
+
if (!exists) {
|
|
153
|
+
log.warn({ action: 'governance_drift', path: changedPath }, `Governance config deleted: ${changedPath}`);
|
|
154
|
+
// Emit drift event — restoration depends on harness type (handled above for active harnesses)
|
|
155
|
+
return true;
|
|
156
|
+
}
|
|
157
|
+
log.debug({ action: 'settings_intact', path: changedPath }, 'Protected file changed but no action required');
|
|
158
|
+
return false;
|
|
159
|
+
}
|
|
160
|
+
// ─── Internal helpers ────────────────────────────────────────────────
|
|
161
|
+
async function guardClaudeCodeSettings(settingsFilePath, workspaceRoot, sops, settings) {
|
|
162
|
+
let raw;
|
|
163
|
+
try {
|
|
164
|
+
raw = await fs.readFile(settingsFilePath, 'utf-8');
|
|
165
|
+
}
|
|
166
|
+
catch {
|
|
167
|
+
log.warn({ action: 'settings_deleted', path: settingsFilePath }, 'Claude Code settings.json deleted — restoring');
|
|
168
|
+
await updatePreToolUseHooks(workspaceRoot, sops, settings);
|
|
169
|
+
return true;
|
|
170
|
+
}
|
|
171
|
+
let parsed;
|
|
172
|
+
try {
|
|
173
|
+
parsed = JSON.parse(raw);
|
|
174
|
+
}
|
|
175
|
+
catch {
|
|
176
|
+
log.warn({ action: 'settings_corrupted', path: settingsFilePath }, 'Claude Code settings.json corrupted — restoring');
|
|
177
|
+
await updatePreToolUseHooks(workspaceRoot, sops, settings);
|
|
178
|
+
return true;
|
|
179
|
+
}
|
|
180
|
+
const hooks = parsed.hooks ?? {};
|
|
181
|
+
const preToolUse = hooks.PreToolUse ?? [];
|
|
182
|
+
const hasIntuticHook = preToolUse.some((entry) => {
|
|
183
|
+
if (typeof entry !== 'object' || entry === null)
|
|
184
|
+
return false;
|
|
185
|
+
const h = entry.hooks ?? [];
|
|
186
|
+
return h.some((hh) => typeof hh.command === 'string'
|
|
187
|
+
&& String(hh.command).includes(HOOK_MARKER));
|
|
188
|
+
});
|
|
189
|
+
if (!hasIntuticHook) {
|
|
190
|
+
log.warn({ action: 'hook_missing', path: settingsFilePath }, 'Claude Code PreToolUse hook missing — restoring');
|
|
191
|
+
await updatePreToolUseHooks(workspaceRoot, sops, settings);
|
|
192
|
+
return true;
|
|
193
|
+
}
|
|
194
|
+
const deny = parsed.permissions?.deny ?? [];
|
|
195
|
+
const constraints = parseSopConstraints(sops, settings);
|
|
196
|
+
const expectedDenyCount = constraints.highRiskTools.length + constraints.patterns.length;
|
|
197
|
+
if (deny.length < expectedDenyCount) {
|
|
198
|
+
log.warn({ action: 'deny_rules_cleared', path: settingsFilePath }, 'Deny rules cleared — restoring');
|
|
199
|
+
await updatePreToolUseHooks(workspaceRoot, sops, settings);
|
|
200
|
+
return true;
|
|
201
|
+
}
|
|
202
|
+
log.debug({ action: 'settings_intact', path: settingsFilePath }, 'Claude Code settings integrity OK');
|
|
203
|
+
return false;
|
|
204
|
+
}
|
|
205
|
+
async function guardJsonHookFile(filePath, harness, restore) {
|
|
206
|
+
let raw;
|
|
207
|
+
try {
|
|
208
|
+
raw = await fs.readFile(filePath, 'utf-8');
|
|
209
|
+
}
|
|
210
|
+
catch {
|
|
211
|
+
log.warn({ action: 'hook_file_deleted', harness, path: filePath }, `${harness} hooks.json deleted — restoring`);
|
|
212
|
+
await safeRestore(harness, restore);
|
|
213
|
+
return true;
|
|
214
|
+
}
|
|
215
|
+
try {
|
|
216
|
+
const parsed = JSON.parse(raw);
|
|
217
|
+
// Check that the Intutic marker is present in the hooks config
|
|
218
|
+
const hasMarker = JSON.stringify(parsed).includes('intutic');
|
|
219
|
+
if (!hasMarker) {
|
|
220
|
+
log.warn({ action: 'hook_marker_missing', harness, path: filePath }, `${harness} hooks.json tampered — restoring`);
|
|
221
|
+
await safeRestore(harness, restore);
|
|
222
|
+
return true;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
catch {
|
|
226
|
+
log.warn({ action: 'hook_file_corrupted', harness, path: filePath }, `${harness} hooks.json corrupted — restoring`);
|
|
227
|
+
await safeRestore(harness, restore);
|
|
228
|
+
return true;
|
|
229
|
+
}
|
|
230
|
+
return false;
|
|
231
|
+
}
|
|
232
|
+
async function safeRestore(harness, restore) {
|
|
233
|
+
try {
|
|
234
|
+
await restore();
|
|
235
|
+
log.info({ action: 'hook_restored', harness }, `${harness} governance hooks restored`);
|
|
236
|
+
}
|
|
237
|
+
catch (err) {
|
|
238
|
+
log.error({ action: 'hook_restore_failed', harness, err }, `Failed to restore ${harness} governance hooks`);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
async function fileExists(p) {
|
|
242
|
+
try {
|
|
243
|
+
await fs.access(p);
|
|
244
|
+
return true;
|
|
245
|
+
}
|
|
246
|
+
catch {
|
|
247
|
+
return false;
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
//# sourceMappingURL=settingsGuard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settingsGuard.js","sourceRoot":"","sources":["../../src/watcher/settingsGuard.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* wsClient.ts — WebSocket client for real-time config updates.
|
|
3
|
+
*
|
|
4
|
+
* Establishes a persistent, auto-reconnecting WebSocket connection to
|
|
5
|
+
* the control plane. When a `config_update` event is received, it
|
|
6
|
+
* immediately applies the new configuration, bypassing HTTP polling latency.
|
|
7
|
+
*
|
|
8
|
+
* LLD #14 — wsClient.ts
|
|
9
|
+
* HLD §3.14 — Real-Time State Mirroring (WebSocket push)
|
|
10
|
+
*
|
|
11
|
+
* @module
|
|
12
|
+
*/
|
|
13
|
+
import type { SyncConfigPayload } from '@intutic/shared-types';
|
|
14
|
+
export interface WsClientOptions {
|
|
15
|
+
controlPlaneUrl: string;
|
|
16
|
+
apiKey: string;
|
|
17
|
+
workspaceId: string;
|
|
18
|
+
onConfigUpdate: (config: SyncConfigPayload) => Promise<void>;
|
|
19
|
+
onContextSyncTrigger?: (adapterId: string) => Promise<void>;
|
|
20
|
+
onActiveLocalSopsUpdate?: (activeLocalSops: string[]) => Promise<void>;
|
|
21
|
+
signal?: AbortSignal;
|
|
22
|
+
}
|
|
23
|
+
export declare class SyncWsClient {
|
|
24
|
+
private readonly options;
|
|
25
|
+
private ws;
|
|
26
|
+
private reconnectTimeout;
|
|
27
|
+
private pingInterval;
|
|
28
|
+
private reconnectAttempt;
|
|
29
|
+
private maxReconnectDelayMs;
|
|
30
|
+
private baseReconnectDelayMs;
|
|
31
|
+
private isClosed;
|
|
32
|
+
constructor(options: WsClientOptions);
|
|
33
|
+
/**
|
|
34
|
+
* Start the connection.
|
|
35
|
+
*/
|
|
36
|
+
connect(): void;
|
|
37
|
+
/**
|
|
38
|
+
* Send a custom event or report to the control plane.
|
|
39
|
+
*/
|
|
40
|
+
send(message: unknown): void;
|
|
41
|
+
/**
|
|
42
|
+
* Close the connection.
|
|
43
|
+
*/
|
|
44
|
+
close(): void;
|
|
45
|
+
private startHeartbeat;
|
|
46
|
+
private scheduleReconnect;
|
|
47
|
+
private cleanup;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=wsClient.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wsClient.d.ts","sourceRoot":"","sources":["../src/wsClient.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAA;AAI9D,MAAM,WAAW,eAAe;IAC9B,eAAe,EAAE,MAAM,CAAA;IACvB,MAAM,EAAE,MAAM,CAAA;IACd,WAAW,EAAE,MAAM,CAAA;IACnB,cAAc,EAAE,CAAC,MAAM,EAAE,iBAAiB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAC5D,oBAAoB,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAC3D,uBAAuB,CAAC,EAAE,CAAC,eAAe,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACtE,MAAM,CAAC,EAAE,WAAW,CAAA;CACrB;AAED,qBAAa,YAAY;IASX,OAAO,CAAC,QAAQ,CAAC,OAAO;IARpC,OAAO,CAAC,EAAE,CAAyB;IACnC,OAAO,CAAC,gBAAgB,CAA8B;IACtD,OAAO,CAAC,YAAY,CAA8B;IAClD,OAAO,CAAC,gBAAgB,CAAI;IAC5B,OAAO,CAAC,mBAAmB,CAAQ;IACnC,OAAO,CAAC,oBAAoB,CAAO;IACnC,OAAO,CAAC,QAAQ,CAAQ;gBAEK,OAAO,EAAE,eAAe;IAQrD;;OAEG;IACH,OAAO,IAAI,IAAI;IA6Df;;OAEG;IACH,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAQ5B;;OAEG;IACH,KAAK,IAAI,IAAI;IAcb,OAAO,CAAC,cAAc;IAQtB,OAAO,CAAC,iBAAiB;IAgBzB,OAAO,CAAC,OAAO;CAUhB"}
|
package/dist/wsClient.js
ADDED
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* wsClient.ts — WebSocket client for real-time config updates.
|
|
3
|
+
*
|
|
4
|
+
* Establishes a persistent, auto-reconnecting WebSocket connection to
|
|
5
|
+
* the control plane. When a `config_update` event is received, it
|
|
6
|
+
* immediately applies the new configuration, bypassing HTTP polling latency.
|
|
7
|
+
*
|
|
8
|
+
* LLD #14 — wsClient.ts
|
|
9
|
+
* HLD §3.14 — Real-Time State Mirroring (WebSocket push)
|
|
10
|
+
*
|
|
11
|
+
* @module
|
|
12
|
+
*/
|
|
13
|
+
import WebSocket from 'ws';
|
|
14
|
+
import { createLogger } from '@intutic/logger';
|
|
15
|
+
const log = createLogger('sync-ws-client');
|
|
16
|
+
export class SyncWsClient {
|
|
17
|
+
options;
|
|
18
|
+
ws = null;
|
|
19
|
+
reconnectTimeout = null;
|
|
20
|
+
pingInterval = null;
|
|
21
|
+
reconnectAttempt = 0;
|
|
22
|
+
maxReconnectDelayMs = 30000;
|
|
23
|
+
baseReconnectDelayMs = 1000;
|
|
24
|
+
isClosed = false;
|
|
25
|
+
constructor(options) {
|
|
26
|
+
this.options = options;
|
|
27
|
+
if (this.options.signal) {
|
|
28
|
+
this.options.signal.addEventListener('abort', () => {
|
|
29
|
+
this.close();
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Start the connection.
|
|
35
|
+
*/
|
|
36
|
+
connect() {
|
|
37
|
+
if (this.isClosed || (this.options.signal && this.options.signal.aborted)) {
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
// Convert http(s) URL to ws(s)
|
|
41
|
+
let wsUrl = this.options.controlPlaneUrl.replace(/^http/, 'ws');
|
|
42
|
+
if (!wsUrl.endsWith('/')) {
|
|
43
|
+
wsUrl += '/';
|
|
44
|
+
}
|
|
45
|
+
wsUrl += `api/v1/sync/ws?token=${encodeURIComponent(this.options.apiKey)}`;
|
|
46
|
+
log.info({ action: 'ws_connect_attempt', url: this.options.controlPlaneUrl }, 'Connecting to sync WebSocket server');
|
|
47
|
+
this.ws = new WebSocket(wsUrl);
|
|
48
|
+
this.ws.on('open', () => {
|
|
49
|
+
log.info({ action: 'ws_connected' }, 'WebSocket connection established');
|
|
50
|
+
this.reconnectAttempt = 0;
|
|
51
|
+
this.startHeartbeat();
|
|
52
|
+
});
|
|
53
|
+
this.ws.on('message', async (data) => {
|
|
54
|
+
try {
|
|
55
|
+
const payload = JSON.parse(data.toString());
|
|
56
|
+
log.debug({ action: 'ws_message_received', type: payload.type }, 'Received WebSocket event');
|
|
57
|
+
if (payload.type === 'config_update') {
|
|
58
|
+
// Handle config update payload
|
|
59
|
+
await this.options.onConfigUpdate(payload);
|
|
60
|
+
}
|
|
61
|
+
else if (payload.type === 'active_local_sops_update') {
|
|
62
|
+
if (this.options.onActiveLocalSopsUpdate) {
|
|
63
|
+
await this.options.onActiveLocalSopsUpdate(payload.activeLocalSops);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
else if (payload.type === 'context_sync_trigger') {
|
|
67
|
+
// Trigger a ContextGraph filesystem scan and sync push
|
|
68
|
+
if (this.options.onContextSyncTrigger) {
|
|
69
|
+
await this.options.onContextSyncTrigger(payload.adapterId);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
else if (payload.type === 'pong') {
|
|
73
|
+
log.debug({ action: 'ws_pong' }, 'Received pong from server');
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
catch (err) {
|
|
77
|
+
log.error({ action: 'ws_message_parse_error', err }, 'Failed to parse WebSocket message');
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
this.ws.on('close', (code, reason) => {
|
|
81
|
+
this.cleanup();
|
|
82
|
+
if (!this.isClosed) {
|
|
83
|
+
log.warn({ action: 'ws_closed', code, reason: reason.toString() }, 'WebSocket connection closed. Retrying...');
|
|
84
|
+
this.scheduleReconnect();
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
this.ws.on('error', (err) => {
|
|
88
|
+
log.error({ action: 'ws_error', err }, 'WebSocket client encountered an error');
|
|
89
|
+
// Close event will follow error event, handling the reconnect
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Send a custom event or report to the control plane.
|
|
94
|
+
*/
|
|
95
|
+
send(message) {
|
|
96
|
+
if (this.ws && this.ws.readyState === WebSocket.OPEN) {
|
|
97
|
+
this.ws.send(JSON.stringify(message));
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
log.warn({ action: 'ws_send_skipped' }, 'Cannot send message: WebSocket is not open');
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Close the connection.
|
|
105
|
+
*/
|
|
106
|
+
close() {
|
|
107
|
+
this.isClosed = true;
|
|
108
|
+
this.cleanup();
|
|
109
|
+
if (this.ws) {
|
|
110
|
+
try {
|
|
111
|
+
this.ws.close();
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
// Ignore
|
|
115
|
+
}
|
|
116
|
+
this.ws = null;
|
|
117
|
+
}
|
|
118
|
+
log.info({ action: 'ws_closed_by_user' }, 'WebSocket client connection closed');
|
|
119
|
+
}
|
|
120
|
+
startHeartbeat() {
|
|
121
|
+
this.pingInterval = setInterval(() => {
|
|
122
|
+
if (this.ws && this.ws.readyState === WebSocket.OPEN) {
|
|
123
|
+
this.ws.send(JSON.stringify({ type: 'ping' }));
|
|
124
|
+
}
|
|
125
|
+
}, 30000);
|
|
126
|
+
}
|
|
127
|
+
scheduleReconnect() {
|
|
128
|
+
if (this.reconnectTimeout || this.isClosed)
|
|
129
|
+
return;
|
|
130
|
+
const delay = Math.min(this.baseReconnectDelayMs * Math.pow(2, this.reconnectAttempt), this.maxReconnectDelayMs);
|
|
131
|
+
this.reconnectAttempt++;
|
|
132
|
+
log.info({ action: 'ws_schedule_reconnect', delayMs: delay }, `Scheduling reconnect in ${delay}ms`);
|
|
133
|
+
this.reconnectTimeout = setTimeout(() => {
|
|
134
|
+
this.reconnectTimeout = null;
|
|
135
|
+
this.connect();
|
|
136
|
+
}, delay);
|
|
137
|
+
}
|
|
138
|
+
cleanup() {
|
|
139
|
+
if (this.pingInterval) {
|
|
140
|
+
clearInterval(this.pingInterval);
|
|
141
|
+
this.pingInterval = null;
|
|
142
|
+
}
|
|
143
|
+
if (this.reconnectTimeout) {
|
|
144
|
+
clearTimeout(this.reconnectTimeout);
|
|
145
|
+
this.reconnectTimeout = null;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=wsClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wsClient.js","sourceRoot":"","sources":["../src/wsClient.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@intutic/sync-daemon",
|
|
3
|
+
"version": "1.6.0",
|
|
4
|
+
"description": "Intutic Sync Daemon — bidirectional state sync between control plane and developer workspaces",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "https://github.com/intutic/intutic",
|
|
10
|
+
"directory": "services/sync-daemon"
|
|
11
|
+
},
|
|
12
|
+
"main": "./dist/index.js",
|
|
13
|
+
"types": "./dist/index.d.ts",
|
|
14
|
+
"files": [
|
|
15
|
+
"dist/",
|
|
16
|
+
"README.md"
|
|
17
|
+
],
|
|
18
|
+
"exports": {
|
|
19
|
+
".": {
|
|
20
|
+
"import": "./dist/index.js",
|
|
21
|
+
"types": "./dist/index.d.ts"
|
|
22
|
+
},
|
|
23
|
+
"./harness/clineHooks": {
|
|
24
|
+
"import": "./dist/harness/clineHooks.js",
|
|
25
|
+
"types": "./dist/harness/clineHooks.d.ts"
|
|
26
|
+
},
|
|
27
|
+
"./harness/cursorHooks": {
|
|
28
|
+
"import": "./dist/harness/cursorHooks.js",
|
|
29
|
+
"types": "./dist/harness/cursorHooks.d.ts"
|
|
30
|
+
},
|
|
31
|
+
"./harness/openhandsHooks": {
|
|
32
|
+
"import": "./dist/harness/openhandsHooks.js",
|
|
33
|
+
"types": "./dist/harness/openhandsHooks.d.ts"
|
|
34
|
+
},
|
|
35
|
+
"./harness/gooseHooks": {
|
|
36
|
+
"import": "./dist/harness/gooseHooks.js",
|
|
37
|
+
"types": "./dist/harness/gooseHooks.d.ts"
|
|
38
|
+
},
|
|
39
|
+
"./harness/windsurfHooks": {
|
|
40
|
+
"import": "./dist/harness/windsurfHooks.js",
|
|
41
|
+
"types": "./dist/harness/windsurfHooks.d.ts"
|
|
42
|
+
},
|
|
43
|
+
"./harness/aiderConfigMerger": {
|
|
44
|
+
"import": "./dist/harness/aiderConfigMerger.js",
|
|
45
|
+
"types": "./dist/harness/aiderConfigMerger.d.ts"
|
|
46
|
+
}
|
|
47
|
+
},
|
|
48
|
+
"typesVersions": {
|
|
49
|
+
"*": {
|
|
50
|
+
"harness/clineHooks": [
|
|
51
|
+
"src/harness/clineHooks.ts"
|
|
52
|
+
],
|
|
53
|
+
"harness/cursorHooks": [
|
|
54
|
+
"src/harness/cursorHooks.ts"
|
|
55
|
+
],
|
|
56
|
+
"harness/openhandsHooks": [
|
|
57
|
+
"src/harness/openhandsHooks.ts"
|
|
58
|
+
],
|
|
59
|
+
"harness/gooseHooks": [
|
|
60
|
+
"src/harness/gooseHooks.ts"
|
|
61
|
+
],
|
|
62
|
+
"harness/windsurfHooks": [
|
|
63
|
+
"src/harness/windsurfHooks.ts"
|
|
64
|
+
],
|
|
65
|
+
"harness/aiderConfigMerger": [
|
|
66
|
+
"src/harness/aiderConfigMerger.ts"
|
|
67
|
+
]
|
|
68
|
+
}
|
|
69
|
+
},
|
|
70
|
+
"dependencies": {
|
|
71
|
+
"chokidar": "^5.0.0",
|
|
72
|
+
"ioredis": "^5.11.1",
|
|
73
|
+
"ws": "^8.21.0",
|
|
74
|
+
"zod": "^3",
|
|
75
|
+
"@intutic/id": "1.6.0",
|
|
76
|
+
"@intutic/logger": "1.6.0",
|
|
77
|
+
"@intutic/shared-types": "1.6.0",
|
|
78
|
+
"@intutic/mcp-governance-proxy": "1.6.0"
|
|
79
|
+
},
|
|
80
|
+
"devDependencies": {
|
|
81
|
+
"@types/node": "^22",
|
|
82
|
+
"@types/ws": "^8.18.1",
|
|
83
|
+
"tsx": "^4",
|
|
84
|
+
"typescript": "^5.5",
|
|
85
|
+
"vitest": "^3"
|
|
86
|
+
},
|
|
87
|
+
"engines": {
|
|
88
|
+
"node": ">=20.19.0"
|
|
89
|
+
},
|
|
90
|
+
"scripts": {
|
|
91
|
+
"build": "tsc",
|
|
92
|
+
"dev": "tsx watch src/index.ts",
|
|
93
|
+
"typecheck": "tsc --noEmit",
|
|
94
|
+
"test": "vitest run --passWithNoTests"
|
|
95
|
+
}
|
|
96
|
+
}
|