@matteeh/osq 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +183 -0
- package/dist/cli/approve.d.ts +6 -0
- package/dist/cli/approve.d.ts.map +1 -0
- package/dist/cli/approve.js +26 -0
- package/dist/cli/approve.js.map +1 -0
- package/dist/cli/bin.d.ts +3 -0
- package/dist/cli/bin.d.ts.map +1 -0
- package/dist/cli/bin.js +5 -0
- package/dist/cli/bin.js.map +1 -0
- package/dist/cli/index.d.ts +4 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +76 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/init.d.ts +4 -0
- package/dist/cli/init.d.ts.map +1 -0
- package/dist/cli/init.js +19 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/new.d.ts +4 -0
- package/dist/cli/new.d.ts.map +1 -0
- package/dist/cli/new.js +15 -0
- package/dist/cli/new.js.map +1 -0
- package/dist/cli/report.d.ts +10 -0
- package/dist/cli/report.d.ts.map +1 -0
- package/dist/cli/report.js +84 -0
- package/dist/cli/report.js.map +1 -0
- package/dist/cli/setup.d.ts +2 -0
- package/dist/cli/setup.d.ts.map +1 -0
- package/dist/cli/setup.js +10 -0
- package/dist/cli/setup.js.map +1 -0
- package/dist/cli/show.d.ts +7 -0
- package/dist/cli/show.d.ts.map +1 -0
- package/dist/cli/show.js +27 -0
- package/dist/cli/show.js.map +1 -0
- package/dist/cli/status.d.ts +7 -0
- package/dist/cli/status.d.ts.map +1 -0
- package/dist/cli/status.js +23 -0
- package/dist/cli/status.js.map +1 -0
- package/dist/cli/watch.d.ts +9 -0
- package/dist/cli/watch.d.ts.map +1 -0
- package/dist/cli/watch.js +20 -0
- package/dist/cli/watch.js.map +1 -0
- package/dist/core/approve.d.ts +11 -0
- package/dist/core/approve.d.ts.map +1 -0
- package/dist/core/approve.js +52 -0
- package/dist/core/approve.js.map +1 -0
- package/dist/core/config.d.ts +53 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +124 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/hasher.d.ts +4 -0
- package/dist/core/hasher.d.ts.map +1 -0
- package/dist/core/hasher.js +49 -0
- package/dist/core/hasher.js.map +1 -0
- package/dist/core/init.d.ts +12 -0
- package/dist/core/init.d.ts.map +1 -0
- package/dist/core/init.js +151 -0
- package/dist/core/init.js.map +1 -0
- package/dist/core/linter.d.ts +8 -0
- package/dist/core/linter.d.ts.map +1 -0
- package/dist/core/linter.js +100 -0
- package/dist/core/linter.js.map +1 -0
- package/dist/core/lock.d.ts +17 -0
- package/dist/core/lock.d.ts.map +1 -0
- package/dist/core/lock.js +104 -0
- package/dist/core/lock.js.map +1 -0
- package/dist/core/logger.d.ts +32 -0
- package/dist/core/logger.d.ts.map +1 -0
- package/dist/core/logger.js +106 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/new.d.ts +11 -0
- package/dist/core/new.d.ts.map +1 -0
- package/dist/core/new.js +79 -0
- package/dist/core/new.js.map +1 -0
- package/dist/core/parser.d.ts +32 -0
- package/dist/core/parser.d.ts.map +1 -0
- package/dist/core/parser.js +87 -0
- package/dist/core/parser.js.map +1 -0
- package/dist/core/report.d.ts +54 -0
- package/dist/core/report.d.ts.map +1 -0
- package/dist/core/report.js +475 -0
- package/dist/core/report.js.map +1 -0
- package/dist/core/show.d.ts +50 -0
- package/dist/core/show.d.ts.map +1 -0
- package/dist/core/show.js +374 -0
- package/dist/core/show.js.map +1 -0
- package/dist/core/state.d.ts +25 -0
- package/dist/core/state.d.ts.map +1 -0
- package/dist/core/state.js +180 -0
- package/dist/core/state.js.map +1 -0
- package/dist/core/status.d.ts +10 -0
- package/dist/core/status.d.ts.map +1 -0
- package/dist/core/status.js +106 -0
- package/dist/core/status.js.map +1 -0
- package/dist/harness/agy.d.ts +31 -0
- package/dist/harness/agy.d.ts.map +1 -0
- package/dist/harness/agy.js +251 -0
- package/dist/harness/agy.js.map +1 -0
- package/dist/harness/index.d.ts +7 -0
- package/dist/harness/index.d.ts.map +1 -0
- package/dist/harness/index.js +20 -0
- package/dist/harness/index.js.map +1 -0
- package/dist/harness/mock.d.ts +19 -0
- package/dist/harness/mock.d.ts.map +1 -0
- package/dist/harness/mock.js +62 -0
- package/dist/harness/mock.js.map +1 -0
- package/dist/harness/opencode.d.ts +39 -0
- package/dist/harness/opencode.d.ts.map +1 -0
- package/dist/harness/opencode.js +394 -0
- package/dist/harness/opencode.js.map +1 -0
- package/dist/harness/process.d.ts +26 -0
- package/dist/harness/process.d.ts.map +1 -0
- package/dist/harness/process.js +99 -0
- package/dist/harness/process.js.map +1 -0
- package/dist/harness/stream.d.ts +34 -0
- package/dist/harness/stream.d.ts.map +1 -0
- package/dist/harness/stream.js +75 -0
- package/dist/harness/stream.js.map +1 -0
- package/dist/harness/types.d.ts +53 -0
- package/dist/harness/types.d.ts.map +1 -0
- package/dist/harness/types.js +10 -0
- package/dist/harness/types.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/watcher/archiver.d.ts +5 -0
- package/dist/watcher/archiver.d.ts.map +1 -0
- package/dist/watcher/archiver.js +66 -0
- package/dist/watcher/archiver.js.map +1 -0
- package/dist/watcher/loop.d.ts +34 -0
- package/dist/watcher/loop.d.ts.map +1 -0
- package/dist/watcher/loop.js +235 -0
- package/dist/watcher/loop.js.map +1 -0
- package/dist/watcher/runner.d.ts +70 -0
- package/dist/watcher/runner.d.ts.map +1 -0
- package/dist/watcher/runner.js +604 -0
- package/dist/watcher/runner.js.map +1 -0
- package/package.json +66 -0
- package/templates/.env.example +3 -0
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import fs from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { DEFAULT_CONFIG } from './config.js';
|
|
4
|
+
import { deriveSpecState } from './state.js';
|
|
5
|
+
export async function getStatusOverview(projectRoot, config = DEFAULT_CONFIG) {
|
|
6
|
+
const specsDir = path.join(projectRoot, config.paths.specs);
|
|
7
|
+
let entries = [];
|
|
8
|
+
try {
|
|
9
|
+
entries = await fs.readdir(specsDir);
|
|
10
|
+
}
|
|
11
|
+
catch {
|
|
12
|
+
return { specs: [], archivedCount: 0, archivedChangeFolders: 0 };
|
|
13
|
+
}
|
|
14
|
+
const archiveDir = path.join(projectRoot, config.paths.archive);
|
|
15
|
+
const archiveRel = path.relative(specsDir, archiveDir);
|
|
16
|
+
const archiveFolder = !archiveRel.startsWith('..') && !path.isAbsolute(archiveRel)
|
|
17
|
+
? archiveRel.split(path.sep)[0]
|
|
18
|
+
: 'archive';
|
|
19
|
+
const candidateFolders = entries.filter((e) => !e.startsWith('_') && !e.startsWith('.') && e !== archiveFolder);
|
|
20
|
+
const validFolders = [];
|
|
21
|
+
for (const folder of candidateFolders) {
|
|
22
|
+
const folderPath = path.join(specsDir, folder);
|
|
23
|
+
const stat = await fs.stat(folderPath).catch(() => null);
|
|
24
|
+
if (!stat || !stat.isDirectory())
|
|
25
|
+
continue;
|
|
26
|
+
const specMdStat = await fs.stat(path.join(folderPath, 'spec.md')).catch(() => null);
|
|
27
|
+
if (!specMdStat || !specMdStat.isFile())
|
|
28
|
+
continue;
|
|
29
|
+
validFolders.push(folder);
|
|
30
|
+
}
|
|
31
|
+
validFolders.sort((a, b) => {
|
|
32
|
+
const numA = Number.parseInt(a, 10);
|
|
33
|
+
const numB = Number.parseInt(b, 10);
|
|
34
|
+
if (!Number.isNaN(numA) && !Number.isNaN(numB)) {
|
|
35
|
+
return numA - numB;
|
|
36
|
+
}
|
|
37
|
+
return a.localeCompare(b);
|
|
38
|
+
});
|
|
39
|
+
const specs = [];
|
|
40
|
+
for (const folder of validFolders) {
|
|
41
|
+
const folderPath = path.join(specsDir, folder);
|
|
42
|
+
const specState = await deriveSpecState(projectRoot, folderPath);
|
|
43
|
+
specs.push(specState);
|
|
44
|
+
}
|
|
45
|
+
let archivedCount = 0;
|
|
46
|
+
try {
|
|
47
|
+
const archiveEntries = await fs.readdir(archiveDir);
|
|
48
|
+
for (const entry of archiveEntries) {
|
|
49
|
+
if (entry.startsWith('.'))
|
|
50
|
+
continue;
|
|
51
|
+
const fullPath = path.join(archiveDir, entry);
|
|
52
|
+
const stat = await fs.stat(fullPath).catch(() => null);
|
|
53
|
+
if (stat?.isDirectory()) {
|
|
54
|
+
archivedCount++;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
archivedCount = 0;
|
|
60
|
+
}
|
|
61
|
+
return {
|
|
62
|
+
specs,
|
|
63
|
+
archivedCount,
|
|
64
|
+
archivedChangeFolders: archivedCount,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
function formatTaskLine(task) {
|
|
68
|
+
let indicator = '[ ]';
|
|
69
|
+
if (task.status === 'done') {
|
|
70
|
+
indicator = '[x]';
|
|
71
|
+
}
|
|
72
|
+
else if (task.status === 'running') {
|
|
73
|
+
indicator = '[>]';
|
|
74
|
+
}
|
|
75
|
+
else if (task.status === 'dead') {
|
|
76
|
+
indicator = '[!]';
|
|
77
|
+
}
|
|
78
|
+
const title = task.title || task.fileName;
|
|
79
|
+
const deadInfo = task.deadReason ? ` (reason: ${task.deadReason})` : '';
|
|
80
|
+
return ` ${indicator} ${task.taskNumber}. ${title} [${task.status}]${deadInfo}`;
|
|
81
|
+
}
|
|
82
|
+
export function formatStatusOverview(overview) {
|
|
83
|
+
const lines = [];
|
|
84
|
+
lines.push('Active specs:');
|
|
85
|
+
if (overview.specs.length === 0) {
|
|
86
|
+
lines.push(' (none)');
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
for (const spec of overview.specs) {
|
|
90
|
+
const approvalStatus = spec.approvedHash ? 'approved' : 'unapproved';
|
|
91
|
+
lines.push(`${spec.folderName}: ${spec.title} [${spec.status}] (${approvalStatus})`);
|
|
92
|
+
if (spec.tasks.length === 0) {
|
|
93
|
+
lines.push(' (no tasks)');
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
for (const task of spec.tasks) {
|
|
97
|
+
lines.push(formatTaskLine(task));
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
lines.push('');
|
|
103
|
+
lines.push(`Archived specs: ${overview.archivedCount}`);
|
|
104
|
+
return lines.join('\n');
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/core/status.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { OsqConfig } from '../core/config.js';
|
|
2
|
+
import type { Logger } from '../core/logger.js';
|
|
3
|
+
import { EventStreamParser } from './stream.js';
|
|
4
|
+
import { type HarnessAdapter, type SpawnResult, type SpawnTaskOptions, type ToolEventData } from './types.js';
|
|
5
|
+
export declare function resolveAgyBinary(): Promise<string>;
|
|
6
|
+
export declare function buildAgyPrompt(options: SpawnTaskOptions): string;
|
|
7
|
+
export declare function buildAgyArgs(options: SpawnTaskOptions): string[];
|
|
8
|
+
export interface AgyStreamTokensData {
|
|
9
|
+
promptTokens: number;
|
|
10
|
+
candidateTokens: number;
|
|
11
|
+
totalTokens: number;
|
|
12
|
+
cachedTokens: number;
|
|
13
|
+
reasoningTokens: number;
|
|
14
|
+
cost: number;
|
|
15
|
+
}
|
|
16
|
+
export declare function extractAgyTokens(event: unknown): AgyStreamTokensData | null;
|
|
17
|
+
export declare function extractAgyToolEvent(event: unknown): ToolEventData | null;
|
|
18
|
+
export declare function processAgyStdoutLine(line: string, specFolderPath: string, taskNumber: string, logger?: Logger): Promise<void>;
|
|
19
|
+
/**
|
|
20
|
+
* Compatibility subclass retained for existing callers and tests; the buffering
|
|
21
|
+
* and serialization logic lives entirely in the shared {@link EventStreamParser}.
|
|
22
|
+
*/
|
|
23
|
+
export declare class AgyEventStreamParser extends EventStreamParser {
|
|
24
|
+
constructor(specFolderPath: string, taskNumber: string, logger?: Logger);
|
|
25
|
+
}
|
|
26
|
+
export declare class AgyAdapter implements HarnessAdapter {
|
|
27
|
+
readonly name = "agy";
|
|
28
|
+
setup(projectRoot: string, _config: OsqConfig): Promise<void>;
|
|
29
|
+
spawn(options: SpawnTaskOptions): Promise<SpawnResult>;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=agy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agy.d.ts","sourceRoot":"","sources":["../../src/harness/agy.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EACL,iBAAiB,EAIlB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,WAAW,EAChB,KAAK,gBAAgB,EAErB,KAAK,aAAa,EAEnB,MAAM,YAAY,CAAC;AAEpB,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC,CAgBxD;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,gBAAgB,GAAG,MAAM,CAgChE;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,gBAAgB,GAAG,MAAM,EAAE,CA2BhE;AAED,MAAM,WAAW,mBAAmB;IAClC,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;CACd;AAKD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,mBAAmB,GAAG,IAAI,CAkC3E;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,aAAa,GAAG,IAAI,CAqDxE;AAqBD,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,MAAM,EACZ,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CAyEf;AAED;;;GAGG;AACH,qBAAa,oBAAqB,SAAQ,iBAAiB;gBAC7C,cAAc,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;CAGxE;AAED,qBAAa,UAAW,YAAW,cAAc;IAC/C,QAAQ,CAAC,IAAI,SAAS;IAEhB,KAAK,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAK7D,KAAK,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,WAAW,CAAC;CAoC7D"}
|
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
import fs from 'node:fs/promises';
|
|
2
|
+
import os from 'node:os';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { spawnWithTimeout } from './process.js';
|
|
5
|
+
import { EventStreamParser, asRecord, firstNonEmptyString, resolveEventTimestamp, } from './stream.js';
|
|
6
|
+
import { appendHarnessEvent, } from './types.js';
|
|
7
|
+
export async function resolveAgyBinary() {
|
|
8
|
+
if (process.env.AGY_PATH) {
|
|
9
|
+
return process.env.AGY_PATH;
|
|
10
|
+
}
|
|
11
|
+
const home = os.homedir();
|
|
12
|
+
const candidates = [path.join(home, '.local', 'bin', 'agy'), '/usr/local/bin/agy', 'agy'];
|
|
13
|
+
for (const candidate of candidates) {
|
|
14
|
+
try {
|
|
15
|
+
await fs.access(candidate);
|
|
16
|
+
return candidate;
|
|
17
|
+
}
|
|
18
|
+
catch { }
|
|
19
|
+
}
|
|
20
|
+
return 'agy';
|
|
21
|
+
}
|
|
22
|
+
export function buildAgyPrompt(options) {
|
|
23
|
+
const { projectRoot, specFolderPath, taskNumber, taskTitle, scope, entry, verifyCommand } = options;
|
|
24
|
+
const taskRelPath = path.relative(projectRoot, path.join(specFolderPath, 'tasks', `${taskNumber}.md`));
|
|
25
|
+
const specRelPath = path.relative(projectRoot, path.join(specFolderPath, 'spec.md'));
|
|
26
|
+
const resultRelPath = path.relative(projectRoot, path.join(specFolderPath, '.run', 'results', `${taskNumber}.md`));
|
|
27
|
+
return [
|
|
28
|
+
'You are a coding agent working autonomously on an osq task. Follow AGENTS.md strictly.',
|
|
29
|
+
`Task File: ${taskRelPath}`,
|
|
30
|
+
`Parent Spec: ${specRelPath}`,
|
|
31
|
+
`Task Title: ${taskTitle}`,
|
|
32
|
+
`Scope: ${scope.join(', ')}`,
|
|
33
|
+
`Entry: ${entry.join(', ')}`,
|
|
34
|
+
`Verify Command: ${verifyCommand}`,
|
|
35
|
+
'',
|
|
36
|
+
'Rules:',
|
|
37
|
+
`1. Read ${taskRelPath}, ${specRelPath}, and features docs referenced in ${specRelPath}.`,
|
|
38
|
+
'2. Write tests for each acceptance line before implementing.',
|
|
39
|
+
'3. Keep all edits strictly inside scope.',
|
|
40
|
+
`4. Verify your work by running: ${verifyCommand}`,
|
|
41
|
+
`5. CRITICAL: Before exiting, you MUST write ${resultRelPath} documenting: changed, deviated, drift against features/, missing context, and next steps.`,
|
|
42
|
+
`6. Do not modify tasks.md, spec.md, or any file outside your scope and ${resultRelPath}.`,
|
|
43
|
+
`7. When done, write ${resultRelPath} and exit cleanly.`,
|
|
44
|
+
].join('\n');
|
|
45
|
+
}
|
|
46
|
+
export function buildAgyArgs(options) {
|
|
47
|
+
const { config } = options;
|
|
48
|
+
const taskPrompt = buildAgyPrompt(options);
|
|
49
|
+
const model = config?.agy?.model || process.env.OSQ_MODEL || 'gemini-3.8-flash-high';
|
|
50
|
+
const dangerouslySkipPermissions = config?.agy?.dangerouslySkipPermissions ?? true;
|
|
51
|
+
const args = [
|
|
52
|
+
'-p',
|
|
53
|
+
taskPrompt,
|
|
54
|
+
'--model',
|
|
55
|
+
model,
|
|
56
|
+
'--mode',
|
|
57
|
+
'accept-edits',
|
|
58
|
+
'--output-format',
|
|
59
|
+
'stream-json',
|
|
60
|
+
];
|
|
61
|
+
if (dangerouslySkipPermissions) {
|
|
62
|
+
args.push('--dangerously-skip-permissions');
|
|
63
|
+
}
|
|
64
|
+
const rawTimeout = config?.timeouts?.taskTimeoutSeconds ?? options.timeoutSeconds ?? 1800;
|
|
65
|
+
const printTimeout = Math.max(60, rawTimeout - 30);
|
|
66
|
+
args.push('--print-timeout', `${printTimeout}s`);
|
|
67
|
+
return args;
|
|
68
|
+
}
|
|
69
|
+
const AGY_TOOL_SUMMARY_MAX_LENGTH = 60;
|
|
70
|
+
const AGY_COMMAND_TOOLS = new Set(['run_command', 'command_status', 'send_command_input']);
|
|
71
|
+
export function extractAgyTokens(event) {
|
|
72
|
+
const eventObj = asRecord(event);
|
|
73
|
+
if (!eventObj) {
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
const stepUpdate = asRecord(eventObj.step_update);
|
|
77
|
+
const usage = asRecord(stepUpdate?.usage) ??
|
|
78
|
+
asRecord(asRecord(eventObj.result)?.usage) ??
|
|
79
|
+
asRecord(eventObj.usage);
|
|
80
|
+
if (!usage) {
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
const promptTokens = Number(usage.input_tokens) || 0;
|
|
84
|
+
const candidateTokens = Number(usage.output_tokens) || 0;
|
|
85
|
+
const cachedTokens = Number(usage.cache_read_tokens) || 0;
|
|
86
|
+
const reasoningTokens = Number(usage.thinking_tokens ?? usage.reasoning_tokens ?? 0) || 0;
|
|
87
|
+
const explicitTotal = Number(usage.total_tokens);
|
|
88
|
+
const totalTokens = Number.isFinite(explicitTotal) && explicitTotal > 0
|
|
89
|
+
? explicitTotal
|
|
90
|
+
: promptTokens + candidateTokens;
|
|
91
|
+
return {
|
|
92
|
+
promptTokens,
|
|
93
|
+
candidateTokens,
|
|
94
|
+
totalTokens,
|
|
95
|
+
cachedTokens,
|
|
96
|
+
reasoningTokens,
|
|
97
|
+
cost: 0,
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
export function extractAgyToolEvent(event) {
|
|
101
|
+
const eventObj = asRecord(event);
|
|
102
|
+
if (!eventObj) {
|
|
103
|
+
return null;
|
|
104
|
+
}
|
|
105
|
+
const stepUpdate = asRecord(eventObj.step_update);
|
|
106
|
+
if (!stepUpdate || stepUpdate.step_type !== 'tool') {
|
|
107
|
+
return null;
|
|
108
|
+
}
|
|
109
|
+
const toolInfo = asRecord(stepUpdate.tool_info);
|
|
110
|
+
const tool = firstNonEmptyString(stepUpdate.tool_name, toolInfo?.name, stepUpdate.name);
|
|
111
|
+
if (!tool) {
|
|
112
|
+
return null;
|
|
113
|
+
}
|
|
114
|
+
const parameters = asRecord(toolInfo?.parameters) ??
|
|
115
|
+
asRecord(stepUpdate.parameters) ??
|
|
116
|
+
asRecord(toolInfo?.input) ??
|
|
117
|
+
asRecord(stepUpdate.input) ??
|
|
118
|
+
asRecord(eventObj.parameters) ??
|
|
119
|
+
{};
|
|
120
|
+
if (AGY_COMMAND_TOOLS.has(tool.toLowerCase())) {
|
|
121
|
+
const command = firstNonEmptyString(parameters.CommandLine, parameters.command, parameters.cmd, parameters.commandLine);
|
|
122
|
+
return { tool, summary: (command ?? '').slice(0, AGY_TOOL_SUMMARY_MAX_LENGTH) };
|
|
123
|
+
}
|
|
124
|
+
const target = firstNonEmptyString(parameters.AbsolutePath, parameters.path, parameters.file_path, parameters.filePath, parameters.file, parameters.absolute_path, parameters.target_file, parameters.DirectoryPath, parameters.directoryPath, parameters.pattern);
|
|
125
|
+
if (target) {
|
|
126
|
+
return { tool, summary: target };
|
|
127
|
+
}
|
|
128
|
+
const raw = Object.keys(parameters).length > 0 ? JSON.stringify(parameters) : '';
|
|
129
|
+
return { tool, summary: raw.slice(0, AGY_TOOL_SUMMARY_MAX_LENGTH) };
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Single code path for tool observation: the events.jsonl entry and its verbose
|
|
133
|
+
* stderr log line are always emitted together by the shared stdout handler.
|
|
134
|
+
*/
|
|
135
|
+
async function recordAgyToolEvent(specFolderPath, taskNumber, toolEvent, timestamp, logger) {
|
|
136
|
+
await appendHarnessEvent(specFolderPath, taskNumber, {
|
|
137
|
+
type: 'tool',
|
|
138
|
+
timestamp,
|
|
139
|
+
data: { tool: toolEvent.tool, summary: toolEvent.summary },
|
|
140
|
+
});
|
|
141
|
+
logger?.verbose(`[tool] ${toolEvent.tool}: ${toolEvent.summary}`);
|
|
142
|
+
}
|
|
143
|
+
export async function processAgyStdoutLine(line, specFolderPath, taskNumber, logger) {
|
|
144
|
+
const trimmed = line.trim();
|
|
145
|
+
if (!trimmed) {
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
let event;
|
|
149
|
+
try {
|
|
150
|
+
event = JSON.parse(trimmed);
|
|
151
|
+
}
|
|
152
|
+
catch {
|
|
153
|
+
// agy may legitimately emit non-JSON output when stream-json is unsupported.
|
|
154
|
+
// It is diagnostic only: verbose logging, never stdout.
|
|
155
|
+
logger?.verbose(`[agy] Unrecognised stream line: ${trimmed}`);
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
const eventObj = asRecord(event);
|
|
159
|
+
if (!eventObj) {
|
|
160
|
+
logger?.verbose(`[agy] Unrecognised stream line: ${trimmed}`);
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
const toolEvent = extractAgyToolEvent(eventObj);
|
|
164
|
+
if (toolEvent) {
|
|
165
|
+
await recordAgyToolEvent(specFolderPath, taskNumber, toolEvent, resolveEventTimestamp(eventObj), logger);
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
// The result payload carries the completed assistant response. Partial
|
|
169
|
+
// `text_delta` fragments from step updates are never persisted as text events.
|
|
170
|
+
const resultObj = asRecord(eventObj.result);
|
|
171
|
+
if (eventObj.event === 'result' || resultObj) {
|
|
172
|
+
const response = firstNonEmptyString(resultObj?.response);
|
|
173
|
+
if (response !== undefined) {
|
|
174
|
+
await appendHarnessEvent(specFolderPath, taskNumber, {
|
|
175
|
+
type: 'text',
|
|
176
|
+
timestamp: resolveEventTimestamp(eventObj),
|
|
177
|
+
data: { text: response },
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
// Only per-step usage is counted; the trailing result event repeats the final
|
|
183
|
+
// totals and would otherwise double count in heartbeat accumulations.
|
|
184
|
+
if (!asRecord(eventObj.step_update)) {
|
|
185
|
+
logger?.verbose(`[agy] Unknown event type: ${eventObj.event ?? eventObj.type ?? 'unknown'}`);
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
const tokensData = extractAgyTokens(eventObj);
|
|
189
|
+
if (!tokensData) {
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
await appendHarnessEvent(specFolderPath, taskNumber, {
|
|
193
|
+
type: 'tokens',
|
|
194
|
+
timestamp: resolveEventTimestamp(eventObj),
|
|
195
|
+
data: {
|
|
196
|
+
promptTokens: tokensData.promptTokens,
|
|
197
|
+
candidateTokens: tokensData.candidateTokens,
|
|
198
|
+
totalTokens: tokensData.totalTokens,
|
|
199
|
+
cachedTokens: tokensData.cachedTokens,
|
|
200
|
+
reasoningTokens: tokensData.reasoningTokens,
|
|
201
|
+
cost: tokensData.cost,
|
|
202
|
+
},
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Compatibility subclass retained for existing callers and tests; the buffering
|
|
207
|
+
* and serialization logic lives entirely in the shared {@link EventStreamParser}.
|
|
208
|
+
*/
|
|
209
|
+
export class AgyEventStreamParser extends EventStreamParser {
|
|
210
|
+
constructor(specFolderPath, taskNumber, logger) {
|
|
211
|
+
super((line) => processAgyStdoutLine(line, specFolderPath, taskNumber, logger));
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
export class AgyAdapter {
|
|
215
|
+
name = 'agy';
|
|
216
|
+
async setup(projectRoot, _config) {
|
|
217
|
+
const agentsDir = path.join(projectRoot, '.agents');
|
|
218
|
+
await fs.mkdir(agentsDir, { recursive: true });
|
|
219
|
+
}
|
|
220
|
+
async spawn(options) {
|
|
221
|
+
const { projectRoot, specFolderPath, taskNumber, timeoutSeconds = 1800 } = options;
|
|
222
|
+
const agyBin = await resolveAgyBinary();
|
|
223
|
+
const args = buildAgyArgs(options);
|
|
224
|
+
const streamParser = new EventStreamParser((line) => processAgyStdoutLine(line, specFolderPath, taskNumber, options.logger));
|
|
225
|
+
const result = await spawnWithTimeout({
|
|
226
|
+
command: agyBin,
|
|
227
|
+
args,
|
|
228
|
+
cwd: projectRoot,
|
|
229
|
+
env: {
|
|
230
|
+
...process.env,
|
|
231
|
+
OSQ_TASK_NUMBER: taskNumber,
|
|
232
|
+
OSQ_SPEC_FOLDER: specFolderPath,
|
|
233
|
+
},
|
|
234
|
+
timeoutSeconds,
|
|
235
|
+
onStdout: (chunk) => {
|
|
236
|
+
streamParser.feed(chunk);
|
|
237
|
+
},
|
|
238
|
+
onSpawn: options.onSpawn,
|
|
239
|
+
});
|
|
240
|
+
await streamParser.flush();
|
|
241
|
+
return {
|
|
242
|
+
exitCode: result.exitCode,
|
|
243
|
+
timedOut: result.timedOut,
|
|
244
|
+
signal: result.signal,
|
|
245
|
+
error: result.error,
|
|
246
|
+
pid: result.pid,
|
|
247
|
+
elapsedMs: result.elapsedMs,
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
//# sourceMappingURL=agy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agy.js","sourceRoot":"","sources":["../../src/harness/agy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { HarnessAdapter } from './types.js';
|
|
2
|
+
export declare function getHarnessAdapter(name: string): HarnessAdapter;
|
|
3
|
+
export * from './types.js';
|
|
4
|
+
export * from './mock.js';
|
|
5
|
+
export * from './agy.js';
|
|
6
|
+
export * from './opencode.js';
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/harness/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAQjD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,CAQ9D;AAED,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,UAAU,CAAC;AACzB,cAAc,eAAe,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { AgyAdapter } from './agy.js';
|
|
2
|
+
import { MockAdapter } from './mock.js';
|
|
3
|
+
import { OpencodeAdapter } from './opencode.js';
|
|
4
|
+
const adapters = {
|
|
5
|
+
agy: () => new AgyAdapter(),
|
|
6
|
+
mock: () => new MockAdapter(),
|
|
7
|
+
opencode: () => new OpencodeAdapter(),
|
|
8
|
+
};
|
|
9
|
+
export function getHarnessAdapter(name) {
|
|
10
|
+
const factory = adapters[name.toLowerCase()];
|
|
11
|
+
if (!factory) {
|
|
12
|
+
throw new Error(`Unknown harness adapter: "${name}". Available adapters: ${Object.keys(adapters).join(', ')}`);
|
|
13
|
+
}
|
|
14
|
+
return factory();
|
|
15
|
+
}
|
|
16
|
+
export * from './types.js';
|
|
17
|
+
export * from './mock.js';
|
|
18
|
+
export * from './agy.js';
|
|
19
|
+
export * from './opencode.js';
|
|
20
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/harness/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAGhD,MAAM,QAAQ,GAAyC;IACrD,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,UAAU,EAAE;IAC3B,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI,WAAW,EAAE;IAC7B,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,eAAe,EAAE;CACtC,CAAC;AAEF,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;IAC7C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACb,6BAA6B,IAAI,0BAA0B,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC9F,CAAC;IACJ,CAAC;IACD,OAAO,OAAO,EAAE,CAAC;AACnB,CAAC;AAED,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,UAAU,CAAC;AACzB,cAAc,eAAe,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { OsqConfig } from '../core/config.js';
|
|
2
|
+
import { type HarnessAdapter, type SpawnResult, type SpawnTaskOptions } from './types.js';
|
|
3
|
+
export interface MockBehavior {
|
|
4
|
+
exitCode?: number;
|
|
5
|
+
writeResult?: boolean;
|
|
6
|
+
resultContent?: string;
|
|
7
|
+
delayMs?: number;
|
|
8
|
+
error?: string;
|
|
9
|
+
timedOut?: boolean;
|
|
10
|
+
}
|
|
11
|
+
export declare class MockAdapter implements HarnessAdapter {
|
|
12
|
+
readonly name = "mock";
|
|
13
|
+
private behavior;
|
|
14
|
+
setBehavior(behavior: MockBehavior): void;
|
|
15
|
+
resetBehavior(): void;
|
|
16
|
+
setup(_projectRoot: string, _config: OsqConfig): Promise<void>;
|
|
17
|
+
spawn(options: SpawnTaskOptions): Promise<SpawnResult>;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=mock.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mock.d.ts","sourceRoot":"","sources":["../../src/harness/mock.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,WAAW,EAChB,KAAK,gBAAgB,EAEtB,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,qBAAa,WAAY,YAAW,cAAc;IAChD,QAAQ,CAAC,IAAI,UAAU;IACvB,OAAO,CAAC,QAAQ,CAAoB;IAEpC,WAAW,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI;IAIzC,aAAa,IAAI,IAAI;IAIf,KAAK,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAI9D,KAAK,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,WAAW,CAAC;CAsD7D"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import fs from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { appendHarnessEvent, } from './types.js';
|
|
4
|
+
export class MockAdapter {
|
|
5
|
+
name = 'mock';
|
|
6
|
+
behavior = {};
|
|
7
|
+
setBehavior(behavior) {
|
|
8
|
+
this.behavior = behavior;
|
|
9
|
+
}
|
|
10
|
+
resetBehavior() {
|
|
11
|
+
this.behavior = {};
|
|
12
|
+
}
|
|
13
|
+
async setup(_projectRoot, _config) {
|
|
14
|
+
// No-op for mock harness
|
|
15
|
+
}
|
|
16
|
+
async spawn(options) {
|
|
17
|
+
const { specFolderPath, taskNumber, tier } = options;
|
|
18
|
+
await appendHarnessEvent(specFolderPath, taskNumber, {
|
|
19
|
+
type: 'started',
|
|
20
|
+
timestamp: new Date().toISOString(),
|
|
21
|
+
data: { tier, mock: true },
|
|
22
|
+
});
|
|
23
|
+
if (this.behavior.delayMs) {
|
|
24
|
+
await new Promise((resolve) => setTimeout(resolve, this.behavior.delayMs));
|
|
25
|
+
}
|
|
26
|
+
await appendHarnessEvent(specFolderPath, taskNumber, {
|
|
27
|
+
type: 'tokens',
|
|
28
|
+
timestamp: new Date().toISOString(),
|
|
29
|
+
data: { promptTokens: 500, candidateTokens: 200 },
|
|
30
|
+
});
|
|
31
|
+
const shouldWriteResult = this.behavior.writeResult ?? true;
|
|
32
|
+
if (shouldWriteResult) {
|
|
33
|
+
const resultsDir = path.join(specFolderPath, '.run', 'results');
|
|
34
|
+
await fs.mkdir(resultsDir, { recursive: true });
|
|
35
|
+
const resultPath = path.join(resultsDir, `${taskNumber}.md`);
|
|
36
|
+
const defaultContent = [
|
|
37
|
+
`# Result for Task ${taskNumber}`,
|
|
38
|
+
'',
|
|
39
|
+
'## Changed',
|
|
40
|
+
'- Simulated work completed by MockAdapter.',
|
|
41
|
+
].join('\n');
|
|
42
|
+
await fs.writeFile(resultPath, this.behavior.resultContent || `${defaultContent}\n`, 'utf8');
|
|
43
|
+
await appendHarnessEvent(specFolderPath, taskNumber, {
|
|
44
|
+
type: 'result_written',
|
|
45
|
+
timestamp: new Date().toISOString(),
|
|
46
|
+
data: { path: resultPath },
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
const exitCode = this.behavior.exitCode ?? (this.behavior.timedOut ? 124 : 0);
|
|
50
|
+
await appendHarnessEvent(specFolderPath, taskNumber, {
|
|
51
|
+
type: 'exited',
|
|
52
|
+
timestamp: new Date().toISOString(),
|
|
53
|
+
data: { exitCode, timedOut: this.behavior.timedOut },
|
|
54
|
+
});
|
|
55
|
+
return {
|
|
56
|
+
exitCode,
|
|
57
|
+
error: this.behavior.error,
|
|
58
|
+
timedOut: this.behavior.timedOut,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=mock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mock.js","sourceRoot":"","sources":["../../src/harness/mock.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { OsqConfig } from '../core/config.js';
|
|
2
|
+
import type { Logger } from '../core/logger.js';
|
|
3
|
+
import { EventStreamParser } from './stream.js';
|
|
4
|
+
import { type HarnessAdapter, type SpawnResult, type SpawnTaskOptions, type ToolEventData } from './types.js';
|
|
5
|
+
export declare const OPENCODE_AGENT_TEMPLATE = "---\ndescription: Autonomous task execution agent for osq\nmode: all\npermission:\n read: allow\n edit: allow\n bash: allow\n glob: allow\n grep: allow\n webfetch: deny\n websearch: deny\n---\n\n<!-- OSQ:START -->\n## Executing a spec\n\n1. Read your task file, its parent `spec.md`, then only the docs listed under `features`. Nothing else.\n2. Too big for one pass? Write why in `.run/results/<n>.md`, exit without code.\n3. Read a previous result file for this task if present. Run the task's `verify`. Start from what fails.\n4. Tests for each acceptance line before implementing.\n5. Minimal code to pass. Stay inside `scope`.\n6. Run the task's `verify` command before exiting.\n\n## Exiting\n\nWrite `.run/results/<n>.md` first: changed, deviated, drift against `features/`, missing context, and for unfinished work which acceptance line is next. Omit empty sections. Then exit. One attempt. Never write to `features/`, `tasks.md`, or anything in `specs/` outside `.run/results/`. Do not ask questions.\n<!-- OSQ:END -->\n";
|
|
6
|
+
export declare function resolveOpencodeBinary(config?: OsqConfig): Promise<string>;
|
|
7
|
+
export declare function buildOpencodePrompt(options: SpawnTaskOptions): string;
|
|
8
|
+
export declare function buildOpencodeArgs(options: SpawnTaskOptions): Promise<string[]>;
|
|
9
|
+
export declare const spawnTask: typeof buildOpencodeArgs;
|
|
10
|
+
export interface OpencodeTokensData {
|
|
11
|
+
promptTokens: number;
|
|
12
|
+
candidateTokens: number;
|
|
13
|
+
totalTokens: number;
|
|
14
|
+
cachedTokens: number;
|
|
15
|
+
reasoningTokens: number;
|
|
16
|
+
cost: number;
|
|
17
|
+
}
|
|
18
|
+
export declare function extractOpencodeTokens(event: unknown): OpencodeTokensData | null;
|
|
19
|
+
export declare function extractToolEventSummary(toolName: string, input: unknown): string;
|
|
20
|
+
export declare function extractOpencodeToolEvent(event: unknown): ToolEventData | null;
|
|
21
|
+
export declare function processOpencodeStdoutLine(line: string, specFolderPath: string, taskNumber: string, logger?: Logger): Promise<void>;
|
|
22
|
+
/**
|
|
23
|
+
* Compatibility subclass retained for existing callers and tests; the buffering
|
|
24
|
+
* and serialization logic lives entirely in the shared {@link EventStreamParser}.
|
|
25
|
+
*/
|
|
26
|
+
export declare class OpencodeEventStreamParser extends EventStreamParser {
|
|
27
|
+
constructor(specFolderPath: string, taskNumber: string, logger?: Logger);
|
|
28
|
+
}
|
|
29
|
+
export declare function preflightOpencode(projectRoot: string, config?: OsqConfig): Promise<{
|
|
30
|
+
version: string;
|
|
31
|
+
bin: string;
|
|
32
|
+
}>;
|
|
33
|
+
export declare class OpencodeAdapter implements HarnessAdapter {
|
|
34
|
+
readonly name = "opencode";
|
|
35
|
+
preflight(projectRoot: string, config: OsqConfig): Promise<void>;
|
|
36
|
+
setup(projectRoot: string, config: OsqConfig): Promise<void>;
|
|
37
|
+
spawn(options: SpawnTaskOptions): Promise<SpawnResult>;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=opencode.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opencode.d.ts","sourceRoot":"","sources":["../../src/harness/opencode.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAEnD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAGhD,OAAO,EACL,iBAAiB,EAIlB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,WAAW,EAChB,KAAK,gBAAgB,EAErB,KAAK,aAAa,EAEnB,MAAM,YAAY,CAAC;AAEpB,eAAO,MAAM,uBAAuB,ihCAcnC,CAAC;AAEF,wBAAsB,qBAAqB,CAAC,MAAM,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAQ/E;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,gBAAgB,GAAG,MAAM,CAgCrE;AAED,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAsFpF;AAED,eAAO,MAAM,SAAS,0BAAoB,CAAC;AAE3C,MAAM,WAAW,kBAAkB;IACjC,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,kBAAkB,GAAG,IAAI,CAwD/E;AAKD,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,MAAM,CAuBhF;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,GAAG,aAAa,GAAG,IAAI,CA4B7E;AAqBD,wBAAsB,yBAAyB,CAC7C,IAAI,EAAE,MAAM,EACZ,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CAqEf;AAED;;;GAGG;AACH,qBAAa,yBAA0B,SAAQ,iBAAiB;gBAClD,cAAc,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;CAGxE;AAED,wBAAsB,iBAAiB,CACrC,WAAW,EAAE,MAAM,EACnB,MAAM,CAAC,EAAE,SAAS,GACjB,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,CA2B3C;AAED,qBAAa,eAAgB,YAAW,cAAc;IACpD,QAAQ,CAAC,IAAI,cAAc;IAErB,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhE,KAAK,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAqC5D,KAAK,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,WAAW,CAAC;CAoC7D"}
|