@bluecopa/harness 0.1.0-snapshot.99 → 2.0.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bluecopa/harness",
3
- "version": "0.1.0-snapshot.99",
3
+ "version": "2.0.0",
4
4
  "description": "Provider-agnostic TypeScript agent framework",
5
5
  "license": "UNLICENSED",
6
6
  "type": "module",
@@ -9,21 +9,17 @@
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"
12
+ "./arc": {
13
+ "types": "./dist/arc/index.d.ts",
14
+ "import": "./dist/arc/index.js"
15
15
  },
16
- "./arc/create-arc-agent": {
17
- "types": "./dist/arc/create-arc-agent.d.ts",
18
- "import": "./dist/arc/create-arc-agent.js"
16
+ "./skills": {
17
+ "types": "./dist/skills/index.d.ts",
18
+ "import": "./dist/skills/index.js"
19
19
  },
20
- "./arc/profile-builder": {
21
- "types": "./dist/arc/profile-builder.d.ts",
22
- "import": "./dist/arc/profile-builder.js"
23
- },
24
- "./loop/vercel-agent-loop": {
25
- "types": "./dist/loop/vercel-agent-loop.d.ts",
26
- "import": "./dist/loop/vercel-agent-loop.js"
20
+ "./observability": {
21
+ "types": "./dist/observability/otel.d.ts",
22
+ "import": "./dist/observability/otel.js"
27
23
  },
28
24
  "./package.json": "./package.json"
29
25
  },
@@ -47,6 +43,6 @@
47
43
  },
48
44
  "publishConfig": {
49
45
  "registry": "https://registry.npmjs.org/",
50
- "access": "restricted"
46
+ "access": "public"
51
47
  }
52
48
  }
