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.
Files changed (148) hide show
  1. copper_pilot_cli-0.1.8/HISTORY.md +217 -0
  2. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/PKG-INFO +15 -6
  3. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/README.md +11 -2
  4. copper_pilot_cli-0.1.8/VERSION +1 -0
  5. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/docs/cli.md +55 -4
  6. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/docs/development.md +34 -0
  7. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/docs/harness.md +18 -6
  8. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/plugins/copper-pilot/agents/copper-pilot.md +2 -0
  9. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/pyproject.toml +3 -3
  10. copper_pilot_cli-0.1.8/src/copper_pilot_cli/copper_api.py +77 -0
  11. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/src/copper_pilot_cli/copper_app.py +145 -15
  12. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/src/copper_pilot_cli/copper_auth.py +2 -1
  13. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/src/copper_pilot_cli/copper_graph.py +43 -4
  14. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/src/copper_pilot_cli/copper_main.py +42 -5
  15. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/src/copper_pilot_cli/copper_mcp.py +89 -8
  16. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/src/copper_pilot_cli/copper_protocol.py +127 -18
  17. copper_pilot_cli-0.1.8/src/copper_pilot_cli/copper_status_events.py +76 -0
  18. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/src/copper_pilot_cli/copper_widgets.py +18 -1
  19. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/src/copper_pilot_cli/deepagents_tools.py +5 -6
  20. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/src/copper_pilot_cli/langchain.py +9 -0
  21. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/src/copper_pilot_cli/sessions.py +3 -3
  22. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/tests/test_auth.py +2 -0
  23. copper_pilot_cli-0.1.8/tests/test_copper_api.py +63 -0
  24. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/tests/test_langchain.py +21 -2
  25. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/tests/test_main.py +15 -1
  26. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/tests/test_mcp.py +84 -2
  27. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/tests/test_protocol.py +129 -0
  28. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/tests/test_release_gates.py +1 -1
  29. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/tests/test_sessions.py +71 -2
  30. copper_pilot_cli-0.1.8/tests/test_status_events.py +51 -0
  31. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/tests/test_tools.py +29 -0
  32. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/tests/test_tui.py +188 -7
  33. copper_pilot_cli-0.1.7/HISTORY.md +0 -95
  34. copper_pilot_cli-0.1.7/VERSION +0 -1
  35. copper_pilot_cli-0.1.7/src/copper_pilot_cli/copper_api.py +0 -24
  36. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/.claude-plugin/marketplace.json +0 -0
  37. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/.gitignore +0 -0
  38. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/CODE_OF_CONDUCT.md +0 -0
  39. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/CONTRIBUTING.md +0 -0
  40. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/LICENSE +0 -0
  41. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/NOTICE +0 -0
  42. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/SECURITY.md +0 -0
  43. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/SUPPORT.md +0 -0
  44. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/UPSTREAM.md +0 -0
  45. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/docs/assets/esp32-mini-1-h4.gif +0 -0
  46. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/docs/assets/logo-dark.png +0 -0
  47. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/docs/assets/logo-light.png +0 -0
  48. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/docs/assets/logo.png +0 -0
  49. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/examples/.gitignore +0 -0
  50. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/examples/001_esp32/.copperpilot/PLANS.md +0 -0
  51. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/examples/001_esp32/.copperpilot/README.md +0 -0
  52. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/examples/001_esp32/.copperpilot/TOOLS.md +0 -0
  53. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/examples/001_esp32/.copperpilot/plans/esp32-dev-board.plan.md +0 -0
  54. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/examples/001_esp32/.gitignore +0 -0
  55. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/examples/001_esp32/README.md +0 -0
  56. {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
  57. {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
  58. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/examples/001_esp32/esp32/esp32.kicad_pcb +0 -0
  59. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/examples/001_esp32/esp32/esp32.kicad_pro +0 -0
  60. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/examples/001_esp32/esp32/esp32.kicad_sch +0 -0
  61. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/examples/001_esp32/esp32/esp32.png +0 -0
  62. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/examples/001_esp32/helper.py +0 -0
  63. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/examples/001_esp32/main.py +0 -0
  64. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/examples/002_cm5_camera/.copperpilot/PLANS.md +0 -0
  65. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/examples/002_cm5_camera/.copperpilot/README.md +0 -0
  66. {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
  67. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/examples/002_cm5_camera/.gitignore +0 -0
  68. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/examples/002_cm5_camera/README.md +0 -0
  69. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/examples/002_cm5_camera/assembly_spec.json +0 -0
  70. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/examples/002_cm5_camera/cm5_camera/3dmodels/CM4.step +0 -0
  71. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/examples/002_cm5_camera/cm5_camera/3dmodels/CM5.step +0 -0
  72. {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
  73. {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
  74. {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
  75. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/examples/002_cm5_camera/cm5_camera/CM5.3dshapes/5033981892.stp +0 -0
  76. {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
  77. {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
  78. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/examples/002_cm5_camera/cm5_camera/CM5.3dshapes/SRP5030CC.stp +0 -0
  79. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/examples/002_cm5_camera/cm5_camera/cm5_camera.kicad_dru +0 -0
  80. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/examples/002_cm5_camera/cm5_camera/cm5_camera.kicad_pcb +0 -0
  81. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/examples/002_cm5_camera/cm5_camera/cm5_camera.kicad_pro +0 -0
  82. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/examples/002_cm5_camera/cm5_camera/cm5_camera.kicad_sch +0 -0
  83. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/examples/002_cm5_camera/cm5_camera/cm5_camera.kicad_sym +0 -0
  84. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/examples/002_cm5_camera/cm5_camera/cm5_camera.png +0 -0
  85. {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
  86. {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
  87. {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
  88. {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
  89. {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
  90. {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
  91. {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
  92. {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
  93. {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
  94. {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
  95. {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
  96. {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
  97. {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
  98. {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
  99. {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
  100. {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
  101. {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
  102. {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
  103. {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
  104. {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
  105. {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
  106. {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
  107. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/examples/002_cm5_camera/cm5_camera/cm5_camera_bottom.png +0 -0
  108. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/examples/002_cm5_camera/cm5_camera/fp-lib-table +0 -0
  109. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/examples/002_cm5_camera/cm5_camera/sym-lib-table +0 -0
  110. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/examples/002_cm5_camera/generate_3d_models.py +0 -0
  111. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/examples/002_cm5_camera/helper.py +0 -0
  112. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/examples/002_cm5_camera/main.py +0 -0
  113. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/plugins/copper-pilot/.claude-plugin/plugin.json +0 -0
  114. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/plugins/copper-pilot/.mcp.json +0 -0
  115. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/plugins/copper-pilot/skills/copper-pilot-review/SKILL.md +0 -0
  116. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/skills/copper-pilot-review/SKILL.md +0 -0
  117. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/src/copper_pilot_cli/__init__.py +0 -0
  118. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/src/copper_pilot_cli/__main__.py +0 -0
  119. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/src/copper_pilot_cli/_upstream/__init__.py +0 -0
  120. {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
  121. {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
  122. {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
  123. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/src/copper_pilot_cli/_version.py +0 -0
  124. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/src/copper_pilot_cli/clipboard.py +0 -0
  125. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/src/copper_pilot_cli/copper_config.py +0 -0
  126. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/src/copper_pilot_cli/copper_features.py +0 -0
  127. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/src/copper_pilot_cli/copper_hooks.py +0 -0
  128. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/src/copper_pilot_cli/copper_preferences.py +0 -0
  129. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/src/copper_pilot_cli/copper_presentation.py +0 -0
  130. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/src/copper_pilot_cli/copper_theme.py +0 -0
  131. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/src/copper_pilot_cli/copper_tools.py +0 -0
  132. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/src/copper_pilot_cli/copper_update.py +0 -0
  133. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/src/copper_pilot_cli/copper_workspace.py +0 -0
  134. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/src/copper_pilot_cli/diagnostics.py +0 -0
  135. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/src/copper_pilot_cli/media_utils.py +0 -0
  136. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/src/copper_pilot_cli/py.typed +0 -0
  137. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/src/copper_pilot_cli/textual_patches.py +0 -0
  138. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/tests/test_clipboard.py +0 -0
  139. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/tests/test_cm5_camera_example.py +0 -0
  140. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/tests/test_e2e.py +0 -0
  141. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/tests/test_esp32_example.py +0 -0
  142. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/tests/test_features.py +0 -0
  143. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/tests/test_live_chat_e2e.py +0 -0
  144. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/tests/test_plugin_manifest.py +0 -0
  145. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/tests/test_preferences.py +0 -0
  146. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/tests/test_presentation.py +0 -0
  147. {copper_pilot_cli-0.1.7 → copper_pilot_cli-0.1.8}/tests/test_upstream_provenance.py +0 -0
  148. {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.7
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.14
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<1,>=0.12
39
- Requires-Dist: websockets<17,>=15
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(workspace="esp32")
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(workspace="esp32")
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`. Same approval as `run`. |
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`; pass `mode="ask"` to keep it read-only) |
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
- See [docs/cli.md](cli.md) for the full command reference.
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).
@@ -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.14",
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,<1",
41
- "websockets>=15,<17",
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)