opencastle 0.10.7 → 0.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -0
- package/bin/cli.mjs +4 -0
- package/dist/cli/convoy/events.d.ts +10 -0
- package/dist/cli/convoy/events.d.ts.map +1 -0
- package/dist/cli/convoy/events.js +27 -0
- package/dist/cli/convoy/events.js.map +1 -0
- package/dist/cli/convoy/events.test.d.ts +2 -0
- package/dist/cli/convoy/events.test.d.ts.map +1 -0
- package/dist/cli/convoy/events.test.js +94 -0
- package/dist/cli/convoy/events.test.js.map +1 -0
- package/dist/cli/convoy/store.d.ts +23 -0
- package/dist/cli/convoy/store.d.ts.map +1 -0
- package/dist/cli/convoy/store.js +210 -0
- package/dist/cli/convoy/store.js.map +1 -0
- package/dist/cli/convoy/store.test.d.ts +2 -0
- package/dist/cli/convoy/store.test.d.ts.map +1 -0
- package/dist/cli/convoy/store.test.js +387 -0
- package/dist/cli/convoy/store.test.js.map +1 -0
- package/dist/cli/convoy/types.d.ts +56 -0
- package/dist/cli/convoy/types.d.ts.map +1 -0
- package/dist/cli/convoy/types.js +2 -0
- package/dist/cli/convoy/types.js.map +1 -0
- package/dist/cli/dashboard.d.ts.map +1 -1
- package/dist/cli/dashboard.js +5 -1
- package/dist/cli/dashboard.js.map +1 -1
- package/dist/cli/init.test.js +1 -1
- package/dist/cli/init.test.js.map +1 -1
- package/dist/cli/lesson.d.ts +17 -0
- package/dist/cli/lesson.d.ts.map +1 -0
- package/dist/cli/lesson.js +294 -0
- package/dist/cli/lesson.js.map +1 -0
- package/dist/cli/log.d.ts +7 -0
- package/dist/cli/log.d.ts.map +1 -0
- package/dist/cli/log.js +131 -0
- package/dist/cli/log.js.map +1 -0
- package/dist/cli/run/executor.js.map +1 -1
- package/dist/cli/run/executor.test.js +1 -0
- package/dist/cli/run/executor.test.js.map +1 -1
- package/dist/cli/run/loop-executor.d.ts +3 -0
- package/dist/cli/run/loop-executor.d.ts.map +1 -0
- package/dist/cli/run/loop-executor.js +155 -0
- package/dist/cli/run/loop-executor.js.map +1 -0
- package/dist/cli/run/loop-reporter.d.ts +6 -0
- package/dist/cli/run/loop-reporter.d.ts.map +1 -0
- package/dist/cli/run/loop-reporter.js +112 -0
- package/dist/cli/run/loop-reporter.js.map +1 -0
- package/dist/cli/run/reporter.d.ts.map +1 -1
- package/dist/cli/run/reporter.js +28 -1
- package/dist/cli/run/reporter.js.map +1 -1
- package/dist/cli/run/schema.d.ts +4 -0
- package/dist/cli/run/schema.d.ts.map +1 -1
- package/dist/cli/run/schema.js +178 -50
- package/dist/cli/run/schema.js.map +1 -1
- package/dist/cli/run/schema.test.js +598 -1
- package/dist/cli/run/schema.test.js.map +1 -1
- package/dist/cli/run.d.ts.map +1 -1
- package/dist/cli/run.js +84 -3
- package/dist/cli/run.js.map +1 -1
- package/dist/cli/types.d.ts +78 -1
- package/dist/cli/types.d.ts.map +1 -1
- package/dist/cli/update.d.ts.map +1 -1
- package/dist/cli/update.js +54 -1
- package/dist/cli/update.js.map +1 -1
- package/package.json +3 -2
- package/src/cli/convoy/events.test.ts +118 -0
- package/src/cli/convoy/events.ts +41 -0
- package/src/cli/convoy/store.test.ts +446 -0
- package/src/cli/convoy/store.ts +308 -0
- package/src/cli/convoy/types.ts +68 -0
- package/src/cli/dashboard.ts +5 -1
- package/src/cli/init.test.ts +1 -1
- package/src/cli/lesson.ts +312 -0
- package/src/cli/log.ts +133 -0
- package/src/cli/run/executor.test.ts +1 -0
- package/src/cli/run/executor.ts +8 -8
- package/src/cli/run/loop-executor.ts +199 -0
- package/src/cli/run/loop-reporter.ts +125 -0
- package/src/cli/run/reporter.ts +30 -1
- package/src/cli/run/schema.test.ts +704 -3
- package/src/cli/run/schema.ts +206 -56
- package/src/cli/run.ts +82 -5
- package/src/cli/types.ts +87 -1
- package/src/cli/update.ts +62 -1
- package/src/dashboard/dist/index.html +14 -15
- package/src/dashboard/node_modules/.vite/deps/_metadata.json +6 -6
- package/src/dashboard/scripts/generate-seed-data.ts +23 -43
- package/src/dashboard/seed-data/events.ndjson +104 -0
- package/src/dashboard/src/pages/index.astro +14 -15
- package/src/orchestrator/agents/api-designer.agent.md +1 -1
- package/src/orchestrator/agents/architect.agent.md +1 -1
- package/src/orchestrator/agents/content-engineer.agent.md +1 -1
- package/src/orchestrator/agents/copywriter.agent.md +1 -1
- package/src/orchestrator/agents/data-expert.agent.md +1 -1
- package/src/orchestrator/agents/database-engineer.agent.md +1 -1
- package/src/orchestrator/agents/developer.agent.md +1 -1
- package/src/orchestrator/agents/devops-expert.agent.md +1 -1
- package/src/orchestrator/agents/documentation-writer.agent.md +1 -1
- package/src/orchestrator/agents/performance-expert.agent.md +1 -1
- package/src/orchestrator/agents/release-manager.agent.md +1 -1
- package/src/orchestrator/agents/security-expert.agent.md +1 -1
- package/src/orchestrator/agents/seo-specialist.agent.md +1 -1
- package/src/orchestrator/agents/session-guard.agent.md +9 -21
- package/src/orchestrator/agents/team-lead.agent.md +8 -34
- package/src/orchestrator/agents/testing-expert.agent.md +1 -1
- package/src/orchestrator/agents/ui-ux-expert.agent.md +1 -1
- package/src/orchestrator/customizations/AGENT-PERFORMANCE.md +11 -12
- package/src/orchestrator/customizations/DISPUTES.md +2 -2
- package/src/orchestrator/customizations/README.md +1 -3
- package/src/orchestrator/customizations/logs/README.md +66 -14
- package/src/orchestrator/instructions/ai-optimization.instructions.md +21 -132
- package/src/orchestrator/instructions/general.instructions.md +35 -181
- package/src/orchestrator/plugins/nx/SKILL.md +1 -1
- package/src/orchestrator/prompts/bootstrap-customizations.prompt.md +4 -8
- package/src/orchestrator/prompts/bug-fix.prompt.md +4 -4
- package/src/orchestrator/prompts/implement-feature.prompt.md +3 -3
- package/src/orchestrator/prompts/quick-refinement.prompt.md +3 -3
- package/src/orchestrator/prompts/resolve-pr-comments.prompt.md +1 -1
- package/src/orchestrator/skills/agent-hooks/SKILL.md +11 -11
- package/src/orchestrator/skills/decomposition/SKILL.md +1 -1
- package/src/orchestrator/skills/fast-review/SKILL.md +4 -19
- package/src/orchestrator/skills/git-workflow/SKILL.md +72 -0
- package/src/orchestrator/skills/memory-merger/SKILL.md +1 -1
- package/src/orchestrator/skills/observability-logging/SKILL.md +129 -0
- package/src/orchestrator/skills/orchestration-protocols/SKILL.md +2 -2
- package/src/orchestrator/skills/panel-majority-vote/SKILL.md +4 -7
- package/src/orchestrator/skills/self-improvement/SKILL.md +13 -26
- package/src/orchestrator/skills/team-lead-reference/SKILL.md +2 -2
- package/src/orchestrator/customizations/logs/delegations.ndjson +0 -1
- package/src/orchestrator/customizations/logs/panels.ndjson +0 -1
- package/src/orchestrator/customizations/logs/reviews.ndjson +0 -0
- package/src/orchestrator/customizations/logs/sessions.ndjson +0 -1
- /package/src/orchestrator/customizations/logs/{disputes.ndjson → events.ndjson} +0 -0
package/README.md
CHANGED
|
@@ -40,6 +40,10 @@ One command. Any repo. Any IDE.
|
|
|
40
40
|
npx opencastle init
|
|
41
41
|
```
|
|
42
42
|
|
|
43
|
+
<p align="center">
|
|
44
|
+
<img src="opencastle-init.gif" alt="npx opencastle init" width="720" />
|
|
45
|
+
</p>
|
|
46
|
+
|
|
43
47
|
The CLI asks about your IDEs and stack. It installs agents, skills, and MCP servers tailored to your project.
|
|
44
48
|
|
|
45
49
|
You can select multiple IDEs and tools — the output is adapted for each one.
|
package/bin/cli.mjs
CHANGED
|
@@ -24,6 +24,8 @@ const HELP = `
|
|
|
24
24
|
run Process a task queue from a spec file autonomously
|
|
25
25
|
dashboard View agent observability dashboard in your browser
|
|
26
26
|
doctor Validate your OpenCastle setup
|
|
27
|
+
log Append a structured event to the observability log
|
|
28
|
+
lesson Append a structured lesson to LESSONS-LEARNED.md
|
|
27
29
|
|
|
28
30
|
Options:
|
|
29
31
|
--dry-run Preview what a command would change without writing files
|
|
@@ -51,6 +53,8 @@ const commands = {
|
|
|
51
53
|
run: () => import('../dist/cli/run.js'),
|
|
52
54
|
dashboard: () => import('../dist/cli/dashboard.js'),
|
|
53
55
|
doctor: () => import('../dist/cli/doctor.js'),
|
|
56
|
+
log: () => import('../dist/cli/log.js'),
|
|
57
|
+
lesson: () => import('../dist/cli/lesson.js'),
|
|
54
58
|
}
|
|
55
59
|
|
|
56
60
|
if (!commands[command]) {
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ConvoyStore } from './store.js';
|
|
2
|
+
export interface ConvoyEventEmitter {
|
|
3
|
+
emit(type: string, data?: Record<string, unknown>, ids?: {
|
|
4
|
+
convoy_id?: string;
|
|
5
|
+
task_id?: string;
|
|
6
|
+
worker_id?: string;
|
|
7
|
+
}): void;
|
|
8
|
+
}
|
|
9
|
+
export declare function createEventEmitter(store: ConvoyStore, logsDir?: string): ConvoyEventEmitter;
|
|
10
|
+
//# sourceMappingURL=events.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../../src/cli/convoy/events.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAE7C,MAAM,WAAW,kBAAkB;IACjC,IAAI,CACF,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,GAAG,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GACjE,IAAI,CAAA;CACR;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,kBAAkB,CA6B3F"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { appendEvent as appendNdjson } from '../log.js';
|
|
2
|
+
export function createEventEmitter(store, logsDir) {
|
|
3
|
+
return {
|
|
4
|
+
emit(type, data, ids) {
|
|
5
|
+
const now = new Date().toISOString();
|
|
6
|
+
store.insertEvent({
|
|
7
|
+
convoy_id: ids?.convoy_id ?? null,
|
|
8
|
+
task_id: ids?.task_id ?? null,
|
|
9
|
+
worker_id: ids?.worker_id ?? null,
|
|
10
|
+
type,
|
|
11
|
+
data: data !== undefined ? JSON.stringify(data) : null,
|
|
12
|
+
created_at: now,
|
|
13
|
+
});
|
|
14
|
+
appendNdjson({
|
|
15
|
+
timestamp: now,
|
|
16
|
+
type,
|
|
17
|
+
convoy_id: ids?.convoy_id ?? null,
|
|
18
|
+
task_id: ids?.task_id ?? null,
|
|
19
|
+
worker_id: ids?.worker_id ?? null,
|
|
20
|
+
...(data ?? {}),
|
|
21
|
+
}, logsDir ?? null).catch(() => {
|
|
22
|
+
// fire-and-forget: NDJSON write failure must not crash the convoy engine
|
|
23
|
+
});
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.js","sourceRoot":"","sources":["../../../src/cli/convoy/events.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,IAAI,YAAY,EAAE,MAAM,WAAW,CAAA;AAWvD,MAAM,UAAU,kBAAkB,CAAC,KAAkB,EAAE,OAAgB;IACrE,OAAO;QACL,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG;YAClB,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;YAEpC,KAAK,CAAC,WAAW,CAAC;gBAChB,SAAS,EAAE,GAAG,EAAE,SAAS,IAAI,IAAI;gBACjC,OAAO,EAAE,GAAG,EAAE,OAAO,IAAI,IAAI;gBAC7B,SAAS,EAAE,GAAG,EAAE,SAAS,IAAI,IAAI;gBACjC,IAAI;gBACJ,IAAI,EAAE,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI;gBACtD,UAAU,EAAE,GAAG;aAChB,CAAC,CAAA;YAEF,YAAY,CACV;gBACE,SAAS,EAAE,GAAG;gBACd,IAAI;gBACJ,SAAS,EAAE,GAAG,EAAE,SAAS,IAAI,IAAI;gBACjC,OAAO,EAAE,GAAG,EAAE,OAAO,IAAI,IAAI;gBAC7B,SAAS,EAAE,GAAG,EAAE,SAAS,IAAI,IAAI;gBACjC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;aAChB,EACD,OAAO,IAAI,IAAI,CAChB,CAAC,KAAK,CAAC,GAAG,EAAE;gBACX,yEAAyE;YAC3E,CAAC,CAAC,CAAA;QACJ,CAAC;KACF,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.test.d.ts","sourceRoot":"","sources":["../../../src/cli/convoy/events.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { mkdtempSync, rmSync } from 'node:fs';
|
|
2
|
+
import { tmpdir } from 'node:os';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
5
|
+
import { createConvoyStore } from './store.js';
|
|
6
|
+
import { createEventEmitter } from './events.js';
|
|
7
|
+
vi.mock('../log.js', () => ({
|
|
8
|
+
appendEvent: vi.fn().mockResolvedValue(undefined),
|
|
9
|
+
}));
|
|
10
|
+
import { appendEvent } from '../log.js';
|
|
11
|
+
const mockAppend = vi.mocked(appendEvent);
|
|
12
|
+
let tmpDir;
|
|
13
|
+
let store;
|
|
14
|
+
beforeEach(() => {
|
|
15
|
+
tmpDir = mkdtempSync(join(tmpdir(), 'emitter-test-'));
|
|
16
|
+
store = createConvoyStore(join(tmpDir, 'test.db'));
|
|
17
|
+
vi.clearAllMocks();
|
|
18
|
+
store.insertConvoy({
|
|
19
|
+
id: 'c1',
|
|
20
|
+
name: 'Test',
|
|
21
|
+
spec_hash: 'x',
|
|
22
|
+
status: 'pending',
|
|
23
|
+
branch: null,
|
|
24
|
+
created_at: new Date().toISOString(),
|
|
25
|
+
spec_yaml: 'name: test',
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
afterEach(() => {
|
|
29
|
+
store.close();
|
|
30
|
+
rmSync(tmpDir, { recursive: true, force: true });
|
|
31
|
+
});
|
|
32
|
+
describe('createEventEmitter', () => {
|
|
33
|
+
it('inserts the event into SQLite', () => {
|
|
34
|
+
const emitter = createEventEmitter(store);
|
|
35
|
+
emitter.emit('task_started', { msg: 'started' }, { convoy_id: 'c1' });
|
|
36
|
+
const events = store.getEvents('c1');
|
|
37
|
+
expect(events).toHaveLength(1);
|
|
38
|
+
expect(events[0].type).toBe('task_started');
|
|
39
|
+
expect(events[0].convoy_id).toBe('c1');
|
|
40
|
+
});
|
|
41
|
+
it('serializes event data to JSON in SQLite', () => {
|
|
42
|
+
const emitter = createEventEmitter(store);
|
|
43
|
+
emitter.emit('task_done', { exitCode: 0, output: 'ok' }, { convoy_id: 'c1' });
|
|
44
|
+
const events = store.getEvents('c1');
|
|
45
|
+
const parsed = JSON.parse(events[0].data);
|
|
46
|
+
expect(parsed.exitCode).toBe(0);
|
|
47
|
+
expect(parsed.output).toBe('ok');
|
|
48
|
+
});
|
|
49
|
+
it('stores null data when no data object is provided', () => {
|
|
50
|
+
const emitter = createEventEmitter(store);
|
|
51
|
+
emitter.emit('heartbeat', undefined, { convoy_id: 'c1' });
|
|
52
|
+
const events = store.getEvents('c1');
|
|
53
|
+
expect(events[0].data).toBeNull();
|
|
54
|
+
});
|
|
55
|
+
it('calls appendEvent for NDJSON dual-write', () => {
|
|
56
|
+
const emitter = createEventEmitter(store);
|
|
57
|
+
emitter.emit('convoy_started', { name: 'test' }, { convoy_id: 'c1' });
|
|
58
|
+
expect(mockAppend).toHaveBeenCalledOnce();
|
|
59
|
+
});
|
|
60
|
+
it('passes logs dir to appendEvent', () => {
|
|
61
|
+
const emitter = createEventEmitter(store, '/some/logs');
|
|
62
|
+
emitter.emit('convoy_started', {}, { convoy_id: 'c1' });
|
|
63
|
+
expect(mockAppend).toHaveBeenCalledWith(expect.objectContaining({ type: 'convoy_started', convoy_id: 'c1' }), '/some/logs');
|
|
64
|
+
});
|
|
65
|
+
it('defaults all ids to null when ids are not provided', () => {
|
|
66
|
+
const emitter = createEventEmitter(store);
|
|
67
|
+
emitter.emit('generic_event');
|
|
68
|
+
const db = require('node:sqlite').DatabaseSync;
|
|
69
|
+
// Verify via NDJSON mock payload
|
|
70
|
+
expect(mockAppend).toHaveBeenCalledWith(expect.objectContaining({
|
|
71
|
+
convoy_id: null,
|
|
72
|
+
task_id: null,
|
|
73
|
+
worker_id: null,
|
|
74
|
+
}), null);
|
|
75
|
+
});
|
|
76
|
+
it('includes all provided ids in the NDJSON record', () => {
|
|
77
|
+
const emitter = createEventEmitter(store, tmpDir);
|
|
78
|
+
emitter.emit('worker_spawned', {}, { convoy_id: 'c1', task_id: 't1', worker_id: 'w1' });
|
|
79
|
+
expect(mockAppend).toHaveBeenCalledWith(expect.objectContaining({ convoy_id: 'c1', task_id: 't1', worker_id: 'w1' }), tmpDir);
|
|
80
|
+
});
|
|
81
|
+
it('SQLite event stores correct ids', () => {
|
|
82
|
+
const emitter = createEventEmitter(store);
|
|
83
|
+
emitter.emit('worker_done', {}, { convoy_id: 'c1', task_id: 'task-x', worker_id: 'wkr-y' });
|
|
84
|
+
const events = store.getEvents('c1');
|
|
85
|
+
expect(events[0].task_id).toBe('task-x');
|
|
86
|
+
expect(events[0].worker_id).toBe('wkr-y');
|
|
87
|
+
});
|
|
88
|
+
it('does not throw if NDJSON write fails', () => {
|
|
89
|
+
mockAppend.mockRejectedValueOnce(new Error('disk full'));
|
|
90
|
+
const emitter = createEventEmitter(store);
|
|
91
|
+
expect(() => emitter.emit('test', {}, { convoy_id: 'c1' })).not.toThrow();
|
|
92
|
+
});
|
|
93
|
+
});
|
|
94
|
+
//# sourceMappingURL=events.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.test.js","sourceRoot":"","sources":["../../../src/cli/convoy/events.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { ConvoyRecord, ConvoyStatus, TaskRecord, ConvoyTaskStatus, WorkerRecord, WorkerStatus, EventRecord } from './types.js';
|
|
2
|
+
export interface ConvoyStore {
|
|
3
|
+
insertConvoy(record: Omit<ConvoyRecord, 'started_at' | 'finished_at'>): void;
|
|
4
|
+
getConvoy(id: string): ConvoyRecord | undefined;
|
|
5
|
+
updateConvoyStatus(id: string, status: ConvoyStatus, extra?: {
|
|
6
|
+
started_at?: string;
|
|
7
|
+
finished_at?: string;
|
|
8
|
+
}): void;
|
|
9
|
+
insertTask(record: Omit<TaskRecord, 'worker_id' | 'worktree' | 'output' | 'exit_code' | 'started_at' | 'finished_at'>): void;
|
|
10
|
+
getTask(id: string, convoyId: string): TaskRecord | undefined;
|
|
11
|
+
getTasksByConvoy(convoyId: string): TaskRecord[];
|
|
12
|
+
updateTaskStatus(id: string, convoyId: string, status: ConvoyTaskStatus, extra?: Partial<Pick<TaskRecord, 'worker_id' | 'worktree' | 'output' | 'exit_code' | 'started_at' | 'finished_at' | 'retries'>>): void;
|
|
13
|
+
getReadyTasks(convoyId: string): TaskRecord[];
|
|
14
|
+
insertWorker(record: Omit<WorkerRecord, 'finished_at' | 'last_heartbeat'>): void;
|
|
15
|
+
getWorker(id: string): WorkerRecord | undefined;
|
|
16
|
+
updateWorkerStatus(id: string, status: WorkerStatus, extra?: Partial<Pick<WorkerRecord, 'finished_at' | 'last_heartbeat' | 'pid'>>): void;
|
|
17
|
+
insertEvent(record: Omit<EventRecord, 'id'>): void;
|
|
18
|
+
getEvents(convoyId: string): EventRecord[];
|
|
19
|
+
withTransaction<T>(fn: () => T): T;
|
|
20
|
+
close(): void;
|
|
21
|
+
}
|
|
22
|
+
export declare function createConvoyStore(dbPath: string): ConvoyStore;
|
|
23
|
+
//# sourceMappingURL=store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../src/cli/convoy/store.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,gBAAgB,EAChB,YAAY,EACZ,YAAY,EACZ,WAAW,EACZ,MAAM,YAAY,CAAA;AAInB,MAAM,WAAW,WAAW;IAC1B,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,YAAY,GAAG,aAAa,CAAC,GAAG,IAAI,CAAA;IAC5E,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAAA;IAC/C,kBAAkB,CAChB,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,YAAY,EACpB,KAAK,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,GACpD,IAAI,CAAA;IACP,UAAU,CACR,MAAM,EAAE,IAAI,CACV,UAAU,EACV,WAAW,GAAG,UAAU,GAAG,QAAQ,GAAG,WAAW,GAAG,YAAY,GAAG,aAAa,CACjF,GACA,IAAI,CAAA;IACP,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAAA;IAC7D,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,EAAE,CAAA;IAChD,gBAAgB,CACd,EAAE,EAAE,MAAM,EACV,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,gBAAgB,EACxB,KAAK,CAAC,EAAE,OAAO,CACb,IAAI,CAAC,UAAU,EAAE,WAAW,GAAG,UAAU,GAAG,QAAQ,GAAG,WAAW,GAAG,YAAY,GAAG,aAAa,GAAG,SAAS,CAAC,CAC/G,GACA,IAAI,CAAA;IACP,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,EAAE,CAAA;IAC7C,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,aAAa,GAAG,gBAAgB,CAAC,GAAG,IAAI,CAAA;IAChF,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAAA;IAC/C,kBAAkB,CAChB,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,YAAY,EACpB,KAAK,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,aAAa,GAAG,gBAAgB,GAAG,KAAK,CAAC,CAAC,GAC5E,IAAI,CAAA;IACP,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,GAAG,IAAI,CAAA;IAClD,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,EAAE,CAAA;IAC1C,eAAe,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAAA;IAClC,KAAK,IAAI,IAAI,CAAA;CACd;AAgQD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,CAE7D"}
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
import { DatabaseSync } from 'node:sqlite';
|
|
2
|
+
const SCHEMA_VERSION = 1;
|
|
3
|
+
class ConvoyStoreImpl {
|
|
4
|
+
db;
|
|
5
|
+
constructor(dbPath) {
|
|
6
|
+
this.db = new DatabaseSync(dbPath);
|
|
7
|
+
this.db.exec('PRAGMA journal_mode = WAL');
|
|
8
|
+
this.db.exec('PRAGMA synchronous = NORMAL');
|
|
9
|
+
this.initSchema();
|
|
10
|
+
}
|
|
11
|
+
initSchema() {
|
|
12
|
+
const row = this.db.prepare('PRAGMA user_version').get();
|
|
13
|
+
if (row.user_version === 0) {
|
|
14
|
+
this.db.exec(`
|
|
15
|
+
CREATE TABLE IF NOT EXISTS convoy (
|
|
16
|
+
id TEXT PRIMARY KEY,
|
|
17
|
+
name TEXT NOT NULL,
|
|
18
|
+
spec_hash TEXT NOT NULL,
|
|
19
|
+
status TEXT NOT NULL DEFAULT 'pending',
|
|
20
|
+
branch TEXT,
|
|
21
|
+
created_at TEXT NOT NULL,
|
|
22
|
+
started_at TEXT,
|
|
23
|
+
finished_at TEXT,
|
|
24
|
+
spec_yaml TEXT NOT NULL
|
|
25
|
+
);
|
|
26
|
+
|
|
27
|
+
CREATE TABLE IF NOT EXISTS task (
|
|
28
|
+
id TEXT PRIMARY KEY,
|
|
29
|
+
convoy_id TEXT NOT NULL REFERENCES convoy(id),
|
|
30
|
+
phase INTEGER NOT NULL,
|
|
31
|
+
prompt TEXT NOT NULL,
|
|
32
|
+
agent TEXT NOT NULL DEFAULT 'developer',
|
|
33
|
+
model TEXT,
|
|
34
|
+
timeout_ms INTEGER NOT NULL DEFAULT 1800000,
|
|
35
|
+
status TEXT NOT NULL DEFAULT 'pending',
|
|
36
|
+
worker_id TEXT,
|
|
37
|
+
worktree TEXT,
|
|
38
|
+
output TEXT,
|
|
39
|
+
exit_code INTEGER,
|
|
40
|
+
started_at TEXT,
|
|
41
|
+
finished_at TEXT,
|
|
42
|
+
retries INTEGER NOT NULL DEFAULT 0,
|
|
43
|
+
max_retries INTEGER NOT NULL DEFAULT 1,
|
|
44
|
+
files TEXT,
|
|
45
|
+
depends_on TEXT
|
|
46
|
+
);
|
|
47
|
+
|
|
48
|
+
CREATE TABLE IF NOT EXISTS worker (
|
|
49
|
+
id TEXT PRIMARY KEY,
|
|
50
|
+
task_id TEXT REFERENCES task(id),
|
|
51
|
+
adapter TEXT NOT NULL,
|
|
52
|
+
pid INTEGER,
|
|
53
|
+
session_id TEXT,
|
|
54
|
+
status TEXT NOT NULL DEFAULT 'spawned',
|
|
55
|
+
worktree TEXT,
|
|
56
|
+
created_at TEXT NOT NULL,
|
|
57
|
+
finished_at TEXT,
|
|
58
|
+
last_heartbeat TEXT
|
|
59
|
+
);
|
|
60
|
+
|
|
61
|
+
CREATE TABLE IF NOT EXISTS event (
|
|
62
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
63
|
+
convoy_id TEXT REFERENCES convoy(id),
|
|
64
|
+
task_id TEXT,
|
|
65
|
+
worker_id TEXT,
|
|
66
|
+
type TEXT NOT NULL,
|
|
67
|
+
data TEXT,
|
|
68
|
+
created_at TEXT NOT NULL
|
|
69
|
+
);
|
|
70
|
+
`);
|
|
71
|
+
this.db.exec(`PRAGMA user_version = ${SCHEMA_VERSION}`);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
insertConvoy(record) {
|
|
75
|
+
this.db
|
|
76
|
+
.prepare(`INSERT INTO convoy (id, name, spec_hash, status, branch, created_at, started_at, finished_at, spec_yaml)
|
|
77
|
+
VALUES (:id, :name, :spec_hash, :status, :branch, :created_at, NULL, NULL, :spec_yaml)`)
|
|
78
|
+
.run(record);
|
|
79
|
+
}
|
|
80
|
+
getConvoy(id) {
|
|
81
|
+
return this.db
|
|
82
|
+
.prepare('SELECT * FROM convoy WHERE id = :id')
|
|
83
|
+
.get({ id });
|
|
84
|
+
}
|
|
85
|
+
updateConvoyStatus(id, status, extra) {
|
|
86
|
+
const sets = ['status = :status'];
|
|
87
|
+
const params = { id, status };
|
|
88
|
+
if (extra?.started_at !== undefined) {
|
|
89
|
+
sets.push('started_at = :started_at');
|
|
90
|
+
params.started_at = extra.started_at;
|
|
91
|
+
}
|
|
92
|
+
if (extra?.finished_at !== undefined) {
|
|
93
|
+
sets.push('finished_at = :finished_at');
|
|
94
|
+
params.finished_at = extra.finished_at;
|
|
95
|
+
}
|
|
96
|
+
this.db.prepare(`UPDATE convoy SET ${sets.join(', ')} WHERE id = :id`).run(params);
|
|
97
|
+
}
|
|
98
|
+
insertTask(record) {
|
|
99
|
+
this.db
|
|
100
|
+
.prepare(`INSERT INTO task
|
|
101
|
+
(id, convoy_id, phase, prompt, agent, model, timeout_ms, status,
|
|
102
|
+
worker_id, worktree, output, exit_code, started_at, finished_at,
|
|
103
|
+
retries, max_retries, files, depends_on)
|
|
104
|
+
VALUES
|
|
105
|
+
(:id, :convoy_id, :phase, :prompt, :agent, :model, :timeout_ms, :status,
|
|
106
|
+
NULL, NULL, NULL, NULL, NULL, NULL,
|
|
107
|
+
:retries, :max_retries, :files, :depends_on)`)
|
|
108
|
+
.run(record);
|
|
109
|
+
}
|
|
110
|
+
getTask(id, convoyId) {
|
|
111
|
+
return this.db
|
|
112
|
+
.prepare('SELECT * FROM task WHERE id = :id AND convoy_id = :convoy_id')
|
|
113
|
+
.get({ id, convoy_id: convoyId });
|
|
114
|
+
}
|
|
115
|
+
getTasksByConvoy(convoyId) {
|
|
116
|
+
return this.db
|
|
117
|
+
.prepare('SELECT * FROM task WHERE convoy_id = :convoy_id ORDER BY phase, id')
|
|
118
|
+
.all({ convoy_id: convoyId });
|
|
119
|
+
}
|
|
120
|
+
updateTaskStatus(id, convoyId, status, extra) {
|
|
121
|
+
const sets = ['status = :status'];
|
|
122
|
+
const params = { id, convoy_id: convoyId, status };
|
|
123
|
+
const extraFields = ['worker_id', 'worktree', 'output', 'exit_code', 'started_at', 'finished_at', 'retries'];
|
|
124
|
+
if (extra) {
|
|
125
|
+
for (const field of extraFields) {
|
|
126
|
+
if (field in extra && extra[field] !== undefined) {
|
|
127
|
+
sets.push(`${field} = :${field}`);
|
|
128
|
+
params[field] = extra[field];
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
this.db
|
|
133
|
+
.prepare(`UPDATE task SET ${sets.join(', ')} WHERE id = :id AND convoy_id = :convoy_id`)
|
|
134
|
+
.run(params);
|
|
135
|
+
}
|
|
136
|
+
getReadyTasks(convoyId) {
|
|
137
|
+
const allTasks = this.getTasksByConvoy(convoyId);
|
|
138
|
+
const doneTaskIds = new Set(allTasks.filter(t => t.status === 'done').map(t => t.id));
|
|
139
|
+
return allTasks.filter(task => {
|
|
140
|
+
if (task.status !== 'pending')
|
|
141
|
+
return false;
|
|
142
|
+
if (!task.depends_on)
|
|
143
|
+
return true;
|
|
144
|
+
const deps = JSON.parse(task.depends_on);
|
|
145
|
+
return deps.length === 0 || deps.every(depId => doneTaskIds.has(depId));
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
insertWorker(record) {
|
|
149
|
+
this.db
|
|
150
|
+
.prepare(`INSERT INTO worker
|
|
151
|
+
(id, task_id, adapter, pid, session_id, status, worktree, created_at,
|
|
152
|
+
finished_at, last_heartbeat)
|
|
153
|
+
VALUES
|
|
154
|
+
(:id, :task_id, :adapter, :pid, :session_id, :status, :worktree, :created_at,
|
|
155
|
+
NULL, NULL)`)
|
|
156
|
+
.run(record);
|
|
157
|
+
}
|
|
158
|
+
getWorker(id) {
|
|
159
|
+
return this.db
|
|
160
|
+
.prepare('SELECT * FROM worker WHERE id = :id')
|
|
161
|
+
.get({ id });
|
|
162
|
+
}
|
|
163
|
+
updateWorkerStatus(id, status, extra) {
|
|
164
|
+
const sets = ['status = :status'];
|
|
165
|
+
const params = { id, status };
|
|
166
|
+
if (extra?.finished_at !== undefined) {
|
|
167
|
+
sets.push('finished_at = :finished_at');
|
|
168
|
+
params.finished_at = extra.finished_at;
|
|
169
|
+
}
|
|
170
|
+
if (extra?.last_heartbeat !== undefined) {
|
|
171
|
+
sets.push('last_heartbeat = :last_heartbeat');
|
|
172
|
+
params.last_heartbeat = extra.last_heartbeat;
|
|
173
|
+
}
|
|
174
|
+
if (extra?.pid !== undefined) {
|
|
175
|
+
sets.push('pid = :pid');
|
|
176
|
+
params.pid = extra.pid;
|
|
177
|
+
}
|
|
178
|
+
this.db.prepare(`UPDATE worker SET ${sets.join(', ')} WHERE id = :id`).run(params);
|
|
179
|
+
}
|
|
180
|
+
insertEvent(record) {
|
|
181
|
+
this.db
|
|
182
|
+
.prepare(`INSERT INTO event (convoy_id, task_id, worker_id, type, data, created_at)
|
|
183
|
+
VALUES (:convoy_id, :task_id, :worker_id, :type, :data, :created_at)`)
|
|
184
|
+
.run(record);
|
|
185
|
+
}
|
|
186
|
+
getEvents(convoyId) {
|
|
187
|
+
return this.db
|
|
188
|
+
.prepare('SELECT * FROM event WHERE convoy_id = :convoy_id ORDER BY id')
|
|
189
|
+
.all({ convoy_id: convoyId });
|
|
190
|
+
}
|
|
191
|
+
withTransaction(fn) {
|
|
192
|
+
this.db.exec('BEGIN');
|
|
193
|
+
try {
|
|
194
|
+
const result = fn();
|
|
195
|
+
this.db.exec('COMMIT');
|
|
196
|
+
return result;
|
|
197
|
+
}
|
|
198
|
+
catch (err) {
|
|
199
|
+
this.db.exec('ROLLBACK');
|
|
200
|
+
throw err;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
close() {
|
|
204
|
+
this.db.close();
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
export function createConvoyStore(dbPath) {
|
|
208
|
+
return new ConvoyStoreImpl(dbPath);
|
|
209
|
+
}
|
|
210
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/cli/convoy/store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.test.d.ts","sourceRoot":"","sources":["../../../src/cli/convoy/store.test.ts"],"names":[],"mappings":""}
|