@anonx3247/universal-agent-harness 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.
Files changed (106) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +265 -0
  3. package/dist/agent-harness.d.ts +3 -0
  4. package/dist/agent-harness.d.ts.map +1 -0
  5. package/dist/agent-harness.js +326 -0
  6. package/dist/agent-harness.js.map +1 -0
  7. package/dist/db/index.d.ts +6 -0
  8. package/dist/db/index.d.ts.map +1 -0
  9. package/dist/db/index.js +11 -0
  10. package/dist/db/index.js.map +1 -0
  11. package/dist/db/schema.d.ts +335 -0
  12. package/dist/db/schema.d.ts.map +1 -0
  13. package/dist/db/schema.js +39 -0
  14. package/dist/db/schema.js.map +1 -0
  15. package/dist/index.d.ts +99 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +156 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/lib/assert.d.ts +2 -0
  20. package/dist/lib/assert.d.ts.map +1 -0
  21. package/dist/lib/assert.js +4 -0
  22. package/dist/lib/assert.js.map +1 -0
  23. package/dist/lib/async.d.ts +18 -0
  24. package/dist/lib/async.d.ts.map +1 -0
  25. package/dist/lib/async.js +41 -0
  26. package/dist/lib/async.js.map +1 -0
  27. package/dist/lib/error.d.ts +47 -0
  28. package/dist/lib/error.d.ts.map +1 -0
  29. package/dist/lib/error.js +101 -0
  30. package/dist/lib/error.js.map +1 -0
  31. package/dist/lib/fs.d.ts +3 -0
  32. package/dist/lib/fs.d.ts.map +1 -0
  33. package/dist/lib/fs.js +17 -0
  34. package/dist/lib/fs.js.map +1 -0
  35. package/dist/lib/mcp-config.d.ts +62 -0
  36. package/dist/lib/mcp-config.d.ts.map +1 -0
  37. package/dist/lib/mcp-config.js +80 -0
  38. package/dist/lib/mcp-config.js.map +1 -0
  39. package/dist/lib/mcp.d.ts +19 -0
  40. package/dist/lib/mcp.d.ts.map +1 -0
  41. package/dist/lib/mcp.js +105 -0
  42. package/dist/lib/mcp.js.map +1 -0
  43. package/dist/lib/prompts.d.ts +5 -0
  44. package/dist/lib/prompts.d.ts.map +1 -0
  45. package/dist/lib/prompts.js +63 -0
  46. package/dist/lib/prompts.js.map +1 -0
  47. package/dist/lib/utils.d.ts +5 -0
  48. package/dist/lib/utils.d.ts.map +1 -0
  49. package/dist/lib/utils.js +13 -0
  50. package/dist/lib/utils.js.map +1 -0
  51. package/dist/models/anthropic.d.ts +20 -0
  52. package/dist/models/anthropic.d.ts.map +1 -0
  53. package/dist/models/anthropic.js +312 -0
  54. package/dist/models/anthropic.js.map +1 -0
  55. package/dist/models/deepseek/index.d.ts +20 -0
  56. package/dist/models/deepseek/index.d.ts.map +1 -0
  57. package/dist/models/deepseek/index.js +210 -0
  58. package/dist/models/deepseek/index.js.map +1 -0
  59. package/dist/models/gemini.d.ts +20 -0
  60. package/dist/models/gemini.d.ts.map +1 -0
  61. package/dist/models/gemini.js +250 -0
  62. package/dist/models/gemini.js.map +1 -0
  63. package/dist/models/index.d.ts +70 -0
  64. package/dist/models/index.d.ts.map +1 -0
  65. package/dist/models/index.js +30 -0
  66. package/dist/models/index.js.map +1 -0
  67. package/dist/models/mistral.d.ts +19 -0
  68. package/dist/models/mistral.d.ts.map +1 -0
  69. package/dist/models/mistral.js +259 -0
  70. package/dist/models/mistral.js.map +1 -0
  71. package/dist/models/moonshotai.d.ts +20 -0
  72. package/dist/models/moonshotai.d.ts.map +1 -0
  73. package/dist/models/moonshotai.js +220 -0
  74. package/dist/models/moonshotai.js.map +1 -0
  75. package/dist/models/openai.d.ts +21 -0
  76. package/dist/models/openai.d.ts.map +1 -0
  77. package/dist/models/openai.js +302 -0
  78. package/dist/models/openai.js.map +1 -0
  79. package/dist/models/provider.d.ts +19 -0
  80. package/dist/models/provider.d.ts.map +1 -0
  81. package/dist/models/provider.js +95 -0
  82. package/dist/models/provider.js.map +1 -0
  83. package/dist/resources/experiment.d.ts +18 -0
  84. package/dist/resources/experiment.d.ts.map +1 -0
  85. package/dist/resources/experiment.js +55 -0
  86. package/dist/resources/experiment.js.map +1 -0
  87. package/dist/resources/messages.d.ts +23 -0
  88. package/dist/resources/messages.d.ts.map +1 -0
  89. package/dist/resources/messages.js +81 -0
  90. package/dist/resources/messages.js.map +1 -0
  91. package/dist/runner/config.d.ts +4 -0
  92. package/dist/runner/config.d.ts.map +1 -0
  93. package/dist/runner/config.js +2 -0
  94. package/dist/runner/config.js.map +1 -0
  95. package/dist/runner/index.d.ts +41 -0
  96. package/dist/runner/index.d.ts.map +1 -0
  97. package/dist/runner/index.js +370 -0
  98. package/dist/runner/index.js.map +1 -0
  99. package/dist/tools/index.d.ts +2 -0
  100. package/dist/tools/index.d.ts.map +1 -0
  101. package/dist/tools/index.js +4 -0
  102. package/dist/tools/index.js.map +1 -0
  103. package/package.json +57 -0
  104. package/profiles/example/prompt.md +54 -0
  105. package/profiles/example/settings.json +11 -0
  106. package/profiles/example/settings.json.example +38 -0
