@baanish/hydra-cli 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 +122 -0
- package/dist/config.d.ts +29 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +338 -0
- package/dist/config.js.map +1 -0
- package/dist/db/client.d.ts +10 -0
- package/dist/db/client.d.ts.map +1 -0
- package/dist/db/client.js +93 -0
- package/dist/db/client.js.map +1 -0
- package/dist/db/queries.d.ts +67 -0
- package/dist/db/queries.d.ts.map +1 -0
- package/dist/db/queries.js +336 -0
- package/dist/db/queries.js.map +1 -0
- package/dist/engine/concurrency.d.ts +3 -0
- package/dist/engine/concurrency.d.ts.map +1 -0
- package/dist/engine/concurrency.js +42 -0
- package/dist/engine/concurrency.js.map +1 -0
- package/dist/engine/eta.d.ts +16 -0
- package/dist/engine/eta.d.ts.map +1 -0
- package/dist/engine/eta.js +54 -0
- package/dist/engine/eta.js.map +1 -0
- package/dist/engine/model.d.ts +57 -0
- package/dist/engine/model.d.ts.map +1 -0
- package/dist/engine/model.js +445 -0
- package/dist/engine/model.js.map +1 -0
- package/dist/engine/personas.d.ts +30 -0
- package/dist/engine/personas.d.ts.map +1 -0
- package/dist/engine/personas.js +336 -0
- package/dist/engine/personas.js.map +1 -0
- package/dist/engine/pipeline.d.ts +61 -0
- package/dist/engine/pipeline.d.ts.map +1 -0
- package/dist/engine/pipeline.js +638 -0
- package/dist/engine/pipeline.js.map +1 -0
- package/dist/engine/prompts.d.ts +10 -0
- package/dist/engine/prompts.d.ts.map +1 -0
- package/dist/engine/prompts.js +49 -0
- package/dist/engine/prompts.js.map +1 -0
- package/dist/engine/search.d.ts +46 -0
- package/dist/engine/search.d.ts.map +1 -0
- package/dist/engine/search.js +159 -0
- package/dist/engine/search.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +648 -0
- package/dist/index.js.map +1 -0
- package/dist/security.d.ts +18 -0
- package/dist/security.d.ts.map +1 -0
- package/dist/security.js +168 -0
- package/dist/security.js.map +1 -0
- package/dist/types.d.ts +143 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/ui/agent-mode.d.ts +8 -0
- package/dist/ui/agent-mode.d.ts.map +1 -0
- package/dist/ui/agent-mode.js +138 -0
- package/dist/ui/agent-mode.js.map +1 -0
- package/dist/ui/animations.d.ts +8 -0
- package/dist/ui/animations.d.ts.map +1 -0
- package/dist/ui/animations.js +19 -0
- package/dist/ui/animations.js.map +1 -0
- package/dist/ui/components/agent-list.d.ts +2 -0
- package/dist/ui/components/agent-list.d.ts.map +1 -0
- package/dist/ui/components/agent-list.js +2 -0
- package/dist/ui/components/agent-list.js.map +1 -0
- package/dist/ui/components/header.d.ts +2 -0
- package/dist/ui/components/header.d.ts.map +1 -0
- package/dist/ui/components/header.js +2 -0
- package/dist/ui/components/header.js.map +1 -0
- package/dist/ui/components/phase-bar.d.ts +2 -0
- package/dist/ui/components/phase-bar.d.ts.map +1 -0
- package/dist/ui/components/phase-bar.js +2 -0
- package/dist/ui/components/phase-bar.js.map +1 -0
- package/dist/ui/components/stats-bar.d.ts +2 -0
- package/dist/ui/components/stats-bar.d.ts.map +1 -0
- package/dist/ui/components/stats-bar.js +2 -0
- package/dist/ui/components/stats-bar.js.map +1 -0
- package/dist/ui/tui.d.ts +18 -0
- package/dist/ui/tui.d.ts.map +1 -0
- package/dist/ui/tui.js +464 -0
- package/dist/ui/tui.js.map +1 -0
- package/dist/web/app.html +1352 -0
- package/dist/web/index.d.ts +2 -0
- package/dist/web/index.d.ts.map +1 -0
- package/dist/web/index.js +2 -0
- package/dist/web/index.js.map +1 -0
- package/dist/web/server.d.ts +2 -0
- package/dist/web/server.d.ts.map +1 -0
- package/dist/web/server.js +864 -0
- package/dist/web/server.js.map +1 -0
- package/package.json +59 -0
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import type { AgentPhase, AgentRunRecord, AgentRunStatus, RunRecord, RunStatus } from "../types.js";
|
|
2
|
+
type RunStatusPatch = Partial<Pick<RunRecord, "query" | "status" | "brief" | "error" | "pipelineState" | "totalPromptTokens" | "totalCompletionTokens" | "completedAt" | "elapsedMs">>;
|
|
3
|
+
type AgentRunStatusPatch = Partial<Omit<Pick<AgentRunRecord, "messages" | "output" | "status" | "promptTokens" | "completionTokens" | "completedAt">, "searchQueries"> & {
|
|
4
|
+
searchQueries?: string[];
|
|
5
|
+
startedAt?: number;
|
|
6
|
+
}>;
|
|
7
|
+
/** create a new top-level run row and return the persisted record. */
|
|
8
|
+
export declare function createRun(input: {
|
|
9
|
+
query: string;
|
|
10
|
+
agentCount: number;
|
|
11
|
+
status?: RunStatus;
|
|
12
|
+
pipelineState?: string | null;
|
|
13
|
+
}): RunRecord;
|
|
14
|
+
/** update a run record and return the fresh persisted record. */
|
|
15
|
+
export declare function updateRunStatus(runId: string, patch: RunStatusPatch): RunRecord;
|
|
16
|
+
/** fetch a single run by id or return null. */
|
|
17
|
+
export declare function getRun(runId: string): RunRecord | null;
|
|
18
|
+
/** list recent runs in descending creation order, clamped to a safe page size. */
|
|
19
|
+
export declare function listRuns(limit?: number): RunRecord[];
|
|
20
|
+
/** delete a run and its dependent agent rows. */
|
|
21
|
+
export declare function deleteRun(runId: string): boolean;
|
|
22
|
+
/** create a new agent run row in the database. */
|
|
23
|
+
export declare function createAgentRun(input: {
|
|
24
|
+
runId: string;
|
|
25
|
+
phase: AgentPhase;
|
|
26
|
+
persona: string;
|
|
27
|
+
systemPrompt: string;
|
|
28
|
+
messages?: string;
|
|
29
|
+
output?: string;
|
|
30
|
+
searchQueries?: string[];
|
|
31
|
+
status?: AgentRunStatus;
|
|
32
|
+
promptTokens?: number;
|
|
33
|
+
completionTokens?: number;
|
|
34
|
+
startedAt?: number;
|
|
35
|
+
completedAt?: number | null;
|
|
36
|
+
}): AgentRunRecord;
|
|
37
|
+
/** apply status/output changes to an agent run and return updated state. */
|
|
38
|
+
export declare function updateAgentRun(agentRunId: string, patch: AgentRunStatusPatch): AgentRunRecord;
|
|
39
|
+
/** mark an agent run complete and persist usage and status metadata. */
|
|
40
|
+
export declare function completeAgentRun(agentRunId: string, output: string, options?: {
|
|
41
|
+
status?: AgentRunStatus;
|
|
42
|
+
searchQueries?: string[];
|
|
43
|
+
promptTokens?: number;
|
|
44
|
+
completionTokens?: number;
|
|
45
|
+
}): AgentRunRecord;
|
|
46
|
+
/** fetch a single agent run or return null. */
|
|
47
|
+
export declare function getAgentRun(agentRunId: string): AgentRunRecord | null;
|
|
48
|
+
/** fetch all agent runs for a run ordered by start time. */
|
|
49
|
+
export declare function getAgentRunsForRun(runId: string): AgentRunRecord[];
|
|
50
|
+
/** alias for `getAgentRunsForRun` retained for compatibility. */
|
|
51
|
+
export declare function getRunAgentRuns(runId: string): AgentRunRecord[];
|
|
52
|
+
/** delete all agent runs tied to a run id. */
|
|
53
|
+
export declare function deleteAgentRunsForRun(runId: string): void;
|
|
54
|
+
/** legacy alias for `deleteRun` kept for compatibility. */
|
|
55
|
+
export declare const deleteRunRecords: typeof deleteRun;
|
|
56
|
+
/** mark a run complete with final brief and compute elapsed wall time. */
|
|
57
|
+
export declare function markRunComplete(runId: string, brief: string): RunRecord;
|
|
58
|
+
/** mark a run as failed and store the error message. */
|
|
59
|
+
export declare function markRunFailed(runId: string, error: string): RunRecord;
|
|
60
|
+
/** increment token usage counters on a run. */
|
|
61
|
+
export declare function addTokenUsage(runId: string, promptTokens: number, completionTokens: number): void;
|
|
62
|
+
/** backwards-compatible alias for `updateRunStatus`. */
|
|
63
|
+
export declare const updateRun: typeof updateRunStatus;
|
|
64
|
+
/** backwards-compatible alias for `deleteRun`. */
|
|
65
|
+
export declare const removeRun: typeof deleteRun;
|
|
66
|
+
export {};
|
|
67
|
+
//# sourceMappingURL=queries.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queries.d.ts","sourceRoot":"","sources":["../../src/db/queries.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACX,UAAU,EACV,cAAc,EACd,cAAc,EACd,SAAS,EACT,SAAS,EACT,MAAM,aAAa,CAAC;AAkCrB,KAAK,cAAc,GAAG,OAAO,CAC5B,IAAI,CACH,SAAS,EACP,OAAO,GACP,QAAQ,GACR,OAAO,GACP,OAAO,GACP,eAAe,GACf,mBAAmB,GACnB,uBAAuB,GACvB,aAAa,GACb,WAAW,CACb,CACD,CAAC;AAEF,KAAK,mBAAmB,GAAG,OAAO,CACjC,IAAI,CACH,IAAI,CACH,cAAc,EACZ,UAAU,GACV,QAAQ,GACR,QAAQ,GACR,cAAc,GACd,kBAAkB,GAClB,aAAa,CACf,EACD,eAAe,CACf,GAAG;IACH,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB,CACD,CAAC;AA0GF,sEAAsE;AACtE,wBAAgB,SAAS,CAAC,KAAK,EAAE;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B,GAAG,SAAS,CA6BZ;AAkDD,iEAAiE;AACjE,wBAAgB,eAAe,CAC9B,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,cAAc,GACnB,SAAS,CAsBX;AAED,+CAA+C;AAC/C,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAMtD;AAED,kFAAkF;AAClF,wBAAgB,QAAQ,CAAC,KAAK,SAAK,GAAG,SAAS,EAAE,CAMhD;AAED,iDAAiD;AACjD,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAKhD;AAED,kDAAkD;AAClD,wBAAgB,cAAc,CAAC,KAAK,EAAE;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,UAAU,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B,GAAG,cAAc,CAmCjB;AA8CD,4EAA4E;AAC5E,wBAAgB,cAAc,CAC7B,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,mBAAmB,GACxB,cAAc,CAsBhB;AAED,wEAAwE;AACxE,wBAAgB,gBAAgB,CAC/B,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE;IACT,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC1B,GACC,cAAc,CAShB;AAED,+CAA+C;AAC/C,wBAAgB,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAMrE;AAED,4DAA4D;AAC5D,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,EAAE,CAMlE;AAED,iEAAiE;AACjE,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,EAAE,CAE/D;AAED,8CAA8C;AAC9C,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAGzD;AAED,2DAA2D;AAC3D,eAAO,MAAM,gBAAgB,kBAAY,CAAC;AAE1C,0EAA0E;AAC1E,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,CAcvE;AAED,wDAAwD;AACxD,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,CAYrE;AAED,+CAA+C;AAC/C,wBAAgB,aAAa,CAC5B,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,EACpB,gBAAgB,EAAE,MAAM,GACtB,IAAI,CASN;AAGD,wDAAwD;AACxD,eAAO,MAAM,SAAS,wBAAkB,CAAC;AACzC,kDAAkD;AAClD,eAAO,MAAM,SAAS,kBAAY,CAAC"}
|
|
@@ -0,0 +1,336 @@
|
|
|
1
|
+
import { nanoid } from "nanoid";
|
|
2
|
+
import { getDatabase } from "./client.js";
|
|
3
|
+
function toRunRecord(row) {
|
|
4
|
+
return {
|
|
5
|
+
id: row.id,
|
|
6
|
+
query: row.query,
|
|
7
|
+
agentCount: row.agent_count,
|
|
8
|
+
status: row.status,
|
|
9
|
+
brief: row.brief,
|
|
10
|
+
error: row.error,
|
|
11
|
+
pipelineState: row.pipeline_state,
|
|
12
|
+
totalPromptTokens: row.total_prompt_tokens,
|
|
13
|
+
totalCompletionTokens: row.total_completion_tokens,
|
|
14
|
+
createdAt: row.created_at,
|
|
15
|
+
completedAt: row.completed_at,
|
|
16
|
+
elapsedMs: row.elapsed_ms,
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
function toAgentRunRecord(row) {
|
|
20
|
+
return {
|
|
21
|
+
id: row.id,
|
|
22
|
+
runId: row.run_id,
|
|
23
|
+
phase: row.phase,
|
|
24
|
+
persona: row.persona,
|
|
25
|
+
systemPrompt: row.system_prompt,
|
|
26
|
+
messages: row.messages ?? "[]",
|
|
27
|
+
output: row.output,
|
|
28
|
+
searchQueries: row.search_queries ?? "[]",
|
|
29
|
+
status: row.status,
|
|
30
|
+
promptTokens: row.prompt_tokens,
|
|
31
|
+
completionTokens: row.completion_tokens,
|
|
32
|
+
startedAt: row.started_at,
|
|
33
|
+
completedAt: row.completed_at,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
function normalizeTokenValue(value) {
|
|
37
|
+
return typeof value === "number" && Number.isFinite(value) ? value : 0;
|
|
38
|
+
}
|
|
39
|
+
function toDbRunValues(input) {
|
|
40
|
+
const now = Date.now();
|
|
41
|
+
return {
|
|
42
|
+
id: nanoid(),
|
|
43
|
+
query: input.query,
|
|
44
|
+
agent_count: input.agentCount,
|
|
45
|
+
status: input.status ?? "decomposing",
|
|
46
|
+
pipeline_state: input.pipelineState ?? null,
|
|
47
|
+
created_at: now,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
function toDbAgentRunValues(input) {
|
|
51
|
+
return {
|
|
52
|
+
id: nanoid(),
|
|
53
|
+
run_id: input.runId,
|
|
54
|
+
phase: input.phase,
|
|
55
|
+
persona: input.persona,
|
|
56
|
+
system_prompt: input.systemPrompt,
|
|
57
|
+
messages: input.messages ?? "[]",
|
|
58
|
+
output: input.output ?? "",
|
|
59
|
+
search_queries: JSON.stringify(input.searchQueries ?? []),
|
|
60
|
+
status: input.status ?? "running",
|
|
61
|
+
prompt_tokens: input.promptTokens ?? 0,
|
|
62
|
+
completion_tokens: input.completionTokens ?? 0,
|
|
63
|
+
started_at: input.startedAt ?? Date.now(),
|
|
64
|
+
completed_at: input.completedAt ?? null,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
const RUNS_SELECT = `
|
|
68
|
+
SELECT
|
|
69
|
+
id, query, agent_count, status, brief, error, pipeline_state,
|
|
70
|
+
total_prompt_tokens, total_completion_tokens, created_at, completed_at, elapsed_ms
|
|
71
|
+
FROM runs
|
|
72
|
+
`;
|
|
73
|
+
const AGENT_RUNS_SELECT = `
|
|
74
|
+
SELECT
|
|
75
|
+
id, run_id, phase, persona, system_prompt, messages, output, search_queries,
|
|
76
|
+
status, prompt_tokens, completion_tokens, started_at, completed_at
|
|
77
|
+
FROM agent_runs
|
|
78
|
+
`;
|
|
79
|
+
/** create a new top-level run row and return the persisted record. */
|
|
80
|
+
export function createRun(input) {
|
|
81
|
+
const db = getDatabase();
|
|
82
|
+
const row = toDbRunValues(input);
|
|
83
|
+
db.prepare(`
|
|
84
|
+
INSERT INTO runs (
|
|
85
|
+
id, query, agent_count, status, brief, error, pipeline_state,
|
|
86
|
+
total_prompt_tokens, total_completion_tokens, created_at, completed_at, elapsed_ms
|
|
87
|
+
)
|
|
88
|
+
VALUES (
|
|
89
|
+
?, ?, ?, ?, NULL, NULL, ?, 0, 0, ?, NULL, NULL
|
|
90
|
+
)
|
|
91
|
+
`).run(row.id, row.query, row.agent_count, row.status, row.pipeline_state, row.created_at);
|
|
92
|
+
const created = getRun(row.id);
|
|
93
|
+
if (!created) {
|
|
94
|
+
throw new Error(`Run ${row.id} not found`);
|
|
95
|
+
}
|
|
96
|
+
return created;
|
|
97
|
+
}
|
|
98
|
+
/** build a patch for updating top-level run columns while enforcing defaults. */
|
|
99
|
+
function buildRunPatch(patch) {
|
|
100
|
+
const fields = [];
|
|
101
|
+
const values = [];
|
|
102
|
+
if (patch.query !== undefined) {
|
|
103
|
+
fields.push("query = ?");
|
|
104
|
+
values.push(patch.query);
|
|
105
|
+
}
|
|
106
|
+
if (patch.status !== undefined) {
|
|
107
|
+
fields.push("status = ?");
|
|
108
|
+
values.push(patch.status);
|
|
109
|
+
}
|
|
110
|
+
if (patch.brief !== undefined) {
|
|
111
|
+
fields.push("brief = ?");
|
|
112
|
+
values.push(patch.brief);
|
|
113
|
+
}
|
|
114
|
+
if (patch.error !== undefined) {
|
|
115
|
+
fields.push("error = ?");
|
|
116
|
+
values.push(patch.error);
|
|
117
|
+
}
|
|
118
|
+
if (patch.pipelineState !== undefined) {
|
|
119
|
+
fields.push("pipeline_state = ?");
|
|
120
|
+
values.push(patch.pipelineState);
|
|
121
|
+
}
|
|
122
|
+
if (patch.totalPromptTokens !== undefined) {
|
|
123
|
+
fields.push("total_prompt_tokens = ?");
|
|
124
|
+
values.push(patch.totalPromptTokens);
|
|
125
|
+
}
|
|
126
|
+
if (patch.totalCompletionTokens !== undefined) {
|
|
127
|
+
fields.push("total_completion_tokens = ?");
|
|
128
|
+
values.push(patch.totalCompletionTokens);
|
|
129
|
+
}
|
|
130
|
+
if (patch.completedAt !== undefined) {
|
|
131
|
+
fields.push("completed_at = ?");
|
|
132
|
+
values.push(patch.completedAt);
|
|
133
|
+
}
|
|
134
|
+
if (patch.elapsedMs !== undefined) {
|
|
135
|
+
fields.push("elapsed_ms = ?");
|
|
136
|
+
values.push(patch.elapsedMs);
|
|
137
|
+
}
|
|
138
|
+
return { fields, values };
|
|
139
|
+
}
|
|
140
|
+
/** update a run record and return the fresh persisted record. */
|
|
141
|
+
export function updateRunStatus(runId, patch) {
|
|
142
|
+
const db = getDatabase();
|
|
143
|
+
const { fields, values } = buildRunPatch(patch);
|
|
144
|
+
if (fields.length === 0) {
|
|
145
|
+
const run = getRun(runId);
|
|
146
|
+
if (!run) {
|
|
147
|
+
throw new Error(`Run ${runId} not found`);
|
|
148
|
+
}
|
|
149
|
+
return run;
|
|
150
|
+
}
|
|
151
|
+
db.prepare(`UPDATE runs SET ${fields.join(", ")} WHERE id = ?`).run(...values, runId);
|
|
152
|
+
const updated = getRun(runId);
|
|
153
|
+
if (!updated) {
|
|
154
|
+
throw new Error(`Run ${runId} not found`);
|
|
155
|
+
}
|
|
156
|
+
return updated;
|
|
157
|
+
}
|
|
158
|
+
/** fetch a single run by id or return null. */
|
|
159
|
+
export function getRun(runId) {
|
|
160
|
+
const db = getDatabase();
|
|
161
|
+
const row = db
|
|
162
|
+
.prepare(`${RUNS_SELECT} WHERE id = ?`)
|
|
163
|
+
.get(runId);
|
|
164
|
+
return row ? toRunRecord(row) : null;
|
|
165
|
+
}
|
|
166
|
+
/** list recent runs in descending creation order, clamped to a safe page size. */
|
|
167
|
+
export function listRuns(limit = 50) {
|
|
168
|
+
const db = getDatabase();
|
|
169
|
+
const rows = db
|
|
170
|
+
.prepare(`${RUNS_SELECT} ORDER BY created_at DESC LIMIT ?`)
|
|
171
|
+
.all(Math.max(1, Math.min(limit, 500)));
|
|
172
|
+
return rows.map(toRunRecord);
|
|
173
|
+
}
|
|
174
|
+
/** delete a run and its dependent agent rows. */
|
|
175
|
+
export function deleteRun(runId) {
|
|
176
|
+
const db = getDatabase();
|
|
177
|
+
deleteAgentRunsForRun(runId);
|
|
178
|
+
const result = db.prepare("DELETE FROM runs WHERE id = ?").run(runId);
|
|
179
|
+
return result.changes > 0;
|
|
180
|
+
}
|
|
181
|
+
/** create a new agent run row in the database. */
|
|
182
|
+
export function createAgentRun(input) {
|
|
183
|
+
const db = getDatabase();
|
|
184
|
+
const row = toDbAgentRunValues(input);
|
|
185
|
+
db.prepare(`
|
|
186
|
+
INSERT INTO agent_runs (
|
|
187
|
+
id, run_id, phase, persona, system_prompt, messages, output, search_queries,
|
|
188
|
+
status, prompt_tokens, completion_tokens, started_at, completed_at
|
|
189
|
+
)
|
|
190
|
+
VALUES (
|
|
191
|
+
?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?
|
|
192
|
+
)
|
|
193
|
+
`).run(row.id, row.run_id, row.phase, row.persona, row.system_prompt, row.messages, row.output, row.search_queries, row.status, row.prompt_tokens, row.completion_tokens, row.started_at, row.completed_at);
|
|
194
|
+
const agentRun = getAgentRun(row.id);
|
|
195
|
+
if (!agentRun) {
|
|
196
|
+
throw new Error(`Failed to create agent run ${row.id}`);
|
|
197
|
+
}
|
|
198
|
+
return agentRun;
|
|
199
|
+
}
|
|
200
|
+
/** build a patch for updating agent run columns. */
|
|
201
|
+
function buildAgentRunPatch(patch) {
|
|
202
|
+
const fields = [];
|
|
203
|
+
const values = [];
|
|
204
|
+
if (patch.messages !== undefined) {
|
|
205
|
+
fields.push("messages = ?");
|
|
206
|
+
values.push(patch.messages);
|
|
207
|
+
}
|
|
208
|
+
if (patch.output !== undefined) {
|
|
209
|
+
fields.push("output = ?");
|
|
210
|
+
values.push(patch.output);
|
|
211
|
+
}
|
|
212
|
+
if (patch.searchQueries !== undefined) {
|
|
213
|
+
fields.push("search_queries = ?");
|
|
214
|
+
values.push(JSON.stringify(patch.searchQueries));
|
|
215
|
+
}
|
|
216
|
+
if (patch.status !== undefined) {
|
|
217
|
+
fields.push("status = ?");
|
|
218
|
+
values.push(patch.status);
|
|
219
|
+
}
|
|
220
|
+
if (patch.promptTokens !== undefined) {
|
|
221
|
+
fields.push("prompt_tokens = ?");
|
|
222
|
+
values.push(normalizeTokenValue(patch.promptTokens));
|
|
223
|
+
}
|
|
224
|
+
if (patch.completionTokens !== undefined) {
|
|
225
|
+
fields.push("completion_tokens = ?");
|
|
226
|
+
values.push(normalizeTokenValue(patch.completionTokens));
|
|
227
|
+
}
|
|
228
|
+
if (patch.completedAt !== undefined) {
|
|
229
|
+
fields.push("completed_at = ?");
|
|
230
|
+
values.push(patch.completedAt);
|
|
231
|
+
}
|
|
232
|
+
if (patch.startedAt !== undefined) {
|
|
233
|
+
fields.push("started_at = ?");
|
|
234
|
+
values.push(patch.startedAt);
|
|
235
|
+
}
|
|
236
|
+
return { fields, values };
|
|
237
|
+
}
|
|
238
|
+
/** apply status/output changes to an agent run and return updated state. */
|
|
239
|
+
export function updateAgentRun(agentRunId, patch) {
|
|
240
|
+
const db = getDatabase();
|
|
241
|
+
const { fields, values } = buildAgentRunPatch(patch);
|
|
242
|
+
if (fields.length === 0) {
|
|
243
|
+
const existing = getAgentRun(agentRunId);
|
|
244
|
+
if (!existing) {
|
|
245
|
+
throw new Error(`Agent run ${agentRunId} not found`);
|
|
246
|
+
}
|
|
247
|
+
return existing;
|
|
248
|
+
}
|
|
249
|
+
db.prepare(`UPDATE agent_runs SET ${fields.join(", ")} WHERE id = ?`).run(...values, agentRunId);
|
|
250
|
+
const run = getAgentRun(agentRunId);
|
|
251
|
+
if (!run) {
|
|
252
|
+
throw new Error(`Agent run ${agentRunId} not found`);
|
|
253
|
+
}
|
|
254
|
+
return run;
|
|
255
|
+
}
|
|
256
|
+
/** mark an agent run complete and persist usage and status metadata. */
|
|
257
|
+
export function completeAgentRun(agentRunId, output, options) {
|
|
258
|
+
return updateAgentRun(agentRunId, {
|
|
259
|
+
output,
|
|
260
|
+
status: options?.status ?? "complete",
|
|
261
|
+
searchQueries: options?.searchQueries,
|
|
262
|
+
promptTokens: options?.promptTokens,
|
|
263
|
+
completionTokens: options?.completionTokens,
|
|
264
|
+
completedAt: Date.now(),
|
|
265
|
+
});
|
|
266
|
+
}
|
|
267
|
+
/** fetch a single agent run or return null. */
|
|
268
|
+
export function getAgentRun(agentRunId) {
|
|
269
|
+
const db = getDatabase();
|
|
270
|
+
const row = db
|
|
271
|
+
.prepare(`${AGENT_RUNS_SELECT} WHERE id = ?`)
|
|
272
|
+
.get(agentRunId);
|
|
273
|
+
return row ? toAgentRunRecord(row) : null;
|
|
274
|
+
}
|
|
275
|
+
/** fetch all agent runs for a run ordered by start time. */
|
|
276
|
+
export function getAgentRunsForRun(runId) {
|
|
277
|
+
const db = getDatabase();
|
|
278
|
+
const rows = db
|
|
279
|
+
.prepare(`${AGENT_RUNS_SELECT} WHERE run_id = ? ORDER BY rowid`)
|
|
280
|
+
.all(runId);
|
|
281
|
+
return rows.map(toAgentRunRecord);
|
|
282
|
+
}
|
|
283
|
+
/** alias for `getAgentRunsForRun` retained for compatibility. */
|
|
284
|
+
export function getRunAgentRuns(runId) {
|
|
285
|
+
return getAgentRunsForRun(runId);
|
|
286
|
+
}
|
|
287
|
+
/** delete all agent runs tied to a run id. */
|
|
288
|
+
export function deleteAgentRunsForRun(runId) {
|
|
289
|
+
const db = getDatabase();
|
|
290
|
+
db.prepare("DELETE FROM agent_runs WHERE run_id = ?").run(runId);
|
|
291
|
+
}
|
|
292
|
+
/** legacy alias for `deleteRun` kept for compatibility. */
|
|
293
|
+
export const deleteRunRecords = deleteRun;
|
|
294
|
+
/** mark a run complete with final brief and compute elapsed wall time. */
|
|
295
|
+
export function markRunComplete(runId, brief) {
|
|
296
|
+
const run = getRun(runId);
|
|
297
|
+
if (!run) {
|
|
298
|
+
throw new Error(`Run ${runId} not found`);
|
|
299
|
+
}
|
|
300
|
+
const completedAt = Date.now();
|
|
301
|
+
return updateRunStatus(runId, {
|
|
302
|
+
status: "complete",
|
|
303
|
+
brief,
|
|
304
|
+
completedAt,
|
|
305
|
+
elapsedMs: completedAt - run.createdAt,
|
|
306
|
+
error: null,
|
|
307
|
+
});
|
|
308
|
+
}
|
|
309
|
+
/** mark a run as failed and store the error message. */
|
|
310
|
+
export function markRunFailed(runId, error) {
|
|
311
|
+
const run = getRun(runId);
|
|
312
|
+
if (!run) {
|
|
313
|
+
throw new Error(`Run ${runId} not found`);
|
|
314
|
+
}
|
|
315
|
+
return updateRunStatus(runId, {
|
|
316
|
+
status: "error",
|
|
317
|
+
error,
|
|
318
|
+
completedAt: Date.now(),
|
|
319
|
+
elapsedMs: Date.now() - run.createdAt,
|
|
320
|
+
});
|
|
321
|
+
}
|
|
322
|
+
/** increment token usage counters on a run. */
|
|
323
|
+
export function addTokenUsage(runId, promptTokens, completionTokens) {
|
|
324
|
+
const db = getDatabase();
|
|
325
|
+
db.prepare(`
|
|
326
|
+
UPDATE runs
|
|
327
|
+
SET total_prompt_tokens = total_prompt_tokens + ?, total_completion_tokens = total_completion_tokens + ?
|
|
328
|
+
WHERE id = ?
|
|
329
|
+
`).run(promptTokens, completionTokens, runId);
|
|
330
|
+
}
|
|
331
|
+
// Backward-compatible aliases for older callers.
|
|
332
|
+
/** backwards-compatible alias for `updateRunStatus`. */
|
|
333
|
+
export const updateRun = updateRunStatus;
|
|
334
|
+
/** backwards-compatible alias for `deleteRun`. */
|
|
335
|
+
export const removeRun = deleteRun;
|
|
336
|
+
//# sourceMappingURL=queries.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queries.js","sourceRoot":"","sources":["../../src/db/queries.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
/** run asynchronous work with bounded concurrency and optional progress callback. */
|
|
2
|
+
export declare function runWithConcurrency<T, R>(items: T[], concurrency: number, fn: (item: T, index: number) => Promise<R>, onProgress?: (completed: number, total: number) => void): Promise<R[]>;
|
|
3
|
+
//# sourceMappingURL=concurrency.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"concurrency.d.ts","sourceRoot":"","sources":["../../src/engine/concurrency.ts"],"names":[],"mappings":"AAAA,qFAAqF;AACrF,wBAAsB,kBAAkB,CAAC,CAAC,EAAE,CAAC,EAC5C,KAAK,EAAE,CAAC,EAAE,EACV,WAAW,EAAE,MAAM,EACnB,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,EAC1C,UAAU,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,GACrD,OAAO,CAAC,CAAC,EAAE,CAAC,CA2Cd"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/** run asynchronous work with bounded concurrency and optional progress callback. */
|
|
2
|
+
export async function runWithConcurrency(items, concurrency, fn, onProgress) {
|
|
3
|
+
const total = items.length;
|
|
4
|
+
if (total === 0) {
|
|
5
|
+
return [];
|
|
6
|
+
}
|
|
7
|
+
const safeConcurrency = Math.max(1, Math.floor(concurrency));
|
|
8
|
+
const results = new Array(total);
|
|
9
|
+
let nextIndex = 0;
|
|
10
|
+
let completed = 0;
|
|
11
|
+
let hasFirstError = false;
|
|
12
|
+
let firstError;
|
|
13
|
+
const worker = async () => {
|
|
14
|
+
while (true) {
|
|
15
|
+
const currentIndex = nextIndex++;
|
|
16
|
+
if (currentIndex >= total) {
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
try {
|
|
20
|
+
const item = items[currentIndex];
|
|
21
|
+
results[currentIndex] = await fn(item, currentIndex);
|
|
22
|
+
}
|
|
23
|
+
catch (error) {
|
|
24
|
+
if (!hasFirstError) {
|
|
25
|
+
hasFirstError = true;
|
|
26
|
+
firstError = error;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
finally {
|
|
30
|
+
completed += 1;
|
|
31
|
+
onProgress?.(completed, total);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
const workers = Array.from({ length: Math.min(total, safeConcurrency) }, () => worker());
|
|
36
|
+
await Promise.all(workers);
|
|
37
|
+
if (hasFirstError) {
|
|
38
|
+
throw firstError;
|
|
39
|
+
}
|
|
40
|
+
return results;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=concurrency.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"concurrency.js","sourceRoot":"","sources":["../../src/engine/concurrency.ts"],"names":[],"mappings":"AAAA,qFAAqF;AACrF,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACvC,KAAU,EACV,WAAmB,EACnB,EAA0C,EAC1C,UAAuD;IAEvD,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC;IAC3B,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;QACjB,OAAO,EAAE,CAAC;IACX,CAAC;IAED,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC;IAC7D,MAAM,OAAO,GAAQ,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC;IACtC,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,aAAa,GAAG,KAAK,CAAC;IAC1B,IAAI,UAAmB,CAAC;IAExB,MAAM,MAAM,GAAG,KAAK,IAAI,EAAE;QACzB,OAAO,IAAI,EAAE,CAAC;YACb,MAAM,YAAY,GAAG,SAAS,EAAE,CAAC;YACjC,IAAI,YAAY,IAAI,KAAK,EAAE,CAAC;gBAC3B,OAAO;YACR,CAAC;YAED,IAAI,CAAC;gBACJ,MAAM,IAAI,GAAG,KAAK,CAAC,YAAY,CAAC,CAAC;gBACjC,OAAO,CAAC,YAAY,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;YACtD,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,IAAI,CAAC,aAAa,EAAE,CAAC;oBACpB,aAAa,GAAG,IAAI,CAAC;oBACrB,UAAU,GAAG,KAAK,CAAC;gBACpB,CAAC;YACF,CAAC;oBAAS,CAAC;gBACV,SAAS,IAAI,CAAC,CAAC;gBACf,UAAU,EAAE,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;YAChC,CAAC;QACF,CAAC;IACF,CAAC,CAAC;IAEF,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,eAAe,CAAC,EAAE,EAAE,GAAG,EAAE,CAC7E,MAAM,EAAE,CACR,CAAC;IACF,MAAM,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC3B,IAAI,aAAa,EAAE,CAAC;QACnB,MAAM,UAAU,CAAC;IAClB,CAAC;IACD,OAAO,OAAO,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/** estimate remaining wall clock with recent completion samples and concurrency. */
|
|
2
|
+
export declare class ETAEstimator {
|
|
3
|
+
private completionTimesMs;
|
|
4
|
+
private readonly maxSamples;
|
|
5
|
+
/** initialize the estimator with optional max sample size for smoothing. */
|
|
6
|
+
constructor(maxSamples?: number);
|
|
7
|
+
/** record a completed item duration in milliseconds for future estimates. */
|
|
8
|
+
recordCompletion(durationMs: number): void;
|
|
9
|
+
/** estimate remaining time from current samples and configured concurrency. */
|
|
10
|
+
estimate(remainingItems: number, currentConcurrency: number): string;
|
|
11
|
+
/** clear any stored completion samples. */
|
|
12
|
+
reset(): void;
|
|
13
|
+
}
|
|
14
|
+
/** format milliseconds into a human friendly `Xm Ss` or `Ns` string. */
|
|
15
|
+
export declare function formatDuration(ms: number): string;
|
|
16
|
+
//# sourceMappingURL=eta.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eta.d.ts","sourceRoot":"","sources":["../../src/engine/eta.ts"],"names":[],"mappings":"AAAA,oFAAoF;AACpF,qBAAa,YAAY;IACxB,OAAO,CAAC,iBAAiB,CAAgB;IACzC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IAEpC,4EAA4E;gBAChE,UAAU,SAAK;IAI3B,6EAA6E;IAC7E,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAW1C,+EAA+E;IAC/E,QAAQ,CAAC,cAAc,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,GAAG,MAAM;IAoBpE,2CAA2C;IAC3C,KAAK,IAAI,IAAI;CAGb;AAED,wEAAwE;AACxE,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAajD"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/** estimate remaining wall clock with recent completion samples and concurrency. */
|
|
2
|
+
export class ETAEstimator {
|
|
3
|
+
completionTimesMs = [];
|
|
4
|
+
maxSamples;
|
|
5
|
+
/** initialize the estimator with optional max sample size for smoothing. */
|
|
6
|
+
constructor(maxSamples = 20) {
|
|
7
|
+
this.maxSamples = Math.max(1, maxSamples);
|
|
8
|
+
}
|
|
9
|
+
/** record a completed item duration in milliseconds for future estimates. */
|
|
10
|
+
recordCompletion(durationMs) {
|
|
11
|
+
if (!Number.isFinite(durationMs) || durationMs <= 0) {
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
this.completionTimesMs.push(durationMs);
|
|
15
|
+
if (this.completionTimesMs.length > this.maxSamples) {
|
|
16
|
+
this.completionTimesMs.shift();
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
/** estimate remaining time from current samples and configured concurrency. */
|
|
20
|
+
estimate(remainingItems, currentConcurrency) {
|
|
21
|
+
if (!Number.isFinite(remainingItems) || remainingItems <= 0) {
|
|
22
|
+
return "0s";
|
|
23
|
+
}
|
|
24
|
+
if (this.completionTimesMs.length === 0) {
|
|
25
|
+
return "--";
|
|
26
|
+
}
|
|
27
|
+
const safeConcurrency = Number.isFinite(currentConcurrency) && currentConcurrency > 0
|
|
28
|
+
? Math.floor(currentConcurrency)
|
|
29
|
+
: 1;
|
|
30
|
+
const average = this.completionTimesMs.reduce((sum, value) => sum + value, 0) /
|
|
31
|
+
this.completionTimesMs.length;
|
|
32
|
+
const batches = Math.ceil(remainingItems / safeConcurrency);
|
|
33
|
+
const estimateMs = Math.max(0, Math.round(average * batches));
|
|
34
|
+
return formatDuration(estimateMs);
|
|
35
|
+
}
|
|
36
|
+
/** clear any stored completion samples. */
|
|
37
|
+
reset() {
|
|
38
|
+
this.completionTimesMs = [];
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/** format milliseconds into a human friendly `Xm Ss` or `Ns` string. */
|
|
42
|
+
export function formatDuration(ms) {
|
|
43
|
+
if (!Number.isFinite(ms) || ms <= 0) {
|
|
44
|
+
return "0s";
|
|
45
|
+
}
|
|
46
|
+
const totalSeconds = Math.max(1, Math.round(ms / 1000));
|
|
47
|
+
const minutes = Math.floor(totalSeconds / 60);
|
|
48
|
+
const seconds = totalSeconds % 60;
|
|
49
|
+
if (minutes > 0) {
|
|
50
|
+
return `${minutes}m ${String(seconds).padStart(2, "0")}s`;
|
|
51
|
+
}
|
|
52
|
+
return `${seconds}s`;
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=eta.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eta.js","sourceRoot":"","sources":["../../src/engine/eta.ts"],"names":[],"mappings":"AAAA,oFAAoF;AACpF,MAAM,OAAO,YAAY;IAChB,iBAAiB,GAAa,EAAE,CAAC;IACxB,UAAU,CAAS;IAEpC,4EAA4E;IAC5E,YAAY,UAAU,GAAG,EAAE;QAC1B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;IAC3C,CAAC;IAED,6EAA6E;IAC7E,gBAAgB,CAAC,UAAkB;QAClC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,UAAU,IAAI,CAAC,EAAE,CAAC;YACrD,OAAO;QACR,CAAC;QAED,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACxC,IAAI,IAAI,CAAC,iBAAiB,CAAC,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;YACrD,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,CAAC;QAChC,CAAC;IACF,CAAC;IAED,+EAA+E;IAC/E,QAAQ,CAAC,cAAsB,EAAE,kBAA0B;QAC1D,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,cAAc,IAAI,CAAC,EAAE,CAAC;YAC7D,OAAO,IAAI,CAAC;QACb,CAAC;QACD,IAAI,IAAI,CAAC,iBAAiB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzC,OAAO,IAAI,CAAC;QACb,CAAC;QAED,MAAM,eAAe,GACpB,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAAC,IAAI,kBAAkB,GAAG,CAAC;YAC5D,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC;YAChC,CAAC,CAAC,CAAC,CAAC;QACN,MAAM,OAAO,GACZ,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,GAAG,KAAK,EAAE,CAAC,CAAC;YAC7D,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC;QAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,GAAG,eAAe,CAAC,CAAC;QAC5D,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC;QAC9D,OAAO,cAAc,CAAC,UAAU,CAAC,CAAC;IACnC,CAAC;IAED,2CAA2C;IAC3C,KAAK;QACJ,IAAI,CAAC,iBAAiB,GAAG,EAAE,CAAC;IAC7B,CAAC;CACD;AAED,wEAAwE;AACxE,MAAM,UAAU,cAAc,CAAC,EAAU;IACxC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;QACrC,OAAO,IAAI,CAAC;IACb,CAAC;IAED,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;IACxD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,EAAE,CAAC,CAAC;IAC9C,MAAM,OAAO,GAAG,YAAY,GAAG,EAAE,CAAC;IAElC,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;QACjB,OAAO,GAAG,OAAO,KAAK,MAAM,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC;IAC3D,CAAC;IACD,OAAO,GAAG,OAAO,GAAG,CAAC;AACtB,CAAC"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import type { SearchConfig } from "../types.js";
|
|
2
|
+
type NormalizedToolCall = {
|
|
3
|
+
id: string;
|
|
4
|
+
type: "function";
|
|
5
|
+
function: {
|
|
6
|
+
name: string;
|
|
7
|
+
arguments: string;
|
|
8
|
+
};
|
|
9
|
+
};
|
|
10
|
+
type NormalizedMessage = {
|
|
11
|
+
role: "system";
|
|
12
|
+
content: string;
|
|
13
|
+
} | {
|
|
14
|
+
role: "user";
|
|
15
|
+
content: string;
|
|
16
|
+
} | {
|
|
17
|
+
role: "assistant";
|
|
18
|
+
content: string;
|
|
19
|
+
tool_calls?: NormalizedToolCall[];
|
|
20
|
+
} | {
|
|
21
|
+
role: "tool";
|
|
22
|
+
content: string;
|
|
23
|
+
tool_call_id: string;
|
|
24
|
+
};
|
|
25
|
+
/** normalized result from a model invocation including usage and trace. */
|
|
26
|
+
export interface ModelRunResult {
|
|
27
|
+
/** normalized output text after model cleanup. */
|
|
28
|
+
output: string;
|
|
29
|
+
messages: NormalizedMessage[];
|
|
30
|
+
searchQueries: string[];
|
|
31
|
+
promptTokens: number;
|
|
32
|
+
completionTokens: number;
|
|
33
|
+
executionStartedAt: number;
|
|
34
|
+
}
|
|
35
|
+
/** options required to execute a model invocation in the pipeline. */
|
|
36
|
+
export interface ModelRunInput {
|
|
37
|
+
apiKey: string;
|
|
38
|
+
baseUrl: string;
|
|
39
|
+
model: string;
|
|
40
|
+
searchConfig: SearchConfig;
|
|
41
|
+
systemPrompt: string;
|
|
42
|
+
userPrompt: string;
|
|
43
|
+
maxToolCalls?: number;
|
|
44
|
+
allowTools?: boolean;
|
|
45
|
+
temperature?: number;
|
|
46
|
+
onExecutionStart?: (timestamp: number) => void;
|
|
47
|
+
}
|
|
48
|
+
/** strip tool-call wrapper tags from model output before presentation. */
|
|
49
|
+
export declare function cleanModelOutput(text: string): string;
|
|
50
|
+
/** run a model turn with optional search/tool calling and return normalized artifacts. */
|
|
51
|
+
export declare function runModelWithOptionalTools(input: ModelRunInput): Promise<ModelRunResult>;
|
|
52
|
+
/** run a model turn with tool support explicitly enabled. */
|
|
53
|
+
export declare function runModelWithTools(input: ModelRunInput): Promise<ModelRunResult>;
|
|
54
|
+
/** clip tool-call result text to avoid runaway token usage in context. */
|
|
55
|
+
export declare function cleanSearchResultOutput(resultText: string, maxChars?: number): string;
|
|
56
|
+
export {};
|
|
57
|
+
//# sourceMappingURL=model.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../src/engine/model.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAIhD,KAAK,kBAAkB,GAAG;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE;QACT,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,MAAM,CAAC;KAClB,CAAC;CACF,CAAC;AACF,KAAK,iBAAiB,GACnB;IACA,IAAI,EAAE,QAAQ,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACf,GACD;IACA,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACf,GACD;IACA,IAAI,EAAE,WAAW,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,kBAAkB,EAAE,CAAC;CACjC,GACD;IACA,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;CACpB,CAAC;AAEL,2EAA2E;AAC3E,MAAM,WAAW,cAAc;IAC9B,kDAAkD;IAClD,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAC9B,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,kBAAkB,EAAE,MAAM,CAAC;CAC3B;AAED,sEAAsE;AACtE,MAAM,WAAW,aAAa;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,YAAY,CAAC;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;CAC/C;AA2bD,0EAA0E;AAC1E,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CASrD;AAED,0FAA0F;AAC1F,wBAAsB,yBAAyB,CAC9C,KAAK,EAAE,aAAa,GAClB,OAAO,CAAC,cAAc,CAAC,CAwLzB;AAED,6DAA6D;AAC7D,wBAAsB,iBAAiB,CACtC,KAAK,EAAE,aAAa,GAClB,OAAO,CAAC,cAAc,CAAC,CAEzB;AAED,0EAA0E;AAC1E,wBAAgB,uBAAuB,CACtC,UAAU,EAAE,MAAM,EAClB,QAAQ,SAAwB,GAC9B,MAAM,CAIR"}
|