copper-pilot-cli 0.1.10__tar.gz → 1.0.0__tar.gz
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.
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/HISTORY.md +312 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/PKG-INFO +6 -3
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/README.md +4 -1
- copper_pilot_cli-1.0.0/VERSION +1 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/docs/cli.md +81 -17
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/docs/development.md +3 -1
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/docs/harness.md +55 -12
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/pyproject.toml +1 -1
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/src/copper_pilot_cli/copper_acp.py +334 -26
- copper_pilot_cli-1.0.0/src/copper_pilot_cli/copper_api.py +186 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/src/copper_pilot_cli/copper_app.py +256 -66
- copper_pilot_cli-1.0.0/src/copper_pilot_cli/copper_chrome.py +558 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/src/copper_pilot_cli/copper_config.py +42 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/src/copper_pilot_cli/copper_graph.py +39 -17
- copper_pilot_cli-1.0.0/src/copper_pilot_cli/copper_logo.py +25 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/src/copper_pilot_cli/copper_main.py +49 -3
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/src/copper_pilot_cli/copper_mcp.py +163 -11
- copper_pilot_cli-1.0.0/src/copper_pilot_cli/copper_models.py +303 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/src/copper_pilot_cli/copper_preferences.py +36 -5
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/src/copper_pilot_cli/copper_presentation.py +225 -87
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/src/copper_pilot_cli/copper_protocol.py +232 -35
- copper_pilot_cli-1.0.0/src/copper_pilot_cli/copper_theme.py +258 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/src/copper_pilot_cli/copper_widgets.py +485 -84
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/src/copper_pilot_cli/copper_workspace.py +24 -15
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/src/copper_pilot_cli/deepagents_tools.py +48 -21
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/src/copper_pilot_cli/langchain.py +4 -0
- copper_pilot_cli-1.0.0/src/copper_pilot_cli/tool_batch.py +244 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/src/copper_pilot_cli/validate/design.py +16 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/src/copper_pilot_cli/validate/reviewer.py +7 -4
- copper_pilot_cli-1.0.0/tests/conftest.py +32 -0
- copper_pilot_cli-1.0.0/tests/snapshots/approval.txt +5 -0
- copper_pilot_cli-1.0.0/tests/snapshots/idle-input-120-ascii.txt +12 -0
- copper_pilot_cli-1.0.0/tests/snapshots/idle-input-120-color.txt +12 -0
- copper_pilot_cli-1.0.0/tests/snapshots/idle-input-120-nocolor.txt +8 -0
- copper_pilot_cli-1.0.0/tests/snapshots/idle-input-50-ascii.txt +10 -0
- copper_pilot_cli-1.0.0/tests/snapshots/idle-input-50-color.txt +10 -0
- copper_pilot_cli-1.0.0/tests/snapshots/idle-input-50-nocolor.txt +8 -0
- copper_pilot_cli-1.0.0/tests/snapshots/idle-input-80-ascii.txt +12 -0
- copper_pilot_cli-1.0.0/tests/snapshots/idle-input-80-color.txt +12 -0
- copper_pilot_cli-1.0.0/tests/snapshots/idle-input-80-nocolor.txt +8 -0
- copper_pilot_cli-1.0.0/tests/snapshots/slash-menu.txt +7 -0
- copper_pilot_cli-1.0.0/tests/snapshots/status-agent-balanced.txt +9 -0
- copper_pilot_cli-1.0.0/tests/snapshots/status-agent-intelligence.txt +9 -0
- copper_pilot_cli-1.0.0/tests/snapshots/status-ask-balanced.txt +9 -0
- copper_pilot_cli-1.0.0/tests/snapshots/status-ask-intelligence.txt +9 -0
- copper_pilot_cli-1.0.0/tests/snapshots/status-plan-balanced.txt +9 -0
- copper_pilot_cli-1.0.0/tests/snapshots/status-plan-intelligence.txt +9 -0
- copper_pilot_cli-1.0.0/tests/snapshots/welcome-120-ascii.txt +24 -0
- copper_pilot_cli-1.0.0/tests/snapshots/welcome-120-color.txt +32 -0
- copper_pilot_cli-1.0.0/tests/snapshots/welcome-120-nocolor.txt +12 -0
- copper_pilot_cli-1.0.0/tests/snapshots/welcome-50-ascii.txt +20 -0
- copper_pilot_cli-1.0.0/tests/snapshots/welcome-50-color.txt +20 -0
- copper_pilot_cli-1.0.0/tests/snapshots/welcome-50-nocolor.txt +12 -0
- copper_pilot_cli-1.0.0/tests/snapshots/welcome-80-ascii.txt +24 -0
- copper_pilot_cli-1.0.0/tests/snapshots/welcome-80-color.txt +32 -0
- copper_pilot_cli-1.0.0/tests/snapshots/welcome-80-nocolor.txt +12 -0
- copper_pilot_cli-1.0.0/tests/snapshots/working-color.txt +7 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/tests/test_acp.py +629 -12
- copper_pilot_cli-1.0.0/tests/test_chrome_snapshots.py +464 -0
- copper_pilot_cli-1.0.0/tests/test_copper_api.py +212 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/tests/test_durability.py +200 -6
- copper_pilot_cli-1.0.0/tests/test_graph_batch.py +52 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/tests/test_langchain.py +21 -0
- copper_pilot_cli-1.0.0/tests/test_logo.py +10 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/tests/test_main.py +31 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/tests/test_mcp.py +188 -7
- copper_pilot_cli-1.0.0/tests/test_models.py +259 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/tests/test_protocol.py +119 -4
- copper_pilot_cli-1.0.0/tests/test_protocol_batch.py +255 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/tests/test_release_gates.py +4 -1
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/tests/test_sessions.py +20 -1
- copper_pilot_cli-1.0.0/tests/test_themes_and_speed.py +242 -0
- copper_pilot_cli-1.0.0/tests/test_tool_batch.py +284 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/tests/test_tui.py +148 -5
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/tests/test_validate.py +72 -0
- copper_pilot_cli-1.0.0/tests/test_workspace.py +103 -0
- copper_pilot_cli-0.1.10/VERSION +0 -1
- copper_pilot_cli-0.1.10/src/copper_pilot_cli/copper_api.py +0 -77
- copper_pilot_cli-0.1.10/src/copper_pilot_cli/copper_theme.py +0 -34
- copper_pilot_cli-0.1.10/tests/test_copper_api.py +0 -63
- copper_pilot_cli-0.1.10/tests/test_workspace.py +0 -32
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/.claude-plugin/marketplace.json +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/.gitignore +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/CODE_OF_CONDUCT.md +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/CONTRIBUTING.md +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/LICENSE +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/NOTICE +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/SECURITY.md +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/SUPPORT.md +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/UPSTREAM.md +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/docs/assets/esp32-mini-1-h4.gif +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/docs/assets/logo-dark.png +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/docs/assets/logo-light.png +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/docs/assets/logo.png +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/docs/validate.md +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/examples/.gitignore +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/examples/001_esp32/.copperpilot/PLANS.md +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/examples/001_esp32/.copperpilot/README.md +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/examples/001_esp32/.copperpilot/TOOLS.md +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/examples/001_esp32/.copperpilot/plans/esp32-dev-board.plan.md +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/examples/001_esp32/.gitignore +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/examples/001_esp32/README.md +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/examples/001_esp32/esp32/3d-models/SW-SMD_L3.9-W2.9-H2.0-LS4.8.step +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/examples/001_esp32/esp32/3d-models/TYPE-C-31-M-12.step +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/examples/001_esp32/esp32/esp32.kicad_pcb +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/examples/001_esp32/esp32/esp32.kicad_pro +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/examples/001_esp32/esp32/esp32.kicad_sch +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/examples/001_esp32/esp32/esp32.png +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/examples/001_esp32/helper.py +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/examples/001_esp32/main.py +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/examples/002_cm5_camera/.copperpilot/PLANS.md +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/examples/002_cm5_camera/.copperpilot/README.md +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/examples/002_cm5_camera/.copperpilot/plans/cm5-camera-carrier.plan.md +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/examples/002_cm5_camera/.gitignore +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/examples/002_cm5_camera/README.md +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/examples/002_cm5_camera/assembly_spec.json +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/examples/002_cm5_camera/cm5_camera/3dmodels/CM4.step +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/examples/002_cm5_camera/cm5_camera/3dmodels/CM5.step +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/examples/002_cm5_camera/cm5_camera/3dmodels/Camera_IMX219-D160.step +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/examples/002_cm5_camera/cm5_camera/3dmodels/USB_A_Molex_105057-0001_Vertical.wrl +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/examples/002_cm5_camera/cm5_camera/3dmodels/USB_A_vertical.step +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/examples/002_cm5_camera/cm5_camera/CM5.3dshapes/5033981892.stp +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/examples/002_cm5_camera/cm5_camera/CM5.3dshapes/DF40C-100DS.stp +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/examples/002_cm5_camera/cm5_camera/CM5.3dshapes/JTHDA-19F08.STEP +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/examples/002_cm5_camera/cm5_camera/CM5.3dshapes/SRP5030CC.stp +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/examples/002_cm5_camera/cm5_camera/cm5_camera.kicad_dru +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/examples/002_cm5_camera/cm5_camera/cm5_camera.kicad_pcb +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/examples/002_cm5_camera/cm5_camera/cm5_camera.kicad_pro +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/examples/002_cm5_camera/cm5_camera/cm5_camera.kicad_sch +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/examples/002_cm5_camera/cm5_camera/cm5_camera.kicad_sym +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/examples/002_cm5_camera/cm5_camera/cm5_camera.png +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/C_0402_1005Metric.kicad_mod +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/C_0805_2012Metric.kicad_mod +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/Camera_Module_IMX219-D160.kicad_mod +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/Crystal_SMD_3225-4Pin_3.2x2.5mm.kicad_mod +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/HDMI_Mini-C_Molex_47151-0001.kicad_mod +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/LED_0603_1608Metric.kicad_mod +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/L_Bourns_SRP5030CC.kicad_mod +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/L_CommonModeChoke_Coilank_ACM1210.kicad_mod +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/MOLEX_USB_67298-4090.kicad_mod +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/Molex_200528-0150_1x15-1MP_P1.00mm_Horizontal.kicad_mod +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/PinHeader_1x03_P2.54mm_Vertical.kicad_mod +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/PinHeader_2x20_P2.54mm_Vertical.kicad_mod +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/R_0402_1005Metric.kicad_mod +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/R_0603_1608Metric.kicad_mod +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/Raspberry-Pi-4-Compute-Module.kicad_mod +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/SDCARD_MOLEX_503398-1892.kicad_mod +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/SOT-23-5.kicad_mod +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/SW_SPST_PTS645Sx43SMTR92.kicad_mod +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/TSOT-23-6.kicad_mod +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/Texas_DRT-3.kicad_mod +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/UQFN-10_1.4x1.8mm_P0.4mm.kicad_mod +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/USB_C_Receptacle_GCT_USB4105-xx-A_16P_TopMnt_Horizontal.kicad_mod +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/examples/002_cm5_camera/cm5_camera/cm5_camera_bottom.png +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/examples/002_cm5_camera/cm5_camera/fp-lib-table +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/examples/002_cm5_camera/cm5_camera/sym-lib-table +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/examples/002_cm5_camera/generate_3d_models.py +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/examples/002_cm5_camera/helper.py +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/examples/002_cm5_camera/main.py +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/plugins/copper-pilot/.claude-plugin/plugin.json +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/plugins/copper-pilot/.mcp.json +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/plugins/copper-pilot/agents/copper-pilot.md +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/plugins/copper-pilot/skills/copper-pilot-review/SKILL.md +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/skills/copper-pilot-review/SKILL.md +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/src/copper_pilot_cli/__init__.py +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/src/copper_pilot_cli/__main__.py +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/src/copper_pilot_cli/_upstream/__init__.py +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/src/copper_pilot_cli/_upstream/dcode_0_1_69/PROVENANCE.json +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/src/copper_pilot_cli/_upstream/dcode_0_1_69/__init__.py +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/src/copper_pilot_cli/_upstream/dcode_0_1_69/diff_utils.py +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/src/copper_pilot_cli/_version.py +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/src/copper_pilot_cli/clipboard.py +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/src/copper_pilot_cli/copper_auth.py +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/src/copper_pilot_cli/copper_background.py +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/src/copper_pilot_cli/copper_features.py +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/src/copper_pilot_cli/copper_hooks.py +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/src/copper_pilot_cli/copper_status_events.py +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/src/copper_pilot_cli/copper_tools.py +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/src/copper_pilot_cli/copper_update.py +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/src/copper_pilot_cli/diagnostics.py +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/src/copper_pilot_cli/media_utils.py +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/src/copper_pilot_cli/py.typed +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/src/copper_pilot_cli/sessions.py +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/src/copper_pilot_cli/textual_patches.py +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/src/copper_pilot_cli/validate/__init__.py +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/src/copper_pilot_cli/validate/builtins.py +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/src/copper_pilot_cli/validate/cli.py +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/src/copper_pilot_cli/validate/config.py +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/src/copper_pilot_cli/validate/default.yaml +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/src/copper_pilot_cli/validate/kicad.py +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/src/copper_pilot_cli/validate/report.py +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/src/copper_pilot_cli/validate/runner.py +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/tests/test_auth.py +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/tests/test_clipboard.py +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/tests/test_cm5_camera_example.py +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/tests/test_e2e.py +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/tests/test_esp32_example.py +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/tests/test_features.py +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/tests/test_live_chat_e2e.py +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/tests/test_plugin_manifest.py +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/tests/test_preferences.py +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/tests/test_presentation.py +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/tests/test_status_events.py +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/tests/test_tools.py +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/tests/test_upstream_provenance.py +0 -0
- {copper_pilot_cli-0.1.10 → copper_pilot_cli-1.0.0}/tests/test_validate_live.py +0 -0
|
@@ -5,6 +5,317 @@ Changelog
|
|
|
5
5
|
(unreleased)
|
|
6
6
|
------------
|
|
7
7
|
|
|
8
|
+
Fix
|
|
9
|
+
~~~
|
|
10
|
+
- Do not count echoed request fields toward the stream byte budget.
|
|
11
|
+
[AdityaNG, Claude Opus 5.5]
|
|
12
|
+
|
|
13
|
+
The hosted service echoes the request `query` (and, in the final frame,
|
|
14
|
+
`context`) in every chat_response. A live probe showed the echo is ~97% of
|
|
15
|
+
each frame. A validate arch.review prompt is ~76 KB, so a long review on a
|
|
16
|
+
large board crossed the 64 MiB client budget after ~815 frames (2601 s)
|
|
17
|
+
although the hosted output itself was ~4.4 MB, and the check ERRORed with
|
|
18
|
+
"Chat exceeded the client stream byte budget."
|
|
19
|
+
|
|
20
|
+
The budget now counts frame bytes minus the echoed request fields the
|
|
21
|
+
client never reads, and the error names the counted size and frame count.
|
|
22
|
+
- Stop cutting long hosted answers at the 16 KB status limit. [AdityaNG,
|
|
23
|
+
Claude Opus 5.5]
|
|
24
|
+
|
|
25
|
+
Every hosted response frame went through sanitize_status, which caps
|
|
26
|
+
status lines at 16 KB. The hosted side can send a whole answer as one
|
|
27
|
+
response frame, so a validate review longer than 16 KB lost the end of
|
|
28
|
+
its findings JSON. The reviewer then found no json block, sent a repair
|
|
29
|
+
turn into the already huge thread, and the server refused it ("This
|
|
30
|
+
conversation is too large to continue"), so arch.review ERRORed. Chat
|
|
31
|
+
and ACP answers over 16 KB were cut the same way.
|
|
32
|
+
|
|
33
|
+
Response text now gets a 1 MiB bound; status and reasoning lines keep
|
|
34
|
+
16 KB. A validate check that fails with a hosted failed final also
|
|
35
|
+
records the hosted turn id, as chat does.
|
|
36
|
+
- Surface stalled or failed hosted turns instead of hanging. [AdityaNG,
|
|
37
|
+
Claude Opus 5.5]
|
|
38
|
+
|
|
39
|
+
Three ways a long ACP turn could hang or hide its cause:
|
|
40
|
+
|
|
41
|
+
- idle_frame_timeout was None, so a hosted server that kept the socket
|
|
42
|
+
(and keepalive) up but stopped sending hung the prompt forever. It now
|
|
43
|
+
defaults to 10 minutes (COPPER_PILOT_IDLE_TIMEOUT_SECONDS, 0 disables)
|
|
44
|
+
and raises the existing retryable CHAT_IDLE_TIMEOUT with the silence
|
|
45
|
+
length in the message. The hosted side heartbeats every 25 s.
|
|
46
|
+
- A failed hosted final (success false) still waited, unbounded, for
|
|
47
|
+
background shells and then ran a continuation turn. A runaway background
|
|
48
|
+
command held the hosted error back until the caller timed out, and a
|
|
49
|
+
continuation that succeeded still reported the stale error. A failed
|
|
50
|
+
final now ends the turn and kills leftover background processes.
|
|
51
|
+
- The hosted copy "CopperPilot ran into an error." carries no detail. The
|
|
52
|
+
ACP error now names the hosted turn id, and the client logs the failing
|
|
53
|
+
final frame's keys, so the server-side cause can be found.
|
|
54
|
+
- Guard the state lock with sys.platform so ty passes on Windows.
|
|
55
|
+
[AdityaNG, Claude Opus 5.5]
|
|
56
|
+
- Stop concurrent sessions racing on recent-projects state. [AdityaNG,
|
|
57
|
+
Claude Opus 5.5]
|
|
58
|
+
|
|
59
|
+
Every process wrote recent-projects.json (and config.json) through the
|
|
60
|
+
same fixed temp name, so parallel `copper-pilot acp` session starts moved
|
|
61
|
+
or clobbered each other's temp file and session/new failed with
|
|
62
|
+
FileNotFoundError on os.replace.
|
|
63
|
+
|
|
64
|
+
Writes now go through a per-write mkstemp temp file, the recent-projects
|
|
65
|
+
read-modify-write holds a POSIX flock so no entry is dropped, and the
|
|
66
|
+
bookkeeping logs instead of raising so it can never fail a session.
|
|
67
|
+
|
|
68
|
+
Other
|
|
69
|
+
~~~~~
|
|
70
|
+
- Merge pull request #37 from CopperPilot/fix/stream-byte-budget.
|
|
71
|
+
[Aditya]
|
|
72
|
+
|
|
73
|
+
fix: do not count echoed request fields toward the stream byte budget
|
|
74
|
+
- Merge pull request #35 from CopperPilot/fix/long-response-truncation.
|
|
75
|
+
[Aditya]
|
|
76
|
+
|
|
77
|
+
fix: stop cutting long hosted answers at the 16 KB status limit
|
|
78
|
+
- Merge pull request #33 from CopperPilot/fix/hosted-stream-stall.
|
|
79
|
+
[Aditya]
|
|
80
|
+
|
|
81
|
+
fix: surface stalled or failed hosted turns instead of hanging
|
|
82
|
+
- Merge pull request #34 from CopperPilot/fix/validate-hierarchical-
|
|
83
|
+
nets. [Aditya]
|
|
84
|
+
|
|
85
|
+
fix(validate): ground findings that cite label names of hierarchical nets
|
|
86
|
+
- Fix(validate): ground findings that cite label names of hierarchical
|
|
87
|
+
nets. [AdityaNG, Claude Opus 5.5]
|
|
88
|
+
|
|
89
|
+
KiCad names local and hierarchical label nets with their sheet path
|
|
90
|
+
("/RAIL_IO_3", "/power/RAIL_IO_3"), but reviewers cite the label
|
|
91
|
+
("RAIL_IO_3"). Grounding compared the cited name to the full net name
|
|
92
|
+
only, so every real finding on such a board was marked UNGROUNDED and
|
|
93
|
+
could never fail a blocking check (WARN / exit 3 instead of FAIL).
|
|
94
|
+
|
|
95
|
+
A cited net now grounds when it equals a design net name or is a
|
|
96
|
+
"/"-boundary suffix of one; invented names still do not.
|
|
97
|
+
- Merge pull request #32 from CopperPilot/fix/recent-projects-race.
|
|
98
|
+
[Aditya]
|
|
99
|
+
|
|
100
|
+
fix: stop concurrent ACP sessions racing on recent-projects state
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
0.1.11 (2026-10-25)
|
|
104
|
+
-------------------
|
|
105
|
+
|
|
106
|
+
Fix
|
|
107
|
+
~~~
|
|
108
|
+
- Do not block turn cancellation on loading-widget removal. [Cursor,
|
|
109
|
+
Naveen_Copperpilot]
|
|
110
|
+
|
|
111
|
+
Textual defers widget pruning to its message loop. Awaiting that removal during a cancelled turn could leave the turn task pending on Windows, so the cancellation cleanup test timed out.
|
|
112
|
+
- Require Pillow 13 so the security audit passes. [Cursor,
|
|
113
|
+
Naveen_Copperpilot]
|
|
114
|
+
|
|
115
|
+
Pillow 12.3.0 is the newest release the old pin allowed, and pip-audit fails the CI job on four advisories fixed in 13.0.0.
|
|
116
|
+
- Tell the type checker these widgets are Static. [Cursor,
|
|
117
|
+
Naveen_Copperpilot]
|
|
118
|
+
|
|
119
|
+
query() is typed as a generic widget, so ty rejected update() on the working line, the mode icon, and the input rules. CI stopped there before the tests ran.
|
|
120
|
+
- Retry a reconnect the server refuses with HTTP 503. [AdityaNG, Claude
|
|
121
|
+
Fable 5.1]
|
|
122
|
+
|
|
123
|
+
Every "server rejected WebSocket connection: HTTP 503" failure seen from
|
|
124
|
+
T3 Code follows the same sequence: the hosted pod restarts mid-stream
|
|
125
|
+
(no close frame), the stitched resume reconnects 5 s later while the
|
|
126
|
+
backend is still coming back, and the load balancer answers the upgrade
|
|
127
|
+
with 503. websockets raises InvalidStatus for that, which classify_error
|
|
128
|
+
did not know, so the turn was typed "unknown", non-retryable, and the
|
|
129
|
+
remaining attempt was never used.
|
|
130
|
+
|
|
131
|
+
- classify InvalidStatus by HTTP status (5xx/429 retry; auth and other
|
|
132
|
+
4xx fail fast) and InvalidHandshake without a status as a connection
|
|
133
|
+
drop
|
|
134
|
+
- include InvalidHandshake in the transport's pre-first-event retry
|
|
135
|
+
- stretch the turn budget to four attempts (5/10/20/30 s) so it outlasts
|
|
136
|
+
a typical pod restart
|
|
137
|
+
- regression tests for the drop-then-503 sequence and the transport retry
|
|
138
|
+
|
|
139
|
+
Other
|
|
140
|
+
~~~~~
|
|
141
|
+
- Release: version 0.1.11 🚀 [AdityaNG]
|
|
142
|
+
- Merge pull request #31 from naveen-
|
|
143
|
+
forkd/feat/cli_chat_chrome_2026_10_24. [Aditya]
|
|
144
|
+
|
|
145
|
+
Redraw the CLI chat screen, add themes, and make typing faster
|
|
146
|
+
- Test: wait until a tool is active before cancelling. [Cursor,
|
|
147
|
+
Naveen_Copperpilot]
|
|
148
|
+
- Test: wait for the loading widget to leave after cancel. [Cursor,
|
|
149
|
+
Naveen_Copperpilot]
|
|
150
|
+
|
|
151
|
+
Textual drops the widget on a later prune tick, so an immediate check still sees it on Windows.
|
|
152
|
+
- Test: run the suite in a UTF-8 locale. [Cursor, Naveen_Copperpilot]
|
|
153
|
+
|
|
154
|
+
Windows CI has no UTF-8 locale, so the app drew the ASCII fallback and the Unicode snapshots failed. The suite now sets a UTF-8 locale, and a test still checks that a C locale or COPPERPILOT_ASCII selects the fallback.
|
|
155
|
+
- Test: cover theme switching and the input hot path.
|
|
156
|
+
[Naveen_Copperpilot]
|
|
157
|
+
|
|
158
|
+
Check the presets, /theme persistence, idle typing, the pruned file index, and streamed Markdown that keeps closed blocks.
|
|
159
|
+
- Perf: keep typing, file completion, and streaming off the hot path.
|
|
160
|
+
[Naveen_Copperpilot]
|
|
161
|
+
|
|
162
|
+
Skip completion repaints when the matches did not change, and apply a pending @ filter before tab or enter. Build the file list in the background, skip ignored folders, and refresh it when it is stale. Append assistant Markdown only while a block is still open, so a finished paragraph or code fence is not replaced.
|
|
163
|
+
- Perf: import deepagents the first time a tool runs.
|
|
164
|
+
[Naveen_Copperpilot]
|
|
165
|
+
|
|
166
|
+
Opening the UI was paying for the tool stack at import. Load it on the first tool call instead.
|
|
167
|
+
- Test: keep the saved theme out of the suite. [Naveen_Copperpilot]
|
|
168
|
+
|
|
169
|
+
Point each test at a temporary CLI home and reset the shared palette. Live tests keep the real home so they can still load the device credential.
|
|
170
|
+
- Feat: let /theme switch presets and remember the choice.
|
|
171
|
+
[Naveen_Copperpilot]
|
|
172
|
+
|
|
173
|
+
/theme opens a picker or takes a name, writes it to config.json, and repaints the chrome that bakes colours into text.
|
|
174
|
+
- Feat: make near-black the default and add theme presets.
|
|
175
|
+
[Naveen_Copperpilot]
|
|
176
|
+
|
|
177
|
+
The warm stone background is now one preset. Black is the default, with warm, light, and high-contrast beside it. Snapshot colours read the active tokens, and the locale encoding is cached so glyph checks do not call locale.getencoding on every paint.
|
|
178
|
+
- Feat: redraw the prompt and bind shift+tab and ctrl+e.
|
|
179
|
+
[Naveen_Copperpilot]
|
|
180
|
+
|
|
181
|
+
Rules replace the rounded box, and one tip sits above them until the first message. shift+tab and ctrl+e were taken by focus movement and end-of-line, so those bindings now take priority and cycle mode and effort while the prompt is focused.
|
|
182
|
+
- Feat: replace the boxed header with a flat welcome and one status
|
|
183
|
+
line. [Naveen_Copperpilot]
|
|
184
|
+
|
|
185
|
+
Drop version, full path, and model from the header. Show the wordmark, repo, and quick start, and put mode and effort on the line under the prompt.
|
|
186
|
+
- Feat: add the plain-text layout for the chat chrome.
|
|
187
|
+
[Naveen_Copperpilot]
|
|
188
|
+
|
|
189
|
+
Welcome, status, slash rows, the working line, and tips are content the widgets render. Only commands, modes, and keys the CLI already has are included.
|
|
190
|
+
- Feat: draw the CopperPilot cube as a Braille mark.
|
|
191
|
+
[Naveen_Copperpilot]
|
|
192
|
+
|
|
193
|
+
Six rows of thirteen cells, one orange. The welcome omits it when the terminal is narrow, uncolored, or ASCII.
|
|
194
|
+
- Feat: switch the CLI theme to the warm orange palette.
|
|
195
|
+
[Naveen_Copperpilot]
|
|
196
|
+
|
|
197
|
+
One orange and warm neutrals, with the same layout in truecolor, 256-color, and NO_COLOR. Status green and red stay limited to tool results.
|
|
198
|
+
- Merge pull request #27 from
|
|
199
|
+
CopperPilot/feat/disable_model_selector_19_oct_2026. [Aditya]
|
|
200
|
+
|
|
201
|
+
feat: hide Intelligence model selection behind ENABLE_MODEL_SELECTOR (off)
|
|
202
|
+
- Feat: hide Intelligence model selection behind ENABLE_MODEL_SELECTOR
|
|
203
|
+
(off) [AdityaNG, Claude Opus 5.5]
|
|
204
|
+
|
|
205
|
+
Add ENABLE_MODEL_SELECTOR to copper_models, set to False. While it is off
|
|
206
|
+
no surface names a model or offers a choice, and every Intelligence turn
|
|
207
|
+
asks for the default model (Gemini 4 Argon), including threads saved with
|
|
208
|
+
another model. Balanced still sends no model. No server change.
|
|
209
|
+
|
|
210
|
+
- TUI: no /model command or completion, /context and /help omit the model.
|
|
211
|
+
- Headless: --model is not registered.
|
|
212
|
+
- MCP: no models tool, the model argument is dropped from the ask/plan/
|
|
213
|
+
run/resume schemas, and results omit model/answered_model.
|
|
214
|
+
- ACP: only mode and effort config options, no /model command, a model
|
|
215
|
+
config change is rejected, and effort copy names no model.
|
|
216
|
+
- Fallback notices use a generic "switched to a backup model" message.
|
|
217
|
+
|
|
218
|
+
Flipping the constant to True restores the previous behaviour; the
|
|
219
|
+
existing model-selection tests run with it on via a fixture.
|
|
220
|
+
- Merge pull request #28 from
|
|
221
|
+
CopperPilot/feat/agent_latency_cli_19_oct_2026. [Aditya]
|
|
222
|
+
|
|
223
|
+
Run tool_requests batches concurrently (parallel_tool_requests capability)
|
|
224
|
+
- Keep batched tool calls on one assistant message; test ACP overlap.
|
|
225
|
+
[AdityaNG, Claude Opus 5.5]
|
|
226
|
+
|
|
227
|
+
The transcript records a batch's calls on a single AIMessage so every
|
|
228
|
+
call is followed by its result whatever the completion order. ACP already
|
|
229
|
+
keys tool_call / tool_call_update by id; a test now covers three
|
|
230
|
+
overlapping calls completing out of order.
|
|
231
|
+
- Execute tool_requests batches concurrently over the chat socket.
|
|
232
|
+
[AdityaNG, Claude Opus 5.5]
|
|
233
|
+
|
|
234
|
+
chat_start advertises the parallel_tool_requests capability (disable with
|
|
235
|
+
COPPER_PILOT_PARALLEL_TOOLS=0). A batch frame yields one TOOL_REQUEST per
|
|
236
|
+
call, runs them with the scheduler and sends each tool_result, matched by
|
|
237
|
+
tool_call_id, as soon as it completes. Single tool_request frames are
|
|
238
|
+
unchanged. The hosted attempt is now closed deterministically so a
|
|
239
|
+
consumer that stops listening cancels running batch members, and the
|
|
240
|
+
local broker serializes approval and question prompts.
|
|
241
|
+
- Add a scheduler for parallel tool-request batches. [AdityaNG, Claude
|
|
242
|
+
Opus 5.5]
|
|
243
|
+
|
|
244
|
+
Classifies each hosted tool request as READ, MUTATING (keyed by path) or
|
|
245
|
+
EXCLUSIVE and runs a batch with model-order dependencies: reads overlap
|
|
246
|
+
(capped at 8), same-path mutations run in order, shell commands that are
|
|
247
|
+
not provably read-only run alone. Failures are reported per tool and
|
|
248
|
+
closing the batch cancels unfinished members.
|
|
249
|
+
- Merge pull request #26 from CopperPilot/feat/acp-usage-limit-reset.
|
|
250
|
+
[Aditya]
|
|
251
|
+
|
|
252
|
+
feat(acp): explain usage limits with their reset time
|
|
253
|
+
- Merge remote-tracking branch 'origin/main' into feat/acp-usage-limit-
|
|
254
|
+
reset. [AdityaNG]
|
|
255
|
+
|
|
256
|
+
# Conflicts:
|
|
257
|
+
# docs/cli.md
|
|
258
|
+
# src/copper_pilot_cli/copper_acp.py
|
|
259
|
+
# tests/test_acp.py
|
|
260
|
+
- Merge pull request #25 from CopperPilot/t3/intelligence-mode-model-
|
|
261
|
+
selection. [Aditya]
|
|
262
|
+
|
|
263
|
+
feat: Intelligence model selection across TUI, CLI, MCP, and ACP
|
|
264
|
+
- Feat: default Intelligence to Gemini 4 Argon, Gemini models first.
|
|
265
|
+
[AdityaNG, Claude Fable 5.1]
|
|
266
|
+
|
|
267
|
+
Mirror copper-pilot-client #98: the bundled catalog now lists the Gemini
|
|
268
|
+
models first and defaults Intelligence to gemini-4-argon. The server's
|
|
269
|
+
catalog order and default still win whenever it is reachable.
|
|
270
|
+
- Feat: Intelligence model selection across TUI, CLI, MCP, and ACP.
|
|
271
|
+
[AdityaNG, Claude Fable 5.1]
|
|
272
|
+
|
|
273
|
+
Mirror the desktop client's Intelligence model picker (copper-pilot#97):
|
|
274
|
+
Balanced always runs on the server's Balanced model; Intelligence turns
|
|
275
|
+
may pick one model from the hosted catalog (Claude Opus 5.5 default).
|
|
276
|
+
|
|
277
|
+
- copper_models: catalog fetched once per process from
|
|
278
|
+
GET /api/copperpilot/chat/models with the bundled list as fallback,
|
|
279
|
+
plus model_fallback status-event helpers.
|
|
280
|
+
- ChatRequest.model is sent only on Intelligence turns; the thread
|
|
281
|
+
checkpoint persists copper_model next to copper_effort.
|
|
282
|
+
- CLI --model (implies --effort intelligence), TUI /model and /context,
|
|
283
|
+
and model_fallback notices in the transcript and headless output.
|
|
284
|
+
- MCP: model argument on ask/plan/run/resume, a models tool, and
|
|
285
|
+
model/answered_model in results and the digest.
|
|
286
|
+
- ACP: a model config option (category model) next to effort
|
|
287
|
+
(thought_level); choosing a model selects Intelligence, Balanced pins
|
|
288
|
+
the option to the Balanced model, /model slash command, and fallback
|
|
289
|
+
notices as agent messages.
|
|
290
|
+
- Test(acp): accept a usage reset that falls after midnight. [AdityaNG,
|
|
291
|
+
Claude Opus 5.5]
|
|
292
|
+
- Feat(acp): explain usage limits with their reset time. [AdityaNG,
|
|
293
|
+
Claude Opus 5.5]
|
|
294
|
+
|
|
295
|
+
A turn refused by the usage window or weekly limit reached ACP clients as a
|
|
296
|
+
generic -32603 error whose text carried a raw UTC timestamp, or for a refused
|
|
297
|
+
handshake only "HTTP 402".
|
|
298
|
+
|
|
299
|
+
- Keep the reset time from the hosted error frame's detail
|
|
300
|
+
(window_ends_at / week_ends_at) on ProtocolError and the error event.
|
|
301
|
+
- ACP fails such a turn with code -32003 and a message naming the spent
|
|
302
|
+
limit and its local reset time ("It resets at 3:20 AM (in 2h 23m).");
|
|
303
|
+
data carries class=usage_limit, blockReason and resetAt. Without a reset
|
|
304
|
+
time in the frame, the token-limits endpoint fills it in; a bare 402 the
|
|
305
|
+
account view does not confirm (the Intelligence plan gate) is unchanged.
|
|
306
|
+
- The graph keeps a refused handshake's HTTP status on its error event.
|
|
307
|
+
- ACP drops the terminal "Attempt N failed" thought that repeated the error.
|
|
308
|
+
- New ACP /usage command shows the window, weekly balance and reset times.
|
|
309
|
+
- The TUI renders usage blocks with the same local reset time.
|
|
310
|
+
- Merge pull request #24 from CopperPilot/fix/retry-refused-handshake.
|
|
311
|
+
[Aditya]
|
|
312
|
+
|
|
313
|
+
fix: retry a reconnect the server refuses with HTTP 503
|
|
314
|
+
|
|
315
|
+
|
|
316
|
+
0.1.10 (2026-10-18)
|
|
317
|
+
-------------------
|
|
318
|
+
|
|
8
319
|
Fix
|
|
9
320
|
~~~
|
|
10
321
|
- Skip the killed-background resume test on Windows. [AdityaNG, Cursor]
|
|
@@ -17,6 +328,7 @@ Fix
|
|
|
17
328
|
|
|
18
329
|
Other
|
|
19
330
|
~~~~~
|
|
331
|
+
- Release: version 0.1.10 🚀 [AdityaNG]
|
|
20
332
|
- Merge pull request #23 from CopperPilot/feat/acp-image-prompts.
|
|
21
333
|
[Aditya]
|
|
22
334
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: copper-pilot-cli
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 1.0.0
|
|
4
4
|
Summary: CopperPilot hosted agent for the terminal and LangChain
|
|
5
5
|
Project-URL: Homepage, https://copperpilot.ai
|
|
6
6
|
Project-URL: Repository, https://github.com/CopperPilot/copper-pilot-cli
|
|
@@ -29,7 +29,7 @@ Requires-Dist: langgraph<2,>=1.2
|
|
|
29
29
|
Requires-Dist: markdownify<2,>=1.2
|
|
30
30
|
Requires-Dist: mcp<2,>=1.21
|
|
31
31
|
Requires-Dist: packaging<27,>=25
|
|
32
|
-
Requires-Dist: pillow<13
|
|
32
|
+
Requires-Dist: pillow<14,>=13
|
|
33
33
|
Requires-Dist: pydantic<3,>=2.12
|
|
34
34
|
Requires-Dist: pyperclip<2,>=1.11
|
|
35
35
|
Requires-Dist: pyyaml<7,>=6
|
|
@@ -118,7 +118,9 @@ Both `copper-pilot` and `copper-pilot-cli` run the same program.
|
|
|
118
118
|
command reference.
|
|
119
119
|
|
|
120
120
|
Balanced effort is the default. Paid-plan users can select Intelligence with
|
|
121
|
-
`--effort intelligence` or interactive `/effort
|
|
121
|
+
`--effort intelligence` or interactive `/effort`; Intelligence runs on Gemini 4
|
|
122
|
+
Argon. Picking another model (`--model <id>`, `/model`) is turned off for now
|
|
123
|
+
(`ENABLE_MODEL_SELECTOR` in `copper_models.py`). Intelligence uses
|
|
122
124
|
server-owned survey subagents and shows their lifecycle through the existing
|
|
123
125
|
Deep Agents task rows; Intelligence Plan turns survey before writing a plan.
|
|
124
126
|
|
|
@@ -183,6 +185,7 @@ PLAN = CopperMode.PLAN
|
|
|
183
185
|
copper_pilot = CopperPilotAgent(
|
|
184
186
|
workspace="esp32",
|
|
185
187
|
effort=CopperEffort.INTELLIGENCE,
|
|
188
|
+
model="claude-opus-5-5", # optional; Intelligence defaults to Gemini 4 Argon
|
|
186
189
|
)
|
|
187
190
|
|
|
188
191
|
run(copper_pilot, "Build me an ESP32 dev board.", PLAN)
|
|
@@ -64,7 +64,9 @@ Both `copper-pilot` and `copper-pilot-cli` run the same program.
|
|
|
64
64
|
command reference.
|
|
65
65
|
|
|
66
66
|
Balanced effort is the default. Paid-plan users can select Intelligence with
|
|
67
|
-
`--effort intelligence` or interactive `/effort
|
|
67
|
+
`--effort intelligence` or interactive `/effort`; Intelligence runs on Gemini 4
|
|
68
|
+
Argon. Picking another model (`--model <id>`, `/model`) is turned off for now
|
|
69
|
+
(`ENABLE_MODEL_SELECTOR` in `copper_models.py`). Intelligence uses
|
|
68
70
|
server-owned survey subagents and shows their lifecycle through the existing
|
|
69
71
|
Deep Agents task rows; Intelligence Plan turns survey before writing a plan.
|
|
70
72
|
|
|
@@ -129,6 +131,7 @@ PLAN = CopperMode.PLAN
|
|
|
129
131
|
copper_pilot = CopperPilotAgent(
|
|
130
132
|
workspace="esp32",
|
|
131
133
|
effort=CopperEffort.INTELLIGENCE,
|
|
134
|
+
model="claude-opus-5-5", # optional; Intelligence defaults to Gemini 4 Argon
|
|
132
135
|
)
|
|
133
136
|
|
|
134
137
|
run(copper_pilot, "Build me an ESP32 dev board.", PLAN)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
1.0.0
|
|
@@ -33,6 +33,7 @@ valid.
|
|
|
33
33
|
| `--json` | Emit JSON events (or a final JSON document with `--no-stream`). |
|
|
34
34
|
| `--mode {agent,plan,ask}` | Hosted chat mode. Default: `agent`. |
|
|
35
35
|
| `--effort {balanced,intelligence}` | Hosted effort. Default: `balanced`; Intelligence requires a paid plan. |
|
|
36
|
+
| `--model MODEL` | Intelligence model id (see below). Implies `--effort intelligence`; rejected with `--effort balanced`. |
|
|
36
37
|
| `-y`, `--auto-approve` | Auto approval: routine writes and known-safe shell still run; unknown actions prompt. |
|
|
37
38
|
| `--yolo` | Permit local side effects without prompting. Must be set explicitly. |
|
|
38
39
|
| `--version` | Print the package version. |
|
|
@@ -45,6 +46,7 @@ copper-pilot --resume
|
|
|
45
46
|
copper-pilot -n -m "Review this board" --json
|
|
46
47
|
copper-pilot ./my-board --mode plan -m "Propose a power tree"
|
|
47
48
|
copper-pilot ./my-board --mode plan --effort intelligence -m "Survey and plan the power tree"
|
|
49
|
+
copper-pilot ./my-board --model gpt-6.1-sol -m "Review the USB-C front end"
|
|
48
50
|
```
|
|
49
51
|
|
|
50
52
|
Headless mode is also used when `--message` is set and stdout is not a TTY.
|
|
@@ -97,15 +99,18 @@ write to stdout; the protocol owns it.
|
|
|
97
99
|
| Tool | Role |
|
|
98
100
|
|------|------|
|
|
99
101
|
| `status` | Login state and discovered schematic/PCB paths. No hosted call. |
|
|
100
|
-
| `
|
|
101
|
-
| `
|
|
102
|
-
| `
|
|
103
|
-
| `
|
|
102
|
+
| `models` | Intelligence model ids, labels, prices, and the Balanced model. No hosted turn. |
|
|
103
|
+
| `ask` | `--mode ask`. Auto approval. Optional `thread_id`, `effort`, `model`. |
|
|
104
|
+
| `plan` | `--mode plan`. Auto approval. Optional `effort`, `model`. |
|
|
105
|
+
| `run` | `--mode agent`. Optional `effort`, `model`; `approval` is `auto` (default) or `yolo`. |
|
|
106
|
+
| `resume` | Continue `thread_id`. Optional `mode`, `effort`, `model`, and the same approval as `run`. |
|
|
104
107
|
| `threads_list` | List threads for this workspace (`limit`, `all_workspaces`). |
|
|
105
108
|
| `validate` | Read-only stage-gated review; returns `verdict`, `exit_code`, `report_path`, `next_actions`. |
|
|
106
109
|
|
|
107
110
|
Workspace is the tool argument, else `CLAUDE_PROJECT_DIR`, else the process
|
|
108
|
-
current directory. Manual approval is TUI-only.
|
|
111
|
+
current directory. Manual approval is TUI-only. Passing `model` selects
|
|
112
|
+
Intelligence on that model; the result carries `model` (requested) and
|
|
113
|
+
`answered_model` (after any server fallback). See [harness.md](harness.md).
|
|
109
114
|
|
|
110
115
|
## ACP
|
|
111
116
|
|
|
@@ -125,14 +130,15 @@ advertises a terminal auth method that runs `copper-pilot auth login`.
|
|
|
125
130
|
| ACP feature | CopperPilot behavior |
|
|
126
131
|
|-------------|----------------------|
|
|
127
132
|
| Session modes | `ask`, `plan`, `agent` (default `agent`) |
|
|
128
|
-
| Config options | `mode
|
|
133
|
+
| Config options | `mode`, `effort` (`balanced` default, `intelligence` paid), and `model` (category `model`; the Intelligence catalog) |
|
|
129
134
|
| `session/load` | Resumes an existing thread id and replays its history |
|
|
130
135
|
| `session/request_permission` | Auto approval; non-routine writes and shell prompt the editor |
|
|
131
136
|
| `elicitation/create` | Clarifying questions (options or free text) when the client advertises form elicitation |
|
|
132
137
|
| `session/cancel` | Cancels the hosted turn and local tools |
|
|
133
138
|
| `usage_update` | Prompt tokens of the latest hosted turn; window size is unknown (0) |
|
|
134
139
|
| `plan` | Hosted todo list events and `.copperpilot/plans/*.plan.md` todos |
|
|
135
|
-
| `available_commands_update` | `/effort balanced\|intelligence`, answered locally |
|
|
140
|
+
| `available_commands_update` | `/effort balanced\|intelligence`, `/model [id]`, and `/usage`, answered locally |
|
|
141
|
+
| Prompt error `-32003` | A usage limit refused the turn; see below |
|
|
136
142
|
|
|
137
143
|
"Allow all for this session" switches that session to YOLO until the server
|
|
138
144
|
exits; it is never saved. Clarifying questions use ACP form elicitation when
|
|
@@ -146,7 +152,29 @@ Intelligence survey workers appear as `think` tool calls named
|
|
|
146
152
|
`Survey: <task>` whose status and output track the worker.
|
|
147
153
|
See [harness.md](harness.md).
|
|
148
154
|
|
|
149
|
-
|
|
155
|
+
A turn refused by a usage limit fails with JSON-RPC error `-32003` (the code
|
|
156
|
+
xAI's Grok ACP agent uses for the same condition). The message names the
|
|
157
|
+
spent limit and when it lifts in local time, for example `CopperPilot usage
|
|
158
|
+
limit reached: the current usage window is used up. It resets at 3:20 AM (in
|
|
159
|
+
2h 23m).` `data` repeats it for clients that render a usage-limit notice:
|
|
160
|
+
|
|
161
|
+
```json
|
|
162
|
+
{
|
|
163
|
+
"details": "CopperPilot usage limit reached: ...",
|
|
164
|
+
"class": "usage_limit",
|
|
165
|
+
"blockReason": "window",
|
|
166
|
+
"resetAt": "2026-10-19T21:50:00Z",
|
|
167
|
+
"canPurchaseOverage": false,
|
|
168
|
+
"retryable": false
|
|
169
|
+
}
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
When the hosted error carries no reset time (a refused handshake), the server
|
|
173
|
+
reads it from the token-limits endpoint. A team cost cap, billing, or busy
|
|
174
|
+
block has no reset time and keeps the hosted wording. `/usage` prints the
|
|
175
|
+
current window, weekly balance, and reset times without a hosted turn.
|
|
176
|
+
|
|
177
|
+
## Effort, Intelligence, and models
|
|
150
178
|
|
|
151
179
|
Balanced is the default. Intelligence is available on paid plans and lets the
|
|
152
180
|
hosted parent run one to four survey subagents. Intelligence Plan turns survey
|
|
@@ -154,10 +182,41 @@ before creating or revising a plan. Workers are server-owned, survey-only, and
|
|
|
154
182
|
appear in the TUI through the existing Deep Agents task rows; they do not open
|
|
155
183
|
nested chats or execute through the local tool broker.
|
|
156
184
|
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
`
|
|
185
|
+
> **Model selection is currently off.** `ENABLE_MODEL_SELECTOR` in
|
|
186
|
+
> `src/copper_pilot_cli/copper_models.py` is `False`: every Intelligence turn
|
|
187
|
+
> runs on Gemini 4 Argon, no surface names a model, and `--model`, `/model`,
|
|
188
|
+
> the MCP `models` tool and `model` argument, and the ACP `model` config option
|
|
189
|
+
> are not offered. A fallback notice reads "Switched this chat to a backup
|
|
190
|
+
> model." The rest of this section describes the behaviour when it is `True`.
|
|
191
|
+
|
|
192
|
+
Balanced always runs on the server's Balanced model (Google Gemini 3.8 Flash);
|
|
193
|
+
there is no model choice on a free account. Intelligence runs on one model
|
|
194
|
+
from the catalog, Gemini 4 Argon by default (the server's catalog order and
|
|
195
|
+
default win when it is reachable):
|
|
196
|
+
|
|
197
|
+
| Id | Model |
|
|
198
|
+
|----|-------|
|
|
199
|
+
| `gemini-4-argon` | Google Gemini 4 Argon (Intelligence default) |
|
|
200
|
+
| `gemini-3.8-flash` | Google Gemini 3.8 Flash (Balanced model) |
|
|
201
|
+
| `claude-opus-5-5` | Claude Opus 5.5 |
|
|
202
|
+
| `claude-sonnet-5-5` | Claude Sonnet 5.5 |
|
|
203
|
+
| `gpt-6-astra` | OpenAI GPT-6 Astra |
|
|
204
|
+
| `gpt-6.1-sol` | OpenAI GPT-6.1 Sol |
|
|
205
|
+
|
|
206
|
+
The list is fetched from `GET /api/copperpilot/chat/models` once per process
|
|
207
|
+
and falls back to this bundled copy when the deployment does not publish it.
|
|
208
|
+
Choosing a model selects Intelligence, the same rule as the desktop picker;
|
|
209
|
+
`--effort balanced` together with `--model` is an error. The model is sent
|
|
210
|
+
only on Intelligence turns and the server resolves unknown ids to the default.
|
|
211
|
+
|
|
212
|
+
The interactive `/effort` and `/model [id]` commands change effort and model
|
|
213
|
+
for the current thread; `/context` shows the model the next turn will use.
|
|
214
|
+
Resuming a thread restores both; a new thread starts Balanced. When the
|
|
215
|
+
selected model is unavailable the server falls back to a Gemini model and
|
|
216
|
+
sends a `model_fallback` status event; the TUI posts its message in the
|
|
217
|
+
transcript, headless mode prints it in yellow, and `--json` retains the raw
|
|
218
|
+
`status_event`. In headless text mode, worker state changes print as compact
|
|
219
|
+
lines.
|
|
161
220
|
|
|
162
221
|
Interactive clarification can offer suggested answers, custom text, or Skip
|
|
163
222
|
and waits without a client timeout. Headless and MCP calls cannot present that
|
|
@@ -219,14 +278,16 @@ Every front-end (TUI, headless, MCP, ACP) runs a hosted turn through the same
|
|
|
219
278
|
checkpointed graph node, which mirrors the desktop client's chat manager:
|
|
220
279
|
|
|
221
280
|
- A stream that drops before the final frame (socket close, timeout, 5xx, 429)
|
|
222
|
-
|
|
281
|
+
or a reconnect that the server refuses at the websocket handshake (HTTP 503
|
|
282
|
+
while a backend restarts, 429, other 5xx) is retried up to four times with
|
|
283
|
+
5 s, 10 s, 20 s, and 30 s backoff. The retry
|
|
223
284
|
re-prompts the hosted agent with the partial transcript and
|
|
224
285
|
`Resume where we left off: <original message>` so it continues rather than
|
|
225
286
|
restarting. Deterministic failures (4xx other than 429, invalid or oversized
|
|
226
287
|
requests, plan refusals, auth) fail immediately.
|
|
227
288
|
- Retry progress is visible: the TUI status bar and a notification, a yellow
|
|
228
289
|
line in headless text mode, MCP progress, and ACP agent thoughts
|
|
229
|
-
(`Retrying (1/
|
|
290
|
+
(`Retrying (1/3) in 5s: …`). `--json` emits `copper.retry` events.
|
|
230
291
|
- The websocket close code and reason are carried into the error message
|
|
231
292
|
(`close code 1011 received: …`) and the log file.
|
|
232
293
|
- Whatever a failed turn produced before the error (assistant text, tool calls
|
|
@@ -266,15 +327,18 @@ as an object:
|
|
|
266
327
|
"status": 402,
|
|
267
328
|
"block_reason": "weekly",
|
|
268
329
|
"can_purchase_overage": true,
|
|
269
|
-
"retryable": false
|
|
330
|
+
"retryable": false,
|
|
331
|
+
"resets_at": "2026-10-21T02:56:47Z"
|
|
270
332
|
}
|
|
271
333
|
}
|
|
272
334
|
```
|
|
273
335
|
|
|
274
|
-
`
|
|
336
|
+
`resets_at` is present for a `window` or `weekly` block when the server sends
|
|
337
|
+
the reset time. `block_reason` is `window`, `weekly`, `cost_cap`, `busy`, or `billing` when
|
|
275
338
|
the server sends one. A `busy` block and an ordinary rate limit use status
|
|
276
339
|
`429` with `retryable: true`. `can_purchase_overage` only says whether the
|
|
277
|
-
billing page can offer additional usage. The Textual UI prints `message
|
|
340
|
+
billing page can offer additional usage. The Textual UI prints `message`,
|
|
341
|
+
with a window or weekly reset time in local time (`It resets at 3:20 AM (in 2h 23m).`).
|
|
278
342
|
|
|
279
343
|
## Configuration
|
|
280
344
|
|
|
@@ -88,7 +88,9 @@ the object.
|
|
|
88
88
|
`classify_error` in `copper_protocol.py` ports the desktop client's error
|
|
89
89
|
categories (`timeout`, `connection`, `server`, `rate_limit`, `usage_limit`,
|
|
90
90
|
`authentication`, `invalid_request`, `payload_too_large`, `protocol`,
|
|
91
|
-
`network`, `aborted`, `unknown`) with a `retryable` flag
|
|
91
|
+
`network`, `aborted`, `unknown`) with a `retryable` flag, including websocket
|
|
92
|
+
handshakes the server refuses with an HTTP status (`InvalidStatus`: 5xx and
|
|
93
|
+
429 retry, auth and other 4xx do not). The graph node in
|
|
92
94
|
`copper_graph.py` owns the retry loop, the stitched "Resume where we left off"
|
|
93
95
|
re-prompt, partial-progress checkpointing, and the background shell wait;
|
|
94
96
|
`copper_background.py` owns the foreground-to-background shell contract.
|