@@ -0,0 +1,95 @@
1
+ import { assertNever } from "@app/lib/assert";
2
+ import { isAnthropicModel, AnthropicLLM } from "./anthropic";
3
+ import { isGeminiModel, GeminiLLM } from "./gemini";
4
+ import { isMistralModel, MistralLLM } from "./mistral";
5
+ import { isMoonshotAIModel, MoonshotAILLM } from "./moonshotai";
6
+ import { isDeepseekModel, DeepseekLLM } from "./deepseek";
7
+ import { isOpenAIModel, OpenAILLM } from "./openai";
8
+ export const MODELS = {
9
+ "claude-opus-4-5": true,
10
+ "claude-sonnet-4-5": true,
11
+ "claude-haiku-4-5": true,
12
+ "gemini-3-pro-preview": true,
13
+ "gemini-2.5-pro": true,
14
+ "gemini-2.5-flash": true,
15
+ "gemini-2.5-flash-lite": true,
16
+ "gpt-5.2-pro": true,
17
+ "gpt-5.2": true,
18
+ "gpt-5.1": true,
19
+ "gpt-5.1-codex": true,
20
+ "gpt-5": true,
21
+ "gpt-5-codex": true,
22
+ "gpt-5-mini": true,
23
+ "gpt-5-nano": true,
24
+ "gpt-4.1": true,
25
+ "devstral-medium-latest": true,
26
+ "mistral-large-latest": true,
27
+ "mistral-small-latest": true,
28
+ "codestral-latest": true,
29
+ "kimi-k2-thinking": true,
30
+ "deepseek-chat": true,
31
+ "deepseek-reasoner": true,
32
+ };
33
+ export function isProvider(str) {
34
+ return [
35
+ "gemini",
36
+ "anthropic",
37
+ "openai",
38
+ "mistral",
39
+ "moonshotai",
40
+ "deepseek",
41
+ ].includes(str);
42
+ }
43
+ export function isModel(model) {
44
+ return (isAnthropicModel(model) ||
45
+ isOpenAIModel(model) ||
46
+ isGeminiModel(model) ||
47
+ isMistralModel(model) ||
48
+ isMoonshotAIModel(model) ||
49
+ isDeepseekModel(model));
50
+ }
51
+ export function providerFromModel(model) {
52
+ if (isOpenAIModel(model))
53
+ return "openai";
54
+ if (isMoonshotAIModel(model))
55
+ return "moonshotai";
56
+ if (isAnthropicModel(model))
57
+ return "anthropic";
58
+ if (isGeminiModel(model))
59
+ return "gemini";
60
+ if (isMistralModel(model))
61
+ return "mistral";
62
+ if (isDeepseekModel(model))
63
+ return "deepseek";
64
+ else
65
+ assertNever(model);
66
+ }
67
+ /**
68
+ * Factory function to create an LLM instance from a model and config.
69
+ * Centralizes the logic for determining which LLM class to instantiate.
70
+ */
71
+ export function createLLM(model, config) {
72
+ config = config ?? {};
73
+ if (isAnthropicModel(model)) {
74
+ return new AnthropicLLM(config, model);
75
+ }
76
+ else if (isGeminiModel(model)) {
77
+ return new GeminiLLM(config, model);
78
+ }
79
+ else if (isOpenAIModel(model)) {
80
+ return new OpenAILLM(config, model);
81
+ }
82
+ else if (isMistralModel(model)) {
83
+ return new MistralLLM(config, model);
84
+ }
85
+ else if (isMoonshotAIModel(model)) {
86
+ return new MoonshotAILLM(config, model);
87
+ }
88
+ else if (isDeepseekModel(model)) {
89
+ return new DeepseekLLM(config, model);
90
+ }
91
+ else {
92
+ assertNever(model);
93
+ }
94
+ }
95
+ //# sourceMappingURL=provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.js","sourceRoot":"","sources":["../../src/models/provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAkB,gBAAgB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC7E,OAAO,EAAe,aAAa,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACjE,OAAO,EAAE,cAAc,EAAgB,UAAU,EAAE,MAAM,WAAW,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAmB,aAAa,EAAE,MAAM,cAAc,CAAC;AACjF,OAAO,EAAE,eAAe,EAAiB,WAAW,EAAE,MAAM,YAAY,CAAC;AACzE,OAAO,EAAE,aAAa,EAAe,SAAS,EAAE,MAAM,UAAU,CAAC;AAWjE,MAAM,CAAC,MAAM,MAAM,GAAwB;IACzC,iBAAiB,EAAE,IAAI;IACvB,mBAAmB,EAAE,IAAI;IACzB,kBAAkB,EAAE,IAAI;IACxB,sBAAsB,EAAE,IAAI;IAC5B,gBAAgB,EAAE,IAAI;IACtB,kBAAkB,EAAE,IAAI;IACxB,uBAAuB,EAAE,IAAI;IAC7B,aAAa,EAAE,IAAI;IACnB,SAAS,EAAE,IAAI;IACf,SAAS,EAAE,IAAI;IACf,eAAe,EAAE,IAAI;IACrB,OAAO,EAAE,IAAI;IACb,aAAa,EAAE,IAAI;IACnB,YAAY,EAAE,IAAI;IAClB,YAAY,EAAE,IAAI;IAClB,SAAS,EAAE,IAAI;IACf,wBAAwB,EAAE,IAAI;IAC9B,sBAAsB,EAAE,IAAI;IAC5B,sBAAsB,EAAE,IAAI;IAC5B,kBAAkB,EAAE,IAAI;IACxB,kBAAkB,EAAE,IAAI;IACxB,eAAe,EAAE,IAAI;IACrB,mBAAmB,EAAE,IAAI;CAC1B,CAAC;AAUF,MAAM,UAAU,UAAU,CAAC,GAAW;IACpC,OAAO;QACL,QAAQ;QACR,WAAW;QACX,QAAQ;QACR,SAAS;QACT,YAAY;QACZ,UAAU;KACX,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,KAAa;IACnC,OAAO,CACL,gBAAgB,CAAC,KAAK,CAAC;QACvB,aAAa,CAAC,KAAK,CAAC;QACpB,aAAa,CAAC,KAAK,CAAC;QACpB,cAAc,CAAC,KAAK,CAAC;QACrB,iBAAiB,CAAC,KAAK,CAAC;QACxB,eAAe,CAAC,KAAK,CAAC,CACvB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,KAMiB;IAEjB,IAAI,aAAa,CAAC,KAAK,CAAC;QAAE,OAAO,QAAQ,CAAC;IAC1C,IAAI,iBAAiB,CAAC,KAAK,CAAC;QAAE,OAAO,YAAY,CAAC;IAClD,IAAI,gBAAgB,CAAC,KAAK,CAAC;QAAE,OAAO,WAAW,CAAC;IAChD,IAAI,aAAa,CAAC,KAAK,CAAC;QAAE,OAAO,QAAQ,CAAC;IAC1C,IAAI,cAAc,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAC5C,IAAI,eAAe,CAAC,KAAK,CAAC;QAAE,OAAO,UAAU,CAAC;;QACzC,WAAW,CAAC,KAAK,CAAC,CAAC;AAC1B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,KAAY,EAAE,MAAoB;IAC1D,MAAM,GAAG,MAAM,IAAI,EAAE,CAAC;IACtB,IAAI,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO,IAAI,YAAY,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACzC,CAAC;SAAM,IAAI,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;QAChC,OAAO,IAAI,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACtC,CAAC;SAAM,IAAI,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;QAChC,OAAO,IAAI,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACtC,CAAC;SAAM,IAAI,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;QACjC,OAAO,IAAI,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACvC,CAAC;SAAM,IAAI,iBAAiB,CAAC,KAAK,CAAC,EAAE,CAAC;QACpC,OAAO,IAAI,aAAa,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAC1C,CAAC;SAAM,IAAI,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC;QAClC,OAAO,IAAI,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACxC,CAAC;SAAM,CAAC;QACN,WAAW,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC;AACH,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { experiments } from "@app/db/schema";
2
+ import { Result } from "@app/lib/error";
3
+ import { InferInsertModel } from "drizzle-orm";
4
+ export declare class ExperimentResource {
5
+ private data;
6
+ private constructor();
7
+ static findByName(name: string): Promise<Result<ExperimentResource>>;
8
+ static findById(id: number): Promise<ExperimentResource | null>;
9
+ static create(data: Omit<InferInsertModel<typeof experiments>, "id" | "created" | "updated">): Promise<ExperimentResource>;
10
+ static all(): Promise<ExperimentResource[]>;
11
+ update(data: Partial<Omit<InferInsertModel<typeof experiments>, "id" | "created">>): Promise<ExperimentResource>;
12
+ delete(): Promise<void>;
13
+ toJSON(): {
14
+ [x: string]: any;
15
+ };
16
+ getAgentIndices(): number[];
17
+ }
18
+ //# sourceMappingURL=experiment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"experiment.d.ts","sourceRoot":"","sources":["../../src/resources/experiment.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAW,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAwB,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAIrE,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,IAAI,CAAa;IAEzB,OAAO;WAIM,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC;WAY7D,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC;WAUxD,MAAM,CACjB,IAAI,EAAE,IAAI,CACR,gBAAgB,CAAC,OAAO,WAAW,CAAC,EACpC,IAAI,GAAG,SAAS,GAAG,SAAS,CAC7B,GACA,OAAO,CAAC,kBAAkB,CAAC;WAKjB,GAAG,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC;IAK3C,MAAM,CACV,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,OAAO,WAAW,CAAC,EAAE,IAAI,GAAG,SAAS,CAAC,CAAC,GAC1E,OAAO,CAAC,kBAAkB,CAAC;IAWxB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAI7B,MAAM;;;IAIN,eAAe,IAAI,MAAM,EAAE;CAG5B"}
@@ -0,0 +1,55 @@
1
+ import { db } from "@app/db";
2
+ import { experiments } from "@app/db/schema";
3
+ import { err, ok } from "@app/lib/error";
4
+ import { eq } from "drizzle-orm";
5
+ export class ExperimentResource {
6
+ data;
7
+ constructor(data) {
8
+ this.data = data;
9
+ }
10
+ static async findByName(name) {
11
+ const result = await db
12
+ .select()
13
+ .from(experiments)
14
+ .where(eq(experiments.name, name))
15
+ .limit(1);
16
+ return result[0]
17
+ ? ok(new ExperimentResource(result[0]))
18
+ : err("not_found_error", `Experiment '${name}' not found.`);
19
+ }
20
+ static async findById(id) {
21
+ const result = await db
22
+ .select()
23
+ .from(experiments)
24
+ .where(eq(experiments.id, id))
25
+ .limit(1);
26
+ return result[0] ? new ExperimentResource(result[0]) : null;
27
+ }
28
+ static async create(data) {
29
+ const [created] = await db.insert(experiments).values(data).returning();
30
+ return new ExperimentResource(created);
31
+ }
32
+ static async all() {
33
+ const results = await db.select().from(experiments);
34
+ return results.map((data) => new ExperimentResource(data));
35
+ }
36
+ async update(data) {
37
+ const [updated] = await db
38
+ .update(experiments)
39
+ .set({ ...data, updated: new Date() })
40
+ .where(eq(experiments.id, this.data.id))
41
+ .returning();
42
+ this.data = updated;
43
+ return this;
44
+ }
45
+ async delete() {
46
+ await db.delete(experiments).where(eq(experiments.id, this.data.id));
47
+ }
48
+ toJSON() {
49
+ return this.data;
50
+ }
51
+ getAgentIndices() {
52
+ return Array.from({ length: this.data.agent_count }, (_, i) => i);
53
+ }
54
+ }
55
+ //# sourceMappingURL=experiment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"experiment.js","sourceRoot":"","sources":["../../src/resources/experiment.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import { Tx } from "@app/db";
2
+ import { ExperimentResource } from "./experiment";
3
+ import { Message } from "@app/models";
4
+ export declare class MessageResource {
5
+ private data;
6
+ experiment: ExperimentResource;
7
+ private constructor();
8
+ static findById(experiment: ExperimentResource, agentIndex: number, id: number): Promise<MessageResource | null>;
9
+ static listMessagesByAgent(experiment: ExperimentResource, agentIndex: number): Promise<MessageResource[]>;
10
+ static listMessagesByExperiment(experiment: ExperimentResource): Promise<MessageResource[]>;
11
+ static create(experiment: ExperimentResource, agentIndex: number, message: Message, positon: number, totalTokens: number, cost: number, options?: {
12
+ tx?: Tx;
13
+ }): Promise<MessageResource>;
14
+ id(): number;
15
+ position(): number;
16
+ created(): Date;
17
+ toJSON(): Message & {
18
+ id: number;
19
+ };
20
+ static totalTokensForExperiment(experiment: ExperimentResource): Promise<number>;
21
+ static totalCostForExperiment(experiment: ExperimentResource): Promise<number>;
22
+ }
23
+ //# sourceMappingURL=messages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../src/resources/messages.ts"],"names":[],"mappings":"AAAA,OAAO,EAAM,EAAE,EAAE,MAAM,SAAS,CAAC;AAGjC,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC,qBAAa,eAAe;IAC1B,OAAO,CAAC,IAAI,CAAoC;IAChD,UAAU,EAAE,kBAAkB,CAAC;IAE/B,OAAO;WAQM,QAAQ,CACnB,UAAU,EAAE,kBAAkB,EAC9B,UAAU,EAAE,MAAM,EAClB,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;WAgBrB,mBAAmB,CAC9B,UAAU,EAAE,kBAAkB,EAC9B,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,eAAe,EAAE,CAAC;WAehB,wBAAwB,CACnC,UAAU,EAAE,kBAAkB,GAC7B,OAAO,CAAC,eAAe,EAAE,CAAC;WAUhB,MAAM,CACjB,UAAU,EAAE,kBAAkB,EAC9B,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE;QAAE,EAAE,CAAC,EAAE,EAAE,CAAA;KAAE,GACpB,OAAO,CAAC,eAAe,CAAC;IAiB3B,EAAE,IAAI,MAAM;IAIZ,QAAQ,IAAI,MAAM;IAIlB,OAAO,IAAI,IAAI;IAIf,MAAM,IAAI,OAAO,GAAG;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE;WAQrB,wBAAwB,CACnC,UAAU,EAAE,kBAAkB,GAC7B,OAAO,CAAC,MAAM,CAAC;WASL,sBAAsB,CACjC,UAAU,EAAE,kBAAkB,GAC7B,OAAO,CAAC,MAAM,CAAC;CAQnB"}
@@ -0,0 +1,81 @@
1
+ import { db } from "@app/db";
2
+ import { messages } from "@app/db/schema";
3
+ import { eq, and, asc, sum } from "drizzle-orm";
4
+ export class MessageResource {
5
+ data;
6
+ experiment;
7
+ constructor(data, experiment) {
8
+ this.data = data;
9
+ this.experiment = experiment;
10
+ }
11
+ static async findById(experiment, agentIndex, id) {
12
+ const result = await db
13
+ .select()
14
+ .from(messages)
15
+ .where(and(eq(messages.experiment, experiment.toJSON().id), eq(messages.agent, agentIndex), eq(messages.id, id)))
16
+ .limit(1);
17
+ return result[0] ? new MessageResource(result[0], experiment) : null;
18
+ }
19
+ static async listMessagesByAgent(experiment, agentIndex) {
20
+ const results = await db
21
+ .select()
22
+ .from(messages)
23
+ .where(and(eq(messages.experiment, experiment.toJSON().id), eq(messages.agent, agentIndex)))
24
+ .orderBy(asc(messages.position));
25
+ return results.map((msg) => new MessageResource(msg, experiment));
26
+ }
27
+ static async listMessagesByExperiment(experiment) {
28
+ const results = await db
29
+ .select()
30
+ .from(messages)
31
+ .where(eq(messages.experiment, experiment.toJSON().id))
32
+ .orderBy(asc(messages.position));
33
+ return results.map((msg) => new MessageResource(msg, experiment));
34
+ }
35
+ static async create(experiment, agentIndex, message, positon, totalTokens, cost, options) {
36
+ const executor = options?.tx ?? db;
37
+ const [created] = await executor
38
+ .insert(messages)
39
+ .values({
40
+ experiment: experiment.toJSON().id,
41
+ agent: agentIndex,
42
+ ...message,
43
+ position: positon,
44
+ total_tokens: totalTokens,
45
+ cost,
46
+ })
47
+ .returning();
48
+ return new MessageResource(created, experiment);
49
+ }
50
+ id() {
51
+ return this.data.id;
52
+ }
53
+ position() {
54
+ return this.data.position;
55
+ }
56
+ created() {
57
+ return new Date(this.data.created);
58
+ }
59
+ toJSON() {
60
+ return {
61
+ id: this.data.id,
62
+ role: this.data.role,
63
+ content: this.data.content,
64
+ };
65
+ }
66
+ static async totalTokensForExperiment(experiment) {
67
+ const results = await db
68
+ .select({ total: sum(messages.total_tokens) })
69
+ .from(messages)
70
+ .where(eq(messages.experiment, experiment.toJSON().id));
71
+ return Number(results[0]?.total ?? 0);
72
+ }
73
+ static async totalCostForExperiment(experiment) {
74
+ const results = await db
75
+ .select({ total: sum(messages.cost) })
76
+ .from(messages)
77
+ .where(eq(messages.experiment, experiment.toJSON().id));
78
+ return Number(results[0]?.total ?? 0);
79
+ }
80
+ }
81
+ //# sourceMappingURL=messages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messages.js","sourceRoot":"","sources":["../../src/resources/messages.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export type RunConfig = {
2
+ thinking: boolean;
3
+ };
4
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/runner/config.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,SAAS,GAAG;IACtB,QAAQ,EAAE,OAAO,CAAC;CACnB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/runner/config.ts"],"names":[],"mappings":""}
@@ -0,0 +1,41 @@
1
+ import { LLM, Message, TextContent, Thinking, Tool, ToolResult, ToolUse } from "@app/models";
2
+ import { ExperimentResource } from "@app/resources/experiment";
3
+ import { Client } from "@modelcontextprotocol/sdk/client/index.js";
4
+ import { Result } from "@app/lib/error";
5
+ import { MessageResource } from "@app/resources/messages";
6
+ import { RunConfig } from "./config";
7
+ export declare class Runner {
8
+ private experiment;
9
+ private agentIndex;
10
+ private mcpClients;
11
+ private model;
12
+ private contextPruning;
13
+ private messages;
14
+ private constructor();
15
+ static builder(experiment: ExperimentResource, agentIndex: number, config: RunConfig): Promise<Result<Runner>>;
16
+ static initialize(experiment: ExperimentResource, agentIndex: number, mcpClients: Client[], model: LLM): Promise<Result<Runner>>;
17
+ tools(): Promise<Result<Tool[]>>;
18
+ executeTool(t: ToolUse): Promise<ToolResult>;
19
+ isNewUserMessageNeeded(): boolean;
20
+ newUserMessage(): Promise<Result<MessageResource>>;
21
+ private isAgentLoopStartMessage;
22
+ private isAgentLoopInnerStartMessage;
23
+ shiftContextPruning(): Result<void>;
24
+ /**
25
+ * Render past agent messages to the model handling truncation to fit the model context window as
26
+ * needed.
27
+ *
28
+ * @param systemPrompt System prompt to use for the model call.
29
+ * @param tools Tools to provide to the model.
30
+ */
31
+ renderForModel(systemPrompt: string, tools: Tool[]): Promise<Result<Message[]>>;
32
+ /**
33
+ * Logs message content during runner execution to display progress.
34
+ */
35
+ logContent(c: TextContent | ToolUse | ToolResult | Thinking, messageId?: number): void;
36
+ /**
37
+ * Advance runer by one tick (one agent call + associated tools executions).
38
+ */
39
+ tick(): Promise<Result<void>>;
40
+ }
41
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/runner/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,GAAG,EACH,OAAO,EACP,WAAW,EACX,QAAQ,EACR,IAAI,EACJ,UAAU,EACV,OAAO,EACR,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAe,MAAM,EAAW,MAAM,gBAAgB,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAO1D,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAcrC,qBAAa,MAAM;IACjB,OAAO,CAAC,UAAU,CAAqB;IACvC,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,UAAU,CAAW;IAC7B,OAAO,CAAC,KAAK,CAAM;IAEnB,OAAO,CAAC,cAAc,CAGpB;IACF,OAAO,CAAC,QAAQ,CAAoB;IAEpC,OAAO;WAkBa,OAAO,CACzB,UAAU,EAAE,kBAAkB,EAC9B,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,SAAS,GAChB,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;WA+CN,UAAU,CAC5B,UAAU,EAAE,kBAAkB,EAC9B,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAAE,EACpB,KAAK,EAAE,GAAG,GACT,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAkBpB,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IAyBhC,WAAW,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC;IAoDlD,sBAAsB,IAAI,OAAO;IAc3B,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;IAiCxD,OAAO,CAAC,uBAAuB;IAO/B,OAAO,CAAC,4BAA4B;IAMpC,mBAAmB,IAAI,MAAM,CAAC,IAAI,CAAC;IAgDnC;;;;;;OAMG;IACG,cAAc,CAClB,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,IAAI,EAAE,GACZ,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;IA2D7B;;OAEG;IACH,UAAU,CACR,CAAC,EAAE,WAAW,GAAG,OAAO,GAAG,UAAU,GAAG,QAAQ,EAChD,SAAS,CAAC,EAAE,MAAM;IA0CpB;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;CAgGpC"}