@bluecopa/harness 0.1.0-snapshot.25 → 0.1.0-snapshot.27

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.25",
3
+ "version": "0.1.0-snapshot.27",
4
4
  "description": "Provider-agnostic TypeScript agent framework",
5
5
  "license": "UNLICENSED",
6
6
  "scripts": {
@@ -422,9 +422,10 @@ export class ArcLoop {
422
422
  this.trace({ type: 'turn_end', turn });
423
423
  yield { type: 'turn_end', turn };
424
424
 
425
- // Wait for at least one process to reach a terminal state.
426
- // We poll process.status (set directly by createProcess's floating promise)
427
- // rather than consuming the outbox (which listenToProcess already reads).
425
+ // Wait for all processes dispatched this turn to reach a terminal state.
426
+ // When the orchestrator dispatches N parallel threads, there's no useful
427
+ // work it can do with partial results giving it a turn early just wastes
428
+ // an LLM call on empty Check loops.
428
429
  const active = [...this.processes.values()].filter(
429
430
  p => p.status === 'running' || p.status === 'pending',
430
431
  );
@@ -432,7 +433,7 @@ export class ArcLoop {
432
433
  const deadline = Date.now() + (this.config.processTimeout ?? 120_000);
433
434
  await new Promise<void>(resolve => {
434
435
  const check = () => {
435
- if (active.some(p => p.status !== 'running' && p.status !== 'pending') || Date.now() > deadline) {
436
+ if (active.every(p => p.status !== 'running' && p.status !== 'pending') || Date.now() > deadline) {
436
437
  resolve();
437
438
  } else {
438
439
  setTimeout(check, 10);
package/src/arc/tools.ts CHANGED
@@ -11,7 +11,7 @@ export const Thread = tool({
11
11
  model: z.enum(['fast', 'medium', 'strong']).optional().describe('Model tier (default: medium)'),
12
12
  maxSteps: z.number().optional().describe('Max tool-call steps'),
13
13
  label: z.string().optional().describe('Human-readable label'),
14
- profile: z.string().optional().describe('Named process profile (e.g. "researcher", "builder")'),
14
+ profile: z.string().optional().describe('Named process profile (e.g. "readonly", "generalist")'),
15
15
  }),
16
16
  });
17
17