@1agh/maude 1.0.11 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/apps/studio/acp/bridge.ts +18 -13
- package/apps/studio/acp/transcript-io.ts +394 -0
- package/apps/studio/acp/transcript.ts +103 -38
- package/apps/studio/api.ts +139 -26
- package/apps/studio/bin/_import-figma.mjs +57 -11
- package/apps/studio/bin/_seed-fixture.mjs +163 -0
- package/apps/studio/canvas-imports.ts +89 -0
- package/apps/studio/client/app.jsx +257 -7
- package/apps/studio/client/export-center.jsx +15 -7
- package/apps/studio/client/panels/SyncPanel.jsx +125 -4
- package/apps/studio/client/report-bug.jsx +19 -1
- package/apps/studio/client/styles/3-shell-maude.css +34 -0
- package/apps/studio/client/styles/4-components.css +26 -0
- package/apps/studio/collab/persistence.ts +132 -16
- package/apps/studio/collab/registry.ts +10 -18
- package/apps/studio/debug-bundle.ts +13 -0
- package/apps/studio/dist/client.bundle.js +1128 -1128
- package/apps/studio/dist/styles.css +1 -1
- package/apps/studio/export-dialog.tsx +54 -0
- package/apps/studio/exporters/degraded.ts +19 -3
- package/apps/studio/exporters/ghostscript.ts +194 -0
- package/apps/studio/exporters/pdf-fonts.ts +261 -0
- package/apps/studio/exporters/pdf.ts +152 -3
- package/apps/studio/exporters/remote.ts +36 -1
- package/apps/studio/fs-watch.ts +45 -1
- package/apps/studio/http.ts +7 -1
- package/apps/studio/mem.ts +45 -9
- package/apps/studio/server.ts +11 -4
- package/apps/studio/sync/agent.ts +136 -29
- package/apps/studio/sync/asset-push.ts +1 -47
- package/apps/studio/sync/codec.ts +122 -31
- package/apps/studio/sync/cold-start-apply.ts +7 -0
- package/apps/studio/sync/cold-start.ts +118 -22
- package/apps/studio/sync/comment-identity.ts +68 -0
- package/apps/studio/sync/connection-state.ts +15 -1
- package/apps/studio/sync/file-ledger.ts +117 -0
- package/apps/studio/sync/file-plane.ts +623 -27
- package/apps/studio/sync/index.ts +711 -20
- package/apps/studio/sync/journal-client.ts +13 -1
- package/apps/studio/sync/migrate-seed.ts +40 -3
- package/apps/studio/sync/presentation.ts +26 -3
- package/apps/studio/sync/retry-after.ts +169 -0
- package/apps/studio/sync/seed-progress.ts +218 -0
- package/apps/studio/sync/status.ts +122 -5
- package/apps/studio/sync/transport-error.ts +111 -0
- package/apps/studio/whats-new.json +72 -0
- package/cli/bin/maude.mjs +2 -0
- package/cli/commands/codex.mjs +191 -0
- package/cli/commands/harness.mjs +1051 -0
- package/cli/commands/help.mjs +13 -0
- package/cli/lib/design-link.mjs +190 -2
- package/cli/lib/harness/capabilities.mjs +302 -0
- package/cli/lib/harness/codex-runtime.mjs +889 -0
- package/cli/lib/harness/compatibility.mjs +27 -0
- package/cli/lib/harness/discover-claude.mjs +1393 -0
- package/cli/lib/harness/managed-state.mjs +1296 -0
- package/cli/lib/harness/model.mjs +86 -0
- package/cli/lib/harness/secrets.mjs +390 -0
- package/cli/lib/harness/targets/codex.mjs +1141 -0
- package/cli/lib/harness/targets/opencode.mjs +807 -0
- package/cli/lib/harness/transaction.mjs +1099 -0
- package/cli/lib/hubs-config.mjs +35 -8
- package/cli/templates/harness/opencode/maude-projector.ts +58 -0
- package/docs/harness-capability-matrix.md +125 -0
- package/docs/harness-environment-projection.md +95 -0
- package/package.json +32 -9
- package/plugins/flow/.claude-plugin/config.schema.json +8 -0
- package/apps/studio/.ai/cache/_stats.json +0 -7
- package/apps/studio/bin/_agent-browser-safe.test.mjs +0 -165
- package/apps/studio/bin/_curl-local.test.mjs +0 -280
- package/apps/studio/bin/_pw-launch.test.mjs +0 -90
- package/apps/studio/bin/_smart-frames.test.mjs +0 -195
- package/apps/studio/bin/_transcribe.test.mjs +0 -80
- package/apps/studio/bun.lock +0 -928
- package/apps/studio/draw/test/animate.test.ts +0 -172
- package/apps/studio/draw/test/brush.test.ts +0 -213
- package/apps/studio/draw/test/composition.test.ts +0 -141
- package/apps/studio/draw/test/geometry.test.ts +0 -199
- package/apps/studio/draw/test/gradient.test.ts +0 -167
- package/apps/studio/draw/test/layout.test.ts +0 -120
- package/apps/studio/draw/test/morph.test.ts +0 -107
- package/apps/studio/draw/test/optimize.test.ts +0 -40
- package/apps/studio/draw/test/palette.test.ts +0 -123
- package/apps/studio/draw/test/primitives.test.ts +0 -129
- package/apps/studio/draw/test/serialize-animate.test.ts +0 -142
- package/apps/studio/draw/test/serialize.test.ts +0 -105
- package/apps/studio/figma/assets.test.ts +0 -464
- package/apps/studio/figma/client.test.ts +0 -395
- package/apps/studio/figma/codegen-client.test.ts +0 -276
- package/apps/studio/figma/codegen-fonts.test.ts +0 -103
- package/apps/studio/figma/codegen-values.test.ts +0 -179
- package/apps/studio/figma/comments-to-strokes.test.ts +0 -194
- package/apps/studio/figma/fig-decode.test.ts +0 -788
- package/apps/studio/figma/fig-differential.test.ts +0 -182
- package/apps/studio/figma/fig-translator.test.ts +0 -192
- package/apps/studio/figma/fig-vector.test.ts +0 -113
- package/apps/studio/figma/from-codegen.test.ts +0 -408
- package/apps/studio/figma/sanitize.test.ts +0 -325
- package/apps/studio/figma/tailwind-map.test.ts +0 -142
- package/apps/studio/figma/to-artboard.test.ts +0 -808
- package/apps/studio/figma/to-render.test.ts +0 -180
- package/apps/studio/figma/to-strokes-roundtrip.test.ts +0 -152
- package/apps/studio/figma/to-strokes.test.ts +0 -705
- package/apps/studio/figma/to-tokens.test.ts +0 -321
- package/apps/studio/figma/url.test.ts +0 -167
- package/apps/studio/footage/schema.test.ts +0 -287
- package/apps/studio/generation/adapters/groq.test.ts +0 -80
- package/apps/studio/generation/audio-library.test.ts +0 -95
- package/apps/studio/generation/captions.test.ts +0 -78
- package/apps/studio/generation/elevenlabs.test.ts +0 -223
- package/apps/studio/generation/gemini.test.ts +0 -350
- package/apps/studio/generation/jobs.test.ts +0 -128
- package/apps/studio/generation/keys.test.ts +0 -75
- package/apps/studio/generation/prefs.test.ts +0 -95
- package/apps/studio/generation/types.test.ts +0 -123
- package/apps/studio/generation/whisper-models.test.ts +0 -179
- package/apps/studio/test/_helpers.ts +0 -108
- package/apps/studio/test/acp-activity-endpoint.test.ts +0 -183
- package/apps/studio/test/acp-activity.test.ts +0 -154
- package/apps/studio/test/acp-ai-activity.test.ts +0 -182
- package/apps/studio/test/acp-attachment-serve.test.ts +0 -74
- package/apps/studio/test/acp-bootstrap-brief.test.ts +0 -178
- package/apps/studio/test/acp-branch-guard.test.ts +0 -123
- package/apps/studio/test/acp-bridge-lifetime.test.ts +0 -475
- package/apps/studio/test/acp-bridge.test.ts +0 -545
- package/apps/studio/test/acp-capabilities.test.ts +0 -123
- package/apps/studio/test/acp-caps-bridge.test.ts +0 -279
- package/apps/studio/test/acp-commands.test.ts +0 -119
- package/apps/studio/test/acp-elicitation-bridge.test.ts +0 -480
- package/apps/studio/test/acp-elicitation.test.ts +0 -251
- package/apps/studio/test/acp-env.test.ts +0 -95
- package/apps/studio/test/acp-mode-banner.test.ts +0 -45
- package/apps/studio/test/acp-origin-gate.test.ts +0 -160
- package/apps/studio/test/acp-permission-prompt.test.ts +0 -251
- package/apps/studio/test/acp-permission.test.ts +0 -278
- package/apps/studio/test/acp-plugin-bootstrap.test.ts +0 -89
- package/apps/studio/test/acp-session-allowed-tools.test.ts +0 -235
- package/apps/studio/test/acp-session-plugins.test.ts +0 -209
- package/apps/studio/test/acp-toolgroup.test.ts +0 -76
- package/apps/studio/test/acp-transcript-view.test.ts +0 -71
- package/apps/studio/test/acp-transcript.test.ts +0 -238
- package/apps/studio/test/acp-usage-bridge.test.ts +0 -141
- package/apps/studio/test/acp-usage.test.ts +0 -143
- package/apps/studio/test/acp-write-gate.test.ts +0 -323
- package/apps/studio/test/acp-write-scope.test.ts +0 -533
- package/apps/studio/test/active-state.test.ts +0 -186
- package/apps/studio/test/activity.test.ts +0 -189
- package/apps/studio/test/ai-activity.test.ts +0 -113
- package/apps/studio/test/annotate-write.test.ts +0 -1074
- package/apps/studio/test/annotation-strokes-command.test.ts +0 -166
- package/apps/studio/test/annotations-align.test.ts +0 -88
- package/apps/studio/test/annotations-api.test.ts +0 -145
- package/apps/studio/test/annotations-bindings.test.ts +0 -262
- package/apps/studio/test/annotations-draw-modifiers.test.ts +0 -206
- package/apps/studio/test/annotations-groups.test.ts +0 -231
- package/apps/studio/test/annotations-layer.test.ts +0 -1011
- package/apps/studio/test/annotations-roundtrip.test.ts +0 -663
- package/apps/studio/test/annotations-snap.test.ts +0 -135
- package/apps/studio/test/annotations-text-format.test.ts +0 -396
- package/apps/studio/test/artboard-activity-overlay.test.tsx +0 -56
- package/apps/studio/test/artboard-guides-overlay.test.tsx +0 -152
- package/apps/studio/test/artboard-hug-commit.test.ts +0 -36
- package/apps/studio/test/artboard-kinds.test.tsx +0 -83
- package/apps/studio/test/artboard-selection-attrs.test.ts +0 -69
- package/apps/studio/test/asset-api.test.ts +0 -149
- package/apps/studio/test/assets-s3.test.ts +0 -249
- package/apps/studio/test/binary-smoke.test.ts +0 -47
- package/apps/studio/test/boot-self-heal.test.ts +0 -87
- package/apps/studio/test/browse-posture.test.tsx +0 -107
- package/apps/studio/test/bundle-smoke.test.ts +0 -46
- package/apps/studio/test/camera-reveal.test.tsx +0 -173
- package/apps/studio/test/canvas-artifacts.test.ts +0 -125
- package/apps/studio/test/canvas-build-sandbox.test.ts +0 -69
- package/apps/studio/test/canvas-build.test.ts +0 -141
- package/apps/studio/test/canvas-create-api.test.ts +0 -676
- package/apps/studio/test/canvas-cursors.test.ts +0 -164
- package/apps/studio/test/canvas-edit.test.ts +0 -470
- package/apps/studio/test/canvas-freshness-deps.test.ts +0 -64
- package/apps/studio/test/canvas-header.test.ts +0 -127
- package/apps/studio/test/canvas-hide-chrome.test.ts +0 -88
- package/apps/studio/test/canvas-hmr-runtime.test.tsx +0 -114
- package/apps/studio/test/canvas-lib-inline.test.ts +0 -146
- package/apps/studio/test/canvas-lib-motion.test.ts +0 -131
- package/apps/studio/test/canvas-lib-resolver.test.ts +0 -111
- package/apps/studio/test/canvas-list-watch.test.ts +0 -388
- package/apps/studio/test/canvas-media-drop.test.ts +0 -187
- package/apps/studio/test/canvas-meta-api.test.ts +0 -707
- package/apps/studio/test/canvas-move-api.test.ts +0 -587
- package/apps/studio/test/canvas-origin-gate.test.ts +0 -417
- package/apps/studio/test/canvas-pipeline.test.ts +0 -180
- package/apps/studio/test/canvas-rects.test.ts +0 -198
- package/apps/studio/test/canvas-reorder.test.ts +0 -211
- package/apps/studio/test/canvas-route.test.ts +0 -179
- package/apps/studio/test/canvas-shell-base.test.ts +0 -107
- package/apps/studio/test/canvas-shell-build-error.test.ts +0 -52
- package/apps/studio/test/canvas-url.test.ts +0 -138
- package/apps/studio/test/canvas-wheel-delta.test.ts +0 -42
- package/apps/studio/test/canvas-zoom-floor.test.ts +0 -73
- package/apps/studio/test/capture-core.test.ts +0 -32
- package/apps/studio/test/capture-determinism-shape.test.ts +0 -135
- package/apps/studio/test/chat-attachments.test.ts +0 -117
- package/apps/studio/test/chat-context.test.ts +0 -129
- package/apps/studio/test/chat-markdown.test.tsx +0 -58
- package/apps/studio/test/clip-addressing.test.ts +0 -738
- package/apps/studio/test/clip-ops.test.ts +0 -922
- package/apps/studio/test/cloud-build.test.ts +0 -95
- package/apps/studio/test/cloud-connect-note.test.ts +0 -135
- package/apps/studio/test/cloud-endpoints.test.ts +0 -590
- package/apps/studio/test/cloud-history-hardening.test.ts +0 -165
- package/apps/studio/test/cloud-history-posture.test.ts +0 -230
- package/apps/studio/test/cloud-managed-save-surfaces.test.ts +0 -90
- package/apps/studio/test/cloud-renew.test.ts +0 -205
- package/apps/studio/test/cloud-session-role.test.ts +0 -161
- package/apps/studio/test/cloud-shell-surfaces.test.ts +0 -170
- package/apps/studio/test/cold-start-apply.test.ts +0 -303
- package/apps/studio/test/collab-annotations-bridge.test.ts +0 -55
- package/apps/studio/test/collab-awareness-bridge.test.ts +0 -223
- package/apps/studio/test/collab-bridge.test.ts +0 -79
- package/apps/studio/test/collab-loopback.test.ts +0 -63
- package/apps/studio/test/collab-origin-gate.test.ts +0 -323
- package/apps/studio/test/collab-protocol.test.ts +0 -146
- package/apps/studio/test/collab-readonly-gate.test.ts +0 -194
- package/apps/studio/test/collab-reseed-guard.test.ts +0 -78
- package/apps/studio/test/collab-room.test.ts +0 -188
- package/apps/studio/test/collab-session-survival.test.tsx +0 -176
- package/apps/studio/test/collab-stress.test.ts +0 -129
- package/apps/studio/test/comment-mount.test.ts +0 -97
- package/apps/studio/test/comment-relay-origin-gate.test.ts +0 -117
- package/apps/studio/test/comments-api.test.ts +0 -277
- package/apps/studio/test/comments-fs-rebroadcast.test.ts +0 -155
- package/apps/studio/test/comments-overlay.test.ts +0 -117
- package/apps/studio/test/compile-entry.test.ts +0 -133
- package/apps/studio/test/component-map.test.ts +0 -48
- package/apps/studio/test/config-projection.test.ts +0 -104
- package/apps/studio/test/config-reload.test.ts +0 -230
- package/apps/studio/test/config-version.test.ts +0 -88
- package/apps/studio/test/context-resolve-tokens.test.ts +0 -97
- package/apps/studio/test/convert-to-absolute.test.ts +0 -333
- package/apps/studio/test/credential-grammar.test.ts +0 -107
- package/apps/studio/test/csp-canvas-shell.test.ts +0 -62
- package/apps/studio/test/csrf-write-guard.test.ts +0 -141
- package/apps/studio/test/debug-bundle.test.ts +0 -105
- package/apps/studio/test/design-setup-readiness.test.ts +0 -155
- package/apps/studio/test/detach-component.test.ts +0 -94
- package/apps/studio/test/dns-rebinding-guard.test.ts +0 -101
- package/apps/studio/test/dom-selection.test.ts +0 -198
- package/apps/studio/test/dynamic-text-edit.test.ts +0 -162
- package/apps/studio/test/edit-css-occurrence.test.ts +0 -81
- package/apps/studio/test/edit-persistence.test.ts +0 -91
- package/apps/studio/test/edit-scope-api.test.ts +0 -119
- package/apps/studio/test/edit-source-command.test.ts +0 -142
- package/apps/studio/test/edit-suppress.test.ts +0 -170
- package/apps/studio/test/editing-presence.test.ts +0 -103
- package/apps/studio/test/element-resize.test.ts +0 -136
- package/apps/studio/test/element-structural-api.test.ts +0 -434
- package/apps/studio/test/element-structural-edit.test.ts +0 -750
- package/apps/studio/test/ensure-browser.test.ts +0 -92
- package/apps/studio/test/equal-spacing-detector.test.ts +0 -257
- package/apps/studio/test/export-assemble.test.ts +0 -53
- package/apps/studio/test/export-browser-lane.test.ts +0 -126
- package/apps/studio/test/export-capture-fidelity.test.ts +0 -146
- package/apps/studio/test/export-capture-hygiene.test.ts +0 -675
- package/apps/studio/test/export-center.test.tsx +0 -287
- package/apps/studio/test/export-e2e-lanes.test.ts +0 -857
- package/apps/studio/test/export-format-scope-coherence.test.ts +0 -89
- package/apps/studio/test/export-lane.test.ts +0 -245
- package/apps/studio/test/export-shim-multi-capture.test.ts +0 -83
- package/apps/studio/test/exporters/canva.test.ts +0 -63
- package/apps/studio/test/exporters/degraded-propagation.test.ts +0 -123
- package/apps/studio/test/exporters/endpoint.test.ts +0 -121
- package/apps/studio/test/exporters/history.test.ts +0 -107
- package/apps/studio/test/exporters/html.test.ts +0 -26
- package/apps/studio/test/exporters/jobs.test.ts +0 -342
- package/apps/studio/test/exporters/pdf.test.ts +0 -85
- package/apps/studio/test/exporters/png.test.ts +0 -103
- package/apps/studio/test/exporters/pptx-deck.test.ts +0 -112
- package/apps/studio/test/exporters/pptx.test.ts +0 -31
- package/apps/studio/test/exporters/pw-launch.test.ts +0 -49
- package/apps/studio/test/exporters/runtime.test.ts +0 -59
- package/apps/studio/test/exporters/scope.test.ts +0 -292
- package/apps/studio/test/exporters/svg.test.ts +0 -29
- package/apps/studio/test/exporters/unsupported-media.test.ts +0 -123
- package/apps/studio/test/exporters/zip.test.ts +0 -104
- package/apps/studio/test/fetch-asset-gate.test.ts +0 -189
- package/apps/studio/test/figjam-v3-model.test.ts +0 -342
- package/apps/studio/test/figma-explode.test.ts +0 -438
- package/apps/studio/test/figma-provenance.test.ts +0 -108
- package/apps/studio/test/figma-routes.test.ts +0 -294
- package/apps/studio/test/file-lock.test.ts +0 -84
- package/apps/studio/test/fixtures/backgrounding-claude-auth.sh +0 -12
- package/apps/studio/test/fixtures/fake-claude-auth.mjs +0 -23
- package/apps/studio/test/fixtures/figjam-v3-groups-bindings.svg +0 -1
- package/apps/studio/test/fixtures/mock-acp-agent-caps.mjs +0 -158
- package/apps/studio/test/fixtures/mock-acp-agent-commands.mjs +0 -44
- package/apps/studio/test/fixtures/mock-acp-agent-elicit-flood.mjs +0 -46
- package/apps/studio/test/fixtures/mock-acp-agent-elicit-url.mjs +0 -42
- package/apps/studio/test/fixtures/mock-acp-agent-elicit.mjs +0 -63
- package/apps/studio/test/fixtures/mock-acp-agent-permission-flood.mjs +0 -51
- package/apps/studio/test/fixtures/mock-acp-agent-permission.mjs +0 -50
- package/apps/studio/test/fixtures/mock-acp-agent-slow.mjs +0 -45
- package/apps/studio/test/fixtures/mock-acp-agent-usage.mjs +0 -56
- package/apps/studio/test/fixtures/mock-acp-agent-wedged.mjs +0 -37
- package/apps/studio/test/fixtures/mock-acp-agent-write.mjs +0 -118
- package/apps/studio/test/fixtures/mock-acp-agent.mjs +0 -69
- package/apps/studio/test/fixtures/noisy-claude-auth.mjs +0 -27
- package/apps/studio/test/fixtures/perf-canvas.mjs +0 -201
- package/apps/studio/test/fixtures/phase-20-annotations.svg +0 -1
- package/apps/studio/test/fixtures/phase-21-annotations.svg +0 -1
- package/apps/studio/test/fixtures/tiny-subset.woff2 +0 -0
- package/apps/studio/test/fixtures/video-comp-fixture.tsx +0 -82
- package/apps/studio/test/fixtures/wedged-claude-auth.sh +0 -11
- package/apps/studio/test/footage-store.test.ts +0 -100
- package/apps/studio/test/fs-mkdir-api.test.ts +0 -248
- package/apps/studio/test/fs-watch.test.ts +0 -41
- package/apps/studio/test/gemma-models.test.ts +0 -245
- package/apps/studio/test/generate-route.test.ts +0 -106
- package/apps/studio/test/git-api.test.ts +0 -0
- package/apps/studio/test/git-branches.test.ts +0 -341
- package/apps/studio/test/git-cloud-posture.test.ts +0 -59
- package/apps/studio/test/git-grouping.test.ts +0 -106
- package/apps/studio/test/git-lifecycle.test.ts +0 -100
- package/apps/studio/test/git-log-format.test.ts +0 -95
- package/apps/studio/test/git-safe-rel.test.ts +0 -132
- package/apps/studio/test/git-system-engine.test.ts +0 -135
- package/apps/studio/test/git-watch.test.ts +0 -97
- package/apps/studio/test/github-api.test.ts +0 -577
- package/apps/studio/test/grid-track-handles.test.ts +0 -160
- package/apps/studio/test/handoff-static-frames.test.ts +0 -215
- package/apps/studio/test/handoff.test.ts +0 -329
- package/apps/studio/test/history-rollback.test.ts +0 -88
- package/apps/studio/test/hmr-broadcast.test.ts +0 -236
- package/apps/studio/test/hmr-classify.test.ts +0 -87
- package/apps/studio/test/hub-link.test.ts +0 -80
- package/apps/studio/test/identity-cache.test.ts +0 -83
- package/apps/studio/test/import-asset-browser.test.ts +0 -64
- package/apps/studio/test/import-asset-route.test.ts +0 -71
- package/apps/studio/test/import-asset.test.ts +0 -427
- package/apps/studio/test/import-brand-browser.test.ts +0 -88
- package/apps/studio/test/import-brand-route.test.ts +0 -120
- package/apps/studio/test/import-brand.test.ts +0 -206
- package/apps/studio/test/import-figma.test.ts +0 -667
- package/apps/studio/test/import-tokens.test.ts +0 -722
- package/apps/studio/test/index-data-canvas-ds.test.ts +0 -97
- package/apps/studio/test/input-router.test.ts +0 -757
- package/apps/studio/test/inspect-script-syntax.test.ts +0 -53
- package/apps/studio/test/inspect-selections.test.ts +0 -219
- package/apps/studio/test/knob-props-authored.test.ts +0 -87
- package/apps/studio/test/layers-synthetic-groups.test.ts +0 -96
- package/apps/studio/test/locator.test.ts +0 -214
- package/apps/studio/test/marquee-overlay.test.ts +0 -94
- package/apps/studio/test/media-commit-chain.test.ts +0 -210
- package/apps/studio/test/mode-toggle.test.tsx +0 -226
- package/apps/studio/test/motion-sample.test.ts +0 -35
- package/apps/studio/test/move-artboards-command.test.ts +0 -108
- package/apps/studio/test/participants-chrome.test.ts +0 -65
- package/apps/studio/test/paths.test.ts +0 -88
- package/apps/studio/test/pdf-print-boxes.test.ts +0 -359
- package/apps/studio/test/peer-selection-follows-camera.test.tsx +0 -131
- package/apps/studio/test/perf-harness.ts +0 -193
- package/apps/studio/test/phase-3.6-smoke.test.ts +0 -79
- package/apps/studio/test/photo-bg-remove-validation.test.ts +0 -71
- package/apps/studio/test/photo-canvas-bundle.test.ts +0 -79
- package/apps/studio/test/photo-edit-api.test.ts +0 -201
- package/apps/studio/test/photo-filters.test.ts +0 -149
- package/apps/studio/test/photo-pipeline.test.ts +0 -106
- package/apps/studio/test/photo-taxonomy.test.ts +0 -96
- package/apps/studio/test/print-marks.test.ts +0 -113
- package/apps/studio/test/print-units.test.ts +0 -173
- package/apps/studio/test/read-annotations.test.ts +0 -727
- package/apps/studio/test/read-only-gate.test.ts +0 -188
- package/apps/studio/test/read-only-role.test.ts +0 -95
- package/apps/studio/test/readiness.test.ts +0 -337
- package/apps/studio/test/remote-ahead-behind-cache.test.ts +0 -89
- package/apps/studio/test/reorder-api.test.ts +0 -210
- package/apps/studio/test/repo-concurrency.test.ts +0 -146
- package/apps/studio/test/repo-lock.test.ts +0 -350
- package/apps/studio/test/report-proxy.test.ts +0 -125
- package/apps/studio/test/ripple.test.ts +0 -197
- package/apps/studio/test/runtime-bundle-error-mapping.test.ts +0 -43
- package/apps/studio/test/runtime-bundle.test.ts +0 -69
- package/apps/studio/test/sanitize-annotation-svg.test.ts +0 -238
- package/apps/studio/test/scaffold-design.test.ts +0 -122
- package/apps/studio/test/server-lifecycle.test.ts +0 -38
- package/apps/studio/test/session-runtime-state.test.ts +0 -226
- package/apps/studio/test/session-scope.test.ts +0 -100
- package/apps/studio/test/shared-doc-cell-pairing.test.ts +0 -642
- package/apps/studio/test/shared-doc-convergence.test.ts +0 -265
- package/apps/studio/test/shared-doc-foundation.test.ts +0 -63
- package/apps/studio/test/shared-doc-migrate.test.ts +0 -369
- package/apps/studio/test/shared-doc-projection.test.ts +0 -238
- package/apps/studio/test/shell-importmap.test.ts +0 -56
- package/apps/studio/test/sizing-mode.test.ts +0 -102
- package/apps/studio/test/slash-commands.test.ts +0 -117
- package/apps/studio/test/snap-distance-pill.test.ts +0 -68
- package/apps/studio/test/spacing-handles.test.ts +0 -138
- package/apps/studio/test/specimen-select.test.ts +0 -88
- package/apps/studio/test/sync-agent.test.ts +0 -660
- package/apps/studio/test/sync-annotations-cold-start.test.ts +0 -302
- package/apps/studio/test/sync-asset-push.test.ts +0 -931
- package/apps/studio/test/sync-atomic-write.test.ts +0 -62
- package/apps/studio/test/sync-attach-incremental.test.ts +0 -527
- package/apps/studio/test/sync-autocommit.test.ts +0 -537
- package/apps/studio/test/sync-canvas-path.test.ts +0 -200
- package/apps/studio/test/sync-cell-write-nudge.test.ts +0 -346
- package/apps/studio/test/sync-codec.test.ts +0 -230
- package/apps/studio/test/sync-cold-seed-dedup.test.ts +0 -187
- package/apps/studio/test/sync-cold-start.test.ts +0 -304
- package/apps/studio/test/sync-connect-honesty.test.ts +0 -114
- package/apps/studio/test/sync-connection-state.test.ts +0 -337
- package/apps/studio/test/sync-ctl-channel.test.ts +0 -508
- package/apps/studio/test/sync-decide-file.test.ts +0 -420
- package/apps/studio/test/sync-doc-name.test.ts +0 -281
- package/apps/studio/test/sync-echo-guard.test.ts +0 -96
- package/apps/studio/test/sync-file-ledger.test.ts +0 -334
- package/apps/studio/test/sync-file-membership.test.ts +0 -347
- package/apps/studio/test/sync-file-plane.test.ts +0 -976
- package/apps/studio/test/sync-file-pull.test.ts +0 -333
- package/apps/studio/test/sync-fresh-link-parity.test.ts +0 -267
- package/apps/studio/test/sync-fs-mirror.test.ts +0 -181
- package/apps/studio/test/sync-hardening.test.ts +0 -586
- package/apps/studio/test/sync-hub-listing.test.ts +0 -46
- package/apps/studio/test/sync-hubs-config.test.ts +0 -133
- package/apps/studio/test/sync-incident-replay.test.ts +0 -211
- package/apps/studio/test/sync-journal.test.ts +0 -176
- package/apps/studio/test/sync-meta-codec.test.ts +0 -199
- package/apps/studio/test/sync-migrate-flat-fallback.test.ts +0 -98
- package/apps/studio/test/sync-move-retirement.test.ts +0 -231
- package/apps/studio/test/sync-panel-surface.test.ts +0 -153
- package/apps/studio/test/sync-path-pull.test.ts +0 -531
- package/apps/studio/test/sync-presentation.test.ts +0 -262
- package/apps/studio/test/sync-pull-budget.test.ts +0 -169
- package/apps/studio/test/sync-remote-docs.test.ts +0 -333
- package/apps/studio/test/sync-resync-routes.test.ts +0 -168
- package/apps/studio/test/sync-runtime.test.ts +0 -1675
- package/apps/studio/test/sync-seed-defers-to-hub.test.ts +0 -83
- package/apps/studio/test/sync-settings-routes.test.ts +0 -195
- package/apps/studio/test/sync-settings.test.ts +0 -151
- package/apps/studio/test/sync-status.test.ts +0 -261
- package/apps/studio/test/sync-supervisor.test.ts +0 -262
- package/apps/studio/test/sync-tombstone-apply.test.ts +0 -111
- package/apps/studio/test/sync-trash.test.ts +0 -132
- package/apps/studio/test/sync-two-peer-discovery.test.ts +0 -343
- package/apps/studio/test/sync-untrusted.test.ts +0 -103
- package/apps/studio/test/system-endpoint.test.ts +0 -144
- package/apps/studio/test/text-editability-stamp.test.ts +0 -131
- package/apps/studio/test/timeline-comp-target.test.ts +0 -139
- package/apps/studio/test/timeline-media-cache.test.ts +0 -41
- package/apps/studio/test/timeline-parse.test.ts +0 -184
- package/apps/studio/test/timeline-scale.test.ts +0 -65
- package/apps/studio/test/timeline-snap.test.ts +0 -85
- package/apps/studio/test/tool-palette-insert-anchor.test.ts +0 -86
- package/apps/studio/test/tool-palette.test.tsx +0 -55
- package/apps/studio/test/tour-overlay.test.tsx +0 -90
- package/apps/studio/test/trusted-request-host.test.ts +0 -66
- package/apps/studio/test/undo-sequence-byte-compare.test.ts +0 -211
- package/apps/studio/test/undo-stack.test.ts +0 -244
- package/apps/studio/test/use-agent-presence.test.tsx +0 -117
- package/apps/studio/test/use-annotation-resize.test.ts +0 -402
- package/apps/studio/test/use-annotation-selection.test.tsx +0 -77
- package/apps/studio/test/use-artboard-drag.test.ts +0 -324
- package/apps/studio/test/use-canvas-activity.test.tsx +0 -206
- package/apps/studio/test/use-collab.test.ts +0 -0
- package/apps/studio/test/use-cursor-modifiers.test.ts +0 -59
- package/apps/studio/test/use-keyboard-discipline.test.ts +0 -27
- package/apps/studio/test/use-selection-set.test.tsx +0 -166
- package/apps/studio/test/use-snap-guides.test.ts +0 -271
- package/apps/studio/test/use-tool-mode.test.tsx +0 -186
- package/apps/studio/test/use-undo-stack.test.tsx +0 -223
- package/apps/studio/test/video-asset.test.ts +0 -163
- package/apps/studio/test/video-comp-fixture.test.ts +0 -50
- package/apps/studio/test/video-comp.test.ts +0 -270
- package/apps/studio/test/video-encode-lib.test.ts +0 -63
- package/apps/studio/test/video-render-bridge.test.ts +0 -171
- package/apps/studio/test/whats-new.test.ts +0 -113
- package/apps/studio/test/whisper-setup.test.ts +0 -97
- package/apps/studio/test/workspace-containment.test.ts +0 -382
- package/apps/studio/test/workspace-signin.test.ts +0 -292
- package/apps/studio/test/ws-handshake.test.ts +0 -33
- package/cli/commands/cache.test.mjs +0 -166
- package/cli/commands/design-link.test.mjs +0 -419
- package/cli/commands/design.test.mjs +0 -240
- package/cli/commands/doctor.test.mjs +0 -237
- package/cli/commands/hub-workspace.test.mjs +0 -275
- package/cli/commands/hub.test.mjs +0 -225
- package/cli/commands/kg.test.mjs +0 -142
- package/cli/commands/preflight.test.mjs +0 -46
- package/cli/lib/argv.test.mjs +0 -46
- package/cli/lib/cache.test.mjs +0 -303
- package/cli/lib/cell-plan.test.mjs +0 -225
- package/cli/lib/config-lint.test.mjs +0 -117
- package/cli/lib/ddr-to-kgai.test.mjs +0 -118
- package/cli/lib/design-ownership.test.mjs +0 -329
- package/cli/lib/fetch-asset.test.mjs +0 -213
- package/cli/lib/figma-codegen-reachability.test.mjs +0 -104
- package/cli/lib/figma-import-controls.test.mjs +0 -70
- package/cli/lib/flow-design-integration.test.mjs +0 -165
- package/cli/lib/gitignore-block.test.mjs +0 -136
- package/cli/lib/gitignore-drift.test.mjs +0 -156
- package/cli/lib/hubs-config.test.mjs +0 -165
- package/cli/lib/pkg-root.test.mjs +0 -111
- package/cli/lib/plugin-cli-reachability.test.mjs +0 -57
- package/cli/lib/plugin-name-namespace.test.mjs +0 -71
- package/cli/lib/reconstruct-toolset.test.mjs +0 -194
- package/cli/lib/stack-detect.test.mjs +0 -121
- package/cli/lib/update-check.test.mjs +0 -32
- package/cli/lib/workspace-plan.test.mjs +0 -699
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bun
|
|
2
|
-
// Mock ACP agent that sends a `mode:'url'` elicitation request — proves
|
|
3
|
-
// AcpBridge.unstable_createElicitation rejects it structurally (declines
|
|
4
|
-
// without ever calling onElicitationRequest) even though the adapter/agent
|
|
5
|
-
// side ignored the client's declared `elicitation:{form:{}}`-only capability
|
|
6
|
-
// (ethical-hacker finding — capability negotiation is advisory, not
|
|
7
|
-
// enforced; the client must reject what it never advertised, not just hope
|
|
8
|
-
// the other side honors it).
|
|
9
|
-
|
|
10
|
-
import { Readable, Writable } from 'node:stream';
|
|
11
|
-
|
|
12
|
-
import * as acp from '@agentclientprotocol/sdk';
|
|
13
|
-
|
|
14
|
-
const stream = acp.ndJsonStream(Writable.toWeb(process.stdout), Readable.toWeb(process.stdin));
|
|
15
|
-
|
|
16
|
-
let n = 0;
|
|
17
|
-
|
|
18
|
-
acp
|
|
19
|
-
.agent({ name: 'mock-acp-agent-elicit-url' })
|
|
20
|
-
.onRequest('initialize', () => ({
|
|
21
|
-
protocolVersion: acp.PROTOCOL_VERSION,
|
|
22
|
-
agentCapabilities: { loadSession: false },
|
|
23
|
-
}))
|
|
24
|
-
.onRequest('session/new', () => ({ sessionId: `mock-elicit-url-session-${++n}` }))
|
|
25
|
-
.onRequest('session/prompt', async (ctx) => {
|
|
26
|
-
const response = await ctx.client.request(acp.methods.client.elicitation.create, {
|
|
27
|
-
mode: 'url',
|
|
28
|
-
sessionId: ctx.params.sessionId,
|
|
29
|
-
message: 'Confirm you have completed verification',
|
|
30
|
-
url: 'https://example.com/verify',
|
|
31
|
-
elicitationId: 'elicit-url-1',
|
|
32
|
-
});
|
|
33
|
-
await ctx.client.notify('session/update', {
|
|
34
|
-
sessionId: ctx.params.sessionId,
|
|
35
|
-
update: {
|
|
36
|
-
sessionUpdate: 'agent_message_chunk',
|
|
37
|
-
content: { type: 'text', text: `response=${JSON.stringify(response)}` },
|
|
38
|
-
},
|
|
39
|
-
});
|
|
40
|
-
return { stopReason: 'end_turn' };
|
|
41
|
-
})
|
|
42
|
-
.connect(stream);
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bun
|
|
2
|
-
// Mock ACP agent exercising the elicitation-form gate (feature-acp-ask-user-
|
|
3
|
-
// question) — session/prompt calls back INTO the client via a REAL
|
|
4
|
-
// `elicitation/create` request, shaped exactly like
|
|
5
|
-
// `askUserQuestionsToCreateRequest`'s single-question output (confirmed on
|
|
6
|
-
// disk against the installed `@agentclientprotocol/claude-agent-acp` — a
|
|
7
|
-
// titled `oneOf` enum plus its sibling `_custom` free-text field), before
|
|
8
|
-
// streaming its final reply. Mirrors mock-acp-agent-permission.mjs's shape.
|
|
9
|
-
// No real `claude` needed.
|
|
10
|
-
|
|
11
|
-
import { Readable, Writable } from 'node:stream';
|
|
12
|
-
|
|
13
|
-
import * as acp from '@agentclientprotocol/sdk';
|
|
14
|
-
|
|
15
|
-
const stream = acp.ndJsonStream(Writable.toWeb(process.stdout), Readable.toWeb(process.stdin));
|
|
16
|
-
|
|
17
|
-
let n = 0;
|
|
18
|
-
|
|
19
|
-
acp
|
|
20
|
-
.agent({ name: 'mock-acp-agent-elicit' })
|
|
21
|
-
.onRequest('initialize', () => ({
|
|
22
|
-
protocolVersion: acp.PROTOCOL_VERSION,
|
|
23
|
-
agentCapabilities: { loadSession: false },
|
|
24
|
-
}))
|
|
25
|
-
.onRequest('session/new', () => ({ sessionId: `mock-elicit-session-${++n}` }))
|
|
26
|
-
.onRequest('session/prompt', async (ctx) => {
|
|
27
|
-
// `ctx.client` (AgentContext) only exposes the generic request()/notify() —
|
|
28
|
-
// no typed convenience method — so call the raw ACP method via
|
|
29
|
-
// `acp.methods.client.elicitation.create` (confirmed on disk: acp.js's
|
|
30
|
-
// `methods.client.elicitation.create === schema.CLIENT_METHODS.elicitation_create`).
|
|
31
|
-
const response = await ctx.client.request(acp.methods.client.elicitation.create, {
|
|
32
|
-
mode: 'form',
|
|
33
|
-
sessionId: ctx.params.sessionId,
|
|
34
|
-
toolCallId: 'tc-elicit-1',
|
|
35
|
-
message: 'Which color do you like?',
|
|
36
|
-
requestedSchema: {
|
|
37
|
-
type: 'object',
|
|
38
|
-
properties: {
|
|
39
|
-
question_0: {
|
|
40
|
-
type: 'string',
|
|
41
|
-
oneOf: [
|
|
42
|
-
{ const: 'Red', title: 'Red' },
|
|
43
|
-
{ const: 'Blue', title: 'Blue' },
|
|
44
|
-
],
|
|
45
|
-
},
|
|
46
|
-
question_0_custom: {
|
|
47
|
-
type: 'string',
|
|
48
|
-
title: 'Other',
|
|
49
|
-
description: 'Type your own answer instead of choosing an option above (optional).',
|
|
50
|
-
},
|
|
51
|
-
},
|
|
52
|
-
},
|
|
53
|
-
});
|
|
54
|
-
await ctx.client.notify('session/update', {
|
|
55
|
-
sessionId: ctx.params.sessionId,
|
|
56
|
-
update: {
|
|
57
|
-
sessionUpdate: 'agent_message_chunk',
|
|
58
|
-
content: { type: 'text', text: `response=${JSON.stringify(response)}` },
|
|
59
|
-
},
|
|
60
|
-
});
|
|
61
|
-
return { stopReason: 'end_turn' };
|
|
62
|
-
})
|
|
63
|
-
.connect(stream);
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bun
|
|
2
|
-
// Mock ACP agent proving the MAX_PENDING_PERMISSIONS cap (SECURITY /
|
|
3
|
-
// ethical-hacker finding, retroactive review of Milestone B — a single agent
|
|
4
|
-
// turn can legitimately issue several tool calls back to back, so "one per
|
|
5
|
-
// tool call" is not a natural rate limit). Fires MORE than the cap
|
|
6
|
-
// concurrently, without waiting for each one, and reports which ones actually
|
|
7
|
-
// round-tripped to the client vs. were denied immediately by the bridge's
|
|
8
|
-
// own cap.
|
|
9
|
-
|
|
10
|
-
import { Readable, Writable } from 'node:stream';
|
|
11
|
-
|
|
12
|
-
import * as acp from '@agentclientprotocol/sdk';
|
|
13
|
-
|
|
14
|
-
const stream = acp.ndJsonStream(Writable.toWeb(process.stdout), Readable.toWeb(process.stdin));
|
|
15
|
-
|
|
16
|
-
const FLOOD_COUNT = 13; // > MAX_PENDING_PERMISSIONS (10) in acp/bridge.ts
|
|
17
|
-
|
|
18
|
-
let n = 0;
|
|
19
|
-
|
|
20
|
-
acp
|
|
21
|
-
.agent({ name: 'mock-acp-agent-permission-flood' })
|
|
22
|
-
.onRequest('initialize', () => ({
|
|
23
|
-
protocolVersion: acp.PROTOCOL_VERSION,
|
|
24
|
-
agentCapabilities: { loadSession: false },
|
|
25
|
-
}))
|
|
26
|
-
.onRequest('session/new', () => ({ sessionId: `mock-perm-flood-session-${++n}` }))
|
|
27
|
-
.onRequest('session/prompt', async (ctx) => {
|
|
28
|
-
const requests = Array.from({ length: FLOOD_COUNT }, (_, i) =>
|
|
29
|
-
ctx.client.request(acp.methods.client.session.requestPermission, {
|
|
30
|
-
sessionId: ctx.params.sessionId,
|
|
31
|
-
toolCall: { toolCallId: `tc${i}`, title: `Flood tool call ${i}`, kind: 'edit' },
|
|
32
|
-
options: [
|
|
33
|
-
{ optionId: 'allow-once', name: 'Allow once', kind: 'allow_once' },
|
|
34
|
-
{ optionId: 'reject-once', name: 'Reject', kind: 'reject_once' },
|
|
35
|
-
],
|
|
36
|
-
})
|
|
37
|
-
);
|
|
38
|
-
const outcomes = await Promise.all(requests);
|
|
39
|
-
await ctx.client.notify('session/update', {
|
|
40
|
-
sessionId: ctx.params.sessionId,
|
|
41
|
-
update: {
|
|
42
|
-
sessionUpdate: 'agent_message_chunk',
|
|
43
|
-
content: {
|
|
44
|
-
type: 'text',
|
|
45
|
-
text: `outcomes=${JSON.stringify(outcomes.map((o) => o.outcome))}`,
|
|
46
|
-
},
|
|
47
|
-
},
|
|
48
|
-
});
|
|
49
|
-
return { stopReason: 'end_turn' };
|
|
50
|
-
})
|
|
51
|
-
.connect(stream);
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bun
|
|
2
|
-
// Mock ACP agent exercising the permission approve/deny gate (Milestone B,
|
|
3
|
-
// retires DDR-125 F2) — session/prompt calls back INTO the client via
|
|
4
|
-
// `ctx.client.requestPermission(...)` (a real request, not a notification)
|
|
5
|
-
// before streaming its final reply, mirroring how claude-agent-acp asks for
|
|
6
|
-
// tool authorization mid-turn. No real `claude` needed.
|
|
7
|
-
|
|
8
|
-
import { Readable, Writable } from 'node:stream';
|
|
9
|
-
|
|
10
|
-
import * as acp from '@agentclientprotocol/sdk';
|
|
11
|
-
|
|
12
|
-
const stream = acp.ndJsonStream(Writable.toWeb(process.stdout), Readable.toWeb(process.stdin));
|
|
13
|
-
|
|
14
|
-
let n = 0;
|
|
15
|
-
|
|
16
|
-
acp
|
|
17
|
-
.agent({ name: 'mock-acp-agent-permission' })
|
|
18
|
-
.onRequest('initialize', () => ({
|
|
19
|
-
protocolVersion: acp.PROTOCOL_VERSION,
|
|
20
|
-
agentCapabilities: { loadSession: false },
|
|
21
|
-
}))
|
|
22
|
-
.onRequest('session/new', () => ({ sessionId: `mock-perm-session-${++n}` }))
|
|
23
|
-
.onRequest('session/prompt', async (ctx) => {
|
|
24
|
-
// `ctx.client` (AgentContext) only exposes the generic request()/notify() —
|
|
25
|
-
// no typed `.requestPermission()` convenience method — so call the raw ACP
|
|
26
|
-
// method via `acp.methods.client.session.requestPermission`.
|
|
27
|
-
const outcome = await ctx.client.request(acp.methods.client.session.requestPermission, {
|
|
28
|
-
sessionId: ctx.params.sessionId,
|
|
29
|
-
toolCall: {
|
|
30
|
-
toolCallId: 'tc1',
|
|
31
|
-
title: 'Write file',
|
|
32
|
-
kind: 'edit',
|
|
33
|
-
rawInput: { path: '/tmp/x' },
|
|
34
|
-
},
|
|
35
|
-
options: [
|
|
36
|
-
{ optionId: 'allow-once', name: 'Allow once', kind: 'allow_once' },
|
|
37
|
-
{ optionId: 'allow-always', name: 'Allow always', kind: 'allow_always' },
|
|
38
|
-
{ optionId: 'reject-once', name: 'Reject', kind: 'reject_once' },
|
|
39
|
-
],
|
|
40
|
-
});
|
|
41
|
-
await ctx.client.notify('session/update', {
|
|
42
|
-
sessionId: ctx.params.sessionId,
|
|
43
|
-
update: {
|
|
44
|
-
sessionUpdate: 'agent_message_chunk',
|
|
45
|
-
content: { type: 'text', text: `outcome=${JSON.stringify(outcome.outcome)}` },
|
|
46
|
-
},
|
|
47
|
-
});
|
|
48
|
-
return { stopReason: 'end_turn' };
|
|
49
|
-
})
|
|
50
|
-
.connect(stream);
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bun
|
|
2
|
-
// A mock ACP agent that streams SEVERAL updates with a gap between them, so a
|
|
3
|
-
// test can close the socket MID-turn and assert the turn still completes
|
|
4
|
-
// (feature-acp-write-path-scope Addendum, Task 8 — bridges outlive their socket).
|
|
5
|
-
//
|
|
6
|
-
// The pacing is the whole point: `mock-acp-agent-permission.mjs` and friends
|
|
7
|
-
// settle in one tick, which leaves no window in which "mid-turn" is a real
|
|
8
|
-
// state. Six chunks at ~120 ms give a test room to observe the first one, yank
|
|
9
|
-
// the socket, and still have the rest arrive with nobody attached.
|
|
10
|
-
|
|
11
|
-
import { Readable, Writable } from 'node:stream';
|
|
12
|
-
|
|
13
|
-
import * as acp from '@agentclientprotocol/sdk';
|
|
14
|
-
|
|
15
|
-
const stream = acp.ndJsonStream(Writable.toWeb(process.stdout), Readable.toWeb(process.stdin));
|
|
16
|
-
|
|
17
|
-
const CHUNKS = Number(process.env.MAUDE_TEST_SLOW_CHUNKS || 6);
|
|
18
|
-
const GAP_MS = Number(process.env.MAUDE_TEST_SLOW_GAP_MS || 120);
|
|
19
|
-
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
|
|
20
|
-
|
|
21
|
-
let n = 0;
|
|
22
|
-
|
|
23
|
-
acp
|
|
24
|
-
.agent({ name: 'mock-acp-agent-slow' })
|
|
25
|
-
.onRequest('initialize', () => ({
|
|
26
|
-
protocolVersion: acp.PROTOCOL_VERSION,
|
|
27
|
-
agentCapabilities: { loadSession: false },
|
|
28
|
-
}))
|
|
29
|
-
.onRequest('session/new', () => ({ sessionId: `mock-slow-session-${++n}` }))
|
|
30
|
-
.onRequest('session/prompt', async (ctx) => {
|
|
31
|
-
for (let i = 0; i < CHUNKS; i++) {
|
|
32
|
-
await ctx.client.notify('session/update', {
|
|
33
|
-
sessionId: ctx.params.sessionId,
|
|
34
|
-
update: {
|
|
35
|
-
sessionUpdate: 'agent_message_chunk',
|
|
36
|
-
// Numbered so a test can tell WHICH chunks it received, not just how
|
|
37
|
-
// many — the difference between "no duplicates" and "no gaps".
|
|
38
|
-
content: { type: 'text', text: `chunk-${i}\n` },
|
|
39
|
-
},
|
|
40
|
-
});
|
|
41
|
-
await sleep(GAP_MS);
|
|
42
|
-
}
|
|
43
|
-
return { stopReason: 'end_turn' };
|
|
44
|
-
})
|
|
45
|
-
.connect(stream);
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bun
|
|
2
|
-
// Mock ACP agent emitting `usage_update` notifications (Milestone D) — one
|
|
3
|
-
// after the prompt result (context/cost), and one carrying the thin
|
|
4
|
-
// `_meta["_claude/rateLimit"]` rate-limit signal (mirrors the real adapter's
|
|
5
|
-
// `rate_limit_event` forwarding, acp-agent.js:1768-1776). No real `claude` needed.
|
|
6
|
-
|
|
7
|
-
import { Readable, Writable } from 'node:stream';
|
|
8
|
-
|
|
9
|
-
import * as acp from '@agentclientprotocol/sdk';
|
|
10
|
-
|
|
11
|
-
const stream = acp.ndJsonStream(Writable.toWeb(process.stdout), Readable.toWeb(process.stdin));
|
|
12
|
-
|
|
13
|
-
let n = 0;
|
|
14
|
-
|
|
15
|
-
acp
|
|
16
|
-
.agent({ name: 'mock-acp-agent-usage' })
|
|
17
|
-
.onRequest('initialize', () => ({
|
|
18
|
-
protocolVersion: acp.PROTOCOL_VERSION,
|
|
19
|
-
agentCapabilities: { loadSession: false },
|
|
20
|
-
}))
|
|
21
|
-
.onRequest('session/new', () => ({ sessionId: `mock-usage-session-${++n}` }))
|
|
22
|
-
.onRequest('session/prompt', async (ctx) => {
|
|
23
|
-
await ctx.client.notify('session/update', {
|
|
24
|
-
sessionId: ctx.params.sessionId,
|
|
25
|
-
update: { sessionUpdate: 'agent_message_chunk', content: { type: 'text', text: 'ok' } },
|
|
26
|
-
});
|
|
27
|
-
await ctx.client.notify('session/update', {
|
|
28
|
-
sessionId: ctx.params.sessionId,
|
|
29
|
-
update: {
|
|
30
|
-
sessionUpdate: 'usage_update',
|
|
31
|
-
used: 4200,
|
|
32
|
-
size: 200000,
|
|
33
|
-
cost: { amount: 0.0123, currency: 'USD' },
|
|
34
|
-
},
|
|
35
|
-
});
|
|
36
|
-
if (ctx.params.prompt?.[0]?.text === 'trigger-rate-limit') {
|
|
37
|
-
await ctx.client.notify('session/update', {
|
|
38
|
-
sessionId: ctx.params.sessionId,
|
|
39
|
-
update: {
|
|
40
|
-
sessionUpdate: 'usage_update',
|
|
41
|
-
used: 4200,
|
|
42
|
-
size: 200000,
|
|
43
|
-
_meta: {
|
|
44
|
-
'_claude/rateLimit': {
|
|
45
|
-
status: 'allowed_warning',
|
|
46
|
-
rateLimitType: 'five_hour',
|
|
47
|
-
utilization: 82,
|
|
48
|
-
resetsAt: 1234567890,
|
|
49
|
-
},
|
|
50
|
-
},
|
|
51
|
-
},
|
|
52
|
-
});
|
|
53
|
-
}
|
|
54
|
-
return { stopReason: 'end_turn' };
|
|
55
|
-
})
|
|
56
|
-
.connect(stream);
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bun
|
|
2
|
-
// A mock ACP agent that WEDGES on the FIRST turn only (issue-82): its
|
|
3
|
-
// `session/prompt` handler never resolves for call #1 — simulating a
|
|
4
|
-
// `claude` subprocess that has hung — and it never implements
|
|
5
|
-
// `session/cancel` at all, so a bridge that only sends the cooperative ACP
|
|
6
|
-
// `session/cancel` request and trusts it will hang forever, exactly like the
|
|
7
|
-
// reported "I clicked STOP and nothing happened" bug.
|
|
8
|
-
//
|
|
9
|
-
// Every call AFTER the first resolves normally and quickly — this lets a
|
|
10
|
-
// test start a second, overlapping `prompt()` on the same bridge/chat (the
|
|
11
|
-
// ethical-hacker's "no reentrancy guard" finding) and confirm that turn's
|
|
12
|
-
// ordinary completion doesn't blind `cancel()` to the still-wedged first one.
|
|
13
|
-
|
|
14
|
-
import { Readable, Writable } from 'node:stream';
|
|
15
|
-
|
|
16
|
-
import * as acp from '@agentclientprotocol/sdk';
|
|
17
|
-
|
|
18
|
-
const stream = acp.ndJsonStream(Writable.toWeb(process.stdout), Readable.toWeb(process.stdin));
|
|
19
|
-
|
|
20
|
-
let promptCalls = 0;
|
|
21
|
-
|
|
22
|
-
acp
|
|
23
|
-
.agent({ name: 'mock-acp-agent-wedged' })
|
|
24
|
-
.onRequest('initialize', () => ({
|
|
25
|
-
protocolVersion: acp.PROTOCOL_VERSION,
|
|
26
|
-
agentCapabilities: { loadSession: false },
|
|
27
|
-
}))
|
|
28
|
-
.onRequest('session/new', () => ({ sessionId: 'mock-wedged-session' }))
|
|
29
|
-
.onRequest('session/prompt', () => {
|
|
30
|
-
promptCalls += 1;
|
|
31
|
-
if (promptCalls === 1) return new Promise(() => {}); // never resolves, never rejects
|
|
32
|
-
return Promise.resolve({ stopReason: 'end_turn' });
|
|
33
|
-
})
|
|
34
|
-
// Deliberately NO `session/cancel` handler — an agent that never
|
|
35
|
-
// implemented turn-cancellation at all, the other real-world shape of
|
|
36
|
-
// "Stop does nothing".
|
|
37
|
-
.connect(stream);
|
|
@@ -1,118 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bun
|
|
2
|
-
// feature-acp-write-path-scope Task 1 — the RECORDED SHAPE of a write tool's
|
|
3
|
-
// permission request, replayed as a mock ACP agent.
|
|
4
|
-
//
|
|
5
|
-
// This is not an invented shape. It reproduces, field for field, what
|
|
6
|
-
// `@agentclientprotocol/claude-agent-acp@0.57.0` actually puts on the wire for
|
|
7
|
-
// `Write`/`Edit`/`NotebookEdit`, read out of its own `dist/` on 2026-08-07:
|
|
8
|
-
//
|
|
9
|
-
// • `dist/acp-agent.js:2270-2286` builds the permission request's `toolCall`
|
|
10
|
-
// as `{ toolCallId, rawInput, ...toolInfoFromToolUse(name, input, id) }` —
|
|
11
|
-
// note there is NO tool NAME anywhere in that object.
|
|
12
|
-
// • `dist/tools.js` `case "Write"` / `case "Edit"` set
|
|
13
|
-
// `locations: input?.file_path ? [{ path: input.file_path }] : []` — the
|
|
14
|
-
// model's string VERBATIM. No normalization, no absolutization, despite the
|
|
15
|
-
// ACP schema (`types.gen.d.ts:568-572`) describing the field as "The
|
|
16
|
-
// absolute file path being accessed or modified".
|
|
17
|
-
// • `NotebookEdit` has NO case at all — it falls through to `case "Other"`,
|
|
18
|
-
// which emits no `locations` whatsoever. Its target lives only on
|
|
19
|
-
// `rawInput.notebook_path`.
|
|
20
|
-
// • `dist/acp-agent.js:3808-3829` (`toolCallNotification`) is the ONLY carrier
|
|
21
|
-
// of the tool name: `_meta.claudeCode.toolName` on the streamed `tool_call`.
|
|
22
|
-
// • `requestPermissionFromClient` (`:2134-2141`) AWAITS `ensureToolCallEmitted`
|
|
23
|
-
// before issuing the request, so that notification is guaranteed to be on
|
|
24
|
-
// the wire FIRST. The bridge's gate depends on exactly that ordering, so the
|
|
25
|
-
// fixture reproduces it rather than assuming it.
|
|
26
|
-
//
|
|
27
|
-
// Driven by env so one fixture covers every case:
|
|
28
|
-
// MAUDE_TEST_WRITE_PATH — the `file_path` the "model" emitted (required)
|
|
29
|
-
// MAUDE_TEST_WRITE_TOOL — Write (default) | Edit | NotebookEdit | Read
|
|
30
|
-
// MAUDE_TEST_OMIT_TOOL_CALL=1 — skip the `tool_call` notification, i.e.
|
|
31
|
-
// simulate an adapter that reorders or drops it. The gate must fail
|
|
32
|
-
// CLOSED here (prompt), never auto-approve.
|
|
33
|
-
|
|
34
|
-
import { Readable, Writable } from 'node:stream';
|
|
35
|
-
|
|
36
|
-
import * as acp from '@agentclientprotocol/sdk';
|
|
37
|
-
|
|
38
|
-
const stream = acp.ndJsonStream(Writable.toWeb(process.stdout), Readable.toWeb(process.stdin));
|
|
39
|
-
|
|
40
|
-
const TOOL = process.env.MAUDE_TEST_WRITE_TOOL || 'Write';
|
|
41
|
-
const FILE_PATH = process.env.MAUDE_TEST_WRITE_PATH || '/tmp/unset';
|
|
42
|
-
const OMIT_TOOL_CALL = process.env.MAUDE_TEST_OMIT_TOOL_CALL === '1';
|
|
43
|
-
const TOOL_CALL_ID = 'tc-write-1';
|
|
44
|
-
|
|
45
|
-
// Mirrors `toolInfoFromToolUse`'s per-tool branches. NotebookEdit deliberately
|
|
46
|
-
// yields NO `locations` key — that is the adapter's real behaviour, and the case
|
|
47
|
-
// that makes the rawInput fallback mandatory rather than decorative.
|
|
48
|
-
function toolInfo() {
|
|
49
|
-
if (TOOL === 'NotebookEdit') {
|
|
50
|
-
return { title: 'NotebookEdit', kind: 'other', content: [] };
|
|
51
|
-
}
|
|
52
|
-
if (TOOL === 'Read') {
|
|
53
|
-
return {
|
|
54
|
-
title: `Read ${FILE_PATH}`,
|
|
55
|
-
kind: 'read',
|
|
56
|
-
content: [],
|
|
57
|
-
locations: [{ path: FILE_PATH, line: 1 }],
|
|
58
|
-
};
|
|
59
|
-
}
|
|
60
|
-
return {
|
|
61
|
-
title: `${TOOL} ${FILE_PATH}`,
|
|
62
|
-
kind: 'edit',
|
|
63
|
-
content: [],
|
|
64
|
-
locations: [{ path: FILE_PATH }],
|
|
65
|
-
};
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
function rawInput() {
|
|
69
|
-
if (TOOL === 'NotebookEdit') return { notebook_path: FILE_PATH, new_source: 'x' };
|
|
70
|
-
if (TOOL === 'Write') return { file_path: FILE_PATH, content: 'x' };
|
|
71
|
-
if (TOOL === 'Read') return { file_path: FILE_PATH };
|
|
72
|
-
return { file_path: FILE_PATH, old_string: 'a', new_string: 'b' };
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
acp
|
|
76
|
-
.agent({ name: 'mock-acp-agent-write' })
|
|
77
|
-
.onRequest('initialize', () => ({
|
|
78
|
-
protocolVersion: acp.PROTOCOL_VERSION,
|
|
79
|
-
agentCapabilities: { loadSession: false },
|
|
80
|
-
}))
|
|
81
|
-
.onRequest('session/new', () => ({ sessionId: 'mock-write-session-1' }))
|
|
82
|
-
.onRequest('session/prompt', async (ctx) => {
|
|
83
|
-
// (1) The `tool_call` notification — the tool NAME's only carrier.
|
|
84
|
-
if (!OMIT_TOOL_CALL) {
|
|
85
|
-
await ctx.client.notify('session/update', {
|
|
86
|
-
sessionId: ctx.params.sessionId,
|
|
87
|
-
update: {
|
|
88
|
-
_meta: { claudeCode: { toolName: TOOL } },
|
|
89
|
-
toolCallId: TOOL_CALL_ID,
|
|
90
|
-
sessionUpdate: 'tool_call',
|
|
91
|
-
rawInput: rawInput(),
|
|
92
|
-
status: 'pending',
|
|
93
|
-
...toolInfo(),
|
|
94
|
-
},
|
|
95
|
-
});
|
|
96
|
-
}
|
|
97
|
-
// (2) THEN the permission request, with the adapter's real option set for a
|
|
98
|
-
// routine tool call (`acp-agent.js:2271-2278`) — note `allow_always` is
|
|
99
|
-
// listed FIRST, which is what Decision D's filter has to contend with.
|
|
100
|
-
const outcome = await ctx.client.request(acp.methods.client.session.requestPermission, {
|
|
101
|
-
sessionId: ctx.params.sessionId,
|
|
102
|
-
toolCall: { toolCallId: TOOL_CALL_ID, rawInput: rawInput(), ...toolInfo() },
|
|
103
|
-
options: [
|
|
104
|
-
{ optionId: 'allow_always', name: 'Always Allow', kind: 'allow_always' },
|
|
105
|
-
{ optionId: 'allow', name: 'Allow', kind: 'allow_once' },
|
|
106
|
-
{ optionId: 'reject', name: 'Reject', kind: 'reject_once' },
|
|
107
|
-
],
|
|
108
|
-
});
|
|
109
|
-
await ctx.client.notify('session/update', {
|
|
110
|
-
sessionId: ctx.params.sessionId,
|
|
111
|
-
update: {
|
|
112
|
-
sessionUpdate: 'agent_message_chunk',
|
|
113
|
-
content: { type: 'text', text: `outcome=${JSON.stringify(outcome.outcome)}` },
|
|
114
|
-
},
|
|
115
|
-
});
|
|
116
|
-
return { stopReason: 'end_turn' };
|
|
117
|
-
})
|
|
118
|
-
.connect(stream);
|
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bun
|
|
2
|
-
// Mock ACP agent for acp/bridge.test.ts. Stands in for `claude-agent-acp` so the
|
|
3
|
-
// bridge can be exercised without a real `claude` install. Implements the
|
|
4
|
-
// minimal handshake (initialize + session/new + session/prompt) and streams one
|
|
5
|
-
// `agent_message_chunk` whose text echoes whether ANTHROPIC_API_KEY survived
|
|
6
|
-
// into the child env — it MUST read `<unset>`, proving scrubAgentEnv (DDR-123
|
|
7
|
-
// guardrail #1) stripped it before spawn.
|
|
8
|
-
//
|
|
9
|
-
// session/load simulates the REAL adapter's cross-restart resume (this is a
|
|
10
|
-
// fresh subprocess per test, so it has no memory of a prior session/new call —
|
|
11
|
-
// exactly like the real claude-agent-acp adapter after an app restart, whose
|
|
12
|
-
// resume is backed by the underlying `claude` CLI's own on-disk store, not its
|
|
13
|
-
// own process memory). Any sessionId resolves EXCEPT the `not-found` sentinel
|
|
14
|
-
// (simulates a pruned/unresumable session), so a test controls resume
|
|
15
|
-
// success/failure by choosing which id it persists. It also emits one replay
|
|
16
|
-
// `session/update` BEFORE resolving, mirroring claude-agent-acp's
|
|
17
|
-
// `replaySessionHistory` — bridge.ts must not forward or re-transcript it.
|
|
18
|
-
|
|
19
|
-
import { Readable, Writable } from 'node:stream';
|
|
20
|
-
|
|
21
|
-
import * as acp from '@agentclientprotocol/sdk';
|
|
22
|
-
|
|
23
|
-
const stream = acp.ndJsonStream(Writable.toWeb(process.stdout), Readable.toWeb(process.stdin));
|
|
24
|
-
|
|
25
|
-
acp
|
|
26
|
-
.agent({ name: 'mock-acp-agent' })
|
|
27
|
-
.onRequest('initialize', () => ({
|
|
28
|
-
protocolVersion: acp.PROTOCOL_VERSION,
|
|
29
|
-
agentCapabilities: { loadSession: true },
|
|
30
|
-
}))
|
|
31
|
-
.onRequest(
|
|
32
|
-
'session/new',
|
|
33
|
-
(() => {
|
|
34
|
-
let n = 0;
|
|
35
|
-
return () => ({ sessionId: `mock-session-${++n}` });
|
|
36
|
-
})()
|
|
37
|
-
)
|
|
38
|
-
.onRequest('session/load', async (ctx) => {
|
|
39
|
-
if (ctx.params.sessionId === 'not-found') {
|
|
40
|
-
throw new Error('session not found');
|
|
41
|
-
}
|
|
42
|
-
await ctx.client.notify('session/update', {
|
|
43
|
-
sessionId: ctx.params.sessionId,
|
|
44
|
-
update: {
|
|
45
|
-
sessionUpdate: 'agent_message_chunk',
|
|
46
|
-
content: { type: 'text', text: 'REPLAYED-HISTORY-SHOULD-NOT-SURFACE' },
|
|
47
|
-
},
|
|
48
|
-
});
|
|
49
|
-
return {};
|
|
50
|
-
})
|
|
51
|
-
.onRequest('session/prompt', async (ctx) => {
|
|
52
|
-
// The per-request handler context exposes the client connection at `.client`.
|
|
53
|
-
await ctx.client.notify('session/update', {
|
|
54
|
-
sessionId: ctx.params.sessionId,
|
|
55
|
-
update: {
|
|
56
|
-
sessionUpdate: 'agent_message_chunk',
|
|
57
|
-
content: {
|
|
58
|
-
type: 'text',
|
|
59
|
-
text:
|
|
60
|
-
`apiKey=${process.env.ANTHROPIC_API_KEY ?? '<unset>'} ` +
|
|
61
|
-
`model=${process.env.ANTHROPIC_MODEL ?? '<unset>'} ` +
|
|
62
|
-
`thinking=${process.env.MAX_THINKING_TOKENS ?? '<unset>'} ` +
|
|
63
|
-
`claudeExe=${process.env.CLAUDE_CODE_EXECUTABLE ?? '<unset>'}`,
|
|
64
|
-
},
|
|
65
|
-
},
|
|
66
|
-
});
|
|
67
|
-
return { stopReason: 'end_turn' };
|
|
68
|
-
})
|
|
69
|
-
.connect(stream);
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
// Test fixture for issue #107 — a `claude` stand-in whose `auth status --json`
|
|
3
|
-
// stdout is exactly what the test asks for. Lets a test pin the wrapper-noise
|
|
4
|
-
// shape it cares about (banner line, brace-bearing noise, trailing chatter,
|
|
5
|
-
// pure garbage) without a fixture per case.
|
|
6
|
-
//
|
|
7
|
-
// FAKE_CLAUDE_OUT verbatim stdout, for the small cases.
|
|
8
|
-
// FAKE_CLAUDE_HEAD / FAKE_CLAUDE_PAD_BYTES / FAKE_CLAUDE_TAIL
|
|
9
|
-
// head + N generated filler bytes + tail. The padding is
|
|
10
|
-
// generated HERE because a multi-MiB env var exceeds the
|
|
11
|
-
// exec argument/environment limit — passing it in makes the
|
|
12
|
-
// spawn fail with E2BIG, which a test would misread as the
|
|
13
|
-
// parser rejecting the input.
|
|
14
|
-
//
|
|
15
|
-
// No `process.exit()` after the write: on a pipe a large write completes
|
|
16
|
-
// asynchronously, and an explicit exit truncates it. Let the process end on its
|
|
17
|
-
// own once stdout has drained, so multi-MiB cases deliver every byte.
|
|
18
|
-
const [, , cmd, sub] = process.argv;
|
|
19
|
-
if (cmd !== 'auth' || sub !== 'status') {
|
|
20
|
-
process.exitCode = 1;
|
|
21
|
-
} else if (process.env.FAKE_CLAUDE_PAD_BYTES) {
|
|
22
|
-
process.stdout.write(process.env.FAKE_CLAUDE_HEAD ?? '');
|
|
23
|
-
process.stdout.write('x'.repeat(Number(process.env.FAKE_CLAUDE_PAD_BYTES)));
|
|
24
|
-
process.stdout.write(process.env.FAKE_CLAUDE_TAIL ?? '');
|
|
25
|
-
} else {
|
|
26
|
-
process.stdout.write(process.env.FAKE_CLAUDE_OUT ?? '');
|
|
27
|
-
}
|