@bluecopa/harness 0.1.0-snapshot.90 → 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.
@@ -0,0 +1,72 @@
1
+ import { S as StepUsage } from '../types-C3Cb6Ixg.js';
2
+
3
+ type ArcAppProcessMeta = {
4
+ label?: string;
5
+ profile?: string;
6
+ model?: string;
7
+ dispatchedAt: number;
8
+ status: 'pending' | 'running' | 'completed' | 'failed' | 'cancelled';
9
+ step?: number;
10
+ usage?: StepUsage;
11
+ };
12
+ type ArcAppBackgroundTurn = {
13
+ id: string;
14
+ label?: string;
15
+ profile?: string;
16
+ model?: string;
17
+ dispatchedAt: number;
18
+ };
19
+ type ArcAppState = {
20
+ activeTurnId: string | null;
21
+ processes: Record<string, ArcAppProcessMeta>;
22
+ backgroundTurns: Record<string, ArcAppBackgroundTurn>;
23
+ };
24
+ type ArcAdapterInputEvent = {
25
+ type: string;
26
+ id?: string;
27
+ label?: string;
28
+ profile?: string;
29
+ model?: string;
30
+ step?: number;
31
+ usage?: StepUsage;
32
+ summary?: string;
33
+ error?: string;
34
+ };
35
+ type ArcAppEvent = {
36
+ type: 'state_changed';
37
+ state: ArcAppState;
38
+ } | {
39
+ type: 'process_progress';
40
+ id: string;
41
+ meta: ArcAppProcessMeta;
42
+ } | {
43
+ type: 'process_summary';
44
+ id: string;
45
+ meta?: ArcAppProcessMeta;
46
+ summary: string;
47
+ } | {
48
+ type: 'process_failed';
49
+ id?: string;
50
+ error: string;
51
+ };
52
+ type Listener = (event: ArcAppEvent) => void;
53
+ declare function createInitialArcAppState(): ArcAppState;
54
+ declare class ArcAppAdapter {
55
+ private state;
56
+ private listeners;
57
+ constructor(initialState?: ArcAppState);
58
+ subscribe(listener: Listener): () => void;
59
+ getState(): ArcAppState;
60
+ reset(): void;
61
+ beginTurn(turnId: string): void;
62
+ finishTurn(turnId: string): void;
63
+ backgroundTurn(turnId: string, meta: {
64
+ label?: string;
65
+ profile?: string;
66
+ model?: string;
67
+ }): boolean;
68
+ handleArcEvent(event: ArcAdapterInputEvent): void;
69
+ private emit;
70
+ }
71
+
72
+ export { type ArcAdapterInputEvent, ArcAppAdapter, type ArcAppBackgroundTurn, type ArcAppEvent, type ArcAppProcessMeta, type ArcAppState, createInitialArcAppState };
@@ -0,0 +1,179 @@
1
+ // src/arc/app-adapter.ts
2
+ function cloneState(state) {
3
+ return {
4
+ activeTurnId: state.activeTurnId,
5
+ processes: { ...state.processes },
6
+ backgroundTurns: { ...state.backgroundTurns }
7
+ };
8
+ }
9
+ function withDefined(value) {
10
+ return Object.fromEntries(
11
+ Object.entries(value).filter(([, entry]) => entry !== void 0)
12
+ );
13
+ }
14
+ function cleanProcessSummary(summary) {
15
+ const lines = summary.split("\n").map((line) => line.trim()).filter(Boolean);
16
+ const resultLine = lines.find((line) => /^result\s*:/i.test(line));
17
+ if (resultLine) {
18
+ return resultLine.replace(/^result\s*:\s*/i, "").trim();
19
+ }
20
+ const firstUsefulLine = lines.find((line) => !/^(action|status|steps|tools used|files read|files modified)\s*:/i.test(line));
21
+ if (firstUsefulLine) {
22
+ return firstUsefulLine;
23
+ }
24
+ return summary.replace(/^(action|summary|result)\s*:\s*/i, "").trim();
25
+ }
26
+ function createInitialArcAppState() {
27
+ return {
28
+ activeTurnId: null,
29
+ processes: {},
30
+ backgroundTurns: {}
31
+ };
32
+ }
33
+ var ArcAppAdapter = class {
34
+ state;
35
+ listeners = /* @__PURE__ */ new Set();
36
+ constructor(initialState = createInitialArcAppState()) {
37
+ this.state = cloneState(initialState);
38
+ }
39
+ subscribe(listener) {
40
+ this.listeners.add(listener);
41
+ return () => {
42
+ this.listeners.delete(listener);
43
+ };
44
+ }
45
+ getState() {
46
+ return cloneState(this.state);
47
+ }
48
+ reset() {
49
+ this.state = createInitialArcAppState();
50
+ this.emit({ type: "state_changed", state: this.getState() });
51
+ }
52
+ beginTurn(turnId) {
53
+ if (this.state.activeTurnId === turnId) return;
54
+ this.state.activeTurnId = turnId;
55
+ this.emit({ type: "state_changed", state: this.getState() });
56
+ }
57
+ finishTurn(turnId) {
58
+ let changed = false;
59
+ if (this.state.activeTurnId === turnId) {
60
+ this.state.activeTurnId = null;
61
+ changed = true;
62
+ }
63
+ if (this.state.backgroundTurns[turnId]) {
64
+ delete this.state.backgroundTurns[turnId];
65
+ changed = true;
66
+ }
67
+ if (changed) {
68
+ this.emit({ type: "state_changed", state: this.getState() });
69
+ }
70
+ }
71
+ backgroundTurn(turnId, meta) {
72
+ if (this.state.activeTurnId !== turnId) {
73
+ return false;
74
+ }
75
+ this.state.activeTurnId = null;
76
+ this.state.backgroundTurns[turnId] = withDefined({
77
+ id: turnId,
78
+ label: meta.label,
79
+ profile: meta.profile,
80
+ model: meta.model,
81
+ dispatchedAt: Date.now()
82
+ });
83
+ this.emit({ type: "state_changed", state: this.getState() });
84
+ return true;
85
+ }
86
+ handleArcEvent(event) {
87
+ switch (event.type) {
88
+ case "process_dispatched":
89
+ if (!event.id) return;
90
+ this.state.processes[event.id] = withDefined({
91
+ label: event.label,
92
+ profile: event.profile,
93
+ model: event.model,
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
127
+ });
128
+ this.emit({ type: "state_changed", state: this.getState() });
129
+ return;
130
+ case "process_completed":
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
+ }
138
+ this.emit(withDefined({
139
+ type: "process_summary",
140
+ id: event.id,
141
+ meta: this.state.processes[event.id],
142
+ summary: cleanProcessSummary(event.summary ?? "")
143
+ }));
144
+ delete this.state.processes[event.id];
145
+ delete this.state.backgroundTurns[event.id];
146
+ this.emit({ type: "state_changed", state: this.getState() });
147
+ return;
148
+ case "process_failed":
149
+ this.emit(withDefined({
150
+ type: "process_failed",
151
+ id: event.id,
152
+ error: event.error ?? "unknown error"
153
+ }));
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
+ }
161
+ delete this.state.processes[event.id];
162
+ delete this.state.backgroundTurns[event.id];
163
+ this.emit({ type: "state_changed", state: this.getState() });
164
+ }
165
+ return;
166
+ default:
167
+ return;
168
+ }
169
+ }
170
+ emit(event) {
171
+ for (const listener of this.listeners) {
172
+ listener(event);
173
+ }
174
+ }
175
+ };
176
+
177
+ export { ArcAppAdapter, createInitialArcAppState };
178
+ //# sourceMappingURL=app-adapter.js.map
179
+ //# sourceMappingURL=app-adapter.js.map
@@ -0,0 +1 @@
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.90",
3
+ "version": "0.1.0-snapshot.92",
4
4
  "description": "Provider-agnostic TypeScript agent framework",
5
5
  "license": "UNLICENSED",
6
6
  "type": "module",
@@ -9,6 +9,10 @@
9
9
  "README.md"
10
10
  ],
11
11
  "exports": {
12
+ "./arc/app-adapter": {
13
+ "types": "./dist/arc/app-adapter.d.ts",
14
+ "import": "./dist/arc/app-adapter.js"
15
+ },
12
16
  "./arc/create-arc-agent": {
13
17
  "types": "./dist/arc/create-arc-agent.d.ts",
14
18
  "import": "./dist/arc/create-arc-agent.js"