@fixy/core 0.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/dist/__tests__/diff-parser.test.d.ts +2 -0
- package/dist/__tests__/diff-parser.test.d.ts.map +1 -0
- package/dist/__tests__/diff-parser.test.js +89 -0
- package/dist/__tests__/diff-parser.test.js.map +1 -0
- package/dist/__tests__/fixy-commands.test.d.ts +2 -0
- package/dist/__tests__/fixy-commands.test.d.ts.map +1 -0
- package/dist/__tests__/fixy-commands.test.js +176 -0
- package/dist/__tests__/fixy-commands.test.js.map +1 -0
- package/dist/__tests__/registry.test.d.ts +2 -0
- package/dist/__tests__/registry.test.d.ts.map +1 -0
- package/dist/__tests__/registry.test.js +66 -0
- package/dist/__tests__/registry.test.js.map +1 -0
- package/dist/__tests__/router.test.d.ts +2 -0
- package/dist/__tests__/router.test.d.ts.map +1 -0
- package/dist/__tests__/router.test.js +77 -0
- package/dist/__tests__/router.test.js.map +1 -0
- package/dist/__tests__/smoke.test.d.ts +2 -0
- package/dist/__tests__/smoke.test.d.ts.map +1 -0
- package/dist/__tests__/smoke.test.js +7 -0
- package/dist/__tests__/smoke.test.js.map +1 -0
- package/dist/__tests__/store.test.d.ts +2 -0
- package/dist/__tests__/store.test.d.ts.map +1 -0
- package/dist/__tests__/store.test.js +121 -0
- package/dist/__tests__/store.test.js.map +1 -0
- package/dist/__tests__/turn.test.d.ts +2 -0
- package/dist/__tests__/turn.test.d.ts.map +1 -0
- package/dist/__tests__/turn.test.js +194 -0
- package/dist/__tests__/turn.test.js.map +1 -0
- package/dist/__tests__/worktree.test.d.ts +2 -0
- package/dist/__tests__/worktree.test.d.ts.map +1 -0
- package/dist/__tests__/worktree.test.js +119 -0
- package/dist/__tests__/worktree.test.js.map +1 -0
- package/dist/adapter.d.ts +75 -0
- package/dist/adapter.d.ts.map +1 -0
- package/dist/adapter.js +3 -0
- package/dist/adapter.js.map +1 -0
- package/dist/diff-parser.d.ts +3 -0
- package/dist/diff-parser.d.ts.map +1 -0
- package/dist/diff-parser.js +38 -0
- package/dist/diff-parser.js.map +1 -0
- package/dist/fixy-commands.d.ts +25 -0
- package/dist/fixy-commands.d.ts.map +1 -0
- package/dist/fixy-commands.js +154 -0
- package/dist/fixy-commands.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/paths.d.ts +17 -0
- package/dist/paths.d.ts.map +1 -0
- package/dist/paths.js +36 -0
- package/dist/paths.js.map +1 -0
- package/dist/registry.d.ts +12 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +32 -0
- package/dist/registry.js.map +1 -0
- package/dist/router.d.ts +21 -0
- package/dist/router.d.ts.map +1 -0
- package/dist/router.js +36 -0
- package/dist/router.js.map +1 -0
- package/dist/store.d.ts +36 -0
- package/dist/store.d.ts.map +1 -0
- package/dist/store.js +127 -0
- package/dist/store.js.map +1 -0
- package/dist/thread.d.ts +47 -0
- package/dist/thread.d.ts.map +1 -0
- package/dist/thread.js +3 -0
- package/dist/thread.js.map +1 -0
- package/dist/turn.d.ts +20 -0
- package/dist/turn.d.ts.map +1 -0
- package/dist/turn.js +130 -0
- package/dist/turn.js.map +1 -0
- package/dist/worktree.d.ts +36 -0
- package/dist/worktree.d.ts.map +1 -0
- package/dist/worktree.js +91 -0
- package/dist/worktree.js.map +1 -0
- package/package.json +21 -0
- package/src/__tests__/diff-parser.test.ts +99 -0
- package/src/__tests__/fixy-commands.test.ts +231 -0
- package/src/__tests__/registry.test.ts +79 -0
- package/src/__tests__/router.test.ts +91 -0
- package/src/__tests__/smoke.test.ts +7 -0
- package/src/__tests__/store.test.ts +151 -0
- package/src/__tests__/turn.test.ts +266 -0
- package/src/__tests__/worktree.test.ts +155 -0
- package/src/adapter.ts +84 -0
- package/src/diff-parser.ts +46 -0
- package/src/fixy-commands.ts +201 -0
- package/src/index.ts +40 -0
- package/src/paths.ts +43 -0
- package/src/registry.ts +40 -0
- package/src/router.ts +49 -0
- package/src/store.ts +164 -0
- package/src/thread.ts +50 -0
- package/src/turn.ts +165 -0
- package/src/worktree.ts +119 -0
- package/tsconfig.json +9 -0
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { rename, writeFile } from 'node:fs/promises';
|
|
3
|
+
import { getThreadFile } from './paths.js';
|
|
4
|
+
export class FixyCommandRunner {
|
|
5
|
+
async run(ctx) {
|
|
6
|
+
const { rest } = ctx;
|
|
7
|
+
if (!rest.startsWith('/')) {
|
|
8
|
+
await this._handleBare(rest, ctx);
|
|
9
|
+
return;
|
|
10
|
+
}
|
|
11
|
+
const spaceIdx = rest.indexOf(' ');
|
|
12
|
+
const command = spaceIdx === -1 ? rest : rest.slice(0, spaceIdx);
|
|
13
|
+
const args = spaceIdx === -1 ? '' : rest.slice(spaceIdx + 1).trim();
|
|
14
|
+
switch (command) {
|
|
15
|
+
case '/worker':
|
|
16
|
+
await this._handleWorker(args, ctx);
|
|
17
|
+
break;
|
|
18
|
+
case '/all':
|
|
19
|
+
await this._handleAll(ctx);
|
|
20
|
+
break;
|
|
21
|
+
case '/settings':
|
|
22
|
+
await this._handleSettings(ctx);
|
|
23
|
+
break;
|
|
24
|
+
case '/reset':
|
|
25
|
+
await this._handleReset(ctx);
|
|
26
|
+
break;
|
|
27
|
+
case '/status':
|
|
28
|
+
await this._handleStatus(ctx);
|
|
29
|
+
break;
|
|
30
|
+
default:
|
|
31
|
+
await this._appendSystemMessage(`unknown command: ${command}`, ctx);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
async _handleWorker(adapterId, ctx) {
|
|
35
|
+
ctx.registry.require(adapterId);
|
|
36
|
+
const fresh = await ctx.store.getThread(ctx.thread.id, ctx.thread.projectRoot);
|
|
37
|
+
fresh.workerModel = adapterId;
|
|
38
|
+
fresh.updatedAt = new Date().toISOString();
|
|
39
|
+
const sysMsg = {
|
|
40
|
+
id: randomUUID(),
|
|
41
|
+
createdAt: new Date().toISOString(),
|
|
42
|
+
role: 'system',
|
|
43
|
+
agentId: null,
|
|
44
|
+
content: `worker set to ${adapterId}`,
|
|
45
|
+
runId: null,
|
|
46
|
+
dispatchedTo: [],
|
|
47
|
+
patches: [],
|
|
48
|
+
warnings: [],
|
|
49
|
+
};
|
|
50
|
+
fresh.messages.push(sysMsg);
|
|
51
|
+
await this._persistThread(fresh);
|
|
52
|
+
ctx.thread.workerModel = adapterId;
|
|
53
|
+
}
|
|
54
|
+
async _handleAll(ctx) {
|
|
55
|
+
await this._appendSystemMessage('collaboration engine not yet implemented — arriving in Step 12', ctx);
|
|
56
|
+
}
|
|
57
|
+
async _handleSettings(ctx) {
|
|
58
|
+
await this._appendSystemMessage('settings command not yet implemented', ctx);
|
|
59
|
+
}
|
|
60
|
+
async _handleReset(ctx) {
|
|
61
|
+
ctx.thread.agentSessions = {};
|
|
62
|
+
for (const [agentId, worktreePath] of Object.entries(ctx.thread.worktrees)) {
|
|
63
|
+
const handle = {
|
|
64
|
+
path: worktreePath,
|
|
65
|
+
branch: `fixy/${ctx.thread.id}-${agentId}`,
|
|
66
|
+
agentId,
|
|
67
|
+
threadId: ctx.thread.id,
|
|
68
|
+
};
|
|
69
|
+
await ctx.worktreeManager.reset(handle, ctx.thread.projectRoot);
|
|
70
|
+
}
|
|
71
|
+
const fresh = await ctx.store.getThread(ctx.thread.id, ctx.thread.projectRoot);
|
|
72
|
+
fresh.agentSessions = {};
|
|
73
|
+
fresh.updatedAt = new Date().toISOString();
|
|
74
|
+
await this._persistThread(fresh);
|
|
75
|
+
await this._appendSystemMessage('thread reset — all agent sessions cleared, worktrees re-provisioned', ctx);
|
|
76
|
+
}
|
|
77
|
+
async _handleStatus(ctx) {
|
|
78
|
+
const adapters = ctx.registry.list();
|
|
79
|
+
const lines = [`worker: ${ctx.thread.workerModel}`, ''];
|
|
80
|
+
for (const adapter of adapters) {
|
|
81
|
+
const probe = await adapter.probe();
|
|
82
|
+
const session = ctx.thread.agentSessions[adapter.id];
|
|
83
|
+
const sessionId = session ? session.sessionId : 'none';
|
|
84
|
+
lines.push(`adapter: ${adapter.id}`);
|
|
85
|
+
lines.push(` name: ${adapter.name}`);
|
|
86
|
+
lines.push(` available: ${probe.available ? 'yes' : 'no'}`);
|
|
87
|
+
lines.push(` version: ${probe.version ?? 'unknown'}`);
|
|
88
|
+
lines.push(` auth: ${probe.authStatus}`);
|
|
89
|
+
lines.push(` session: ${sessionId}`);
|
|
90
|
+
if (probe.detail) {
|
|
91
|
+
lines.push(` detail: ${probe.detail}`);
|
|
92
|
+
}
|
|
93
|
+
lines.push('');
|
|
94
|
+
}
|
|
95
|
+
await this._appendSystemMessage(lines.join('\n').trimEnd(), ctx);
|
|
96
|
+
}
|
|
97
|
+
async _handleBare(prompt, ctx) {
|
|
98
|
+
const { thread } = ctx;
|
|
99
|
+
const adapter = ctx.registry.require(thread.workerModel);
|
|
100
|
+
const runId = randomUUID();
|
|
101
|
+
const execCtx = {
|
|
102
|
+
runId,
|
|
103
|
+
agent: { id: adapter.id, name: adapter.name },
|
|
104
|
+
threadContext: {
|
|
105
|
+
threadId: thread.id,
|
|
106
|
+
projectRoot: thread.projectRoot,
|
|
107
|
+
worktreePath: thread.projectRoot,
|
|
108
|
+
repoRef: null,
|
|
109
|
+
},
|
|
110
|
+
messages: thread.messages,
|
|
111
|
+
prompt,
|
|
112
|
+
session: thread.agentSessions[thread.workerModel] ?? null,
|
|
113
|
+
onLog: ctx.onLog,
|
|
114
|
+
onMeta: () => { },
|
|
115
|
+
onSpawn: () => { },
|
|
116
|
+
signal: ctx.signal,
|
|
117
|
+
};
|
|
118
|
+
const result = await adapter.execute(execCtx);
|
|
119
|
+
thread.agentSessions[thread.workerModel] = result.session;
|
|
120
|
+
const agentMsg = {
|
|
121
|
+
id: randomUUID(),
|
|
122
|
+
createdAt: new Date().toISOString(),
|
|
123
|
+
role: 'agent',
|
|
124
|
+
agentId: 'fixy',
|
|
125
|
+
content: result.summary,
|
|
126
|
+
runId,
|
|
127
|
+
dispatchedTo: [],
|
|
128
|
+
patches: result.patches,
|
|
129
|
+
warnings: result.warnings,
|
|
130
|
+
};
|
|
131
|
+
await ctx.store.appendMessage(thread.id, thread.projectRoot, agentMsg);
|
|
132
|
+
}
|
|
133
|
+
async _persistThread(thread) {
|
|
134
|
+
const filePath = getThreadFile(thread.projectRoot, thread.id);
|
|
135
|
+
const tmpPath = `${filePath}.tmp`;
|
|
136
|
+
await writeFile(tmpPath, JSON.stringify(thread, null, 2), 'utf8');
|
|
137
|
+
await rename(tmpPath, filePath);
|
|
138
|
+
}
|
|
139
|
+
async _appendSystemMessage(content, ctx) {
|
|
140
|
+
const msg = {
|
|
141
|
+
id: randomUUID(),
|
|
142
|
+
createdAt: new Date().toISOString(),
|
|
143
|
+
role: 'system',
|
|
144
|
+
agentId: null,
|
|
145
|
+
content,
|
|
146
|
+
runId: null,
|
|
147
|
+
dispatchedTo: [],
|
|
148
|
+
patches: [],
|
|
149
|
+
warnings: [],
|
|
150
|
+
};
|
|
151
|
+
await ctx.store.appendMessage(ctx.thread.id, ctx.thread.projectRoot, msg);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=fixy-commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fixy-commands.js","sourceRoot":"","sources":["../src/fixy-commands.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export type { FixyRole, FixyThread, FixyMessage, FixyPatch } from './thread.js';
|
|
2
|
+
export type { FixyAgent, FixyThreadContext, FixyExecutionContext, FixyExecutionResult, FixySession, FixyInvocationMeta, FixyAdapter, FixyProbeResult, } from './adapter.js';
|
|
3
|
+
export { getFixyHome, getConfigPath, computeProjectId, getProjectDir, getProjectFile, getThreadsDir, getThreadFile, getWorktreesDir, } from './paths.js';
|
|
4
|
+
export { LocalThreadStore } from './store.js';
|
|
5
|
+
export { AdapterRegistry } from './registry.js';
|
|
6
|
+
export { Router } from './router.js';
|
|
7
|
+
export type { ParsedInput } from './router.js';
|
|
8
|
+
export { TurnController } from './turn.js';
|
|
9
|
+
export type { TurnParams } from './turn.js';
|
|
10
|
+
export { WorktreeManager } from './worktree.js';
|
|
11
|
+
export type { WorktreeHandle } from './worktree.js';
|
|
12
|
+
export { parseUnifiedDiff } from './diff-parser.js';
|
|
13
|
+
export { FixyCommandRunner } from './fixy-commands.js';
|
|
14
|
+
export type { FixyCommandContext } from './fixy-commands.js';
|
|
15
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAEhF,YAAY,EACV,SAAS,EACT,iBAAiB,EACjB,oBAAoB,EACpB,mBAAmB,EACnB,WAAW,EACX,kBAAkB,EAClB,WAAW,EACX,eAAe,GAChB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,WAAW,EACX,aAAa,EACb,gBAAgB,EAChB,aAAa,EACb,cAAc,EACd,aAAa,EACb,aAAa,EACb,eAAe,GAChB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAE9C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEhD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,YAAY,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAE5C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,YAAY,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,YAAY,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export { getFixyHome, getConfigPath, computeProjectId, getProjectDir, getProjectFile, getThreadsDir, getThreadFile, getWorktreesDir, } from './paths.js';
|
|
2
|
+
export { LocalThreadStore } from './store.js';
|
|
3
|
+
export { AdapterRegistry } from './registry.js';
|
|
4
|
+
export { Router } from './router.js';
|
|
5
|
+
export { TurnController } from './turn.js';
|
|
6
|
+
export { WorktreeManager } from './worktree.js';
|
|
7
|
+
export { parseUnifiedDiff } from './diff-parser.js';
|
|
8
|
+
export { FixyCommandRunner } from './fixy-commands.js';
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAaA,OAAO,EACL,WAAW,EACX,aAAa,EACb,gBAAgB,EAChB,aAAa,EACb,cAAc,EACd,aAAa,EACb,aAAa,EACb,eAAe,GAChB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAE9C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEhD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAGrC,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAG3C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEhD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC"}
|
package/dist/paths.d.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/** Returns the Fixy home directory. Respects FIXY_HOME env var for testing. */
|
|
2
|
+
export declare function getFixyHome(): string;
|
|
3
|
+
/** Returns the path to the global config file. */
|
|
4
|
+
export declare function getConfigPath(): string;
|
|
5
|
+
/** Computes the project id (sha1 hex digest of the absolute projectRoot). */
|
|
6
|
+
export declare function computeProjectId(projectRoot: string): string;
|
|
7
|
+
/** Returns the project directory for a given projectRoot. */
|
|
8
|
+
export declare function getProjectDir(projectRoot: string): string;
|
|
9
|
+
/** Returns the project.json path for a given projectRoot. */
|
|
10
|
+
export declare function getProjectFile(projectRoot: string): string;
|
|
11
|
+
/** Returns the threads directory for a given projectRoot. */
|
|
12
|
+
export declare function getThreadsDir(projectRoot: string): string;
|
|
13
|
+
/** Returns the full path to a thread JSON file. */
|
|
14
|
+
export declare function getThreadFile(projectRoot: string, threadId: string): string;
|
|
15
|
+
/** Returns the worktrees directory for a given threadId. */
|
|
16
|
+
export declare function getWorktreesDir(threadId: string): string;
|
|
17
|
+
//# sourceMappingURL=paths.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAIA,+EAA+E;AAC/E,wBAAgB,WAAW,IAAI,MAAM,CAEpC;AAED,kDAAkD;AAClD,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED,6EAA6E;AAC7E,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED,6DAA6D;AAC7D,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED,6DAA6D;AAC7D,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED,6DAA6D;AAC7D,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED,mDAAmD;AACnD,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE3E;AAED,4DAA4D;AAC5D,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAExD"}
|
package/dist/paths.js
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { homedir } from 'node:os';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
/** Returns the Fixy home directory. Respects FIXY_HOME env var for testing. */
|
|
5
|
+
export function getFixyHome() {
|
|
6
|
+
return process.env['FIXY_HOME'] ?? join(homedir(), '.fixy');
|
|
7
|
+
}
|
|
8
|
+
/** Returns the path to the global config file. */
|
|
9
|
+
export function getConfigPath() {
|
|
10
|
+
return join(getFixyHome(), 'config.json');
|
|
11
|
+
}
|
|
12
|
+
/** Computes the project id (sha1 hex digest of the absolute projectRoot). */
|
|
13
|
+
export function computeProjectId(projectRoot) {
|
|
14
|
+
return createHash('sha1').update(projectRoot).digest('hex');
|
|
15
|
+
}
|
|
16
|
+
/** Returns the project directory for a given projectRoot. */
|
|
17
|
+
export function getProjectDir(projectRoot) {
|
|
18
|
+
return join(getFixyHome(), 'projects', computeProjectId(projectRoot));
|
|
19
|
+
}
|
|
20
|
+
/** Returns the project.json path for a given projectRoot. */
|
|
21
|
+
export function getProjectFile(projectRoot) {
|
|
22
|
+
return join(getProjectDir(projectRoot), 'project.json');
|
|
23
|
+
}
|
|
24
|
+
/** Returns the threads directory for a given projectRoot. */
|
|
25
|
+
export function getThreadsDir(projectRoot) {
|
|
26
|
+
return join(getProjectDir(projectRoot), 'threads');
|
|
27
|
+
}
|
|
28
|
+
/** Returns the full path to a thread JSON file. */
|
|
29
|
+
export function getThreadFile(projectRoot, threadId) {
|
|
30
|
+
return join(getThreadsDir(projectRoot), `${threadId}.json`);
|
|
31
|
+
}
|
|
32
|
+
/** Returns the worktrees directory for a given threadId. */
|
|
33
|
+
export function getWorktreesDir(threadId) {
|
|
34
|
+
return join(getFixyHome(), 'worktrees', threadId);
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,+EAA+E;AAC/E,MAAM,UAAU,WAAW;IACzB,OAAO,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,OAAO,CAAC,CAAC;AAC9D,CAAC;AAED,kDAAkD;AAClD,MAAM,UAAU,aAAa;IAC3B,OAAO,IAAI,CAAC,WAAW,EAAE,EAAE,aAAa,CAAC,CAAC;AAC5C,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,gBAAgB,CAAC,WAAmB;IAClD,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC9D,CAAC;AAED,6DAA6D;AAC7D,MAAM,UAAU,aAAa,CAAC,WAAmB;IAC/C,OAAO,IAAI,CAAC,WAAW,EAAE,EAAE,UAAU,EAAE,gBAAgB,CAAC,WAAW,CAAC,CAAC,CAAC;AACxE,CAAC;AAED,6DAA6D;AAC7D,MAAM,UAAU,cAAc,CAAC,WAAmB;IAChD,OAAO,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,EAAE,cAAc,CAAC,CAAC;AAC1D,CAAC;AAED,6DAA6D;AAC7D,MAAM,UAAU,aAAa,CAAC,WAAmB;IAC/C,OAAO,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,EAAE,SAAS,CAAC,CAAC;AACrD,CAAC;AAED,mDAAmD;AACnD,MAAM,UAAU,aAAa,CAAC,WAAmB,EAAE,QAAgB;IACjE,OAAO,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,EAAE,GAAG,QAAQ,OAAO,CAAC,CAAC;AAC9D,CAAC;AAED,4DAA4D;AAC5D,MAAM,UAAU,eAAe,CAAC,QAAgB;IAC9C,OAAO,IAAI,CAAC,WAAW,EAAE,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;AACpD,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { FixyAdapter } from './adapter.js';
|
|
2
|
+
export declare class AdapterRegistry {
|
|
3
|
+
private readonly adapters;
|
|
4
|
+
register(adapter: FixyAdapter): void;
|
|
5
|
+
unregister(id: string): void;
|
|
6
|
+
require(id: string): FixyAdapter;
|
|
7
|
+
get(id: string): FixyAdapter | undefined;
|
|
8
|
+
list(): FixyAdapter[];
|
|
9
|
+
has(id: string): boolean;
|
|
10
|
+
clear(): void;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhD,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAkC;IAE3D,QAAQ,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI;IAOpC,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAI5B,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,WAAW;IAQhC,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAIxC,IAAI,IAAI,WAAW,EAAE;IAIrB,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAIxB,KAAK,IAAI,IAAI;CAGd"}
|
package/dist/registry.js
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export class AdapterRegistry {
|
|
2
|
+
adapters = new Map();
|
|
3
|
+
register(adapter) {
|
|
4
|
+
if (this.adapters.has(adapter.id)) {
|
|
5
|
+
throw new Error(`Adapter already registered: ${adapter.id}`);
|
|
6
|
+
}
|
|
7
|
+
this.adapters.set(adapter.id, adapter);
|
|
8
|
+
}
|
|
9
|
+
unregister(id) {
|
|
10
|
+
this.adapters.delete(id);
|
|
11
|
+
}
|
|
12
|
+
require(id) {
|
|
13
|
+
const adapter = this.adapters.get(id);
|
|
14
|
+
if (adapter === undefined) {
|
|
15
|
+
throw new Error(`Unknown adapter: ${id}`);
|
|
16
|
+
}
|
|
17
|
+
return adapter;
|
|
18
|
+
}
|
|
19
|
+
get(id) {
|
|
20
|
+
return this.adapters.get(id);
|
|
21
|
+
}
|
|
22
|
+
list() {
|
|
23
|
+
return Array.from(this.adapters.values());
|
|
24
|
+
}
|
|
25
|
+
has(id) {
|
|
26
|
+
return this.adapters.has(id);
|
|
27
|
+
}
|
|
28
|
+
clear() {
|
|
29
|
+
this.adapters.clear();
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,eAAe;IACT,QAAQ,GAAG,IAAI,GAAG,EAAuB,CAAC;IAE3D,QAAQ,CAAC,OAAoB;QAC3B,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,+BAA+B,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;QAC/D,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;IACzC,CAAC;IAED,UAAU,CAAC,EAAU;QACnB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC3B,CAAC;IAED,OAAO,CAAC,EAAU;QAChB,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACtC,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,oBAAoB,EAAE,EAAE,CAAC,CAAC;QAC5C,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,GAAG,CAAC,EAAU;QACZ,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC/B,CAAC;IAED,IAAI;QACF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,GAAG,CAAC,EAAU;QACZ,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC/B,CAAC;IAED,KAAK;QACH,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;CACF"}
|
package/dist/router.d.ts
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { AdapterRegistry } from './registry.js';
|
|
2
|
+
export type ParsedInput = {
|
|
3
|
+
kind: 'mention';
|
|
4
|
+
agentIds: string[];
|
|
5
|
+
body: string;
|
|
6
|
+
} | {
|
|
7
|
+
kind: 'fixy';
|
|
8
|
+
rest: string;
|
|
9
|
+
} | {
|
|
10
|
+
kind: 'bare';
|
|
11
|
+
body: string;
|
|
12
|
+
} | {
|
|
13
|
+
kind: 'error';
|
|
14
|
+
reason: string;
|
|
15
|
+
};
|
|
16
|
+
export declare class Router {
|
|
17
|
+
private readonly registry;
|
|
18
|
+
constructor(registry: AdapterRegistry);
|
|
19
|
+
parse(input: string): ParsedInput;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=router.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAErD,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACrD;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAItC,qBAAa,MAAM;IACL,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,EAAE,eAAe;IAEtD,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW;CAiClC"}
|
package/dist/router.js
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
// packages/core/src/router.ts
|
|
2
|
+
const MENTION_RE = /^@(\w+)/;
|
|
3
|
+
export class Router {
|
|
4
|
+
registry;
|
|
5
|
+
constructor(registry) {
|
|
6
|
+
this.registry = registry;
|
|
7
|
+
}
|
|
8
|
+
parse(input) {
|
|
9
|
+
if (!input.startsWith('@')) {
|
|
10
|
+
return { kind: 'bare', body: input };
|
|
11
|
+
}
|
|
12
|
+
const tokens = [];
|
|
13
|
+
let remaining = input;
|
|
14
|
+
while (remaining.startsWith('@')) {
|
|
15
|
+
const match = MENTION_RE.exec(remaining);
|
|
16
|
+
if (!match)
|
|
17
|
+
break;
|
|
18
|
+
// @fixy as first token: everything after it is the rest
|
|
19
|
+
if (tokens.length === 0 && match[1] === 'fixy') {
|
|
20
|
+
return { kind: 'fixy', rest: remaining.slice(match[0].length).trimStart() };
|
|
21
|
+
}
|
|
22
|
+
tokens.push(match[1]);
|
|
23
|
+
remaining = remaining.slice(match[0].length).trimStart();
|
|
24
|
+
}
|
|
25
|
+
if (tokens.length === 0) {
|
|
26
|
+
return { kind: 'bare', body: input };
|
|
27
|
+
}
|
|
28
|
+
for (const token of tokens) {
|
|
29
|
+
if (!this.registry.has(token)) {
|
|
30
|
+
return { kind: 'error', reason: `unknown agent: @${token}` };
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return { kind: 'mention', agentIds: tokens, body: remaining };
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=router.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"router.js","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"AAAA,8BAA8B;AAU9B,MAAM,UAAU,GAAG,SAAS,CAAC;AAE7B,MAAM,OAAO,MAAM;IACY;IAA7B,YAA6B,QAAyB;QAAzB,aAAQ,GAAR,QAAQ,CAAiB;IAAG,CAAC;IAE1D,KAAK,CAAC,KAAa;QACjB,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC3B,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;QACvC,CAAC;QAED,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,IAAI,SAAS,GAAG,KAAK,CAAC;QAEtB,OAAO,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACjC,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACzC,IAAI,CAAC,KAAK;gBAAE,MAAM;YAElB,wDAAwD;YACxD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC;gBAC/C,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC;YAC9E,CAAC;YAED,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YACtB,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,CAAC;QAC3D,CAAC;QAED,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;QACvC,CAAC;QAED,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC9B,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,mBAAmB,KAAK,EAAE,EAAE,CAAC;YAC/D,CAAC;QACH,CAAC;QAED,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;IAChE,CAAC;CACF"}
|
package/dist/store.d.ts
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { FixyMessage, FixyThread } from './thread.js';
|
|
2
|
+
export declare class LocalThreadStore {
|
|
3
|
+
/**
|
|
4
|
+
* Ensures the top-level `projects/` and `worktrees/` directories exist
|
|
5
|
+
* under the Fixy home directory.
|
|
6
|
+
*/
|
|
7
|
+
init(): Promise<void>;
|
|
8
|
+
/**
|
|
9
|
+
* Creates a new thread for the given project root, persisting it to disk.
|
|
10
|
+
* Writes project.json if it does not already exist.
|
|
11
|
+
*/
|
|
12
|
+
createThread(projectRoot: string): Promise<FixyThread>;
|
|
13
|
+
/**
|
|
14
|
+
* Appends a message to an existing thread and persists the update.
|
|
15
|
+
* Throws if the thread does not exist.
|
|
16
|
+
*/
|
|
17
|
+
appendMessage(threadId: string, projectRoot: string, message: FixyMessage): Promise<FixyThread>;
|
|
18
|
+
/**
|
|
19
|
+
* Reads and returns a single thread by id.
|
|
20
|
+
* Throws if the thread file does not exist.
|
|
21
|
+
*/
|
|
22
|
+
getThread(threadId: string, projectRoot: string): Promise<FixyThread>;
|
|
23
|
+
/**
|
|
24
|
+
* Returns all threads for the given project root.
|
|
25
|
+
* Returns an empty array if the threads directory does not exist yet.
|
|
26
|
+
*/
|
|
27
|
+
listThreads(projectRoot: string): Promise<FixyThread[]>;
|
|
28
|
+
/**
|
|
29
|
+
* Sets the thread status to "archived" and persists the change.
|
|
30
|
+
* Throws if the thread does not exist.
|
|
31
|
+
*/
|
|
32
|
+
archiveThread(threadId: string, projectRoot: string): Promise<FixyThread>;
|
|
33
|
+
/** Atomically writes an object as formatted JSON: write to *.tmp, then rename. */
|
|
34
|
+
private _writeAtomic;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAS3D,qBAAa,gBAAgB;IAC3B;;;OAGG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ3B;;;OAGG;IACG,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IA0C5D;;;OAGG;IACG,aAAa,CACjB,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,UAAU,CAAC;IAWtB;;;OAGG;IACG,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAa3E;;;OAGG;IACG,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAwB7D;;;OAGG;IACG,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAe/E,kFAAkF;YACpE,YAAY;CAK3B"}
|
package/dist/store.js
ADDED
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
// packages/core/src/store.ts
|
|
2
|
+
import { mkdir, readdir, readFile, rename, writeFile } from 'node:fs/promises';
|
|
3
|
+
import { randomUUID } from 'node:crypto';
|
|
4
|
+
import { join } from 'node:path';
|
|
5
|
+
import { computeProjectId, getFixyHome, getProjectFile, getThreadFile, getThreadsDir, } from './paths.js';
|
|
6
|
+
export class LocalThreadStore {
|
|
7
|
+
/**
|
|
8
|
+
* Ensures the top-level `projects/` and `worktrees/` directories exist
|
|
9
|
+
* under the Fixy home directory.
|
|
10
|
+
*/
|
|
11
|
+
async init() {
|
|
12
|
+
const home = getFixyHome();
|
|
13
|
+
await Promise.all([
|
|
14
|
+
mkdir(join(home, 'projects'), { recursive: true }),
|
|
15
|
+
mkdir(join(home, 'worktrees'), { recursive: true }),
|
|
16
|
+
]);
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Creates a new thread for the given project root, persisting it to disk.
|
|
20
|
+
* Writes project.json if it does not already exist.
|
|
21
|
+
*/
|
|
22
|
+
async createThread(projectRoot) {
|
|
23
|
+
const id = randomUUID();
|
|
24
|
+
const projectId = computeProjectId(projectRoot);
|
|
25
|
+
const now = new Date().toISOString();
|
|
26
|
+
// Ensure project and threads directories exist.
|
|
27
|
+
await mkdir(getThreadsDir(projectRoot), { recursive: true });
|
|
28
|
+
// Write project.json only if it doesn't already exist (flag 'wx').
|
|
29
|
+
const projectFile = getProjectFile(projectRoot);
|
|
30
|
+
try {
|
|
31
|
+
await writeFile(projectFile, JSON.stringify({ projectId, projectRoot, createdAt: now }, null, 2), { flag: 'wx' });
|
|
32
|
+
}
|
|
33
|
+
catch (err) {
|
|
34
|
+
// EEXIST means the file already exists — that's fine.
|
|
35
|
+
if (err.code !== 'EEXIST') {
|
|
36
|
+
throw err;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
const thread = {
|
|
40
|
+
id,
|
|
41
|
+
projectId,
|
|
42
|
+
projectRoot,
|
|
43
|
+
createdAt: now,
|
|
44
|
+
updatedAt: now,
|
|
45
|
+
title: null,
|
|
46
|
+
status: 'active',
|
|
47
|
+
workerModel: 'claude',
|
|
48
|
+
agentSessions: {},
|
|
49
|
+
worktrees: {},
|
|
50
|
+
messages: [],
|
|
51
|
+
};
|
|
52
|
+
await this._writeAtomic(getThreadFile(projectRoot, id), thread);
|
|
53
|
+
return thread;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Appends a message to an existing thread and persists the update.
|
|
57
|
+
* Throws if the thread does not exist.
|
|
58
|
+
*/
|
|
59
|
+
async appendMessage(threadId, projectRoot, message) {
|
|
60
|
+
const thread = await this.getThread(threadId, projectRoot);
|
|
61
|
+
thread.messages.push(message);
|
|
62
|
+
thread.updatedAt = new Date().toISOString();
|
|
63
|
+
await this._writeAtomic(getThreadFile(projectRoot, threadId), thread);
|
|
64
|
+
return thread;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Reads and returns a single thread by id.
|
|
68
|
+
* Throws if the thread file does not exist.
|
|
69
|
+
*/
|
|
70
|
+
async getThread(threadId, projectRoot) {
|
|
71
|
+
const threadPath = getThreadFile(projectRoot, threadId);
|
|
72
|
+
try {
|
|
73
|
+
const raw = await readFile(threadPath, 'utf8');
|
|
74
|
+
return JSON.parse(raw);
|
|
75
|
+
}
|
|
76
|
+
catch (err) {
|
|
77
|
+
if (err.code === 'ENOENT') {
|
|
78
|
+
throw new Error(`Thread not found: ${threadId}`, { cause: err });
|
|
79
|
+
}
|
|
80
|
+
throw err;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Returns all threads for the given project root.
|
|
85
|
+
* Returns an empty array if the threads directory does not exist yet.
|
|
86
|
+
*/
|
|
87
|
+
async listThreads(projectRoot) {
|
|
88
|
+
const threadsDir = getThreadsDir(projectRoot);
|
|
89
|
+
let entries;
|
|
90
|
+
try {
|
|
91
|
+
entries = await readdir(threadsDir);
|
|
92
|
+
}
|
|
93
|
+
catch (err) {
|
|
94
|
+
if (err.code === 'ENOENT') {
|
|
95
|
+
return [];
|
|
96
|
+
}
|
|
97
|
+
throw err;
|
|
98
|
+
}
|
|
99
|
+
const jsonFiles = entries.filter((f) => f.endsWith('.json') && !f.endsWith('.tmp'));
|
|
100
|
+
const threads = await Promise.all(jsonFiles.map(async (file) => {
|
|
101
|
+
const raw = await readFile(join(threadsDir, file), 'utf8');
|
|
102
|
+
return JSON.parse(raw);
|
|
103
|
+
}));
|
|
104
|
+
return threads;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Sets the thread status to "archived" and persists the change.
|
|
108
|
+
* Throws if the thread does not exist.
|
|
109
|
+
*/
|
|
110
|
+
async archiveThread(threadId, projectRoot) {
|
|
111
|
+
const thread = await this.getThread(threadId, projectRoot);
|
|
112
|
+
thread.status = 'archived';
|
|
113
|
+
thread.updatedAt = new Date().toISOString();
|
|
114
|
+
await this._writeAtomic(getThreadFile(projectRoot, threadId), thread);
|
|
115
|
+
return thread;
|
|
116
|
+
}
|
|
117
|
+
// ---------------------------------------------------------------------------
|
|
118
|
+
// Private helpers
|
|
119
|
+
// ---------------------------------------------------------------------------
|
|
120
|
+
/** Atomically writes an object as formatted JSON: write to *.tmp, then rename. */
|
|
121
|
+
async _writeAtomic(destPath, data) {
|
|
122
|
+
const tmpPath = `${destPath}.tmp`;
|
|
123
|
+
await writeFile(tmpPath, JSON.stringify(data, null, 2), 'utf8');
|
|
124
|
+
await rename(tmpPath, destPath);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
|
package/dist/thread.d.ts
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import type { FixySession } from './adapter.js';
|
|
2
|
+
export type FixyRole = 'user' | 'agent' | 'system';
|
|
3
|
+
export interface FixyThread {
|
|
4
|
+
id: string;
|
|
5
|
+
projectId: string;
|
|
6
|
+
projectRoot: string;
|
|
7
|
+
createdAt: string;
|
|
8
|
+
updatedAt: string;
|
|
9
|
+
title: string | null;
|
|
10
|
+
status: 'active' | 'archived';
|
|
11
|
+
workerModel: string;
|
|
12
|
+
agentSessions: Record<string, FixySession | null>;
|
|
13
|
+
worktrees: Record<string, string>;
|
|
14
|
+
messages: FixyMessage[];
|
|
15
|
+
}
|
|
16
|
+
export interface FixyMessage {
|
|
17
|
+
id: string;
|
|
18
|
+
createdAt: string;
|
|
19
|
+
role: FixyRole;
|
|
20
|
+
/** For role=agent, the adapter id that produced this message. */
|
|
21
|
+
agentId: string | null;
|
|
22
|
+
/** The raw user input or agent summary. Streamed chunks are concatenated here once settled. */
|
|
23
|
+
content: string;
|
|
24
|
+
/** For role=agent, the runId of the FixyAdapter.execute() call. */
|
|
25
|
+
runId: string | null;
|
|
26
|
+
/** For role=user, the list of adapter ids the router dispatched this message to. */
|
|
27
|
+
dispatchedTo: string[];
|
|
28
|
+
/** Patches captured from the agent's worktree after the turn, if any. */
|
|
29
|
+
patches: FixyPatch[];
|
|
30
|
+
/** Non-fatal warnings surfaced to the user. */
|
|
31
|
+
warnings: string[];
|
|
32
|
+
}
|
|
33
|
+
export interface FixyPatch {
|
|
34
|
+
/** Absolute path of the file inside the adapter's worktree. */
|
|
35
|
+
filePath: string;
|
|
36
|
+
/** Path relative to the thread's project root. */
|
|
37
|
+
relativePath: string;
|
|
38
|
+
/** Unified diff produced by `git diff --no-color` inside the worktree. */
|
|
39
|
+
diff: string;
|
|
40
|
+
/** Bytes added / removed, populated by the worktree manager. */
|
|
41
|
+
stats: {
|
|
42
|
+
additions: number;
|
|
43
|
+
deletions: number;
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
export type { FixySession } from './adapter.js';
|
|
47
|
+
//# sourceMappingURL=thread.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"thread.d.ts","sourceRoot":"","sources":["../src/thread.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhD,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;AAEnD,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,MAAM,EAAE,QAAQ,GAAG,UAAU,CAAC;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC,CAAC;IAClD,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,QAAQ,EAAE,WAAW,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,QAAQ,CAAC;IACf,iEAAiE;IACjE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,+FAA+F;IAC/F,OAAO,EAAE,MAAM,CAAC;IAChB,mEAAmE;IACnE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,oFAAoF;IACpF,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,yEAAyE;IACzE,OAAO,EAAE,SAAS,EAAE,CAAC;IACrB,+CAA+C;IAC/C,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,SAAS;IACxB,+DAA+D;IAC/D,QAAQ,EAAE,MAAM,CAAC;IACjB,kDAAkD;IAClD,YAAY,EAAE,MAAM,CAAC;IACrB,0EAA0E;IAC1E,IAAI,EAAE,MAAM,CAAC;IACb,gEAAgE;IAChE,KAAK,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;CACjD;AAED,YAAY,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC"}
|
package/dist/thread.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"thread.js","sourceRoot":"","sources":["../src/thread.ts"],"names":[],"mappings":"AAAA,8BAA8B"}
|