@bluecopa/harness 0.1.0-snapshot.99 → 1.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.
Files changed (87) hide show
  1. package/AGENTS.md +18 -0
  2. package/README.md +117 -212
  3. package/docs/guides/observability.md +32 -0
  4. package/docs/guides/providers.md +51 -0
  5. package/docs/guides/skills.md +25 -0
  6. package/docs/security/skill-sandbox-threat-model.md +20 -0
  7. package/package.json +1 -29
  8. package/src/agent/create-agent.ts +884 -0
  9. package/src/agent/create-tools.ts +33 -0
  10. package/src/agent/step-executor.ts +15 -0
  11. package/src/agent/types.ts +57 -0
  12. package/src/context/llm-compaction-strategy.ts +37 -0
  13. package/src/context/prepare-step.ts +65 -0
  14. package/src/context/token-tracker.ts +26 -0
  15. package/src/extracted/manifest.json +10 -0
  16. package/src/extracted/prompts/compaction.md +5 -0
  17. package/src/extracted/prompts/system.md +5 -0
  18. package/src/extracted/tools.json +82 -0
  19. package/src/hooks/hook-runner.ts +22 -0
  20. package/src/hooks/tool-wrappers.ts +64 -0
  21. package/src/interfaces/compaction-strategy.ts +18 -0
  22. package/src/interfaces/hooks.ts +24 -0
  23. package/src/interfaces/sandbox-provider.ts +29 -0
  24. package/src/interfaces/session-store.ts +48 -0
  25. package/src/interfaces/tool-provider.ts +70 -0
  26. package/src/loop/bridge.ts +363 -0
  27. package/src/loop/context-store.ts +207 -0
  28. package/src/loop/lcm-tool-loop.ts +163 -0
  29. package/src/loop/vercel-agent-loop.ts +279 -0
  30. package/src/observability/context.ts +17 -0
  31. package/src/observability/metrics.ts +27 -0
  32. package/src/observability/otel.ts +105 -0
  33. package/src/observability/tracing.ts +13 -0
  34. package/src/optimization/agent-evaluator.ts +40 -0
  35. package/src/optimization/config-serializer.ts +16 -0
  36. package/src/optimization/optimization-runner.ts +39 -0
  37. package/src/optimization/trace-collector.ts +33 -0
  38. package/src/permissions/permission-manager.ts +34 -0
  39. package/src/providers/composite-tool-provider.ts +72 -0
  40. package/src/providers/control-plane-e2b-executor.ts +218 -0
  41. package/src/providers/e2b-tool-provider.ts +68 -0
  42. package/src/providers/local-tool-provider.ts +190 -0
  43. package/src/providers/skill-sandbox-provider.ts +46 -0
  44. package/src/sessions/file-session-store.ts +61 -0
  45. package/src/sessions/in-memory-session-store.ts +39 -0
  46. package/src/sessions/session-manager.ts +44 -0
  47. package/src/skills/skill-loader.ts +52 -0
  48. package/src/skills/skill-manager.ts +175 -0
  49. package/src/skills/skill-router.ts +99 -0
  50. package/src/skills/skill-types.ts +26 -0
  51. package/src/subagents/subagent-manager.ts +22 -0
  52. package/src/subagents/task-tool.ts +13 -0
  53. package/tests/integration/agent-loop-basic.spec.ts +56 -0
  54. package/tests/integration/agent-skill-default-from-sandbox.spec.ts +66 -0
  55. package/tests/integration/concurrency-single-turn.spec.ts +35 -0
  56. package/tests/integration/otel-metrics-emission.spec.ts +62 -0
  57. package/tests/integration/otel-trace-propagation.spec.ts +48 -0
  58. package/tests/integration/parity-benchmark.spec.ts +45 -0
  59. package/tests/integration/provider-local-smoke.spec.ts +63 -0
  60. package/tests/integration/session-resume.spec.ts +30 -0
  61. package/tests/integration/skill-install-rollback.spec.ts +64 -0
  62. package/tests/integration/skill-sandbox-file-blob.spec.ts +54 -0
  63. package/tests/integration/skills-progressive-disclosure.spec.ts +61 -0
  64. package/tests/integration/streaming-compaction-boundary.spec.ts +43 -0
  65. package/tests/integration/structured-messages-agent.spec.ts +265 -0
  66. package/tests/integration/subagent-isolation.spec.ts +24 -0
  67. package/tests/security/skill-sandbox-isolation.spec.ts +51 -0
  68. package/tests/unit/create-tools-schema-parity.spec.ts +22 -0
  69. package/tests/unit/extracted-manifest.spec.ts +41 -0
  70. package/tests/unit/interfaces-contract.spec.ts +101 -0
  71. package/tests/unit/structured-messages.spec.ts +176 -0
  72. package/tests/unit/token-tracker.spec.ts +22 -0
  73. package/tsconfig.json +14 -0
  74. package/vitest.config.ts +7 -0
  75. package/dist/arc/app-adapter.d.ts +0 -101
  76. package/dist/arc/app-adapter.js +0 -312
  77. package/dist/arc/app-adapter.js.map +0 -1
  78. package/dist/arc/create-arc-agent.d.ts +0 -50
  79. package/dist/arc/create-arc-agent.js +0 -2926
  80. package/dist/arc/create-arc-agent.js.map +0 -1
  81. package/dist/arc/profile-builder.d.ts +0 -49
  82. package/dist/arc/profile-builder.js +0 -163
  83. package/dist/arc/profile-builder.js.map +0 -1
  84. package/dist/loop/vercel-agent-loop.d.ts +0 -99
  85. package/dist/loop/vercel-agent-loop.js +0 -308
  86. package/dist/loop/vercel-agent-loop.js.map +0 -1
  87. package/dist/types-g-3DvSSE.d.ts +0 -745
@@ -0,0 +1,22 @@
1
+ import { describe, expect, it } from 'vitest';
2
+
3
+ import { TokenTracker } from '../../src/context/token-tracker';
4
+
5
+ describe('token tracker', () => {
6
+ it('uses fallback estimator by default', () => {
7
+ const tracker = new TokenTracker();
8
+ expect(tracker.countText('1234')).toBe(1);
9
+ expect(tracker.countText('12345')).toBe(2);
10
+ });
11
+
12
+ it('supports custom estimator', () => {
13
+ const tracker = new TokenTracker({ estimator: (text) => text.length });
14
+ expect(tracker.countText('abc')).toBe(3);
15
+ expect(
16
+ tracker.countMessages([
17
+ { role: 'user', content: 'hi' },
18
+ { role: 'assistant', content: 'ok' }
19
+ ])
20
+ ).toBe(4);
21
+ });
22
+ });
package/tsconfig.json ADDED
@@ -0,0 +1,14 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2022",
4
+ "module": "ESNext",
5
+ "moduleResolution": "Bundler",
6
+ "strict": true,
7
+ "noUncheckedIndexedAccess": true,
8
+ "exactOptionalPropertyTypes": true,
9
+ "esModuleInterop": true,
10
+ "skipLibCheck": true,
11
+ "types": ["node", "vitest/globals"]
12
+ },
13
+ "include": ["src/**/*.ts", "tests/**/*.ts", "vitest.config.ts"]
14
+ }
@@ -0,0 +1,7 @@
1
+ import { defineConfig } from 'vitest/config';
2
+
3
+ export default defineConfig({
4
+ test: {
5
+ include: ['tests/**/*.spec.ts']
6
+ }
7
+ });
@@ -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 };