@@ -1,101 +0,0 @@
1
- import { A as ArcEvent, S as StepUsage } from '../types-g-3DvSSE.js';
2
- import 'zod';
3
- import 'ai';
4
-
5
- type ArcAppRunStats = {
6
- tools: number;
7
- commands: number;
8
- reads: number;
9
- searches: number;
10
- fileChanges: number;
11
- failures: number;
12
- inputTokens: number;
13
- outputTokens: number;
14
- };
15
- type ArcAppProcessMeta = {
16
- label?: string;
17
- profile?: string;
18
- model?: string;
19
- dispatchedAt: number;
20
- status: 'pending' | 'running' | 'completed' | 'failed' | 'cancelled';
21
- step?: number;
22
- usage?: StepUsage;
23
- };
24
- type ArcAppBackgroundTurn = {
25
- id: string;
26
- label?: string;
27
- profile?: string;
28
- model?: string;
29
- dispatchedAt: number;
30
- };
31
- type ArcAppState = {
32
- activeTurnId: string | null;
33
- processes: Record<string, ArcAppProcessMeta>;
34
- backgroundTurns: Record<string, ArcAppBackgroundTurn>;
35
- runStats: ArcAppRunStats;
36
- };
37
- type ArcAppObservedActivity = {
38
- phase: 'start' | 'end';
39
- processId?: string;
40
- toolName: string;
41
- args?: Record<string, unknown>;
42
- ok?: boolean;
43
- preview?: string;
44
- command?: string;
45
- path?: string;
46
- };
47
- type ArcAdapterInputEvent = ArcEvent;
48
- type ArcAppEvent = {
49
- type: 'state_changed';
50
- state: ArcAppState;
51
- } | {
52
- type: 'stats_changed';
53
- stats: ArcAppRunStats;
54
- } | {
55
- type: 'activity_observed';
56
- activity: ArcAppObservedActivity;
57
- } | {
58
- type: 'process_progress';
59
- id: string;
60
- meta: ArcAppProcessMeta;
61
- } | {
62
- type: 'process_summary';
63
- id: string;
64
- meta?: ArcAppProcessMeta;
65
- summary: string;
66
- display: string;
67
- } | {
68
- type: 'process_failed';
69
- id?: string;
70
- error: string;
71
- } | {
72
- type: 'assistant_output';
73
- text: string;
74
- };
75
- type Listener = (event: ArcAppEvent) => void;
76
- declare function formatArcAppProcessSummary(summary: string): string;
77
- declare function createEmptyArcAppRunStats(): ArcAppRunStats;
78
- declare function formatArcAppRunStats(stats: ArcAppRunStats): string;
79
- declare function buildArcAppRunSummary(stats: ArcAppRunStats, modelId: string): string | null;
80
- declare function createInitialArcAppState(): ArcAppState;
81
- declare class ArcAppAdapter {
82
- private state;
83
- private listeners;
84
- private bashCommands;
85
- constructor(initialState?: ArcAppState);
86
- subscribe(listener: Listener): () => void;
87
- getState(): ArcAppState;
88
- reset(): void;
89
- beginTurn(turnId: string): void;
90
- finishTurn(turnId: string): void;
91
- backgroundTurn(turnId: string, meta: {
92
- label?: string;
93
- profile?: string;
94
- model?: string;
95
- }): boolean;
96
- handleArcEvent(event: ArcAdapterInputEvent): void;
97
- private emit;
98
- private handleProcessActivity;
99
- }
100
-
101
- export { type ArcAdapterInputEvent, ArcAppAdapter, type ArcAppBackgroundTurn, type ArcAppEvent, type ArcAppObservedActivity, type ArcAppProcessMeta, type ArcAppRunStats, type ArcAppState, buildArcAppRunSummary, createEmptyArcAppRunStats, createInitialArcAppState, formatArcAppProcessSummary, formatArcAppRunStats };
@@ -1,312 +0,0 @@
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
- runStats: { ...state.runStats }
8
- };
9
- }
10
- function withDefined(value) {
11
- return Object.fromEntries(
12
- Object.entries(value).filter(([, entry]) => entry !== void 0)
13
- );
14
- }
15
- function cleanProcessSummary(summary) {
16
- const lines = summary.split("\n").map((line) => line.trim()).filter(Boolean);
17
- const resultLine = lines.find((line) => /^result\s*:/i.test(line));
18
- if (resultLine) {
19
- return resultLine.replace(/^result\s*:\s*/i, "").trim();
20
- }
21
- const firstUsefulLine = lines.find((line) => !/^(action|status|steps|tools used|files read|files modified)\s*:/i.test(line));
22
- if (firstUsefulLine) {
23
- return firstUsefulLine;
24
- }
25
- return summary.replace(/^(action|summary|result)\s*:\s*/i, "").trim();
26
- }
27
- function formatArcAppProcessSummary(summary) {
28
- return cleanProcessSummary(summary);
29
- }
30
- function createEmptyArcAppRunStats() {
31
- return {
32
- tools: 0,
33
- commands: 0,
34
- reads: 0,
35
- searches: 0,
36
- fileChanges: 0,
37
- failures: 0,
38
- inputTokens: 0,
39
- outputTokens: 0
40
- };
41
- }
42
- function formatArcAppRunStats(stats) {
43
- const parts = [
44
- `${stats.tools} tool${stats.tools === 1 ? "" : "s"}`,
45
- stats.commands ? `${stats.commands} command${stats.commands === 1 ? "" : "s"}` : "",
46
- stats.reads ? `${stats.reads} read${stats.reads === 1 ? "" : "s"}` : "",
47
- stats.searches ? `${stats.searches} search${stats.searches === 1 ? "" : "es"}` : "",
48
- stats.fileChanges ? `${stats.fileChanges} file change${stats.fileChanges === 1 ? "" : "s"}` : "",
49
- stats.failures ? `${stats.failures} failure${stats.failures === 1 ? "" : "s"}` : "",
50
- stats.inputTokens ? `${stats.inputTokens} in` : "",
51
- stats.outputTokens ? `${stats.outputTokens} out` : ""
52
- ].filter(Boolean);
53
- return parts.join(" \xB7 ");
54
- }
55
- function buildArcAppRunSummary(stats, modelId) {
56
- if (stats.tools === 0 && stats.failures === 0) {
57
- return null;
58
- }
59
- const parts = [
60
- `model ${modelId}`,
61
- `${stats.tools} tool${stats.tools === 1 ? "" : "s"}`,
62
- stats.commands ? `${stats.commands} command${stats.commands === 1 ? "" : "s"}` : "",
63
- stats.reads ? `${stats.reads} read${stats.reads === 1 ? "" : "s"}` : "",
64
- stats.searches ? `${stats.searches} search${stats.searches === 1 ? "" : "es"}` : "",
65
- stats.fileChanges ? `${stats.fileChanges} file change${stats.fileChanges === 1 ? "" : "s"}` : "",
66
- stats.failures ? `${stats.failures} failure${stats.failures === 1 ? "" : "s"}` : "",
67
- stats.inputTokens ? `${stats.inputTokens} input tokens` : "",
68
- stats.outputTokens ? `${stats.outputTokens} output tokens` : ""
69
- ].filter(Boolean);
70
- return `Run summary
71
-
72
- ${parts.map((part) => `- ${part}`).join("\n")}`;
73
- }
74
- function createInitialArcAppState() {
75
- return {
76
- activeTurnId: null,
77
- processes: {},
78
- backgroundTurns: {},
79
- runStats: createEmptyArcAppRunStats()
80
- };
81
- }
82
- var ArcAppAdapter = class {
83
- state;
84
- listeners = /* @__PURE__ */ new Set();
85
- bashCommands = {};
86
- constructor(initialState = createInitialArcAppState()) {
87
- this.state = cloneState(initialState);
88
- }
89
- subscribe(listener) {
90
- this.listeners.add(listener);
91
- return () => {
92
- this.listeners.delete(listener);
93
- };
94
- }
95
- getState() {
96
- return cloneState(this.state);
97
- }
98
- reset() {
99
- this.state = createInitialArcAppState();
100
- this.bashCommands = {};
101
- this.emit({ type: "state_changed", state: this.getState() });
102
- }
103
- beginTurn(turnId) {
104
- if (this.state.activeTurnId === turnId) return;
105
- this.state.activeTurnId = turnId;
106
- this.emit({ type: "state_changed", state: this.getState() });
107
- }
108
- finishTurn(turnId) {
109
- let changed = false;
110
- if (this.state.activeTurnId === turnId) {
111
- this.state.activeTurnId = null;
112
- changed = true;
113
- }
114
- if (this.state.backgroundTurns[turnId]) {
115
- delete this.state.backgroundTurns[turnId];
116
- changed = true;
117
- }
118
- if (changed) {
119
- this.emit({ type: "state_changed", state: this.getState() });
120
- }
121
- }
122
- backgroundTurn(turnId, meta) {
123
- if (this.state.activeTurnId !== turnId) {
124
- return false;
125
- }
126
- this.state.activeTurnId = null;
127
- this.state.backgroundTurns[turnId] = withDefined({
128
- id: turnId,
129
- label: meta.label,
130
- profile: meta.profile,
131
- model: meta.model,
132
- dispatchedAt: Date.now()
133
- });
134
- this.emit({ type: "state_changed", state: this.getState() });
135
- return true;
136
- }
137
- handleArcEvent(event) {
138
- switch (event.type) {
139
- case "process_dispatched":
140
- this.state.processes[event.id] = withDefined({
141
- label: event.label,
142
- profile: event.profile,
143
- model: event.model,
144
- dispatchedAt: this.state.processes[event.id]?.dispatchedAt ?? Date.now(),
145
- status: "pending"
146
- });
147
- this.emit({ type: "state_changed", state: this.getState() });
148
- return;
149
- case "process_step_start":
150
- if (!this.state.processes[event.id]) return;
151
- this.state.processes[event.id] = withDefined({
152
- ...this.state.processes[event.id],
153
- status: "running",
154
- step: event.step
155
- });
156
- const startedMeta = this.state.processes[event.id];
157
- this.emit({
158
- type: "process_progress",
159
- id: event.id,
160
- meta: startedMeta
161
- });
162
- this.emit({ type: "state_changed", state: this.getState() });
163
- return;
164
- case "process_step_end":
165
- if (!this.state.processes[event.id]) return;
166
- this.state.processes[event.id] = withDefined({
167
- ...this.state.processes[event.id],
168
- status: "running",
169
- step: event.step,
170
- usage: event.usage
171
- });
172
- if (event.usage?.inputTokens != null) {
173
- this.state.runStats.inputTokens = event.usage.inputTokens;
174
- }
175
- if (event.usage?.outputTokens != null) {
176
- this.state.runStats.outputTokens = event.usage.outputTokens;
177
- }
178
- const steppedMeta = this.state.processes[event.id];
179
- this.emit({
180
- type: "process_progress",
181
- id: event.id,
182
- meta: steppedMeta
183
- });
184
- this.emit({ type: "stats_changed", stats: { ...this.state.runStats } });
185
- this.emit({ type: "state_changed", state: this.getState() });
186
- return;
187
- case "process_activity":
188
- this.handleProcessActivity(event);
189
- return;
190
- case "process_completed":
191
- if (this.state.processes[event.id]) {
192
- this.state.processes[event.id] = withDefined({
193
- ...this.state.processes[event.id],
194
- status: "completed"
195
- });
196
- }
197
- const display = formatArcAppProcessSummary(event.summary);
198
- this.emit(withDefined({
199
- type: "process_summary",
200
- id: event.id,
201
- meta: this.state.processes[event.id],
202
- summary: event.summary,
203
- display
204
- }));
205
- delete this.state.processes[event.id];
206
- delete this.state.backgroundTurns[event.id];
207
- this.emit({ type: "state_changed", state: this.getState() });
208
- return;
209
- case "done":
210
- this.emit({
211
- type: "assistant_output",
212
- text: event.output
213
- });
214
- return;
215
- case "process_failed":
216
- this.emit(withDefined({
217
- type: "process_failed",
218
- id: event.id,
219
- error: event.error ?? "unknown error"
220
- }));
221
- this.state.runStats.failures += 1;
222
- this.emit({ type: "stats_changed", stats: { ...this.state.runStats } });
223
- if (event.id) {
224
- if (this.state.processes[event.id]) {
225
- this.state.processes[event.id] = withDefined({
226
- ...this.state.processes[event.id],
227
- status: event.error === "cancelled" ? "cancelled" : "failed"
228
- });
229
- }
230
- delete this.state.processes[event.id];
231
- delete this.state.backgroundTurns[event.id];
232
- this.emit({ type: "state_changed", state: this.getState() });
233
- }
234
- return;
235
- default:
236
- return;
237
- }
238
- }
239
- emit(event) {
240
- for (const listener of this.listeners) {
241
- listener(event);
242
- }
243
- }
244
- handleProcessActivity(event) {
245
- const activity = event.activity;
246
- if (activity.type === "tool_start") {
247
- this.state.runStats.tools += 1;
248
- if (activity.name === "Bash") {
249
- this.state.runStats.commands += 1;
250
- const command = getArgString(activity.args, "command");
251
- if (event.id) {
252
- this.bashCommands[event.id] = command;
253
- }
254
- } else if (activity.name === "Read") {
255
- this.state.runStats.reads += 1;
256
- } else if (activity.name === "Grep" || activity.name === "Glob") {
257
- this.state.runStats.searches += 1;
258
- } else if (activity.name === "Edit" || activity.name === "Write") {
259
- this.state.runStats.fileChanges += 1;
260
- }
261
- this.emit({
262
- type: "activity_observed",
263
- activity: withDefined({
264
- phase: "start",
265
- processId: event.id,
266
- toolName: activity.name,
267
- args: activity.args,
268
- command: activity.name === "Bash" ? getArgString(activity.args, "command") : void 0,
269
- path: activity.name === "Read" || activity.name === "Write" || activity.name === "Edit" ? getArgString(activity.args, "path") : void 0
270
- })
271
- });
272
- this.emit({ type: "stats_changed", stats: { ...this.state.runStats } });
273
- return;
274
- }
275
- if (activity.type === "tool_end") {
276
- if (!activity.ok) {
277
- this.state.runStats.failures += 1;
278
- }
279
- if (activity.name === "Bash") {
280
- const command = event.id ? this.bashCommands[event.id] ?? "" : "";
281
- if (event.id) {
282
- delete this.bashCommands[event.id];
283
- }
284
- this.emit({
285
- type: "activity_observed",
286
- activity: withDefined({
287
- phase: "end",
288
- processId: event.id,
289
- toolName: activity.name,
290
- ok: activity.ok,
291
- preview: activity.preview ?? "",
292
- command
293
- })
294
- });
295
- }
296
- this.emit({ type: "stats_changed", stats: { ...this.state.runStats } });
297
- }
298
- }
299
- };
300
- function getArgString(args, ...keys) {
301
- for (const key of keys) {
302
- const value = args?.[key];
303
- if (typeof value === "string") {
304
- return value;
305
- }
306
- }
307
- return "";
308
- }
309
-
310
- export { ArcAppAdapter, buildArcAppRunSummary, createEmptyArcAppRunStats, createInitialArcAppState, formatArcAppProcessSummary, formatArcAppRunStats };
311
- //# sourceMappingURL=app-adapter.js.map
312
- //# sourceMappingURL=app-adapter.js.map
@@ -1 +0,0 @@
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';\nimport type { ArcEvent } from './types';\n\nexport type ArcAppRunStats = {\n tools: number;\n commands: number;\n reads: number;\n searches: number;\n fileChanges: number;\n failures: number;\n inputTokens: number;\n outputTokens: number;\n};\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 runStats: ArcAppRunStats;\n};\n\nexport type ArcAppObservedActivity = {\n phase: 'start' | 'end';\n processId?: string;\n toolName: string;\n args?: Record<string, unknown>;\n ok?: boolean;\n preview?: string;\n command?: string;\n path?: string;\n};\n\nexport type ArcAdapterInputEvent = ArcEvent;\n\nexport type ArcAppEvent =\n | { type: 'state_changed'; state: ArcAppState }\n | { type: 'stats_changed'; stats: ArcAppRunStats }\n | { type: 'activity_observed'; activity: ArcAppObservedActivity }\n | { type: 'process_progress'; id: string; meta: ArcAppProcessMeta }\n | { type: 'process_summary'; id: string; meta?: ArcAppProcessMeta; summary: string; display: string }\n | { type: 'process_failed'; id?: string; error: string }\n | { type: 'assistant_output'; text: 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 runStats: { ...state.runStats },\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 formatArcAppProcessSummary(summary: string): string {\n return cleanProcessSummary(summary);\n}\n\nexport function createEmptyArcAppRunStats(): ArcAppRunStats {\n return {\n tools: 0,\n commands: 0,\n reads: 0,\n searches: 0,\n fileChanges: 0,\n failures: 0,\n inputTokens: 0,\n outputTokens: 0,\n };\n}\n\nexport function formatArcAppRunStats(stats: ArcAppRunStats): string {\n const parts = [\n `${stats.tools} tool${stats.tools === 1 ? '' : 's'}`,\n stats.commands ? `${stats.commands} command${stats.commands === 1 ? '' : 's'}` : '',\n stats.reads ? `${stats.reads} read${stats.reads === 1 ? '' : 's'}` : '',\n stats.searches ? `${stats.searches} search${stats.searches === 1 ? '' : 'es'}` : '',\n stats.fileChanges ? `${stats.fileChanges} file change${stats.fileChanges === 1 ? '' : 's'}` : '',\n stats.failures ? `${stats.failures} failure${stats.failures === 1 ? '' : 's'}` : '',\n stats.inputTokens ? `${stats.inputTokens} in` : '',\n stats.outputTokens ? `${stats.outputTokens} out` : '',\n ].filter(Boolean);\n return parts.join(' · ');\n}\n\nexport function buildArcAppRunSummary(stats: ArcAppRunStats, modelId: string): string | null {\n if (stats.tools === 0 && stats.failures === 0) {\n return null;\n }\n const parts = [\n `model ${modelId}`,\n `${stats.tools} tool${stats.tools === 1 ? '' : 's'}`,\n stats.commands ? `${stats.commands} command${stats.commands === 1 ? '' : 's'}` : '',\n stats.reads ? `${stats.reads} read${stats.reads === 1 ? '' : 's'}` : '',\n stats.searches ? `${stats.searches} search${stats.searches === 1 ? '' : 'es'}` : '',\n stats.fileChanges ? `${stats.fileChanges} file change${stats.fileChanges === 1 ? '' : 's'}` : '',\n stats.failures ? `${stats.failures} failure${stats.failures === 1 ? '' : 's'}` : '',\n stats.inputTokens ? `${stats.inputTokens} input tokens` : '',\n stats.outputTokens ? `${stats.outputTokens} output tokens` : '',\n ].filter(Boolean);\n return `Run summary\\n\\n${parts.map((part) => `- ${part}`).join('\\n')}`;\n}\n\nexport function createInitialArcAppState(): ArcAppState {\n return {\n activeTurnId: null,\n processes: {},\n backgroundTurns: {},\n runStats: createEmptyArcAppRunStats(),\n };\n}\n\nexport class ArcAppAdapter {\n private state: ArcAppState;\n\n private listeners = new Set<Listener>();\n\n private bashCommands: Record<string, string> = {};\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.bashCommands = {};\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 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 (!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 (!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 if (event.usage?.inputTokens != null) {\n this.state.runStats.inputTokens = event.usage.inputTokens;\n }\n if (event.usage?.outputTokens != null) {\n this.state.runStats.outputTokens = event.usage.outputTokens;\n }\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: 'stats_changed', stats: { ...this.state.runStats } });\n this.emit({ type: 'state_changed', state: this.getState() });\n return;\n case 'process_activity':\n this.handleProcessActivity(event);\n return;\n case 'process_completed':\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 const display = formatArcAppProcessSummary(event.summary);\n this.emit(withDefined({\n type: 'process_summary',\n id: event.id,\n meta: this.state.processes[event.id],\n summary: event.summary,\n display,\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 'done':\n this.emit({\n type: 'assistant_output',\n text: event.output,\n });\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 this.state.runStats.failures += 1;\n this.emit({ type: 'stats_changed', stats: { ...this.state.runStats } });\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 private handleProcessActivity(event: Extract<ArcAdapterInputEvent, { type: 'process_activity' }>): void {\n const activity = event.activity;\n\n if (activity.type === 'tool_start') {\n this.state.runStats.tools += 1;\n if (activity.name === 'Bash') {\n this.state.runStats.commands += 1;\n const command = getArgString(activity.args, 'command');\n if (event.id) {\n this.bashCommands[event.id] = command;\n }\n } else if (activity.name === 'Read') {\n this.state.runStats.reads += 1;\n } else if (activity.name === 'Grep' || activity.name === 'Glob') {\n this.state.runStats.searches += 1;\n } else if (activity.name === 'Edit' || activity.name === 'Write') {\n this.state.runStats.fileChanges += 1;\n }\n\n this.emit({\n type: 'activity_observed',\n activity: withDefined({\n phase: 'start',\n processId: event.id,\n toolName: activity.name,\n args: activity.args,\n command: activity.name === 'Bash' ? getArgString(activity.args, 'command') : undefined,\n path: activity.name === 'Read' || activity.name === 'Write' || activity.name === 'Edit'\n ? getArgString(activity.args, 'path')\n : undefined,\n }) as ArcAppObservedActivity,\n });\n this.emit({ type: 'stats_changed', stats: { ...this.state.runStats } });\n return;\n }\n\n if (activity.type === 'tool_end') {\n if (!activity.ok) {\n this.state.runStats.failures += 1;\n }\n\n if (activity.name === 'Bash') {\n const command = event.id ? (this.bashCommands[event.id] ?? '') : '';\n if (event.id) {\n delete this.bashCommands[event.id];\n }\n this.emit({\n type: 'activity_observed',\n activity: withDefined({\n phase: 'end',\n processId: event.id,\n toolName: activity.name,\n ok: activity.ok,\n preview: activity.preview ?? '',\n command,\n }) as ArcAppObservedActivity,\n });\n }\n\n this.emit({ type: 'stats_changed', stats: { ...this.state.runStats } });\n }\n }\n}\n\nfunction getArgString(args: Record<string, unknown> | undefined, ...keys: string[]): string {\n for (const key of keys) {\n const value = args?.[key];\n if (typeof value === 'string') {\n return value;\n }\n }\n return '';\n}\n"]}
@@ -1,50 +0,0 @@
1
- import { a as ArcLoopConfig, b as AgentMessage, A as ArcEvent, c as ArcRunResult, T as TraceEvent } from '../types-g-3DvSSE.js';
2
- import 'zod';
3
- import 'ai';
4
-
5
- declare class ArcLoop {
6
- private readonly config;
7
- private readonly ctx;
8
- private readonly memory;
9
- private readonly modelMap;
10
- private readonly orchestratorModel;
11
- private readonly systemPrompt;
12
- private readonly cachedSystem;
13
- private readonly tools;
14
- private readonly resilience;
15
- private readonly traceWriter;
16
- private readonly skillResolver;
17
- private readonly createModel;
18
- private readonly processManager;
19
- private readonly turnRunner;
20
- private readonly completionPolicy;
21
- /** Cached session memo facts — loaded once at stream start, injected into all threads. */
22
- private cachedSessionMemoFacts;
23
- constructor(config: ArcLoopConfig);
24
- private trace;
25
- stream(userMessages: AgentMessage[], signal: AbortSignal): AsyncGenerator<ArcEvent>;
26
- run(messages: AgentMessage[], signal: AbortSignal): Promise<ArcRunResult>;
27
- }
28
-
29
- interface ArcAgentConfig extends ArcLoopConfig {
30
- /** Run consolidation after task completion (default: true) */
31
- consolidate?: boolean;
32
- /** Automatically detect patterns and promote to long-term memory (default: true) */
33
- autoMemory?: boolean;
34
- /** Trace writer for Stateright verification bridge */
35
- traceWriter?: (event: TraceEvent) => void;
36
- }
37
- /**
38
- * Create an agent powered by the ArcLoop v2 orchestrator.
39
- *
40
- * Returns an object with run() and stream() methods that drive
41
- * the ArcLoop directly. Consolidation runs automatically after
42
- * each run/stream completes.
43
- */
44
- declare function createArcAgent(config: ArcAgentConfig): {
45
- loop: ArcLoop;
46
- run(messages: AgentMessage[], signal?: AbortSignal): Promise<ArcRunResult>;
47
- stream(messages: AgentMessage[], signal?: AbortSignal): AsyncGenerator<ArcEvent>;
48
- };
49
-
50
- export { type ArcAgentConfig, createArcAgent };