From 05b0b356883e0843654864bffd1f634efda2c57e Mon Sep 17 00:00:00 2001 From: Khaliq Date: Tue, 14 Jul 2026 10:36:48 +0200 Subject: [PATCH 1/3] chore: consume AgentWorkforce 4.1.16 --- package-lock.json | 196 ++++++++++++++++++++++++++++------------ package.json | 4 +- src/main/broker.test.ts | 77 ++++++++++++++++ src/main/broker.ts | 5 +- 4 files changed, 223 insertions(+), 59 deletions(-) diff --git a/package-lock.json b/package-lock.json index 811cf87b..c672cb1f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,7 +15,7 @@ "@agent-relay/harnesses": "^9.2.1", "@agent-relay/integration-prompts": "^9.2.1", "@agent-relay/sdk": "^9.2.1", - "@agentworkforce/deploy": "^4.0.2", + "@agentworkforce/deploy": "^4.1.16", "@relayburn/sdk": "^4.0.0", "@relaycast/sdk": "^5.0.7", "@relayfile/sdk": "^0.10.15", @@ -25,7 +25,7 @@ "@xterm/addon-webgl": "^0.18.0", "@xterm/xterm": "^5.5.0", "agent-relay": "^9.2.1", - "agentworkforce": "^4.0.2", + "agentworkforce": "^4.1.16", "ai-hist": "^0.2.3", "allotment": "^1.0.9", "electron-updater": "^6.3.9", @@ -326,17 +326,17 @@ } }, "node_modules/@agentworkforce/cli": { - "version": "4.1.14", - "resolved": "https://registry.npmjs.org/@agentworkforce/cli/-/cli-4.1.14.tgz", - "integrity": "sha512-suj2GsiyXJv3EbqzuKwOStF8xqwWOTtMn2aGgQ2W+YtGtmy30rj91bmS1ZI2oeFJxtUUQvK/CSUjAjTeZmOLuw==", + "version": "4.1.16", + "resolved": "https://registry.npmjs.org/@agentworkforce/cli/-/cli-4.1.16.tgz", + "integrity": "sha512-GOeX+k2ivls+/sbb4ns+ilpU6Uz+a3dLTcRLCZbiv2OjvIKxHaZ3sv/P0mhNs2aJG+dwDVC04eFL/XSTAvhCzg==", "dependencies": { "@agent-relay/cloud": "^8.7.0", - "@agentworkforce/deploy": "4.1.14", - "@agentworkforce/persona-kit": "4.1.14", - "@agentworkforce/runtime": "4.1.14", - "@agentworkforce/workload-router": "4.1.14", + "@agentworkforce/deploy": "4.1.16", + "@agentworkforce/persona-kit": "4.1.16", + "@agentworkforce/runtime": "4.1.16", + "@agentworkforce/workload-router": "4.1.16", "@relayburn/sdk": "^2.5.2", - "@relayfile/local-mount": "^0.7.24", + "@relayfile/local-mount": "^0.10.23", "ora": "^9.4.0" } }, @@ -444,13 +444,13 @@ } }, "node_modules/@agentworkforce/deploy": { - "version": "4.1.14", - "resolved": "https://registry.npmjs.org/@agentworkforce/deploy/-/deploy-4.1.14.tgz", - "integrity": "sha512-AABwcqF+r+hpXv0a2MgIPdC1KlkXfUq2dr9R1Y6L92Mt2FSyQu+xUXV4Wmuxe6AezemXllpcnsqYbgKZP9L/xA==", + "version": "4.1.16", + "resolved": "https://registry.npmjs.org/@agentworkforce/deploy/-/deploy-4.1.16.tgz", + "integrity": "sha512-yoOjj/quBCLjX09kBjqYRNM8GE41z4pYlDf2kzQF227cvq/kNIUzHGOzR2YrnoKuNyankUOs7BilS36sSqzaCA==", "dependencies": { "@agent-relay/cloud": "^8.7.0", - "@agentworkforce/persona-kit": "4.1.14", - "@agentworkforce/runtime": "4.1.14", + "@agentworkforce/persona-kit": "4.1.16", + "@agentworkforce/runtime": "4.1.16", "@daytonaio/sdk": "^0.185.0", "esbuild": "^0.25.0" } @@ -479,32 +479,32 @@ } }, "node_modules/@agentworkforce/persona-kit": { - "version": "4.1.14", - "resolved": "https://registry.npmjs.org/@agentworkforce/persona-kit/-/persona-kit-4.1.14.tgz", - "integrity": "sha512-J2BIaHpSXT7dJhq6+3Pq6UpQks4IAtA/tXc10eD7QdAqF4gDS3D7JdZTjRsKZV+rQdLgr1iYvvzjphsPwLDg9w==", + "version": "4.1.16", + "resolved": "https://registry.npmjs.org/@agentworkforce/persona-kit/-/persona-kit-4.1.16.tgz", + "integrity": "sha512-TsvQGhBs9eL6qGzXc5BnQFj5SX2Rp+wMocQJzJYUoDT4L23lLTs+mRuE0iZFsVBldohpJtkZgwPxmiQEbGz1Fw==", "dependencies": { "@relayfile/adapter-core": "^0.3.60", - "@relayfile/local-mount": "^0.7.24" + "@relayfile/local-mount": "^0.10.23" } }, "node_modules/@agentworkforce/runtime": { - "version": "4.1.14", - "resolved": "https://registry.npmjs.org/@agentworkforce/runtime/-/runtime-4.1.14.tgz", - "integrity": "sha512-iY6HpxE2mseZFYDxxlnLNMZHOJoeRbpXZk6/gfn8Qzbxw3v/GE6KeIXOJOY8bk1ZCIgGfWr4OT+I8TWe13TZPQ==", + "version": "4.1.16", + "resolved": "https://registry.npmjs.org/@agentworkforce/runtime/-/runtime-4.1.16.tgz", + "integrity": "sha512-thOEw8kmPSGZ5YqKPdMg/yVjwCbpp+YQJYdnb9llrtgdqoqlcAtJsk/Wj+Q8N89GkYs6WrTlOWpzdSoh9gU3dA==", "dependencies": { "@agent-assistant/proactive": "^0.4.32", "@agent-relay/events": "^6.3.3", - "@agentworkforce/persona-kit": "4.1.14", + "@agentworkforce/persona-kit": "4.1.16", "@relayfile/adapter-core": "^0.3.60", "agent-trajectories": "^0.5.3" } }, "node_modules/@agentworkforce/workload-router": { - "version": "4.1.14", - "resolved": "https://registry.npmjs.org/@agentworkforce/workload-router/-/workload-router-4.1.14.tgz", - "integrity": "sha512-3aB7MiJSP3saS/s3i+GQTRrOT8Btewsv6j3+yDzr4Ud9J7dZ9pVdJMb7aUg7Zn9F5FPRohtlODABcJq5VxQkdg==", + "version": "4.1.16", + "resolved": "https://registry.npmjs.org/@agentworkforce/workload-router/-/workload-router-4.1.16.tgz", + "integrity": "sha512-RuzP2MMETdjlynZIGuoiqbJg+1VdehmeKYW354NHUFGzuRCMOLrgoqWdTf26UnjjMKwB0Q19hnsqXkWdNO9CRA==", "dependencies": { - "@agentworkforce/persona-kit": "4.1.14" + "@agentworkforce/persona-kit": "4.1.16" } }, "node_modules/@aws-crypto/sha1-browser": { @@ -3058,9 +3058,9 @@ } }, "node_modules/@opentelemetry/context-async-hooks": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-2.8.0.tgz", - "integrity": "sha512-/3FIraneMcng67SUJCxvyInk/oxzwsxyadufk0wwfOBLf5wqtAGX4MoQASwSbndBPeARzBryUM9Azr5kHIdWLw==", + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-2.9.0.tgz", + "integrity": "sha512-OQ0vzvbZBiUhjqLnUaoNfYmP8553Crr3aggB4y0ZUi815mZ7idpdJXQmoKdeBKJelYttoBlLSSHubmyw3wvX4w==", "license": "Apache-2.0", "engines": { "node": "^18.19.0 || >=20.6.0" @@ -3070,9 +3070,9 @@ } }, "node_modules/@opentelemetry/core": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.8.0.tgz", - "integrity": "sha512-hd1Lfh8p545nNz+jq1Ejfz+Mn1hyLuxYn1YzTfFNrxr8urEWMNQLPf1Th8kjOH+HxwawCrtgBp8JpBUR4ZSgww==", + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.9.0.tgz", + "integrity": "sha512-m2nckMT80NnmjTYSPjJQObBJ+8dgkoajEOUbznL8AHZ3T3yHRk2P7gI1PhEBc1+lOnrYE9UWrWHqJDsmqjmNbw==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" @@ -4715,12 +4715,12 @@ } }, "node_modules/@opentelemetry/resources": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.8.0.tgz", - "integrity": "sha512-qmXQ27ilDbUK/vGMqwL8D4/rhn76C+sherM4wTbjlfknR8Nvfc/hCxjRJPhkzZzUsPiNg16SA31NxMabwttRjg==", + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.9.0.tgz", + "integrity": "sha512-jyA5MBLQ+Dkl3+JsZkUoUvL7yHvU64kLsvpXKarWm6347Sl1t1bXFTFykUePNpT5WH5pm9a2Qtt03iIYQhZ1Fg==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "2.8.0", + "@opentelemetry/core": "2.9.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "engines": { @@ -5027,14 +5027,32 @@ "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, + "node_modules/@opentelemetry/sdk-trace": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace/-/sdk-trace-2.9.0.tgz", + "integrity": "sha512-sGA19HvtrrSKYsseHphluH6j3p6Xa3fqc7c7y8f/7mYWejc1lyDFcpSdD1kYa50HCLUeEo4zA5bW0pniaPszuw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.9.0", + "@opentelemetry/resources": "2.9.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, "node_modules/@opentelemetry/sdk-trace-base": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.8.0.tgz", - "integrity": "sha512-mhU4jp+vW0mGbFRd+GeXHvmfA4aDqWjBjLC3pE5XMpLs0IE2ryYb019Ts2AQrOq67gaTF25D91+fgvEHDZEnuQ==", + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.9.0.tgz", + "integrity": "sha512-cp9zmTl62R8PJrpvFcmc8N2JQU/xfa0S+61q511Nji+QxCfZ8Ifvg7H27G8cANe4crg4RTrWsVvanHiXjSp6ag==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "2.8.0", - "@opentelemetry/resources": "2.8.0", + "@opentelemetry/core": "2.9.0", + "@opentelemetry/resources": "2.9.0", + "@opentelemetry/sdk-trace": "2.9.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "engines": { @@ -5045,14 +5063,14 @@ } }, "node_modules/@opentelemetry/sdk-trace-node": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-2.8.0.tgz", - "integrity": "sha512-nZt9OGufioAc3AfoLTqA9bsAeaMJAictYDdI2VcNQ+PmT+3rfKjAZDZvgPfd8VPX0O5Bw1hdQF6kDK8VSpZiWg==", + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-2.9.0.tgz", + "integrity": "sha512-ec9a7ps37huy5itYk0MalaZdSLlM6AXWp/FhtEjgMpp5leEGojBDvAl/UWttQnkMZOvFHKzRESn8TD3yKTF5nQ==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/context-async-hooks": "2.8.0", - "@opentelemetry/core": "2.8.0", - "@opentelemetry/sdk-trace-base": "2.8.0" + "@opentelemetry/context-async-hooks": "2.9.0", + "@opentelemetry/core": "2.9.0", + "@opentelemetry/sdk-trace-base": "2.9.0" }, "engines": { "node": "^18.19.0 || >=20.6.0" @@ -5621,10 +5639,10 @@ } }, "node_modules/@relayfile/local-mount": { - "version": "0.7.40", - "resolved": "https://registry.npmjs.org/@relayfile/local-mount/-/local-mount-0.7.40.tgz", - "integrity": "sha512-dcXidm5Ec43Fv8CoIwgs3acKJlxj24NcEYueyH+Ze5uIb528onBBVFSkBFR/Nk3z6qBgOtLwvWPt30PpnR/dsg==", - "license": "MIT", + "version": "0.10.24", + "resolved": "https://registry.npmjs.org/@relayfile/local-mount/-/local-mount-0.10.24.tgz", + "integrity": "sha512-KFfGBuhpT1S2arsWhH2c333WklkUXSkpikWKuWNKHPqzRgthSltHx1FXr59lEovs996xGOzR0E4U0f+aGpYfdw==", + "license": "Apache-2.0", "dependencies": { "@parcel/watcher": "^2.5.6", "ignore": "^7.0.5" @@ -7416,6 +7434,72 @@ "node": ">=14.0.0" } }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/core": { + "version": "1.11.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.2", + "tslib": "^2.4.0" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/runtime": { + "version": "1.11.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/wasi-threads": { + "version": "1.2.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@napi-rs/wasm-runtime": { + "version": "1.1.4", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@tybys/wasm-util": "^0.10.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "peerDependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@tybys/wasm-util": { + "version": "0.10.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/tslib": { + "version": "2.8.1", + "dev": true, + "inBundle": true, + "license": "0BSD", + "optional": true + }, "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.3.2.tgz", @@ -8308,11 +8392,11 @@ } }, "node_modules/agentworkforce": { - "version": "4.1.14", - "resolved": "https://registry.npmjs.org/agentworkforce/-/agentworkforce-4.1.14.tgz", - "integrity": "sha512-sGguBsCR2AZGu23KkYlpEOLJ3YwAu3kVAg2U/fspH0U5oAc95ka87PaQgocY1c3yxag1PMp8HtV8PYuUi98TDg==", + "version": "4.1.16", + "resolved": "https://registry.npmjs.org/agentworkforce/-/agentworkforce-4.1.16.tgz", + "integrity": "sha512-YEIdt1pD38C8434OAtM6/4Z/zrMQK/81Aw+EdiT+6V3o+z+57rRnyKT96qvu70VwPWF/jjLodMOhrlLqpKeHvw==", "dependencies": { - "@agentworkforce/cli": "4.1.14" + "@agentworkforce/cli": "4.1.16" }, "bin": { "agentworkforce": "bin/agentworkforce.js" diff --git a/package.json b/package.json index d925f7e7..53c7acb2 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,7 @@ "@agent-relay/harnesses": "^9.2.1", "@agent-relay/integration-prompts": "^9.2.1", "@agent-relay/sdk": "^9.2.1", - "@agentworkforce/deploy": "^4.0.2", + "@agentworkforce/deploy": "^4.1.16", "@relayburn/sdk": "^4.0.0", "@relaycast/sdk": "^5.0.7", "@relayfile/sdk": "^0.10.15", @@ -52,7 +52,7 @@ "@xterm/addon-webgl": "^0.18.0", "@xterm/xterm": "^5.5.0", "agent-relay": "^9.2.1", - "agentworkforce": "^4.0.2", + "agentworkforce": "^4.1.16", "ai-hist": "^0.2.3", "allotment": "^1.0.9", "electron-updater": "^6.3.9", diff --git a/src/main/broker.test.ts b/src/main/broker.test.ts index 7198cf30..e93df1d9 100644 --- a/src/main/broker.test.ts +++ b/src/main/broker.test.ts @@ -1,4 +1,5 @@ import { chmod, mkdir, mkdtemp, readFile, rm, writeFile } from 'node:fs/promises' +import { execFileSync } from 'node:child_process' import { tmpdir } from 'node:os' import { dirname, join } from 'node:path' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' @@ -233,6 +234,7 @@ import { parseBrokerInitCliFlags, resolveBundledBrokerBinary } from './broker-binary' +import { resolvePackageBin } from './mcp-command' import { classifyBrokerEvent, KNOWN_BROKER_EVENT_KINDS @@ -1359,8 +1361,10 @@ describe('BrokerManager local + cloud coexistence', () => { }) const result = await manager.spawnPersona(PROJECT_ID, 'autonomous-actor') + const binaryName = process.platform === 'win32' ? 'agentworkforce.cmd' : 'agentworkforce' expect(local.spawnPty).toHaveBeenCalledWith(expect.objectContaining({ + cli: join(personaTempDir, 'node_modules', '.bin', binaryName), args: ['agent', 'autonomous-actor'] })) expect(local.spawnPty).not.toHaveBeenCalledWith(expect.objectContaining({ @@ -1382,6 +1386,79 @@ describe('BrokerManager local + cloud coexistence', () => { await manager.shutdown() }) + it('uses Pear pinned Workforce 4.1.16 when the project has no local CLI', async () => { + personaTempDir = await mkdtemp(join(tmpdir(), 'pear-clean-persona-spawn-')) + const packageCommand = resolvePackageBin('agentworkforce', 'agentworkforce') + expect(packageCommand).toBeTruthy() + const cwdSpy = vi.spyOn(process, 'cwd').mockReturnValue(personaTempDir) + const manager = new BrokerManager() + + try { + mock.state.nextLocalAgents = [] + await manager.start(PROJECT_ID, personaTempDir, 'pear-project-1', undefined as never, []) + const local = lastSpawned() + local.spawnPty.mockImplementationOnce(async (input: { name: string }) => { + local.agentNames.push(input.name) + setImmediate(() => emitPersonaHarnessReady(local, input.name)) + return { name: input.name, runtime: 'pty', cli: 'agentworkforce' } + }) + + await manager.spawnPersona(PROJECT_ID, 'persona-maker') + + expect(local.spawnPty).toHaveBeenCalledWith(expect.objectContaining({ + cli: packageCommand, + args: ['agent', 'persona-maker'] + })) + expect(execFileSync(packageCommand!, ['--version'], { encoding: 'utf8' }).trim()).toBe('4.1.16') + } finally { + cwdSpy.mockRestore() + await manager.shutdown() + } + }) + + it('executes Pear packaged Workforce runtime with broker-first MCP precedence', () => { + if (process.platform === 'win32') return + const probe = execFileSync(process.execPath, [ + '--input-type=module', + '--eval', + ` + import { createRequire } from 'node:module'; + import { pathToFileURL } from 'node:url'; + const rootRequire = createRequire(import.meta.url); + const cliPackagePath = rootRequire.resolve('@agentworkforce/cli/package.json'); + const cliRequire = createRequire(cliPackagePath); + const runtime = await import(pathToFileURL(cliRequire.resolve('@agentworkforce/runtime')).href); + const logs = []; + await runtime.resolveAgentRelayBrokerMcpArgs({ + cli: 'codex', + env: { + BROKER_BINARY_PATH: '/usr/bin/true', + AGENT_RELAY_BIN: '/usr/bin/false' + }, + relayMcp: { agentName: 'pear-consumption-smoke', apiKey: 'redacted' }, + cwd: process.cwd(), + existingArgs: [], + log: (level, message, attrs) => logs.push({ level, message, attrs }) + }); + process.stdout.write(JSON.stringify({ + runtimeVersion: cliRequire('@agentworkforce/runtime/package.json').version, + log: logs.at(-1) + })); + ` + ], { + cwd: process.cwd(), + encoding: 'utf8' + }) + const result = JSON.parse(probe) as { + runtimeVersion: string + log: { message: string; attrs?: { broker?: string } } + } + + expect(result.log.message).toBe('harness.relay_mcp.broker_args_invalid_json') + expect(result.log.attrs?.broker).toBe('/usr/bin/true') + expect(result.runtimeVersion).toBe('4.1.16') + }) + it('lists workforce personas from a project root before the relay workspace starts', async () => { personaTempDir = await mkdtemp(join(tmpdir(), 'pear-persona-list-')) await writeAgentWorkforceFixture(personaTempDir) diff --git a/src/main/broker.ts b/src/main/broker.ts index 4cd4dba0..b29f738f 100644 --- a/src/main/broker.ts +++ b/src/main/broker.ts @@ -145,6 +145,9 @@ function executableCliPath(input: SpawnPtyInput): string { function resolveAgentWorkforceCommand(cwd: string): { cli: string; args: string[] } { const binaryName = process.platform === 'win32' ? 'agentworkforce.cmd' : 'agentworkforce' + // Project-local is intentionally first: repositories may pin a Workforce + // release for their persona/runtime contract. Pear's packaged dependency is + // the clean-project fallback, followed by PATH and the exact npx version. const localCandidates = [ join(cwd, 'node_modules', '.bin', binaryName), join(process.cwd(), 'node_modules', '.bin', binaryName) @@ -416,7 +419,7 @@ const PERSONA_READY_PROBE_RETRY_DELAY_MS = 1_000 // skill install calls process.exit) would otherwise burn the entire // PERSONA_HARNESS_READY_TIMEOUT_MS before surfacing an error. const PERSONA_LIVENESS_POLL_MS = 2_000 -const AGENTWORKFORCE_CLI_VERSION = '4.0.2' +const AGENTWORKFORCE_CLI_VERSION = '4.1.16' function delay(ms: number): Promise { return new Promise((resolve) => setTimeout(resolve, ms)) From cc9a8782be71376536385d0c21746f4e6ec8ad37 Mon Sep 17 00:00:00 2001 From: Khaliq Date: Tue, 14 Jul 2026 10:41:28 +0200 Subject: [PATCH 2/3] test: support Windows Workforce CLI shim --- src/main/broker.test.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/broker.test.ts b/src/main/broker.test.ts index e93df1d9..7e1f29bf 100644 --- a/src/main/broker.test.ts +++ b/src/main/broker.test.ts @@ -1409,7 +1409,10 @@ describe('BrokerManager local + cloud coexistence', () => { cli: packageCommand, args: ['agent', 'persona-maker'] })) - expect(execFileSync(packageCommand!, ['--version'], { encoding: 'utf8' }).trim()).toBe('4.1.16') + expect(execFileSync(packageCommand!, ['--version'], { + encoding: 'utf8', + shell: process.platform === 'win32' + }).trim()).toBe('4.1.16') } finally { cwdSpy.mockRestore() await manager.shutdown() From 17a25c377a6ffb06aa7aff414d9f406695546583 Mon Sep 17 00:00:00 2001 From: Khaliq Date: Tue, 14 Jul 2026 10:44:54 +0200 Subject: [PATCH 3/3] test: guard Unix Workforce command shape --- src/main/broker.test.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/main/broker.test.ts b/src/main/broker.test.ts index 7e1f29bf..cdcb3be4 100644 --- a/src/main/broker.test.ts +++ b/src/main/broker.test.ts @@ -1387,6 +1387,7 @@ describe('BrokerManager local + cloud coexistence', () => { }) it('uses Pear pinned Workforce 4.1.16 when the project has no local CLI', async () => { + if (process.platform === 'win32') return personaTempDir = await mkdtemp(join(tmpdir(), 'pear-clean-persona-spawn-')) const packageCommand = resolvePackageBin('agentworkforce', 'agentworkforce') expect(packageCommand).toBeTruthy() @@ -1409,10 +1410,7 @@ describe('BrokerManager local + cloud coexistence', () => { cli: packageCommand, args: ['agent', 'persona-maker'] })) - expect(execFileSync(packageCommand!, ['--version'], { - encoding: 'utf8', - shell: process.platform === 'win32' - }).trim()).toBe('4.1.16') + expect(execFileSync(packageCommand!, ['--version'], { encoding: 'utf8' }).trim()).toBe('4.1.16') } finally { cwdSpy.mockRestore() await manager.shutdown()