@bluecopa/harness 0.1.0-snapshot.91 → 0.1.0-snapshot.92

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.
@@ -1,8 +1,13 @@
1
+ import { S as StepUsage } from '../types-C3Cb6Ixg.js';
2
+
1
3
  type ArcAppProcessMeta = {
2
4
  label?: string;
3
5
  profile?: string;
4
6
  model?: string;
5
7
  dispatchedAt: number;
8
+ status: 'pending' | 'running' | 'completed' | 'failed' | 'cancelled';
9
+ step?: number;
10
+ usage?: StepUsage;
6
11
  };
7
12
  type ArcAppBackgroundTurn = {
8
13
  id: string;
@@ -22,12 +27,18 @@ type ArcAdapterInputEvent = {
22
27
  label?: string;
23
28
  profile?: string;
24
29
  model?: string;
30
+ step?: number;
31
+ usage?: StepUsage;
25
32
  summary?: string;
26
33
  error?: string;
27
34
  };
28
35
  type ArcAppEvent = {
29
36
  type: 'state_changed';
30
37
  state: ArcAppState;
38
+ } | {
39
+ type: 'process_progress';
40
+ id: string;
41
+ meta: ArcAppProcessMeta;
31
42
  } | {
32
43
  type: 'process_summary';
33
44
  id: string;
@@ -91,12 +91,50 @@ var ArcAppAdapter = class {
91
91
  label: event.label,
92
92
  profile: event.profile,
93
93
  model: event.model,
94
- dispatchedAt: this.state.processes[event.id]?.dispatchedAt ?? Date.now()
94
+ dispatchedAt: this.state.processes[event.id]?.dispatchedAt ?? Date.now(),
95
+ status: "pending"
96
+ });
97
+ this.emit({ type: "state_changed", state: this.getState() });
98
+ return;
99
+ case "process_step_start":
100
+ if (!event.id || !this.state.processes[event.id]) return;
101
+ this.state.processes[event.id] = withDefined({
102
+ ...this.state.processes[event.id],
103
+ status: "running",
104
+ step: event.step
105
+ });
106
+ const startedMeta = this.state.processes[event.id];
107
+ this.emit({
108
+ type: "process_progress",
109
+ id: event.id,
110
+ meta: startedMeta
111
+ });
112
+ this.emit({ type: "state_changed", state: this.getState() });
113
+ return;
114
+ case "process_step_end":
115
+ if (!event.id || !this.state.processes[event.id]) return;
116
+ this.state.processes[event.id] = withDefined({
117
+ ...this.state.processes[event.id],
118
+ status: "running",
119
+ step: event.step,
120
+ usage: event.usage
121
+ });
122
+ const steppedMeta = this.state.processes[event.id];
123
+ this.emit({
124
+ type: "process_progress",
125
+ id: event.id,
126
+ meta: steppedMeta
95
127
  });
96
128
  this.emit({ type: "state_changed", state: this.getState() });
97
129
  return;
98
130
  case "process_completed":
99
131
  if (!event.id) return;
132
+ if (this.state.processes[event.id]) {
133
+ this.state.processes[event.id] = withDefined({
134
+ ...this.state.processes[event.id],
135
+ status: "completed"
136
+ });
137
+ }
100
138
  this.emit(withDefined({
101
139
  type: "process_summary",
102
140
  id: event.id,
@@ -114,6 +152,12 @@ var ArcAppAdapter = class {
114
152
  error: event.error ?? "unknown error"
115
153
  }));
116
154
  if (event.id) {
155
+ if (this.state.processes[event.id]) {
156
+ this.state.processes[event.id] = withDefined({
157
+ ...this.state.processes[event.id],
158
+ status: event.error === "cancelled" ? "cancelled" : "failed"
159
+ });
160
+ }
117
161
  delete this.state.processes[event.id];
118
162
  delete this.state.backgroundTurns[event.id];
119
163
  this.emit({ type: "state_changed", state: this.getState() });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/arc/app-adapter.ts"],"names":[],"mappings":"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","file":"app-adapter.js","sourcesContent":["export type ArcAppProcessMeta = {\n label?: string;\n profile?: string;\n model?: string;\n dispatchedAt: number;\n};\n\nexport type ArcAppBackgroundTurn = {\n id: string;\n label?: string;\n profile?: string;\n model?: string;\n dispatchedAt: number;\n};\n\nexport type ArcAppState = {\n activeTurnId: string | null;\n processes: Record<string, ArcAppProcessMeta>;\n backgroundTurns: Record<string, ArcAppBackgroundTurn>;\n};\n\nexport type ArcAdapterInputEvent = {\n type: string;\n id?: string;\n label?: string;\n profile?: string;\n model?: string;\n summary?: string;\n error?: string;\n};\n\nexport type ArcAppEvent =\n | { type: 'state_changed'; state: ArcAppState }\n | { type: 'process_summary'; id: string; meta?: ArcAppProcessMeta; summary: string }\n | { type: 'process_failed'; id?: string; error: string };\n\ntype Listener = (event: ArcAppEvent) => void;\n\nfunction cloneState(state: ArcAppState): ArcAppState {\n return {\n activeTurnId: state.activeTurnId,\n processes: { ...state.processes },\n backgroundTurns: { ...state.backgroundTurns },\n };\n}\n\nfunction withDefined<T extends Record<string, unknown>>(value: T): T {\n return Object.fromEntries(\n Object.entries(value).filter(([, entry]) => entry !== undefined),\n ) as T;\n}\n\nfunction cleanProcessSummary(summary: string): string {\n const lines = summary\n .split('\\n')\n .map((line) => line.trim())\n .filter(Boolean);\n\n const resultLine = lines.find((line) => /^result\\s*:/i.test(line));\n if (resultLine) {\n return resultLine.replace(/^result\\s*:\\s*/i, '').trim();\n }\n\n const firstUsefulLine = lines.find((line) => !/^(action|status|steps|tools used|files read|files modified)\\s*:/i.test(line));\n if (firstUsefulLine) {\n return firstUsefulLine;\n }\n\n return summary\n .replace(/^(action|summary|result)\\s*:\\s*/i, '')\n .trim();\n}\n\nexport function createInitialArcAppState(): ArcAppState {\n return {\n activeTurnId: null,\n processes: {},\n backgroundTurns: {},\n };\n}\n\nexport class ArcAppAdapter {\n private state: ArcAppState;\n\n private listeners = new Set<Listener>();\n\n constructor(initialState: ArcAppState = createInitialArcAppState()) {\n this.state = cloneState(initialState);\n }\n\n subscribe(listener: Listener): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n getState(): ArcAppState {\n return cloneState(this.state);\n }\n\n reset(): void {\n this.state = createInitialArcAppState();\n this.emit({ type: 'state_changed', state: this.getState() });\n }\n\n beginTurn(turnId: string): void {\n if (this.state.activeTurnId === turnId) return;\n this.state.activeTurnId = turnId;\n this.emit({ type: 'state_changed', state: this.getState() });\n }\n\n finishTurn(turnId: string): void {\n let changed = false;\n if (this.state.activeTurnId === turnId) {\n this.state.activeTurnId = null;\n changed = true;\n }\n if (this.state.backgroundTurns[turnId]) {\n delete this.state.backgroundTurns[turnId];\n changed = true;\n }\n if (changed) {\n this.emit({ type: 'state_changed', state: this.getState() });\n }\n }\n\n backgroundTurn(turnId: string, meta: { label?: string; profile?: string; model?: string }): boolean {\n if (this.state.activeTurnId !== turnId) {\n return false;\n }\n\n this.state.activeTurnId = null;\n this.state.backgroundTurns[turnId] = withDefined({\n id: turnId,\n label: meta.label,\n profile: meta.profile,\n model: meta.model,\n dispatchedAt: Date.now(),\n }) as ArcAppBackgroundTurn;\n this.emit({ type: 'state_changed', state: this.getState() });\n return true;\n }\n\n handleArcEvent(event: ArcAdapterInputEvent): void {\n switch (event.type) {\n case 'process_dispatched':\n if (!event.id) return;\n this.state.processes[event.id] = withDefined({\n label: event.label,\n profile: event.profile,\n model: event.model,\n dispatchedAt: this.state.processes[event.id]?.dispatchedAt ?? Date.now(),\n }) as ArcAppProcessMeta;\n this.emit({ type: 'state_changed', state: this.getState() });\n return;\n case 'process_completed':\n if (!event.id) return;\n this.emit(withDefined({\n type: 'process_summary',\n id: event.id,\n meta: this.state.processes[event.id],\n summary: cleanProcessSummary(event.summary ?? ''),\n }) as ArcAppEvent);\n delete this.state.processes[event.id];\n delete this.state.backgroundTurns[event.id];\n this.emit({ type: 'state_changed', state: this.getState() });\n return;\n case 'process_failed':\n this.emit(withDefined({\n type: 'process_failed',\n id: event.id,\n error: event.error ?? 'unknown error',\n }) as ArcAppEvent);\n if (event.id) {\n delete this.state.processes[event.id];\n delete this.state.backgroundTurns[event.id];\n this.emit({ type: 'state_changed', state: this.getState() });\n }\n return;\n default:\n return;\n }\n }\n\n private emit(event: ArcAppEvent): void {\n for (const listener of this.listeners) {\n listener(event);\n }\n }\n}\n"]}
1
+ {"version":3,"sources":["../../src/arc/app-adapter.ts"],"names":[],"mappings":"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","file":"app-adapter.js","sourcesContent":["import type { StepUsage } from '../agent/types';\n\nexport type ArcAppProcessMeta = {\n label?: string;\n profile?: string;\n model?: string;\n dispatchedAt: number;\n status: 'pending' | 'running' | 'completed' | 'failed' | 'cancelled';\n step?: number;\n usage?: StepUsage;\n};\n\nexport type ArcAppBackgroundTurn = {\n id: string;\n label?: string;\n profile?: string;\n model?: string;\n dispatchedAt: number;\n};\n\nexport type ArcAppState = {\n activeTurnId: string | null;\n processes: Record<string, ArcAppProcessMeta>;\n backgroundTurns: Record<string, ArcAppBackgroundTurn>;\n};\n\nexport type ArcAdapterInputEvent = {\n type: string;\n id?: string;\n label?: string;\n profile?: string;\n model?: string;\n step?: number;\n usage?: StepUsage;\n summary?: string;\n error?: string;\n};\n\nexport type ArcAppEvent =\n | { type: 'state_changed'; state: ArcAppState }\n | { type: 'process_progress'; id: string; meta: ArcAppProcessMeta }\n | { type: 'process_summary'; id: string; meta?: ArcAppProcessMeta; summary: string }\n | { type: 'process_failed'; id?: string; error: string };\n\ntype Listener = (event: ArcAppEvent) => void;\n\nfunction cloneState(state: ArcAppState): ArcAppState {\n return {\n activeTurnId: state.activeTurnId,\n processes: { ...state.processes },\n backgroundTurns: { ...state.backgroundTurns },\n };\n}\n\nfunction withDefined<T extends Record<string, unknown>>(value: T): T {\n return Object.fromEntries(\n Object.entries(value).filter(([, entry]) => entry !== undefined),\n ) as T;\n}\n\nfunction cleanProcessSummary(summary: string): string {\n const lines = summary\n .split('\\n')\n .map((line) => line.trim())\n .filter(Boolean);\n\n const resultLine = lines.find((line) => /^result\\s*:/i.test(line));\n if (resultLine) {\n return resultLine.replace(/^result\\s*:\\s*/i, '').trim();\n }\n\n const firstUsefulLine = lines.find((line) => !/^(action|status|steps|tools used|files read|files modified)\\s*:/i.test(line));\n if (firstUsefulLine) {\n return firstUsefulLine;\n }\n\n return summary\n .replace(/^(action|summary|result)\\s*:\\s*/i, '')\n .trim();\n}\n\nexport function createInitialArcAppState(): ArcAppState {\n return {\n activeTurnId: null,\n processes: {},\n backgroundTurns: {},\n };\n}\n\nexport class ArcAppAdapter {\n private state: ArcAppState;\n\n private listeners = new Set<Listener>();\n\n constructor(initialState: ArcAppState = createInitialArcAppState()) {\n this.state = cloneState(initialState);\n }\n\n subscribe(listener: Listener): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n getState(): ArcAppState {\n return cloneState(this.state);\n }\n\n reset(): void {\n this.state = createInitialArcAppState();\n this.emit({ type: 'state_changed', state: this.getState() });\n }\n\n beginTurn(turnId: string): void {\n if (this.state.activeTurnId === turnId) return;\n this.state.activeTurnId = turnId;\n this.emit({ type: 'state_changed', state: this.getState() });\n }\n\n finishTurn(turnId: string): void {\n let changed = false;\n if (this.state.activeTurnId === turnId) {\n this.state.activeTurnId = null;\n changed = true;\n }\n if (this.state.backgroundTurns[turnId]) {\n delete this.state.backgroundTurns[turnId];\n changed = true;\n }\n if (changed) {\n this.emit({ type: 'state_changed', state: this.getState() });\n }\n }\n\n backgroundTurn(turnId: string, meta: { label?: string; profile?: string; model?: string }): boolean {\n if (this.state.activeTurnId !== turnId) {\n return false;\n }\n\n this.state.activeTurnId = null;\n this.state.backgroundTurns[turnId] = withDefined({\n id: turnId,\n label: meta.label,\n profile: meta.profile,\n model: meta.model,\n dispatchedAt: Date.now(),\n }) as ArcAppBackgroundTurn;\n this.emit({ type: 'state_changed', state: this.getState() });\n return true;\n }\n\n handleArcEvent(event: ArcAdapterInputEvent): void {\n switch (event.type) {\n case 'process_dispatched':\n if (!event.id) return;\n this.state.processes[event.id] = withDefined({\n label: event.label,\n profile: event.profile,\n model: event.model,\n dispatchedAt: this.state.processes[event.id]?.dispatchedAt ?? Date.now(),\n status: 'pending',\n }) as ArcAppProcessMeta;\n this.emit({ type: 'state_changed', state: this.getState() });\n return;\n case 'process_step_start':\n if (!event.id || !this.state.processes[event.id]) return;\n this.state.processes[event.id] = withDefined({\n ...this.state.processes[event.id],\n status: 'running',\n step: event.step,\n }) as ArcAppProcessMeta;\n const startedMeta = this.state.processes[event.id]!;\n this.emit({\n type: 'process_progress',\n id: event.id,\n meta: startedMeta,\n });\n this.emit({ type: 'state_changed', state: this.getState() });\n return;\n case 'process_step_end':\n if (!event.id || !this.state.processes[event.id]) return;\n this.state.processes[event.id] = withDefined({\n ...this.state.processes[event.id],\n status: 'running',\n step: event.step,\n usage: event.usage,\n }) as ArcAppProcessMeta;\n const steppedMeta = this.state.processes[event.id]!;\n this.emit({\n type: 'process_progress',\n id: event.id,\n meta: steppedMeta,\n });\n this.emit({ type: 'state_changed', state: this.getState() });\n return;\n case 'process_completed':\n if (!event.id) return;\n if (this.state.processes[event.id]) {\n this.state.processes[event.id] = withDefined({\n ...this.state.processes[event.id],\n status: 'completed',\n }) as ArcAppProcessMeta;\n }\n this.emit(withDefined({\n type: 'process_summary',\n id: event.id,\n meta: this.state.processes[event.id],\n summary: cleanProcessSummary(event.summary ?? ''),\n }) as ArcAppEvent);\n delete this.state.processes[event.id];\n delete this.state.backgroundTurns[event.id];\n this.emit({ type: 'state_changed', state: this.getState() });\n return;\n case 'process_failed':\n this.emit(withDefined({\n type: 'process_failed',\n id: event.id,\n error: event.error ?? 'unknown error',\n }) as ArcAppEvent);\n if (event.id) {\n if (this.state.processes[event.id]) {\n this.state.processes[event.id] = withDefined({\n ...this.state.processes[event.id],\n status: event.error === 'cancelled' ? 'cancelled' : 'failed',\n }) as ArcAppProcessMeta;\n }\n delete this.state.processes[event.id];\n delete this.state.backgroundTurns[event.id];\n this.emit({ type: 'state_changed', state: this.getState() });\n }\n return;\n default:\n return;\n }\n }\n\n private emit(event: ArcAppEvent): void {\n for (const listener of this.listeners) {\n listener(event);\n }\n }\n}\n"]}
@@ -1,4 +1,5 @@
1
- import { A as ArcLoopConfig, a as AgentMessage, b as ArcEvent, c as ArcRunResult, T as TraceEvent } from '../types-aFHO_5sL.js';
1
+ import { A as AgentMessage } from '../types-C3Cb6Ixg.js';
2
+ import { A as ArcLoopConfig, a as ArcEvent, b as ArcRunResult, T as TraceEvent } from '../types-B8J4gkWv.js';
2
3
  import 'zod';
3
4
  import 'ai';
4
5
 
@@ -1,4 +1,5 @@
1
- import { A as ArcLoopConfig, M as ModelTier, d as Activity, R as RunStats, E as Episode, e as EpisodeTrace, a as AgentMessage } from '../types-aFHO_5sL.js';
1
+ import { A as AgentMessage } from '../types-C3Cb6Ixg.js';
2
+ import { A as ArcLoopConfig, M as ModelTier, c as Activity, R as RunStats, E as Episode, d as EpisodeTrace } from '../types-B8J4gkWv.js';
2
3
  import 'zod';
3
4
  import 'ai';
4
5
 
@@ -1,5 +1,6 @@
1
- import { P as ProfileConfig, f as ProfileDeclaration, g as AnyTool, h as ProcessProfile } from '../types-aFHO_5sL.js';
1
+ import { P as ProfileConfig, e as ProfileDeclaration, f as AnyTool, g as ProcessProfile } from '../types-B8J4gkWv.js';
2
2
  import 'zod';
3
+ import '../types-C3Cb6Ixg.js';
3
4
  import 'ai';
4
5
 
5
6
  /**
@@ -1,5 +1,6 @@
1
1
  import { Tool } from 'ai';
2
- import { i as AgentLoop, S as StepUsage, j as ModelFactory, k as ToolChoiceConfig, l as PrepareStepContext, m as PrepareStepResult, a as AgentMessage, n as AgentAction, o as AgentStreamEvent } from '../types-aFHO_5sL.js';
2
+ import { h as ModelFactory, i as ToolChoiceConfig } from '../types-B8J4gkWv.js';
3
+ import { a as AgentLoop, S as StepUsage, P as PrepareStepContext, b as PrepareStepResult, A as AgentMessage, c as AgentAction, d as AgentStreamEvent } from '../types-C3Cb6Ixg.js';
3
4
  import 'zod';
4
5
 
5
6
  type AnyTool = Tool<any, any>;
@@ -1,102 +1,7 @@
1
1
  import * as zod from 'zod';
2
+ import { A as AgentMessage, c as AgentAction, T as ToolCallAction, S as StepUsage } from './types-C3Cb6Ixg.js';
2
3
  import { Tool } from 'ai';
3
4
 
4
- interface ToolCallInfo {
5
- toolCallId: string;
6
- toolName: string;
7
- args: Record<string, unknown>;
8
- /** Provider-specific metadata preserved across round-trips (e.g., Gemini thought signatures). */
9
- providerMetadata?: Record<string, unknown>;
10
- }
11
- interface ToolResultInfo {
12
- toolCallId: string;
13
- toolName: string;
14
- result: string;
15
- isError?: boolean;
16
- }
17
- type ContentPart = {
18
- type: 'text';
19
- text: string;
20
- } | {
21
- type: 'image';
22
- image: Buffer | Uint8Array;
23
- mimeType: string;
24
- };
25
- interface AgentMessage {
26
- role: 'system' | 'user' | 'assistant' | 'tool';
27
- content: string | ContentPart[];
28
- toolCalls?: ToolCallInfo[];
29
- toolResults?: ToolResultInfo[];
30
- /** Provider-specific metadata preserved across round-trips (e.g., Gemini thought signatures). */
31
- providerMetadata?: Record<string, unknown>;
32
- }
33
- interface ToolCallAction {
34
- type: 'tool';
35
- name: string;
36
- args: Record<string, unknown>;
37
- toolCallId?: string;
38
- }
39
- interface FinalAction {
40
- type: 'final';
41
- content: string;
42
- }
43
- interface ToolBatchAction {
44
- type: 'tool_batch';
45
- calls: ToolCallAction[];
46
- }
47
- type AgentAction = ToolCallAction | FinalAction | ToolBatchAction;
48
- /** Token usage breakdown for a single LLM step. */
49
- interface StepUsage {
50
- inputTokens?: number;
51
- outputTokens?: number;
52
- cacheReadTokens?: number;
53
- cacheWriteTokens?: number;
54
- reasoningTokens?: number;
55
- }
56
- type AgentStreamEvent = {
57
- type: 'text_delta';
58
- text: string;
59
- } | {
60
- type: 'tool_start';
61
- name: string;
62
- args: Record<string, unknown>;
63
- toolCallId?: string;
64
- } | {
65
- type: 'tool_end';
66
- name: string;
67
- result: {
68
- success: boolean;
69
- output: string;
70
- error?: string;
71
- [key: string]: unknown;
72
- };
73
- } | {
74
- type: 'step_start';
75
- step: number;
76
- } | {
77
- type: 'step_end';
78
- step: number;
79
- usage?: StepUsage;
80
- } | {
81
- type: 'done';
82
- output: string;
83
- steps: number;
84
- };
85
- interface AgentLoop {
86
- nextAction(messages: AgentMessage[]): Promise<AgentAction>;
87
- streamAction?(messages: AgentMessage[]): AsyncIterable<AgentStreamEvent>;
88
- }
89
- /** Context passed to `prepareStep` before each LLM call. */
90
- interface PrepareStepContext {
91
- stepNumber: number;
92
- toolCallHistory: string[];
93
- }
94
- /** Overrides returned by `prepareStep`. All fields optional — omit to keep defaults. */
95
- interface PrepareStepResult {
96
- model?: string;
97
- activeTools?: string[];
98
- }
99
-
100
5
  type PermissionMode = 'allow_all' | 'deny_all' | 'ask';
101
6
  interface PermissionRequest {
102
7
  toolName: string;
@@ -742,4 +647,4 @@ type TraceEventKind = {
742
647
  type: 'done';
743
648
  };
744
649
 
745
- export type { ArcLoopConfig as A, Episode as E, ModelTier as M, ProfileConfig as P, RunStats as R, StepUsage as S, TraceEvent as T, AgentMessage as a, ArcEvent as b, ArcRunResult as c, Activity as d, EpisodeTrace as e, ProfileDeclaration as f, AnyTool as g, ProcessProfile as h, AgentLoop as i, ModelFactory as j, ToolChoiceConfig as k, PrepareStepContext as l, PrepareStepResult as m, AgentAction as n, AgentStreamEvent as o };
650
+ export type { ArcLoopConfig as A, Episode as E, ModelTier as M, ProfileConfig as P, RunStats as R, TraceEvent as T, ArcEvent as a, ArcRunResult as b, Activity as c, EpisodeTrace as d, ProfileDeclaration as e, AnyTool as f, ProcessProfile as g, ModelFactory as h, ToolChoiceConfig as i };
@@ -0,0 +1,97 @@
1
+ interface ToolCallInfo {
2
+ toolCallId: string;
3
+ toolName: string;
4
+ args: Record<string, unknown>;
5
+ /** Provider-specific metadata preserved across round-trips (e.g., Gemini thought signatures). */
6
+ providerMetadata?: Record<string, unknown>;
7
+ }
8
+ interface ToolResultInfo {
9
+ toolCallId: string;
10
+ toolName: string;
11
+ result: string;
12
+ isError?: boolean;
13
+ }
14
+ type ContentPart = {
15
+ type: 'text';
16
+ text: string;
17
+ } | {
18
+ type: 'image';
19
+ image: Buffer | Uint8Array;
20
+ mimeType: string;
21
+ };
22
+ interface AgentMessage {
23
+ role: 'system' | 'user' | 'assistant' | 'tool';
24
+ content: string | ContentPart[];
25
+ toolCalls?: ToolCallInfo[];
26
+ toolResults?: ToolResultInfo[];
27
+ /** Provider-specific metadata preserved across round-trips (e.g., Gemini thought signatures). */
28
+ providerMetadata?: Record<string, unknown>;
29
+ }
30
+ interface ToolCallAction {
31
+ type: 'tool';
32
+ name: string;
33
+ args: Record<string, unknown>;
34
+ toolCallId?: string;
35
+ }
36
+ interface FinalAction {
37
+ type: 'final';
38
+ content: string;
39
+ }
40
+ interface ToolBatchAction {
41
+ type: 'tool_batch';
42
+ calls: ToolCallAction[];
43
+ }
44
+ type AgentAction = ToolCallAction | FinalAction | ToolBatchAction;
45
+ /** Token usage breakdown for a single LLM step. */
46
+ interface StepUsage {
47
+ inputTokens?: number;
48
+ outputTokens?: number;
49
+ cacheReadTokens?: number;
50
+ cacheWriteTokens?: number;
51
+ reasoningTokens?: number;
52
+ }
53
+ type AgentStreamEvent = {
54
+ type: 'text_delta';
55
+ text: string;
56
+ } | {
57
+ type: 'tool_start';
58
+ name: string;
59
+ args: Record<string, unknown>;
60
+ toolCallId?: string;
61
+ } | {
62
+ type: 'tool_end';
63
+ name: string;
64
+ result: {
65
+ success: boolean;
66
+ output: string;
67
+ error?: string;
68
+ [key: string]: unknown;
69
+ };
70
+ } | {
71
+ type: 'step_start';
72
+ step: number;
73
+ } | {
74
+ type: 'step_end';
75
+ step: number;
76
+ usage?: StepUsage;
77
+ } | {
78
+ type: 'done';
79
+ output: string;
80
+ steps: number;
81
+ };
82
+ interface AgentLoop {
83
+ nextAction(messages: AgentMessage[]): Promise<AgentAction>;
84
+ streamAction?(messages: AgentMessage[]): AsyncIterable<AgentStreamEvent>;
85
+ }
86
+ /** Context passed to `prepareStep` before each LLM call. */
87
+ interface PrepareStepContext {
88
+ stepNumber: number;
89
+ toolCallHistory: string[];
90
+ }
91
+ /** Overrides returned by `prepareStep`. All fields optional — omit to keep defaults. */
92
+ interface PrepareStepResult {
93
+ model?: string;
94
+ activeTools?: string[];
95
+ }
96
+
97
+ export type { AgentMessage as A, PrepareStepContext as P, StepUsage as S, ToolCallAction as T, AgentLoop as a, PrepareStepResult as b, AgentAction as c, AgentStreamEvent as d };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bluecopa/harness",
3
- "version": "0.1.0-snapshot.91",
3
+ "version": "0.1.0-snapshot.92",
4
4
  "description": "Provider-agnostic TypeScript agent framework",
5
5
  "license": "UNLICENSED",
6
6
  "type": "module",