@sylix/coworker 1.5.3 → 2.0.1
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 +57 -164
- package/dist/agents/SubagentLoader.d.ts +59 -0
- package/dist/agents/SubagentLoader.d.ts.map +1 -0
- package/dist/agents/SubagentLoader.js +140 -0
- package/dist/agents/SubagentLoader.js.map +1 -0
- package/dist/agents/SubagentRunner.d.ts +15 -0
- package/dist/agents/SubagentRunner.d.ts.map +1 -0
- package/dist/agents/SubagentRunner.js +116 -0
- package/dist/agents/SubagentRunner.js.map +1 -0
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +24 -51
- package/dist/cli/index.js.map +1 -1
- package/dist/commands/slash/config.d.ts.map +1 -1
- package/dist/commands/slash/config.js +15 -0
- package/dist/commands/slash/config.js.map +1 -1
- package/dist/commands/slash/context.d.ts.map +1 -1
- package/dist/commands/slash/context.js +31 -0
- package/dist/commands/slash/context.js.map +1 -1
- package/dist/commands/slash/core.d.ts.map +1 -1
- package/dist/commands/slash/core.js +33 -4
- package/dist/commands/slash/core.js.map +1 -1
- package/dist/commands/slash/registry.d.ts.map +1 -1
- package/dist/commands/slash/registry.js +2 -0
- package/dist/commands/slash/registry.js.map +1 -1
- package/dist/commands/slash/session.d.ts.map +1 -1
- package/dist/commands/slash/session.js +97 -44
- package/dist/commands/slash/session.js.map +1 -1
- package/dist/commands/slash/snapshot.d.ts +3 -0
- package/dist/commands/slash/snapshot.d.ts.map +1 -0
- package/dist/commands/slash/snapshot.js +144 -0
- package/dist/commands/slash/snapshot.js.map +1 -0
- package/dist/config/SettingsManager.d.ts +2 -0
- package/dist/config/SettingsManager.d.ts.map +1 -1
- package/dist/config/SettingsManager.js +7 -0
- package/dist/config/SettingsManager.js.map +1 -1
- package/dist/core/CoWorkerAgent.d.ts +32 -0
- package/dist/core/CoWorkerAgent.d.ts.map +1 -1
- package/dist/core/CoWorkerAgent.js +414 -71
- package/dist/core/CoWorkerAgent.js.map +1 -1
- package/dist/hooks/HookEngine.d.ts +115 -0
- package/dist/hooks/HookEngine.d.ts.map +1 -0
- package/dist/hooks/HookEngine.js +220 -0
- package/dist/hooks/HookEngine.js.map +1 -0
- package/dist/memory/AutoMemory.d.ts +55 -0
- package/dist/memory/AutoMemory.d.ts.map +1 -0
- package/dist/memory/AutoMemory.js +185 -0
- package/dist/memory/AutoMemory.js.map +1 -0
- package/dist/permissions/PermissionInterceptor.d.ts +55 -7
- package/dist/permissions/PermissionInterceptor.d.ts.map +1 -1
- package/dist/permissions/PermissionInterceptor.js +170 -22
- package/dist/permissions/PermissionInterceptor.js.map +1 -1
- package/dist/session/SessionManager.d.ts +53 -10
- package/dist/session/SessionManager.d.ts.map +1 -1
- package/dist/session/SessionManager.js +127 -55
- package/dist/session/SessionManager.js.map +1 -1
- package/dist/session/db.d.ts +81 -0
- package/dist/session/db.d.ts.map +1 -0
- package/dist/session/db.js +268 -0
- package/dist/session/db.js.map +1 -0
- package/dist/skills/HookAndSkillManager.d.ts +7 -5
- package/dist/skills/HookAndSkillManager.d.ts.map +1 -1
- package/dist/skills/HookAndSkillManager.js +30 -56
- package/dist/skills/HookAndSkillManager.js.map +1 -1
- package/dist/snapshot/SnapshotManager.d.ts +94 -0
- package/dist/snapshot/SnapshotManager.d.ts.map +1 -0
- package/dist/snapshot/SnapshotManager.js +260 -0
- package/dist/snapshot/SnapshotManager.js.map +1 -0
- package/dist/tools/LSPTool.d.ts +18 -0
- package/dist/tools/LSPTool.d.ts.map +1 -0
- package/dist/tools/LSPTool.js +137 -0
- package/dist/tools/LSPTool.js.map +1 -0
- package/dist/tools/NativeTools.d.ts +4 -3
- package/dist/tools/NativeTools.d.ts.map +1 -1
- package/dist/tools/NativeTools.js +66 -19
- package/dist/tools/NativeTools.js.map +1 -1
- package/dist/tools/Schemas.d.ts +69 -0
- package/dist/tools/Schemas.d.ts.map +1 -1
- package/dist/tools/Schemas.js +32 -0
- package/dist/tools/Schemas.js.map +1 -1
- package/dist/utils/contextManager.d.ts +1 -1
- package/dist/utils/contextManager.d.ts.map +1 -1
- package/dist/utils/output.d.ts +3 -6
- package/dist/utils/output.d.ts.map +1 -1
- package/dist/utils/output.js +44 -39
- package/dist/utils/output.js.map +1 -1
- package/dist/utils/systemPrompt.d.ts.map +1 -1
- package/dist/utils/systemPrompt.js +1 -0
- package/dist/utils/systemPrompt.js.map +1 -1
- package/dist/utils/update.d.ts +9 -0
- package/dist/utils/update.d.ts.map +1 -0
- package/dist/utils/update.js +108 -0
- package/dist/utils/update.js.map +1 -0
- package/package.json +3 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HookAndSkillManager.d.ts","sourceRoot":"","sources":["../../src/skills/HookAndSkillManager.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"HookAndSkillManager.d.ts","sourceRoot":"","sources":["../../src/skills/HookAndSkillManager.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAGjD,MAAM,WAAW,KAAK;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,qBAAqB,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,OAAO,CAAC;CACpB;AAED;;;;;;;;;GASG;AACH,qBAAa,mBAAmB;IACvB,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAa;IAC7C,cAAc,EAAE,gBAAgB,GAAG,IAAI,CAAQ;IAC/C,WAAW,EAAE,MAAM,GAAG,IAAI,CAAQ;;IAIzC;;OAEG;IACI,aAAa,CAAC,MAAM,EAAE,UAAU;IAgCvC;;;OAGG;YACW,cAAc;IAkH5B;;;OAGG;IACU,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAUpE;;;OAGG;IACU,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAIxF;;;OAGG;IACU,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI9G;;;OAGG;IACU,uBAAuB,IAAI,OAAO,CAAC,IAAI,CAAC;YAavC,aAAa;IAkCpB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAKhD,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAMjC,eAAe,IAAI,IAAI;IAIvB,gBAAgB,IAAI,MAAM,EAAE;IAI5B,gBAAgB,IAAI,MAAM;CAQlC"}
|
|
@@ -34,10 +34,10 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
36
|
exports.HookAndSkillManager = void 0;
|
|
37
|
-
const events_1 = require("events");
|
|
38
37
|
const fs = __importStar(require("fs/promises"));
|
|
39
38
|
const path = __importStar(require("path"));
|
|
40
39
|
const child_process_1 = require("child_process");
|
|
40
|
+
const output_1 = require("../utils/output");
|
|
41
41
|
/**
|
|
42
42
|
* Phase 3+: Hooks, Skills, and Inline Error Detection.
|
|
43
43
|
*
|
|
@@ -50,63 +50,40 @@ const child_process_1 = require("child_process");
|
|
|
50
50
|
*/
|
|
51
51
|
class HookAndSkillManager {
|
|
52
52
|
constructor() {
|
|
53
|
-
this.events = new events_1.EventEmitter();
|
|
54
53
|
this.loadedSkills = new Map();
|
|
55
|
-
this.preToolHooks = [];
|
|
56
|
-
this.postToolHooks = [];
|
|
57
54
|
this.lastDiagnostic = null;
|
|
58
55
|
this.activeSkill = null;
|
|
59
|
-
this.registerInternalHooks();
|
|
60
56
|
}
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
resolve();
|
|
77
|
-
});
|
|
78
|
-
this.events.on('PostToolUse', async (toolName, result, args, resolve) => {
|
|
79
|
-
// ═══════════════════════════════════════════════════════════════
|
|
80
|
-
// INLINE ERROR DETECTION — Auto-validation after file mutations
|
|
81
|
-
// ═══════════════════════════════════════════════════════════════
|
|
82
|
-
const fileMutationTools = ['executeWrite', 'executeEdit', 'executeMultiEdit'];
|
|
83
|
-
if (fileMutationTools.includes(toolName)) {
|
|
84
|
-
const filePath = args.filePath || '';
|
|
57
|
+
/**
|
|
58
|
+
* Register internal CoWorker hooks (like Diagnostics) into the HookEngine.
|
|
59
|
+
*/
|
|
60
|
+
registerHooks(engine) {
|
|
61
|
+
// ═══════════════════════════════════════════════════════════════
|
|
62
|
+
// INLINE ERROR DETECTION — Auto-validation after file mutations
|
|
63
|
+
// ═══════════════════════════════════════════════════════════════
|
|
64
|
+
engine.on('PostToolUse', async (ctx) => {
|
|
65
|
+
const fileMutationTools = ['Write', 'Edit', 'MultiEdit', 'executeWrite', 'executeEdit', 'executeMultiEdit'];
|
|
66
|
+
if (ctx.toolName && fileMutationTools.includes(ctx.toolName)) {
|
|
67
|
+
const filePath = ctx.args?.file_path || ctx.args?.filePath || '';
|
|
68
|
+
if (!filePath)
|
|
69
|
+
return;
|
|
85
70
|
const ext = path.extname(filePath).toLowerCase();
|
|
86
71
|
const diagnostic = await this.runDiagnostics(filePath, ext);
|
|
87
72
|
this.lastDiagnostic = diagnostic;
|
|
88
73
|
if (diagnostic.hasErrors) {
|
|
89
|
-
console.log(`\
|
|
90
|
-
console.log(
|
|
74
|
+
console.log(`\n ${output_1.theme.warning('⚠')} Found errors in ${output_1.theme.white(path.basename(filePath))}:`);
|
|
75
|
+
console.log(` ${output_1.theme.dim(diagnostic.errors.substring(0, 500))}`);
|
|
91
76
|
}
|
|
92
77
|
else {
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
}
|
|
96
|
-
else {
|
|
97
|
-
this.lastDiagnostic = null;
|
|
98
|
-
}
|
|
99
|
-
// Fire user-defined PostTool hooks
|
|
100
|
-
for (const hook of this.postToolHooks) {
|
|
101
|
-
if (hook.matcher.test(toolName)) {
|
|
102
|
-
console.log(`[Hooks] Triggered PostTool hook for ${toolName}. Running: ${hook.command}`);
|
|
103
|
-
try {
|
|
104
|
-
(0, child_process_1.execSync)(hook.command, { encoding: 'utf8', timeout: 15000 });
|
|
78
|
+
if (process.env.CW_VERBOSE) {
|
|
79
|
+
console.log(` ${output_1.theme.success('✓')} No errors detected in ${path.basename(filePath)}`);
|
|
105
80
|
}
|
|
106
|
-
|
|
81
|
+
}
|
|
82
|
+
// Inject diagnostics into the context result for the LLM
|
|
83
|
+
if (ctx.result && typeof ctx.result === 'string') {
|
|
84
|
+
ctx.result += `\n\n[DIAGNOSTICS] ${diagnostic.hasErrors ? 'ERRORS FOUND' : 'CLEAN'}\n${diagnostic.errors}`;
|
|
107
85
|
}
|
|
108
86
|
}
|
|
109
|
-
resolve();
|
|
110
87
|
});
|
|
111
88
|
}
|
|
112
89
|
/**
|
|
@@ -131,7 +108,7 @@ class HookAndSkillManager {
|
|
|
131
108
|
try {
|
|
132
109
|
// First check if tsconfig.json exists
|
|
133
110
|
await fs.access(path.join(process.cwd(), 'tsconfig.json'));
|
|
134
|
-
const output = (0, child_process_1.execSync)(`npx tsc --noEmit --pretty false 2>&1 | findstr /i "${path.basename(filePath)}"`, { encoding: 'utf8', timeout: 30000, cwd: process.cwd() }).trim();
|
|
111
|
+
const output = (0, child_process_1.execSync)(`npx tsc --noEmit --pretty false 2>&1 | findstr /i "${path.basename(filePath)}"`, { encoding: 'utf8', timeout: 30000, cwd: process.cwd(), stdio: ['pipe', 'pipe', 'pipe'] }).trim();
|
|
135
112
|
if (output) {
|
|
136
113
|
result.errors = output.substring(0, 2000);
|
|
137
114
|
result.hasErrors = true;
|
|
@@ -157,7 +134,7 @@ class HookAndSkillManager {
|
|
|
157
134
|
// JavaScript: try node --check for syntax validation
|
|
158
135
|
result.tool = 'node --check';
|
|
159
136
|
try {
|
|
160
|
-
(0, child_process_1.execSync)(`node --check "${absPath}"`, { encoding: 'utf8', timeout: 10000 });
|
|
137
|
+
(0, child_process_1.execSync)(`node --check "${absPath}"`, { encoding: 'utf8', timeout: 10000, stdio: ['pipe', 'pipe', 'pipe'] });
|
|
161
138
|
}
|
|
162
139
|
catch (e) {
|
|
163
140
|
const stderr = e.stderr?.toString() || e.message;
|
|
@@ -170,7 +147,7 @@ class HookAndSkillManager {
|
|
|
170
147
|
// Python: syntax check
|
|
171
148
|
result.tool = 'py_compile';
|
|
172
149
|
try {
|
|
173
|
-
(0, child_process_1.execSync)(`python -m py_compile "${absPath}"`, { encoding: 'utf8', timeout: 10000 });
|
|
150
|
+
(0, child_process_1.execSync)(`python -m py_compile "${absPath}"`, { encoding: 'utf8', timeout: 10000, stdio: ['pipe', 'pipe', 'pipe'] });
|
|
174
151
|
}
|
|
175
152
|
catch (e) {
|
|
176
153
|
const stderr = e.stderr?.toString() || e.message;
|
|
@@ -197,7 +174,7 @@ class HookAndSkillManager {
|
|
|
197
174
|
// CSS: basic syntax check via stylelint if available
|
|
198
175
|
result.tool = 'stylelint';
|
|
199
176
|
try {
|
|
200
|
-
const output = (0, child_process_1.execSync)(`npx stylelint "${absPath}" 2>&1`, { encoding: 'utf8', timeout: 15000 });
|
|
177
|
+
const output = (0, child_process_1.execSync)(`npx stylelint "${absPath}" 2>&1`, { encoding: 'utf8', timeout: 15000, stdio: ['pipe', 'pipe', 'pipe'] });
|
|
201
178
|
if (output.trim()) {
|
|
202
179
|
result.errors = output.substring(0, 2000);
|
|
203
180
|
result.hasErrors = true;
|
|
@@ -233,20 +210,17 @@ class HookAndSkillManager {
|
|
|
233
210
|
}
|
|
234
211
|
/**
|
|
235
212
|
* Fired before the main CoWorker agent loop executes an LLM-requested tool.
|
|
213
|
+
* @deprecated Use hookEngine.fireBlocking('PreToolUse', ...)
|
|
236
214
|
*/
|
|
237
215
|
async firePreToolHook(toolName, args) {
|
|
238
|
-
|
|
239
|
-
this.events.emit('PreToolUse', toolName, args, resolve, reject);
|
|
240
|
-
});
|
|
216
|
+
// No-op: handled by HookEngine
|
|
241
217
|
}
|
|
242
218
|
/**
|
|
243
219
|
* Fired after the tool completes execution.
|
|
244
|
-
*
|
|
220
|
+
* @deprecated Use hookEngine.fire('PostToolUse', ...)
|
|
245
221
|
*/
|
|
246
222
|
async firePostToolHook(toolName, result, args = {}) {
|
|
247
|
-
|
|
248
|
-
this.events.emit('PostToolUse', toolName, result, args, resolve);
|
|
249
|
-
});
|
|
223
|
+
// No-op: handled by HookEngine
|
|
250
224
|
}
|
|
251
225
|
/**
|
|
252
226
|
* Reads .coworker/skills/*.md mapping frontmatter to /commands.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HookAndSkillManager.js","sourceRoot":"","sources":["../../src/skills/HookAndSkillManager.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,
|
|
1
|
+
{"version":3,"file":"HookAndSkillManager.js","sourceRoot":"","sources":["../../src/skills/HookAndSkillManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-step git snapshot system inspired by OpenCode's snapshot/index.ts.
|
|
3
|
+
*
|
|
4
|
+
* How it works:
|
|
5
|
+
* 1. Before each LLM step, we call SnapshotManager.track() which does:
|
|
6
|
+
* git add . && git write-tree
|
|
7
|
+
* This captures the current working tree state as a git tree hash.
|
|
8
|
+
*
|
|
9
|
+
* 2. Each tracked step gets an entry with:
|
|
10
|
+
* - stepId: sequential counter
|
|
11
|
+
* - treeHash: the git write-tree hash
|
|
12
|
+
* - timestamp: when the snapshot was taken
|
|
13
|
+
* - message: optional description
|
|
14
|
+
*
|
|
15
|
+
* 3. Users can revert to any step by calling SnapshotManager.restore(stepId).
|
|
16
|
+
* This does:
|
|
17
|
+
* git read-tree <treeHash>
|
|
18
|
+
* git checkout-index -a -f
|
|
19
|
+
*
|
|
20
|
+
* 4. Snapshots are stored in:
|
|
21
|
+
* ~/.coworker/snapshots/{projectId}/
|
|
22
|
+
*
|
|
23
|
+
* Design decisions:
|
|
24
|
+
* - Uses a SHADOW git repo (not the project's .git) so it never pollutes the project
|
|
25
|
+
* - Only tracks file changes per step, not database writes or deployments
|
|
26
|
+
* - Auto-cleanup: keeps last 50 snapshots, deletes older ones
|
|
27
|
+
*/
|
|
28
|
+
export interface SnapshotEntry {
|
|
29
|
+
stepId: number;
|
|
30
|
+
treeHash: string;
|
|
31
|
+
timestamp: string;
|
|
32
|
+
changedFiles: string[];
|
|
33
|
+
message?: string;
|
|
34
|
+
}
|
|
35
|
+
export interface SnapshotManagerOptions {
|
|
36
|
+
/** Override snapshot directory (defaults to ~/.coworker/snapshots/{projectId}) */
|
|
37
|
+
snapshotDir?: string;
|
|
38
|
+
/** Maximum snapshots to keep (oldest are pruned, default 50) */
|
|
39
|
+
maxSnapshots?: number;
|
|
40
|
+
}
|
|
41
|
+
export declare class SnapshotManager {
|
|
42
|
+
private readonly snapshotDir;
|
|
43
|
+
private readonly gitDir;
|
|
44
|
+
private readonly maxSnapshots;
|
|
45
|
+
private stepCounter;
|
|
46
|
+
private snapshots;
|
|
47
|
+
private indexPath;
|
|
48
|
+
private projectId;
|
|
49
|
+
constructor(cwd?: string, options?: SnapshotManagerOptions);
|
|
50
|
+
/** Compute a stable project ID from the working directory. */
|
|
51
|
+
private computeProjectId;
|
|
52
|
+
/** Initialize the shadow git repo if not already initialized. */
|
|
53
|
+
init(): Promise<void>;
|
|
54
|
+
private loadIndex;
|
|
55
|
+
private saveIndex;
|
|
56
|
+
/**
|
|
57
|
+
* Take a snapshot of the current working tree state.
|
|
58
|
+
* Called BEFORE each LLM step executes its tools.
|
|
59
|
+
*
|
|
60
|
+
* Returns the new stepId.
|
|
61
|
+
*/
|
|
62
|
+
track(cwd: string, message?: string): Promise<number>;
|
|
63
|
+
/**
|
|
64
|
+
* Capture the working tree state as a git tree hash.
|
|
65
|
+
* Uses git write-tree after staging changes.
|
|
66
|
+
*/
|
|
67
|
+
private captureTree;
|
|
68
|
+
/**
|
|
69
|
+
* Get the list of files that changed between two steps.
|
|
70
|
+
*/
|
|
71
|
+
private diffStep;
|
|
72
|
+
/**
|
|
73
|
+
* Restore the working tree to the state at a specific step.
|
|
74
|
+
* This does NOT affect git history — it only restores files.
|
|
75
|
+
*/
|
|
76
|
+
restore(stepId: number, cwd: string): Promise<{
|
|
77
|
+
success: boolean;
|
|
78
|
+
restoredFiles: string[];
|
|
79
|
+
error?: string;
|
|
80
|
+
}>;
|
|
81
|
+
/**
|
|
82
|
+
* Get a list of all snapshots (for display in a rewind menu).
|
|
83
|
+
*/
|
|
84
|
+
listSnapshots(): SnapshotEntry[];
|
|
85
|
+
/**
|
|
86
|
+
* Get the latest snapshot stepId.
|
|
87
|
+
*/
|
|
88
|
+
latestStepId(): number;
|
|
89
|
+
/** Delete old snapshot data beyond maxSnapshots. */
|
|
90
|
+
private pruneSnapshots;
|
|
91
|
+
/** Clear all snapshots (e.g. on session end if requested). */
|
|
92
|
+
clear(): Promise<void>;
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=SnapshotManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SnapshotManager.d.ts","sourceRoot":"","sources":["../../src/snapshot/SnapshotManager.ts"],"names":[],"mappings":"AAOA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,sBAAsB;IACrC,kFAAkF;IAClF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gEAAgE;IAChE,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,SAAS,CAAS;gBAEd,GAAG,GAAE,MAAsB,EAAE,OAAO,GAAE,sBAA2B;IAS7E,8DAA8D;IAC9D,OAAO,CAAC,gBAAgB;IAmBxB,iEAAiE;IAC3D,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAcb,SAAS;YAaT,SAAS;IASvB;;;;;OAKG;IACG,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA0C3D;;;OAGG;IACH,OAAO,CAAC,WAAW;IAoCnB;;OAEG;IACH,OAAO,CAAC,QAAQ;IAkBhB;;;OAGG;IACG,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,aAAa,EAAE,MAAM,EAAE,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IA8BlH;;OAEG;IACH,aAAa,IAAI,aAAa,EAAE;IAIhC;;OAEG;IACH,YAAY,IAAI,MAAM;IAItB,oDAAoD;YACtC,cAAc;IAS5B,8DAA8D;IACxD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAK7B"}
|
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.SnapshotManager = void 0;
|
|
37
|
+
const fs = __importStar(require("fs/promises"));
|
|
38
|
+
const fsSync = __importStar(require("fs"));
|
|
39
|
+
const path = __importStar(require("path"));
|
|
40
|
+
const os = __importStar(require("os"));
|
|
41
|
+
const child_process_1 = require("child_process");
|
|
42
|
+
class SnapshotManager {
|
|
43
|
+
constructor(cwd = process.cwd(), options = {}) {
|
|
44
|
+
this.stepCounter = 0;
|
|
45
|
+
this.snapshots = [];
|
|
46
|
+
this.maxSnapshots = options.maxSnapshots ?? 50;
|
|
47
|
+
this.projectId = this.computeProjectId(cwd);
|
|
48
|
+
this.snapshotDir = options.snapshotDir
|
|
49
|
+
?? path.join(os.homedir(), '.coworker', 'snapshots', this.projectId);
|
|
50
|
+
this.gitDir = path.join(this.snapshotDir, '.git');
|
|
51
|
+
this.indexPath = path.join(this.snapshotDir, 'index');
|
|
52
|
+
}
|
|
53
|
+
/** Compute a stable project ID from the working directory. */
|
|
54
|
+
computeProjectId(cwd) {
|
|
55
|
+
try {
|
|
56
|
+
// Use git rev-parse to get a stable hash of the project root
|
|
57
|
+
const hash = (0, child_process_1.execSync)('git rev-parse --show-toplevel', {
|
|
58
|
+
cwd,
|
|
59
|
+
encoding: 'utf8',
|
|
60
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
61
|
+
}).trim();
|
|
62
|
+
// Simple hash: use the last 8 chars of the git root path hash
|
|
63
|
+
let h = 0;
|
|
64
|
+
for (const c of hash)
|
|
65
|
+
h = (h * 31 + c.charCodeAt(0)) & 0xffffffff;
|
|
66
|
+
return Math.abs(h).toString(16).padStart(8, '0');
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
// Fallback: use the directory path itself
|
|
70
|
+
return Math.abs([...cwd].reduce((h, c) => h * 31 + c.charCodeAt(0), 0))
|
|
71
|
+
.toString(16).padStart(8, '0');
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
/** Initialize the shadow git repo if not already initialized. */
|
|
75
|
+
async init() {
|
|
76
|
+
await fs.mkdir(this.snapshotDir, { recursive: true });
|
|
77
|
+
try {
|
|
78
|
+
(0, child_process_1.execSync)('git rev-parse --git-dir', { cwd: this.snapshotDir, encoding: 'utf8', stdio: ['pipe', 'pipe', 'pipe'] });
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
// Not initialized — create it
|
|
82
|
+
(0, child_process_1.execSync)('git init', { cwd: this.snapshotDir, encoding: 'utf8', stdio: ['pipe', 'pipe', 'pipe'] });
|
|
83
|
+
}
|
|
84
|
+
// Load existing snapshot index
|
|
85
|
+
await this.loadIndex();
|
|
86
|
+
}
|
|
87
|
+
async loadIndex() {
|
|
88
|
+
const indexFile = path.join(this.snapshotDir, 'snapshots.json');
|
|
89
|
+
try {
|
|
90
|
+
const data = await fs.readFile(indexFile, 'utf8');
|
|
91
|
+
const parsed = JSON.parse(data);
|
|
92
|
+
this.snapshots = parsed.snapshots ?? [];
|
|
93
|
+
this.stepCounter = parsed.stepCounter ?? 0;
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
this.snapshots = [];
|
|
97
|
+
this.stepCounter = 0;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
async saveIndex() {
|
|
101
|
+
const indexFile = path.join(this.snapshotDir, 'snapshots.json');
|
|
102
|
+
await fs.writeFile(indexFile, JSON.stringify({ snapshots: this.snapshots, stepCounter: this.stepCounter }, null, 2), 'utf8');
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Take a snapshot of the current working tree state.
|
|
106
|
+
* Called BEFORE each LLM step executes its tools.
|
|
107
|
+
*
|
|
108
|
+
* Returns the new stepId.
|
|
109
|
+
*/
|
|
110
|
+
async track(cwd, message) {
|
|
111
|
+
await this.init();
|
|
112
|
+
this.stepCounter++;
|
|
113
|
+
const stepId = this.stepCounter;
|
|
114
|
+
try {
|
|
115
|
+
// Stage all changes in the project working dir
|
|
116
|
+
(0, child_process_1.execSync)('git add .', { cwd, encoding: 'utf8', stdio: ['pipe', 'pipe', 'pipe'] });
|
|
117
|
+
// Capture as a tree object in our shadow repo
|
|
118
|
+
// We copy the index to our shadow git and create a tree from it
|
|
119
|
+
const treeHash = this.captureTree(cwd, stepId);
|
|
120
|
+
// Find what files changed vs the previous snapshot
|
|
121
|
+
const changedFiles = this.diffStep(stepId - 1, stepId, cwd);
|
|
122
|
+
const entry = {
|
|
123
|
+
stepId,
|
|
124
|
+
treeHash,
|
|
125
|
+
timestamp: new Date().toISOString(),
|
|
126
|
+
changedFiles,
|
|
127
|
+
message,
|
|
128
|
+
};
|
|
129
|
+
this.snapshots.push(entry);
|
|
130
|
+
// Prune old snapshots beyond maxSnapshots
|
|
131
|
+
if (this.snapshots.length > this.maxSnapshots) {
|
|
132
|
+
const pruned = this.snapshots.splice(0, this.snapshots.length - this.maxSnapshots);
|
|
133
|
+
await this.pruneSnapshots(pruned);
|
|
134
|
+
}
|
|
135
|
+
await this.saveIndex();
|
|
136
|
+
return stepId;
|
|
137
|
+
}
|
|
138
|
+
catch (e) {
|
|
139
|
+
// If git fails (e.g. not a git repo), just return -1 as a sentinel
|
|
140
|
+
console.warn(`[Snapshot] Failed to track snapshot: ${e.message}`);
|
|
141
|
+
return -1;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Capture the working tree state as a git tree hash.
|
|
146
|
+
* Uses git write-tree after staging changes.
|
|
147
|
+
*/
|
|
148
|
+
captureTree(cwd, stepId) {
|
|
149
|
+
// Create a temp gitdir for this snapshot
|
|
150
|
+
const stepGitDir = path.join(this.snapshotDir, 'steps', String(stepId));
|
|
151
|
+
fsSync.mkdirSync(stepGitDir, { recursive: true });
|
|
152
|
+
// Stage files into the shadow repo's index
|
|
153
|
+
// We use git add on the project files but redirect the index
|
|
154
|
+
const indexEnv = { GIT_INDEX_FILE: this.indexPath };
|
|
155
|
+
// Add all tracked files to the index
|
|
156
|
+
try {
|
|
157
|
+
(0, child_process_1.execSync)('git add -A', {
|
|
158
|
+
cwd,
|
|
159
|
+
encoding: 'utf8',
|
|
160
|
+
env: { ...process.env, ...indexEnv },
|
|
161
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
catch {
|
|
165
|
+
// No tracked files yet
|
|
166
|
+
}
|
|
167
|
+
// Write the tree
|
|
168
|
+
let treeHash = '';
|
|
169
|
+
try {
|
|
170
|
+
treeHash = (0, child_process_1.execSync)('git write-tree', {
|
|
171
|
+
cwd,
|
|
172
|
+
encoding: 'utf8',
|
|
173
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
174
|
+
}).trim();
|
|
175
|
+
}
|
|
176
|
+
catch (e) {
|
|
177
|
+
treeHash = `error-${e.message}`;
|
|
178
|
+
}
|
|
179
|
+
return treeHash;
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Get the list of files that changed between two steps.
|
|
183
|
+
*/
|
|
184
|
+
diffStep(fromStep, toStep, cwd) {
|
|
185
|
+
if (fromStep < 0)
|
|
186
|
+
return [];
|
|
187
|
+
const fromEntry = this.snapshots.find(s => s.stepId === fromStep);
|
|
188
|
+
const toEntry = this.snapshots.find(s => s.stepId === toStep);
|
|
189
|
+
if (!fromEntry || !toEntry || !fromEntry.treeHash || !toEntry.treeHash)
|
|
190
|
+
return [];
|
|
191
|
+
try {
|
|
192
|
+
const diff = (0, child_process_1.execSync)(`git diff-tree --no-commit-id --name-only -r ${fromEntry.treeHash} ${toEntry.treeHash}`, { cwd, encoding: 'utf8', stdio: ['pipe', 'pipe', 'pipe'] }).trim();
|
|
193
|
+
return diff ? diff.split('\n').filter(Boolean) : [];
|
|
194
|
+
}
|
|
195
|
+
catch {
|
|
196
|
+
return [];
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Restore the working tree to the state at a specific step.
|
|
201
|
+
* This does NOT affect git history — it only restores files.
|
|
202
|
+
*/
|
|
203
|
+
async restore(stepId, cwd) {
|
|
204
|
+
const entry = this.snapshots.find(s => s.stepId === stepId);
|
|
205
|
+
if (!entry) {
|
|
206
|
+
return { success: false, restoredFiles: [], error: `No snapshot found for step ${stepId}` };
|
|
207
|
+
}
|
|
208
|
+
if (!entry.treeHash || entry.treeHash.startsWith('error-')) {
|
|
209
|
+
return { success: false, restoredFiles: [], error: `Snapshot ${stepId} has no valid tree hash` };
|
|
210
|
+
}
|
|
211
|
+
try {
|
|
212
|
+
// Read the tree into the index — target the PROJECT directory
|
|
213
|
+
(0, child_process_1.execSync)(`git read-tree ${entry.treeHash}`, {
|
|
214
|
+
cwd,
|
|
215
|
+
encoding: 'utf8',
|
|
216
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
217
|
+
});
|
|
218
|
+
// Check out the files to the PROJECT working directory (not snapshot dir)
|
|
219
|
+
(0, child_process_1.execSync)('git checkout-index -a -f', {
|
|
220
|
+
cwd,
|
|
221
|
+
encoding: 'utf8',
|
|
222
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
223
|
+
});
|
|
224
|
+
return { success: true, restoredFiles: entry.changedFiles };
|
|
225
|
+
}
|
|
226
|
+
catch (e) {
|
|
227
|
+
return { success: false, restoredFiles: [], error: e.message };
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Get a list of all snapshots (for display in a rewind menu).
|
|
232
|
+
*/
|
|
233
|
+
listSnapshots() {
|
|
234
|
+
return [...this.snapshots];
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Get the latest snapshot stepId.
|
|
238
|
+
*/
|
|
239
|
+
latestStepId() {
|
|
240
|
+
return this.snapshots.length > 0 ? this.snapshots[this.snapshots.length - 1].stepId : -1;
|
|
241
|
+
}
|
|
242
|
+
/** Delete old snapshot data beyond maxSnapshots. */
|
|
243
|
+
async pruneSnapshots(prunedEntries) {
|
|
244
|
+
for (const entry of prunedEntries) {
|
|
245
|
+
const stepDir = path.join(this.snapshotDir, 'steps', String(entry.stepId));
|
|
246
|
+
try {
|
|
247
|
+
await fs.rm(stepDir, { recursive: true, force: true });
|
|
248
|
+
}
|
|
249
|
+
catch { /* ignore */ }
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
/** Clear all snapshots (e.g. on session end if requested). */
|
|
253
|
+
async clear() {
|
|
254
|
+
this.snapshots = [];
|
|
255
|
+
this.stepCounter = 0;
|
|
256
|
+
await this.saveIndex();
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
exports.SnapshotManager = SnapshotManager;
|
|
260
|
+
//# sourceMappingURL=SnapshotManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SnapshotManager.js","sourceRoot":"","sources":["../../src/snapshot/SnapshotManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LSP Client for CoWorker v1.5.3.
|
|
3
|
+
* Connects to typescript-language-server (or similar) via stdio JSON-RPC.
|
|
4
|
+
*/
|
|
5
|
+
export declare class LSPClient {
|
|
6
|
+
private process;
|
|
7
|
+
private idCounter;
|
|
8
|
+
private cwd;
|
|
9
|
+
constructor(cwd: string);
|
|
10
|
+
start(): Promise<boolean>;
|
|
11
|
+
private initialize;
|
|
12
|
+
gotoDefinition(filePath: string, line: number, character: number): Promise<any>;
|
|
13
|
+
findReferences(filePath: string, line: number, character: number): Promise<any>;
|
|
14
|
+
private request;
|
|
15
|
+
private notification;
|
|
16
|
+
stop(): void;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=LSPTool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LSPTool.d.ts","sourceRoot":"","sources":["../../src/tools/LSPTool.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,GAAG,CAAS;gBAER,GAAG,EAAE,MAAM;IAIjB,KAAK,IAAI,OAAO,CAAC,OAAO,CAAC;YA0BjB,UAAU;IAUlB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAQ/E,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;YASvE,OAAO;YA0BP,YAAY;IAO1B,IAAI;CAIL"}
|