copper-pilot-cli 0.1.7__tar.gz → 0.1.8__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.8/HISTORY.md +217 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/PKG-INFO +15 -6
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/README.md +11 -2
- copper_pilot_cli-0.1.8/VERSION +1 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/docs/cli.md +55 -4
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/docs/development.md +34 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/docs/harness.md +18 -6
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/plugins/copper-pilot/agents/copper-pilot.md +2 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/pyproject.toml +3 -3
- copper_pilot_cli-0.1.8/src/copper_pilot_cli/copper_api.py +77 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/src/copper_pilot_cli/copper_app.py +145 -15
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/src/copper_pilot_cli/copper_auth.py +2 -1
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/src/copper_pilot_cli/copper_graph.py +43 -4
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/src/copper_pilot_cli/copper_main.py +42 -5
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/src/copper_pilot_cli/copper_mcp.py +89 -8
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/src/copper_pilot_cli/copper_protocol.py +127 -18
- copper_pilot_cli-0.1.8/src/copper_pilot_cli/copper_status_events.py +76 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/src/copper_pilot_cli/copper_widgets.py +18 -1
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/src/copper_pilot_cli/deepagents_tools.py +5 -6
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/src/copper_pilot_cli/langchain.py +9 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/src/copper_pilot_cli/sessions.py +3 -3
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/tests/test_auth.py +2 -0
- copper_pilot_cli-0.1.8/tests/test_copper_api.py +63 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/tests/test_langchain.py +21 -2
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/tests/test_main.py +15 -1
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/tests/test_mcp.py +84 -2
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/tests/test_protocol.py +129 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/tests/test_release_gates.py +1 -1
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/tests/test_sessions.py +71 -2
- copper_pilot_cli-0.1.8/tests/test_status_events.py +51 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/tests/test_tools.py +29 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/tests/test_tui.py +188 -7
- copper_pilot_cli-0.1.7/HISTORY.md +0 -95
- copper_pilot_cli-0.1.7/VERSION +0 -1
- copper_pilot_cli-0.1.7/src/copper_pilot_cli/copper_api.py +0 -24
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/.claude-plugin/marketplace.json +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/.gitignore +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/CODE_OF_CONDUCT.md +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/CONTRIBUTING.md +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/LICENSE +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/NOTICE +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/SECURITY.md +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/SUPPORT.md +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/UPSTREAM.md +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/docs/assets/esp32-mini-1-h4.gif +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/docs/assets/logo-dark.png +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/docs/assets/logo-light.png +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/docs/assets/logo.png +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/examples/.gitignore +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/examples/001_esp32/.copperpilot/PLANS.md +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/examples/001_esp32/.copperpilot/README.md +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/examples/001_esp32/.copperpilot/TOOLS.md +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/examples/001_esp32/.copperpilot/plans/esp32-dev-board.plan.md +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/examples/001_esp32/.gitignore +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/examples/001_esp32/README.md +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/examples/001_esp32/esp32/3d-models/SW-SMD_L3.9-W2.9-H2.0-LS4.8.step +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/examples/001_esp32/esp32/3d-models/TYPE-C-31-M-12.step +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/examples/001_esp32/esp32/esp32.kicad_pcb +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/examples/001_esp32/esp32/esp32.kicad_pro +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/examples/001_esp32/esp32/esp32.kicad_sch +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/examples/001_esp32/esp32/esp32.png +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/examples/001_esp32/helper.py +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/examples/001_esp32/main.py +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/examples/002_cm5_camera/.copperpilot/PLANS.md +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/examples/002_cm5_camera/.copperpilot/README.md +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/examples/002_cm5_camera/.copperpilot/plans/cm5-camera-carrier.plan.md +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/examples/002_cm5_camera/.gitignore +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/examples/002_cm5_camera/README.md +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/examples/002_cm5_camera/assembly_spec.json +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/examples/002_cm5_camera/cm5_camera/3dmodels/CM4.step +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/examples/002_cm5_camera/cm5_camera/3dmodels/CM5.step +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/examples/002_cm5_camera/cm5_camera/3dmodels/Camera_IMX219-D160.step +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/examples/002_cm5_camera/cm5_camera/3dmodels/USB_A_Molex_105057-0001_Vertical.wrl +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/examples/002_cm5_camera/cm5_camera/3dmodels/USB_A_vertical.step +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/examples/002_cm5_camera/cm5_camera/CM5.3dshapes/5033981892.stp +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/examples/002_cm5_camera/cm5_camera/CM5.3dshapes/DF40C-100DS.stp +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/examples/002_cm5_camera/cm5_camera/CM5.3dshapes/JTHDA-19F08.STEP +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/examples/002_cm5_camera/cm5_camera/CM5.3dshapes/SRP5030CC.stp +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/examples/002_cm5_camera/cm5_camera/cm5_camera.kicad_dru +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/examples/002_cm5_camera/cm5_camera/cm5_camera.kicad_pcb +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/examples/002_cm5_camera/cm5_camera/cm5_camera.kicad_pro +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/examples/002_cm5_camera/cm5_camera/cm5_camera.kicad_sch +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/examples/002_cm5_camera/cm5_camera/cm5_camera.kicad_sym +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/examples/002_cm5_camera/cm5_camera/cm5_camera.png +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/C_0402_1005Metric.kicad_mod +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/C_0805_2012Metric.kicad_mod +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/Camera_Module_IMX219-D160.kicad_mod +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/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.7 → copper_pilot_cli-0.1.8}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/HDMI_Mini-C_Molex_47151-0001.kicad_mod +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/LED_0603_1608Metric.kicad_mod +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/L_Bourns_SRP5030CC.kicad_mod +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/L_CommonModeChoke_Coilank_ACM1210.kicad_mod +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/MOLEX_USB_67298-4090.kicad_mod +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/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.7 → copper_pilot_cli-0.1.8}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/PinHeader_1x03_P2.54mm_Vertical.kicad_mod +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/PinHeader_2x20_P2.54mm_Vertical.kicad_mod +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/R_0402_1005Metric.kicad_mod +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/R_0603_1608Metric.kicad_mod +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/Raspberry-Pi-4-Compute-Module.kicad_mod +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/SDCARD_MOLEX_503398-1892.kicad_mod +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/SOT-23-5.kicad_mod +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/SW_SPST_PTS645Sx43SMTR92.kicad_mod +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/TSOT-23-6.kicad_mod +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/Texas_DRT-3.kicad_mod +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/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.7 → copper_pilot_cli-0.1.8}/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.7 → copper_pilot_cli-0.1.8}/examples/002_cm5_camera/cm5_camera/cm5_camera_bottom.png +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/examples/002_cm5_camera/cm5_camera/fp-lib-table +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/examples/002_cm5_camera/cm5_camera/sym-lib-table +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/examples/002_cm5_camera/generate_3d_models.py +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/examples/002_cm5_camera/helper.py +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/examples/002_cm5_camera/main.py +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/plugins/copper-pilot/.claude-plugin/plugin.json +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/plugins/copper-pilot/.mcp.json +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/plugins/copper-pilot/skills/copper-pilot-review/SKILL.md +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/skills/copper-pilot-review/SKILL.md +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/src/copper_pilot_cli/__init__.py +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/src/copper_pilot_cli/__main__.py +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/src/copper_pilot_cli/_upstream/__init__.py +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/src/copper_pilot_cli/_upstream/dcode_0_1_69/PROVENANCE.json +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/src/copper_pilot_cli/_upstream/dcode_0_1_69/__init__.py +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/src/copper_pilot_cli/_upstream/dcode_0_1_69/diff_utils.py +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/src/copper_pilot_cli/_version.py +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/src/copper_pilot_cli/clipboard.py +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/src/copper_pilot_cli/copper_config.py +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/src/copper_pilot_cli/copper_features.py +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/src/copper_pilot_cli/copper_hooks.py +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/src/copper_pilot_cli/copper_preferences.py +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/src/copper_pilot_cli/copper_presentation.py +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/src/copper_pilot_cli/copper_theme.py +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/src/copper_pilot_cli/copper_tools.py +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/src/copper_pilot_cli/copper_update.py +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/src/copper_pilot_cli/copper_workspace.py +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/src/copper_pilot_cli/diagnostics.py +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/src/copper_pilot_cli/media_utils.py +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/src/copper_pilot_cli/py.typed +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/src/copper_pilot_cli/textual_patches.py +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/tests/test_clipboard.py +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/tests/test_cm5_camera_example.py +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/tests/test_e2e.py +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/tests/test_esp32_example.py +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/tests/test_features.py +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/tests/test_live_chat_e2e.py +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/tests/test_plugin_manifest.py +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/tests/test_preferences.py +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/tests/test_presentation.py +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/tests/test_upstream_provenance.py +0 -0
- {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/tests/test_workspace.py +0 -0
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
Changelog
|
|
2
|
+
=========
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
(unreleased)
|
|
6
|
+
------------
|
|
7
|
+
|
|
8
|
+
Fix
|
|
9
|
+
~~~
|
|
10
|
+
- Annotate async context managers for ty 0.0.87. [AdityaNG]
|
|
11
|
+
|
|
12
|
+
CI resolves the unpinned ty dependency to 0.0.87, which rejects AsyncIterator returns on asynccontextmanager.
|
|
13
|
+
- Upgrade the pinned Deep Agents runtime to 0.7.19. [AdityaNG]
|
|
14
|
+
|
|
15
|
+
Keep the exact runtime pin while picking up the filesystem and media-handling fixes from 0.7.14.
|
|
16
|
+
- Align the CLI with hosted usage limits. [AdityaNG]
|
|
17
|
+
|
|
18
|
+
Keep blocked turns machine-readable, shrink oversized resumed chats to the desktop frame budget, and report the installed client version.
|
|
19
|
+
|
|
20
|
+
Other
|
|
21
|
+
~~~~~
|
|
22
|
+
- Merge pull request #16 from CopperPilot/update/14_oct_2026. [Aditya]
|
|
23
|
+
|
|
24
|
+
Add Intelligence effort, hosted survey workers, and modal keyboard focus
|
|
25
|
+
- Fix(tests/test_tui.py) [AdityaNG]
|
|
26
|
+
- Feat(src/copper_pilot_cli/copper_status_events.py) [AdityaNG]
|
|
27
|
+
- Merge pull request #3 from
|
|
28
|
+
CopperPilot/dependabot/github_actions/softprops/action-gh-release-3.
|
|
29
|
+
[Aditya]
|
|
30
|
+
|
|
31
|
+
build(deps): bump softprops/action-gh-release from 2 to 3
|
|
32
|
+
- Build(deps): bump softprops/action-gh-release from 2 to 3.
|
|
33
|
+
[dependabot[bot]]
|
|
34
|
+
|
|
35
|
+
Bumps [softprops/action-gh-release](https://github.com/softprops/action-gh-release) from 2 to 3.
|
|
36
|
+
- [Release notes](https://github.com/softprops/action-gh-release/releases)
|
|
37
|
+
- [Changelog](https://github.com/softprops/action-gh-release/blob/master/CHANGELOG.md)
|
|
38
|
+
- [Commits](https://github.com/softprops/action-gh-release/compare/v2...v3)
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
updated-dependencies:
|
|
42
|
+
- dependency-name: softprops/action-gh-release
|
|
43
|
+
dependency-version: '3'
|
|
44
|
+
dependency-type: direct:production
|
|
45
|
+
update-type: version-update:semver-major
|
|
46
|
+
...
|
|
47
|
+
- Merge pull request #4 from CopperPilot/dependabot/pip/websockets-
|
|
48
|
+
gte-15-and-lt-18. [Aditya]
|
|
49
|
+
|
|
50
|
+
build(deps): update websockets requirement from <17,>=15 to >=15,<18
|
|
51
|
+
- Build(deps): update websockets requirement from <17,>=15 to >=15,<18.
|
|
52
|
+
[dependabot[bot]]
|
|
53
|
+
|
|
54
|
+
Updates the requirements on [websockets](https://github.com/python-websockets/websockets) to permit the latest version.
|
|
55
|
+
- [Release notes](https://github.com/python-websockets/websockets/releases)
|
|
56
|
+
- [Commits](https://github.com/python-websockets/websockets/compare/15.0...17.1)
|
|
57
|
+
|
|
58
|
+
---
|
|
59
|
+
updated-dependencies:
|
|
60
|
+
- dependency-name: websockets
|
|
61
|
+
dependency-version: '17.1'
|
|
62
|
+
dependency-type: direct:production
|
|
63
|
+
...
|
|
64
|
+
- Merge pull request #5 from CopperPilot/dependabot/pip/uuid-utils-
|
|
65
|
+
gte-0.12-and-lt-2. [Aditya]
|
|
66
|
+
|
|
67
|
+
build(deps): update uuid-utils requirement from <1,>=0.12 to >=0.12,<2
|
|
68
|
+
- Build(deps): update uuid-utils requirement from <1,>=0.12 to
|
|
69
|
+
>=0.12,<2. [dependabot[bot]]
|
|
70
|
+
|
|
71
|
+
Updates the requirements on [uuid-utils](https://github.com/aminalaee/uuid-utils) to permit the latest version.
|
|
72
|
+
- [Release notes](https://github.com/aminalaee/uuid-utils/releases)
|
|
73
|
+
- [Commits](https://github.com/aminalaee/uuid-utils/compare/0.12.0...1.0.0)
|
|
74
|
+
|
|
75
|
+
---
|
|
76
|
+
updated-dependencies:
|
|
77
|
+
- dependency-name: uuid-utils
|
|
78
|
+
dependency-version: 1.0.0
|
|
79
|
+
dependency-type: direct:production
|
|
80
|
+
...
|
|
81
|
+
- Merge pull request #2 from
|
|
82
|
+
CopperPilot/dependabot/github_actions/actions/setup-python-7. [Aditya]
|
|
83
|
+
|
|
84
|
+
build(deps): bump actions/setup-python from 5 to 7
|
|
85
|
+
- Build(deps): bump actions/setup-python from 5 to 7. [dependabot[bot]]
|
|
86
|
+
|
|
87
|
+
Bumps [actions/setup-python](https://github.com/actions/setup-python) from 5 to 7.
|
|
88
|
+
- [Release notes](https://github.com/actions/setup-python/releases)
|
|
89
|
+
- [Commits](https://github.com/actions/setup-python/compare/v5...v7)
|
|
90
|
+
|
|
91
|
+
---
|
|
92
|
+
updated-dependencies:
|
|
93
|
+
- dependency-name: actions/setup-python
|
|
94
|
+
dependency-version: '7'
|
|
95
|
+
dependency-type: direct:production
|
|
96
|
+
update-type: version-update:semver-major
|
|
97
|
+
...
|
|
98
|
+
- Merge pull request #13 from
|
|
99
|
+
CopperPilot/update/deepagents_0_7_19_3_oct. [Aditya]
|
|
100
|
+
|
|
101
|
+
Upgrade the pinned Deep Agents runtime to 0.7.19
|
|
102
|
+
- Merge pull request #1 from
|
|
103
|
+
CopperPilot/dependabot/github_actions/actions/checkout-7. [Aditya]
|
|
104
|
+
|
|
105
|
+
build(deps): bump actions/checkout from 4 to 7
|
|
106
|
+
- Build(deps): bump actions/checkout from 4 to 7. [dependabot[bot]]
|
|
107
|
+
|
|
108
|
+
Bumps [actions/checkout](https://github.com/actions/checkout) from 4 to 7.
|
|
109
|
+
- [Release notes](https://github.com/actions/checkout/releases)
|
|
110
|
+
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
|
|
111
|
+
- [Commits](https://github.com/actions/checkout/compare/v4...v7)
|
|
112
|
+
|
|
113
|
+
---
|
|
114
|
+
updated-dependencies:
|
|
115
|
+
- dependency-name: actions/checkout
|
|
116
|
+
dependency-version: '7'
|
|
117
|
+
dependency-type: direct:production
|
|
118
|
+
update-type: version-update:semver-major
|
|
119
|
+
...
|
|
120
|
+
- Merge pull request #12 from
|
|
121
|
+
CopperPilot/update/contract_alignment_3_oct. [Aditya]
|
|
122
|
+
|
|
123
|
+
Align the CLI with hosted usage limits
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
0.1.7 (2026-10-03)
|
|
127
|
+
------------------
|
|
128
|
+
- Release: version 0.1.7 🚀 [AdityaNG]
|
|
129
|
+
- Merge pull request #11 from
|
|
130
|
+
CopperPilot/feat/python_versions_support_expansion. [Aditya]
|
|
131
|
+
|
|
132
|
+
Support Python 3.11 and future releases
|
|
133
|
+
- Ci: probe Python 3.15 weekly instead of on pull requests. [AdityaNG]
|
|
134
|
+
|
|
135
|
+
Keep the upstream install failure visible without turning required pull request checks red.
|
|
136
|
+
- Feat(py11) [AdityaNG]
|
|
137
|
+
- Merge pull request #7 from CopperPilot/feat/example_002_cm5_camera.
|
|
138
|
+
[Aditya]
|
|
139
|
+
|
|
140
|
+
feat(examples/002_cm5_camera): add 3D pose audit and generated carrier
|
|
141
|
+
- Fix(examples/002_cm5_camera): render the README PCB as a dimetric 3D
|
|
142
|
+
view. [AdityaNG, Cursor]
|
|
143
|
+
|
|
144
|
+
Use an orthogonal high-quality camera with a slight isometric tilt so the
|
|
145
|
+
hero PNG shows connector height instead of a flat top-down shot.
|
|
146
|
+
- Fix(examples/002_cm5_camera): skip library dirs relative to the
|
|
147
|
+
workspace. [AdityaNG, Cursor]
|
|
148
|
+
|
|
149
|
+
Absolute path parts named tmp (Linux /tmp pytest roots) were skipping the
|
|
150
|
+
entire haystack, so libraries_ready failed on Ubuntu CI.
|
|
151
|
+
- Feat(examples/002_cm5_camera): add 3D pose audit and generated
|
|
152
|
+
carrier. [AdityaNG, Cursor]
|
|
153
|
+
|
|
154
|
+
Lock connector 3D offsets, Module1 pad orientation, and the generated
|
|
155
|
+
KiCad project so the example reproduces NANO-C assembly parity.
|
|
156
|
+
- Feat(examples/002_cm5_camera/main.py): new example. [AdityaNG]
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
0.1.6 (2026-09-18)
|
|
160
|
+
------------------
|
|
161
|
+
- Release: version 0.1.6 🚀 [AdityaNG]
|
|
162
|
+
- Merge pull request #6 from CopperPilot/feat/plugins. [Aditya]
|
|
163
|
+
|
|
164
|
+
feat: add MCP conductor and Claude Code plugin
|
|
165
|
+
- Clarify server restrictions in PR template. [Aditya]
|
|
166
|
+
|
|
167
|
+
Updated checklist item to clarify server restrictions.
|
|
168
|
+
- Feat: add MCP conductor and Claude Code plugin. [AdityaNG, Cursor]
|
|
169
|
+
|
|
170
|
+
Let Claude Code, Cursor, and Codex delegate electronics work to the hosted agent via copper-pilot mcp, a portable review skill, and an in-repo plugin.
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
0.1.5 (2026-09-17)
|
|
174
|
+
------------------
|
|
175
|
+
- Release: version 0.1.5 🚀 [AdityaNG]
|
|
176
|
+
- Fix(README.md) [AdityaNG]
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
0.1.4 (2026-09-17)
|
|
180
|
+
------------------
|
|
181
|
+
- Release: version 0.1.4 🚀 [AdityaNG]
|
|
182
|
+
- Fix(tests/test_release_gates.py) [AdityaNG]
|
|
183
|
+
|
|
184
|
+
|
|
185
|
+
0.1.3 (2026-09-17)
|
|
186
|
+
------------------
|
|
187
|
+
- Release: version 0.1.3 🚀 [AdityaNG]
|
|
188
|
+
- Docs. [AdityaNG]
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
0.1.2 (2026-09-17)
|
|
192
|
+
------------------
|
|
193
|
+
- Release: version 0.1.2 🚀 [AdityaNG]
|
|
194
|
+
- Ci(pyproject.toml) [AdityaNG]
|
|
195
|
+
- Fix(tests/test_tui.py) [AdityaNG]
|
|
196
|
+
|
|
197
|
+
|
|
198
|
+
0.1.1 (2026-09-17)
|
|
199
|
+
------------------
|
|
200
|
+
- Release: version 0.1.1 🚀 [AdityaNG]
|
|
201
|
+
|
|
202
|
+
|
|
203
|
+
0.1.0 (2026-09-17)
|
|
204
|
+
------------------
|
|
205
|
+
- Release: version 0.1.0 🚀 [AdityaNG]
|
|
206
|
+
- Fix(tests/test_release_gates.py) [AdityaNG]
|
|
207
|
+
- Test. [AdityaNG]
|
|
208
|
+
- Docs. [AdityaNG]
|
|
209
|
+
- Docs. [AdityaNG]
|
|
210
|
+
- Example(examples/001_esp32/) [AdityaNG]
|
|
211
|
+
- Makefile. [AdityaNG]
|
|
212
|
+
- Ci. [AdityaNG]
|
|
213
|
+
- Docs. [AdityaNG]
|
|
214
|
+
- Refactor(name) [AdityaNG]
|
|
215
|
+
- Init. [AdityaNG]
|
|
216
|
+
|
|
217
|
+
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: copper-pilot-cli
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.8
|
|
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
|
|
@@ -21,7 +21,7 @@ Classifier: Programming Language :: Python :: 3.14
|
|
|
21
21
|
Requires-Python: >=3.11
|
|
22
22
|
Requires-Dist: aiosqlite<1,>=0.22
|
|
23
23
|
Requires-Dist: certifi>=2024.8.30
|
|
24
|
-
Requires-Dist: deepagents==0.7.
|
|
24
|
+
Requires-Dist: deepagents==0.7.19
|
|
25
25
|
Requires-Dist: httpx<1,>=0.28
|
|
26
26
|
Requires-Dist: langchain-core<2,>=1.6
|
|
27
27
|
Requires-Dist: langgraph-checkpoint-sqlite<4,>=3.1
|
|
@@ -35,8 +35,8 @@ Requires-Dist: pyperclip<2,>=1.11
|
|
|
35
35
|
Requires-Dist: pyyaml<7,>=6
|
|
36
36
|
Requires-Dist: rich<16,>=15
|
|
37
37
|
Requires-Dist: textual<9,>=8.2.8
|
|
38
|
-
Requires-Dist: uuid-utils<
|
|
39
|
-
Requires-Dist: websockets<
|
|
38
|
+
Requires-Dist: uuid-utils<2,>=0.12
|
|
39
|
+
Requires-Dist: websockets<18,>=15
|
|
40
40
|
Provides-Extra: dev
|
|
41
41
|
Requires-Dist: build<2,>=1.4; extra == 'dev'
|
|
42
42
|
Requires-Dist: gitchangelog==3.0.4; extra == 'dev'
|
|
@@ -107,12 +107,18 @@ copper-pilot ./my-board
|
|
|
107
107
|
copper-pilot --resume
|
|
108
108
|
copper-pilot threads list
|
|
109
109
|
copper-pilot -n -m "Review this board" --json
|
|
110
|
+
copper-pilot --mode plan --effort intelligence -m "Survey and plan this board"
|
|
110
111
|
```
|
|
111
112
|
|
|
112
113
|
Both `copper-pilot` and `copper-pilot-cli` run the same program.
|
|
113
114
|
`copper-pilot --help` lists flags; [docs/cli.md](docs/cli.md) is the full
|
|
114
115
|
command reference.
|
|
115
116
|
|
|
117
|
+
Balanced effort is the default. Paid-plan users can select Intelligence with
|
|
118
|
+
`--effort intelligence` or interactive `/effort`. Intelligence uses
|
|
119
|
+
server-owned survey subagents and shows their lifecycle through the existing
|
|
120
|
+
Deep Agents task rows; Intelligence Plan turns survey before writing a plan.
|
|
121
|
+
|
|
116
122
|
## Use from Claude Code, Cursor, or Codex
|
|
117
123
|
|
|
118
124
|
CopperPilot stays the electronics agent. Copy
|
|
@@ -147,13 +153,16 @@ the parent directory is mode `0700` and the file is mode `0600`.
|
|
|
147
153
|
## LangChain
|
|
148
154
|
|
|
149
155
|
```python
|
|
150
|
-
from copper_pilot_cli.copper_protocol import CopperMode
|
|
156
|
+
from copper_pilot_cli.copper_protocol import CopperEffort, CopperMode
|
|
151
157
|
from copper_pilot_cli.langchain import CopperPilotAgent
|
|
152
158
|
from helper import drc_violations, erc_errors, render_pcb, run
|
|
153
159
|
|
|
154
160
|
PLAN = CopperMode.PLAN
|
|
155
161
|
|
|
156
|
-
copper_pilot = CopperPilotAgent(
|
|
162
|
+
copper_pilot = CopperPilotAgent(
|
|
163
|
+
workspace="esp32",
|
|
164
|
+
effort=CopperEffort.INTELLIGENCE,
|
|
165
|
+
)
|
|
157
166
|
|
|
158
167
|
run(copper_pilot, "Build me an ESP32 dev board.", PLAN)
|
|
159
168
|
run(copper_pilot, "Let us build this plan.")
|
|
@@ -56,12 +56,18 @@ copper-pilot ./my-board
|
|
|
56
56
|
copper-pilot --resume
|
|
57
57
|
copper-pilot threads list
|
|
58
58
|
copper-pilot -n -m "Review this board" --json
|
|
59
|
+
copper-pilot --mode plan --effort intelligence -m "Survey and plan this board"
|
|
59
60
|
```
|
|
60
61
|
|
|
61
62
|
Both `copper-pilot` and `copper-pilot-cli` run the same program.
|
|
62
63
|
`copper-pilot --help` lists flags; [docs/cli.md](docs/cli.md) is the full
|
|
63
64
|
command reference.
|
|
64
65
|
|
|
66
|
+
Balanced effort is the default. Paid-plan users can select Intelligence with
|
|
67
|
+
`--effort intelligence` or interactive `/effort`. Intelligence uses
|
|
68
|
+
server-owned survey subagents and shows their lifecycle through the existing
|
|
69
|
+
Deep Agents task rows; Intelligence Plan turns survey before writing a plan.
|
|
70
|
+
|
|
65
71
|
## Use from Claude Code, Cursor, or Codex
|
|
66
72
|
|
|
67
73
|
CopperPilot stays the electronics agent. Copy
|
|
@@ -96,13 +102,16 @@ the parent directory is mode `0700` and the file is mode `0600`.
|
|
|
96
102
|
## LangChain
|
|
97
103
|
|
|
98
104
|
```python
|
|
99
|
-
from copper_pilot_cli.copper_protocol import CopperMode
|
|
105
|
+
from copper_pilot_cli.copper_protocol import CopperEffort, CopperMode
|
|
100
106
|
from copper_pilot_cli.langchain import CopperPilotAgent
|
|
101
107
|
from helper import drc_violations, erc_errors, render_pcb, run
|
|
102
108
|
|
|
103
109
|
PLAN = CopperMode.PLAN
|
|
104
110
|
|
|
105
|
-
copper_pilot = CopperPilotAgent(
|
|
111
|
+
copper_pilot = CopperPilotAgent(
|
|
112
|
+
workspace="esp32",
|
|
113
|
+
effort=CopperEffort.INTELLIGENCE,
|
|
114
|
+
)
|
|
106
115
|
|
|
107
116
|
run(copper_pilot, "Build me an ESP32 dev board.", PLAN)
|
|
108
117
|
run(copper_pilot, "Let us build this plan.")
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
0.1.8
|
|
@@ -30,6 +30,7 @@ valid.
|
|
|
30
30
|
| `--no-stream` | Print the final assistant message after the run instead of streaming. |
|
|
31
31
|
| `--json` | Emit JSON events (or a final JSON document with `--no-stream`). |
|
|
32
32
|
| `--mode {agent,plan,ask}` | Hosted chat mode. Default: `agent`. |
|
|
33
|
+
| `--effort {balanced,intelligence}` | Hosted effort. Default: `balanced`; Intelligence requires a paid plan. |
|
|
33
34
|
| `-y`, `--auto-approve` | Auto approval: routine writes and known-safe shell still run; unknown actions prompt. |
|
|
34
35
|
| `--yolo` | Permit local side effects without prompting. Must be set explicitly. |
|
|
35
36
|
| `--version` | Print the package version. |
|
|
@@ -41,6 +42,7 @@ copper-pilot ./my-board
|
|
|
41
42
|
copper-pilot --resume
|
|
42
43
|
copper-pilot -n -m "Review this board" --json
|
|
43
44
|
copper-pilot ./my-board --mode plan -m "Propose a power tree"
|
|
45
|
+
copper-pilot ./my-board --mode plan --effort intelligence -m "Survey and plan the power tree"
|
|
44
46
|
```
|
|
45
47
|
|
|
46
48
|
Headless mode is also used when `--message` is set and stdout is not a TTY.
|
|
@@ -60,15 +62,33 @@ write to stdout; the protocol owns it.
|
|
|
60
62
|
| Tool | Role |
|
|
61
63
|
|------|------|
|
|
62
64
|
| `status` | Login state and discovered schematic/PCB paths. No hosted call. |
|
|
63
|
-
| `ask` | `--mode ask`. Auto approval. Optional `thread_id`. |
|
|
64
|
-
| `plan` | `--mode plan`. Auto approval. |
|
|
65
|
-
| `run` | `--mode agent`. `approval` is `auto` (default) or `yolo`. |
|
|
66
|
-
| `resume` | Continue `thread_id`.
|
|
65
|
+
| `ask` | `--mode ask`. Auto approval. Optional `thread_id` and `effort`. |
|
|
66
|
+
| `plan` | `--mode plan`. Auto approval. Optional `effort`. |
|
|
67
|
+
| `run` | `--mode agent`. Optional `effort`; `approval` is `auto` (default) or `yolo`. |
|
|
68
|
+
| `resume` | Continue `thread_id`. Optional `mode`, `effort`, and the same approval as `run`. |
|
|
67
69
|
| `threads_list` | List threads for this workspace (`limit`, `all_workspaces`). |
|
|
68
70
|
|
|
69
71
|
Workspace is the tool argument, else `CLAUDE_PROJECT_DIR`, else the process
|
|
70
72
|
current directory. Manual approval is TUI-only. See [harness.md](harness.md).
|
|
71
73
|
|
|
74
|
+
## Effort and Intelligence
|
|
75
|
+
|
|
76
|
+
Balanced is the default. Intelligence is available on paid plans and lets the
|
|
77
|
+
hosted parent run one to four survey subagents. Intelligence Plan turns survey
|
|
78
|
+
before creating or revising a plan. Workers are server-owned, survey-only, and
|
|
79
|
+
appear in the TUI through the existing Deep Agents task rows; they do not open
|
|
80
|
+
nested chats or execute through the local tool broker.
|
|
81
|
+
|
|
82
|
+
The interactive `/effort` command changes effort for the current thread.
|
|
83
|
+
Resuming that thread restores it; a new thread starts Balanced. In headless
|
|
84
|
+
text mode, worker state changes print as compact lines. `--json` retains raw
|
|
85
|
+
`status_event` objects.
|
|
86
|
+
|
|
87
|
+
Interactive clarification can offer suggested answers, custom text, or Skip
|
|
88
|
+
and waits without a client timeout. Headless and MCP calls cannot present that
|
|
89
|
+
UI, so an `ask_user_question` tool request is rejected with a clear error
|
|
90
|
+
instead of guessing or auto-skipping.
|
|
91
|
+
|
|
72
92
|
## Auth
|
|
73
93
|
|
|
74
94
|
```console
|
|
@@ -118,6 +138,37 @@ searches run freely. Writes, edits, deletes, and shell commands are gated:
|
|
|
118
138
|
|
|
119
139
|
`--yolo` wins over `--auto-approve`. Saved preferences never enable YOLO.
|
|
120
140
|
|
|
141
|
+
## Usage limits
|
|
142
|
+
|
|
143
|
+
The hosted service owns weekly and window usage. The CLI does not show raw
|
|
144
|
+
token balances, sell credits, or complete checkout.
|
|
145
|
+
|
|
146
|
+
Inside the interactive app, `/tokens` prints the current window as a
|
|
147
|
+
percentage, the next refresh time, and any additional-usage state.
|
|
148
|
+
`/tokens json` prints the member-safe API payload instead.
|
|
149
|
+
|
|
150
|
+
A blocked turn stays readable in `--json` output. An error event uses `data`
|
|
151
|
+
as an object:
|
|
152
|
+
|
|
153
|
+
```json
|
|
154
|
+
{
|
|
155
|
+
"type": "error",
|
|
156
|
+
"data": {
|
|
157
|
+
"message": "Usage limit reached.",
|
|
158
|
+
"code": "http_402",
|
|
159
|
+
"status": 402,
|
|
160
|
+
"block_reason": "weekly",
|
|
161
|
+
"can_purchase_overage": true,
|
|
162
|
+
"retryable": false
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
`block_reason` is `window`, `weekly`, `cost_cap`, `busy`, or `billing` when
|
|
168
|
+
the server sends one. A `busy` block and an ordinary rate limit use status
|
|
169
|
+
`429` with `retryable: true`. `can_purchase_overage` only says whether the
|
|
170
|
+
billing page can offer additional usage. The Textual UI prints `message`.
|
|
171
|
+
|
|
121
172
|
## Configuration
|
|
122
173
|
|
|
123
174
|
| Setting | Location |
|
|
@@ -56,6 +56,40 @@ unreleased Python.
|
|
|
56
56
|
|
|
57
57
|
Do not commit credentials, `.venv/`, or `dist/`.
|
|
58
58
|
|
|
59
|
+
## Hosted protocol
|
|
60
|
+
|
|
61
|
+
The client speaks protocol v1. Agent turns, and plan turns that carry plan
|
|
62
|
+
context, use `/api/copperpilot/analyze/agent/ws`. Ask turns and plan turns
|
|
63
|
+
without that context use `/api/copperpilot/analyze/chat/ws`.
|
|
64
|
+
|
|
65
|
+
`make_chat_start` in `copper_protocol.py` bounds history before the socket
|
|
66
|
+
send, matching the desktop harness:
|
|
67
|
+
|
|
68
|
+
| Attempt | Message cap | History cap | Frame cap |
|
|
69
|
+
|---------|-------------|-------------|-----------|
|
|
70
|
+
| 1 | 64 KiB | 4 MiB | 12 MiB |
|
|
71
|
+
| 2 | 32 KiB | 2 MiB | 8 MiB |
|
|
72
|
+
| 3 | 8 KiB | 128 KiB | 8 MiB |
|
|
73
|
+
| 4 | 4 KiB | 64 KiB | 8 MiB |
|
|
74
|
+
|
|
75
|
+
History is kept newest-first. Inline `data:` attachments are replaced before
|
|
76
|
+
the byte caps apply. A query or workspace snapshot that still cannot fit
|
|
77
|
+
raises `ProtocolError` with `code="PAYLOAD_TOO_LARGE"`.
|
|
78
|
+
|
|
79
|
+
A WebSocket `error` frame keeps `code`, `status`, `block_reason`,
|
|
80
|
+
`can_purchase_overage`, and `retryable` on both `ProtocolError` and the
|
|
81
|
+
`copper.error` event. Absent fields stay absent. The interactive UI and MCP
|
|
82
|
+
`error` string use `public_message`; `--json` and the MCP event digest keep
|
|
83
|
+
the object.
|
|
84
|
+
|
|
85
|
+
Device login and the WebSocket `User-Agent` (`CopperPilot CLI/<version>`)
|
|
86
|
+
read the installed package version. That version comes from `VERSION`.
|
|
87
|
+
|
|
88
|
+
`POST /api/copperpilot/analyze/token_limits` is the account-usage read. It
|
|
89
|
+
returns percentages and reset state even when chat is blocked. Do not add
|
|
90
|
+
token counts, plan allocations, Stripe checkout, or a per-chat context meter
|
|
91
|
+
here. The server does not expose those on this contract.
|
|
92
|
+
|
|
59
93
|
## Release
|
|
60
94
|
|
|
61
95
|
Version is the contents of [`VERSION`](../VERSION). `make release` writes that
|
|
@@ -32,7 +32,8 @@ copper-pilot -n -m "Review this board" --json --no-stream --mode ask
|
|
|
32
32
|
next turn can pass `--resume THREAD_ID`.
|
|
33
33
|
|
|
34
34
|
Use `--mode plan` for a plan, `--mode agent -y` for Auto local writes, and
|
|
35
|
-
`--yolo` only when the user asked to skip local approval.
|
|
35
|
+
`--yolo` only when the user asked to skip local approval. Add
|
|
36
|
+
`--effort intelligence` for a paid Intelligence turn; Balanced is the default.
|
|
36
37
|
|
|
37
38
|
## Option 2: MCP conductor (`copper-pilot mcp`)
|
|
38
39
|
|
|
@@ -82,10 +83,10 @@ Point the host at `copper-pilot mcp` on stdio. Tools:
|
|
|
82
83
|
| Tool | Role |
|
|
83
84
|
|------|------|
|
|
84
85
|
| `status` | Login state and discovered schematic/PCB paths |
|
|
85
|
-
| `ask` | Read-oriented specialist (`--mode ask`) |
|
|
86
|
-
| `plan` | Plan without applying (`--mode plan`) |
|
|
87
|
-
| `run` | Mutating agent turn (`--mode agent`) |
|
|
88
|
-
| `resume` | Continue `thread_id` (`mode` defaults to `agent`;
|
|
86
|
+
| `ask` | Read-oriented specialist (`--mode ask`); optional `effort` |
|
|
87
|
+
| `plan` | Plan without applying (`--mode plan`); optional `effort` |
|
|
88
|
+
| `run` | Mutating agent turn (`--mode agent`); optional `effort` |
|
|
89
|
+
| `resume` | Continue `thread_id` (`mode` defaults to `agent`; optional `effort`) |
|
|
89
90
|
| `threads_list` | List threads for this workspace |
|
|
90
91
|
|
|
91
92
|
Workspace is the tool `workspace` argument, else `CLAUDE_PROJECT_DIR`, else the
|
|
@@ -102,7 +103,18 @@ process current directory.
|
|
|
102
103
|
MCP cannot show the TUI, so Manual is not available there. `ask` and `plan`
|
|
103
104
|
always use Auto. `run` and `resume` default to Auto.
|
|
104
105
|
|
|
106
|
+
`effort` is `balanced` (default) or `intelligence`. Intelligence requires a
|
|
107
|
+
paid plan. It may run server-owned survey subagents; Plan turns survey before
|
|
108
|
+
the parent writes a plan. Progress reports compact worker transitions and the
|
|
109
|
+
result digest omits full worker output. If the hosted agent asks a clarification,
|
|
110
|
+
MCP returns a clear rejection because it cannot present the interactive options
|
|
111
|
+
and Skip UI; continue the returned `thread_id` in the terminal TUI to answer.
|
|
112
|
+
|
|
105
113
|
Missing credentials: MCP tools return `login_required` and tell the user to run
|
|
106
114
|
`copper-pilot auth login`. The server does not open a browser.
|
|
107
115
|
|
|
108
|
-
|
|
116
|
+
A hosted usage block sets `ok` and `success` to false. `error` remains the
|
|
117
|
+
server's public message. The matching digest entry keeps the structured
|
|
118
|
+
`data` object (`status`, `code`, `block_reason`, `can_purchase_overage`, and
|
|
119
|
+
`retryable` when the server sends them). Checkout stays on the CopperPilot
|
|
120
|
+
billing page. See [docs/cli.md](cli.md).
|
{copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/plugins/copper-pilot/agents/copper-pilot.md
RENAMED
|
@@ -11,7 +11,9 @@ Rules:
|
|
|
11
11
|
|
|
12
12
|
- Call `status` first if login or workspace paths are unknown.
|
|
13
13
|
- Prefer `ask` unless the user asked for a schematic or PCB change. Use `plan` for a plan, `run` to apply a change, `resume` with a prior `thread_id`. `resume` defaults to agent mode (mutating); pass `mode="ask"` to continue a read-only conversation without escalating write access.
|
|
14
|
+
- Use `effort="intelligence"` only when the user requests a deep survey or Intelligence and has a paid plan. Balanced is the default. Intelligence workers survey only; the parent owns the final answer or plan.
|
|
14
15
|
- Pass `approval=yolo` only when the user explicitly asked to skip local approval. Default is Auto.
|
|
15
16
|
- Do not Edit or Write KiCad files. Leave schematic and PCB side effects to CopperPilot.
|
|
16
17
|
- If a tool returns `login_required`, tell the user to run `copper-pilot auth login` in a terminal.
|
|
18
|
+
- MCP cannot answer interactive clarification prompts. If one is rejected, return the `thread_id` and ask the user to continue it in the CopperPilot terminal TUI.
|
|
17
19
|
- Return a short specialist memo plus `thread_id`. Firmware, git, and docs stay with the parent agent.
|
|
@@ -23,7 +23,7 @@ classifiers = [
|
|
|
23
23
|
dependencies = [
|
|
24
24
|
"aiosqlite>=0.22,<1",
|
|
25
25
|
"certifi>=2024.8.30",
|
|
26
|
-
"deepagents==0.7.
|
|
26
|
+
"deepagents==0.7.19",
|
|
27
27
|
"httpx>=0.28,<1",
|
|
28
28
|
"langchain-core>=1.6,<2",
|
|
29
29
|
"langgraph>=1.2,<2",
|
|
@@ -37,8 +37,8 @@ dependencies = [
|
|
|
37
37
|
"pyyaml>=6,<7",
|
|
38
38
|
"rich>=15,<16",
|
|
39
39
|
"textual>=8.2.8,<9",
|
|
40
|
-
"uuid-utils>=0.12,<
|
|
41
|
-
"websockets>=15,<
|
|
40
|
+
"uuid-utils>=0.12,<2",
|
|
41
|
+
"websockets>=15,<18",
|
|
42
42
|
]
|
|
43
43
|
|
|
44
44
|
[project.optional-dependencies]
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"""Small authenticated HTTP surface used by the CopperPilot TUI."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from datetime import datetime
|
|
6
|
+
from typing import Any
|
|
7
|
+
|
|
8
|
+
import httpx
|
|
9
|
+
|
|
10
|
+
from copper_pilot_cli.copper_auth import DeviceCredential
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
async def token_limits(credential: DeviceCredential) -> dict[str, Any]:
|
|
14
|
+
"""Fetch the account's authoritative token/usage limits."""
|
|
15
|
+
async with httpx.AsyncClient(timeout=15) as client:
|
|
16
|
+
response = await client.post(
|
|
17
|
+
f"{credential.base_url}/api/copperpilot/analyze/token_limits",
|
|
18
|
+
headers={
|
|
19
|
+
"Authorization": f"Bearer {credential.api_key}",
|
|
20
|
+
"X-CopperPilot-Fingerprint": credential.fingerprint,
|
|
21
|
+
},
|
|
22
|
+
)
|
|
23
|
+
response.raise_for_status()
|
|
24
|
+
value = response.json()
|
|
25
|
+
return value if isinstance(value, dict) else {}
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def _percentage(value: Any) -> str:
|
|
29
|
+
try:
|
|
30
|
+
number = min(100.0, max(0.0, float(value)))
|
|
31
|
+
except (TypeError, ValueError):
|
|
32
|
+
number = 0.0
|
|
33
|
+
return f"{number:.0f}%"
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def _local_time(value: Any) -> str | None:
|
|
37
|
+
if not isinstance(value, str) or not value.strip():
|
|
38
|
+
return None
|
|
39
|
+
try:
|
|
40
|
+
parsed = datetime.fromisoformat(value.replace("Z", "+00:00"))
|
|
41
|
+
except ValueError:
|
|
42
|
+
return value
|
|
43
|
+
local = parsed.astimezone()
|
|
44
|
+
clock = local.strftime("%I:%M %p").lstrip("0")
|
|
45
|
+
return f"{local.strftime('%b')} {local.day}, {local.year} at {clock}"
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def format_token_limits(value: dict[str, Any]) -> str:
|
|
49
|
+
"""Render the member-safe usage contract without exposing raw token counts."""
|
|
50
|
+
lines: list[str] = []
|
|
51
|
+
window_open = bool(value.get("window_open"))
|
|
52
|
+
block_reason = value.get("block_reason")
|
|
53
|
+
if window_open or block_reason in {"window", "weekly"} or value.get("overage_valid"):
|
|
54
|
+
lines.append(
|
|
55
|
+
f"Current usage window: {_percentage(value.get('window_usage_percentage'))} used"
|
|
56
|
+
)
|
|
57
|
+
else:
|
|
58
|
+
lines.append("Current usage window: Ready")
|
|
59
|
+
|
|
60
|
+
window_end = _local_time(value.get("window_ends_at"))
|
|
61
|
+
if window_end and (window_open or block_reason == "window"):
|
|
62
|
+
lines.append(f"Usage limit refreshes: {window_end}")
|
|
63
|
+
|
|
64
|
+
week_end = _local_time(value.get("week_ends_at"))
|
|
65
|
+
if week_end:
|
|
66
|
+
label = "Blocked until" if block_reason == "weekly" else "Weekly balance refreshes"
|
|
67
|
+
lines.append(f"{label}: {week_end}")
|
|
68
|
+
|
|
69
|
+
if value.get("overage_valid"):
|
|
70
|
+
lines.append(f"Additional usage: {_percentage(value.get('overage_usage_percentage'))} used")
|
|
71
|
+
|
|
72
|
+
public_message = value.get("public_message")
|
|
73
|
+
if isinstance(public_message, str) and public_message.strip():
|
|
74
|
+
lines.append(f"Status: {public_message.strip()}")
|
|
75
|
+
if value.get("can_purchase_overage"):
|
|
76
|
+
lines.append("Additional usage is available from your CopperPilot billing page.")
|
|
77
|
+
return "\n".join(lines)
|