From ab01a2534b65a1b45f48ed2bcfa1ccb63838b868 Mon Sep 17 00:00:00 2001 From: CalvinWade Date: Thu, 4 Jun 2026 11:07:00 +0800 Subject: [PATCH 01/20] chore: establish ACP repository boundaries --- .changeset/config.json | 1 + .github/workflows/test.yml | 3 + apps/acp-devtools/package.json | 15 + apps/acp-devtools/src/App.vue | 8 + .../test/browser/environment.browser.spec.ts | 13 + .../test/unit/environment.spec.ts | 11 + apps/acp-devtools/tsconfig.json | 8 + fixtures/acp-agents/package.json | 16 + fixtures/acp-agents/src/index.ts | 2 + fixtures/acp-agents/tsconfig.build.json | 10 + fixtures/acp-agents/tsconfig.json | 7 + package.json | 25 +- packages/acp-cli/package.json | 20 ++ packages/acp-cli/src/index.ts | 2 + packages/acp-cli/tsconfig.build.json | 10 + packages/acp-cli/tsconfig.json | 7 + packages/acp-core/package.json | 16 + packages/acp-core/src/index.ts | 2 + packages/acp-core/tsconfig.build.json | 10 + packages/acp-core/tsconfig.json | 7 + packages/acp-harness/package.json | 19 ++ packages/acp-harness/src/index.ts | 2 + packages/acp-harness/tsconfig.build.json | 10 + packages/acp-harness/tsconfig.json | 7 + pnpm-lock.yaml | 321 +++++++++++++----- pnpm-workspace.yaml | 6 +- .../project-boundary.contract.spec.ts | 7 + test/replay/project-boundary.replay.spec.ts | 7 + test/repository/repository-boundary.spec.ts | 117 +++++++ .../project-boundary.scenario.spec.ts | 7 + .../project-boundary.security.spec.ts | 7 + tsconfig.json | 5 + tsconfig.node.json | 12 + vitest.config.ts | 121 +++++-- 34 files changed, 708 insertions(+), 133 deletions(-) create mode 100644 apps/acp-devtools/package.json create mode 100644 apps/acp-devtools/src/App.vue create mode 100644 apps/acp-devtools/test/browser/environment.browser.spec.ts create mode 100644 apps/acp-devtools/test/unit/environment.spec.ts create mode 100644 apps/acp-devtools/tsconfig.json create mode 100644 fixtures/acp-agents/package.json create mode 100644 fixtures/acp-agents/src/index.ts create mode 100644 fixtures/acp-agents/tsconfig.build.json create mode 100644 fixtures/acp-agents/tsconfig.json create mode 100644 packages/acp-cli/package.json create mode 100644 packages/acp-cli/src/index.ts create mode 100644 packages/acp-cli/tsconfig.build.json create mode 100644 packages/acp-cli/tsconfig.json create mode 100644 packages/acp-core/package.json create mode 100644 packages/acp-core/src/index.ts create mode 100644 packages/acp-core/tsconfig.build.json create mode 100644 packages/acp-core/tsconfig.json create mode 100644 packages/acp-harness/package.json create mode 100644 packages/acp-harness/src/index.ts create mode 100644 packages/acp-harness/tsconfig.build.json create mode 100644 packages/acp-harness/tsconfig.json create mode 100644 test/contract/project-boundary.contract.spec.ts create mode 100644 test/replay/project-boundary.replay.spec.ts create mode 100644 test/repository/repository-boundary.spec.ts create mode 100644 test/scenario/project-boundary.scenario.spec.ts create mode 100644 test/security/project-boundary.security.spec.ts create mode 100644 tsconfig.node.json diff --git a/.changeset/config.json b/.changeset/config.json index b821332..2c4ddf8 100644 --- a/.changeset/config.json +++ b/.changeset/config.json @@ -7,5 +7,6 @@ "access": "public", "baseBranch": "main", "updateInternalDependencies": "patch", + "privatePackages": false, "ignore": [] } diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 6a357d0..2d86b03 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -34,6 +34,9 @@ jobs: - name: Install dependencies run: pnpm install --frozen-lockfile + - name: Install Chromium for Vitest Browser Mode + run: pnpm exec playwright install --with-deps chromium + # ... (lint, type-check, test:ci, codecov... 保持不变) - name: Run linting run: pnpm lint diff --git a/apps/acp-devtools/package.json b/apps/acp-devtools/package.json new file mode 100644 index 0000000..fa86160 --- /dev/null +++ b/apps/acp-devtools/package.json @@ -0,0 +1,15 @@ +{ + "name": "@axis-ui/acp-devtools", + "version": "0.0.0", + "private": true, + "type": "module", + "scripts": { + "build": "pnpm type-check", + "type-check": "vue-tsc --noEmit -p tsconfig.json" + }, + "dependencies": { + "@axis-ui/acp-core": "workspace:*", + "axis-ui": "workspace:*", + "vue": "^3.5.22" + } +} diff --git a/apps/acp-devtools/src/App.vue b/apps/acp-devtools/src/App.vue new file mode 100644 index 0000000..b817b89 --- /dev/null +++ b/apps/acp-devtools/src/App.vue @@ -0,0 +1,8 @@ + + + diff --git a/apps/acp-devtools/test/browser/environment.browser.spec.ts b/apps/acp-devtools/test/browser/environment.browser.spec.ts new file mode 100644 index 0000000..1e09f1c --- /dev/null +++ b/apps/acp-devtools/test/browser/environment.browser.spec.ts @@ -0,0 +1,13 @@ +import { mount } from '@vue/test-utils' +import { describe, expect, it } from 'vitest' +import App from '../../src/App.vue' + +describe('ACP DevTools browser project boundary', () => { + it('runs the Vue skeleton in a real browser project', () => { + const wrapper = mount(App) + + expect(wrapper.get('[data-gate="01"]').text()).toContain( + 'no ACP runtime is implemented' + ) + }) +}) diff --git a/apps/acp-devtools/test/unit/environment.spec.ts b/apps/acp-devtools/test/unit/environment.spec.ts new file mode 100644 index 0000000..a3e4d5c --- /dev/null +++ b/apps/acp-devtools/test/unit/environment.spec.ts @@ -0,0 +1,11 @@ +import { mount } from '@vue/test-utils' +import { describe, expect, it } from 'vitest' +import App from '../../src/App.vue' + +describe('ACP DevTools happy-dom project boundary', () => { + it('type-checks and mounts the Vue skeleton separately from Node packages', () => { + const wrapper = mount(App) + + expect(wrapper.attributes('data-gate')).toBe('01') + }) +}) diff --git a/apps/acp-devtools/tsconfig.json b/apps/acp-devtools/tsconfig.json new file mode 100644 index 0000000..6a6bb5b --- /dev/null +++ b/apps/acp-devtools/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "types": ["vite/client", "vitest/globals"] + }, + "include": ["src/**/*.ts", "src/**/*.vue", "test/**/*.ts"], + "exclude": ["node_modules", "dist"] +} diff --git a/fixtures/acp-agents/package.json b/fixtures/acp-agents/package.json new file mode 100644 index 0000000..4be917a --- /dev/null +++ b/fixtures/acp-agents/package.json @@ -0,0 +1,16 @@ +{ + "name": "@axis-ui/acp-fixture-agents", + "version": "0.0.0", + "private": true, + "type": "module", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.js" + } + }, + "scripts": { + "build": "tsc -p tsconfig.build.json", + "type-check": "tsc --noEmit -p tsconfig.json" + } +} diff --git a/fixtures/acp-agents/src/index.ts b/fixtures/acp-agents/src/index.ts new file mode 100644 index 0000000..8442a8a --- /dev/null +++ b/fixtures/acp-agents/src/index.ts @@ -0,0 +1,2 @@ +// The executable fixture agent owns deterministic protocol behavior. +export {} diff --git a/fixtures/acp-agents/tsconfig.build.json b/fixtures/acp-agents/tsconfig.build.json new file mode 100644 index 0000000..f5bbab6 --- /dev/null +++ b/fixtures/acp-agents/tsconfig.build.json @@ -0,0 +1,10 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "declaration": true, + "declarationMap": true, + "noEmit": false, + "outDir": "dist", + "sourceMap": true + } +} diff --git a/fixtures/acp-agents/tsconfig.json b/fixtures/acp-agents/tsconfig.json new file mode 100644 index 0000000..e5883b0 --- /dev/null +++ b/fixtures/acp-agents/tsconfig.json @@ -0,0 +1,7 @@ +{ + "extends": "../../tsconfig.node.json", + "compilerOptions": { + "rootDir": "src" + }, + "include": ["src/**/*.ts"] +} diff --git a/package.json b/package.json index 6f0cc57..b39f921 100644 --- a/package.json +++ b/package.json @@ -8,14 +8,22 @@ "scripts": { "dev": "pnpm -C play dev", "build": "pnpm build:all", - "build:all": "pnpm -r --filter \"./packages/**\" build", - "check:publish": "pnpm -r --filter \"./packages/**\" exec publint && attw --pack packages/components --profile esm-only --exclude-entrypoints ./dist/style.css && attw --pack packages/utils --profile esm-only", + "build:all": "pnpm -r --if-present --filter \"./packages/**\" --filter \"./apps/**\" --filter \"./fixtures/acp-agents\" run build", + "check:publish": "pnpm -r --filter axis-ui --filter @axis-ui/theme-chalk --filter @axis-ui/utils exec publint && attw --pack packages/components --profile esm-only --exclude-entrypoints ./dist/style.css && attw --pack packages/utils --profile esm-only", "lint": "eslint", "lint:fix": "eslint --fix", "format": "prettier --write .", "format:check": "prettier --check .", - "type-check": "vue-tsc --noEmit", + "type-check": "pnpm type-check:node && pnpm type-check:vue", + "type-check:node": "pnpm -r --filter @axis-ui/acp-core --filter @axis-ui/acp-harness --filter @axis-ui/acp-cli --filter @axis-ui/acp-fixture-agents run type-check", + "type-check:vue": "vue-tsc --noEmit && pnpm --filter @axis-ui/acp-devtools run type-check", "test": "vitest", + "test:unit": "vitest run --project axis-ui --project acp-node --project acp-devtools", + "test:contract": "vitest run --project contract", + "test:scenario": "vitest run --project scenario", + "test:replay": "vitest run --project replay", + "test:security": "vitest run --project security", + "test:browser": "vitest run --project browser", "test:watch": "vitest watch", "test:coverage": "vitest run --coverage", "test:ui": "vitest --ui", @@ -29,7 +37,8 @@ "prepare": "husky", "changeset": "changeset", "version": "changeset version", - "release": "pnpm build:all && pnpm -r publish --access public --no-git-checks && changeset tag" + "release:packages": "pnpm -r --filter axis-ui --filter @axis-ui/theme-chalk --filter @axis-ui/utils publish --access public --no-git-checks", + "release": "pnpm build:all && pnpm release:packages && changeset tag" }, "devDependencies": { "@arethetypeswrong/cli": "^0.18.5", @@ -42,7 +51,9 @@ "@iconify/json": "^2.2.403", "@vitejs/plugin-vue": "^6.0.1", "@vitejs/plugin-vue-jsx": "^5.1.1", + "@vitest/browser-playwright": "4.0.4", "@vitest/coverage-v8": "^4.0.4", + "@types/node": "^20.19.43", "@vue/eslint-config-prettier": "^10.2.0", "@vue/eslint-config-typescript": "^14.6.0", "@vue/test-utils": "^2.4.6", @@ -55,6 +66,7 @@ "husky": "^9.1.7", "jsdom": "^27.0.1", "lint-staged": "^16.2.6", + "playwright": "^1.62.1", "prettier": "^3.6.2", "publint": "^0.3.22", "sass": "^1.93.2", @@ -77,5 +89,10 @@ "*.{css,scss,less,md,json}": [ "prettier --write" ] + }, + "pnpm": { + "overrides": { + "@types/node": "20.19.43" + } } } diff --git a/packages/acp-cli/package.json b/packages/acp-cli/package.json new file mode 100644 index 0000000..2723753 --- /dev/null +++ b/packages/acp-cli/package.json @@ -0,0 +1,20 @@ +{ + "name": "@axis-ui/acp-cli", + "version": "0.0.0", + "private": true, + "type": "module", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.js" + } + }, + "scripts": { + "build": "tsc -p tsconfig.build.json", + "type-check": "tsc --noEmit -p tsconfig.json" + }, + "dependencies": { + "@axis-ui/acp-core": "workspace:*", + "@axis-ui/acp-harness": "workspace:*" + } +} diff --git a/packages/acp-cli/src/index.ts b/packages/acp-cli/src/index.ts new file mode 100644 index 0000000..0d7813e --- /dev/null +++ b/packages/acp-cli/src/index.ts @@ -0,0 +1,2 @@ +// Gate 01 establishes only the private package boundary. CLI commands start in later gates. +export {} diff --git a/packages/acp-cli/tsconfig.build.json b/packages/acp-cli/tsconfig.build.json new file mode 100644 index 0000000..f5bbab6 --- /dev/null +++ b/packages/acp-cli/tsconfig.build.json @@ -0,0 +1,10 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "declaration": true, + "declarationMap": true, + "noEmit": false, + "outDir": "dist", + "sourceMap": true + } +} diff --git a/packages/acp-cli/tsconfig.json b/packages/acp-cli/tsconfig.json new file mode 100644 index 0000000..e5883b0 --- /dev/null +++ b/packages/acp-cli/tsconfig.json @@ -0,0 +1,7 @@ +{ + "extends": "../../tsconfig.node.json", + "compilerOptions": { + "rootDir": "src" + }, + "include": ["src/**/*.ts"] +} diff --git a/packages/acp-core/package.json b/packages/acp-core/package.json new file mode 100644 index 0000000..f891fc7 --- /dev/null +++ b/packages/acp-core/package.json @@ -0,0 +1,16 @@ +{ + "name": "@axis-ui/acp-core", + "version": "0.0.0", + "private": true, + "type": "module", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.js" + } + }, + "scripts": { + "build": "tsc -p tsconfig.build.json", + "type-check": "tsc --noEmit -p tsconfig.json" + } +} diff --git a/packages/acp-core/src/index.ts b/packages/acp-core/src/index.ts new file mode 100644 index 0000000..5891e1b --- /dev/null +++ b/packages/acp-core/src/index.ts @@ -0,0 +1,2 @@ +// Gate 01 establishes only the private package boundary. ACP domain code starts in later gates. +export {} diff --git a/packages/acp-core/tsconfig.build.json b/packages/acp-core/tsconfig.build.json new file mode 100644 index 0000000..f5bbab6 --- /dev/null +++ b/packages/acp-core/tsconfig.build.json @@ -0,0 +1,10 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "declaration": true, + "declarationMap": true, + "noEmit": false, + "outDir": "dist", + "sourceMap": true + } +} diff --git a/packages/acp-core/tsconfig.json b/packages/acp-core/tsconfig.json new file mode 100644 index 0000000..e5883b0 --- /dev/null +++ b/packages/acp-core/tsconfig.json @@ -0,0 +1,7 @@ +{ + "extends": "../../tsconfig.node.json", + "compilerOptions": { + "rootDir": "src" + }, + "include": ["src/**/*.ts"] +} diff --git a/packages/acp-harness/package.json b/packages/acp-harness/package.json new file mode 100644 index 0000000..ece2b72 --- /dev/null +++ b/packages/acp-harness/package.json @@ -0,0 +1,19 @@ +{ + "name": "@axis-ui/acp-harness", + "version": "0.0.0", + "private": true, + "type": "module", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.js" + } + }, + "scripts": { + "build": "tsc -p tsconfig.build.json", + "type-check": "tsc --noEmit -p tsconfig.json" + }, + "dependencies": { + "@axis-ui/acp-core": "workspace:*" + } +} diff --git a/packages/acp-harness/src/index.ts b/packages/acp-harness/src/index.ts new file mode 100644 index 0000000..4d4e45d --- /dev/null +++ b/packages/acp-harness/src/index.ts @@ -0,0 +1,2 @@ +// Gate 01 establishes only the private package boundary. Harness behavior starts in Gate 02. +export {} diff --git a/packages/acp-harness/tsconfig.build.json b/packages/acp-harness/tsconfig.build.json new file mode 100644 index 0000000..f5bbab6 --- /dev/null +++ b/packages/acp-harness/tsconfig.build.json @@ -0,0 +1,10 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "declaration": true, + "declarationMap": true, + "noEmit": false, + "outDir": "dist", + "sourceMap": true + } +} diff --git a/packages/acp-harness/tsconfig.json b/packages/acp-harness/tsconfig.json new file mode 100644 index 0000000..e5883b0 --- /dev/null +++ b/packages/acp-harness/tsconfig.json @@ -0,0 +1,7 @@ +{ + "extends": "../../tsconfig.node.json", + "compilerOptions": { + "rootDir": "src" + }, + "include": ["src/**/*.ts"] +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0dbdf91..02cb767 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,6 +4,9 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false +overrides: + '@types/node': 20.19.43 + importers: .: @@ -13,10 +16,10 @@ importers: version: 0.18.5 '@changesets/cli': specifier: ^2.29.8 - version: 2.29.8(@types/node@24.9.1) + version: 2.29.8(@types/node@20.19.43) '@commitlint/cli': specifier: ^20.1.0 - version: 20.1.0(@types/node@24.9.1)(typescript@5.9.3) + version: 20.1.0(@types/node@20.19.43)(typescript@5.9.3) '@commitlint/config-conventional': specifier: ^20.0.0 version: 20.0.0 @@ -32,15 +35,21 @@ importers: '@iconify/json': specifier: ^2.2.403 version: 2.2.403 + '@types/node': + specifier: 20.19.43 + version: 20.19.43 '@vitejs/plugin-vue': specifier: ^6.0.1 - version: 6.0.8(vite@7.3.6(@types/node@24.9.1)(jiti@2.6.1)(lightningcss@1.33.0)(sass@1.93.2)(yaml@2.8.1))(vue@3.5.40(typescript@5.9.3)) + version: 6.0.8(vite@7.3.6(@types/node@20.19.43)(jiti@2.6.1)(lightningcss@1.33.0)(sass@1.93.2)(yaml@2.8.1))(vue@3.5.40(typescript@5.9.3)) '@vitejs/plugin-vue-jsx': specifier: ^5.1.1 - version: 5.1.1(vite@7.3.6(@types/node@24.9.1)(jiti@2.6.1)(lightningcss@1.33.0)(sass@1.93.2)(yaml@2.8.1))(vue@3.5.40(typescript@5.9.3)) + version: 5.1.1(vite@7.3.6(@types/node@20.19.43)(jiti@2.6.1)(lightningcss@1.33.0)(sass@1.93.2)(yaml@2.8.1))(vue@3.5.40(typescript@5.9.3)) + '@vitest/browser-playwright': + specifier: 4.0.4 + version: 4.0.4(playwright@1.62.1)(vite@7.3.6(@types/node@20.19.43)(jiti@2.6.1)(lightningcss@1.33.0)(sass@1.93.2)(yaml@2.8.1))(vitest@4.0.4) '@vitest/coverage-v8': specifier: ^4.0.4 - version: 4.0.4(vitest@4.0.4(@types/node@24.9.1)(happy-dom@20.0.8)(jiti@2.6.1)(jsdom@27.0.1(postcss@8.5.23))(lightningcss@1.33.0)(sass@1.93.2)(yaml@2.8.1)) + version: 4.0.4(@vitest/browser@4.0.4(vite@7.3.6(@types/node@20.19.43)(jiti@2.6.1)(lightningcss@1.33.0)(sass@1.93.2)(yaml@2.8.1))(vitest@4.0.4))(vitest@4.0.4) '@vue/eslint-config-prettier': specifier: ^10.2.0 version: 10.2.0(eslint@9.38.0(jiti@2.6.1))(prettier@3.6.2) @@ -77,6 +86,9 @@ importers: lint-staged: specifier: ^16.2.6 version: 16.2.6 + playwright: + specifier: ^1.62.1 + version: 1.62.1 prettier: specifier: ^3.6.2 version: 3.6.2 @@ -100,16 +112,16 @@ importers: version: 30.0.0(@babel/parser@7.29.7)(vue@3.5.40(typescript@5.9.3)) vite: specifier: ^7.1.12 - version: 7.3.6(@types/node@24.9.1)(jiti@2.6.1)(lightningcss@1.33.0)(sass@1.93.2)(yaml@2.8.1) + version: 7.3.6(@types/node@20.19.43)(jiti@2.6.1)(lightningcss@1.33.0)(sass@1.93.2)(yaml@2.8.1) vite-plugin-dts: specifier: ^4.5.4 - version: 4.5.4(@types/node@24.9.1)(rollup@4.52.5)(typescript@5.9.3)(vite@7.3.6(@types/node@24.9.1)(jiti@2.6.1)(lightningcss@1.33.0)(sass@1.93.2)(yaml@2.8.1)) + version: 4.5.4(@types/node@20.19.43)(rollup@4.52.5)(typescript@5.9.3)(vite@7.3.6(@types/node@20.19.43)(jiti@2.6.1)(lightningcss@1.33.0)(sass@1.93.2)(yaml@2.8.1)) vitepress: specifier: 2.0.0-alpha.15 - version: 2.0.0-alpha.15(@types/node@24.9.1)(async-validator@4.2.5)(jiti@2.6.1)(lightningcss@1.33.0)(postcss@8.5.23)(sass@1.93.2)(typescript@5.9.3)(yaml@2.8.1) + version: 2.0.0-alpha.15(@types/node@20.19.43)(async-validator@4.2.5)(jiti@2.6.1)(lightningcss@1.33.0)(postcss@8.5.23)(sass@1.93.2)(typescript@5.9.3)(yaml@2.8.1) vitest: specifier: ^4.0.4 - version: 4.0.4(@types/node@24.9.1)(happy-dom@20.0.8)(jiti@2.6.1)(jsdom@27.0.1(postcss@8.5.23))(lightningcss@1.33.0)(sass@1.93.2)(yaml@2.8.1) + version: 4.0.4(@types/node@20.19.43)(@vitest/browser-playwright@4.0.4)(happy-dom@20.0.8)(jiti@2.6.1)(jsdom@27.0.1(postcss@8.5.23))(lightningcss@1.33.0)(sass@1.93.2)(yaml@2.8.1) vue: specifier: ^3.5.22 version: 3.5.40(typescript@5.9.3) @@ -117,6 +129,37 @@ importers: specifier: ^3.1.2 version: 3.1.2(typescript@5.9.3) + apps/acp-devtools: + dependencies: + '@axis-ui/acp-core': + specifier: workspace:* + version: link:../../packages/acp-core + axis-ui: + specifier: workspace:* + version: link:../../packages/components + vue: + specifier: ^3.5.22 + version: 3.5.40(typescript@5.9.3) + + fixtures/acp-agents: {} + + packages/acp-cli: + dependencies: + '@axis-ui/acp-core': + specifier: workspace:* + version: link:../acp-core + '@axis-ui/acp-harness': + specifier: workspace:* + version: link:../acp-harness + + packages/acp-core: {} + + packages/acp-harness: + dependencies: + '@axis-ui/acp-core': + specifier: workspace:* + version: link:../acp-core + packages/components: dependencies: '@axis-ui/theme-chalk': @@ -134,16 +177,16 @@ importers: devDependencies: '@vitejs/plugin-vue': specifier: ^6.0.1 - version: 6.0.8(vite@7.3.6(@types/node@24.9.1)(jiti@2.6.1)(lightningcss@1.33.0)(sass@1.93.2)(yaml@2.8.1))(vue@3.5.40(typescript@5.9.3)) + version: 6.0.8(vite@7.3.6(@types/node@20.19.43)(jiti@2.6.1)(lightningcss@1.33.0)(sass@1.93.2)(yaml@2.8.1))(vue@3.5.40(typescript@5.9.3)) '@vitejs/plugin-vue-jsx': specifier: ^5.1.1 - version: 5.1.1(vite@7.3.6(@types/node@24.9.1)(jiti@2.6.1)(lightningcss@1.33.0)(sass@1.93.2)(yaml@2.8.1))(vue@3.5.40(typescript@5.9.3)) + version: 5.1.1(vite@7.3.6(@types/node@20.19.43)(jiti@2.6.1)(lightningcss@1.33.0)(sass@1.93.2)(yaml@2.8.1))(vue@3.5.40(typescript@5.9.3)) vite: specifier: ^7.1.10 - version: 7.3.6(@types/node@24.9.1)(jiti@2.6.1)(lightningcss@1.33.0)(sass@1.93.2)(yaml@2.8.1) + version: 7.3.6(@types/node@20.19.43)(jiti@2.6.1)(lightningcss@1.33.0)(sass@1.93.2)(yaml@2.8.1) vite-plugin-dts: specifier: ^4.5.4 - version: 4.5.4(@types/node@24.9.1)(rollup@4.52.5)(typescript@5.9.3)(vite@7.3.6(@types/node@24.9.1)(jiti@2.6.1)(lightningcss@1.33.0)(sass@1.93.2)(yaml@2.8.1)) + version: 4.5.4(@types/node@20.19.43)(rollup@4.52.5)(typescript@5.9.3)(vite@7.3.6(@types/node@20.19.43)(jiti@2.6.1)(lightningcss@1.33.0)(sass@1.93.2)(yaml@2.8.1)) packages/theme-chalk: {} @@ -163,13 +206,13 @@ importers: version: link:../packages/utils '@vitejs/plugin-vue': specifier: ^6.0.1 - version: 6.0.8(vite@7.3.6(@types/node@24.9.1)(jiti@2.6.1)(lightningcss@1.33.0)(sass@1.93.2)(yaml@2.8.1))(vue@3.5.40(typescript@5.9.3)) + version: 6.0.8(vite@7.3.6(@types/node@20.19.43)(jiti@2.6.1)(lightningcss@1.33.0)(sass@1.93.2)(yaml@2.8.1))(vue@3.5.40(typescript@5.9.3)) axis-ui: specifier: workspace:* version: link:../packages/components vite: specifier: ^7.1.10 - version: 7.3.6(@types/node@24.9.1)(jiti@2.6.1)(lightningcss@1.33.0)(sass@1.93.2)(yaml@2.8.1) + version: 7.3.6(@types/node@20.19.43)(jiti@2.6.1)(lightningcss@1.33.0)(sass@1.93.2)(yaml@2.8.1) packages: @@ -746,7 +789,7 @@ packages: resolution: {integrity: sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==} engines: {node: '>=18'} peerDependencies: - '@types/node': '>=18' + '@types/node': 20.19.43 peerDependenciesMeta: '@types/node': optional: true @@ -912,6 +955,9 @@ packages: resolution: {integrity: sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + '@polka/url@1.0.0-next.29': + resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} + '@publint/pack@0.1.6': resolution: {integrity: sha512-3uVNyGcVplhPZSLVyeIpL7+cIRn1YCSNHLG/rUIlBQMVH8YuN9++YF+5+UDIIO9RW98dujiUoTltO7RDB5bFJA==} engines: {node: '>=18'} @@ -1052,7 +1098,7 @@ packages: '@rushstack/node-core-library@5.18.0': resolution: {integrity: sha512-XDebtBdw5S3SuZIt+Ra2NieT8kQ3D2Ow1HxhDQ/2soinswnOu9e7S69VSwTOLlQnx5mpWbONu+5JJjDxMAb6Fw==} peerDependencies: - '@types/node': '*' + '@types/node': 20.19.43 peerDependenciesMeta: '@types/node': optional: true @@ -1060,7 +1106,7 @@ packages: '@rushstack/problem-matcher@0.1.1': resolution: {integrity: sha512-Fm5XtS7+G8HLcJHCWpES5VmeMyjAKaWeyZU5qPzZC+22mPlJzAsOxymHiWIfuirtPckX3aptWws+K2d0BzniJA==} peerDependencies: - '@types/node': '*' + '@types/node': 20.19.43 peerDependenciesMeta: '@types/node': optional: true @@ -1071,7 +1117,7 @@ packages: '@rushstack/terminal@0.19.3': resolution: {integrity: sha512-0P8G18gK9STyO+CNBvkKPnWGMxESxecTYqOcikHOVIHXa9uAuTK+Fw8TJq2Gng1w7W6wTC9uPX6hGNvrMll2wA==} peerDependencies: - '@types/node': '*' + '@types/node': 20.19.43 peerDependenciesMeta: '@types/node': optional: true @@ -1143,14 +1189,8 @@ packages: '@types/mdurl@2.0.0': resolution: {integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==} - '@types/node@12.20.55': - resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - - '@types/node@20.19.23': - resolution: {integrity: sha512-yIdlVVVHXpmqRhtyovZAcSy0MiPcYWGkoO4CGe/+jpP0hmNuihm4XhHbADpK++MsiLHP5MVlv+bcgdF99kSiFQ==} - - '@types/node@24.9.1': - resolution: {integrity: sha512-QoiaXANRkSXK6p0Duvt56W208du4P9Uye9hWLWgGMDTEoKPhuenzNcC4vGUmrNkiOKTlIrBoyNQYNpSwfEZXSg==} + '@types/node@20.19.43': + resolution: {integrity: sha512-6oYBAi5ikg4Pl+kGsoYtawUMBT2zZMCvPNF7pVLnHZfd1zf38DRiWn/gT01RYCdUqkv7Fhr+C9ot4/tb+2sVvA==} '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} @@ -1237,6 +1277,17 @@ packages: vite: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 vue: ^3.2.25 + '@vitest/browser-playwright@4.0.4': + resolution: {integrity: sha512-jGKnGZ5ZKXuwQ1Ldwll/rZxk3webz4gz3kvoTYX2NH2ASPiwFGck8D09Sf2wVjCuDqebPXXd69zUIt1o4yQ5tA==} + peerDependencies: + playwright: '*' + vitest: 4.0.4 + + '@vitest/browser@4.0.4': + resolution: {integrity: sha512-1ZXztcBtRd3maKliHzWbQohsyRjam0ws6OPRWNWfGxFUOHTlNBtDnJAm8z1x7IzVkZ6JcOAumHJAbxNJh4tkDw==} + peerDependencies: + vitest: 4.0.4 + '@vitest/coverage-v8@4.0.4': resolution: {integrity: sha512-YM7gDj2TX2AXyGLz0p/B7hvTsTfaQc+kSV/LU0nEnKlep/ZfbdCDppPND4YQiQC43OXyrhkG3y8ZSTqYb2CKqQ==} peerDependencies: @@ -1700,7 +1751,7 @@ packages: resolution: {integrity: sha512-GEN39v7TgdxgIoNcdkRE3uiAzQt3UXLyHbRHD6YoL048XAeOomyxaP+Hh/+2C6C2wYjxJ2onhJcsQp+L4YEkVQ==} engines: {node: '>=v18'} peerDependencies: - '@types/node': '*' + '@types/node': 20.19.43 cosmiconfig: '>=9' typescript: '>=5' @@ -2029,6 +2080,11 @@ packages: resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} engines: {node: '>=6 <7 || >=8'} + fsevents@2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -2586,6 +2642,10 @@ packages: resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} engines: {node: '>=4'} + mrmime@2.0.1: + resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} + engines: {node: '>=10'} + ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -2763,12 +2823,30 @@ packages: resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} engines: {node: '>=6'} + pixelmatch@7.1.0: + resolution: {integrity: sha512-1wrVzJ2STrpmONHKBy228LM1b84msXDUoAzVEl0R8Mz4Ce6EPr+IVtxm8+yvrqLYMHswREkjYFaMxnyGnaY3Ng==} + hasBin: true + pkg-types@1.3.1: resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} pkg-types@2.3.0: resolution: {integrity: sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==} + playwright-core@1.62.1: + resolution: {integrity: sha512-wPYSwEBJY9GHraISXqyqtx0na0LpO3XEX7jNDhntbex7tzUS7kLnZsOlFruFJB4Hi/rhDMjXGqHewDZ68nYZVw==} + engines: {node: '>=20'} + hasBin: true + + playwright@1.62.1: + resolution: {integrity: sha512-0M+L3LAD8/nm554LOla9Ayx0j0tmFZ0FBcoQ7F1VuVHpM/XpiC8RcDzBQB8W5+hA8L22THxELzeF+2WcUzvcLg==} + engines: {node: '>=20'} + hasBin: true + + pngjs@7.0.0: + resolution: {integrity: sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow==} + engines: {node: '>=14.19.0'} + postcss-selector-parser@6.1.2: resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} engines: {node: '>=4'} @@ -2924,6 +3002,10 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} + sirv@3.0.2: + resolution: {integrity: sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==} + engines: {node: '>=18'} + skin-tone@2.0.0: resolution: {integrity: sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==} engines: {node: '>=8'} @@ -3075,6 +3157,10 @@ packages: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} + totalist@3.0.1: + resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} + engines: {node: '>=6'} + tough-cookie@6.0.0: resolution: {integrity: sha512-kXuRi1mtaKMrsLUxz3sQYvVl37B0Ns6MzfrtV5DvJceE9bPyspOqk9xxv7XbZWcfLWbFmm997vl83qUWVJA64w==} engines: {node: '>=16'} @@ -3124,9 +3210,6 @@ packages: undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - undici-types@7.16.0: - resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} - unicode-emoji-modifier-base@1.0.0: resolution: {integrity: sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==} engines: {node: '>=4'} @@ -3238,7 +3321,7 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: - '@types/node': ^20.19.0 || >=22.12.0 + '@types/node': 20.19.43 jiti: '>=1.21.0' less: ^4.0.0 lightningcss: ^1.21.0 @@ -3295,7 +3378,7 @@ packages: peerDependencies: '@edge-runtime/vm': '*' '@types/debug': ^4.1.12 - '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 + '@types/node': 20.19.43 '@vitest/browser-playwright': 4.0.4 '@vitest/browser-preview': 4.0.4 '@vitest/browser-webdriverio': 4.0.4 @@ -3719,7 +3802,7 @@ snapshots: dependencies: '@changesets/types': 6.1.0 - '@changesets/cli@2.29.8(@types/node@24.9.1)': + '@changesets/cli@2.29.8(@types/node@20.19.43)': dependencies: '@changesets/apply-release-plan': 7.0.14 '@changesets/assemble-release-plan': 6.0.9 @@ -3735,7 +3818,7 @@ snapshots: '@changesets/should-skip-package': 0.1.2 '@changesets/types': 6.1.0 '@changesets/write': 0.4.0 - '@inquirer/external-editor': 1.0.3(@types/node@24.9.1) + '@inquirer/external-editor': 1.0.3(@types/node@20.19.43) '@manypkg/get-packages': 1.1.3 ansi-colors: 4.1.3 ci-info: 3.9.0 @@ -3837,11 +3920,11 @@ snapshots: '@colors/colors@1.5.0': optional: true - '@commitlint/cli@20.1.0(@types/node@24.9.1)(typescript@5.9.3)': + '@commitlint/cli@20.1.0(@types/node@20.19.43)(typescript@5.9.3)': dependencies: '@commitlint/format': 20.0.0 '@commitlint/lint': 20.0.0 - '@commitlint/load': 20.1.0(@types/node@24.9.1)(typescript@5.9.3) + '@commitlint/load': 20.1.0(@types/node@20.19.43)(typescript@5.9.3) '@commitlint/read': 20.0.0 '@commitlint/types': 20.0.0 tinyexec: 1.2.4 @@ -3888,7 +3971,7 @@ snapshots: '@commitlint/rules': 20.0.0 '@commitlint/types': 20.0.0 - '@commitlint/load@20.1.0(@types/node@24.9.1)(typescript@5.9.3)': + '@commitlint/load@20.1.0(@types/node@20.19.43)(typescript@5.9.3)': dependencies: '@commitlint/config-validator': 20.0.0 '@commitlint/execute-rule': 20.0.0 @@ -3896,7 +3979,7 @@ snapshots: '@commitlint/types': 20.0.0 chalk: 5.6.2 cosmiconfig: 9.0.0(typescript@5.9.3) - cosmiconfig-typescript-loader: 6.2.0(@types/node@24.9.1)(cosmiconfig@9.0.0(typescript@5.9.3))(typescript@5.9.3) + cosmiconfig-typescript-loader: 6.2.0(@types/node@20.19.43)(cosmiconfig@9.0.0(typescript@5.9.3))(typescript@5.9.3) lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 lodash.uniq: 4.5.0 @@ -4163,12 +4246,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@inquirer/external-editor@1.0.3(@types/node@24.9.1)': + '@inquirer/external-editor@1.0.3(@types/node@20.19.43)': dependencies: chardet: 2.1.1 iconv-lite: 0.7.1 optionalDependencies: - '@types/node': 24.9.1 + '@types/node': 20.19.43 '@isaacs/balanced-match@4.0.1': {} @@ -4211,7 +4294,7 @@ snapshots: '@manypkg/find-root@1.1.0': dependencies: '@babel/runtime': 7.28.4 - '@types/node': 12.20.55 + '@types/node': 20.19.43 find-up: 4.1.0 fs-extra: 8.1.0 @@ -4224,23 +4307,23 @@ snapshots: globby: 11.1.0 read-yaml-file: 1.1.0 - '@microsoft/api-extractor-model@7.31.3(@types/node@24.9.1)': + '@microsoft/api-extractor-model@7.31.3(@types/node@20.19.43)': dependencies: '@microsoft/tsdoc': 0.15.1 '@microsoft/tsdoc-config': 0.17.1 - '@rushstack/node-core-library': 5.18.0(@types/node@24.9.1) + '@rushstack/node-core-library': 5.18.0(@types/node@20.19.43) transitivePeerDependencies: - '@types/node' - '@microsoft/api-extractor@7.53.3(@types/node@24.9.1)': + '@microsoft/api-extractor@7.53.3(@types/node@20.19.43)': dependencies: - '@microsoft/api-extractor-model': 7.31.3(@types/node@24.9.1) + '@microsoft/api-extractor-model': 7.31.3(@types/node@20.19.43) '@microsoft/tsdoc': 0.15.1 '@microsoft/tsdoc-config': 0.17.1 - '@rushstack/node-core-library': 5.18.0(@types/node@24.9.1) + '@rushstack/node-core-library': 5.18.0(@types/node@20.19.43) '@rushstack/rig-package': 0.6.0 - '@rushstack/terminal': 0.19.3(@types/node@24.9.1) - '@rushstack/ts-command-line': 5.1.3(@types/node@24.9.1) + '@rushstack/terminal': 0.19.3(@types/node@20.19.43) + '@rushstack/ts-command-line': 5.1.3(@types/node@20.19.43) lodash: 4.17.21 minimatch: 10.0.3 resolve: 1.22.11 @@ -4339,6 +4422,8 @@ snapshots: '@pkgr/core@0.2.9': {} + '@polka/url@1.0.0-next.29': {} + '@publint/pack@0.1.6': dependencies: tinyexec: 1.2.4 @@ -4419,7 +4504,7 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.52.5': optional: true - '@rushstack/node-core-library@5.18.0(@types/node@24.9.1)': + '@rushstack/node-core-library@5.18.0(@types/node@20.19.43)': dependencies: ajv: 8.13.0 ajv-draft-04: 1.0.0(ajv@8.13.0) @@ -4430,28 +4515,28 @@ snapshots: resolve: 1.22.11 semver: 7.5.4 optionalDependencies: - '@types/node': 24.9.1 + '@types/node': 20.19.43 - '@rushstack/problem-matcher@0.1.1(@types/node@24.9.1)': + '@rushstack/problem-matcher@0.1.1(@types/node@20.19.43)': optionalDependencies: - '@types/node': 24.9.1 + '@types/node': 20.19.43 '@rushstack/rig-package@0.6.0': dependencies: resolve: 1.22.11 strip-json-comments: 3.1.1 - '@rushstack/terminal@0.19.3(@types/node@24.9.1)': + '@rushstack/terminal@0.19.3(@types/node@20.19.43)': dependencies: - '@rushstack/node-core-library': 5.18.0(@types/node@24.9.1) - '@rushstack/problem-matcher': 0.1.1(@types/node@24.9.1) + '@rushstack/node-core-library': 5.18.0(@types/node@20.19.43) + '@rushstack/problem-matcher': 0.1.1(@types/node@20.19.43) supports-color: 8.1.1 optionalDependencies: - '@types/node': 24.9.1 + '@types/node': 20.19.43 - '@rushstack/ts-command-line@5.1.3(@types/node@24.9.1)': + '@rushstack/ts-command-line@5.1.3(@types/node@20.19.43)': dependencies: - '@rushstack/terminal': 0.19.3(@types/node@24.9.1) + '@rushstack/terminal': 0.19.3(@types/node@20.19.43) '@types/argparse': 1.0.38 argparse: 1.0.10 string-argv: 0.3.2 @@ -4509,7 +4594,7 @@ snapshots: '@types/conventional-commits-parser@5.0.2': dependencies: - '@types/node': 24.9.1 + '@types/node': 20.19.43 '@types/deep-eql@4.0.2': {} @@ -4534,16 +4619,10 @@ snapshots: '@types/mdurl@2.0.0': {} - '@types/node@12.20.55': {} - - '@types/node@20.19.23': + '@types/node@20.19.43': dependencies: undici-types: 6.21.0 - '@types/node@24.9.1': - dependencies: - undici-types: 7.16.0 - '@types/unist@3.0.3': {} '@types/web-bluetooth@0.0.21': {} @@ -4645,25 +4724,55 @@ snapshots: '@ungap/structured-clone@1.3.0': {} - '@vitejs/plugin-vue-jsx@5.1.1(vite@7.3.6(@types/node@24.9.1)(jiti@2.6.1)(lightningcss@1.33.0)(sass@1.93.2)(yaml@2.8.1))(vue@3.5.40(typescript@5.9.3))': + '@vitejs/plugin-vue-jsx@5.1.1(vite@7.3.6(@types/node@20.19.43)(jiti@2.6.1)(lightningcss@1.33.0)(sass@1.93.2)(yaml@2.8.1))(vue@3.5.40(typescript@5.9.3))': dependencies: '@babel/core': 7.28.5 '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.5) '@babel/plugin-transform-typescript': 7.28.5(@babel/core@7.28.5) '@rolldown/pluginutils': 1.0.1 '@vue/babel-plugin-jsx': 1.5.0(@babel/core@7.28.5) - vite: 7.3.6(@types/node@24.9.1)(jiti@2.6.1)(lightningcss@1.33.0)(sass@1.93.2)(yaml@2.8.1) + vite: 7.3.6(@types/node@20.19.43)(jiti@2.6.1)(lightningcss@1.33.0)(sass@1.93.2)(yaml@2.8.1) vue: 3.5.40(typescript@5.9.3) transitivePeerDependencies: - supports-color - '@vitejs/plugin-vue@6.0.8(vite@7.3.6(@types/node@24.9.1)(jiti@2.6.1)(lightningcss@1.33.0)(sass@1.93.2)(yaml@2.8.1))(vue@3.5.40(typescript@5.9.3))': + '@vitejs/plugin-vue@6.0.8(vite@7.3.6(@types/node@20.19.43)(jiti@2.6.1)(lightningcss@1.33.0)(sass@1.93.2)(yaml@2.8.1))(vue@3.5.40(typescript@5.9.3))': dependencies: '@rolldown/pluginutils': 1.0.1 - vite: 7.3.6(@types/node@24.9.1)(jiti@2.6.1)(lightningcss@1.33.0)(sass@1.93.2)(yaml@2.8.1) + vite: 7.3.6(@types/node@20.19.43)(jiti@2.6.1)(lightningcss@1.33.0)(sass@1.93.2)(yaml@2.8.1) vue: 3.5.40(typescript@5.9.3) - '@vitest/coverage-v8@4.0.4(vitest@4.0.4(@types/node@24.9.1)(happy-dom@20.0.8)(jiti@2.6.1)(jsdom@27.0.1(postcss@8.5.23))(lightningcss@1.33.0)(sass@1.93.2)(yaml@2.8.1))': + '@vitest/browser-playwright@4.0.4(playwright@1.62.1)(vite@7.3.6(@types/node@20.19.43)(jiti@2.6.1)(lightningcss@1.33.0)(sass@1.93.2)(yaml@2.8.1))(vitest@4.0.4)': + dependencies: + '@vitest/browser': 4.0.4(vite@7.3.6(@types/node@20.19.43)(jiti@2.6.1)(lightningcss@1.33.0)(sass@1.93.2)(yaml@2.8.1))(vitest@4.0.4) + '@vitest/mocker': 4.0.4(vite@7.3.6(@types/node@20.19.43)(jiti@2.6.1)(lightningcss@1.33.0)(sass@1.93.2)(yaml@2.8.1)) + playwright: 1.62.1 + tinyrainbow: 3.0.3 + vitest: 4.0.4(@types/node@20.19.43)(@vitest/browser-playwright@4.0.4)(happy-dom@20.0.8)(jiti@2.6.1)(jsdom@27.0.1(postcss@8.5.23))(lightningcss@1.33.0)(sass@1.93.2)(yaml@2.8.1) + transitivePeerDependencies: + - bufferutil + - msw + - utf-8-validate + - vite + + '@vitest/browser@4.0.4(vite@7.3.6(@types/node@20.19.43)(jiti@2.6.1)(lightningcss@1.33.0)(sass@1.93.2)(yaml@2.8.1))(vitest@4.0.4)': + dependencies: + '@vitest/mocker': 4.0.4(vite@7.3.6(@types/node@20.19.43)(jiti@2.6.1)(lightningcss@1.33.0)(sass@1.93.2)(yaml@2.8.1)) + '@vitest/utils': 4.0.4 + magic-string: 0.30.21 + pixelmatch: 7.1.0 + pngjs: 7.0.0 + sirv: 3.0.2 + tinyrainbow: 3.0.3 + vitest: 4.0.4(@types/node@20.19.43)(@vitest/browser-playwright@4.0.4)(happy-dom@20.0.8)(jiti@2.6.1)(jsdom@27.0.1(postcss@8.5.23))(lightningcss@1.33.0)(sass@1.93.2)(yaml@2.8.1) + ws: 8.18.3 + transitivePeerDependencies: + - bufferutil + - msw + - utf-8-validate + - vite + + '@vitest/coverage-v8@4.0.4(@vitest/browser@4.0.4(vite@7.3.6(@types/node@20.19.43)(jiti@2.6.1)(lightningcss@1.33.0)(sass@1.93.2)(yaml@2.8.1))(vitest@4.0.4))(vitest@4.0.4)': dependencies: '@bcoe/v8-coverage': 1.0.2 '@vitest/utils': 4.0.4 @@ -4676,7 +4785,9 @@ snapshots: magicast: 0.3.5 std-env: 3.10.0 tinyrainbow: 3.0.3 - vitest: 4.0.4(@types/node@24.9.1)(happy-dom@20.0.8)(jiti@2.6.1)(jsdom@27.0.1(postcss@8.5.23))(lightningcss@1.33.0)(sass@1.93.2)(yaml@2.8.1) + vitest: 4.0.4(@types/node@20.19.43)(@vitest/browser-playwright@4.0.4)(happy-dom@20.0.8)(jiti@2.6.1)(jsdom@27.0.1(postcss@8.5.23))(lightningcss@1.33.0)(sass@1.93.2)(yaml@2.8.1) + optionalDependencies: + '@vitest/browser': 4.0.4(vite@7.3.6(@types/node@20.19.43)(jiti@2.6.1)(lightningcss@1.33.0)(sass@1.93.2)(yaml@2.8.1))(vitest@4.0.4) transitivePeerDependencies: - supports-color @@ -4689,13 +4800,13 @@ snapshots: chai: 6.2.0 tinyrainbow: 3.0.3 - '@vitest/mocker@4.0.4(vite@7.3.6(@types/node@24.9.1)(jiti@2.6.1)(lightningcss@1.33.0)(sass@1.93.2)(yaml@2.8.1))': + '@vitest/mocker@4.0.4(vite@7.3.6(@types/node@20.19.43)(jiti@2.6.1)(lightningcss@1.33.0)(sass@1.93.2)(yaml@2.8.1))': dependencies: '@vitest/spy': 4.0.4 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 7.3.6(@types/node@24.9.1)(jiti@2.6.1)(lightningcss@1.33.0)(sass@1.93.2)(yaml@2.8.1) + vite: 7.3.6(@types/node@20.19.43)(jiti@2.6.1)(lightningcss@1.33.0)(sass@1.93.2)(yaml@2.8.1) '@vitest/pretty-format@4.0.4': dependencies: @@ -5152,9 +5263,9 @@ snapshots: convert-source-map@2.0.0: {} - cosmiconfig-typescript-loader@6.2.0(@types/node@24.9.1)(cosmiconfig@9.0.0(typescript@5.9.3))(typescript@5.9.3): + cosmiconfig-typescript-loader@6.2.0(@types/node@20.19.43)(cosmiconfig@9.0.0(typescript@5.9.3))(typescript@5.9.3): dependencies: - '@types/node': 24.9.1 + '@types/node': 20.19.43 cosmiconfig: 9.0.0(typescript@5.9.3) jiti: 2.6.1 typescript: 5.9.3 @@ -5497,6 +5608,9 @@ snapshots: jsonfile: 4.0.0 universalify: 0.1.2 + fsevents@2.3.2: + optional: true + fsevents@2.3.3: optional: true @@ -5556,7 +5670,7 @@ snapshots: happy-dom@20.0.8: dependencies: - '@types/node': 20.19.23 + '@types/node': 20.19.43 '@types/whatwg-mimetype': 3.0.2 whatwg-mimetype: 3.0.0 @@ -6033,6 +6147,8 @@ snapshots: mri@1.2.0: {} + mrmime@2.0.1: {} + ms@2.1.3: {} muggle-string@0.4.1: {} @@ -6188,6 +6304,10 @@ snapshots: pify@4.0.1: {} + pixelmatch@7.1.0: + dependencies: + pngjs: 7.0.0 + pkg-types@1.3.1: dependencies: confbox: 0.1.8 @@ -6200,6 +6320,16 @@ snapshots: exsolve: 1.0.7 pathe: 2.0.3 + playwright-core@1.62.1: {} + + playwright@1.62.1: + dependencies: + playwright-core: 1.62.1 + optionalDependencies: + fsevents: 2.3.2 + + pngjs@7.0.0: {} + postcss-selector-parser@6.1.2: dependencies: cssesc: 3.0.0 @@ -6361,6 +6491,12 @@ snapshots: signal-exit@4.1.0: {} + sirv@3.0.2: + dependencies: + '@polka/url': 1.0.0-next.29 + mrmime: 2.0.1 + totalist: 3.0.1 + skin-tone@2.0.0: dependencies: unicode-emoji-modifier-base: 1.0.0 @@ -6493,6 +6629,8 @@ snapshots: dependencies: is-number: 7.0.0 + totalist@3.0.1: {} + tough-cookie@6.0.0: dependencies: tldts: 7.0.17 @@ -6532,8 +6670,6 @@ snapshots: undici-types@6.21.0: {} - undici-types@7.16.0: {} - unicode-emoji-modifier-base@1.0.0: {} unicorn-magic@0.1.0: {} @@ -6629,9 +6765,9 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 - vite-plugin-dts@4.5.4(@types/node@24.9.1)(rollup@4.52.5)(typescript@5.9.3)(vite@7.3.6(@types/node@24.9.1)(jiti@2.6.1)(lightningcss@1.33.0)(sass@1.93.2)(yaml@2.8.1)): + vite-plugin-dts@4.5.4(@types/node@20.19.43)(rollup@4.52.5)(typescript@5.9.3)(vite@7.3.6(@types/node@20.19.43)(jiti@2.6.1)(lightningcss@1.33.0)(sass@1.93.2)(yaml@2.8.1)): dependencies: - '@microsoft/api-extractor': 7.53.3(@types/node@24.9.1) + '@microsoft/api-extractor': 7.53.3(@types/node@20.19.43) '@rollup/pluginutils': 5.3.0(rollup@4.52.5) '@volar/typescript': 2.4.23 '@vue/language-core': 2.2.0(typescript@5.9.3) @@ -6642,13 +6778,13 @@ snapshots: magic-string: 0.30.21 typescript: 5.9.3 optionalDependencies: - vite: 7.3.6(@types/node@24.9.1)(jiti@2.6.1)(lightningcss@1.33.0)(sass@1.93.2)(yaml@2.8.1) + vite: 7.3.6(@types/node@20.19.43)(jiti@2.6.1)(lightningcss@1.33.0)(sass@1.93.2)(yaml@2.8.1) transitivePeerDependencies: - '@types/node' - rollup - supports-color - vite@7.3.6(@types/node@24.9.1)(jiti@2.6.1)(lightningcss@1.33.0)(sass@1.93.2)(yaml@2.8.1): + vite@7.3.6(@types/node@20.19.43)(jiti@2.6.1)(lightningcss@1.33.0)(sass@1.93.2)(yaml@2.8.1): dependencies: esbuild: 0.28.1 fdir: 6.5.0(picomatch@4.0.5) @@ -6657,14 +6793,14 @@ snapshots: rollup: 4.52.5 tinyglobby: 0.2.17 optionalDependencies: - '@types/node': 24.9.1 + '@types/node': 20.19.43 fsevents: 2.3.3 jiti: 2.6.1 lightningcss: 1.33.0 sass: 1.93.2 yaml: 2.8.1 - vitepress@2.0.0-alpha.15(@types/node@24.9.1)(async-validator@4.2.5)(jiti@2.6.1)(lightningcss@1.33.0)(postcss@8.5.23)(sass@1.93.2)(typescript@5.9.3)(yaml@2.8.1): + vitepress@2.0.0-alpha.15(@types/node@20.19.43)(async-validator@4.2.5)(jiti@2.6.1)(lightningcss@1.33.0)(postcss@8.5.23)(sass@1.93.2)(typescript@5.9.3)(yaml@2.8.1): dependencies: '@docsearch/css': 4.6.3 '@docsearch/js': 4.6.3 @@ -6673,7 +6809,7 @@ snapshots: '@shikijs/transformers': 3.23.0 '@shikijs/types': 3.23.0 '@types/markdown-it': 14.1.2 - '@vitejs/plugin-vue': 6.0.8(vite@7.3.6(@types/node@24.9.1)(jiti@2.6.1)(lightningcss@1.33.0)(sass@1.93.2)(yaml@2.8.1))(vue@3.5.40(typescript@5.9.3)) + '@vitejs/plugin-vue': 6.0.8(vite@7.3.6(@types/node@20.19.43)(jiti@2.6.1)(lightningcss@1.33.0)(sass@1.93.2)(yaml@2.8.1))(vue@3.5.40(typescript@5.9.3)) '@vue/devtools-api': 8.2.1 '@vue/shared': 3.5.40 '@vueuse/core': 14.3.0(vue@3.5.40(typescript@5.9.3)) @@ -6682,7 +6818,7 @@ snapshots: mark.js: 8.11.1 minisearch: 7.2.0 shiki: 3.23.0 - vite: 7.3.6(@types/node@24.9.1)(jiti@2.6.1)(lightningcss@1.33.0)(sass@1.93.2)(yaml@2.8.1) + vite: 7.3.6(@types/node@20.19.43)(jiti@2.6.1)(lightningcss@1.33.0)(sass@1.93.2)(yaml@2.8.1) vue: 3.5.40(typescript@5.9.3) optionalDependencies: postcss: 8.5.23 @@ -6711,10 +6847,10 @@ snapshots: - universal-cookie - yaml - vitest@4.0.4(@types/node@24.9.1)(happy-dom@20.0.8)(jiti@2.6.1)(jsdom@27.0.1(postcss@8.5.23))(lightningcss@1.33.0)(sass@1.93.2)(yaml@2.8.1): + vitest@4.0.4(@types/node@20.19.43)(@vitest/browser-playwright@4.0.4)(happy-dom@20.0.8)(jiti@2.6.1)(jsdom@27.0.1(postcss@8.5.23))(lightningcss@1.33.0)(sass@1.93.2)(yaml@2.8.1): dependencies: '@vitest/expect': 4.0.4 - '@vitest/mocker': 4.0.4(vite@7.3.6(@types/node@24.9.1)(jiti@2.6.1)(lightningcss@1.33.0)(sass@1.93.2)(yaml@2.8.1)) + '@vitest/mocker': 4.0.4(vite@7.3.6(@types/node@20.19.43)(jiti@2.6.1)(lightningcss@1.33.0)(sass@1.93.2)(yaml@2.8.1)) '@vitest/pretty-format': 4.0.4 '@vitest/runner': 4.0.4 '@vitest/snapshot': 4.0.4 @@ -6731,10 +6867,11 @@ snapshots: tinyexec: 0.3.2 tinyglobby: 0.2.17 tinyrainbow: 3.0.3 - vite: 7.3.6(@types/node@24.9.1)(jiti@2.6.1)(lightningcss@1.33.0)(sass@1.93.2)(yaml@2.8.1) + vite: 7.3.6(@types/node@20.19.43)(jiti@2.6.1)(lightningcss@1.33.0)(sass@1.93.2)(yaml@2.8.1) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 24.9.1 + '@types/node': 20.19.43 + '@vitest/browser-playwright': 4.0.4(playwright@1.62.1)(vite@7.3.6(@types/node@20.19.43)(jiti@2.6.1)(lightningcss@1.33.0)(sass@1.93.2)(yaml@2.8.1))(vitest@4.0.4) happy-dom: 20.0.8 jsdom: 27.0.1(postcss@8.5.23) transitivePeerDependencies: diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 72bdb80..fed1ebb 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,3 +1,5 @@ packages: - - 'packages/**' # 存放编写的组件 - - play \ No newline at end of file + - 'packages/**' + - 'apps/**' + - 'fixtures/acp-agents' + - 'play' diff --git a/test/contract/project-boundary.contract.spec.ts b/test/contract/project-boundary.contract.spec.ts new file mode 100644 index 0000000..f4a9136 --- /dev/null +++ b/test/contract/project-boundary.contract.spec.ts @@ -0,0 +1,7 @@ +import { describe, expect, it } from 'vitest' + +describe('contract test project boundary', () => { + it('runs independently in Node', () => { + expect(typeof process.versions.node).toBe('string') + }) +}) diff --git a/test/replay/project-boundary.replay.spec.ts b/test/replay/project-boundary.replay.spec.ts new file mode 100644 index 0000000..5b9cfac --- /dev/null +++ b/test/replay/project-boundary.replay.spec.ts @@ -0,0 +1,7 @@ +import { describe, expect, it } from 'vitest' + +describe('replay test project boundary', () => { + it('runs independently in Node', () => { + expect(typeof process.versions.node).toBe('string') + }) +}) diff --git a/test/repository/repository-boundary.spec.ts b/test/repository/repository-boundary.spec.ts new file mode 100644 index 0000000..eb2a489 --- /dev/null +++ b/test/repository/repository-boundary.spec.ts @@ -0,0 +1,117 @@ +import { readFileSync } from 'node:fs' +import { dirname, resolve } from 'node:path' +import { fileURLToPath } from 'node:url' +import { describe, expect, it } from 'vitest' + +interface PackageManifest { + name: string + private?: boolean + dependencies?: Record + devDependencies?: Record + peerDependencies?: Record + scripts?: Record +} + +const repositoryRoot = resolve(dirname(fileURLToPath(import.meta.url)), '../..') + +const publicPackages = [ + ['packages/components', 'axis-ui'], + ['packages/theme-chalk', '@axis-ui/theme-chalk'], + ['packages/utils', '@axis-ui/utils'], +] as const + +const privateDevKitPackages = [ + ['packages/acp-core', '@axis-ui/acp-core'], + ['packages/acp-harness', '@axis-ui/acp-harness'], + ['packages/acp-cli', '@axis-ui/acp-cli'], + ['apps/acp-devtools', '@axis-ui/acp-devtools'], + ['fixtures/acp-agents', '@axis-ui/acp-fixture-agents'], +] as const + +function readText(path: string): string { + return readFileSync(resolve(repositoryRoot, path), 'utf8') +} + +function readJson(path: string): T { + return JSON.parse(readText(path)) as T +} + +function readManifest(path: string): PackageManifest { + return readJson(`${path}/package.json`) +} + +describe('repository and release boundaries', () => { + it('uses only the precise workspace roots from the ACP plan', () => { + const entries = [ + ...readText('pnpm-workspace.yaml').matchAll(/- '([^']+)'/g), + ] + .map(match => match[1]) + .sort() + + expect(entries).toEqual( + ['./apps/**', './fixtures/acp-agents', './packages/**', './play'].map( + entry => entry.replace(/^\.\//, '') + ) + ) + }) + + it('keeps the three existing public package names unchanged', () => { + for (const [path, expectedName] of publicPackages) { + const manifest = readManifest(path) + + expect(manifest.name).toBe(expectedName) + expect(manifest.private).not.toBe(true) + } + }) + + it('marks every ACP workspace package as private', () => { + for (const [path, expectedName] of privateDevKitPackages) { + const manifest = readManifest(path) + + expect(manifest.name).toBe(expectedName) + expect(manifest.private).toBe(true) + } + }) + + it('prevents public packages from depending on private ACP packages', () => { + for (const [path] of publicPackages) { + const manifest = readManifest(path) + const dependencies = { + ...manifest.dependencies, + ...manifest.devDependencies, + ...manifest.peerDependencies, + } + + expect(Object.keys(dependencies)).not.toContainEqual( + expect.stringMatching(/^@axis-ui\/acp-/) + ) + } + }) + + it('builds all workspaces but publish-checks and releases an allowlist', () => { + const root = readJson('package.json') + const buildAll = root.scripts?.['build:all'] ?? '' + const checkPublish = root.scripts?.['check:publish'] ?? '' + const releasePackages = root.scripts?.['release:packages'] ?? '' + + expect(buildAll).toContain('--filter "./packages/**"') + expect(buildAll).toContain('--filter "./apps/**"') + expect(buildAll).toContain('--filter "./fixtures/acp-agents"') + + for (const [, packageName] of publicPackages) { + expect(checkPublish).toContain(`--filter ${packageName}`) + expect(releasePackages).toContain(`--filter ${packageName}`) + } + + expect(checkPublish).not.toContain('--filter "./packages/**"') + expect(releasePackages).not.toContain('pnpm -r publish') + }) + + it('disables Changesets versioning and tags for private packages', () => { + const changesets = readJson<{ privatePackages?: boolean }>( + '.changeset/config.json' + ) + + expect(changesets.privatePackages).toBe(false) + }) +}) diff --git a/test/scenario/project-boundary.scenario.spec.ts b/test/scenario/project-boundary.scenario.spec.ts new file mode 100644 index 0000000..5f977b2 --- /dev/null +++ b/test/scenario/project-boundary.scenario.spec.ts @@ -0,0 +1,7 @@ +import { describe, expect, it } from 'vitest' + +describe('scenario test project boundary', () => { + it('runs independently in Node', () => { + expect(typeof process.versions.node).toBe('string') + }) +}) diff --git a/test/security/project-boundary.security.spec.ts b/test/security/project-boundary.security.spec.ts new file mode 100644 index 0000000..29b28a7 --- /dev/null +++ b/test/security/project-boundary.security.spec.ts @@ -0,0 +1,7 @@ +import { describe, expect, it } from 'vitest' + +describe('security test project boundary', () => { + it('runs independently in Node', () => { + expect(typeof process.versions.node).toBe('string') + }) +}) diff --git a/tsconfig.json b/tsconfig.json index bd7b3f0..f55cdef 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -39,6 +39,11 @@ "**/__tests__", "dist/**", "docs/**", + "apps/acp-devtools/**", + "fixtures/acp-agents/**", + "packages/acp-core/**", + "packages/acp-harness/**", + "packages/acp-cli/**", "**/dist/**" ] } diff --git a/tsconfig.node.json b/tsconfig.node.json new file mode 100644 index 0000000..b7c45ad --- /dev/null +++ b/tsconfig.node.json @@ -0,0 +1,12 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "target": "ES2022", + "lib": ["ES2022"], + "module": "NodeNext", + "moduleResolution": "NodeNext", + "types": ["node"], + "noEmit": true + }, + "exclude": ["node_modules", "**/dist/**"] +} diff --git a/vitest.config.ts b/vitest.config.ts index 75378b7..5f648a7 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -1,23 +1,94 @@ -import { defineConfig } from 'vitest/config' -import { resolve } from 'path' +import { playwright } from '@vitest/browser-playwright' import vue from '@vitejs/plugin-vue' import vueJsx from '@vitejs/plugin-vue-jsx' +import { resolve } from 'node:path' +import { defineConfig } from 'vitest/config' + +const aliases = { + '@': resolve(__dirname), + '@test': resolve(__dirname, './test'), + '@packages': resolve(__dirname, './packages'), + '@docs': resolve(__dirname, './docs'), + 'axis-ui': resolve(__dirname, './packages/components/index.ts'), + '@axis-ui/utils': resolve(__dirname, './packages/utils/index.ts'), + '@axis-ui/theme-chalk/src': resolve(__dirname, './packages/theme-chalk/src'), + '@axis-ui/theme-chalk': resolve(__dirname, './packages/theme-chalk'), +} export default defineConfig({ - // vueJsx 必须显式配置:esbuild 对 .tsx 的默认产物是 React JSX, - // 缺了它 virtual.tsx 这类 TSX 组件在运行时会抛 "React is not defined" - plugins: [vue(), vueJsx()], test: { - // 启用类似Jest的测试API - globals: true, - // 模拟DOM环境 - environment: 'happy-dom', - // 支持Vue文件 - include: ['**/*.{test,spec}.{js,ts,jsx,tsx}'], - exclude: ['node_modules', 'dist', '.output'], - // 测试设置文件 - setupFiles: ['./test/setup/index.ts'], - // 测试覆盖率配置 + projects: [ + { + plugins: [vue(), vueJsx()], + resolve: { alias: aliases }, + test: { + name: 'axis-ui', + environment: 'happy-dom', + include: ['test/components/**/*.spec.ts', 'test/utils/**/*.spec.ts'], + setupFiles: ['./test/setup/index.ts'], + }, + }, + { + test: { + name: 'acp-node', + environment: 'node', + include: [ + 'test/repository/**/*.spec.ts', + 'packages/{acp-core,acp-harness,acp-cli}/**/*.spec.ts', + 'fixtures/acp-agents/**/*.spec.ts', + ], + }, + }, + { + plugins: [vue()], + test: { + name: 'acp-devtools', + environment: 'happy-dom', + include: ['apps/acp-devtools/test/unit/**/*.spec.ts'], + }, + }, + { + test: { + name: 'contract', + environment: 'node', + include: ['test/contract/**/*.contract.spec.ts'], + }, + }, + { + test: { + name: 'scenario', + environment: 'node', + include: ['test/scenario/**/*.scenario.spec.ts'], + }, + }, + { + test: { + name: 'replay', + environment: 'node', + include: ['test/replay/**/*.replay.spec.ts'], + }, + }, + { + test: { + name: 'security', + environment: 'node', + include: ['test/security/**/*.security.spec.ts'], + }, + }, + { + plugins: [vue()], + test: { + name: 'browser', + include: ['apps/acp-devtools/test/browser/**/*.browser.spec.ts'], + browser: { + enabled: true, + headless: true, + provider: playwright(), + instances: [{ browser: 'chromium' }], + }, + }, + }, + ], coverage: { provider: 'v8', reporter: ['text', 'json', 'html', 'lcov'], @@ -35,8 +106,6 @@ export default defineConfig({ '**/*.scss', '**/*.css', ], - // 覆盖率阈值:按当前真实水平设定门槛,随测试补齐逐步上调 - // 注意:Vitest 的阈值直接写在 thresholds 下,嵌套 global 是 Jest 语法(会被当作 glob 忽略) thresholds: { statements: 78, branches: 48, @@ -44,29 +113,11 @@ export default defineConfig({ lines: 78, }, }, - // 快照测试配置 snapshotFormat: { escapeString: true, printBasicPrototype: false, }, - // 测试超时时间 testTimeout: 10000, - // 钩子超时时间 hookTimeout: 10000, }, - resolve: { - alias: { - '@': resolve(__dirname), - '@test': resolve(__dirname, './test'), - '@packages': resolve(__dirname, './packages'), - '@docs': resolve(__dirname, './docs'), - 'axis-ui': resolve(__dirname, './packages/components/index.ts'), - '@axis-ui/utils': resolve(__dirname, './packages/utils/index.ts'), - '@axis-ui/theme-chalk/src': resolve( - __dirname, - './packages/theme-chalk/src' - ), - '@axis-ui/theme-chalk': resolve(__dirname, './packages/theme-chalk'), - }, - }, }) From 4e2883e30f8936084a768a8ff579e58324f6b50e Mon Sep 17 00:00:00 2001 From: CalvinWade Date: Sun, 7 Jun 2026 10:53:00 +0800 Subject: [PATCH 02/20] feat: add safe ACP subprocess harness --- fixtures/acp-agents/bin/fixture-agent.mjs | 29 +++ fixtures/acp-agents/package.json | 6 + package.json | 3 +- packages/acp-harness/package.json | 8 +- packages/acp-harness/src/bridge/index.ts | 2 + .../acp-harness/src/bridge/local-bridge.ts | 193 ++++++++++++++++++ packages/acp-harness/src/bridge/messages.ts | 61 ++++++ packages/acp-harness/src/errors.ts | 10 + packages/acp-harness/src/harness.ts | 40 ++++ packages/acp-harness/src/index.ts | 9 +- packages/acp-harness/src/process-manager.ts | 141 +++++++++++++ packages/acp-harness/src/sdk-client.ts | 56 +++++ packages/acp-harness/src/target-registry.ts | 121 +++++++++++ packages/acp-harness/src/types.ts | 47 +++++ pnpm-lock.yaml | 36 +++- 15 files changed, 757 insertions(+), 5 deletions(-) create mode 100644 fixtures/acp-agents/bin/fixture-agent.mjs create mode 100644 packages/acp-harness/src/bridge/index.ts create mode 100644 packages/acp-harness/src/bridge/local-bridge.ts create mode 100644 packages/acp-harness/src/bridge/messages.ts create mode 100644 packages/acp-harness/src/errors.ts create mode 100644 packages/acp-harness/src/harness.ts create mode 100644 packages/acp-harness/src/process-manager.ts create mode 100644 packages/acp-harness/src/sdk-client.ts create mode 100644 packages/acp-harness/src/target-registry.ts create mode 100644 packages/acp-harness/src/types.ts diff --git a/fixtures/acp-agents/bin/fixture-agent.mjs b/fixtures/acp-agents/bin/fixture-agent.mjs new file mode 100644 index 0000000..8e50fd3 --- /dev/null +++ b/fixtures/acp-agents/bin/fixture-agent.mjs @@ -0,0 +1,29 @@ +#!/usr/bin/env node +import * as acp from '@agentclientprotocol/sdk' +import { Readable, Writable } from 'node:stream' + +const shouldCrashAfterInitialize = process.argv.includes( + '--crash-after-initialize' +) + +const app = acp + .agent({ name: 'axis-deterministic-fixture' }) + .onRequest(acp.methods.agent.initialize, () => { + if (shouldCrashAfterInitialize) setTimeout(() => process.exit(17), 25) + return { + protocolVersion: acp.PROTOCOL_VERSION, + agentCapabilities: { loadSession: false }, + agentInfo: { + name: 'axis-deterministic-fixture', + version: '0.0.0-gate-02', + }, + } + }) + +const stream = acp.ndJsonStream( + Writable.toWeb(process.stdout), + Readable.toWeb(process.stdin) +) + +const connection = app.connect(stream) +await connection.closed diff --git a/fixtures/acp-agents/package.json b/fixtures/acp-agents/package.json index 4be917a..5b9acb3 100644 --- a/fixtures/acp-agents/package.json +++ b/fixtures/acp-agents/package.json @@ -3,6 +3,9 @@ "version": "0.0.0", "private": true, "type": "module", + "bin": { + "axis-acp-fixture-agent": "./bin/fixture-agent.mjs" + }, "exports": { ".": { "types": "./dist/index.d.ts", @@ -12,5 +15,8 @@ "scripts": { "build": "tsc -p tsconfig.build.json", "type-check": "tsc --noEmit -p tsconfig.json" + }, + "dependencies": { + "@agentclientprotocol/sdk": "1.3.0" } } diff --git a/package.json b/package.json index b39f921..41ce209 100644 --- a/package.json +++ b/package.json @@ -49,11 +49,12 @@ "@eslint/js": "^9.38.0", "@eslint/json": "^0.13.2", "@iconify/json": "^2.2.403", + "@types/node": "^20.19.43", + "@types/ws": "8.18.1", "@vitejs/plugin-vue": "^6.0.1", "@vitejs/plugin-vue-jsx": "^5.1.1", "@vitest/browser-playwright": "4.0.4", "@vitest/coverage-v8": "^4.0.4", - "@types/node": "^20.19.43", "@vue/eslint-config-prettier": "^10.2.0", "@vue/eslint-config-typescript": "^14.6.0", "@vue/test-utils": "^2.4.6", diff --git a/packages/acp-harness/package.json b/packages/acp-harness/package.json index ece2b72..f983cd2 100644 --- a/packages/acp-harness/package.json +++ b/packages/acp-harness/package.json @@ -7,6 +7,10 @@ ".": { "types": "./dist/index.d.ts", "import": "./dist/index.js" + }, + "./bridge": { + "types": "./dist/bridge/index.d.ts", + "import": "./dist/bridge/index.js" } }, "scripts": { @@ -14,6 +18,8 @@ "type-check": "tsc --noEmit -p tsconfig.json" }, "dependencies": { - "@axis-ui/acp-core": "workspace:*" + "@agentclientprotocol/sdk": "1.3.0", + "@axis-ui/acp-core": "workspace:*", + "ws": "8.18.3" } } diff --git a/packages/acp-harness/src/bridge/index.ts b/packages/acp-harness/src/bridge/index.ts new file mode 100644 index 0000000..7e60ae9 --- /dev/null +++ b/packages/acp-harness/src/bridge/index.ts @@ -0,0 +1,2 @@ +export * from './local-bridge.js' +export * from './messages.js' diff --git a/packages/acp-harness/src/bridge/local-bridge.ts b/packages/acp-harness/src/bridge/local-bridge.ts new file mode 100644 index 0000000..a147a51 --- /dev/null +++ b/packages/acp-harness/src/bridge/local-bridge.ts @@ -0,0 +1,193 @@ +import { randomBytes, timingSafeEqual } from 'node:crypto' +import { createServer, type IncomingMessage, type Server } from 'node:http' +import { isIP } from 'node:net' +import { WebSocketServer, type WebSocket } from 'ws' +import { HarnessError } from '../errors.js' +import { parseBridgeMessage, type BridgeMessage } from './messages.js' + +export interface LocalBridgeOptions { + readonly host?: string + readonly port?: number + readonly allowedOrigins: readonly string[] + readonly maxConnections?: number + readonly maxMessageBytes?: number + readonly maxMessagesPerWindow?: number + readonly rateWindowMs?: number + readonly token?: string + readonly onMessage: (message: BridgeMessage) => Promise +} + +export interface LocalBridgeAddress { + readonly host: string + readonly port: number + readonly token: string + readonly url: string +} + +function isLoopbackHost(host: string): boolean { + return host === 'localhost' || host === '127.0.0.1' || host === '::1' +} + +function equalSecret(left: string, right: string): boolean { + const leftBuffer = Buffer.from(left) + const rightBuffer = Buffer.from(right) + return ( + leftBuffer.length === rightBuffer.length && + timingSafeEqual(leftBuffer, rightBuffer) + ) +} + +export class LocalBridge { + readonly token: string + private readonly host: string + private readonly port: number + private readonly maxConnections: number + private readonly maxMessagesPerWindow: number + private readonly rateWindowMs: number + private readonly sockets = new Set() + private readonly server: Server + private readonly webSockets: WebSocketServer + private address?: LocalBridgeAddress + + constructor(private readonly options: LocalBridgeOptions) { + this.host = options.host ?? '127.0.0.1' + this.port = options.port ?? 0 + this.maxConnections = options.maxConnections ?? 2 + this.maxMessagesPerWindow = options.maxMessagesPerWindow ?? 30 + this.rateWindowMs = options.rateWindowMs ?? 1_000 + this.token = options.token ?? randomBytes(32).toString('base64url') + + if (!isLoopbackHost(this.host)) { + throw new HarnessError( + `Bridge must bind to loopback, received ${this.host}`, + 'NON_LOOPBACK_BRIDGE' + ) + } + if (this.token.length < 32) { + throw new HarnessError('Bridge token is too short', 'WEAK_BRIDGE_TOKEN') + } + + this.server = createServer((_request, response) => { + response.writeHead(404).end() + }) + this.webSockets = new WebSocketServer({ + noServer: true, + maxPayload: options.maxMessageBytes ?? 256 * 1024, + }) + this.server.on('upgrade', (request, socket, head) => { + if ( + !this.authorizeUpgrade(request) || + this.sockets.size >= this.maxConnections + ) { + socket.write('HTTP/1.1 401 Unauthorized\r\nConnection: close\r\n\r\n') + socket.destroy() + return + } + this.webSockets.handleUpgrade(request, socket, head, webSocket => { + this.webSockets.emit('connection', webSocket, request) + }) + }) + this.webSockets.on('connection', socket => this.handleConnection(socket)) + } + + async start(): Promise { + if (this.address) return this.address + await new Promise((resolveListen, rejectListen) => { + this.server.once('error', rejectListen) + this.server.listen(this.port, this.host, () => { + this.server.off('error', rejectListen) + resolveListen() + }) + }) + const serverAddress = this.server.address() + if (!serverAddress || typeof serverAddress === 'string') { + throw new HarnessError( + 'Bridge did not expose a TCP address', + 'BRIDGE_BIND_FAILED' + ) + } + this.address = { + host: this.host, + port: serverAddress.port, + token: this.token, + url: `ws://${this.host}:${serverAddress.port}`, + } + return this.address + } + + async stop(): Promise { + for (const socket of this.sockets) socket.close(1001, 'Bridge stopping') + await new Promise(resolveClose => + this.webSockets.close(() => resolveClose()) + ) + if (this.server.listening) { + await new Promise((resolveClose, rejectClose) => + this.server.close(error => + error ? rejectClose(error) : resolveClose() + ) + ) + } + this.address = undefined + } + + private authorizeUpgrade(request: IncomingMessage): boolean { + const remoteAddress = request.socket.remoteAddress ?? '' + if (!this.isLoopbackAddress(remoteAddress)) return false + + const origin = request.headers.origin + if (!origin || !this.options.allowedOrigins.includes(origin)) return false + + const url = new URL(request.url ?? '/', 'http://127.0.0.1') + const presentedToken = url.searchParams.get('token') ?? '' + return equalSecret(presentedToken, this.token) + } + + private isLoopbackAddress(address: string): boolean { + if (address === '::1' || address === '127.0.0.1') return true + if (address.startsWith('::ffff:')) { + return address.slice('::ffff:'.length) === '127.0.0.1' + } + return isIP(address) === 4 && address.startsWith('127.') + } + + private handleConnection(socket: WebSocket): void { + this.sockets.add(socket) + const messageTimes: number[] = [] + socket.on('close', () => this.sockets.delete(socket)) + socket.on('message', async (data, isBinary) => { + const now = Date.now() + while ( + messageTimes[0] !== undefined && + now - messageTimes[0] > this.rateWindowMs + ) { + messageTimes.shift() + } + messageTimes.push(now) + if (messageTimes.length > this.maxMessagesPerWindow) { + socket.close(1008, 'Rate limit exceeded') + return + } + + if (isBinary) { + socket.close(1003, 'Binary messages are not supported') + return + } + + let requestId = 'unknown' + try { + const parsed = JSON.parse(data.toString()) as unknown + const message = parseBridgeMessage(parsed) + requestId = message.requestId + const result = await this.options.onMessage(message) + socket.send(JSON.stringify({ type: 'response', requestId, result })) + } catch (error) { + const code = + error instanceof HarnessError ? error.code : 'BRIDGE_FAILURE' + const message = error instanceof Error ? error.message : String(error) + socket.send( + JSON.stringify({ type: 'error', requestId, error: { code, message } }) + ) + } + }) + } +} diff --git a/packages/acp-harness/src/bridge/messages.ts b/packages/acp-harness/src/bridge/messages.ts new file mode 100644 index 0000000..7688114 --- /dev/null +++ b/packages/acp-harness/src/bridge/messages.ts @@ -0,0 +1,61 @@ +import { HarnessError } from '../errors.js' + +export type BridgeMessage = + | { + readonly type: 'target/start' + readonly requestId: string + readonly targetId: string + readonly workspaceRoot: string + } + | { + readonly type: 'target/stop' + readonly requestId: string + readonly targetHandleId: string + } + +function requireString(value: Record, key: string): string { + const field = value[key] + if (typeof field !== 'string' || field.length === 0) { + throw new HarnessError( + `Bridge field must be a string: ${key}`, + 'BAD_MESSAGE' + ) + } + return field +} + +export function parseBridgeMessage(input: unknown): BridgeMessage { + if (typeof input !== 'object' || input === null || Array.isArray(input)) { + throw new HarnessError('Bridge message must be an object', 'BAD_MESSAGE') + } + const value = input as Record + const type = requireString(value, 'type') + const requestId = requireString(value, 'requestId') + + if (type === 'target/start') { + const allowed = new Set(['type', 'requestId', 'targetId', 'workspaceRoot']) + if (Object.keys(value).some(key => !allowed.has(key))) { + throw new HarnessError('Unknown target/start field', 'BAD_MESSAGE') + } + return { + type, + requestId, + targetId: requireString(value, 'targetId'), + workspaceRoot: requireString(value, 'workspaceRoot'), + } + } + + if (type === 'target/stop') { + const allowed = new Set(['type', 'requestId', 'targetHandleId']) + if (Object.keys(value).some(key => !allowed.has(key))) { + throw new HarnessError('Unknown target/stop field', 'BAD_MESSAGE') + } + return { + type, + requestId, + targetHandleId: requireString(value, 'targetHandleId'), + } + } + + throw new HarnessError(`Unknown bridge message type: ${type}`, 'BAD_MESSAGE') +} diff --git a/packages/acp-harness/src/errors.ts b/packages/acp-harness/src/errors.ts new file mode 100644 index 0000000..9813c85 --- /dev/null +++ b/packages/acp-harness/src/errors.ts @@ -0,0 +1,10 @@ +export class HarnessError extends Error { + constructor( + message: string, + readonly code: string, + options?: ErrorOptions + ) { + super(message, options) + this.name = 'HarnessError' + } +} diff --git a/packages/acp-harness/src/harness.ts b/packages/acp-harness/src/harness.ts new file mode 100644 index 0000000..c0ec7af --- /dev/null +++ b/packages/acp-harness/src/harness.ts @@ -0,0 +1,40 @@ +import { ProcessManager } from './process-manager.js' +import { AcpSdkClient } from './sdk-client.js' +import { TargetRegistry } from './target-registry.js' +import type { + HarnessInitialization, + TargetHandle, + TargetStartRequest, +} from './types.js' + +export class AcpHarness { + constructor( + readonly registry: TargetRegistry, + readonly processes = new ProcessManager(), + private readonly sdk = new AcpSdkClient() + ) {} + + async startTarget(request: TargetStartRequest): Promise { + const resolved = await this.registry.resolve(request) + const target = this.processes.start(resolved) + this.sdk.connect(target) + return target + } + + async initialize(targetHandleId: string): Promise { + return { + targetHandleId, + response: await this.sdk.initialize(targetHandleId), + } + } + + async stopTarget(targetHandleId: string): Promise { + await this.processes.stop(targetHandleId) + this.sdk.close(targetHandleId) + } + + async dispose(): Promise { + for (const target of this.processes.list()) this.sdk.close(target.id) + await this.processes.stopAll() + } +} diff --git a/packages/acp-harness/src/index.ts b/packages/acp-harness/src/index.ts index 4d4e45d..ad1f977 100644 --- a/packages/acp-harness/src/index.ts +++ b/packages/acp-harness/src/index.ts @@ -1,2 +1,7 @@ -// Gate 01 establishes only the private package boundary. Harness behavior starts in Gate 02. -export {} +export * from './errors.js' +export * from './harness.js' +export * from './process-manager.js' +export * from './sdk-client.js' +export * from './target-registry.js' +export * from './types.js' +export * from './bridge/index.js' diff --git a/packages/acp-harness/src/process-manager.ts b/packages/acp-harness/src/process-manager.ts new file mode 100644 index 0000000..c44a4f3 --- /dev/null +++ b/packages/acp-harness/src/process-manager.ts @@ -0,0 +1,141 @@ +import { spawn, type ChildProcessWithoutNullStreams } from 'node:child_process' +import { randomUUID } from 'node:crypto' +import { HarnessError } from './errors.js' +import type { ResolvedTarget, TargetExit, TargetHandle } from './types.js' + +export interface ManagedTarget extends TargetHandle { + readonly child: ChildProcessWithoutNullStreams +} + +export interface ProcessManagerOptions { + readonly maxProcesses?: number + readonly gracefulShutdownMs?: number + readonly stderrLineLimit?: number +} + +export class ProcessManager { + private readonly processes = new Map() + private readonly perTargetCounts = new Map() + private readonly maxProcesses: number + private readonly gracefulShutdownMs: number + private readonly stderrLineLimit: number + + constructor(options: ProcessManagerOptions = {}) { + this.maxProcesses = options.maxProcesses ?? 4 + this.gracefulShutdownMs = options.gracefulShutdownMs ?? 1_500 + this.stderrLineLimit = options.stderrLineLimit ?? 200 + } + + list(): readonly TargetHandle[] { + return [...this.processes.values()] + } + + get(handleId: string): ManagedTarget { + const target = this.processes.get(handleId) + if (!target) { + throw new HarnessError( + `Unknown target handle: ${handleId}`, + 'UNKNOWN_TARGET_HANDLE' + ) + } + return target + } + + start(target: ResolvedTarget): ManagedTarget { + if (this.processes.size >= this.maxProcesses) { + throw new HarnessError( + `Global process limit reached (${this.maxProcesses})`, + 'GLOBAL_PROCESS_LIMIT' + ) + } + + const targetCount = this.perTargetCounts.get(target.definition.id) ?? 0 + if (targetCount >= target.definition.maxProcesses) { + throw new HarnessError( + `Process limit reached for target ${target.definition.id}`, + 'TARGET_PROCESS_LIMIT' + ) + } + + const child = spawn(target.command, target.args, { + cwd: target.cwd, + env: target.environment, + detached: process.platform !== 'win32', + shell: false, + stdio: ['pipe', 'pipe', 'pipe'], + windowsHide: true, + }) + const id = randomUUID() + const stderr: string[] = [] + child.stderr.setEncoding('utf8') + child.stderr.on('data', (chunk: string) => { + stderr.push(...chunk.split(/\r?\n/u).filter(Boolean)) + if (stderr.length > this.stderrLineLimit) { + stderr.splice(0, stderr.length - this.stderrLineLimit) + } + }) + + const exited = new Promise(resolveExit => { + child.once('exit', (code, signal) => { + resolveExit({ code, signal }) + this.processes.delete(id) + const count = this.perTargetCounts.get(target.definition.id) ?? 1 + if (count <= 1) this.perTargetCounts.delete(target.definition.id) + else this.perTargetCounts.set(target.definition.id, count - 1) + }) + }) + + const handle: ManagedTarget = { + id, + targetId: target.definition.id, + pid: child.pid ?? -1, + cwd: target.cwd, + child, + stderr, + exited, + } + this.processes.set(id, handle) + this.perTargetCounts.set(target.definition.id, targetCount + 1) + child.once('error', () => this.processes.delete(id)) + return handle + } + + async stop(handleId: string): Promise { + const target = this.get(handleId) + if (target.child.exitCode !== null || target.child.signalCode !== null) { + return target.exited + } + + this.signalTree(target.child, 'SIGTERM') + const graceful = await Promise.race([ + target.exited.then(exit => ({ exit })), + new Promise<{ timeout: true }>(resolveTimeout => + setTimeout( + () => resolveTimeout({ timeout: true }), + this.gracefulShutdownMs + ) + ), + ]) + if ('exit' in graceful) return graceful.exit + + this.signalTree(target.child, 'SIGKILL') + return target.exited + } + + async stopAll(): Promise { + await Promise.all([...this.processes.keys()].map(id => this.stop(id))) + } + + private signalTree( + child: ChildProcessWithoutNullStreams, + signal: NodeJS.Signals + ): void { + if (child.pid === undefined) return + try { + if (process.platform === 'win32') child.kill(signal) + else process.kill(-child.pid, signal) + } catch (error) { + if ((error as NodeJS.ErrnoException).code !== 'ESRCH') throw error + } + } +} diff --git a/packages/acp-harness/src/sdk-client.ts b/packages/acp-harness/src/sdk-client.ts new file mode 100644 index 0000000..cd6ec53 --- /dev/null +++ b/packages/acp-harness/src/sdk-client.ts @@ -0,0 +1,56 @@ +import { + PROTOCOL_VERSION, + client, + methods, + ndJsonStream, + type ClientConnection, + type InitializeResponse, +} from '@agentclientprotocol/sdk' +import { Readable, Writable } from 'node:stream' +import type { ManagedTarget } from './process-manager.js' + +export class AcpSdkClient { + private readonly connections = new Map() + + connect(target: ManagedTarget): ClientConnection { + const stream = ndJsonStream( + Writable.toWeb(target.child.stdin), + Readable.toWeb(target.child.stdout) + ) + const connection = client({ name: 'axis-acp-devkit' }) + .onRequest(methods.client.session.requestPermission, () => ({ + outcome: { outcome: 'cancelled' }, + })) + .onNotification(methods.client.session.update, () => undefined) + .connect(stream) + + this.connections.set(target.id, connection) + void target.exited.then(() => { + connection.close(new Error('Target process exited')) + this.connections.delete(target.id) + }) + return connection + } + + async initialize(targetHandleId: string): Promise { + const connection = this.get(targetHandleId) + return connection.agent.request(methods.agent.initialize, { + protocolVersion: PROTOCOL_VERSION, + clientCapabilities: {}, + }) + } + + close(targetHandleId: string): void { + const connection = this.connections.get(targetHandleId) + connection?.close() + this.connections.delete(targetHandleId) + } + + private get(targetHandleId: string): ClientConnection { + const connection = this.connections.get(targetHandleId) + if (!connection) { + throw new Error(`ACP connection is not open: ${targetHandleId}`) + } + return connection + } +} diff --git a/packages/acp-harness/src/target-registry.ts b/packages/acp-harness/src/target-registry.ts new file mode 100644 index 0000000..8f461f0 --- /dev/null +++ b/packages/acp-harness/src/target-registry.ts @@ -0,0 +1,121 @@ +import { realpath } from 'node:fs/promises' +import { isAbsolute, relative, resolve } from 'node:path' +import { HarnessError } from './errors.js' +import type { + ResolvedTarget, + TargetDefinition, + TargetStartRequest, +} from './types.js' + +function isInsideRoot(root: string, candidate: string): boolean { + const pathFromRoot = relative(root, candidate) + return ( + pathFromRoot === '' || + (!pathFromRoot.startsWith('..') && !isAbsolute(pathFromRoot)) + ) +} + +export class TargetRegistry { + private readonly definitions = new Map() + + private constructor( + private readonly allowedWorkspaceRoots: readonly string[] + ) {} + + static async create( + definitions: readonly TargetDefinition[], + allowedWorkspaceRoots: readonly string[] + ): Promise { + if (allowedWorkspaceRoots.length === 0) { + throw new HarnessError( + 'At least one allowed workspace root is required', + 'WORKSPACE_ROOTS_EMPTY' + ) + } + + const normalizedRoots = await Promise.all( + allowedWorkspaceRoots.map(async root => realpath(resolve(root))) + ) + const registry = new TargetRegistry(normalizedRoots) + for (const definition of definitions) registry.register(definition) + return registry + } + + list(): readonly TargetDefinition[] { + return [...this.definitions.values()] + } + + get(targetId: string): TargetDefinition { + const definition = this.definitions.get(targetId) + if (!definition) { + throw new HarnessError(`Unknown target ID: ${targetId}`, 'UNKNOWN_TARGET') + } + return definition + } + + async resolve(request: TargetStartRequest): Promise { + const definition = this.get(request.targetId) + const requestedArgs = request.args ?? [] + + for (const arg of requestedArgs) { + if (!definition.allowedArgs.includes(arg)) { + throw new HarnessError( + `Argument is not allowed for target ${definition.id}: ${arg}`, + 'ARGUMENT_NOT_ALLOWED' + ) + } + } + + const cwd = await realpath(resolve(request.workspaceRoot)) + if (!this.allowedWorkspaceRoots.some(root => isInsideRoot(root, cwd))) { + throw new HarnessError( + `Workspace is outside the allowed roots: ${cwd}`, + 'WORKSPACE_NOT_ALLOWED' + ) + } + + const environment: NodeJS.ProcessEnv = {} + for (const key of definition.environmentAllowlist) { + const value = request.environment?.[key] ?? process.env[key] + if (value !== undefined) environment[key] = value + } + for (const key of Object.keys(request.environment ?? {})) { + if (!definition.environmentAllowlist.includes(key)) { + throw new HarnessError( + `Environment variable is not allowed for target ${definition.id}: ${key}`, + 'ENVIRONMENT_NOT_ALLOWED' + ) + } + } + + return { + definition, + command: definition.command, + args: [...(definition.fixedArgs ?? []), ...requestedArgs], + cwd, + environment, + } + } + + private register(definition: TargetDefinition): void { + if (!definition.id || this.definitions.has(definition.id)) { + throw new HarnessError( + `Target ID must be non-empty and unique: ${definition.id}`, + 'INVALID_TARGET_DEFINITION' + ) + } + if (!isAbsolute(definition.command)) { + throw new HarnessError( + `Target command must be absolute: ${definition.command}`, + 'INVALID_TARGET_COMMAND' + ) + } + if (definition.maxProcesses < 1) { + throw new HarnessError( + `Target maxProcesses must be positive: ${definition.id}`, + 'INVALID_TARGET_LIMIT' + ) + } + this.definitions.set(definition.id, Object.freeze({ ...definition })) + } +} diff --git a/packages/acp-harness/src/types.ts b/packages/acp-harness/src/types.ts new file mode 100644 index 0000000..9dabde2 --- /dev/null +++ b/packages/acp-harness/src/types.ts @@ -0,0 +1,47 @@ +import type { InitializeResponse } from '@agentclientprotocol/sdk' + +export type ProtocolVersion = 'v1' + +export interface TargetDefinition { + readonly id: string + readonly command: string + readonly fixedArgs?: readonly string[] + readonly allowedArgs: readonly string[] + readonly environmentAllowlist: readonly string[] + readonly maxProcesses: number + readonly expectedProtocolVersion: ProtocolVersion +} + +export interface TargetStartRequest { + readonly targetId: string + readonly workspaceRoot: string + readonly args?: readonly string[] + readonly environment?: Readonly> +} + +export interface ResolvedTarget { + readonly definition: TargetDefinition + readonly command: string + readonly args: readonly string[] + readonly cwd: string + readonly environment: NodeJS.ProcessEnv +} + +export type TargetExit = { + readonly code: number | null + readonly signal: NodeJS.Signals | null +} + +export interface TargetHandle { + readonly id: string + readonly targetId: string + readonly pid: number + readonly cwd: string + readonly stderr: readonly string[] + readonly exited: Promise +} + +export interface HarnessInitialization { + readonly targetHandleId: string + readonly response: InitializeResponse +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 02cb767..3fd9dca 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -38,6 +38,9 @@ importers: '@types/node': specifier: 20.19.43 version: 20.19.43 + '@types/ws': + specifier: 8.18.1 + version: 8.18.1 '@vitejs/plugin-vue': specifier: ^6.0.1 version: 6.0.8(vite@7.3.6(@types/node@20.19.43)(jiti@2.6.1)(lightningcss@1.33.0)(sass@1.93.2)(yaml@2.8.1))(vue@3.5.40(typescript@5.9.3)) @@ -141,7 +144,11 @@ importers: specifier: ^3.5.22 version: 3.5.40(typescript@5.9.3) - fixtures/acp-agents: {} + fixtures/acp-agents: + dependencies: + '@agentclientprotocol/sdk': + specifier: 1.3.0 + version: 1.3.0(zod@4.4.3) packages/acp-cli: dependencies: @@ -156,9 +163,15 @@ importers: packages/acp-harness: dependencies: + '@agentclientprotocol/sdk': + specifier: 1.3.0 + version: 1.3.0(zod@4.4.3) '@axis-ui/acp-core': specifier: workspace:* version: link:../acp-core + ws: + specifier: 8.18.3 + version: 8.18.3 packages/components: dependencies: @@ -216,6 +229,11 @@ importers: packages: + '@agentclientprotocol/sdk@1.3.0': + resolution: {integrity: sha512-i3h/efaeuMUFAO1HSfo97QZQnnvMd7wWBYtBsdL6UMZg3a78sk3Ffya5Xu7C7tYsXomXoDXJBAzQF2PcFKAhIQ==} + peerDependencies: + zod: ^3.25.0 || ^4.0.0 + '@andrewbranch/untar.js@1.0.3': resolution: {integrity: sha512-Jh15/qVmrLGhkKJBdXlK1+9tY4lZruYjsgkDFj08ZmDiWVBLJcqkok7Z0/R0In+i1rScBpJlSvrTS2Lm41Pbnw==} @@ -1201,6 +1219,9 @@ packages: '@types/whatwg-mimetype@3.0.2': resolution: {integrity: sha512-c2AKvDT8ToxLIOUlN51gTiHXflsfIFisS4pO7pDPoKouJCESkhZnEy623gwP9laCy5lnLDAw1vAzu2vM2YLOrA==} + '@types/ws@8.18.1': + resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} + '@typescript-eslint/eslint-plugin@8.46.2': resolution: {integrity: sha512-ZGBMToy857/NIPaaCucIUQgqueOiq7HeAKkhlvqVV4lm089zUFW6ikRySx2v+cAhKeUCPuWVHeimyk6Dw1iY3w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -3547,11 +3568,18 @@ packages: resolution: {integrity: sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==} engines: {node: '>=12.20'} + zod@4.4.3: + resolution: {integrity: sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==} + zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} snapshots: + '@agentclientprotocol/sdk@1.3.0(zod@4.4.3)': + dependencies: + zod: 4.4.3 + '@andrewbranch/untar.js@1.0.3': {} '@antfu/install-pkg@1.1.0': @@ -4629,6 +4657,10 @@ snapshots: '@types/whatwg-mimetype@3.0.2': {} + '@types/ws@8.18.1': + dependencies: + '@types/node': 20.19.43 + '@typescript-eslint/eslint-plugin@8.46.2(@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.2 @@ -7014,4 +7046,6 @@ snapshots: yocto-queue@1.2.1: {} + zod@4.4.3: {} + zwitch@2.0.4: {} From dedfd387122980e4cb12c0a01d448adc4a525b00 Mon Sep 17 00:00:00 2001 From: CalvinWade Date: Mon, 8 Jun 2026 14:27:00 +0800 Subject: [PATCH 03/20] test: verify harness security boundaries --- .../harness-initialize.contract.spec.ts | 49 +++++ test/helpers/acp-fixture.ts | 29 +++ test/security/local-bridge.security.spec.ts | 167 ++++++++++++++++++ .../security/process-manager.security.spec.ts | 43 +++++ .../security/target-registry.security.spec.ts | 59 +++++++ 5 files changed, 347 insertions(+) create mode 100644 test/contract/harness-initialize.contract.spec.ts create mode 100644 test/helpers/acp-fixture.ts create mode 100644 test/security/local-bridge.security.spec.ts create mode 100644 test/security/process-manager.security.spec.ts create mode 100644 test/security/target-registry.security.spec.ts diff --git a/test/contract/harness-initialize.contract.spec.ts b/test/contract/harness-initialize.contract.spec.ts new file mode 100644 index 0000000..8420626 --- /dev/null +++ b/test/contract/harness-initialize.contract.spec.ts @@ -0,0 +1,49 @@ +import { PROTOCOL_VERSION } from '@agentclientprotocol/sdk' +import { afterEach, describe, expect, it } from 'vitest' +import { AcpHarness } from '../../packages/acp-harness/src/harness.js' +import { + createFixtureRegistry, + repositoryRoot, +} from '../helpers/acp-fixture.js' + +const harnesses: AcpHarness[] = [] + +afterEach(async () => { + await Promise.all(harnesses.splice(0).map(harness => harness.dispose())) +}) + +describe('Harness ↔ official SDK ↔ fixture contract', () => { + it('starts an allowlisted stdio agent and completes ACP initialize', async () => { + const harness = new AcpHarness(await createFixtureRegistry()) + harnesses.push(harness) + const target = await harness.startTarget({ + targetId: 'fixture-agent', + workspaceRoot: repositoryRoot, + }) + + const initialized = await harness.initialize(target.id) + + expect(initialized.response.protocolVersion).toBe(PROTOCOL_VERSION) + expect(initialized.response.agentInfo?.name).toBe( + 'axis-deterministic-fixture' + ) + await harness.stopTarget(target.id) + expect(harness.processes.list()).toHaveLength(0) + }) + + it('observes agent crash and removes the process without an orphan handle', async () => { + const harness = new AcpHarness(await createFixtureRegistry()) + harnesses.push(harness) + const target = await harness.startTarget({ + targetId: 'fixture-agent', + workspaceRoot: repositoryRoot, + args: ['--crash-after-initialize'], + }) + + await harness.initialize(target.id) + const exit = await target.exited + + expect(exit).toEqual({ code: 17, signal: null }) + expect(harness.processes.list()).toHaveLength(0) + }) +}) diff --git a/test/helpers/acp-fixture.ts b/test/helpers/acp-fixture.ts new file mode 100644 index 0000000..b6e9fb0 --- /dev/null +++ b/test/helpers/acp-fixture.ts @@ -0,0 +1,29 @@ +import { resolve } from 'node:path' +import { fileURLToPath } from 'node:url' +import { + TargetRegistry, + type TargetDefinition, +} from '../../packages/acp-harness/src/index.js' + +export const repositoryRoot = resolve( + fileURLToPath(new URL('../..', import.meta.url)) +) + +export const fixtureAgentPath = resolve( + repositoryRoot, + 'fixtures/acp-agents/bin/fixture-agent.mjs' +) + +export const fixtureTarget: TargetDefinition = { + id: 'fixture-agent', + command: process.execPath, + fixedArgs: [fixtureAgentPath], + allowedArgs: ['--crash-after-initialize'], + environmentAllowlist: ['PATH'], + maxProcesses: 2, + expectedProtocolVersion: 'v1', +} + +export async function createFixtureRegistry(): Promise { + return TargetRegistry.create([fixtureTarget], [repositoryRoot]) +} diff --git a/test/security/local-bridge.security.spec.ts b/test/security/local-bridge.security.spec.ts new file mode 100644 index 0000000..d6ef24a --- /dev/null +++ b/test/security/local-bridge.security.spec.ts @@ -0,0 +1,167 @@ +import { once } from 'node:events' +import WebSocket from 'ws' +import { afterEach, describe, expect, it } from 'vitest' +import { LocalBridge } from '../../packages/acp-harness/src/bridge/local-bridge.js' +import { TargetRegistry } from '../../packages/acp-harness/src/target-registry.js' +import { fixtureTarget, repositoryRoot } from '../helpers/acp-fixture.js' + +const origin = 'http://127.0.0.1:5173' +const bridges: LocalBridge[] = [] +const sockets: WebSocket[] = [] + +afterEach(async () => { + for (const socket of sockets.splice(0)) socket.terminate() + await Promise.all(bridges.splice(0).map(bridge => bridge.stop())) +}) + +async function connect(url: string): Promise { + const socket = new WebSocket(url, { origin }) + sockets.push(socket) + await once(socket, 'open') + return socket +} + +async function nextJson(socket: WebSocket): Promise> { + const [data] = (await once(socket, 'message')) as [Buffer] + return JSON.parse(data.toString()) as Record +} + +describe('LocalBridge security boundary', () => { + it('refuses a non-loopback bind address and weak token', () => { + expect( + () => + new LocalBridge({ + host: '0.0.0.0', + allowedOrigins: [origin], + onMessage: async () => ({}), + }) + ).toThrowError(expect.objectContaining({ code: 'NON_LOOPBACK_BRIDGE' })) + + expect( + () => + new LocalBridge({ + token: 'short', + allowedOrigins: [origin], + onMessage: async () => ({}), + }) + ).toThrowError(expect.objectContaining({ code: 'WEAK_BRIDGE_TOKEN' })) + }) + + it('requires both an allowed Origin and the high-entropy token', async () => { + const bridge = new LocalBridge({ + allowedOrigins: [origin], + onMessage: async () => ({}), + }) + bridges.push(bridge) + const address = await bridge.start() + + const wrongToken = new WebSocket(`${address.url}?token=${'x'.repeat(43)}`, { + origin, + }) + wrongToken.on('error', () => undefined) + const [request, response] = (await once( + wrongToken, + 'unexpected-response' + )) as [unknown, { statusCode: number }] + void request + expect(response.statusCode).toBe(401) + + const wrongOrigin = new WebSocket( + `${address.url}?token=${encodeURIComponent(address.token)}`, + { origin: 'https://evil.example' } + ) + wrongOrigin.on('error', () => undefined) + const [, originResponse] = (await once( + wrongOrigin, + 'unexpected-response' + )) as [unknown, { statusCode: number }] + expect(originResponse.statusCode).toBe(401) + }) + + it('accepts only the strict target message schema and known target IDs', async () => { + const registry = await TargetRegistry.create( + [fixtureTarget], + [repositoryRoot] + ) + const bridge = new LocalBridge({ + allowedOrigins: [origin], + onMessage: async message => { + if (message.type === 'target/start') registry.get(message.targetId) + return { accepted: true } + }, + }) + bridges.push(bridge) + const address = await bridge.start() + const socket = await connect( + `${address.url}?token=${encodeURIComponent(address.token)}` + ) + + socket.send( + JSON.stringify({ + type: 'target/start', + requestId: 'bad-fields', + targetId: 'fixture-agent', + workspaceRoot: repositoryRoot, + command: '/bin/sh', + }) + ) + expect(await nextJson(socket)).toMatchObject({ + type: 'error', + error: { code: 'BAD_MESSAGE' }, + }) + + socket.send( + JSON.stringify({ + type: 'target/start', + requestId: 'unknown-target', + targetId: 'shell', + workspaceRoot: repositoryRoot, + }) + ) + expect(await nextJson(socket)).toMatchObject({ + type: 'error', + requestId: 'unknown-target', + error: { code: 'UNKNOWN_TARGET' }, + }) + + socket.send( + JSON.stringify({ + type: 'target/start', + requestId: 'known-target', + targetId: 'fixture-agent', + workspaceRoot: repositoryRoot, + }) + ) + expect(await nextJson(socket)).toMatchObject({ + type: 'response', + requestId: 'known-target', + result: { accepted: true }, + }) + }) + + it('closes a connection that exceeds the configured message rate', async () => { + const bridge = new LocalBridge({ + allowedOrigins: [origin], + maxMessagesPerWindow: 1, + rateWindowMs: 10_000, + onMessage: async () => ({}), + }) + bridges.push(bridge) + const address = await bridge.start() + const socket = await connect( + `${address.url}?token=${encodeURIComponent(address.token)}` + ) + const message = JSON.stringify({ + type: 'target/stop', + requestId: 'rate', + targetHandleId: 'handle', + }) + + socket.send(message) + await nextJson(socket) + socket.send(message) + const [code] = (await once(socket, 'close')) as [number] + + expect(code).toBe(1008) + }) +}) diff --git a/test/security/process-manager.security.spec.ts b/test/security/process-manager.security.spec.ts new file mode 100644 index 0000000..c9d74d9 --- /dev/null +++ b/test/security/process-manager.security.spec.ts @@ -0,0 +1,43 @@ +import { describe, expect, it } from 'vitest' +import { ProcessManager } from '../../packages/acp-harness/src/process-manager.js' +import type { ResolvedTarget } from '../../packages/acp-harness/src/types.js' +import { fixtureTarget, repositoryRoot } from '../helpers/acp-fixture.js' + +function hangingTarget(): ResolvedTarget { + return { + definition: { ...fixtureTarget, id: 'hanging', maxProcesses: 1 }, + command: process.execPath, + args: ['-e', 'setInterval(() => {}, 1000)'], + cwd: repositoryRoot, + environment: {}, + } +} + +describe('ProcessManager resource boundary', () => { + it('enforces per-target and global quotas', async () => { + const manager = new ProcessManager({ maxProcesses: 1 }) + const first = manager.start(hangingTarget()) + + expect(() => manager.start(hangingTarget())).toThrowError( + expect.objectContaining({ code: 'GLOBAL_PROCESS_LIMIT' }) + ) + + await manager.stop(first.id) + expect(manager.list()).toHaveLength(0) + }) + + it('terminates the isolated process group and removes the handle', async () => { + const manager = new ProcessManager({ gracefulShutdownMs: 100 }) + const target = manager.start(hangingTarget()) + + const exit = await manager.stop(target.id) + + expect(exit.signal).toMatch(/^SIG(?:TERM|KILL)$/u) + expect(manager.list()).toHaveLength(0) + if (process.platform !== 'win32') { + expect(() => process.kill(target.pid, 0)).toThrowError( + expect.objectContaining({ code: 'ESRCH' }) + ) + } + }) +}) diff --git a/test/security/target-registry.security.spec.ts b/test/security/target-registry.security.spec.ts new file mode 100644 index 0000000..672f7b6 --- /dev/null +++ b/test/security/target-registry.security.spec.ts @@ -0,0 +1,59 @@ +import { tmpdir } from 'node:os' +import { describe, expect, it } from 'vitest' +import { HarnessError } from '../../packages/acp-harness/src/errors.js' +import { + createFixtureRegistry, + repositoryRoot, +} from '../helpers/acp-fixture.js' + +describe('TargetRegistry security boundary', () => { + it('rejects an unknown browser-provided target ID', async () => { + const registry = await createFixtureRegistry() + + await expect( + registry.resolve({ targetId: 'shell', workspaceRoot: repositoryRoot }) + ).rejects.toMatchObject({ code: 'UNKNOWN_TARGET' }) + }) + + it('rejects arbitrary arguments and environment variables', async () => { + const registry = await createFixtureRegistry() + + await expect( + registry.resolve({ + targetId: 'fixture-agent', + workspaceRoot: repositoryRoot, + args: ['-e', 'process.exit()'], + }) + ).rejects.toMatchObject({ code: 'ARGUMENT_NOT_ALLOWED' }) + + await expect( + registry.resolve({ + targetId: 'fixture-agent', + workspaceRoot: repositoryRoot, + environment: { NODE_OPTIONS: '--inspect' }, + }) + ).rejects.toMatchObject({ code: 'ENVIRONMENT_NOT_ALLOWED' }) + }) + + it('rejects a workspace outside the configured realpath roots', async () => { + const registry = await createFixtureRegistry() + + await expect( + registry.resolve({ targetId: 'fixture-agent', workspaceRoot: tmpdir() }) + ).rejects.toMatchObject({ code: 'WORKSPACE_NOT_ALLOWED' }) + }) + + it('resolves only fixed command data plus allowlisted values', async () => { + const registry = await createFixtureRegistry() + const resolved = await registry.resolve({ + targetId: 'fixture-agent', + workspaceRoot: repositoryRoot, + args: ['--crash-after-initialize'], + environment: { PATH: '/usr/bin' }, + }) + + expect(resolved.command).toBe(process.execPath) + expect(resolved.args.at(-1)).toBe('--crash-after-initialize') + expect(resolved.environment).toEqual({ PATH: '/usr/bin' }) + }) +}) From fd1d972750ebfa83c33a043102fd0b9d7cd16c2c Mon Sep 17 00:00:00 2001 From: CalvinWade Date: Mon, 8 Jun 2026 18:04:00 +0800 Subject: [PATCH 04/20] fix: align harness types across root checks --- packages/acp-harness/src/sdk-client.ts | 4 ++-- test/security/target-registry.security.spec.ts | 16 ++++++++++++---- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/packages/acp-harness/src/sdk-client.ts b/packages/acp-harness/src/sdk-client.ts index cd6ec53..1f136f2 100644 --- a/packages/acp-harness/src/sdk-client.ts +++ b/packages/acp-harness/src/sdk-client.ts @@ -14,8 +14,8 @@ export class AcpSdkClient { connect(target: ManagedTarget): ClientConnection { const stream = ndJsonStream( - Writable.toWeb(target.child.stdin), - Readable.toWeb(target.child.stdout) + Writable.toWeb(target.child.stdin) as WritableStream, + Readable.toWeb(target.child.stdout) as ReadableStream ) const connection = client({ name: 'axis-acp-devkit' }) .onRequest(methods.client.session.requestPermission, () => ({ diff --git a/test/security/target-registry.security.spec.ts b/test/security/target-registry.security.spec.ts index 672f7b6..eda4a2b 100644 --- a/test/security/target-registry.security.spec.ts +++ b/test/security/target-registry.security.spec.ts @@ -12,7 +12,9 @@ describe('TargetRegistry security boundary', () => { await expect( registry.resolve({ targetId: 'shell', workspaceRoot: repositoryRoot }) - ).rejects.toMatchObject({ code: 'UNKNOWN_TARGET' }) + ).rejects.toMatchObject({ + code: 'UNKNOWN_TARGET', + } satisfies Partial) }) it('rejects arbitrary arguments and environment variables', async () => { @@ -24,7 +26,9 @@ describe('TargetRegistry security boundary', () => { workspaceRoot: repositoryRoot, args: ['-e', 'process.exit()'], }) - ).rejects.toMatchObject({ code: 'ARGUMENT_NOT_ALLOWED' }) + ).rejects.toMatchObject({ + code: 'ARGUMENT_NOT_ALLOWED', + } satisfies Partial) await expect( registry.resolve({ @@ -32,7 +36,9 @@ describe('TargetRegistry security boundary', () => { workspaceRoot: repositoryRoot, environment: { NODE_OPTIONS: '--inspect' }, }) - ).rejects.toMatchObject({ code: 'ENVIRONMENT_NOT_ALLOWED' }) + ).rejects.toMatchObject({ + code: 'ENVIRONMENT_NOT_ALLOWED', + } satisfies Partial) }) it('rejects a workspace outside the configured realpath roots', async () => { @@ -40,7 +46,9 @@ describe('TargetRegistry security boundary', () => { await expect( registry.resolve({ targetId: 'fixture-agent', workspaceRoot: tmpdir() }) - ).rejects.toMatchObject({ code: 'WORKSPACE_NOT_ALLOWED' }) + ).rejects.toMatchObject({ + code: 'WORKSPACE_NOT_ALLOWED', + } satisfies Partial) }) it('resolves only fixed command data plus allowlisted values', async () => { From fed1a49b3399e42013c1d8109bba10269c5a92d1 Mon Sep 17 00:00:00 2001 From: CalvinWade Date: Wed, 10 Jun 2026 09:58:00 +0800 Subject: [PATCH 05/20] feat: add lossless ACP transport tracing --- package.json | 2 +- packages/acp-core/src/axis-event.ts | 36 ++++ packages/acp-core/src/index.ts | 5 +- packages/acp-core/src/protocol-trace.ts | 33 ++++ packages/acp-core/src/sequence.ts | 12 ++ .../acp-harness/src/transport-tap.spec.ts | 60 +++++++ packages/acp-harness/src/transport-tap.ts | 168 ++++++++++++++++++ vitest.config.ts | 1 + 8 files changed, 314 insertions(+), 3 deletions(-) create mode 100644 packages/acp-core/src/axis-event.ts create mode 100644 packages/acp-core/src/protocol-trace.ts create mode 100644 packages/acp-core/src/sequence.ts create mode 100644 packages/acp-harness/src/transport-tap.spec.ts create mode 100644 packages/acp-harness/src/transport-tap.ts diff --git a/package.json b/package.json index 41ce209..2bcd981 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ "format": "prettier --write .", "format:check": "prettier --check .", "type-check": "pnpm type-check:node && pnpm type-check:vue", - "type-check:node": "pnpm -r --filter @axis-ui/acp-core --filter @axis-ui/acp-harness --filter @axis-ui/acp-cli --filter @axis-ui/acp-fixture-agents run type-check", + "type-check:node": "pnpm --filter @axis-ui/acp-core run type-check && pnpm --filter @axis-ui/acp-core run build && pnpm -r --filter @axis-ui/acp-harness --filter @axis-ui/acp-cli --filter @axis-ui/acp-fixture-agents run type-check", "type-check:vue": "vue-tsc --noEmit && pnpm --filter @axis-ui/acp-devtools run type-check", "test": "vitest", "test:unit": "vitest run --project axis-ui --project acp-node --project acp-devtools", diff --git a/packages/acp-core/src/axis-event.ts b/packages/acp-core/src/axis-event.ts new file mode 100644 index 0000000..e77b968 --- /dev/null +++ b/packages/acp-core/src/axis-event.ts @@ -0,0 +1,36 @@ +export type AxisProtocolVersion = 'v1' + +export interface AxisAcpEventBase { + readonly id: string + readonly runId: string + readonly connectionId: string + readonly sessionId?: string + readonly sequence: number + readonly timestamp: string + readonly protocolVersion: AxisProtocolVersion + readonly sourceTraceIds: readonly string[] +} + +export interface ConnectionStateChangedEvent extends AxisAcpEventBase { + readonly type: 'connection/state-changed' + readonly state: 'connected' | 'initialized' | 'closed' | 'crashed' +} + +export interface CapabilitySnapshotEvent extends AxisAcpEventBase { + readonly type: 'capability/snapshot' + readonly agentCapabilities: Readonly> + readonly agentInfo?: Readonly> +} + +export interface ProcessExitedEvent extends AxisAcpEventBase { + readonly type: 'process/exited' + readonly code: number | null + readonly signal: string | null +} + +export type AxisAcpEvent = + | ConnectionStateChangedEvent + | CapabilitySnapshotEvent + | ProcessExitedEvent + +export type AxisAcpEventListener = (event: AxisAcpEvent) => void diff --git a/packages/acp-core/src/index.ts b/packages/acp-core/src/index.ts index 5891e1b..a20dd3c 100644 --- a/packages/acp-core/src/index.ts +++ b/packages/acp-core/src/index.ts @@ -1,2 +1,3 @@ -// Gate 01 establishes only the private package boundary. ACP domain code starts in later gates. -export {} +export * from './axis-event.js' +export * from './protocol-trace.js' +export * from './sequence.js' diff --git a/packages/acp-core/src/protocol-trace.ts b/packages/acp-core/src/protocol-trace.ts new file mode 100644 index 0000000..6570834 --- /dev/null +++ b/packages/acp-core/src/protocol-trace.ts @@ -0,0 +1,33 @@ +export type JsonPrimitive = boolean | number | string | null +export type JsonValue = + | JsonPrimitive + | readonly JsonValue[] + | { readonly [key: string]: JsonValue } + +export type ProtocolDirection = 'client-to-agent' | 'agent-to-client' + +export type ProtocolFrameKind = + | 'request' + | 'response' + | 'notification' + | 'invalid-json' + | 'stdout-noise' + +export interface ProtocolTraceFrame { + readonly id: string + readonly runId: string + readonly connectionId: string + readonly sequence: number + readonly timestamp: string + readonly protocolVersion: 'v1' + readonly direction: ProtocolDirection + readonly kind: ProtocolFrameKind + readonly raw: string + readonly byteLength: number + readonly parsed?: JsonValue + readonly requestId?: string | number | null + readonly method?: string + readonly parseError?: string +} + +export type ProtocolTraceListener = (frame: ProtocolTraceFrame) => void diff --git a/packages/acp-core/src/sequence.ts b/packages/acp-core/src/sequence.ts new file mode 100644 index 0000000..b0485cf --- /dev/null +++ b/packages/acp-core/src/sequence.ts @@ -0,0 +1,12 @@ +export class SequenceAllocator { + private current = 0 + + next(): number { + this.current += 1 + return this.current + } + + peek(): number { + return this.current + } +} diff --git a/packages/acp-harness/src/transport-tap.spec.ts b/packages/acp-harness/src/transport-tap.spec.ts new file mode 100644 index 0000000..4b40173 --- /dev/null +++ b/packages/acp-harness/src/transport-tap.spec.ts @@ -0,0 +1,60 @@ +import { SequenceAllocator } from '@axis-ui/acp-core' +import { describe, expect, it } from 'vitest' +import { TransportTap } from './transport-tap.js' + +describe('TransportTap', () => { + it('preserves chunked bytes while framing complete NDJSON lines', async () => { + const chunks: Uint8Array[] = [] + const destination = new WritableStream({ + write: chunk => { + chunks.push(chunk) + }, + }) + const tap = new TransportTap({ + runId: 'run-tap', + connectionId: 'connection-tap', + sequence: new SequenceAllocator(), + }) + const writer = tap.tapWritable(destination, 'client-to-agent').getWriter() + const encoder = new TextEncoder() + + await writer.write(encoder.encode('{"jsonrpc":"2.0","id":1,')) + await writer.write(encoder.encode('"method":"initialize"}\n')) + await writer.close() + + expect(new TextDecoder().decode(Buffer.concat(chunks))).toBe( + '{"jsonrpc":"2.0","id":1,"method":"initialize"}\n' + ) + expect(tap.frames).toEqual([ + expect.objectContaining({ + direction: 'client-to-agent', + kind: 'request', + method: 'initialize', + requestId: 1, + raw: '{"jsonrpc":"2.0","id":1,"method":"initialize"}', + }), + ]) + }) + + it('keeps invalid JSON and valid non-RPC stdout as diagnostic frames', async () => { + const tap = new TransportTap({ + runId: 'run-noise', + connectionId: 'connection-noise', + sequence: new SequenceAllocator(), + }) + const writer = tap + .tapWritable(new WritableStream(), 'agent-to-client') + .getWriter() + + await writer.write( + new TextEncoder().encode('plain log line\n{"log":"structured noise"}\n') + ) + await writer.close() + + expect(tap.frames.map(frame => frame.kind)).toEqual([ + 'invalid-json', + 'stdout-noise', + ]) + expect(tap.frames[0]?.parseError).toBeTruthy() + }) +}) diff --git a/packages/acp-harness/src/transport-tap.ts b/packages/acp-harness/src/transport-tap.ts new file mode 100644 index 0000000..d22975b --- /dev/null +++ b/packages/acp-harness/src/transport-tap.ts @@ -0,0 +1,168 @@ +import type { + JsonValue, + ProtocolDirection, + ProtocolFrameKind, + ProtocolTraceFrame, + ProtocolTraceListener, + SequenceAllocator, +} from '@axis-ui/acp-core' + +export interface TransportTapOptions { + readonly runId: string + readonly connectionId: string + readonly sequence: SequenceAllocator + readonly onFrame?: ProtocolTraceListener + readonly now?: () => Date +} + +interface FrameDetails { + readonly kind: ProtocolFrameKind + readonly parsed?: JsonValue + readonly requestId?: string | number | null + readonly method?: string + readonly parseError?: string +} + +function isRecord(value: unknown): value is Record { + return typeof value === 'object' && value !== null && !Array.isArray(value) +} + +function classify(raw: string): FrameDetails { + let parsed: unknown + try { + parsed = JSON.parse(raw) as unknown + } catch (error) { + return { + kind: 'invalid-json', + parseError: error instanceof Error ? error.message : String(error), + } + } + + if (!isRecord(parsed)) { + return { kind: 'stdout-noise', parsed: parsed as JsonValue } + } + + const requestId = + typeof parsed.id === 'string' || + typeof parsed.id === 'number' || + parsed.id === null + ? parsed.id + : undefined + const method = typeof parsed.method === 'string' ? parsed.method : undefined + + if (method !== undefined) { + return { + kind: requestId === undefined ? 'notification' : 'request', + parsed: parsed as JsonValue, + requestId, + method, + } + } + if ( + requestId !== undefined && + (Object.hasOwn(parsed, 'result') || Object.hasOwn(parsed, 'error')) + ) { + return { kind: 'response', parsed: parsed as JsonValue, requestId } + } + return { kind: 'stdout-noise', parsed: parsed as JsonValue } +} + +class LineObserver { + private readonly decoder = new TextDecoder() + private pending = '' + + constructor(private readonly emitLine: (line: string) => void) {} + + push(chunk: Uint8Array): void { + this.pending += this.decoder.decode(chunk, { stream: true }) + this.drain(false) + } + + finish(): void { + this.pending += this.decoder.decode() + this.drain(true) + } + + private drain(flush: boolean): void { + let newline = this.pending.indexOf('\n') + while (newline >= 0) { + const line = this.pending.slice(0, newline).replace(/\r$/u, '') + this.pending = this.pending.slice(newline + 1) + this.emitLine(line) + newline = this.pending.indexOf('\n') + } + if (flush && this.pending.length > 0) { + this.emitLine(this.pending) + this.pending = '' + } + } +} + +export class TransportTap { + private readonly recordedFrames: ProtocolTraceFrame[] = [] + + constructor(private readonly options: TransportTapOptions) {} + + get frames(): readonly ProtocolTraceFrame[] { + return this.recordedFrames + } + + tapReadable( + source: ReadableStream, + direction: ProtocolDirection + ): ReadableStream { + const observer = this.createObserver(direction) + return source.pipeThrough( + new TransformStream({ + transform: (chunk, controller) => { + observer.push(chunk) + controller.enqueue(chunk) + }, + flush: () => observer.finish(), + }) + ) + } + + tapWritable( + destination: WritableStream, + direction: ProtocolDirection + ): WritableStream { + const writer = destination.getWriter() + const observer = this.createObserver(direction) + return new WritableStream({ + write: async chunk => { + await writer.write(chunk) + observer.push(chunk) + }, + close: async () => { + observer.finish() + await writer.close() + }, + abort: async reason => { + observer.finish() + await writer.abort(reason) + }, + }) + } + + private createObserver(direction: ProtocolDirection): LineObserver { + return new LineObserver(raw => { + const sequence = this.options.sequence.next() + const details = classify(raw) + const frame: ProtocolTraceFrame = { + id: `${this.options.runId}:trace:${sequence}`, + runId: this.options.runId, + connectionId: this.options.connectionId, + sequence, + timestamp: (this.options.now?.() ?? new Date()).toISOString(), + protocolVersion: 'v1', + direction, + raw, + byteLength: new TextEncoder().encode(raw).byteLength, + ...details, + } + this.recordedFrames.push(frame) + this.options.onFrame?.(frame) + }) + } +} diff --git a/vitest.config.ts b/vitest.config.ts index 5f648a7..60a66e0 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -13,6 +13,7 @@ const aliases = { '@axis-ui/utils': resolve(__dirname, './packages/utils/index.ts'), '@axis-ui/theme-chalk/src': resolve(__dirname, './packages/theme-chalk/src'), '@axis-ui/theme-chalk': resolve(__dirname, './packages/theme-chalk'), + '@axis-ui/acp-core': resolve(__dirname, './packages/acp-core/src/index.ts'), } export default defineConfig({ From aab3d3378edc2fb0c7c25abcf52c32ae586c5dd2 Mon Sep 17 00:00:00 2001 From: CalvinWade Date: Wed, 10 Jun 2026 16:36:00 +0800 Subject: [PATCH 06/20] feat: normalize harness protocol telemetry --- fixtures/acp-agents/bin/fixture-agent.mjs | 7 +- packages/acp-harness/src/acp-v1-adapter.ts | 88 ++++++++++++++ packages/acp-harness/src/harness.ts | 56 ++++++++- packages/acp-harness/src/index.ts | 2 + packages/acp-harness/src/sdk-client.ts | 115 +++++++++++++++--- .../harness-initialize.contract.spec.ts | 15 +++ test/contract/harness-trace.contract.spec.ts | 114 +++++++++++++++++ test/helpers/acp-fixture.ts | 6 +- 8 files changed, 383 insertions(+), 20 deletions(-) create mode 100644 packages/acp-harness/src/acp-v1-adapter.ts create mode 100644 test/contract/harness-trace.contract.spec.ts diff --git a/fixtures/acp-agents/bin/fixture-agent.mjs b/fixtures/acp-agents/bin/fixture-agent.mjs index 8e50fd3..aae383c 100644 --- a/fixtures/acp-agents/bin/fixture-agent.mjs +++ b/fixtures/acp-agents/bin/fixture-agent.mjs @@ -5,6 +5,11 @@ import { Readable, Writable } from 'node:stream' const shouldCrashAfterInitialize = process.argv.includes( '--crash-after-initialize' ) +const shouldEmitStdoutNoise = process.argv.includes('--stdout-noise') +const shouldEmitStderr = process.argv.includes('--stderr-marker') + +if (shouldEmitStdoutNoise) process.stdout.write('fixture stdout noise\n') +if (shouldEmitStderr) process.stderr.write('fixture stderr marker\n') const app = acp .agent({ name: 'axis-deterministic-fixture' }) @@ -15,7 +20,7 @@ const app = acp agentCapabilities: { loadSession: false }, agentInfo: { name: 'axis-deterministic-fixture', - version: '0.0.0-gate-02', + version: '0.0.0-fixture', }, } }) diff --git a/packages/acp-harness/src/acp-v1-adapter.ts b/packages/acp-harness/src/acp-v1-adapter.ts new file mode 100644 index 0000000..15c6575 --- /dev/null +++ b/packages/acp-harness/src/acp-v1-adapter.ts @@ -0,0 +1,88 @@ +import type { InitializeResponse } from '@agentclientprotocol/sdk' +import type { + AxisAcpEvent, + AxisAcpEventListener, + CapabilitySnapshotEvent, + ConnectionStateChangedEvent, + ProcessExitedEvent, + SequenceAllocator, +} from '@axis-ui/acp-core' +import type { TargetExit } from './types.js' + +export interface AcpV1AdapterOptions { + readonly runId: string + readonly connectionId: string + readonly sequence: SequenceAllocator + readonly onEvent?: AxisAcpEventListener + readonly now?: () => Date +} + +export class AcpV1Adapter { + constructor(private readonly options: AcpV1AdapterOptions) {} + + connectionState( + state: ConnectionStateChangedEvent['state'], + sourceTraceIds: readonly string[] = [] + ): ConnectionStateChangedEvent { + return this.emit({ + ...this.metadata(sourceTraceIds), + type: 'connection/state-changed', + state, + }) + } + + initialized( + response: InitializeResponse, + sourceTraceIds: readonly string[] + ): void { + this.emit({ + ...this.metadata(sourceTraceIds), + type: 'capability/snapshot', + agentCapabilities: response.agentCapabilities as Readonly< + Record + >, + agentInfo: response.agentInfo as + | Readonly> + | undefined, + }) + this.connectionState('initialized', sourceTraceIds) + } + + processExited(exit: TargetExit): ProcessExitedEvent { + return this.emit({ + ...this.metadata([]), + type: 'process/exited', + code: exit.code, + signal: exit.signal, + }) + } + + private metadata(sourceTraceIds: readonly string[]): EventMetadata { + const sequence = this.options.sequence.next() + return { + id: `${this.options.runId}:event:${sequence}`, + runId: this.options.runId, + connectionId: this.options.connectionId, + sequence, + timestamp: (this.options.now?.() ?? new Date()).toISOString(), + protocolVersion: 'v1' as const, + sourceTraceIds, + } + } + + private emit(event: T): T { + this.options.onEvent?.(event) + return event + } +} + +interface EventMetadata { + readonly id: string + readonly runId: string + readonly connectionId: string + readonly sessionId?: string + readonly sequence: number + readonly timestamp: string + readonly protocolVersion: 'v1' + readonly sourceTraceIds: readonly string[] +} diff --git a/packages/acp-harness/src/harness.ts b/packages/acp-harness/src/harness.ts index c0ec7af..f4be33a 100644 --- a/packages/acp-harness/src/harness.ts +++ b/packages/acp-harness/src/harness.ts @@ -1,3 +1,11 @@ +import type { + AxisAcpEvent, + AxisAcpEventListener, + ProtocolTraceFrame, + ProtocolTraceListener, +} from '@axis-ui/acp-core' +import { SequenceAllocator } from '@axis-ui/acp-core' +import { randomUUID } from 'node:crypto' import { ProcessManager } from './process-manager.js' import { AcpSdkClient } from './sdk-client.js' import { TargetRegistry } from './target-registry.js' @@ -8,11 +16,45 @@ import type { } from './types.js' export class AcpHarness { + readonly runId: string + private readonly sequence = new SequenceAllocator() + private readonly sdk: AcpSdkClient + private readonly eventListeners = new Set() + private readonly traceListeners = new Set() + private readonly recordedEvents: AxisAcpEvent[] = [] + private readonly recordedTrace: ProtocolTraceFrame[] = [] + constructor( readonly registry: TargetRegistry, readonly processes = new ProcessManager(), - private readonly sdk = new AcpSdkClient() - ) {} + runId: string = randomUUID() + ) { + this.runId = runId + this.sdk = new AcpSdkClient({ + runId, + sequence: this.sequence, + onEvent: event => this.publishEvent(event), + onTrace: frame => this.publishTrace(frame), + }) + } + + get events(): readonly AxisAcpEvent[] { + return this.recordedEvents + } + + get trace(): readonly ProtocolTraceFrame[] { + return this.recordedTrace + } + + subscribeEvents(listener: AxisAcpEventListener): () => void { + this.eventListeners.add(listener) + return () => this.eventListeners.delete(listener) + } + + subscribeTrace(listener: ProtocolTraceListener): () => void { + this.traceListeners.add(listener) + return () => this.traceListeners.delete(listener) + } async startTarget(request: TargetStartRequest): Promise { const resolved = await this.registry.resolve(request) @@ -37,4 +79,14 @@ export class AcpHarness { for (const target of this.processes.list()) this.sdk.close(target.id) await this.processes.stopAll() } + + private publishEvent(event: AxisAcpEvent): void { + this.recordedEvents.push(event) + for (const listener of this.eventListeners) listener(event) + } + + private publishTrace(frame: ProtocolTraceFrame): void { + this.recordedTrace.push(frame) + for (const listener of this.traceListeners) listener(frame) + } } diff --git a/packages/acp-harness/src/index.ts b/packages/acp-harness/src/index.ts index ad1f977..7c8465c 100644 --- a/packages/acp-harness/src/index.ts +++ b/packages/acp-harness/src/index.ts @@ -3,5 +3,7 @@ export * from './harness.js' export * from './process-manager.js' export * from './sdk-client.js' export * from './target-registry.js' +export * from './transport-tap.js' export * from './types.js' export * from './bridge/index.js' +export * from './acp-v1-adapter.js' diff --git a/packages/acp-harness/src/sdk-client.ts b/packages/acp-harness/src/sdk-client.ts index 1f136f2..b577284 100644 --- a/packages/acp-harness/src/sdk-client.ts +++ b/packages/acp-harness/src/sdk-client.ts @@ -6,16 +6,57 @@ import { type ClientConnection, type InitializeResponse, } from '@agentclientprotocol/sdk' +import type { + AxisAcpEventListener, + ProtocolTraceFrame, + ProtocolTraceListener, + SequenceAllocator, +} from '@axis-ui/acp-core' import { Readable, Writable } from 'node:stream' +import { AcpV1Adapter } from './acp-v1-adapter.js' import type { ManagedTarget } from './process-manager.js' +import { TransportTap } from './transport-tap.js' + +export interface AcpSdkClientOptions { + readonly runId: string + readonly sequence: SequenceAllocator + readonly onTrace?: ProtocolTraceListener + readonly onEvent?: AxisAcpEventListener +} + +interface ConnectionRecord { + readonly connection: ClientConnection + readonly tap: TransportTap + readonly adapter: AcpV1Adapter +} export class AcpSdkClient { - private readonly connections = new Map() + private readonly connections = new Map() + + constructor(private readonly options: AcpSdkClientOptions) {} connect(target: ManagedTarget): ClientConnection { + const tap = new TransportTap({ + runId: this.options.runId, + connectionId: target.id, + sequence: this.options.sequence, + onFrame: this.options.onTrace, + }) + const adapter = new AcpV1Adapter({ + runId: this.options.runId, + connectionId: target.id, + sequence: this.options.sequence, + onEvent: this.options.onEvent, + }) const stream = ndJsonStream( - Writable.toWeb(target.child.stdin) as WritableStream, - Readable.toWeb(target.child.stdout) as ReadableStream + tap.tapWritable( + Writable.toWeb(target.child.stdin) as WritableStream, + 'client-to-agent' + ), + tap.tapReadable( + Readable.toWeb(target.child.stdout) as ReadableStream, + 'agent-to-client' + ) ) const connection = client({ name: 'axis-acp-devkit' }) .onRequest(methods.client.session.requestPermission, () => ({ @@ -24,33 +65,75 @@ export class AcpSdkClient { .onNotification(methods.client.session.update, () => undefined) .connect(stream) - this.connections.set(target.id, connection) - void target.exited.then(() => { + this.connections.set(target.id, { connection, tap, adapter }) + adapter.connectionState('connected') + void target.exited.then(exit => { connection.close(new Error('Target process exited')) this.connections.delete(target.id) + adapter.processExited(exit) + adapter.connectionState( + exit.code === 0 || exit.signal !== null ? 'closed' : 'crashed' + ) }) return connection } async initialize(targetHandleId: string): Promise { - const connection = this.get(targetHandleId) - return connection.agent.request(methods.agent.initialize, { - protocolVersion: PROTOCOL_VERSION, - clientCapabilities: {}, - }) + const record = this.get(targetHandleId) + const startingSequence = this.options.sequence.peek() + const response = await record.connection.agent.request( + methods.agent.initialize, + { + protocolVersion: PROTOCOL_VERSION, + clientCapabilities: {}, + } + ) + const requestFrame = this.findFrame( + record.tap.frames, + frame => + frame.sequence > startingSequence && + frame.direction === 'client-to-agent' && + frame.kind === 'request' && + frame.method === 'initialize' + ) + const responseFrame = this.findFrame( + record.tap.frames, + frame => + frame.direction === 'agent-to-client' && + frame.kind === 'response' && + frame.requestId === requestFrame?.requestId + ) + record.adapter.initialized( + response, + [requestFrame?.id, responseFrame?.id].filter( + (id): id is string => id !== undefined + ) + ) + return response } close(targetHandleId: string): void { - const connection = this.connections.get(targetHandleId) - connection?.close() + const record = this.connections.get(targetHandleId) + record?.connection.close() this.connections.delete(targetHandleId) } - private get(targetHandleId: string): ClientConnection { - const connection = this.connections.get(targetHandleId) - if (!connection) { + private get(targetHandleId: string): ConnectionRecord { + const record = this.connections.get(targetHandleId) + if (!record) { throw new Error(`ACP connection is not open: ${targetHandleId}`) } - return connection + return record + } + + private findFrame( + frames: readonly ProtocolTraceFrame[], + predicate: (frame: ProtocolTraceFrame) => boolean + ): ProtocolTraceFrame | undefined { + for (let index = frames.length - 1; index >= 0; index -= 1) { + const frame = frames[index] + if (frame && predicate(frame)) return frame + } + return undefined } } diff --git a/test/contract/harness-initialize.contract.spec.ts b/test/contract/harness-initialize.contract.spec.ts index 8420626..10aedd3 100644 --- a/test/contract/harness-initialize.contract.spec.ts +++ b/test/contract/harness-initialize.contract.spec.ts @@ -45,5 +45,20 @@ describe('Harness ↔ official SDK ↔ fixture contract', () => { expect(exit).toEqual({ code: 17, signal: null }) expect(harness.processes.list()).toHaveLength(0) + expect(harness.events).toContainEqual( + expect.objectContaining({ + type: 'process/exited', + connectionId: target.id, + code: 17, + signal: null, + }) + ) + expect(harness.events).toContainEqual( + expect.objectContaining({ + type: 'connection/state-changed', + connectionId: target.id, + state: 'crashed', + }) + ) }) }) diff --git a/test/contract/harness-trace.contract.spec.ts b/test/contract/harness-trace.contract.spec.ts new file mode 100644 index 0000000..cb2d72f --- /dev/null +++ b/test/contract/harness-trace.contract.spec.ts @@ -0,0 +1,114 @@ +import { afterEach, describe, expect, it } from 'vitest' +import { AcpHarness } from '../../packages/acp-harness/src/harness.js' +import { + createFixtureRegistry, + repositoryRoot, +} from '../helpers/acp-fixture.js' + +const harnesses: AcpHarness[] = [] + +afterEach(async () => { + await Promise.all(harnesses.splice(0).map(harness => harness.dispose())) +}) + +async function waitFor( + predicate: () => boolean, + timeoutMs = 1_000 +): Promise { + const deadline = Date.now() + timeoutMs + while (!predicate()) { + if (Date.now() > deadline) + throw new Error('Timed out waiting for condition') + await new Promise(resolve => setTimeout(resolve, 5)) + } +} + +describe('Harness raw trace and semantic event contract', () => { + it('correlates initialize frames with a normalized capability event', async () => { + const harness = new AcpHarness( + await createFixtureRegistry(), + undefined, + 'trace-contract-run' + ) + harnesses.push(harness) + const target = await harness.startTarget({ + targetId: 'fixture-agent', + workspaceRoot: repositoryRoot, + }) + + await harness.initialize(target.id) + + const request = harness.trace.find( + frame => frame.direction === 'client-to-agent' && frame.kind === 'request' + ) + const response = harness.trace.find( + frame => + frame.direction === 'agent-to-client' && frame.kind === 'response' + ) + const capabilities = harness.events.find( + event => event.type === 'capability/snapshot' + ) + + expect(request).toMatchObject({ + runId: 'trace-contract-run', + connectionId: target.id, + method: 'initialize', + }) + expect(response?.requestId).toBe(request?.requestId) + expect(capabilities).toMatchObject({ + runId: 'trace-contract-run', + connectionId: target.id, + agentInfo: { name: 'axis-deterministic-fixture' }, + sourceTraceIds: [request?.id, response?.id], + }) + + const sequences = [...harness.trace, ...harness.events] + .map(item => item.sequence) + .sort((left, right) => left - right) + expect(new Set(sequences).size).toBe(sequences.length) + expect(sequences).toEqual( + Array.from({ length: sequences.length }, (_, index) => index + 1) + ) + }) + + it('records invalid stdout even when the SDK continues with later frames', async () => { + const harness = new AcpHarness(await createFixtureRegistry()) + harnesses.push(harness) + const target = await harness.startTarget({ + targetId: 'fixture-agent', + workspaceRoot: repositoryRoot, + args: ['--stdout-noise'], + }) + + const initialized = await harness.initialize(target.id) + + expect(initialized.response.agentInfo?.name).toBe( + 'axis-deterministic-fixture' + ) + expect(harness.trace).toContainEqual( + expect.objectContaining({ + direction: 'agent-to-client', + kind: 'invalid-json', + raw: 'fixture stdout noise', + }) + ) + }) + + it('keeps agent stderr outside the ACP protocol ledger', async () => { + const harness = new AcpHarness(await createFixtureRegistry()) + harnesses.push(harness) + const target = await harness.startTarget({ + targetId: 'fixture-agent', + workspaceRoot: repositoryRoot, + args: ['--stderr-marker'], + }) + + await harness.initialize(target.id) + await waitFor(() => target.stderr.includes('fixture stderr marker')) + + expect(target.stderr).toContain('fixture stderr marker') + expect( + harness.trace.every(frame => !frame.raw.includes('stderr marker')) + ).toBe(true) + }) +}) diff --git a/test/helpers/acp-fixture.ts b/test/helpers/acp-fixture.ts index b6e9fb0..bca7884 100644 --- a/test/helpers/acp-fixture.ts +++ b/test/helpers/acp-fixture.ts @@ -18,7 +18,11 @@ export const fixtureTarget: TargetDefinition = { id: 'fixture-agent', command: process.execPath, fixedArgs: [fixtureAgentPath], - allowedArgs: ['--crash-after-initialize'], + allowedArgs: [ + '--crash-after-initialize', + '--stdout-noise', + '--stderr-marker', + ], environmentAllowlist: ['PATH'], maxProcesses: 2, expectedProtocolVersion: 'v1', From fc00fd3030186fc9d083ffffc14118208ef289d9 Mon Sep 17 00:00:00 2001 From: CalvinWade Date: Fri, 12 Jun 2026 14:05:00 +0800 Subject: [PATCH 07/20] feat: add deterministic ACP session reducer --- packages/acp-core/src/axis-event.ts | 54 ++++++ packages/acp-core/src/index.ts | 1 + packages/acp-core/src/session-reducer.spec.ts | 132 ++++++++++++++ packages/acp-core/src/session-reducer.ts | 166 ++++++++++++++++++ 4 files changed, 353 insertions(+) create mode 100644 packages/acp-core/src/session-reducer.spec.ts create mode 100644 packages/acp-core/src/session-reducer.ts diff --git a/packages/acp-core/src/axis-event.ts b/packages/acp-core/src/axis-event.ts index e77b968..84bf8b9 100644 --- a/packages/acp-core/src/axis-event.ts +++ b/packages/acp-core/src/axis-event.ts @@ -28,9 +28,63 @@ export interface ProcessExitedEvent extends AxisAcpEventBase { readonly signal: string | null } +export type SessionStatus = + | 'created' + | 'prompting' + | 'cancelling' + | 'completed' + | 'cancelled' + | 'failed' + | 'crashed' + +export interface SessionStateChangedEvent extends AxisAcpEventBase { + readonly type: 'session/state-changed' + readonly sessionId: string + readonly state: SessionStatus + readonly stopReason?: string + readonly error?: string +} + +export interface MessageChunkAppendedEvent extends AxisAcpEventBase { + readonly type: 'message/chunk-appended' + readonly sessionId: string + readonly messageId: string + readonly role: 'user' | 'agent' | 'thought' + readonly content: unknown +} + +export interface ToolCallUpsertEvent extends AxisAcpEventBase { + readonly type: 'tool-call/upsert' + readonly sessionId: string + readonly toolCallId: string + readonly patch: Readonly> +} + +export interface PermissionRequestedEvent extends AxisAcpEventBase { + readonly type: 'permission/requested' + readonly sessionId: string + readonly permissionId: string + readonly toolCall: Readonly> + readonly options: readonly Readonly>[] +} + +export interface PermissionResolvedEvent extends AxisAcpEventBase { + readonly type: 'permission/resolved' + readonly sessionId: string + readonly permissionId: string + readonly outcome: + | { readonly outcome: 'cancelled' } + | { readonly outcome: 'selected'; readonly optionId: string } +} + export type AxisAcpEvent = | ConnectionStateChangedEvent | CapabilitySnapshotEvent | ProcessExitedEvent + | SessionStateChangedEvent + | MessageChunkAppendedEvent + | ToolCallUpsertEvent + | PermissionRequestedEvent + | PermissionResolvedEvent export type AxisAcpEventListener = (event: AxisAcpEvent) => void diff --git a/packages/acp-core/src/index.ts b/packages/acp-core/src/index.ts index a20dd3c..57e67e1 100644 --- a/packages/acp-core/src/index.ts +++ b/packages/acp-core/src/index.ts @@ -1,3 +1,4 @@ export * from './axis-event.js' export * from './protocol-trace.js' +export * from './session-reducer.js' export * from './sequence.js' diff --git a/packages/acp-core/src/session-reducer.spec.ts b/packages/acp-core/src/session-reducer.spec.ts new file mode 100644 index 0000000..9a709a7 --- /dev/null +++ b/packages/acp-core/src/session-reducer.spec.ts @@ -0,0 +1,132 @@ +import { describe, expect, it } from 'vitest' +import type { AxisAcpEvent } from './axis-event.js' +import { + createSessionState, + reduceSessionEvent, + reduceSessionEvents, +} from './session-reducer.js' + +const metadata = { + runId: 'run-reducer', + connectionId: 'connection-reducer', + sessionId: 'session-reducer', + timestamp: '2026-08-20T00:00:00.000Z', + protocolVersion: 'v1' as const, + sourceTraceIds: [], +} + +describe('reduceSessionEvent', () => { + it('aggregates message chunks and ignores a duplicate event ID', () => { + const initial = createSessionState( + metadata.sessionId, + metadata.connectionId + ) + const first: AxisAcpEvent = { + ...metadata, + id: 'chunk-1', + sequence: 1, + type: 'message/chunk-appended', + messageId: 'message-1', + role: 'agent', + content: { type: 'text', text: 'hello' }, + } + const second: AxisAcpEvent = { + ...first, + id: 'chunk-2', + sequence: 2, + content: { type: 'text', text: ' world' }, + } + + const state = reduceSessionEvents(initial, [second, first, first]) + + expect(state.messages['message-1']?.chunks).toEqual([ + { type: 'text', text: 'hello' }, + { type: 'text', text: ' world' }, + ]) + expect(state.appliedEventIds).toEqual(['chunk-1', 'chunk-2']) + }) + + it('uses sequence order so the first observed terminal state wins', () => { + const initial = createSessionState( + metadata.sessionId, + metadata.connectionId + ) + const cancelled: AxisAcpEvent = { + ...metadata, + id: 'cancelled', + sequence: 4, + type: 'session/state-changed', + state: 'cancelled', + stopReason: 'cancelled', + } + const completed: AxisAcpEvent = { + ...metadata, + id: 'completed', + sequence: 5, + type: 'session/state-changed', + state: 'completed', + stopReason: 'end_turn', + } + + expect(reduceSessionEvents(initial, [completed, cancelled]).status).toBe( + 'cancelled' + ) + }) + + it('clears pending permissions when the target process crashes', () => { + const initial = createSessionState( + metadata.sessionId, + metadata.connectionId + ) + const requested: AxisAcpEvent = { + ...metadata, + id: 'permission', + sequence: 1, + type: 'permission/requested', + permissionId: 'permission-1', + toolCall: { toolCallId: 'tool-1' }, + options: [], + } + const crashed: AxisAcpEvent = { + ...metadata, + sessionId: undefined, + id: 'crash', + sequence: 3, + type: 'process/exited', + code: 17, + signal: null, + } + const transportFailed: AxisAcpEvent = { + ...metadata, + id: 'transport-failed', + sequence: 2, + type: 'session/state-changed', + state: 'failed', + error: 'transport closed', + } + + const pending = reduceSessionEvent(initial, requested) + const failed = reduceSessionEvent(pending, transportFailed) + const state = reduceSessionEvent(failed, crashed) + + expect(state.status).toBe('crashed') + expect(state.pendingPermissions).toEqual({}) + }) + + it('does not apply an event from another session', () => { + const initial = createSessionState( + metadata.sessionId, + metadata.connectionId + ) + const event: AxisAcpEvent = { + ...metadata, + sessionId: 'another-session', + id: 'other-session-event', + sequence: 1, + type: 'session/state-changed', + state: 'prompting', + } + + expect(reduceSessionEvent(initial, event)).toBe(initial) + }) +}) diff --git a/packages/acp-core/src/session-reducer.ts b/packages/acp-core/src/session-reducer.ts new file mode 100644 index 0000000..56c4796 --- /dev/null +++ b/packages/acp-core/src/session-reducer.ts @@ -0,0 +1,166 @@ +import type { + AxisAcpEvent, + PermissionRequestedEvent, + SessionStatus, +} from './axis-event.js' + +export interface SessionMessage { + readonly id: string + readonly role: 'user' | 'agent' | 'thought' + readonly chunks: readonly unknown[] +} + +export interface SessionToolCall { + readonly id: string + readonly data: Readonly> +} + +export interface PendingPermission { + readonly id: string + readonly toolCall: Readonly> + readonly options: readonly Readonly>[] +} + +export interface AcpSessionState { + readonly sessionId: string + readonly connectionId: string + readonly status: SessionStatus + readonly stopReason?: string + readonly error?: string + readonly messages: Readonly> + readonly toolCalls: Readonly> + readonly pendingPermissions: Readonly> + readonly appliedEventIds: readonly string[] + readonly lastSequence: number +} + +const terminalStates = new Set([ + 'completed', + 'cancelled', + 'failed', + 'crashed', +]) + +export function createSessionState( + sessionId: string, + connectionId: string +): AcpSessionState { + return { + sessionId, + connectionId, + status: 'created', + messages: {}, + toolCalls: {}, + pendingPermissions: {}, + appliedEventIds: [], + lastSequence: 0, + } +} + +export function reduceSessionEvent( + state: AcpSessionState, + event: AxisAcpEvent +): AcpSessionState { + if (event.connectionId !== state.connectionId) return state + if (event.sessionId !== undefined && event.sessionId !== state.sessionId) { + return state + } + if (state.appliedEventIds.includes(event.id)) return state + + const base = { + ...state, + appliedEventIds: [...state.appliedEventIds, event.id], + lastSequence: Math.max(state.lastSequence, event.sequence), + } + + switch (event.type) { + case 'session/state-changed': { + if (terminalStates.has(state.status)) return base + return { + ...base, + status: event.state, + stopReason: event.stopReason, + error: event.error, + pendingPermissions: terminalStates.has(event.state) + ? {} + : state.pendingPermissions, + } + } + case 'message/chunk-appended': { + const existing = state.messages[event.messageId] + return { + ...base, + messages: { + ...state.messages, + [event.messageId]: { + id: event.messageId, + role: event.role, + chunks: [...(existing?.chunks ?? []), event.content], + }, + }, + } + } + case 'tool-call/upsert': { + const existing = state.toolCalls[event.toolCallId] + return { + ...base, + toolCalls: { + ...state.toolCalls, + [event.toolCallId]: { + id: event.toolCallId, + data: { ...existing?.data, ...event.patch }, + }, + }, + } + } + case 'permission/requested': + return addPermission(base, event) + case 'permission/resolved': { + const pendingPermissions = { ...state.pendingPermissions } + delete pendingPermissions[event.permissionId] + return { ...base, pendingPermissions } + } + case 'process/exited': + if (state.status === 'completed' || state.status === 'cancelled') { + return base + } + return { ...base, status: 'crashed', pendingPermissions: {} } + case 'connection/state-changed': + if ( + event.state !== 'crashed' || + state.status === 'completed' || + state.status === 'cancelled' + ) { + return base + } + return { ...base, status: 'crashed', pendingPermissions: {} } + default: + return base + } +} + +export function reduceSessionEvents( + state: AcpSessionState, + events: readonly AxisAcpEvent[] +): AcpSessionState { + return [...events] + .sort((left, right) => left.sequence - right.sequence) + .reduce(reduceSessionEvent, state) +} + +function addPermission( + state: AcpSessionState, + event: PermissionRequestedEvent +): AcpSessionState { + return { + ...state, + pendingPermissions: { + ...state.pendingPermissions, + [event.permissionId]: { + id: event.permissionId, + toolCall: event.toolCall, + options: event.options, + }, + }, + } +} From b1bc62f6e306cf6266bcb53a7e255df16a56c0a4 Mon Sep 17 00:00:00 2001 From: CalvinWade Date: Fri, 12 Jun 2026 17:19:00 +0800 Subject: [PATCH 08/20] feat: orchestrate ACP session cancellation --- fixtures/acp-agents/bin/fixture-agent.mjs | 83 +++++++ packages/acp-harness/src/acp-v1-adapter.ts | 100 +++++++- packages/acp-harness/src/harness.ts | 49 +++- packages/acp-harness/src/sdk-client.ts | 234 +++++++++++++++++- packages/acp-harness/src/types.ts | 28 ++- .../contract/harness-session.contract.spec.ts | 144 +++++++++++ test/helpers/acp-fixture.ts | 2 + 7 files changed, 632 insertions(+), 8 deletions(-) create mode 100644 test/contract/harness-session.contract.spec.ts diff --git a/fixtures/acp-agents/bin/fixture-agent.mjs b/fixtures/acp-agents/bin/fixture-agent.mjs index aae383c..b90bcfb 100644 --- a/fixtures/acp-agents/bin/fixture-agent.mjs +++ b/fixtures/acp-agents/bin/fixture-agent.mjs @@ -7,10 +7,15 @@ const shouldCrashAfterInitialize = process.argv.includes( ) const shouldEmitStdoutNoise = process.argv.includes('--stdout-noise') const shouldEmitStderr = process.argv.includes('--stderr-marker') +const shouldRequestPermission = process.argv.includes('--permission-prompt') +const shouldCrashDuringPrompt = process.argv.includes('--crash-during-prompt') if (shouldEmitStdoutNoise) process.stdout.write('fixture stdout noise\n') if (shouldEmitStderr) process.stderr.write('fixture stderr marker\n') +let sessionCounter = 0 +const cancelledSessions = new Set() + const app = acp .agent({ name: 'axis-deterministic-fixture' }) .onRequest(acp.methods.agent.initialize, () => { @@ -24,6 +29,84 @@ const app = acp }, } }) + .onRequest(acp.methods.agent.session.new, () => { + sessionCounter += 1 + return { sessionId: `fixture-session-${sessionCounter}` } + }) + .onRequest(acp.methods.agent.session.prompt, async context => { + const { sessionId } = context.params + await context.client.notify(acp.methods.client.session.update, { + sessionId, + update: { + sessionUpdate: 'agent_message_chunk', + messageId: `message-${sessionCounter}`, + content: { type: 'text', text: 'fixture response' }, + }, + }) + + if (shouldCrashDuringPrompt) { + setTimeout(() => process.exit(17), 20) + await new Promise(() => undefined) + } + + if (shouldRequestPermission) { + await context.client.notify(acp.methods.client.session.update, { + sessionId, + update: { + sessionUpdate: 'tool_call', + toolCallId: 'permission-tool', + title: 'Run deterministic command', + kind: 'execute', + status: 'pending', + }, + }) + const permission = await context.client.request( + acp.methods.client.session.requestPermission, + { + sessionId, + toolCall: { + toolCallId: 'permission-tool', + title: 'Run deterministic command', + kind: 'execute', + status: 'pending', + }, + options: [ + { + kind: 'allow_once', + name: 'Allow once', + optionId: 'allow', + }, + { + kind: 'reject_once', + name: 'Reject once', + optionId: 'reject', + }, + ], + } + ) + if ( + permission.outcome.outcome === 'cancelled' || + cancelledSessions.has(sessionId) + ) { + return { stopReason: 'cancelled' } + } + await context.client.notify(acp.methods.client.session.update, { + sessionId, + update: { + sessionUpdate: 'tool_call_update', + toolCallId: 'permission-tool', + status: 'completed', + }, + }) + } + + return { + stopReason: cancelledSessions.has(sessionId) ? 'cancelled' : 'end_turn', + } + }) + .onNotification(acp.methods.agent.session.cancel, context => { + cancelledSessions.add(context.params.sessionId) + }) const stream = acp.ndJsonStream( Writable.toWeb(process.stdout), diff --git a/packages/acp-harness/src/acp-v1-adapter.ts b/packages/acp-harness/src/acp-v1-adapter.ts index 15c6575..bb4791d 100644 --- a/packages/acp-harness/src/acp-v1-adapter.ts +++ b/packages/acp-harness/src/acp-v1-adapter.ts @@ -1,11 +1,22 @@ -import type { InitializeResponse } from '@agentclientprotocol/sdk' +import type { + InitializeResponse, + RequestPermissionOutcome, + RequestPermissionRequest, + SessionNotification, + StopReason, +} from '@agentclientprotocol/sdk' import type { AxisAcpEvent, AxisAcpEventListener, CapabilitySnapshotEvent, ConnectionStateChangedEvent, + MessageChunkAppendedEvent, + PermissionRequestedEvent, + PermissionResolvedEvent, ProcessExitedEvent, SequenceAllocator, + SessionStateChangedEvent, + ToolCallUpsertEvent, } from '@axis-ui/acp-core' import type { TargetExit } from './types.js' @@ -57,6 +68,86 @@ export class AcpV1Adapter { }) } + sessionState( + sessionId: string, + state: SessionStateChangedEvent['state'], + sourceTraceIds: readonly string[] = [], + details: { readonly stopReason?: StopReason; readonly error?: string } = {} + ): SessionStateChangedEvent { + return this.emit({ + ...this.sessionMetadata(sourceTraceIds, sessionId), + type: 'session/state-changed', + state, + ...details, + }) + } + + sessionUpdate( + notification: SessionNotification, + sourceTraceIds: readonly string[] + ): AxisAcpEvent | undefined { + const { sessionId, update } = notification + switch (update.sessionUpdate) { + case 'user_message_chunk': + case 'agent_message_chunk': + case 'agent_thought_chunk': { + const role = + update.sessionUpdate === 'user_message_chunk' + ? 'user' + : update.sessionUpdate === 'agent_thought_chunk' + ? 'thought' + : 'agent' + return this.emit({ + ...this.sessionMetadata(sourceTraceIds, sessionId), + type: 'message/chunk-appended', + messageId: + update.messageId ?? + `${sessionId}:${role}:${sourceTraceIds[0] ?? 'local'}`, + role, + content: update.content, + }) + } + case 'tool_call': + case 'tool_call_update': + return this.emit({ + ...this.sessionMetadata(sourceTraceIds, sessionId), + type: 'tool-call/upsert', + toolCallId: update.toolCallId, + patch: update as unknown as Readonly>, + }) + default: + return undefined + } + } + + permissionRequested( + permissionId: string, + request: RequestPermissionRequest, + sourceTraceIds: readonly string[] + ): PermissionRequestedEvent { + return this.emit({ + ...this.sessionMetadata(sourceTraceIds, request.sessionId), + type: 'permission/requested', + permissionId, + toolCall: request.toolCall as Readonly>, + options: request.options as readonly Readonly>[], + }) + } + + permissionResolved( + permissionId: string, + sessionId: string, + outcome: RequestPermissionOutcome, + sourceTraceIds: readonly string[] = [] + ): PermissionResolvedEvent { + return this.emit({ + ...this.sessionMetadata(sourceTraceIds, sessionId), + type: 'permission/resolved', + permissionId, + outcome, + }) + } + private metadata(sourceTraceIds: readonly string[]): EventMetadata { const sequence = this.options.sequence.next() return { @@ -70,6 +161,13 @@ export class AcpV1Adapter { } } + private sessionMetadata( + sourceTraceIds: readonly string[], + sessionId: string + ): EventMetadata & { readonly sessionId: string } { + return { ...this.metadata(sourceTraceIds), sessionId } + } + private emit(event: T): T { this.options.onEvent?.(event) return event diff --git a/packages/acp-harness/src/harness.ts b/packages/acp-harness/src/harness.ts index f4be33a..96e2ecd 100644 --- a/packages/acp-harness/src/harness.ts +++ b/packages/acp-harness/src/harness.ts @@ -1,16 +1,25 @@ import type { + AcpSessionState, AxisAcpEvent, AxisAcpEventListener, ProtocolTraceFrame, ProtocolTraceListener, } from '@axis-ui/acp-core' -import { SequenceAllocator } from '@axis-ui/acp-core' +import { + SequenceAllocator, + createSessionState, + reduceSessionEvent, +} from '@axis-ui/acp-core' import { randomUUID } from 'node:crypto' import { ProcessManager } from './process-manager.js' import { AcpSdkClient } from './sdk-client.js' import { TargetRegistry } from './target-registry.js' import type { HarnessInitialization, + PermissionDecision, + PromptInput, + PromptSubmission, + SessionIdentity, TargetHandle, TargetStartRequest, } from './types.js' @@ -23,6 +32,7 @@ export class AcpHarness { private readonly traceListeners = new Set() private readonly recordedEvents: AxisAcpEvent[] = [] private readonly recordedTrace: ProtocolTraceFrame[] = [] + private readonly sessionStates = new Map() constructor( readonly registry: TargetRegistry, @@ -56,6 +66,10 @@ export class AcpHarness { return () => this.traceListeners.delete(listener) } + getSession(sessionId: string): AcpSessionState | undefined { + return this.sessionStates.get(sessionId) + } + async startTarget(request: TargetStartRequest): Promise { const resolved = await this.registry.resolve(request) const target = this.processes.start(resolved) @@ -70,6 +84,26 @@ export class AcpHarness { } } + async createSession(targetHandleId: string): Promise { + const target = this.processes.get(targetHandleId) + return this.sdk.createSession(targetHandleId, target.cwd) + } + + async submitPrompt(input: PromptInput): Promise { + return this.sdk.submitPrompt(input) + } + + async cancelSession( + targetHandleId: string, + sessionId: string + ): Promise { + await this.sdk.cancelSession(targetHandleId, sessionId) + } + + respondPermission(decision: PermissionDecision): void { + this.sdk.respondPermission(decision) + } + async stopTarget(targetHandleId: string): Promise { await this.processes.stop(targetHandleId) this.sdk.close(targetHandleId) @@ -82,6 +116,19 @@ export class AcpHarness { private publishEvent(event: AxisAcpEvent): void { this.recordedEvents.push(event) + if (event.sessionId !== undefined) { + const state = + this.sessionStates.get(event.sessionId) ?? + createSessionState(event.sessionId, event.connectionId) + this.sessionStates.set(event.sessionId, reduceSessionEvent(state, event)) + } else if ( + event.type === 'process/exited' || + event.type === 'connection/state-changed' + ) { + for (const [sessionId, state] of this.sessionStates) { + this.sessionStates.set(sessionId, reduceSessionEvent(state, event)) + } + } for (const listener of this.eventListeners) listener(event) } diff --git a/packages/acp-harness/src/sdk-client.ts b/packages/acp-harness/src/sdk-client.ts index b577284..2fb5e2e 100644 --- a/packages/acp-harness/src/sdk-client.ts +++ b/packages/acp-harness/src/sdk-client.ts @@ -5,6 +5,9 @@ import { ndJsonStream, type ClientConnection, type InitializeResponse, + type RequestPermissionOutcome, + type RequestPermissionRequest, + type RequestPermissionResponse, } from '@agentclientprotocol/sdk' import type { AxisAcpEventListener, @@ -13,9 +16,17 @@ import type { SequenceAllocator, } from '@axis-ui/acp-core' import { Readable, Writable } from 'node:stream' +import { randomUUID } from 'node:crypto' import { AcpV1Adapter } from './acp-v1-adapter.js' +import { HarnessError } from './errors.js' import type { ManagedTarget } from './process-manager.js' import { TransportTap } from './transport-tap.js' +import type { + PermissionDecision, + PromptInput, + PromptSubmission, + SessionIdentity, +} from './types.js' export interface AcpSdkClientOptions { readonly runId: string @@ -28,6 +39,15 @@ interface ConnectionRecord { readonly connection: ClientConnection readonly tap: TransportTap readonly adapter: AcpV1Adapter + readonly sessions: Set + readonly pendingPermissions: Map +} + +interface PendingPermission { + readonly id: string + readonly request: RequestPermissionRequest + readonly requestTraceIds: readonly string[] + readonly resolve: (response: RequestPermissionResponse) => void } export class AcpSdkClient { @@ -59,15 +79,36 @@ export class AcpSdkClient { ) ) const connection = client({ name: 'axis-acp-devkit' }) - .onRequest(methods.client.session.requestPermission, () => ({ - outcome: { outcome: 'cancelled' }, - })) - .onNotification(methods.client.session.update, () => undefined) + .onRequest(methods.client.session.requestPermission, context => { + return this.requestPermission(this.get(target.id), context.params) + }) + .onNotification(methods.client.session.update, context => { + const record = this.get(target.id) + const source = this.findFrame( + record.tap.frames, + frame => + frame.direction === 'agent-to-client' && + frame.kind === 'notification' && + frame.method === 'session/update' + ) + record.adapter.sessionUpdate( + context.params, + source === undefined ? [] : [source.id] + ) + }) .connect(stream) - this.connections.set(target.id, { connection, tap, adapter }) + const record: ConnectionRecord = { + connection, + tap, + adapter, + sessions: new Set(), + pendingPermissions: new Map(), + } + this.connections.set(target.id, record) adapter.connectionState('connected') void target.exited.then(exit => { + this.cancelPendingPermissions(record) connection.close(new Error('Target process exited')) this.connections.delete(target.id) adapter.processExited(exit) @@ -112,12 +153,195 @@ export class AcpSdkClient { return response } + async createSession( + targetHandleId: string, + cwd: string + ): Promise { + const record = this.get(targetHandleId) + const startingSequence = this.options.sequence.peek() + const response = await record.connection.agent.request( + methods.agent.session.new, + { cwd, mcpServers: [] } + ) + record.sessions.add(response.sessionId) + const sourceTraceIds = this.correlateRequest( + record, + 'session/new', + startingSequence + ) + record.adapter.sessionState(response.sessionId, 'created', sourceTraceIds) + return { targetHandleId, sessionId: response.sessionId } + } + + submitPrompt(input: PromptInput): PromptSubmission { + const record = this.get(input.targetHandleId) + this.assertSession(record, input.sessionId) + if (input.text.length === 0) { + throw new HarnessError('Prompt must not be empty', 'EMPTY_PROMPT') + } + + const turnId = randomUUID() + const startingSequence = this.options.sequence.peek() + record.adapter.sessionState(input.sessionId, 'prompting') + const completion = record.connection.agent.request( + methods.agent.session.prompt, + { + sessionId: input.sessionId, + prompt: [{ type: 'text', text: input.text }], + } + ) + void completion.then( + response => { + const sourceTraceIds = this.correlateRequest( + record, + 'session/prompt', + startingSequence + ) + record.adapter.sessionState( + input.sessionId, + response.stopReason === 'cancelled' ? 'cancelled' : 'completed', + sourceTraceIds, + { stopReason: response.stopReason } + ) + }, + error => { + record.adapter.sessionState(input.sessionId, 'failed', [], { + error: error instanceof Error ? error.message : String(error), + }) + } + ) + return { turnId, sessionId: input.sessionId } + } + + async cancelSession( + targetHandleId: string, + sessionId: string + ): Promise { + const record = this.get(targetHandleId) + this.assertSession(record, sessionId) + record.adapter.sessionState(sessionId, 'cancelling') + const notification = record.connection.agent.notify( + methods.agent.session.cancel, + { sessionId } + ) + this.cancelPendingPermissions(record, sessionId) + await notification + } + + respondPermission(decision: PermissionDecision): void { + const record = this.get(decision.targetHandleId) + const pending = record.pendingPermissions.get(decision.permissionId) + if (!pending || pending.request.sessionId !== decision.sessionId) { + throw new HarnessError( + `Unknown pending permission: ${decision.permissionId}`, + 'UNKNOWN_PERMISSION' + ) + } + const outcome = decision.outcome + if ( + outcome.outcome === 'selected' && + !pending.request.options.some( + option => option.optionId === outcome.optionId + ) + ) { + throw new HarnessError( + `Unknown permission option: ${outcome.optionId}`, + 'UNKNOWN_PERMISSION_OPTION' + ) + } + this.resolvePermission(record, pending, outcome) + } + close(targetHandleId: string): void { const record = this.connections.get(targetHandleId) + if (record) this.cancelPendingPermissions(record) record?.connection.close() this.connections.delete(targetHandleId) } + private requestPermission( + record: ConnectionRecord, + request: RequestPermissionRequest + ): Promise { + const source = this.findFrame( + record.tap.frames, + frame => + frame.direction === 'agent-to-client' && + frame.kind === 'request' && + frame.method === 'session/request_permission' + ) + const permissionId = source?.id ?? randomUUID() + const requestTraceIds = source === undefined ? [] : [source.id] + return new Promise(resolve => { + const pending: PendingPermission = { + id: permissionId, + request, + requestTraceIds, + resolve, + } + record.pendingPermissions.set(permissionId, pending) + record.adapter.permissionRequested(permissionId, request, requestTraceIds) + }) + } + + private cancelPendingPermissions( + record: ConnectionRecord, + sessionId?: string + ): void { + for (const pending of [...record.pendingPermissions.values()]) { + if (sessionId !== undefined && pending.request.sessionId !== sessionId) { + continue + } + this.resolvePermission(record, pending, { outcome: 'cancelled' }) + } + } + + private resolvePermission( + record: ConnectionRecord, + pending: PendingPermission, + outcome: RequestPermissionOutcome + ): void { + record.pendingPermissions.delete(pending.id) + pending.resolve({ outcome }) + record.adapter.permissionResolved( + pending.id, + pending.request.sessionId, + outcome, + pending.requestTraceIds + ) + } + + private assertSession(record: ConnectionRecord, sessionId: string): void { + if (!record.sessions.has(sessionId)) { + throw new HarnessError(`Unknown session: ${sessionId}`, 'UNKNOWN_SESSION') + } + } + + private correlateRequest( + record: ConnectionRecord, + method: string, + startingSequence: number + ): readonly string[] { + const request = this.findFrame( + record.tap.frames, + frame => + frame.sequence > startingSequence && + frame.direction === 'client-to-agent' && + frame.kind === 'request' && + frame.method === method + ) + const response = this.findFrame( + record.tap.frames, + frame => + frame.direction === 'agent-to-client' && + frame.kind === 'response' && + frame.requestId === request?.requestId + ) + return [request?.id, response?.id].filter( + (id): id is string => id !== undefined + ) + } + private get(targetHandleId: string): ConnectionRecord { const record = this.connections.get(targetHandleId) if (!record) { diff --git a/packages/acp-harness/src/types.ts b/packages/acp-harness/src/types.ts index 9dabde2..0937c6e 100644 --- a/packages/acp-harness/src/types.ts +++ b/packages/acp-harness/src/types.ts @@ -1,4 +1,7 @@ -import type { InitializeResponse } from '@agentclientprotocol/sdk' +import type { + InitializeResponse, + RequestPermissionOutcome, +} from '@agentclientprotocol/sdk' export type ProtocolVersion = 'v1' @@ -45,3 +48,26 @@ export interface HarnessInitialization { readonly targetHandleId: string readonly response: InitializeResponse } + +export interface SessionIdentity { + readonly targetHandleId: string + readonly sessionId: string +} + +export interface PromptInput { + readonly targetHandleId: string + readonly sessionId: string + readonly text: string +} + +export interface PromptSubmission { + readonly turnId: string + readonly sessionId: string +} + +export interface PermissionDecision { + readonly targetHandleId: string + readonly sessionId: string + readonly permissionId: string + readonly outcome: RequestPermissionOutcome +} diff --git a/test/contract/harness-session.contract.spec.ts b/test/contract/harness-session.contract.spec.ts new file mode 100644 index 0000000..efaa972 --- /dev/null +++ b/test/contract/harness-session.contract.spec.ts @@ -0,0 +1,144 @@ +import { afterEach, describe, expect, it } from 'vitest' +import { AcpHarness } from '../../packages/acp-harness/src/harness.js' +import { + createFixtureRegistry, + repositoryRoot, +} from '../helpers/acp-fixture.js' + +const harnesses: AcpHarness[] = [] + +afterEach(async () => { + await Promise.all(harnesses.splice(0).map(harness => harness.dispose())) +}) + +async function waitFor( + predicate: () => boolean, + timeoutMs = 2_000 +): Promise { + const deadline = Date.now() + timeoutMs + while (!predicate()) { + if (Date.now() > deadline) + throw new Error('Timed out waiting for condition') + await new Promise(resolve => setTimeout(resolve, 5)) + } +} + +async function startHarness(args: readonly string[] = []): Promise<{ + harness: AcpHarness + targetId: string +}> { + const harness = new AcpHarness(await createFixtureRegistry()) + harnesses.push(harness) + const target = await harness.startTarget({ + targetId: 'fixture-agent', + workspaceRoot: repositoryRoot, + args, + }) + await harness.initialize(target.id) + return { harness, targetId: target.id } +} + +describe('Harness session lifecycle contract', () => { + it('reduces session/new, streaming update and prompt completion', async () => { + const { harness, targetId } = await startHarness() + const session = await harness.createSession(targetId) + + const submission = await harness.submitPrompt({ + targetHandleId: targetId, + sessionId: session.sessionId, + text: 'reply deterministically', + }) + expect(submission.sessionId).toBe(session.sessionId) + await waitFor( + () => harness.getSession(session.sessionId)?.status === 'completed' + ) + + const state = harness.getSession(session.sessionId) + expect(state).toMatchObject({ + status: 'completed', + stopReason: 'end_turn', + }) + expect(state?.messages['message-1']?.chunks).toEqual([ + { type: 'text', text: 'fixture response' }, + ]) + expect(harness.trace.map(frame => frame.method)).toContain('session/new') + expect(harness.trace.map(frame => frame.method)).toContain('session/prompt') + }) + + it('cancels the prompt and every pending permission together', async () => { + const { harness, targetId } = await startHarness(['--permission-prompt']) + const session = await harness.createSession(targetId) + await harness.submitPrompt({ + targetHandleId: targetId, + sessionId: session.sessionId, + text: 'request permission', + }) + await waitFor( + () => + Object.keys( + harness.getSession(session.sessionId)?.pendingPermissions ?? {} + ).length === 1 + ) + const permissionId = Object.keys( + harness.getSession(session.sessionId)?.pendingPermissions ?? {} + )[0] + expect(permissionId).toBeDefined() + if (permissionId === undefined) throw new Error('Permission ID is missing') + expect(() => + harness.respondPermission({ + targetHandleId: targetId, + sessionId: session.sessionId, + permissionId, + outcome: { outcome: 'selected', optionId: 'not-allowlisted' }, + }) + ).toThrowError( + expect.objectContaining({ code: 'UNKNOWN_PERMISSION_OPTION' }) + ) + + await harness.cancelSession(targetId, session.sessionId) + await waitFor( + () => harness.getSession(session.sessionId)?.status === 'cancelled' + ) + + const state = harness.getSession(session.sessionId) + expect(state?.pendingPermissions).toEqual({}) + expect(state?.stopReason).toBe('cancelled') + expect(state?.toolCalls['permission-tool']).toBeDefined() + expect(harness.trace).toContainEqual( + expect.objectContaining({ + direction: 'client-to-agent', + kind: 'notification', + method: 'session/cancel', + }) + ) + expect( + harness.trace.some( + frame => + frame.direction === 'client-to-agent' && + frame.kind === 'response' && + frame.raw.includes('cancelled') + ) + ).toBe(true) + }) + + it('converges an in-flight prompt to crashed when the agent exits', async () => { + const { harness, targetId } = await startHarness(['--crash-during-prompt']) + const target = harness.processes.get(targetId) + const session = await harness.createSession(targetId) + await harness.submitPrompt({ + targetHandleId: targetId, + sessionId: session.sessionId, + text: 'crash now', + }) + + expect(await target.exited).toEqual({ code: 17, signal: null }) + await waitFor( + () => harness.getSession(session.sessionId)?.status === 'crashed' + ) + + expect(harness.getSession(session.sessionId)).toMatchObject({ + status: 'crashed', + pendingPermissions: {}, + }) + }) +}) diff --git a/test/helpers/acp-fixture.ts b/test/helpers/acp-fixture.ts index bca7884..3f88869 100644 --- a/test/helpers/acp-fixture.ts +++ b/test/helpers/acp-fixture.ts @@ -22,6 +22,8 @@ export const fixtureTarget: TargetDefinition = { '--crash-after-initialize', '--stdout-noise', '--stderr-marker', + '--permission-prompt', + '--crash-during-prompt', ], environmentAllowlist: ['PATH'], maxProcesses: 2, From e8942ab1ac3d168c542b28023895e1b11cd18f01 Mon Sep 17 00:00:00 2001 From: CalvinWade Date: Sat, 13 Jun 2026 12:47:00 +0800 Subject: [PATCH 09/20] fix: preserve multi-turn session semantics --- packages/acp-core/src/session-reducer.spec.ts | 27 +++++++++++++++++++ packages/acp-core/src/session-reducer.ts | 7 ++++- packages/acp-harness/src/harness.ts | 14 ++++++++++ .../contract/harness-session.contract.spec.ts | 20 ++++++++++++++ 4 files changed, 67 insertions(+), 1 deletion(-) diff --git a/packages/acp-core/src/session-reducer.spec.ts b/packages/acp-core/src/session-reducer.spec.ts index 9a709a7..e2221d8 100644 --- a/packages/acp-core/src/session-reducer.spec.ts +++ b/packages/acp-core/src/session-reducer.spec.ts @@ -129,4 +129,31 @@ describe('reduceSessionEvent', () => { expect(reduceSessionEvent(initial, event)).toBe(initial) }) + + it('opens a later prompt turn after a completed turn', () => { + const initial = createSessionState( + metadata.sessionId, + metadata.connectionId + ) + const completed: AxisAcpEvent = { + ...metadata, + id: 'turn-1-completed', + sequence: 1, + type: 'session/state-changed', + state: 'completed', + stopReason: 'end_turn', + } + const nextPrompt: AxisAcpEvent = { + ...metadata, + id: 'turn-2-prompting', + sequence: 2, + type: 'session/state-changed', + state: 'prompting', + } + + const state = reduceSessionEvents(initial, [nextPrompt, completed]) + + expect(state.status).toBe('prompting') + expect(state.stopReason).toBeUndefined() + }) }) diff --git a/packages/acp-core/src/session-reducer.ts b/packages/acp-core/src/session-reducer.ts index 56c4796..a3dabca 100644 --- a/packages/acp-core/src/session-reducer.ts +++ b/packages/acp-core/src/session-reducer.ts @@ -75,7 +75,12 @@ export function reduceSessionEvent( switch (event.type) { case 'session/state-changed': { - if (terminalStates.has(state.status)) return base + if ( + terminalStates.has(state.status) && + !(event.state === 'prompting' && state.status !== 'crashed') + ) { + return base + } return { ...base, status: event.state, diff --git a/packages/acp-harness/src/harness.ts b/packages/acp-harness/src/harness.ts index 96e2ecd..94a4fbd 100644 --- a/packages/acp-harness/src/harness.ts +++ b/packages/acp-harness/src/harness.ts @@ -13,6 +13,7 @@ import { import { randomUUID } from 'node:crypto' import { ProcessManager } from './process-manager.js' import { AcpSdkClient } from './sdk-client.js' +import { HarnessError } from './errors.js' import { TargetRegistry } from './target-registry.js' import type { HarnessInitialization, @@ -90,6 +91,19 @@ export class AcpHarness { } async submitPrompt(input: PromptInput): Promise { + const state = this.sessionStates.get(input.sessionId) + if (state?.status === 'prompting' || state?.status === 'cancelling') { + throw new HarnessError( + `Session already has an active prompt: ${input.sessionId}`, + 'SESSION_BUSY' + ) + } + if (state?.status === 'crashed') { + throw new HarnessError( + `Session connection has crashed: ${input.sessionId}`, + 'SESSION_CRASHED' + ) + } return this.sdk.submitPrompt(input) } diff --git a/test/contract/harness-session.contract.spec.ts b/test/contract/harness-session.contract.spec.ts index efaa972..d8b877c 100644 --- a/test/contract/harness-session.contract.spec.ts +++ b/test/contract/harness-session.contract.spec.ts @@ -49,6 +49,13 @@ describe('Harness session lifecycle contract', () => { text: 'reply deterministically', }) expect(submission.sessionId).toBe(session.sessionId) + await expect( + harness.submitPrompt({ + targetHandleId: targetId, + sessionId: session.sessionId, + text: 'must not overlap', + }) + ).rejects.toMatchObject({ code: 'SESSION_BUSY' }) await waitFor( () => harness.getSession(session.sessionId)?.status === 'completed' ) @@ -61,6 +68,19 @@ describe('Harness session lifecycle contract', () => { expect(state?.messages['message-1']?.chunks).toEqual([ { type: 'text', text: 'fixture response' }, ]) + + await harness.submitPrompt({ + targetHandleId: targetId, + sessionId: session.sessionId, + text: 'continue the same session', + }) + await waitFor( + () => + harness.getSession(session.sessionId)?.status === 'completed' && + harness.getSession(session.sessionId)?.messages['message-1']?.chunks + .length === 2 + ) + expect(harness.trace.map(frame => frame.method)).toContain('session/new') expect(harness.trace.map(frame => frame.method)).toContain('session/prompt') }) From a81ea1258dce09ba7e1906cabaf21ee0ee48483c Mon Sep 17 00:00:00 2001 From: CalvinWade Date: Sun, 14 Jun 2026 09:44:00 +0800 Subject: [PATCH 10/20] fix: converge tool state during cancellation --- packages/acp-core/src/session-reducer.ts | 19 +++++++++++++++++++ .../contract/harness-session.contract.spec.ts | 2 +- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/packages/acp-core/src/session-reducer.ts b/packages/acp-core/src/session-reducer.ts index a3dabca..1492b62 100644 --- a/packages/acp-core/src/session-reducer.ts +++ b/packages/acp-core/src/session-reducer.ts @@ -89,6 +89,10 @@ export function reduceSessionEvent( pendingPermissions: terminalStates.has(event.state) ? {} : state.pendingPermissions, + toolCalls: + event.state === 'cancelling' + ? cancelToolCalls(state.toolCalls) + : state.toolCalls, } } case 'message/chunk-appended': { @@ -144,6 +148,21 @@ export function reduceSessionEvent( } } +function cancelToolCalls( + toolCalls: Readonly> +): Readonly> { + return Object.fromEntries( + Object.entries(toolCalls).map(([id, toolCall]) => { + const status = toolCall.data.status + if (status === 'completed' || status === 'failed') return [id, toolCall] + return [ + id, + { ...toolCall, data: { ...toolCall.data, status: 'cancelled' } }, + ] + }) + ) +} + export function reduceSessionEvents( state: AcpSessionState, events: readonly AxisAcpEvent[] diff --git a/test/contract/harness-session.contract.spec.ts b/test/contract/harness-session.contract.spec.ts index d8b877c..791e1ad 100644 --- a/test/contract/harness-session.contract.spec.ts +++ b/test/contract/harness-session.contract.spec.ts @@ -123,7 +123,7 @@ describe('Harness session lifecycle contract', () => { const state = harness.getSession(session.sessionId) expect(state?.pendingPermissions).toEqual({}) expect(state?.stopReason).toBe('cancelled') - expect(state?.toolCalls['permission-tool']).toBeDefined() + expect(state?.toolCalls['permission-tool']?.data.status).toBe('cancelled') expect(harness.trace).toContainEqual( expect.objectContaining({ direction: 'client-to-agent', From 1ac31eccdbd66e3b19e4f21d2402f755576d7ad5 Mon Sep 17 00:00:00 2001 From: CalvinWade Date: Tue, 16 Jun 2026 10:13:00 +0800 Subject: [PATCH 11/20] feat: classify ACP lifecycle diagnostics --- packages/acp-core/src/diagnostic.ts | 80 ++++ packages/acp-core/src/index.ts | 1 + packages/acp-harness/src/client-profiles.ts | 27 ++ packages/acp-harness/src/harness.ts | 36 +- packages/acp-harness/src/index.ts | 2 + packages/acp-harness/src/invariants.ts | 378 ++++++++++++++++++ packages/acp-harness/src/sdk-client.ts | 29 +- .../contract/harness-session.contract.spec.ts | 16 +- .../lifecycle-invariants.scenario.spec.ts | 162 ++++++++ 9 files changed, 722 insertions(+), 9 deletions(-) create mode 100644 packages/acp-core/src/diagnostic.ts create mode 100644 packages/acp-harness/src/client-profiles.ts create mode 100644 packages/acp-harness/src/invariants.ts create mode 100644 test/scenario/lifecycle-invariants.scenario.spec.ts diff --git a/packages/acp-core/src/diagnostic.ts b/packages/acp-core/src/diagnostic.ts new file mode 100644 index 0000000..c96d290 --- /dev/null +++ b/packages/acp-core/src/diagnostic.ts @@ -0,0 +1,80 @@ +import type { AcpSessionState } from './session-reducer.js' +import type { AxisAcpEvent } from './axis-event.js' +import type { ProtocolTraceFrame } from './protocol-trace.js' + +export type DiagnosticKind = + | 'protocol-violation' + | 'capability-contract-mismatch' + | 'scenario-assertion-failure' + | 'resource-leak' + | 'runtime-warning' + | 'performance-regression' + | 'harness-failure' + +export type DiagnosticSubject = + | 'agent' + | 'client-profile' + | 'harness' + | 'adapter' + | 'environment' + | 'unknown' + +export interface NormativeReference { + readonly standard: 'ACP' | 'JSON-RPC' + readonly protocolVersion?: 1 + readonly section: string + readonly url: string + readonly requirement: 'MUST' | 'MUST NOT' | 'SHOULD' | 'SHOULD NOT' | 'MAY' +} + +export interface Diagnostic { + readonly id: string + readonly kind: DiagnosticKind + readonly runId: string + readonly scenarioId: string + readonly invariantId: string + readonly severity: 'info' | 'warning' | 'error' | 'fatal' + readonly subject: DiagnosticSubject + readonly message: string + readonly sequence?: number + readonly traceIds: readonly string[] + readonly stateSnapshotIds: readonly string[] + readonly faultInjectionIds: readonly string[] + readonly references: readonly NormativeReference[] +} + +export interface SessionStateSnapshot { + readonly id: string + readonly sequence: number + readonly state: AcpSessionState +} + +export interface ClientProfileSnapshot { + readonly id: string + readonly capabilities: Readonly> + readonly allowedClientMethods: readonly string[] +} + +export interface InvariantRunContext { + readonly runId: string + readonly scenarioId: string + readonly profile: ClientProfileSnapshot + readonly trace: readonly ProtocolTraceFrame[] + readonly events: readonly AxisAcpEvent[] + readonly stateSnapshots: readonly SessionStateSnapshot[] + readonly activeProcessCount: number + readonly faultInjectionIds: readonly string[] +} + +export interface LifecycleInvariant { + readonly id: string + readonly category: + | 'protocol' + | 'capability-contract' + | 'axis-scenario' + | 'resource' + | 'performance' + readonly description: string + readonly references: readonly NormativeReference[] + evaluate(context: InvariantRunContext): readonly Diagnostic[] +} diff --git a/packages/acp-core/src/index.ts b/packages/acp-core/src/index.ts index 57e67e1..e77afa0 100644 --- a/packages/acp-core/src/index.ts +++ b/packages/acp-core/src/index.ts @@ -1,4 +1,5 @@ export * from './axis-event.js' +export * from './diagnostic.js' export * from './protocol-trace.js' export * from './session-reducer.js' export * from './sequence.js' diff --git a/packages/acp-harness/src/client-profiles.ts b/packages/acp-harness/src/client-profiles.ts new file mode 100644 index 0000000..7ed2c45 --- /dev/null +++ b/packages/acp-harness/src/client-profiles.ts @@ -0,0 +1,27 @@ +import type { ClientCapabilities } from '@agentclientprotocol/sdk' + +export type ClientProfileId = 'minimal' | 'permission-only' + +export interface ClientCapabilityProfile { + readonly id: ClientProfileId + readonly capabilities: ClientCapabilities + readonly allowedClientMethods: readonly string[] +} + +export const clientProfiles: Readonly< + Record +> = Object.freeze({ + minimal: Object.freeze({ + id: 'minimal', + capabilities: Object.freeze({}), + allowedClientMethods: Object.freeze(['session/update']), + }), + 'permission-only': Object.freeze({ + id: 'permission-only', + capabilities: Object.freeze({}), + allowedClientMethods: Object.freeze([ + 'session/update', + 'session/request_permission', + ]), + }), +}) diff --git a/packages/acp-harness/src/harness.ts b/packages/acp-harness/src/harness.ts index 94a4fbd..90c4100 100644 --- a/packages/acp-harness/src/harness.ts +++ b/packages/acp-harness/src/harness.ts @@ -4,6 +4,7 @@ import type { AxisAcpEventListener, ProtocolTraceFrame, ProtocolTraceListener, + SessionStateSnapshot, } from '@axis-ui/acp-core' import { SequenceAllocator, @@ -14,6 +15,10 @@ import { randomUUID } from 'node:crypto' import { ProcessManager } from './process-manager.js' import { AcpSdkClient } from './sdk-client.js' import { HarnessError } from './errors.js' +import { + clientProfiles, + type ClientCapabilityProfile, +} from './client-profiles.js' import { TargetRegistry } from './target-registry.js' import type { HarnessInitialization, @@ -34,6 +39,7 @@ export class AcpHarness { private readonly recordedEvents: AxisAcpEvent[] = [] private readonly recordedTrace: ProtocolTraceFrame[] = [] private readonly sessionStates = new Map() + private readonly recordedStateSnapshots: SessionStateSnapshot[] = [] constructor( readonly registry: TargetRegistry, @@ -57,6 +63,10 @@ export class AcpHarness { return this.recordedTrace } + get stateSnapshots(): readonly SessionStateSnapshot[] { + return this.recordedStateSnapshots + } + subscribeEvents(listener: AxisAcpEventListener): () => void { this.eventListeners.add(listener) return () => this.eventListeners.delete(listener) @@ -78,10 +88,13 @@ export class AcpHarness { return target } - async initialize(targetHandleId: string): Promise { + async initialize( + targetHandleId: string, + profile: ClientCapabilityProfile = clientProfiles.minimal + ): Promise { return { targetHandleId, - response: await this.sdk.initialize(targetHandleId), + response: await this.sdk.initialize(targetHandleId, profile), } } @@ -134,18 +147,33 @@ export class AcpHarness { const state = this.sessionStates.get(event.sessionId) ?? createSessionState(event.sessionId, event.connectionId) - this.sessionStates.set(event.sessionId, reduceSessionEvent(state, event)) + const nextState = reduceSessionEvent(state, event) + this.sessionStates.set(event.sessionId, nextState) + this.recordStateSnapshot(event, nextState) } else if ( event.type === 'process/exited' || event.type === 'connection/state-changed' ) { for (const [sessionId, state] of this.sessionStates) { - this.sessionStates.set(sessionId, reduceSessionEvent(state, event)) + const nextState = reduceSessionEvent(state, event) + this.sessionStates.set(sessionId, nextState) + this.recordStateSnapshot(event, nextState) } } for (const listener of this.eventListeners) listener(event) } + private recordStateSnapshot( + event: AxisAcpEvent, + state: AcpSessionState + ): void { + this.recordedStateSnapshots.push({ + id: `${event.id}:state:${state.sessionId}`, + sequence: event.sequence, + state, + }) + } + private publishTrace(frame: ProtocolTraceFrame): void { this.recordedTrace.push(frame) for (const listener of this.traceListeners) listener(frame) diff --git a/packages/acp-harness/src/index.ts b/packages/acp-harness/src/index.ts index 7c8465c..3b4dce9 100644 --- a/packages/acp-harness/src/index.ts +++ b/packages/acp-harness/src/index.ts @@ -1,5 +1,7 @@ export * from './errors.js' export * from './harness.js' +export * from './client-profiles.js' +export * from './invariants.js' export * from './process-manager.js' export * from './sdk-client.js' export * from './target-registry.js' diff --git a/packages/acp-harness/src/invariants.ts b/packages/acp-harness/src/invariants.ts new file mode 100644 index 0000000..b947563 --- /dev/null +++ b/packages/acp-harness/src/invariants.ts @@ -0,0 +1,378 @@ +import type { + Diagnostic, + DiagnosticKind, + DiagnosticSubject, + InvariantRunContext, + LifecycleInvariant, + NormativeReference, + ProtocolTraceFrame, +} from '@axis-ui/acp-core' + +const jsonRpcReference: NormativeReference = { + standard: 'JSON-RPC', + section: 'Request Object, Notification and Response Object', + url: 'https://www.jsonrpc.org/specification', + requirement: 'MUST', +} + +const transportReference: NormativeReference = { + standard: 'ACP', + protocolVersion: 1, + section: 'Transports / stdio', + url: 'https://agentclientprotocol.com/protocol/v1/transports', + requirement: 'MUST NOT', +} + +const capabilityReference: NormativeReference = { + standard: 'ACP', + protocolVersion: 1, + section: 'Initialization / Client Capabilities', + url: 'https://agentclientprotocol.com/protocol/v1/initialization', + requirement: 'MUST', +} + +const cancelPermissionReference: NormativeReference = { + standard: 'ACP', + protocolVersion: 1, + section: 'Prompt Turn / Cancellation', + url: 'https://agentclientprotocol.com/protocol/v1/prompt-turn#cancellation', + requirement: 'MUST', +} + +const cancelledStopReference: NormativeReference = { + ...cancelPermissionReference, + section: 'Prompt Turn / Cancelled Stop Reason', +} + +function isRecord(value: unknown): value is Record { + return typeof value === 'object' && value !== null && !Array.isArray(value) +} + +function oppositeDirection( + frame: ProtocolTraceFrame +): ProtocolTraceFrame['direction'] { + return frame.direction === 'agent-to-client' + ? 'client-to-agent' + : 'agent-to-client' +} + +function matchingRequest( + trace: InvariantRunContext['trace'], + response: ProtocolTraceFrame +): ProtocolTraceFrame | undefined { + if (response.requestId === null || response.requestId === undefined) { + return undefined + } + return trace.find( + request => + request.sequence < response.sequence && + request.kind === 'request' && + request.direction === oppositeDirection(response) && + request.requestId === response.requestId + ) +} + +function diagnostic( + context: InvariantRunContext, + invariant: LifecycleInvariant, + input: { + readonly kind: DiagnosticKind + readonly severity: Diagnostic['severity'] + readonly subject: DiagnosticSubject + readonly message: string + readonly sequence?: number + readonly traceIds?: readonly string[] + } +): Diagnostic { + const snapshots = evidenceSnapshots(context.stateSnapshots, input.sequence) + return { + id: `${context.runId}:${invariant.id}:${input.sequence ?? 'run'}`, + kind: input.kind, + runId: context.runId, + scenarioId: context.scenarioId, + invariantId: invariant.id, + severity: input.severity, + subject: input.subject, + message: input.message, + sequence: input.sequence, + traceIds: input.traceIds ?? [], + stateSnapshotIds: snapshots.map(snapshot => snapshot.id), + faultInjectionIds: context.faultInjectionIds, + references: invariant.references, + } +} + +function evidenceSnapshots( + snapshots: InvariantRunContext['stateSnapshots'], + sequence?: number +): InvariantRunContext['stateSnapshots'] { + if (sequence === undefined) { + const last = snapshots.at(-1) + return last === undefined ? [] : [last] + } + const before = [...snapshots] + .reverse() + .find(snapshot => snapshot.sequence <= sequence) + const after = snapshots.find(snapshot => snapshot.sequence >= sequence) + if (before === undefined) return after === undefined ? [] : [after] + if (after === undefined || after.id === before.id) return [before] + return [before, after] +} + +const responseCorrelation: LifecycleInvariant = { + id: 'jsonrpc-response-correlation', + category: 'protocol', + description: 'Every non-null response ID must match an earlier request.', + references: [jsonRpcReference], + evaluate(context) { + return context.trace + .filter(frame => frame.kind === 'response' && frame.requestId !== null) + .filter( + response => matchingRequest(context.trace, response) === undefined + ) + .map(response => + diagnostic(context, responseCorrelation, { + kind: 'protocol-violation', + severity: 'error', + subject: + response.direction === 'agent-to-client' ? 'agent' : 'harness', + message: `Response ID ${String(response.requestId)} has no matching request`, + sequence: response.sequence, + traceIds: [response.id], + }) + ) + }, +} + +const notificationResponse: LifecycleInvariant = { + id: 'notification-must-not-have-response', + category: 'protocol', + description: + 'A response without request correlation must not be emitted for a notification.', + references: [jsonRpcReference], + evaluate(context) { + return context.trace + .filter(frame => frame.kind === 'response') + .flatMap(response => { + if (matchingRequest(context.trace, response) !== undefined) return [] + const precedingInput = [...context.trace] + .reverse() + .find( + frame => + frame.sequence < response.sequence && + frame.direction === oppositeDirection(response) + ) + if (precedingInput?.kind !== 'notification') return [] + return [ + diagnostic(context, notificationResponse, { + kind: 'protocol-violation', + severity: 'error', + subject: + response.direction === 'agent-to-client' ? 'agent' : 'harness', + message: `Response has no request correlation and follows notification ${precedingInput.method ?? '(unknown)'}`, + sequence: response.sequence, + traceIds: [precedingInput.id, response.id], + }), + ] + }) + }, +} + +const validStdout: LifecycleInvariant = { + id: 'stdio-stdout-valid-acp-only', + category: 'protocol', + description: 'Agent stdout must contain only valid ACP messages.', + references: [transportReference], + evaluate(context) { + return context.trace + .filter( + frame => + frame.direction === 'agent-to-client' && + (frame.kind === 'invalid-json' || frame.kind === 'stdout-noise') + ) + .map(frame => + diagnostic(context, validStdout, { + kind: 'protocol-violation', + severity: 'error', + subject: 'agent', + message: `Agent stdout contains ${frame.kind}: ${frame.raw.slice(0, 80)}`, + sequence: frame.sequence, + traceIds: [frame.id], + }) + ) + }, +} + +const omittedCapability: LifecycleInvariant = { + id: 'omitted-capability-is-unsupported', + category: 'capability-contract', + description: 'Omitted client capabilities must be treated as unsupported.', + references: [capabilityReference], + evaluate(context) { + const capabilities = context.profile.capabilities + return context.trace + .filter( + frame => + frame.direction === 'agent-to-client' && frame.kind === 'request' + ) + .filter(frame => { + if (frame.method?.startsWith('terminal/')) { + return capabilities.terminal !== true + } + if (frame.method === 'fs/read_text_file') { + return ( + !isRecord(capabilities.fs) || capabilities.fs.readTextFile !== true + ) + } + if (frame.method === 'fs/write_text_file') { + return ( + !isRecord(capabilities.fs) || capabilities.fs.writeTextFile !== true + ) + } + return false + }) + .map(frame => + diagnostic(context, omittedCapability, { + kind: 'capability-contract-mismatch', + severity: 'error', + subject: 'agent', + message: `Agent called ${frame.method} although the capability was omitted`, + sequence: frame.sequence, + traceIds: [frame.id], + }) + ) + }, +} + +const cancelPendingPermission: LifecycleInvariant = { + id: 'cancel-pending-permission-response', + category: 'protocol', + description: 'Pending permission requests must be cancelled with the turn.', + references: [cancelPermissionReference], + evaluate(context) { + const cancel = context.trace.find( + frame => + frame.direction === 'client-to-agent' && + frame.kind === 'notification' && + frame.method === 'session/cancel' + ) + if (!cancel) return [] + + return context.trace + .filter( + frame => + frame.direction === 'agent-to-client' && + frame.kind === 'request' && + frame.method === 'session/request_permission' && + frame.sequence < cancel.sequence + ) + .filter(permission => { + const response = context.trace.find( + frame => + frame.direction === 'client-to-agent' && + frame.kind === 'response' && + frame.requestId === permission.requestId + ) + if (response !== undefined && response.sequence < cancel.sequence) { + return false + } + return response === undefined || !response.raw.includes('cancelled') + }) + .map(permission => + diagnostic(context, cancelPendingPermission, { + kind: 'protocol-violation', + severity: 'error', + subject: 'harness', + message: 'Pending permission was not answered with cancelled', + sequence: cancel.sequence, + traceIds: [permission.id, cancel.id], + }) + ) + }, +} + +const cancelledStopReason: LifecycleInvariant = { + id: 'cancelled-stop-reason', + category: 'protocol', + description: 'A cancelled prompt turn must finish with cancelled StopReason.', + references: [cancelledStopReference], + evaluate(context) { + const cancel = context.trace.find( + frame => + frame.direction === 'client-to-agent' && + frame.kind === 'notification' && + frame.method === 'session/cancel' + ) + if (!cancel) return [] + const prompt = [...context.trace] + .reverse() + .find( + frame => + frame.sequence < cancel.sequence && + frame.direction === 'client-to-agent' && + frame.kind === 'request' && + frame.method === 'session/prompt' + ) + const response = context.trace.find( + frame => + frame.sequence > cancel.sequence && + frame.direction === 'agent-to-client' && + frame.kind === 'response' && + frame.requestId === prompt?.requestId + ) + const result = isRecord(response?.parsed) + ? response.parsed.result + : undefined + const stopReason = isRecord(result) ? result.stopReason : undefined + if (stopReason === 'cancelled') return [] + return [ + diagnostic(context, cancelledStopReason, { + kind: 'protocol-violation', + severity: 'error', + subject: 'agent', + message: + 'Agent did not finish the cancelled prompt with StopReason cancelled', + sequence: response?.sequence ?? cancel.sequence, + traceIds: [cancel.id, response?.id].filter( + (id): id is string => id !== undefined + ), + }), + ] + }, +} + +const noOrphanProcess: LifecycleInvariant = { + id: 'no-orphan-process-after-run', + category: 'resource', + description: 'A completed scenario must leave no managed target processes.', + references: [], + evaluate(context) { + if (context.activeProcessCount === 0) return [] + return [ + diagnostic(context, noOrphanProcess, { + kind: 'resource-leak', + severity: 'error', + subject: 'harness', + message: `${context.activeProcessCount} managed process(es) remain after the run`, + }), + ] + }, +} + +export const lifecycleInvariants: readonly LifecycleInvariant[] = Object.freeze( + [ + responseCorrelation, + notificationResponse, + validStdout, + omittedCapability, + cancelPendingPermission, + cancelledStopReason, + noOrphanProcess, + ] +) + +export function evaluateLifecycleInvariants( + context: InvariantRunContext +): readonly Diagnostic[] { + return lifecycleInvariants.flatMap(invariant => invariant.evaluate(context)) +} diff --git a/packages/acp-harness/src/sdk-client.ts b/packages/acp-harness/src/sdk-client.ts index 2fb5e2e..e8ee3ee 100644 --- a/packages/acp-harness/src/sdk-client.ts +++ b/packages/acp-harness/src/sdk-client.ts @@ -18,6 +18,10 @@ import type { import { Readable, Writable } from 'node:stream' import { randomUUID } from 'node:crypto' import { AcpV1Adapter } from './acp-v1-adapter.js' +import { + clientProfiles, + type ClientCapabilityProfile, +} from './client-profiles.js' import { HarnessError } from './errors.js' import type { ManagedTarget } from './process-manager.js' import { TransportTap } from './transport-tap.js' @@ -41,6 +45,7 @@ interface ConnectionRecord { readonly adapter: AcpV1Adapter readonly sessions: Set readonly pendingPermissions: Map + profile: ClientCapabilityProfile } interface PendingPermission { @@ -104,6 +109,7 @@ export class AcpSdkClient { adapter, sessions: new Set(), pendingPermissions: new Map(), + profile: clientProfiles.minimal, } this.connections.set(target.id, record) adapter.connectionState('connected') @@ -119,14 +125,18 @@ export class AcpSdkClient { return connection } - async initialize(targetHandleId: string): Promise { + async initialize( + targetHandleId: string, + profile: ClientCapabilityProfile = clientProfiles.minimal + ): Promise { const record = this.get(targetHandleId) + record.profile = profile const startingSequence = this.options.sequence.peek() const response = await record.connection.agent.request( methods.agent.initialize, { protocolVersion: PROTOCOL_VERSION, - clientCapabilities: {}, + clientCapabilities: profile.capabilities, } ) const requestFrame = this.findFrame( @@ -272,6 +282,21 @@ export class AcpSdkClient { ) const permissionId = source?.id ?? randomUUID() const requestTraceIds = source === undefined ? [] : [source.id] + if ( + !record.profile.allowedClientMethods.includes( + 'session/request_permission' + ) + ) { + record.adapter.permissionRequested(permissionId, request, requestTraceIds) + const outcome = { outcome: 'cancelled' } as const + record.adapter.permissionResolved( + permissionId, + request.sessionId, + outcome, + requestTraceIds + ) + return Promise.resolve({ outcome }) + } return new Promise(resolve => { const pending: PendingPermission = { id: permissionId, diff --git a/test/contract/harness-session.contract.spec.ts b/test/contract/harness-session.contract.spec.ts index 791e1ad..b902419 100644 --- a/test/contract/harness-session.contract.spec.ts +++ b/test/contract/harness-session.contract.spec.ts @@ -1,5 +1,9 @@ import { afterEach, describe, expect, it } from 'vitest' import { AcpHarness } from '../../packages/acp-harness/src/harness.js' +import { + clientProfiles, + type ClientCapabilityProfile, +} from '../../packages/acp-harness/src/client-profiles.js' import { createFixtureRegistry, repositoryRoot, @@ -23,7 +27,10 @@ async function waitFor( } } -async function startHarness(args: readonly string[] = []): Promise<{ +async function startHarness( + args: readonly string[] = [], + profile: ClientCapabilityProfile = clientProfiles.minimal +): Promise<{ harness: AcpHarness targetId: string }> { @@ -34,7 +41,7 @@ async function startHarness(args: readonly string[] = []): Promise<{ workspaceRoot: repositoryRoot, args, }) - await harness.initialize(target.id) + await harness.initialize(target.id, profile) return { harness, targetId: target.id } } @@ -86,7 +93,10 @@ describe('Harness session lifecycle contract', () => { }) it('cancels the prompt and every pending permission together', async () => { - const { harness, targetId } = await startHarness(['--permission-prompt']) + const { harness, targetId } = await startHarness( + ['--permission-prompt'], + clientProfiles['permission-only'] + ) const session = await harness.createSession(targetId) await harness.submitPrompt({ targetHandleId: targetId, diff --git a/test/scenario/lifecycle-invariants.scenario.spec.ts b/test/scenario/lifecycle-invariants.scenario.spec.ts new file mode 100644 index 0000000..aff764d --- /dev/null +++ b/test/scenario/lifecycle-invariants.scenario.spec.ts @@ -0,0 +1,162 @@ +import type { InvariantRunContext, ProtocolTraceFrame } from '@axis-ui/acp-core' +import { describe, expect, it } from 'vitest' +import { + evaluateLifecycleInvariants, + lifecycleInvariants, +} from '../../packages/acp-harness/src/invariants.js' + +describe('seven lifecycle invariants', () => { + it('keeps the fixed rule set explicit', () => { + expect(lifecycleInvariants.map(invariant => invariant.id)).toEqual([ + 'jsonrpc-response-correlation', + 'notification-must-not-have-response', + 'stdio-stdout-valid-acp-only', + 'omitted-capability-is-unsupported', + 'cancel-pending-permission-response', + 'cancelled-stop-reason', + 'no-orphan-process-after-run', + ]) + }) + + it('classifies protocol, capability and resource evidence separately', () => { + const trace: ProtocolTraceFrame[] = [ + frame(1, { + kind: 'request', + direction: 'client-to-agent', + requestId: 2, + method: 'session/prompt', + }), + frame(2, { + kind: 'request', + direction: 'agent-to-client', + requestId: 3, + method: 'session/request_permission', + }), + frame(3, { + kind: 'request', + direction: 'agent-to-client', + requestId: 4, + method: 'terminal/create', + }), + frame(4, { + kind: 'notification', + direction: 'client-to-agent', + method: 'session/cancel', + }), + frame(5, { + kind: 'invalid-json', + direction: 'agent-to-client', + raw: 'agent log on stdout', + }), + frame(6, { + kind: 'response', + direction: 'agent-to-client', + requestId: 99, + }), + frame(7, { + kind: 'response', + direction: 'agent-to-client', + requestId: null, + }), + ] + const context: InvariantRunContext = { + runId: 'diagnostic-run', + scenarioId: 'fault-matrix', + profile: { + id: 'minimal', + capabilities: {}, + allowedClientMethods: ['session/update'], + }, + trace, + events: [], + stateSnapshots: [], + activeProcessCount: 1, + faultInjectionIds: ['synthetic-seven-rule-matrix'], + } + + const diagnostics = evaluateLifecycleInvariants(context) + + expect(new Set(diagnostics.map(item => item.invariantId))).toEqual( + new Set(lifecycleInvariants.map(invariant => invariant.id)) + ) + expect( + diagnostics.find( + item => item.invariantId === 'stdio-stdout-valid-acp-only' + ) + ).toMatchObject({ + kind: 'protocol-violation', + subject: 'agent', + references: [expect.objectContaining({ requirement: 'MUST NOT' })], + }) + expect( + diagnostics.find( + item => item.invariantId === 'no-orphan-process-after-run' + ) + ).toMatchObject({ + kind: 'resource-leak', + subject: 'harness', + references: [], + }) + }) + + it('does not treat an already resolved permission as pending at cancel', () => { + const trace: ProtocolTraceFrame[] = [ + frame(1, { + kind: 'request', + direction: 'agent-to-client', + requestId: 1, + method: 'session/request_permission', + }), + frame(2, { + kind: 'response', + direction: 'client-to-agent', + requestId: 1, + raw: '{"jsonrpc":"2.0","id":1,"result":{"outcome":{"outcome":"selected","optionId":"allow"}}}', + }), + frame(3, { + kind: 'notification', + direction: 'client-to-agent', + method: 'session/cancel', + }), + ] + const diagnostics = evaluateLifecycleInvariants({ + runId: 'resolved-permission-run', + scenarioId: 'resolved-before-cancel', + profile: { + id: 'permission-only', + capabilities: {}, + allowedClientMethods: ['session/update', 'session/request_permission'], + }, + trace, + events: [], + stateSnapshots: [], + activeProcessCount: 0, + faultInjectionIds: [], + }) + + expect(diagnostics).not.toContainEqual( + expect.objectContaining({ + invariantId: 'cancel-pending-permission-response', + }) + ) + }) +}) + +function frame( + sequence: number, + overrides: Partial +): ProtocolTraceFrame { + return { + id: `trace-${sequence}`, + runId: 'diagnostic-run', + connectionId: 'diagnostic-connection', + sequence, + timestamp: '2026-08-20T00:00:00.000Z', + protocolVersion: 'v1', + direction: 'agent-to-client', + kind: 'stdout-noise', + raw: '{}', + byteLength: 2, + ...overrides, + } +} From 3c03667965ba84b0f3375f4495d47b697db3783c Mon Sep 17 00:00:00 2001 From: CalvinWade Date: Tue, 16 Jun 2026 16:49:00 +0800 Subject: [PATCH 12/20] feat: run deterministic ACP conformance scenarios --- fixtures/acp-agents/bin/fixture-agent.mjs | 15 + packages/acp-harness/src/index.ts | 1 + packages/acp-harness/src/scenario.ts | 277 ++++++++++++++++++ test/helpers/acp-fixture.ts | 1 + test/scenario/core-scenarios.scenario.spec.ts | 43 +++ 5 files changed, 337 insertions(+) create mode 100644 packages/acp-harness/src/scenario.ts create mode 100644 test/scenario/core-scenarios.scenario.spec.ts diff --git a/fixtures/acp-agents/bin/fixture-agent.mjs b/fixtures/acp-agents/bin/fixture-agent.mjs index b90bcfb..b60a216 100644 --- a/fixtures/acp-agents/bin/fixture-agent.mjs +++ b/fixtures/acp-agents/bin/fixture-agent.mjs @@ -9,6 +9,9 @@ const shouldEmitStdoutNoise = process.argv.includes('--stdout-noise') const shouldEmitStderr = process.argv.includes('--stderr-marker') const shouldRequestPermission = process.argv.includes('--permission-prompt') const shouldCrashDuringPrompt = process.argv.includes('--crash-during-prompt') +const shouldCallUnsupportedTerminal = process.argv.includes( + '--capability-method-mismatch' +) if (shouldEmitStdoutNoise) process.stdout.write('fixture stdout noise\n') if (shouldEmitStderr) process.stderr.write('fixture stderr marker\n') @@ -100,6 +103,18 @@ const app = acp }) } + if (shouldCallUnsupportedTerminal) { + try { + await context.client.request(acp.methods.client.terminal.create, { + sessionId, + command: 'echo', + args: ['capability mismatch'], + }) + } catch { + // The deterministic fault is the unsupported request itself. + } + } + return { stopReason: cancelledSessions.has(sessionId) ? 'cancelled' : 'end_turn', } diff --git a/packages/acp-harness/src/index.ts b/packages/acp-harness/src/index.ts index 3b4dce9..05e9f93 100644 --- a/packages/acp-harness/src/index.ts +++ b/packages/acp-harness/src/index.ts @@ -2,6 +2,7 @@ export * from './errors.js' export * from './harness.js' export * from './client-profiles.js' export * from './invariants.js' +export * from './scenario.js' export * from './process-manager.js' export * from './sdk-client.js' export * from './target-registry.js' diff --git a/packages/acp-harness/src/scenario.ts b/packages/acp-harness/src/scenario.ts new file mode 100644 index 0000000..22f2928 --- /dev/null +++ b/packages/acp-harness/src/scenario.ts @@ -0,0 +1,277 @@ +import type { Diagnostic, SessionStateSnapshot } from '@axis-ui/acp-core' +import { AcpHarness } from './harness.js' +import { evaluateLifecycleInvariants } from './invariants.js' +import { + clientProfiles, + type ClientCapabilityProfile, + type ClientProfileId, +} from './client-profiles.js' +import { TargetRegistry } from './target-registry.js' + +export type CoreScenarioId = + | 'normal-prompt-turn' + | 'cancel-during-permission' + | 'capability-method-mismatch' + +export interface ScenarioDefinition { + readonly id: CoreScenarioId + readonly profileId: ClientProfileId + readonly targetArgs: readonly string[] + readonly prompt: string + readonly flow: 'complete' | 'cancel-on-permission' + readonly expectedDiagnosticIds: readonly string[] + readonly faultInjectionIds: readonly string[] +} + +export interface ScenarioAssertionResult { + readonly id: string + readonly passed: boolean + readonly message: string +} + +export interface ScenarioReport { + readonly runId: string + readonly scenarioId: CoreScenarioId + readonly status: 'passed' | 'failed' + readonly profile: ClientCapabilityProfile + readonly assertions: readonly ScenarioAssertionResult[] + readonly diagnostics: readonly Diagnostic[] + readonly stateSnapshots: readonly SessionStateSnapshot[] + readonly traceCount: number + readonly eventCount: number +} + +export function scenario( + definition: ScenarioDefinition +): Readonly { + return Object.freeze({ ...definition }) +} + +export const coreScenarios: Readonly< + Record +> = Object.freeze({ + 'normal-prompt-turn': scenario({ + id: 'normal-prompt-turn', + profileId: 'minimal', + targetArgs: [], + prompt: 'Return a deterministic streaming response.', + flow: 'complete', + expectedDiagnosticIds: [], + faultInjectionIds: [], + }), + 'cancel-during-permission': scenario({ + id: 'cancel-during-permission', + profileId: 'permission-only', + targetArgs: ['--permission-prompt'], + prompt: 'Request permission before running the deterministic command.', + flow: 'cancel-on-permission', + expectedDiagnosticIds: [], + faultInjectionIds: ['permission-pending'], + }), + 'capability-method-mismatch': scenario({ + id: 'capability-method-mismatch', + profileId: 'minimal', + targetArgs: ['--capability-method-mismatch'], + prompt: 'Attempt the deterministic unsupported terminal call.', + flow: 'complete', + expectedDiagnosticIds: ['omitted-capability-is-unsupported'], + faultInjectionIds: ['unsupported-terminal-request'], + }), +}) + +export interface ScenarioRunnerOptions { + readonly registry: TargetRegistry + readonly targetId: string + readonly workspaceRoot: string + readonly timeoutMs?: number +} + +export class ScenarioRunner { + private readonly timeoutMs: number + + constructor(private readonly options: ScenarioRunnerOptions) { + this.timeoutMs = options.timeoutMs ?? 2_000 + } + + async run(definition: ScenarioDefinition): Promise { + const harness = new AcpHarness(this.options.registry) + const profile = clientProfiles[definition.profileId] + const assertions: ScenarioAssertionResult[] = [] + let harnessFailure: Diagnostic | undefined + let sessionId: string | undefined + + try { + const target = await harness.startTarget({ + targetId: this.options.targetId, + workspaceRoot: this.options.workspaceRoot, + args: definition.targetArgs, + }) + await harness.initialize(target.id, profile) + const session = await harness.createSession(target.id) + const activeSessionId = session.sessionId + sessionId = activeSessionId + await harness.submitPrompt({ + targetHandleId: target.id, + sessionId: activeSessionId, + text: definition.prompt, + }) + + if (definition.flow === 'cancel-on-permission') { + await this.waitFor( + () => + Object.keys( + harness.getSession(activeSessionId)?.pendingPermissions ?? {} + ).length > 0, + 'permission request' + ) + await harness.cancelSession(target.id, activeSessionId) + } + + await this.waitFor(() => { + const status = harness.getSession(activeSessionId)?.status + return ( + status === 'completed' || + status === 'cancelled' || + status === 'failed' || + status === 'crashed' + ) + }, 'session terminal state') + await harness.stopTarget(target.id) + } catch (error) { + harnessFailure = this.harnessFailure(harness.runId, definition, error) + } finally { + await harness.dispose() + } + + const finalState = + sessionId === undefined ? undefined : harness.getSession(sessionId) + const stateSnapshots = harness.stateSnapshots + + assertions.push(...this.assert(definition, finalState)) + const context = { + runId: harness.runId, + scenarioId: definition.id, + profile: { + id: profile.id, + capabilities: profile.capabilities, + allowedClientMethods: profile.allowedClientMethods, + }, + trace: harness.trace, + events: harness.events, + stateSnapshots, + activeProcessCount: harness.processes.list().length, + faultInjectionIds: definition.faultInjectionIds, + } + const diagnostics = [ + ...evaluateLifecycleInvariants(context), + ...this.assertionDiagnostics(context, assertions), + ...(harnessFailure === undefined ? [] : [harnessFailure]), + ] + const unexpectedErrors = diagnostics.filter( + item => + (item.severity === 'error' || item.severity === 'fatal') && + !definition.expectedDiagnosticIds.includes(item.invariantId) + ) + const expectedDiagnosticsPresent = definition.expectedDiagnosticIds.every( + id => diagnostics.some(item => item.invariantId === id) + ) + + return { + runId: harness.runId, + scenarioId: definition.id, + status: + unexpectedErrors.length === 0 && expectedDiagnosticsPresent + ? 'passed' + : 'failed', + profile, + assertions, + diagnostics, + stateSnapshots, + traceCount: harness.trace.length, + eventCount: harness.events.length, + } + } + + private assert( + definition: ScenarioDefinition, + state: SessionStateSnapshot['state'] | undefined + ): readonly ScenarioAssertionResult[] { + const expectedStatus = + definition.flow === 'cancel-on-permission' ? 'cancelled' : 'completed' + return [ + { + id: 'session-status', + passed: state?.status === expectedStatus, + message: `Expected ${expectedStatus}, received ${state?.status ?? 'missing'}`, + }, + { + id: 'no-pending-permissions', + passed: + state !== undefined && + Object.keys(state.pendingPermissions).length === 0, + message: 'The final session state must not contain pending permissions', + }, + ] + } + + private assertionDiagnostics( + context: { + readonly runId: string + readonly scenarioId: string + readonly stateSnapshots: readonly SessionStateSnapshot[] + readonly faultInjectionIds: readonly string[] + }, + assertions: readonly ScenarioAssertionResult[] + ): readonly Diagnostic[] { + return assertions + .filter(assertion => !assertion.passed) + .map(assertion => ({ + id: `${context.runId}:assertion:${assertion.id}`, + kind: 'scenario-assertion-failure', + runId: context.runId, + scenarioId: context.scenarioId, + invariantId: assertion.id, + severity: 'error', + subject: 'unknown', + message: assertion.message, + traceIds: [], + stateSnapshotIds: context.stateSnapshots.map(snapshot => snapshot.id), + faultInjectionIds: context.faultInjectionIds, + references: [], + })) + } + + private harnessFailure( + runId: string, + definition: ScenarioDefinition, + error: unknown + ): Diagnostic { + return { + id: `${runId}:harness-failure`, + kind: 'harness-failure', + runId, + scenarioId: definition.id, + invariantId: 'scenario-runner-completed', + severity: 'fatal', + subject: 'harness', + message: error instanceof Error ? error.message : String(error), + traceIds: [], + stateSnapshotIds: [], + faultInjectionIds: definition.faultInjectionIds, + references: [], + } + } + + private async waitFor( + predicate: () => boolean, + description: string + ): Promise { + const deadline = Date.now() + this.timeoutMs + while (!predicate()) { + if (Date.now() > deadline) { + throw new Error(`Timed out waiting for ${description}`) + } + await new Promise(resolve => setTimeout(resolve, 5)) + } + } +} diff --git a/test/helpers/acp-fixture.ts b/test/helpers/acp-fixture.ts index 3f88869..3348ab0 100644 --- a/test/helpers/acp-fixture.ts +++ b/test/helpers/acp-fixture.ts @@ -24,6 +24,7 @@ export const fixtureTarget: TargetDefinition = { '--stderr-marker', '--permission-prompt', '--crash-during-prompt', + '--capability-method-mismatch', ], environmentAllowlist: ['PATH'], maxProcesses: 2, diff --git a/test/scenario/core-scenarios.scenario.spec.ts b/test/scenario/core-scenarios.scenario.spec.ts new file mode 100644 index 0000000..5bf11b2 --- /dev/null +++ b/test/scenario/core-scenarios.scenario.spec.ts @@ -0,0 +1,43 @@ +import { describe, expect, it } from 'vitest' +import { + createFixtureRegistry, + repositoryRoot, +} from '../helpers/acp-fixture.js' +import { + coreScenarios, + ScenarioRunner, + type CoreScenarioId, +} from '../../packages/acp-harness/src/scenario.js' + +describe('three fixed ACP scenarios', () => { + it.each(Object.keys(coreScenarios) as CoreScenarioId[])( + 'runs %s deterministically', + async scenarioId => { + const runner = new ScenarioRunner({ + registry: await createFixtureRegistry(), + targetId: 'fixture-agent', + workspaceRoot: repositoryRoot, + }) + + const report = await runner.run(coreScenarios[scenarioId]) + + expect(report.status).toBe('passed') + expect(report.assertions.every(assertion => assertion.passed)).toBe(true) + expect(report.traceCount).toBeGreaterThan(0) + expect(report.eventCount).toBeGreaterThan(0) + if (scenarioId === 'capability-method-mismatch') { + expect(report.diagnostics).toContainEqual( + expect.objectContaining({ + kind: 'capability-contract-mismatch', + subject: 'agent', + invariantId: 'omitted-capability-is-unsupported', + faultInjectionIds: ['unsupported-terminal-request'], + stateSnapshotIds: expect.arrayContaining([expect.any(String)]), + }) + ) + } else { + expect(report.diagnostics).toEqual([]) + } + } + ) +}) From 996b8be9da557438646dcb8ef918f2b5b54f4d45 Mon Sep 17 00:00:00 2001 From: CalvinWade Date: Wed, 17 Jun 2026 13:34:00 +0800 Subject: [PATCH 13/20] feat: add deterministic transcript replay --- packages/acp-core/src/canonical-json.ts | 49 ++++++ packages/acp-core/src/index.ts | 5 + packages/acp-core/src/redaction.ts | 128 ++++++++++++++ packages/acp-core/src/replay.ts | 138 +++++++++++++++ packages/acp-core/src/transcript-artifact.ts | 42 +++++ packages/acp-core/src/transcript.ts | 122 +++++++++++++ test/replay/transcript.replay.spec.ts | 172 +++++++++++++++++++ 7 files changed, 656 insertions(+) create mode 100644 packages/acp-core/src/canonical-json.ts create mode 100644 packages/acp-core/src/redaction.ts create mode 100644 packages/acp-core/src/replay.ts create mode 100644 packages/acp-core/src/transcript-artifact.ts create mode 100644 packages/acp-core/src/transcript.ts create mode 100644 test/replay/transcript.replay.spec.ts diff --git a/packages/acp-core/src/canonical-json.ts b/packages/acp-core/src/canonical-json.ts new file mode 100644 index 0000000..743d180 --- /dev/null +++ b/packages/acp-core/src/canonical-json.ts @@ -0,0 +1,49 @@ +function normalize(value: unknown, seen: WeakSet): unknown { + if ( + value === null || + typeof value === 'string' || + typeof value === 'boolean' + ) { + return value + } + if (typeof value === 'number') { + if (!Number.isFinite(value)) { + throw new TypeError('Canonical JSON does not support non-finite numbers') + } + return value + } + if (value === undefined) return undefined + if (typeof value !== 'object') { + throw new TypeError(`Canonical JSON does not support ${typeof value}`) + } + if (seen.has(value)) + throw new TypeError('Canonical JSON cannot contain cycles') + seen.add(value) + try { + if (Array.isArray(value)) { + return value.map(item => normalize(item, seen) ?? null) + } + return Object.fromEntries( + Object.entries(value) + .sort(([left], [right]) => left.localeCompare(right)) + .flatMap(([key, item]) => { + const normalized = normalize(item, seen) + return normalized === undefined ? [] : [[key, normalized]] + }) + ) + } finally { + seen.delete(value) + } +} + +export function canonicalJson(value: unknown): string { + return JSON.stringify(normalize(value, new WeakSet())) +} + +export async function stateHash(value: unknown): Promise { + const bytes = new TextEncoder().encode(canonicalJson(value)) + const digest = await crypto.subtle.digest('SHA-256', bytes) + return [...new Uint8Array(digest)] + .map(byte => byte.toString(16).padStart(2, '0')) + .join('') +} diff --git a/packages/acp-core/src/index.ts b/packages/acp-core/src/index.ts index e77afa0..1e58349 100644 --- a/packages/acp-core/src/index.ts +++ b/packages/acp-core/src/index.ts @@ -1,5 +1,10 @@ export * from './axis-event.js' +export * from './canonical-json.js' export * from './diagnostic.js' export * from './protocol-trace.js' +export * from './redaction.js' +export * from './replay.js' export * from './session-reducer.js' export * from './sequence.js' +export * from './transcript.js' +export * from './transcript-artifact.js' diff --git a/packages/acp-core/src/redaction.ts b/packages/acp-core/src/redaction.ts new file mode 100644 index 0000000..3b6c663 --- /dev/null +++ b/packages/acp-core/src/redaction.ts @@ -0,0 +1,128 @@ +import type { + RedactionEntry, + RedactionManifest, + TranscriptDraft, +} from './transcript.js' + +const defaultSensitiveKeys = Object.freeze([ + 'authorization', + 'cookie', + 'env', + 'environment', + 'api-key', + 'api_key', + 'apikey', + 'password', + 'secret', + 'token', +]) + +export interface RedactionPolicy { + readonly replacement?: string + readonly sensitiveKeys?: readonly string[] + readonly secretValues?: readonly string[] + readonly explicitPaths?: readonly string[] +} + +export interface RedactionResult { + readonly value: T + readonly manifest: RedactionManifest +} + +function normalizedKey(key: string): string { + return key.toLowerCase().replaceAll(/[-_]/gu, '') +} + +function matchesPath(path: readonly string[], pattern: string): boolean { + const parts = pattern.split('.').filter(Boolean) + return ( + parts.length === path.length && + parts.every((part, index) => part === '*' || part === path[index]) + ) +} + +export function redactTranscriptDraft( + draft: TranscriptDraft, + policy: RedactionPolicy = {} +): RedactionResult { + const replacement = policy.replacement ?? '[REDACTED]' + const sensitiveKeys = new Set( + [...defaultSensitiveKeys, ...(policy.sensitiveKeys ?? [])].map( + normalizedKey + ) + ) + const secretValues = [...(policy.secretValues ?? [])] + .filter(value => value.length > 0) + .sort((left, right) => right.length - left.length) + const explicitPaths = policy.explicitPaths ?? [] + const entries: RedactionEntry[] = [] + + const record = ( + path: readonly string[], + reason: RedactionEntry['reason'] + ): void => { + const dottedPath = path.join('.') + if ( + !entries.some( + entry => entry.path === dottedPath && entry.reason === reason + ) + ) { + entries.push({ path: dottedPath, reason }) + } + } + + const redactString = (value: string, path: readonly string[]): string => { + let result = value + for (const secret of secretValues) { + if (!result.includes(secret)) continue + result = result.replaceAll(secret, replacement) + record(path, 'secret-value') + } + return result + } + + const visit = (value: unknown, path: readonly string[]): unknown => { + if (explicitPaths.some(pattern => matchesPath(path, pattern))) { + record(path, 'explicit-path') + return replacement + } + if (typeof value === 'string') { + if (path.at(-1) === 'raw') { + try { + const parsed = JSON.parse(value) as unknown + const redacted = visit(parsed, [...path, '$json']) + return JSON.stringify(redacted) + } catch { + return redactString(value, path) + } + } + return redactString(value, path) + } + if (Array.isArray(value)) { + return value.map((item, index) => visit(item, [...path, String(index)])) + } + if (typeof value !== 'object' || value === null) return value + + return Object.fromEntries( + Object.entries(value).map(([key, item]) => { + const itemPath = [...path, key] + if (sensitiveKeys.has(normalizedKey(key))) { + record(itemPath, 'sensitive-key') + return [key, replacement] + } + return [key, visit(item, itemPath)] + }) + ) + } + + return { + value: visit(draft, []) as TranscriptDraft, + manifest: { + version: 1, + replacement, + entries: entries.sort((left, right) => + left.path.localeCompare(right.path) + ), + }, + } +} diff --git a/packages/acp-core/src/replay.ts b/packages/acp-core/src/replay.ts new file mode 100644 index 0000000..9947f61 --- /dev/null +++ b/packages/acp-core/src/replay.ts @@ -0,0 +1,138 @@ +import { canonicalJson, stateHash } from './canonical-json.js' +import type { AcpSessionState } from './session-reducer.js' +import { createSessionState, reduceSessionEvent } from './session-reducer.js' +import type { AxisAcpEvent } from './axis-event.js' +import type { AxisAcpTranscript } from './transcript.js' +import { parseTranscript } from './transcript.js' + +export interface ReplaySnapshot { + readonly status: 'paused' | 'completed' + readonly position: number + readonly currentSequence: number + readonly states: Readonly> +} + +function orderedEvents( + events: readonly AxisAcpEvent[] +): readonly AxisAcpEvent[] { + return [...events].sort( + (left, right) => + left.sequence - right.sequence || left.id.localeCompare(right.id) + ) +} + +export class TranscriptReplay { + private readonly events: readonly AxisAcpEvent[] + private readonly sessionStates = new Map() + private position = 0 + private paused = true + + constructor(readonly transcript: AxisAcpTranscript) { + this.events = orderedEvents(transcript.events) + } + + static from(input: string | unknown): TranscriptReplay { + return new TranscriptReplay(parseTranscript(input)) + } + + get snapshot(): ReplaySnapshot { + return { + status: + this.position >= this.events.length && !this.paused + ? 'completed' + : 'paused', + position: this.position, + currentSequence: this.events[this.position - 1]?.sequence ?? 0, + states: Object.fromEntries( + [...this.sessionStates.entries()].sort(([left], [right]) => + left.localeCompare(right) + ) + ), + } + } + + pause(): ReplaySnapshot { + this.paused = true + return this.snapshot + } + + reset(): ReplaySnapshot { + this.position = 0 + this.paused = true + this.sessionStates.clear() + return this.snapshot + } + + step(): ReplaySnapshot { + const event = this.events[this.position] + if (event === undefined) { + this.paused = false + return this.snapshot + } + this.apply(event) + this.position += 1 + this.paused = true + return this.snapshot + } + + seek(sequence: number): ReplaySnapshot { + this.reset() + while ( + this.position < this.events.length && + (this.events[this.position]?.sequence ?? Number.POSITIVE_INFINITY) <= + sequence + ) { + this.step() + } + return this.snapshot + } + + playToEnd(): ReplaySnapshot { + this.paused = false + while (this.position < this.events.length) { + const event = this.events[this.position] + if (event !== undefined) this.apply(event) + this.position += 1 + } + return this.snapshot + } + + async stateHashes(): Promise>> { + const entries = await Promise.all( + Object.entries(this.snapshot.states).map( + async ([sessionId, state]) => + [sessionId, await stateHash(state)] as const + ) + ) + return Object.fromEntries( + entries.sort(([left], [right]) => left.localeCompare(right)) + ) + } + + async verifyIntegrity(): Promise { + const hashes = await this.stateHashes() + return ( + canonicalJson(hashes) === + canonicalJson(this.transcript.integrity.stateHashes) + ) + } + + private apply(event: AxisAcpEvent): void { + if (event.sessionId !== undefined) { + const state = + this.sessionStates.get(event.sessionId) ?? + createSessionState(event.sessionId, event.connectionId) + this.sessionStates.set(event.sessionId, reduceSessionEvent(state, event)) + return + } + if ( + event.type !== 'process/exited' && + event.type !== 'connection/state-changed' + ) { + return + } + for (const [sessionId, state] of this.sessionStates) { + this.sessionStates.set(sessionId, reduceSessionEvent(state, event)) + } + } +} diff --git a/packages/acp-core/src/transcript-artifact.ts b/packages/acp-core/src/transcript-artifact.ts new file mode 100644 index 0000000..caa9b2e --- /dev/null +++ b/packages/acp-core/src/transcript-artifact.ts @@ -0,0 +1,42 @@ +import { canonicalJson } from './canonical-json.js' +import { redactTranscriptDraft, type RedactionPolicy } from './redaction.js' +import { TranscriptReplay } from './replay.js' +import { + AXIS_ACP_TRANSCRIPT_SCHEMA_VERSION, + type AxisAcpTranscript, + type TranscriptDraft, +} from './transcript.js' + +export async function createTranscript( + draft: TranscriptDraft, + policy: RedactionPolicy = {} +): Promise { + const redacted = redactTranscriptDraft(draft, policy) + const placeholder: AxisAcpTranscript = { + schemaVersion: AXIS_ACP_TRANSCRIPT_SCHEMA_VERSION, + ...redacted.value, + redactionManifest: redacted.manifest, + integrity: { + algorithm: 'SHA-256', + stateHashes: {}, + eventCount: redacted.value.events.length, + maxSequence: Math.max( + 0, + ...redacted.value.events.map(event => event.sequence) + ), + }, + } + const replay = new TranscriptReplay(placeholder) + replay.playToEnd() + return { + ...placeholder, + integrity: { + ...placeholder.integrity, + stateHashes: await replay.stateHashes(), + }, + } +} + +export function serializeTranscript(transcript: AxisAcpTranscript): string { + return canonicalJson(transcript) +} diff --git a/packages/acp-core/src/transcript.ts b/packages/acp-core/src/transcript.ts new file mode 100644 index 0000000..ffd5786 --- /dev/null +++ b/packages/acp-core/src/transcript.ts @@ -0,0 +1,122 @@ +import type { AxisAcpEvent, AxisProtocolVersion } from './axis-event.js' +import type { ClientProfileSnapshot, Diagnostic } from './diagnostic.js' +import type { ProtocolTraceFrame } from './protocol-trace.js' + +export const AXIS_ACP_TRANSCRIPT_SCHEMA_VERSION = 1 as const + +export interface TranscriptRunMetadata { + readonly id: string + readonly scenarioId?: string + readonly startedAt: string + readonly completedAt: string + readonly toolkitVersion: string + readonly protocolVersion: AxisProtocolVersion +} + +export interface TranscriptTargetSnapshot { + readonly id: string + readonly transport: 'stdio' + readonly protocolVersion: AxisProtocolVersion + readonly args: readonly string[] + readonly agentInfo?: Readonly> +} + +export interface TranscriptAssertionResult { + readonly id: string + readonly passed: boolean + readonly message: string +} + +export interface RedactionEntry { + readonly path: string + readonly reason: 'sensitive-key' | 'secret-value' | 'explicit-path' +} + +export interface RedactionManifest { + readonly version: 1 + readonly replacement: string + readonly entries: readonly RedactionEntry[] +} + +export interface TranscriptIntegrity { + readonly algorithm: 'SHA-256' + readonly stateHashes: Readonly> + readonly eventCount: number + readonly maxSequence: number +} + +export interface AxisAcpTranscript { + readonly schemaVersion: typeof AXIS_ACP_TRANSCRIPT_SCHEMA_VERSION + readonly run: TranscriptRunMetadata + readonly target: TranscriptTargetSnapshot + readonly clientProfile: ClientProfileSnapshot + readonly rawFrames: readonly ProtocolTraceFrame[] + readonly events: readonly AxisAcpEvent[] + readonly assertions: readonly TranscriptAssertionResult[] + readonly diagnostics: readonly Diagnostic[] + readonly redactionManifest: RedactionManifest + readonly integrity: TranscriptIntegrity +} + +export type TranscriptDraft = Omit< + AxisAcpTranscript, + 'schemaVersion' | 'redactionManifest' | 'integrity' +> + +function isRecord(value: unknown): value is Record { + return typeof value === 'object' && value !== null && !Array.isArray(value) +} + +function assertString(record: Record, key: string): void { + if (typeof record[key] !== 'string') { + throw new TypeError(`Transcript field ${key} must be a string`) + } +} + +export function parseTranscript(input: string | unknown): AxisAcpTranscript { + const value = + typeof input === 'string' ? (JSON.parse(input) as unknown) : input + if (!isRecord(value)) throw new TypeError('Transcript must be an object') + if (value.schemaVersion !== AXIS_ACP_TRANSCRIPT_SCHEMA_VERSION) { + throw new TypeError( + `Unsupported transcript schema version: ${String(value.schemaVersion)}` + ) + } + if (!isRecord(value.run)) throw new TypeError('Transcript run is missing') + assertString(value.run, 'id') + assertString(value.run, 'startedAt') + assertString(value.run, 'completedAt') + if (!isRecord(value.target)) { + throw new TypeError('Transcript target is missing') + } + assertString(value.target, 'id') + if (!isRecord(value.clientProfile)) { + throw new TypeError('Transcript clientProfile is missing') + } + for (const field of ['rawFrames', 'events', 'assertions', 'diagnostics']) { + if (!Array.isArray(value[field])) { + throw new TypeError(`Transcript field ${field} must be an array`) + } + } + if (!isRecord(value.redactionManifest) || !isRecord(value.integrity)) { + throw new TypeError('Transcript redaction or integrity metadata is missing') + } + if (!isRecord(value.integrity.stateHashes)) { + throw new TypeError('Transcript state hashes are missing') + } + const events = value.events + if (!Array.isArray(events)) { + throw new TypeError('Transcript field events must be an array') + } + for (const event of events) { + if ( + !isRecord(event) || + typeof event.id !== 'string' || + typeof event.type !== 'string' || + typeof event.sequence !== 'number' + ) { + throw new TypeError('Transcript contains an invalid event') + } + } + return value as unknown as AxisAcpTranscript +} diff --git a/test/replay/transcript.replay.spec.ts b/test/replay/transcript.replay.spec.ts new file mode 100644 index 0000000..ab1a644 --- /dev/null +++ b/test/replay/transcript.replay.spec.ts @@ -0,0 +1,172 @@ +import type { + AxisAcpEvent, + ProtocolTraceFrame, + TranscriptDraft, +} from '@axis-ui/acp-core' +import { + createTranscript, + parseTranscript, + serializeTranscript, + stateHash, + TranscriptReplay, +} from '@axis-ui/acp-core' +import { describe, expect, it } from 'vitest' + +const eventMetadata = { + runId: 'run-replay', + connectionId: 'connection-replay', + sessionId: 'session-replay', + timestamp: '2026-08-20T00:00:00.000Z', + protocolVersion: 'v1' as const, + sourceTraceIds: [] as readonly string[], +} + +function transcriptDraft(secret = 'sk-test-secret'): TranscriptDraft { + const prompting: AxisAcpEvent = { + ...eventMetadata, + id: 'event-1', + sequence: 1, + type: 'session/state-changed', + state: 'prompting', + } + const message: AxisAcpEvent = { + ...eventMetadata, + id: 'event-2', + sequence: 2, + type: 'message/chunk-appended', + messageId: 'message-1', + role: 'agent', + content: { type: 'text', text: `result for ${secret}` }, + } + const completed: AxisAcpEvent = { + ...eventMetadata, + id: 'event-3', + sequence: 3, + type: 'session/state-changed', + state: 'completed', + stopReason: 'end_turn', + } + const rawFrame: ProtocolTraceFrame = { + id: 'trace-1', + runId: eventMetadata.runId, + connectionId: eventMetadata.connectionId, + sequence: 1, + timestamp: eventMetadata.timestamp, + protocolVersion: 'v1', + direction: 'client-to-agent', + kind: 'request', + method: 'initialize', + requestId: 1, + raw: JSON.stringify({ + jsonrpc: '2.0', + id: 1, + method: 'initialize', + params: { token: secret }, + }), + byteLength: 100, + parsed: { + jsonrpc: '2.0', + id: 1, + method: 'initialize', + params: { token: secret }, + }, + } + + return { + run: { + id: eventMetadata.runId, + scenarioId: 'normal-prompt-turn', + startedAt: eventMetadata.timestamp, + completedAt: '2026-08-20T00:00:01.000Z', + toolkitVersion: '0.0.0', + protocolVersion: 'v1', + }, + target: { + id: 'fixture-agent', + transport: 'stdio', + protocolVersion: 'v1', + args: ['/Users/example/private-workspace'], + }, + clientProfile: { + id: 'minimal', + capabilities: {}, + allowedClientMethods: ['session/update'], + }, + rawFrames: [rawFrame], + events: [completed, message, prompting], + assertions: [{ id: 'session-status', passed: true, message: 'completed' }], + diagnostics: [], + } +} + +describe('Axis ACP transcript replay', () => { + it('steps, seeks and restores the same state hash without side effects', async () => { + const transcript = await createTranscript(transcriptDraft(), { + secretValues: ['sk-test-secret', '/Users/example/private-workspace'], + }) + const replay = new TranscriptReplay(transcript) + + expect(replay.step().states['session-replay']?.status).toBe('prompting') + expect( + replay.seek(2).states['session-replay']?.messages['message-1'] + ).toBeDefined() + expect(replay.playToEnd().states['session-replay']?.status).toBe( + 'completed' + ) + expect(await replay.verifyIntegrity()).toBe(true) + + const serialized = serializeTranscript(transcript) + const imported = TranscriptReplay.from(serialized) + imported.playToEnd() + expect(await imported.stateHashes()).toEqual( + transcript.integrity.stateHashes + ) + expect(await imported.verifyIntegrity()).toBe(true) + }) + + it('redacts keys and literal secrets from parsed and raw evidence', async () => { + const transcript = await createTranscript(transcriptDraft(), { + secretValues: ['sk-test-secret', '/Users/example/private-workspace'], + }) + const serialized = serializeTranscript(transcript) + + expect(serialized).not.toContain('sk-test-secret') + expect(serialized).not.toContain('/Users/example/private-workspace') + expect(serialized).toContain('[REDACTED]') + expect(transcript.redactionManifest.entries.length).toBeGreaterThan(2) + expect(transcript.redactionManifest.entries).toContainEqual( + expect.objectContaining({ reason: 'sensitive-key' }) + ) + expect(transcript.redactionManifest.entries).toContainEqual( + expect.objectContaining({ reason: 'secret-value' }) + ) + }) + + it('uses canonical object ordering and detects transcript tampering', async () => { + expect(await stateHash({ b: 2, a: 1 })).toBe( + await stateHash({ a: 1, b: 2 }) + ) + + const transcript = await createTranscript(transcriptDraft()) + const tampered = { + ...transcript, + events: transcript.events.map(event => + event.id === 'event-3' && event.type === 'session/state-changed' + ? { ...event, state: 'failed' as const } + : event + ), + } + const replay = new TranscriptReplay(tampered) + replay.playToEnd() + + expect(await replay.verifyIntegrity()).toBe(false) + }) + + it('rejects an unsupported schema version before replay', async () => { + const transcript = await createTranscript(transcriptDraft()) + + expect(() => parseTranscript({ ...transcript, schemaVersion: 2 })).toThrow( + 'Unsupported transcript schema version: 2' + ) + }) +}) From d742fc89348116752b7581cfe995187366b7982a Mon Sep 17 00:00:00 2001 From: CalvinWade Date: Thu, 18 Jun 2026 09:21:00 +0800 Subject: [PATCH 14/20] feat: export replayable scenario artifacts --- packages/acp-harness/src/scenario.ts | 48 +++++++++++++- .../replay/scenario-transcript.replay.spec.ts | 62 +++++++++++++++++++ 2 files changed, 109 insertions(+), 1 deletion(-) create mode 100644 test/replay/scenario-transcript.replay.spec.ts diff --git a/packages/acp-harness/src/scenario.ts b/packages/acp-harness/src/scenario.ts index 22f2928..4ad2e72 100644 --- a/packages/acp-harness/src/scenario.ts +++ b/packages/acp-harness/src/scenario.ts @@ -1,4 +1,9 @@ -import type { Diagnostic, SessionStateSnapshot } from '@axis-ui/acp-core' +import { + createTranscript, + type AxisAcpTranscript, + type Diagnostic, + type SessionStateSnapshot, +} from '@axis-ui/acp-core' import { AcpHarness } from './harness.js' import { evaluateLifecycleInvariants } from './invariants.js' import { @@ -37,6 +42,7 @@ export interface ScenarioReport { readonly assertions: readonly ScenarioAssertionResult[] readonly diagnostics: readonly Diagnostic[] readonly stateSnapshots: readonly SessionStateSnapshot[] + readonly transcript: AxisAcpTranscript readonly traceCount: number readonly eventCount: number } @@ -94,6 +100,7 @@ export class ScenarioRunner { } async run(definition: ScenarioDefinition): Promise { + const startedAt = new Date().toISOString() const harness = new AcpHarness(this.options.registry) const profile = clientProfiles[definition.profileId] const assertions: ScenarioAssertionResult[] = [] @@ -175,6 +182,44 @@ export class ScenarioRunner { const expectedDiagnosticsPresent = definition.expectedDiagnosticIds.every( id => diagnostics.some(item => item.invariantId === id) ) + const capabilitySnapshot = harness.events.find( + event => event.type === 'capability/snapshot' + ) + const transcript = await createTranscript( + { + run: { + id: harness.runId, + scenarioId: definition.id, + startedAt, + completedAt: new Date().toISOString(), + toolkitVersion: '0.0.0', + protocolVersion: 'v1', + }, + target: { + id: this.options.targetId, + transport: 'stdio', + protocolVersion: 'v1', + args: definition.targetArgs, + agentInfo: capabilitySnapshot?.agentInfo, + }, + clientProfile: { + id: profile.id, + capabilities: profile.capabilities, + allowedClientMethods: profile.allowedClientMethods, + }, + rawFrames: harness.trace, + events: harness.events, + assertions, + diagnostics, + }, + { + secretValues: [this.options.workspaceRoot], + explicitPaths: [ + 'rawFrames.*.parsed.params.prompt', + 'rawFrames.*.raw.$json.params.prompt', + ], + } + ) return { runId: harness.runId, @@ -187,6 +232,7 @@ export class ScenarioRunner { assertions, diagnostics, stateSnapshots, + transcript, traceCount: harness.trace.length, eventCount: harness.events.length, } diff --git a/test/replay/scenario-transcript.replay.spec.ts b/test/replay/scenario-transcript.replay.spec.ts new file mode 100644 index 0000000..7fb3bb2 --- /dev/null +++ b/test/replay/scenario-transcript.replay.spec.ts @@ -0,0 +1,62 @@ +import { + serializeTranscript, + stateHash, + TranscriptReplay, +} from '@axis-ui/acp-core' +import { describe, expect, it } from 'vitest' +import { + coreScenarios, + ScenarioRunner, +} from '../../packages/acp-harness/src/scenario.js' +import { + createFixtureRegistry, + repositoryRoot, +} from '../helpers/acp-fixture.js' + +describe('Scenario transcript integration', () => { + it('replays recorded facts to the same live session state hash', async () => { + const runner = new ScenarioRunner({ + registry: await createFixtureRegistry(), + targetId: 'fixture-agent', + workspaceRoot: repositoryRoot, + }) + const report = await runner.run(coreScenarios['normal-prompt-turn']) + const finalSnapshot = report.stateSnapshots.at(-1) + expect(finalSnapshot).toBeDefined() + + const replay = TranscriptReplay.from(serializeTranscript(report.transcript)) + const replayed = replay.playToEnd() + const sessionId = finalSnapshot?.state.sessionId ?? '' + + expect(replayed.states[sessionId]).toEqual(finalSnapshot?.state) + expect(report.transcript.integrity.stateHashes[sessionId]).toBe( + await stateHash(finalSnapshot?.state) + ) + expect(await replay.verifyIntegrity()).toBe(true) + expect(serializeTranscript(report.transcript)).not.toContain(repositoryRoot) + }) + + it('preserves Raw Frame links while replaying semantic events only', async () => { + const runner = new ScenarioRunner({ + registry: await createFixtureRegistry(), + targetId: 'fixture-agent', + workspaceRoot: repositoryRoot, + }) + const report = await runner.run(coreScenarios['cancel-during-permission']) + const traceIds = new Set(report.transcript.rawFrames.map(frame => frame.id)) + const linkedEvents = report.transcript.events.filter( + event => event.sourceTraceIds.length > 0 + ) + + expect(linkedEvents.length).toBeGreaterThan(0) + expect( + linkedEvents.every(event => + event.sourceTraceIds.every(traceId => traceIds.has(traceId)) + ) + ).toBe(true) + + const replay = new TranscriptReplay(report.transcript) + expect(replay.seek(0).states).toEqual({}) + expect(replay.playToEnd().states).not.toEqual({}) + }) +}) From 80d37d73ede4ddc8bf561befc20430f13446612e Mon Sep 17 00:00:00 2001 From: CalvinWade Date: Fri, 19 Jun 2026 11:52:00 +0800 Subject: [PATCH 15/20] feat: expose virtual list index navigation --- docs/src/components/virtual-list.md | 51 +++++++++---- .../virtual-list/src/virtual-list.ts | 6 ++ .../components/virtual-list/src/virtual.tsx | 73 +++++++++++++++---- .../virtual-list/virtual-list.spec.ts | 32 ++++++++ 4 files changed, 135 insertions(+), 27 deletions(-) diff --git a/docs/src/components/virtual-list.md b/docs/src/components/virtual-list.md index a600d5a..d222d8f 100644 --- a/docs/src/components/virtual-list.md +++ b/docs/src/components/virtual-list.md @@ -38,25 +38,25 @@ ### Props -| 参数 | 说明 | 类型 | 默认值 | -| --- | --- | --- | --- | -| items | 列表数据 | `any[]` | `[]` | -| size | 每项的固定高度(px)。传 > 0 启用固定高度模式 | `number` | `0` | -| estimatedSize | 预估高度(px)。`size` 为 0 时传 > 0 启用动态高度模式 | `number` | `0` | -| remain | 可见区域显示的项数 | `number` | `8` | +| 参数 | 说明 | 类型 | 默认值 | +| ------------- | ----------------------------------------------------- | -------- | ------ | +| items | 列表数据 | `any[]` | `[]` | +| size | 每项的固定高度(px)。传 > 0 启用固定高度模式 | `number` | `0` | +| estimatedSize | 预估高度(px)。`size` 为 0 时传 > 0 启用动态高度模式 | `number` | `0` | +| remain | 可见区域显示的项数 | `number` | `8` | ### 模式判断 -| `size` | `estimatedSize` | 模式 | -| --- | --- | --- | -| > 0 | 任意 | 固定高度(向后兼容) | -| 0 | > 0 | 动态高度 | -| 0 | 0 | 回退到默认 32px | +| `size` | `estimatedSize` | 模式 | +| ------ | --------------- | -------------------- | +| > 0 | 任意 | 固定高度(向后兼容) | +| 0 | > 0 | 动态高度 | +| 0 | 0 | 回退到默认 32px | ### Slots -| 插槽名 | 说明 | 参数 | -| --- | --- | --- | +| 插槽名 | 说明 | 参数 | +| ------- | ---------------- | --------------- | | default | 自定义列表项内容 | `{ node: any }` | ## 使用示例 @@ -103,6 +103,31 @@ const items = Array.from({ length: 10000 }, (_, i) => ({ ``` +### 定位到指定索引 + +组件实例暴露 `scrollToIndex(index, alignment?)`,用于日志、Trace 等大列表从业务标识映射到数组索引后定位。`alignment` 支持 `auto`、`start`、`center` 和 `end`,默认 `auto`:条目已完整可见时不滚动。 + +```vue + + + +``` + +`scrollToIndex` 只处理通用列表坐标,不理解 ACP Sequence。DevTools 应先用自己的 Trace/Event 索引把 `sequence` 转成当前筛选结果中的数组下标,再调用组件方法;这样协议语义不会进入 Axis-UI。 + ## 注意事项 > [!IMPORTANT] diff --git a/packages/components/virtual-list/src/virtual-list.ts b/packages/components/virtual-list/src/virtual-list.ts index a9b53b3..b829f34 100644 --- a/packages/components/virtual-list/src/virtual-list.ts +++ b/packages/components/virtual-list/src/virtual-list.ts @@ -24,3 +24,9 @@ export const virtualListProps = { } as const export type VirtualListProps = ExtractPropTypes + +export type VirtualListAlignment = 'auto' | 'start' | 'center' | 'end' + +export interface VirtualListExpose { + scrollToIndex: (index: number, alignment?: VirtualListAlignment) => void +} diff --git a/packages/components/virtual-list/src/virtual.tsx b/packages/components/virtual-list/src/virtual.tsx index 6e22225..6db2342 100644 --- a/packages/components/virtual-list/src/virtual.tsx +++ b/packages/components/virtual-list/src/virtual.tsx @@ -8,12 +8,12 @@ import { ref, watch, } from 'vue' -import { virtualListProps } from './virtual-list' +import { virtualListProps, type VirtualListAlignment } from './virtual-list' export default defineComponent({ name: 'AxVirtualList', props: virtualListProps, - setup(props, { slots }) { + setup(props, { slots, expose }) { const bem = createNamespace('vl') const wrapperRef = ref() const barRef = ref() @@ -24,7 +24,11 @@ export default defineComponent({ // ======================================== const isFixedMode = computed(() => props.size > 0) const itemSize = computed(() => - props.size > 0 ? props.size : props.estimatedSize > 0 ? props.estimatedSize : 32, + props.size > 0 + ? props.size + : props.estimatedSize > 0 + ? props.estimatedSize + : 32 ) // ======================================== @@ -85,10 +89,12 @@ export default defineComponent({ }) const prev = computed(() => Math.min(props.remain, state.start)) - const next = computed(() => Math.min(props.remain, props.items.length - state.end)) + const next = computed(() => + Math.min(props.remain, props.items.length - state.end) + ) const visibleData = computed(() => - props.items.slice(state.start - prev.value, state.end + next.value), + props.items.slice(state.start - prev.value, state.end + next.value) ) const offsetY = ref(0) @@ -121,6 +127,42 @@ export default defineComponent({ } } + function scrollToIndex( + requestedIndex: number, + alignment: VirtualListAlignment = 'auto' + ): void { + const wrapper = wrapperRef.value + if (!wrapper || props.items.length === 0) return + const index = Math.min( + props.items.length - 1, + Math.max(0, Math.trunc(requestedIndex)) + ) + const itemTop = getItemOffset(index) + const itemBottom = itemTop + getItemHeight(index) + const viewportHeight = props.remain * itemSize.value + const viewportTop = wrapper.scrollTop + const viewportBottom = viewportTop + viewportHeight + let nextScrollTop = itemTop + + if (alignment === 'auto') { + if (itemTop >= viewportTop && itemBottom <= viewportBottom) return + nextScrollTop = + itemTop < viewportTop ? itemTop : itemBottom - viewportHeight + } else if (alignment === 'center') { + nextScrollTop = itemTop - (viewportHeight - getItemHeight(index)) / 2 + } else if (alignment === 'end') { + nextScrollTop = itemBottom - viewportHeight + } + + wrapper.scrollTop = Math.min( + Math.max(0, getTotalHeight() - viewportHeight), + Math.max(0, nextScrollTop) + ) + handleScroll() + } + + expose({ scrollToIndex }) + // ======================================== // 容器初始化 // ======================================== @@ -136,18 +178,21 @@ export default defineComponent({ } } - watch(() => props.items, () => { - // 清理过期缓存 - if (!isFixedMode.value) { - // 删除超出新长度的缓存 - for (const key of measuredHeights.keys()) { - if (key >= props.items.length) { - measuredHeights.delete(key) + watch( + () => props.items, + () => { + // 清理过期缓存 + if (!isFixedMode.value) { + // 删除超出新长度的缓存 + for (const key of measuredHeights.keys()) { + if (key >= props.items.length) { + measuredHeights.delete(key) + } } } + initWrapper() } - initWrapper() - }) + ) watch(() => [props.size, props.estimatedSize, props.remain], initWrapper) diff --git a/test/components/virtual-list/virtual-list.spec.ts b/test/components/virtual-list/virtual-list.spec.ts index db32238..df0c5f3 100644 --- a/test/components/virtual-list/virtual-list.spec.ts +++ b/test/components/virtual-list/virtual-list.spec.ts @@ -84,6 +84,38 @@ describe('AxVirtualList', () => { (wrapper.find('.ax-vl__scroll-bar').element as HTMLElement).style.height ).toBe('1600px') // 50 * 32 }) + + it('scrollToIndex exposes generic index navigation with alignment', async () => { + const wrapper = mountList(createItems(100)) + const component = wrapper.vm as unknown as { + scrollToIndex: ( + index: number, + alignment?: 'auto' | 'start' | 'center' | 'end' + ) => void + } + + component.scrollToIndex(50, 'center') + await wrapper.vm.$nextTick() + + expect(wrapper.element.scrollTop).toBe(1488) + expect(itemTexts(wrapper)).toContain('Item 50') + + component.scrollToIndex(500, 'end') + await wrapper.vm.$nextTick() + expect(wrapper.element.scrollTop).toBe((100 - 8) * 32) + expect(itemTexts(wrapper).at(-1)).toBe('Item 99') + }) + + it('scrollToIndex auto keeps an already visible item stable', () => { + const wrapper = mountList(createItems(100)) + const component = wrapper.vm as unknown as { + scrollToIndex: (index: number) => void + } + + component.scrollToIndex(4) + + expect(wrapper.element.scrollTop).toBe(0) + }) }) // ======================================== From d7c0c34b165a3468cf35be28884fb61d5706412f Mon Sep 17 00:00:00 2001 From: CalvinWade Date: Sat, 20 Jun 2026 10:37:00 +0800 Subject: [PATCH 16/20] feat: register OpenCode as an ACP target --- packages/acp-harness/src/index.ts | 1 + packages/acp-harness/src/registry-targets.ts | 44 +++++++++++++++++++ test/contract/real-agent.contract.spec.ts | 45 ++++++++++++++++++++ 3 files changed, 90 insertions(+) create mode 100644 packages/acp-harness/src/registry-targets.ts create mode 100644 test/contract/real-agent.contract.spec.ts diff --git a/packages/acp-harness/src/index.ts b/packages/acp-harness/src/index.ts index 05e9f93..3ef137e 100644 --- a/packages/acp-harness/src/index.ts +++ b/packages/acp-harness/src/index.ts @@ -4,6 +4,7 @@ export * from './client-profiles.js' export * from './invariants.js' export * from './scenario.js' export * from './process-manager.js' +export * from './registry-targets.js' export * from './sdk-client.js' export * from './target-registry.js' export * from './transport-tap.js' diff --git a/packages/acp-harness/src/registry-targets.ts b/packages/acp-harness/src/registry-targets.ts new file mode 100644 index 0000000..e4dccf7 --- /dev/null +++ b/packages/acp-harness/src/registry-targets.ts @@ -0,0 +1,44 @@ +import { accessSync, constants } from 'node:fs' +import { delimiter, isAbsolute, join } from 'node:path' +import { HarnessError } from './errors.js' +import type { TargetDefinition } from './types.js' + +export function findExecutable( + executable: string, + searchPath: string | undefined = process.env.PATH +): string | undefined { + if (isAbsolute(executable)) + return canExecute(executable) ? executable : undefined + for (const directory of searchPath?.split(delimiter) ?? []) { + const candidate = join(directory, executable) + if (canExecute(candidate)) return candidate + } + return undefined +} + +export function createOpenCodeTarget(command: string): TargetDefinition { + if (!isAbsolute(command)) { + throw new HarnessError( + `OpenCode command must be absolute: ${command}`, + 'INVALID_TARGET_COMMAND' + ) + } + return { + id: 'opencode', + command, + fixedArgs: ['acp', '--pure'], + allowedArgs: [], + environmentAllowlist: ['PATH'], + maxProcesses: 1, + expectedProtocolVersion: 'v1', + } +} + +function canExecute(path: string): boolean { + try { + accessSync(path, constants.X_OK) + return true + } catch { + return false + } +} diff --git a/test/contract/real-agent.contract.spec.ts b/test/contract/real-agent.contract.spec.ts new file mode 100644 index 0000000..7ec4167 --- /dev/null +++ b/test/contract/real-agent.contract.spec.ts @@ -0,0 +1,45 @@ +import { existsSync } from 'node:fs' +import { describe, expect, it } from 'vitest' +import { AcpHarness } from '../../packages/acp-harness/src/harness.js' +import { createOpenCodeTarget } from '../../packages/acp-harness/src/registry-targets.js' +import { TargetRegistry } from '../../packages/acp-harness/src/target-registry.js' +import { repositoryRoot } from '../helpers/acp-fixture.js' + +const openCodePath = + process.env.AXIS_OPENCODE_PATH ?? '/opt/homebrew/bin/opencode' + +describe.skipIf(!existsSync(openCodePath))('OpenCode real ACP agent', () => { + it('negotiates initialize and records a capability snapshot without a model turn', async () => { + const registry = await TargetRegistry.create( + [createOpenCodeTarget(openCodePath)], + [repositoryRoot] + ) + const harness = new AcpHarness(registry) + + try { + const target = await harness.startTarget({ + targetId: 'opencode', + workspaceRoot: repositoryRoot, + }) + const initialization = await harness.initialize(target.id) + + expect(initialization.response.protocolVersion).toBe(1) + expect(harness.trace).toEqual( + expect.arrayContaining([ + expect.objectContaining({ kind: 'request', method: 'initialize' }), + expect.objectContaining({ kind: 'response' }), + ]) + ) + expect(harness.events).toEqual( + expect.arrayContaining([ + expect.objectContaining({ type: 'capability/snapshot' }), + ]) + ) + + await harness.stopTarget(target.id) + expect(harness.processes.list()).toEqual([]) + } finally { + await harness.dispose() + } + }, 15_000) +}) From be52d483b85b6dcccbbc0f9369481462b011a1e4 Mon Sep 17 00:00:00 2001 From: CalvinWade Date: Sat, 20 Jun 2026 14:46:00 +0800 Subject: [PATCH 17/20] feat: add headless scenario reports --- package.json | 2 +- packages/acp-cli/package.json | 3 + packages/acp-cli/src/cli.ts | 273 ++++++++++++++++++++++ packages/acp-cli/src/index.ts | 4 +- packages/acp-cli/src/main.ts | 4 + packages/acp-cli/src/report.ts | 109 +++++++++ test/contract/cli-report.contract.spec.ts | 66 ++++++ 7 files changed, 458 insertions(+), 3 deletions(-) create mode 100644 packages/acp-cli/src/cli.ts create mode 100644 packages/acp-cli/src/main.ts create mode 100644 packages/acp-cli/src/report.ts create mode 100644 test/contract/cli-report.contract.spec.ts diff --git a/package.json b/package.json index 2bcd981..00c86a8 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ "format": "prettier --write .", "format:check": "prettier --check .", "type-check": "pnpm type-check:node && pnpm type-check:vue", - "type-check:node": "pnpm --filter @axis-ui/acp-core run type-check && pnpm --filter @axis-ui/acp-core run build && pnpm -r --filter @axis-ui/acp-harness --filter @axis-ui/acp-cli --filter @axis-ui/acp-fixture-agents run type-check", + "type-check:node": "pnpm --filter @axis-ui/acp-core run type-check && pnpm --filter @axis-ui/acp-core run build && pnpm --filter @axis-ui/acp-harness run type-check && pnpm --filter @axis-ui/acp-harness run build && pnpm -r --filter @axis-ui/acp-cli --filter @axis-ui/acp-fixture-agents run type-check", "type-check:vue": "vue-tsc --noEmit && pnpm --filter @axis-ui/acp-devtools run type-check", "test": "vitest", "test:unit": "vitest run --project axis-ui --project acp-node --project acp-devtools", diff --git a/packages/acp-cli/package.json b/packages/acp-cli/package.json index 2723753..8dd03e2 100644 --- a/packages/acp-cli/package.json +++ b/packages/acp-cli/package.json @@ -3,6 +3,9 @@ "version": "0.0.0", "private": true, "type": "module", + "bin": { + "axis-acp": "./dist/main.js" + }, "exports": { ".": { "types": "./dist/index.d.ts", diff --git a/packages/acp-cli/src/cli.ts b/packages/acp-cli/src/cli.ts new file mode 100644 index 0000000..9e8f79a --- /dev/null +++ b/packages/acp-cli/src/cli.ts @@ -0,0 +1,273 @@ +import { mkdir, readFile, writeFile } from 'node:fs/promises' +import { basename, dirname, resolve } from 'node:path' +import { fileURLToPath } from 'node:url' +import { + parseTranscript, + serializeTranscript, + TranscriptReplay, +} from '@axis-ui/acp-core' +import { + AcpHarness, + coreScenarios, + createOpenCodeTarget, + findExecutable, + ScenarioRunner, + TargetRegistry, + type CoreScenarioId, + type TargetDefinition, +} from '@axis-ui/acp-harness' +import { renderScenarioReport } from './report.js' + +export interface CliIo { + readonly stdout: (message: string) => void + readonly stderr: (message: string) => void +} + +const defaultIo: CliIo = { + stdout: message => console.log(message), + stderr: message => console.error(message), +} + +interface ParsedArguments { + readonly command?: string + readonly options: Readonly> +} + +export async function runCli( + argv: readonly string[], + io: CliIo = defaultIo +): Promise { + try { + const parsed = parseArguments(argv) + if (parsed.command === undefined || parsed.command === 'help') { + io.stdout(helpText) + return 0 + } + if (parsed.command === 'run') return await runScenario(parsed.options, io) + if (parsed.command === 'inspect') { + return await inspectTarget(parsed.options, io) + } + if (parsed.command === 'replay') { + return await replayArtifact(parsed.options, io) + } + throw new Error(`Unknown command: ${parsed.command}`) + } catch (error) { + io.stderr(error instanceof Error ? error.message : String(error)) + return 1 + } +} + +async function runScenario( + options: Readonly>, + io: CliIo +): Promise { + const workspaceRoot = resolve(options.workspace ?? process.cwd()) + const scenarioId = (options.scenario ?? + 'normal-prompt-turn') as CoreScenarioId + const definition = coreScenarios[scenarioId] + if (definition === undefined) + throw new Error(`Unknown scenario: ${scenarioId}`) + const targetId = options.target ?? 'fixture-agent' + const registry = await createRegistry(targetId, workspaceRoot) + const timeoutMs = parsePositiveInteger( + options.timeout, + targetId === 'opencode' ? 120_000 : 2_000 + ) + const runner = new ScenarioRunner({ + registry, + targetId, + workspaceRoot, + timeoutMs, + }) + const report = await runner.run(definition) + const outputDirectory = resolve(options.output ?? 'artifacts/runs') + const stem = `${targetId}-${scenarioId}` + const transcriptPath = resolve( + options.json ?? resolve(outputDirectory, `${stem}.axis-acp.json`) + ) + const reportPath = resolve( + options.html ?? resolve(outputDirectory, `${stem}.html`) + ) + await Promise.all([ + writeText(transcriptPath, serializeTranscript(report.transcript)), + writeText( + reportPath, + renderScenarioReport(report, basename(transcriptPath)) + ), + ]) + io.stdout( + JSON.stringify( + { + status: report.status, + targetId, + scenarioId, + diagnostics: report.diagnostics.length, + traceCount: report.traceCount, + eventCount: report.eventCount, + transcriptPath, + reportPath, + }, + null, + 2 + ) + ) + return report.status === 'passed' ? 0 : 1 +} + +async function inspectTarget( + options: Readonly>, + io: CliIo +): Promise { + const workspaceRoot = resolve(options.workspace ?? process.cwd()) + const targetId = options.target ?? 'opencode' + const registry = await createRegistry(targetId, workspaceRoot) + const harness = new AcpHarness(registry) + let targetHandleId: string | undefined + try { + const target = await harness.startTarget({ targetId, workspaceRoot }) + targetHandleId = target.id + const initialization = await harness.initialize(target.id) + const capability = harness.events.find( + event => event.type === 'capability/snapshot' + ) + await harness.stopTarget(target.id) + targetHandleId = undefined + io.stdout( + JSON.stringify( + { + targetId, + protocolVersion: initialization.response.protocolVersion, + agentInfo: capability?.agentInfo, + agentCapabilities: capability?.agentCapabilities, + traceCount: harness.trace.length, + eventCount: harness.events.length, + activeProcesses: harness.processes.list().length, + }, + null, + 2 + ) + ) + return 0 + } finally { + if (targetHandleId !== undefined) { + await harness.stopTarget(targetHandleId).catch(() => undefined) + } + await harness.dispose() + } +} + +async function replayArtifact( + options: Readonly>, + io: CliIo +): Promise { + const input = options.input + if (input === undefined) throw new Error('replay requires --input ') + const transcript = parseTranscript(await readFile(resolve(input), 'utf8')) + const replay = new TranscriptReplay(transcript) + const snapshot = replay.playToEnd() + const valid = await replay.verifyIntegrity() + io.stdout( + JSON.stringify( + { + runId: transcript.run.id, + scenarioId: transcript.run.scenarioId, + status: snapshot.status, + sequence: snapshot.currentSequence, + stateHashes: await replay.stateHashes(), + integrityValid: valid, + }, + null, + 2 + ) + ) + return valid ? 0 : 1 +} + +async function createRegistry( + targetId: string, + workspaceRoot: string +): Promise { + const definition = targetDefinition(targetId) + return TargetRegistry.create([definition], [workspaceRoot]) +} + +function targetDefinition(targetId: string): TargetDefinition { + if (targetId === 'fixture-agent') { + return { + id: targetId, + command: process.execPath, + fixedArgs: [ + fileURLToPath( + new URL( + '../../../fixtures/acp-agents/bin/fixture-agent.mjs', + import.meta.url + ) + ), + ], + allowedArgs: [ + '--crash-after-initialize', + '--stdout-noise', + '--stderr-marker', + '--permission-prompt', + '--crash-during-prompt', + '--capability-method-mismatch', + ], + environmentAllowlist: ['PATH'], + maxProcesses: 2, + expectedProtocolVersion: 'v1', + } + } + if (targetId === 'opencode') { + const command = process.env.AXIS_OPENCODE_PATH ?? findExecutable('opencode') + if (command === undefined) { + throw new Error( + 'OpenCode was not found; set AXIS_OPENCODE_PATH to an absolute executable path' + ) + } + return createOpenCodeTarget(command) + } + throw new Error(`Unknown target: ${targetId}`) +} + +async function writeText(path: string, content: string): Promise { + await mkdir(dirname(path), { recursive: true }) + await writeFile(path, `${content}\n`, 'utf8') +} + +function parsePositiveInteger( + value: string | undefined, + fallback: number +): number { + if (value === undefined) return fallback + const parsed = Number(value) + if (!Number.isSafeInteger(parsed) || parsed <= 0) { + throw new Error(`Expected a positive integer, received: ${value}`) + } + return parsed +} + +function parseArguments(argv: readonly string[]): ParsedArguments { + const [command, ...rest] = argv + const options: Record = {} + for (let index = 0; index < rest.length; index += 2) { + const key = rest[index] + const value = rest[index + 1] + if (key === undefined || !key.startsWith('--') || value === undefined) { + throw new Error(`Invalid option near: ${key ?? '(end)'}`) + } + options[key.slice(2)] = value + } + return { command, options } +} + +const helpText = `Axis ACP DevKit + +Usage: + axis-acp run --target fixture-agent --scenario normal-prompt-turn --workspace . + axis-acp inspect --target opencode --workspace . + axis-acp replay --input artifacts/runs/fixture-agent-normal-prompt-turn.axis-acp.json + +Commands: + run Execute one of the three fixed scenarios and write JSON + HTML. + inspect Initialize a registered target and print capabilities without a model turn. + replay Restore recorded semantic events and verify final state hashes.` diff --git a/packages/acp-cli/src/index.ts b/packages/acp-cli/src/index.ts index 0d7813e..62b2db6 100644 --- a/packages/acp-cli/src/index.ts +++ b/packages/acp-cli/src/index.ts @@ -1,2 +1,2 @@ -// Gate 01 establishes only the private package boundary. CLI commands start in later gates. -export {} +export * from './cli.js' +export * from './report.js' diff --git a/packages/acp-cli/src/main.ts b/packages/acp-cli/src/main.ts new file mode 100644 index 0000000..a566d17 --- /dev/null +++ b/packages/acp-cli/src/main.ts @@ -0,0 +1,4 @@ +#!/usr/bin/env node +import { runCli } from './cli.js' + +process.exitCode = await runCli(process.argv.slice(2)) diff --git a/packages/acp-cli/src/report.ts b/packages/acp-cli/src/report.ts new file mode 100644 index 0000000..ae908e9 --- /dev/null +++ b/packages/acp-cli/src/report.ts @@ -0,0 +1,109 @@ +import type { ScenarioReport } from '@axis-ui/acp-harness' + +function escapeHtml(value: string): string { + return value + .replaceAll('&', '&') + .replaceAll('<', '<') + .replaceAll('>', '>') + .replaceAll('"', '"') + .replaceAll("'", ''') +} + +function json(value: unknown): string { + return escapeHtml(JSON.stringify(value, null, 2)) +} + +export function renderScenarioReport( + report: ScenarioReport, + transcriptFileName: string +): string { + const diagnostics = report.diagnostics + .map( + item => ` + ${escapeHtml(item.severity)} + ${escapeHtml(item.kind)} + ${escapeHtml(item.subject)} + ${escapeHtml(item.invariantId)} + ${escapeHtml(item.message)} + ` + ) + .join('') + const assertions = report.assertions + .map( + assertion => `
  • + ${assertion.passed ? 'PASS' : 'FAIL'} + ${escapeHtml(assertion.id)} + ${escapeHtml(assertion.message)} +
  • ` + ) + .join('') + + return ` + + + + + Axis ACP Report · ${escapeHtml(report.scenarioId)} + + + +
    +
    +
    Axis ACP DevKit · Single Run
    +

    ${escapeHtml(report.scenarioId)}

    +

    ${escapeHtml(report.status.toUpperCase())}

    +

    This is an Axis scenario result, not official ACP certification.

    + Download redacted transcript +
    +
    +

    Run evidence

    +
    +
    Raw frames${report.traceCount}
    +
    Semantic events${report.eventCount}
    +
    Diagnostics${report.diagnostics.length}
    +
    State snapshots${report.stateSnapshots.length}
    +
    +
    +
    +

    Assertions

    +
      ${assertions}
    +
    +
    +

    Diagnostics

    + ${diagnostics.length === 0 ? '

    No diagnostics.

    ' : `${diagnostics}
    SeverityKindSubjectInvariantMessage
    `} +
    +
    +

    Client profile

    +
    ${json(report.profile)}
    +
    +
    +

    State hashes

    +
    ${json(report.transcript.integrity.stateHashes)}
    +
    +
    + +` +} diff --git a/test/contract/cli-report.contract.spec.ts b/test/contract/cli-report.contract.spec.ts new file mode 100644 index 0000000..fc3f4e5 --- /dev/null +++ b/test/contract/cli-report.contract.spec.ts @@ -0,0 +1,66 @@ +import { mkdtemp, readFile } from 'node:fs/promises' +import { tmpdir } from 'node:os' +import { join } from 'node:path' +import { describe, expect, it } from 'vitest' +import { runCli } from '../../packages/acp-cli/src/cli.js' +import { parseTranscript } from '../../packages/acp-core/src/transcript.js' +import { repositoryRoot } from '../helpers/acp-fixture.js' + +describe('Headless CLI and single-run report', () => { + it('runs a fixed scenario and writes replayable JSON plus escaped HTML', async () => { + const outputDirectory = await mkdtemp(join(tmpdir(), 'axis-acp-cli-')) + const stdout: string[] = [] + const stderr: string[] = [] + + const exitCode = await runCli( + [ + 'run', + '--target', + 'fixture-agent', + '--scenario', + 'capability-method-mismatch', + '--workspace', + repositoryRoot, + '--output', + outputDirectory, + ], + { + stdout: message => stdout.push(message), + stderr: message => stderr.push(message), + } + ) + + expect(exitCode).toBe(0) + expect(stderr).toEqual([]) + const summary = JSON.parse(stdout[0] ?? '{}') as { + transcriptPath: string + reportPath: string + } + const transcript = parseTranscript( + await readFile(summary.transcriptPath, 'utf8') + ) + const html = await readFile(summary.reportPath, 'utf8') + + expect(transcript.run.scenarioId).toBe('capability-method-mismatch') + expect(transcript.diagnostics).toContainEqual( + expect.objectContaining({ + kind: 'capability-contract-mismatch', + subject: 'agent', + }) + ) + expect(html).toContain('not official ACP certification') + expect(html).toContain('omitted-capability-is-unsupported') + + const replayOutput: string[] = [] + expect( + await runCli(['replay', '--input', summary.transcriptPath], { + stdout: message => replayOutput.push(message), + stderr: () => undefined, + }) + ).toBe(0) + expect(JSON.parse(replayOutput[0] ?? '{}')).toMatchObject({ + status: 'completed', + integrityValid: true, + }) + }) +}) From 0cf2cfbff448e1e86475e04ea68537c3bfbc9c19 Mon Sep 17 00:00:00 2001 From: CalvinWade Date: Sat, 20 Jun 2026 17:03:00 +0800 Subject: [PATCH 18/20] feat: run scenarios through the local bridge --- packages/acp-cli/src/cli.ts | 89 ++++++++++++++++++- packages/acp-harness/src/bridge/messages.ts | 27 ++++++ .../contract/devtools-bridge.contract.spec.ts | 62 +++++++++++++ test/security/local-bridge.security.spec.ts | 16 ++++ 4 files changed, 192 insertions(+), 2 deletions(-) create mode 100644 test/contract/devtools-bridge.contract.spec.ts diff --git a/packages/acp-cli/src/cli.ts b/packages/acp-cli/src/cli.ts index 9e8f79a..18ec3e4 100644 --- a/packages/acp-cli/src/cli.ts +++ b/packages/acp-cli/src/cli.ts @@ -11,8 +11,10 @@ import { coreScenarios, createOpenCodeTarget, findExecutable, + LocalBridge, ScenarioRunner, TargetRegistry, + type BridgeMessage, type CoreScenarioId, type TargetDefinition, } from '@axis-ui/acp-harness' @@ -50,6 +52,9 @@ export async function runCli( if (parsed.command === 'replay') { return await replayArtifact(parsed.options, io) } + if (parsed.command === 'serve') { + return await serveBridge(parsed.options, io) + } throw new Error(`Unknown command: ${parsed.command}`) } catch (error) { io.stderr(error instanceof Error ? error.message : String(error)) @@ -191,7 +196,7 @@ async function createRegistry( return TargetRegistry.create([definition], [workspaceRoot]) } -function targetDefinition(targetId: string): TargetDefinition { +export function targetDefinition(targetId: string): TargetDefinition { if (targetId === 'fixture-agent') { return { id: targetId, @@ -229,6 +234,72 @@ function targetDefinition(targetId: string): TargetDefinition { throw new Error(`Unknown target: ${targetId}`) } +export function createScenarioBridgeHandler(): ( + message: BridgeMessage +) => Promise { + return async message => { + if (message.type !== 'scenario/run') { + throw new Error(`Unsupported bridge operation: ${message.type}`) + } + if (!Object.hasOwn(coreScenarios, message.scenarioId)) { + throw new Error(`Unknown scenario: ${message.scenarioId}`) + } + if ( + message.targetId === 'opencode' && + message.scenarioId !== 'normal-prompt-turn' + ) { + throw new Error('OpenCode is limited to normal-prompt-turn') + } + const definition = coreScenarios[message.scenarioId as CoreScenarioId] + const registry = await createRegistry( + message.targetId, + resolve(message.workspaceRoot) + ) + return new ScenarioRunner({ + registry, + targetId: message.targetId, + workspaceRoot: resolve(message.workspaceRoot), + timeoutMs: message.targetId === 'opencode' ? 120_000 : 2_000, + }).run(definition) + } +} + +async function serveBridge( + options: Readonly>, + io: CliIo +): Promise { + const bridge = new LocalBridge({ + host: options.host ?? '127.0.0.1', + port: parseNonNegativeInteger(options.port, 0), + allowedOrigins: [options.origin ?? 'http://127.0.0.1:5173'], + token: options.token, + onMessage: createScenarioBridgeHandler(), + }) + const address = await bridge.start() + io.stdout( + JSON.stringify( + { + url: address.url, + token: address.token, + origin: options.origin ?? 'http://127.0.0.1:5173', + }, + null, + 2 + ) + ) + await new Promise(resolveStop => { + const stop = (): void => { + process.off('SIGINT', stop) + process.off('SIGTERM', stop) + resolveStop() + } + process.once('SIGINT', stop) + process.once('SIGTERM', stop) + }) + await bridge.stop() + return 0 +} + async function writeText(path: string, content: string): Promise { await mkdir(dirname(path), { recursive: true }) await writeFile(path, `${content}\n`, 'utf8') @@ -246,6 +317,18 @@ function parsePositiveInteger( return parsed } +function parseNonNegativeInteger( + value: string | undefined, + fallback: number +): number { + if (value === undefined) return fallback + const parsed = Number(value) + if (!Number.isSafeInteger(parsed) || parsed < 0 || parsed > 65_535) { + throw new Error(`Expected a valid port, received: ${value}`) + } + return parsed +} + function parseArguments(argv: readonly string[]): ParsedArguments { const [command, ...rest] = argv const options: Record = {} @@ -266,8 +349,10 @@ Usage: axis-acp run --target fixture-agent --scenario normal-prompt-turn --workspace . axis-acp inspect --target opencode --workspace . axis-acp replay --input artifacts/runs/fixture-agent-normal-prompt-turn.axis-acp.json + axis-acp serve --origin http://127.0.0.1:5173 Commands: run Execute one of the three fixed scenarios and write JSON + HTML. inspect Initialize a registered target and print capabilities without a model turn. - replay Restore recorded semantic events and verify final state hashes.` + replay Restore recorded semantic events and verify final state hashes. + serve Start the authenticated loopback bridge for the DevTools UI.` diff --git a/packages/acp-harness/src/bridge/messages.ts b/packages/acp-harness/src/bridge/messages.ts index 7688114..5c58449 100644 --- a/packages/acp-harness/src/bridge/messages.ts +++ b/packages/acp-harness/src/bridge/messages.ts @@ -12,6 +12,13 @@ export type BridgeMessage = readonly requestId: string readonly targetHandleId: string } + | { + readonly type: 'scenario/run' + readonly requestId: string + readonly targetId: string + readonly scenarioId: string + readonly workspaceRoot: string + } function requireString(value: Record, key: string): string { const field = value[key] @@ -57,5 +64,25 @@ export function parseBridgeMessage(input: unknown): BridgeMessage { } } + if (type === 'scenario/run') { + const allowed = new Set([ + 'type', + 'requestId', + 'targetId', + 'scenarioId', + 'workspaceRoot', + ]) + if (Object.keys(value).some(key => !allowed.has(key))) { + throw new HarnessError('Unknown scenario/run field', 'BAD_MESSAGE') + } + return { + type, + requestId, + targetId: requireString(value, 'targetId'), + scenarioId: requireString(value, 'scenarioId'), + workspaceRoot: requireString(value, 'workspaceRoot'), + } + } + throw new HarnessError(`Unknown bridge message type: ${type}`, 'BAD_MESSAGE') } diff --git a/test/contract/devtools-bridge.contract.spec.ts b/test/contract/devtools-bridge.contract.spec.ts new file mode 100644 index 0000000..17cfdf4 --- /dev/null +++ b/test/contract/devtools-bridge.contract.spec.ts @@ -0,0 +1,62 @@ +import { once } from 'node:events' +import WebSocket from 'ws' +import { afterEach, describe, expect, it } from 'vitest' +import { createScenarioBridgeHandler } from '../../packages/acp-cli/src/cli.js' +import { LocalBridge } from '../../packages/acp-harness/src/bridge/local-bridge.js' +import { parseTranscript } from '../../packages/acp-core/src/transcript.js' +import { repositoryRoot } from '../helpers/acp-fixture.js' + +const origin = 'http://127.0.0.1:5173' +const bridges: LocalBridge[] = [] +const sockets: WebSocket[] = [] + +afterEach(async () => { + for (const socket of sockets.splice(0)) socket.terminate() + await Promise.all(bridges.splice(0).map(bridge => bridge.stop())) +}) + +describe('DevTools scenario bridge', () => { + it('runs a fixed scenario through the authenticated WebSocket boundary', async () => { + const bridge = new LocalBridge({ + allowedOrigins: [origin], + onMessage: createScenarioBridgeHandler(), + }) + bridges.push(bridge) + const address = await bridge.start() + const socket = new WebSocket( + `${address.url}?token=${encodeURIComponent(address.token)}`, + { origin } + ) + sockets.push(socket) + await once(socket, 'open') + + socket.send( + JSON.stringify({ + type: 'scenario/run', + requestId: 'scenario-1', + targetId: 'fixture-agent', + scenarioId: 'capability-method-mismatch', + workspaceRoot: repositoryRoot, + }) + ) + + const [data] = (await once(socket, 'message')) as [Buffer] + const response = JSON.parse(data.toString()) as { + type: string + requestId: string + result: { transcript: unknown } + } + expect(response).toMatchObject({ + type: 'response', + requestId: 'scenario-1', + }) + expect( + parseTranscript(response.result.transcript).diagnostics + ).toContainEqual( + expect.objectContaining({ + kind: 'capability-contract-mismatch', + subject: 'agent', + }) + ) + }) +}) diff --git a/test/security/local-bridge.security.spec.ts b/test/security/local-bridge.security.spec.ts index d6ef24a..a04a6a1 100644 --- a/test/security/local-bridge.security.spec.ts +++ b/test/security/local-bridge.security.spec.ts @@ -110,6 +110,22 @@ describe('LocalBridge security boundary', () => { error: { code: 'BAD_MESSAGE' }, }) + socket.send( + JSON.stringify({ + type: 'scenario/run', + requestId: 'arbitrary-args', + targetId: 'fixture-agent', + scenarioId: 'normal-prompt-turn', + workspaceRoot: repositoryRoot, + args: ['--execute-arbitrary-command'], + }) + ) + expect(await nextJson(socket)).toMatchObject({ + type: 'error', + requestId: 'unknown', + error: { code: 'BAD_MESSAGE' }, + }) + socket.send( JSON.stringify({ type: 'target/start', From edc36b2da9c8166dd342a410087911bb5a4e716c Mon Sep 17 00:00:00 2001 From: CalvinWade Date: Sun, 21 Jun 2026 12:16:00 +0800 Subject: [PATCH 19/20] feat: build the ACP protocol workbench --- apps/acp-devtools/index.html | 16 + apps/acp-devtools/package.json | 3 +- apps/acp-devtools/src/App.vue | 576 ++++++++++++++++- apps/acp-devtools/src/bridge-client.ts | 74 +++ apps/acp-devtools/src/demo-data.ts | 390 ++++++++++++ apps/acp-devtools/src/main.ts | 4 + apps/acp-devtools/src/styles.css | 578 ++++++++++++++++++ .../test/browser/environment.browser.spec.ts | 28 +- .../test/unit/environment.spec.ts | 75 ++- apps/acp-devtools/vite.config.ts | 7 + 10 files changed, 1735 insertions(+), 16 deletions(-) create mode 100644 apps/acp-devtools/index.html create mode 100644 apps/acp-devtools/src/bridge-client.ts create mode 100644 apps/acp-devtools/src/demo-data.ts create mode 100644 apps/acp-devtools/src/main.ts create mode 100644 apps/acp-devtools/src/styles.css create mode 100644 apps/acp-devtools/vite.config.ts diff --git a/apps/acp-devtools/index.html b/apps/acp-devtools/index.html new file mode 100644 index 0000000..1253235 --- /dev/null +++ b/apps/acp-devtools/index.html @@ -0,0 +1,16 @@ + + + + + + + Axis ACP DevTools + + +
    + + + diff --git a/apps/acp-devtools/package.json b/apps/acp-devtools/package.json index fa86160..37e6b27 100644 --- a/apps/acp-devtools/package.json +++ b/apps/acp-devtools/package.json @@ -4,7 +4,8 @@ "private": true, "type": "module", "scripts": { - "build": "pnpm type-check", + "dev": "vite", + "build": "vite build", "type-check": "vue-tsc --noEmit -p tsconfig.json" }, "dependencies": { diff --git a/apps/acp-devtools/src/App.vue b/apps/acp-devtools/src/App.vue index b817b89..66f646d 100644 --- a/apps/acp-devtools/src/App.vue +++ b/apps/acp-devtools/src/App.vue @@ -1,8 +1,578 @@ + + diff --git a/apps/acp-devtools/src/bridge-client.ts b/apps/acp-devtools/src/bridge-client.ts new file mode 100644 index 0000000..3c361b2 --- /dev/null +++ b/apps/acp-devtools/src/bridge-client.ts @@ -0,0 +1,74 @@ +import type { AxisAcpTranscript } from '@axis-ui/acp-core' + +export interface BridgeScenarioRequest { + readonly bridgeUrl: string + readonly token: string + readonly targetId: string + readonly scenarioId: string + readonly workspaceRoot: string + readonly timeoutMs?: number +} + +export interface BridgeScenarioReport { + readonly runId: string + readonly scenarioId: string + readonly status: 'passed' | 'failed' + readonly transcript: AxisAcpTranscript +} + +function parseLoopbackBridgeUrl(value: string): URL { + const url = new URL(value) + const loopbackHosts = new Set(['127.0.0.1', 'localhost', '[::1]']) + if (url.protocol !== 'ws:' || !loopbackHosts.has(url.hostname)) { + throw new Error('The DevTools bridge must use ws:// on loopback') + } + return url +} + +export function runBridgeScenario( + request: BridgeScenarioRequest +): Promise { + return new Promise((resolve, reject) => { + const url = parseLoopbackBridgeUrl(request.bridgeUrl) + url.searchParams.set('token', request.token) + const socket = new WebSocket(url) + const requestId = crypto.randomUUID() + const timeout = window.setTimeout(() => { + socket.close() + reject(new Error('Timed out waiting for the local bridge')) + }, request.timeoutMs ?? 125_000) + + const finish = (): void => window.clearTimeout(timeout) + socket.addEventListener('open', () => { + socket.send( + JSON.stringify({ + type: 'scenario/run', + requestId, + targetId: request.targetId, + scenarioId: request.scenarioId, + workspaceRoot: request.workspaceRoot, + }) + ) + }) + socket.addEventListener('message', event => { + const message = JSON.parse(String(event.data)) as { + type?: string + requestId?: string + result?: BridgeScenarioReport + error?: { message?: string } + } + if (message.requestId !== requestId) return + finish() + socket.close() + if (message.type === 'response' && message.result !== undefined) { + resolve(message.result) + } else { + reject(new Error(message.error?.message ?? 'Local bridge failed')) + } + }) + socket.addEventListener('error', () => { + finish() + reject(new Error('Could not connect to the authenticated local bridge')) + }) + }) +} diff --git a/apps/acp-devtools/src/demo-data.ts b/apps/acp-devtools/src/demo-data.ts new file mode 100644 index 0000000..a267d21 --- /dev/null +++ b/apps/acp-devtools/src/demo-data.ts @@ -0,0 +1,390 @@ +import { + createTranscript, + type AxisAcpEvent, + type AxisAcpTranscript, + type Diagnostic, + type ProtocolFrameKind, + type ProtocolTraceFrame, +} from '@axis-ui/acp-core' + +export interface DevToolsRun { + readonly id: string + readonly status: 'passed' | 'failed' + readonly source: 'sample' | 'bridge' | 'import' + readonly transcript: AxisAcpTranscript +} + +type ScenarioId = + | 'normal-prompt-turn' + | 'cancel-during-permission' + | 'capability-method-mismatch' + +const timestamp = '2026-08-20T04:00:00.000Z' + +function frame( + runId: string, + sequence: number, + input: { + kind: ProtocolFrameKind + direction: ProtocolTraceFrame['direction'] + method?: string + requestId?: number | null + payload: Record + } +): ProtocolTraceFrame { + const raw = JSON.stringify(input.payload) + return { + id: `${runId}:trace:${sequence}`, + runId, + connectionId: `${runId}:connection`, + sequence, + timestamp, + protocolVersion: 'v1', + direction: input.direction, + kind: input.kind, + raw, + byteLength: new TextEncoder().encode(raw).byteLength, + parsed: input.payload as ProtocolTraceFrame['parsed'], + method: input.method, + requestId: input.requestId, + } +} + +function eventBase(runId: string, sequence: number) { + return { + id: `${runId}:event:${sequence}`, + runId, + connectionId: `${runId}:connection`, + sessionId: `${runId}:session`, + sequence, + timestamp, + protocolVersion: 'v1' as const, + sourceTraceIds: [] as readonly string[], + } +} + +async function sampleTranscript( + scenarioId: ScenarioId +): Promise { + const runId = `sample-${scenarioId}` + const sessionId = `${runId}:session` + const rawFrames: ProtocolTraceFrame[] = [ + frame(runId, 1, { + kind: 'request', + direction: 'client-to-agent', + method: 'initialize', + requestId: 1, + payload: { + jsonrpc: '2.0', + id: 1, + method: 'initialize', + params: { protocolVersion: 1, clientCapabilities: {} }, + }, + }), + frame(runId, 2, { + kind: 'response', + direction: 'agent-to-client', + requestId: 1, + payload: { + jsonrpc: '2.0', + id: 1, + result: { + protocolVersion: 1, + agentInfo: { name: 'Axis deterministic fixture', version: '0.0.0' }, + agentCapabilities: { promptCapabilities: { image: false } }, + }, + }, + }), + frame(runId, 4, { + kind: 'request', + direction: 'client-to-agent', + method: 'session/new', + requestId: 2, + payload: { + jsonrpc: '2.0', + id: 2, + method: 'session/new', + params: { cwd: '[REDACTED]', mcpServers: [] }, + }, + }), + frame(runId, 5, { + kind: 'response', + direction: 'agent-to-client', + requestId: 2, + payload: { jsonrpc: '2.0', id: 2, result: { sessionId } }, + }), + frame(runId, 7, { + kind: 'request', + direction: 'client-to-agent', + method: 'session/prompt', + requestId: 3, + payload: { + jsonrpc: '2.0', + id: 3, + method: 'session/prompt', + params: { sessionId, prompt: '[REDACTED]' }, + }, + }), + ] + const events: AxisAcpEvent[] = [ + { + ...eventBase(runId, 3), + sessionId: undefined, + type: 'capability/snapshot', + agentInfo: { name: 'Axis deterministic fixture', version: '0.0.0' }, + agentCapabilities: { promptCapabilities: { image: false } }, + sourceTraceIds: [`${runId}:trace:1`, `${runId}:trace:2`], + }, + { + ...eventBase(runId, 6), + type: 'session/state-changed', + state: 'created', + sourceTraceIds: [`${runId}:trace:4`, `${runId}:trace:5`], + }, + { + ...eventBase(runId, 8), + type: 'session/state-changed', + state: 'prompting', + sourceTraceIds: [`${runId}:trace:7`], + }, + ] + const diagnostics: Diagnostic[] = [] + + if (scenarioId === 'normal-prompt-turn') { + rawFrames.push( + frame(runId, 9, { + kind: 'notification', + direction: 'agent-to-client', + method: 'session/update', + payload: { + jsonrpc: '2.0', + method: 'session/update', + params: { + sessionId, + update: { + sessionUpdate: 'agent_message_chunk', + content: { type: 'text', text: 'Ready.' }, + }, + }, + }, + }), + frame(runId, 11, { + kind: 'response', + direction: 'agent-to-client', + requestId: 3, + payload: { jsonrpc: '2.0', id: 3, result: { stopReason: 'end_turn' } }, + }) + ) + events.push( + { + ...eventBase(runId, 10), + type: 'message/chunk-appended', + messageId: 'message-1', + role: 'agent', + content: { type: 'text', text: 'Ready.' }, + sourceTraceIds: [`${runId}:trace:9`], + }, + { + ...eventBase(runId, 12), + type: 'session/state-changed', + state: 'completed', + stopReason: 'end_turn', + sourceTraceIds: [`${runId}:trace:7`, `${runId}:trace:11`], + } + ) + } else if (scenarioId === 'cancel-during-permission') { + rawFrames.push( + frame(runId, 9, { + kind: 'request', + direction: 'agent-to-client', + method: 'session/request_permission', + requestId: 4, + payload: { + jsonrpc: '2.0', + id: 4, + method: 'session/request_permission', + params: { + sessionId, + toolCall: { toolCallId: 'tool-1', title: 'Run tests' }, + options: [ + { + optionId: 'allow_once', + name: 'Allow once', + kind: 'allow_once', + }, + ], + }, + }, + }), + frame(runId, 12, { + kind: 'notification', + direction: 'client-to-agent', + method: 'session/cancel', + payload: { + jsonrpc: '2.0', + method: 'session/cancel', + params: { sessionId }, + }, + }), + frame(runId, 13, { + kind: 'response', + direction: 'client-to-agent', + requestId: 4, + payload: { + jsonrpc: '2.0', + id: 4, + result: { outcome: { outcome: 'cancelled' } }, + }, + }), + frame(runId, 16, { + kind: 'response', + direction: 'agent-to-client', + requestId: 3, + payload: { jsonrpc: '2.0', id: 3, result: { stopReason: 'cancelled' } }, + }) + ) + events.push( + { + ...eventBase(runId, 10), + type: 'permission/requested', + permissionId: `${runId}:trace:9`, + toolCall: { toolCallId: 'tool-1', title: 'Run tests' }, + options: [ + { optionId: 'allow_once', name: 'Allow once', kind: 'allow_once' }, + ], + sourceTraceIds: [`${runId}:trace:9`], + }, + { + ...eventBase(runId, 11), + type: 'session/state-changed', + state: 'cancelling', + }, + { + ...eventBase(runId, 14), + type: 'permission/resolved', + permissionId: `${runId}:trace:9`, + outcome: { outcome: 'cancelled' }, + sourceTraceIds: [`${runId}:trace:9`, `${runId}:trace:13`], + }, + { + ...eventBase(runId, 17), + type: 'session/state-changed', + state: 'cancelled', + stopReason: 'cancelled', + sourceTraceIds: [`${runId}:trace:7`, `${runId}:trace:16`], + } + ) + } else { + rawFrames.push( + frame(runId, 9, { + kind: 'request', + direction: 'agent-to-client', + method: 'terminal/create', + requestId: 4, + payload: { + jsonrpc: '2.0', + id: 4, + method: 'terminal/create', + params: { sessionId, command: 'echo' }, + }, + }), + frame(runId, 11, { + kind: 'response', + direction: 'agent-to-client', + requestId: 3, + payload: { jsonrpc: '2.0', id: 3, result: { stopReason: 'end_turn' } }, + }) + ) + events.push({ + ...eventBase(runId, 12), + type: 'session/state-changed', + state: 'completed', + stopReason: 'end_turn', + sourceTraceIds: [`${runId}:trace:7`, `${runId}:trace:11`], + }) + diagnostics.push({ + id: `${runId}:diagnostic:capability`, + kind: 'capability-contract-mismatch', + runId, + scenarioId, + invariantId: 'omitted-capability-is-unsupported', + severity: 'error', + subject: 'agent', + message: + 'Agent called terminal/create although the capability was omitted', + sequence: 9, + traceIds: [`${runId}:trace:9`], + stateSnapshotIds: [`${runId}:event:8:state:${sessionId}`], + faultInjectionIds: ['unsupported-terminal-request'], + references: [ + { + standard: 'ACP', + protocolVersion: 1, + section: 'Initialization / Client Capabilities', + url: 'https://agentclientprotocol.com/protocol/v1/initialization', + requirement: 'MUST', + }, + ], + }) + } + + return createTranscript({ + run: { + id: runId, + scenarioId, + startedAt: timestamp, + completedAt: '2026-08-20T04:00:01.000Z', + toolkitVersion: '0.0.0', + protocolVersion: 'v1', + }, + target: { + id: 'fixture-agent', + transport: 'stdio', + protocolVersion: 'v1', + args: [], + agentInfo: { name: 'Axis deterministic fixture', version: '0.0.0' }, + }, + clientProfile: { + id: + scenarioId === 'cancel-during-permission' + ? 'permission-only' + : 'minimal', + capabilities: {}, + allowedClientMethods: + scenarioId === 'cancel-during-permission' + ? ['session/update', 'session/request_permission'] + : ['session/update'], + }, + rawFrames, + events, + assertions: [ + { + id: 'session-status', + passed: true, + message: 'Expected terminal state observed', + }, + { + id: 'no-pending-permissions', + passed: true, + message: 'No pending permissions remain', + }, + ], + diagnostics, + }) +} + +export async function loadDemoRuns(): Promise { + const scenarioIds: readonly ScenarioId[] = [ + 'normal-prompt-turn', + 'cancel-during-permission', + 'capability-method-mismatch', + ] + return Promise.all( + scenarioIds.map(async scenarioId => ({ + id: `sample-${scenarioId}`, + status: 'passed' as const, + source: 'sample' as const, + transcript: await sampleTranscript(scenarioId), + })) + ) +} diff --git a/apps/acp-devtools/src/main.ts b/apps/acp-devtools/src/main.ts new file mode 100644 index 0000000..01433bc --- /dev/null +++ b/apps/acp-devtools/src/main.ts @@ -0,0 +1,4 @@ +import { createApp } from 'vue' +import App from './App.vue' + +createApp(App).mount('#app') diff --git a/apps/acp-devtools/src/styles.css b/apps/acp-devtools/src/styles.css new file mode 100644 index 0000000..ed3a966 --- /dev/null +++ b/apps/acp-devtools/src/styles.css @@ -0,0 +1,578 @@ +:root { + color-scheme: dark; + font-family: + Inter, + ui-sans-serif, + system-ui, + -apple-system, + sans-serif; + --bg: #080d18; + --surface: #0f172a; + --surface-hover: #1b2942; + --border: #334155; + --border-strong: #475569; + --text: #f8fafc; + --text-muted: #a8b4c7; + --primary: #60a5fa; + --accent: #4ade80; + --warning: #fbbf24; + --danger: #f87171; + --focus: #93c5fd; + background: var(--bg); + color: var(--text); +} + +* { + box-sizing: border-box; +} +html { + min-width: 320px; + background: var(--bg); +} +body { + margin: 0; + min-width: 320px; + min-height: 100vh; + background: radial-gradient(circle at 50% -20%, #172554 0, var(--bg) 42%); +} +button, +input, +select { + font: inherit; +} +button { + cursor: pointer; +} +button:focus-visible, +input:focus-visible, +select:focus-visible, +[tabindex]:focus-visible { + outline: 3px solid var(--focus); + outline-offset: 2px; +} + +.devtools { + min-height: 100vh; + padding: 20px; +} +.skip-link { + position: fixed; + left: 16px; + top: -60px; + z-index: 1000; + padding: 10px 14px; + border-radius: 8px; + background: var(--text); + color: var(--bg); +} +.skip-link:focus { + top: 12px; +} +.topbar { + display: flex; + align-items: center; + justify-content: space-between; + gap: 24px; + max-width: 1600px; + margin: 0 auto 16px; +} +.brand-lockup, +.topbar-actions, +.panel-heading, +.lane-legend, +.connection { + display: flex; + align-items: center; +} +.brand-lockup { + gap: 12px; +} +.brand-mark { + width: 38px; + height: 38px; + fill: var(--primary); + filter: drop-shadow(0 0 12px rgb(96 165 250 / 35%)); +} +h1, +h2, +h3, +p { + margin-top: 0; +} +h1 { + margin-bottom: 0; + font-size: clamp(20px, 3vw, 28px); + letter-spacing: -0.03em; +} +h2 { + margin-bottom: 0; + font-size: 16px; +} +h3 { + margin-bottom: 8px; + color: var(--text-muted); + font-size: 12px; + letter-spacing: 0.06em; + text-transform: uppercase; +} +.eyebrow { + margin-bottom: 3px; + color: var(--primary); + font: + 600 10px/1.4 ui-monospace, + monospace; + letter-spacing: 0.12em; + text-transform: uppercase; +} +.topbar-actions { + flex-wrap: wrap; + justify-content: flex-end; + gap: 8px; +} +.connection { + min-height: 36px; + gap: 8px; + padding: 0 10px; + border: 1px solid var(--border); + border-radius: 999px; + color: var(--text-muted); + font-size: 12px; +} +.status-dot { + width: 8px; + height: 8px; + border-radius: 50%; + background: var(--warning); +} +.connection.online .status-dot { + background: var(--accent); + box-shadow: 0 0 9px rgb(74 222 128 / 60%); +} +.visually-hidden { + position: absolute !important; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border: 0; +} + +.metric-strip { + display: grid; + grid-template-columns: repeat(5, minmax(0, 1fr)); + max-width: 1600px; + margin: 0 auto 16px; + border: 1px solid var(--border); + border-radius: 12px; + background: rgb(15 23 42 / 88%); + overflow: hidden; +} +.metric { + min-width: 0; + padding: 12px 16px; + border-right: 1px solid var(--border); +} +.metric:last-child { + border-right: 0; +} +.metric span { + display: block; + margin-bottom: 3px; + color: var(--text-muted); + font-size: 11px; +} +.metric strong { + font: + 650 18px/1.3 ui-monospace, + monospace; + text-transform: capitalize; +} +.loading-state { + max-width: 1600px; + margin: 0 auto; + padding: 48px; + border: 1px solid var(--border); + border-radius: 12px; + background: var(--surface); + text-align: center; +} + +.workspace-grid { + display: grid; + grid-template-columns: minmax(250px, 0.8fr) minmax(460px, 1.55fr) minmax( + 300px, + 1fr + ); + align-items: start; + gap: 12px; + max-width: 1600px; + margin: 0 auto; +} +.left-rail, +.right-rail { + display: grid; + gap: 12px; +} +.panel { + min-width: 0; + border: 1px solid var(--border); + border-radius: 12px; + background: rgb(15 23 42 / 94%); + box-shadow: 0 18px 50px rgb(0 0 0 / 18%); + overflow: hidden; +} +.panel-heading { + justify-content: space-between; + gap: 12px; + min-height: 60px; + padding: 12px 14px; + border-bottom: 1px solid var(--border); +} +.panel-heading p { + margin-bottom: 2px; +} +.mode-badge, +.sequence-readout { + padding: 4px 7px; + border: 1px solid var(--border-strong); + border-radius: 5px; + color: var(--text-muted); + font: + 600 10px/1.3 ui-monospace, + monospace; +} + +.launch-form { + display: grid; + gap: 12px; + padding: 14px; +} +.field { + display: grid; + gap: 6px; +} +.field label, +.search-label { + color: var(--text-muted); + font-size: 12px; + font-weight: 600; +} +.field select { + width: 100%; + min-height: 44px; + padding: 0 10px; + border: 1px solid var(--border-strong); + border-radius: 6px; + background: #0b1220; + color: var(--text); +} +.launch-form .ax-input__inner { + min-height: 44px; + color: var(--text); + background: #0b1220; +} +.launch-form .ax-button { + min-height: 44px; + width: 100%; +} +.helper, +.status-message, +.error-message { + margin: 0; + padding: 0 14px 14px; + color: var(--text-muted); + font-size: 12px; + line-height: 1.5; +} +.error-message { + color: #fecaca; +} +.status-message { + color: #bfdbfe; +} + +.run-list { + display: grid; + gap: 6px; + padding: 8px; +} +.run-card { + display: grid; + grid-template-columns: auto 1fr; + gap: 4px 8px; + min-height: 58px; + padding: 9px; + border: 1px solid transparent; + border-radius: 8px; + background: transparent; + color: var(--text); + text-align: left; + transition: + background-color 180ms ease, + border-color 180ms ease; +} +.run-card:hover { + background: var(--surface-hover); +} +.run-card.selected { + border-color: var(--primary); + background: rgb(37 99 235 / 14%); +} +.run-card strong { + min-width: 0; + overflow: hidden; + font: + 600 12px/1.4 ui-monospace, + monospace; + text-overflow: ellipsis; +} +.run-card small { + grid-column: 2; + color: var(--text-muted); +} +.run-status { + align-self: start; + padding: 2px 5px; + border-radius: 4px; + color: #bbf7d0; + background: #14532d; + font: + 700 9px/1.4 ui-monospace, + monospace; + text-transform: uppercase; +} +.run-status.failed { + color: #fecaca; + background: #7f1d1d; +} + +.timeline-panel { + padding-bottom: 12px; +} +.timeline-heading { + border-bottom: 0; +} +.timeline-panel > .ax-input { + margin: 0 12px 8px; + width: calc(100% - 24px); +} +.timeline-panel .ax-input__inner { + min-height: 40px; + color: var(--text); + background: #0b1220; +} +.search-label { + display: block; + margin: 0 12px 6px; +} +.lane-legend { + gap: 16px; + min-height: 32px; + padding: 0 14px; + border-bottom: 1px solid var(--border); + color: var(--text-muted); + font-size: 11px; +} +.lane-legend span { + display: inline-flex; + align-items: center; + gap: 6px; +} +.lane-dot { + width: 8px; + height: 8px; + border-radius: 2px; +} +.lane-dot.wire { + background: var(--primary); +} +.lane-dot.event { + background: var(--accent); +} +.timeline-list { + width: 100%; +} +.timeline-row { + display: grid; + grid-template-columns: 52px 52px minmax(0, 1fr); + align-items: center; + width: 100%; + height: 48px; + padding: 0 12px; + border: 0; + border-left: 3px solid transparent; + border-bottom: 1px solid rgb(51 65 85 / 65%); + background: transparent; + color: var(--text); + text-align: left; + transition: background-color 160ms ease; +} +.timeline-row:hover { + background: var(--surface-hover); +} +.timeline-row.selected { + background: rgb(37 99 235 / 16%); +} +.timeline-row.lane-wire { + border-left-color: var(--primary); +} +.timeline-row.lane-event { + border-left-color: var(--accent); +} +.sequence, +.lane { + color: var(--text-muted); + font: + 600 10px/1.3 ui-monospace, + monospace; + text-transform: uppercase; +} +.row-summary { + display: grid; + min-width: 0; +} +.row-summary strong, +.row-summary small { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.row-summary strong { + font: + 550 12px/1.4 ui-monospace, + monospace; +} +.row-summary small { + color: var(--text-muted); + font-size: 10px; +} +.empty-state, +.empty-copy { + padding: 18px; + color: var(--text-muted); + font-size: 12px; + text-align: center; +} + +.inspector-section { + padding: 12px; + border-bottom: 1px solid var(--border); +} +pre { + max-height: 220px; + margin: 0; + padding: 12px; + overflow: auto; + border: 1px solid #24324a; + border-radius: 7px; + background: #050914; + color: #dbeafe; + font: + 11px/1.55 ui-monospace, + monospace; + white-space: pre-wrap; + overflow-wrap: anywhere; +} +.capability-panel .ax-tree { + padding: 8px; +} +.capability-panel .ax-vl { + width: 100%; +} +.diagnostic-card { + display: grid; + gap: 5px; + width: calc(100% - 16px); + min-height: 88px; + margin: 8px; + padding: 10px; + border: 1px solid #7f1d1d; + border-radius: 8px; + background: rgb(127 29 29 / 16%); + color: var(--text); + text-align: left; +} +.diagnostic-card:hover { + background: rgb(127 29 29 / 28%); +} +.diagnostic-card strong { + color: #fecaca; + font: + 600 11px/1.4 ui-monospace, + monospace; +} +.diagnostic-card span, +.diagnostic-card small { + font-size: 11px; + line-height: 1.4; +} +.diagnostic-meta { + color: var(--danger); + text-transform: uppercase; +} +footer { + display: flex; + justify-content: space-between; + gap: 16px; + max-width: 1600px; + margin: 14px auto 0; + color: var(--text-muted); + font-size: 11px; +} + +@media (max-width: 1180px) { + .workspace-grid { + grid-template-columns: 280px minmax(0, 1fr); + } + .right-rail { + grid-column: 1 / -1; + grid-template-columns: repeat(3, minmax(0, 1fr)); + } +} +@media (max-width: 760px) { + .devtools { + padding: 12px; + } + .topbar { + align-items: flex-start; + flex-direction: column; + } + .topbar-actions { + justify-content: flex-start; + } + .metric-strip { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + .metric { + border-bottom: 1px solid var(--border); + } + .workspace-grid { + grid-template-columns: minmax(0, 1fr); + } + .right-rail { + grid-column: auto; + grid-template-columns: minmax(0, 1fr); + } + .timeline-row { + grid-template-columns: 44px 46px minmax(0, 1fr); + } + .topbar-actions .ax-button { + min-height: 44px; + } + footer { + flex-direction: column; + } +} +@media (prefers-reduced-motion: reduce) { + *, + *::before, + *::after { + scroll-behavior: auto !important; + transition-duration: 0.01ms !important; + animation-duration: 0.01ms !important; + animation-iteration-count: 1 !important; + } +} diff --git a/apps/acp-devtools/test/browser/environment.browser.spec.ts b/apps/acp-devtools/test/browser/environment.browser.spec.ts index 1e09f1c..66e971b 100644 --- a/apps/acp-devtools/test/browser/environment.browser.spec.ts +++ b/apps/acp-devtools/test/browser/environment.browser.spec.ts @@ -1,13 +1,27 @@ -import { mount } from '@vue/test-utils' -import { describe, expect, it } from 'vitest' +import { flushPromises, mount } from '@vue/test-utils' +import { describe, expect, it, vi } from 'vitest' import App from '../../src/App.vue' -describe('ACP DevTools browser project boundary', () => { - it('runs the Vue skeleton in a real browser project', () => { - const wrapper = mount(App) +describe('ACP DevTools real browser boundary', () => { + it('mounts the responsive timeline and replay inspector in Chromium', async () => { + const wrapper = mount(App, { attachTo: document.body }) + await flushPromises() + await vi.waitFor(() => + expect(wrapper.findAll('.timeline-row').length).toBeGreaterThan(0) + ) - expect(wrapper.get('[data-gate="01"]').text()).toContain( - 'no ACP runtime is implemented' + expect(wrapper.get('h1').text()).toBe('Axis Protocol Workbench') + expect(wrapper.findAll('.timeline-row').length).toBeGreaterThan(0) + await wrapper.findAll('.timeline-row').at(-1)?.trigger('click') + await wrapper.vm.$nextTick() + expect(wrapper.get('[data-testid="state-json"]').text()).toContain( + 'session' ) + expect( + Number.parseFloat( + getComputedStyle(wrapper.get('.devtools').element).minHeight + ) + ).toBeGreaterThanOrEqual(window.innerHeight) + wrapper.unmount() }) }) diff --git a/apps/acp-devtools/test/unit/environment.spec.ts b/apps/acp-devtools/test/unit/environment.spec.ts index a3e4d5c..8b6d690 100644 --- a/apps/acp-devtools/test/unit/environment.spec.ts +++ b/apps/acp-devtools/test/unit/environment.spec.ts @@ -1,11 +1,76 @@ -import { mount } from '@vue/test-utils' -import { describe, expect, it } from 'vitest' +import { flushPromises, mount } from '@vue/test-utils' +import { describe, expect, it, vi } from 'vitest' import App from '../../src/App.vue' +import { runBridgeScenario } from '../../src/bridge-client.js' -describe('ACP DevTools happy-dom project boundary', () => { - it('type-checks and mounts the Vue skeleton separately from Node packages', () => { +describe('ACP DevTools workbench', () => { + it('renders three scenario artifacts with real Axis-UI components', async () => { const wrapper = mount(App) + await flushPromises() + await vi.waitFor(() => expect(wrapper.findAll('.run-card')).toHaveLength(3)) - expect(wrapper.attributes('data-gate')).toBe('01') + expect( + wrapper + .get('[data-product="axis-acp-devtools"]') + .attributes('data-product') + ).toBe('axis-acp-devtools') + expect( + wrapper + .findAll('[data-scenario]') + .map(node => node.attributes('data-scenario')) + ).toEqual([ + 'normal-prompt-turn', + 'cancel-during-permission', + 'capability-method-mismatch', + ]) + expect(wrapper.find('.ax-form').exists()).toBe(true) + expect(wrapper.find('.ax-vl').exists()).toBe(true) + expect(wrapper.find('.ax-tree').exists()).toBe(true) + }) + + it('maps a diagnostic sequence to a generic virtual-list index', async () => { + const wrapper = mount(App) + await flushPromises() + await vi.waitFor(() => expect(wrapper.findAll('.run-card')).toHaveLength(3)) + await wrapper + .get('[data-scenario="capability-method-mismatch"]') + .trigger('click') + await wrapper.vm.$nextTick() + + expect(wrapper.get('.diagnostic-card').text()).toContain( + 'omitted-capability-is-unsupported' + ) + await wrapper.get('.diagnostic-card').trigger('click') + await wrapper.vm.$nextTick() + + expect(wrapper.get('.sequence-readout').text()).toBe('SEQ 9') + expect(wrapper.get('[data-testid="raw-json"]').text()).toContain( + 'terminal/create' + ) + }) + + it('converges the real agent launcher to its supported scenario', async () => { + const wrapper = mount(App) + await flushPromises() + + await wrapper.get('#scenario-select').setValue('cancel-during-permission') + await wrapper.get('#target-select').setValue('opencode') + await wrapper.vm.$nextTick() + + expect( + (wrapper.get('#scenario-select').element as HTMLSelectElement).value + ).toBe('normal-prompt-turn') + }) + + it('refuses a non-loopback bridge URL before opening a socket', async () => { + await expect( + runBridgeScenario({ + bridgeUrl: 'wss://remote.example/collect', + token: 'not-a-real-token', + targetId: 'fixture-agent', + scenarioId: 'normal-prompt-turn', + workspaceRoot: '/private/workspace', + }) + ).rejects.toThrow('must use ws:// on loopback') }) }) diff --git a/apps/acp-devtools/vite.config.ts b/apps/acp-devtools/vite.config.ts new file mode 100644 index 0000000..e021223 --- /dev/null +++ b/apps/acp-devtools/vite.config.ts @@ -0,0 +1,7 @@ +import vue from '@vitejs/plugin-vue' +import { defineConfig } from 'vite' + +export default defineConfig({ + plugins: [vue()], + server: { host: '127.0.0.1', port: 5173, strictPort: true }, +}) From 85aafecec7c7cabf7ec615522d20a4595f563932 Mon Sep 17 00:00:00 2001 From: CalvinWade Date: Mon, 22 Jun 2026 09:49:00 +0800 Subject: [PATCH 20/20] docs: add ACP DevKit demo and usage guide --- README.md | 40 +++++++++++++++++++++++ docs/public/demos/axis-acp-devtools.webm | Bin 0 -> 604670 bytes 2 files changed, 40 insertions(+) create mode 100644 docs/public/demos/axis-acp-devtools.webm diff --git a/README.md b/README.md index ca32b12..48067df 100644 --- a/README.md +++ b/README.md @@ -23,6 +23,46 @@ - 🏗️ **工程化规范**: 采用 Monorepo 架构,使用 Changesets 管理版本 - 🧪 **质量保障**: 完善的测试流程(单元测试 + 冒烟测试) +## Axis ACP DevKit(私有工作区) + +仓库同时包含一套面向 Coding Agent 开发者的 ACP v1 测试与调试工具链。它不会随 `axis-ui` 发布,核心能力可在无浏览器环境运行:安全启动已注册的 stdio Agent、记录 Raw JSON-RPC 与归一化事件、执行三个固定场景、生成诊断与单次 JSON/HTML 报告,并从脱敏 Transcript 离线恢复状态。 + +```bash +# 构建全部工作区 +pnpm build:all + +# 确定性场景 + JSON/HTML 证据 +node packages/acp-cli/dist/main.js run \ + --target fixture-agent \ + --scenario cancel-during-permission \ + --workspace . \ + --output artifacts/runs + +# 离线回放并校验 State Hash +node packages/acp-cli/dist/main.js replay \ + --input artifacts/runs/fixture-agent-cancel-during-permission.axis-acp.json + +# 检查本机已安装的真实 OpenCode ACP Agent +node packages/acp-cli/dist/main.js inspect --target opencode --workspace . +``` + +启动可视化 Workbench 时,Node Host 与浏览器分开运行。`serve` 只绑定 loopback,使用高熵临时 Token 和 Origin 校验;浏览器只能发送已注册的 Target ID、固定 Scenario ID 与 Workspace,不能提交可执行命令或参数。 + +```bash +# 终端 1:复制输出的 ws URL 与 Token +node packages/acp-cli/dist/main.js serve --origin http://127.0.0.1:5173 + +# 终端 2 +pnpm --filter @axis-ui/acp-devtools dev + +# 打开: +# http://127.0.0.1:5173/?bridge=&token=&workspace= +``` + +范围边界:当前只支持 ACP v1、stdio、三个固定 Scenario 和单次报告;结果是 Axis 场景集内的工程证据,不是 ACP 官方认证,也不评价模型代码质量。 + +录制的本地闭环演示:[`docs/public/demos/axis-acp-devtools.webm`](./docs/public/demos/axis-acp-devtools.webm)。视频展示鉴权 Bridge 场景运行、Run Evidence 切换和 Diagnostic→Sequence 跳转,不包含 Token 或地址栏。 + ## 📦 安装 ```bash diff --git a/docs/public/demos/axis-acp-devtools.webm b/docs/public/demos/axis-acp-devtools.webm new file mode 100644 index 0000000000000000000000000000000000000000..3db91acbba99dff1be652a3b5d715b60d4d562c3 GIT binary patch literal 604670 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

    -bgjSP%#W95n`u>QOJY3<2C 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

    @I)Ym$-IE>|@ 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

    a1GBb)uYOm`M~(Q8 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 z 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ᦶ?saHi;Nc#81ZBhlpao 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

    0P7JkR`1R&FKFow#_;NTzxZTxR84Q}K=UpAac& zSnsh_F)6~aD3HsOW=j1&1B`Ga4_!e8=ho14?QI~+Jb`c=0h2sIwF|5DQ!;7cBk`s| zsQ=hP!~pbybmxs=_JF$+9DjeI{YzAn%eu6jJ2dyZ``gnhHLn#7d&H2n@4wLYgUqg& z2N47uU$}|%%;?_+lPEB z%(-b}$--gHnmo5lUW;l<@A?ojBf2(Ph6jMtFddaIntPNlTL>8i(Q{Y$)U4JhQjiGy zN>P#8F7SIXtUfJEdyck1h1s98b&D^^<{#0@B#6wdM?5L@qq0BUXMeCsE93rdCxgFp zmubX`9aHE~SVCvErX?d5M+B}oFkeM`S{cf%Y4(__PkiCu^OUd(3k=GeE~Ft(;i85D zZgpU0z@$6x#S?PToU7e5>)bo7g(RcB4t5^c3|=$krK;@$q8bljl6Mmp_Kf;-=Pk&) z3L(*0?%j|D@SS6W9?*3wJ%e)H**Qo*+!aed@)m2=e&2PsYdUew7n>Z_Wx&YW(?PuH zfpSAOpWftp`{t_#nxh%13kIIAansqkmY3JW!?qD?oUd@IooyR`QMQY&#z*$|&~4q6 z#cVae1-WGqTRVR#8n@$TE9aOM@!>fte3f&EZDDjM8Z_N7iJI-^L4%SiMppoh3|f6V zTt@9Ktc;D{($fS@I)|=jKS_Jx#A+twc4l4G^FU{C8DpP;W7M$z28*>1Bp5Z3bcmC! ztad1#8!%QNuY?d9KMjxl*Q@v}w}t+XExJi6Nq-{qH+OD(Hg5Wb*hJ2?365y*QpUEN#Fd8Hd1;hi^kTvXhAmlgG(Pfxe*+%aEKLfO;Bn%%k z^Dt9Pm5*^{xHphIKEq3);I1hg)pBNWGRxE}HNsPZbH~LsP8wQfiBQ(FI=Jc*55H$J zle@do^WpF`#~MXib=Ce}B2Fjy3|KIe!h=RTXL>%9&mgOS3c#S)O9uOHkA=kb~EXDVSg@WoHvH0C1 wmWlhp!emtMo>L!J1;eR{K84}#!*PrEU=QmPs^DTcH8FQ1;RN$(doaBJ0i~~#x&QzG literal 0 HcmV?d00001