voidx 3.1.1__tar.gz → 3.2.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.
Files changed (286) hide show
  1. {voidx-3.1.1 → voidx-3.2.0}/PKG-INFO +95 -95
  2. {voidx-3.1.1 → voidx-3.2.0}/pyproject.toml +57 -57
  3. {voidx-3.1.1 → voidx-3.2.0}/setup.cfg +4 -4
  4. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/__init__.py +3 -3
  5. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/agent/agents.py +77 -77
  6. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/agent/attachments.py +331 -331
  7. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/agent/goal_resolver.py +443 -443
  8. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/agent/graph/compaction.py +97 -97
  9. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/agent/graph/compaction_coordinator.py +680 -679
  10. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/agent/graph/contracts.py +241 -241
  11. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/agent/graph/convergence.py +87 -87
  12. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/agent/graph/core/__init__.py +9 -9
  13. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/agent/graph/core/_voidx_graph.py +460 -460
  14. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/agent/graph/core/helpers.py +126 -126
  15. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/agent/graph/core/llm.py +440 -439
  16. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/agent/graph/permissions.py +195 -185
  17. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/agent/graph/run_loop.py +370 -370
  18. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/agent/graph/runtime.py +10 -10
  19. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/agent/graph/runtime_guards.py +462 -462
  20. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/agent/graph/session_mixin.py +38 -38
  21. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/agent/graph/session_runtime.py +292 -292
  22. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/agent/graph/streaming.py +611 -611
  23. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/agent/graph/subagent.py +396 -396
  24. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/agent/graph/title_mixin.py +100 -100
  25. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/agent/graph/todo_events.py +17 -17
  26. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/agent/graph/tool_execution.py +40 -40
  27. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/agent/graph/tool_executor/__init__.py +8 -8
  28. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/agent/graph/tool_executor/executor.py +355 -355
  29. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/agent/graph/tool_executor/guards.py +150 -150
  30. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/agent/graph/tool_executor/helpers.py +347 -347
  31. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/agent/graph/tool_executor/types.py +86 -86
  32. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/agent/graph/tool_executor/ui.py +143 -143
  33. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/agent/graph/tool_executor/workflow.py +314 -314
  34. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/agent/graph/topology.py +88 -88
  35. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/agent/graph/transcript_mixin.py +18 -18
  36. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/agent/graph/turn_mixin.py +36 -36
  37. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/agent/graph/turn_runner.py +511 -509
  38. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/agent/graph/wiring.py +100 -100
  39. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/agent/graph/workflow_utils.py +32 -32
  40. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/agent/message_rows.py +102 -102
  41. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/agent/prompts.py +177 -177
  42. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/agent/runtime_context.py +594 -594
  43. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/agent/slash/code_ide.py +67 -67
  44. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/agent/slash/guide.py +18 -18
  45. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/agent/slash/handler.py +554 -554
  46. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/agent/slash/host.py +359 -359
  47. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/agent/slash/init.py +95 -95
  48. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/agent/slash/lsp.py +112 -112
  49. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/agent/slash/mcp.py +427 -427
  50. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/agent/slash/model.py +424 -424
  51. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/agent/slash/profile.py +162 -162
  52. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/agent/slash/runtime.py +73 -73
  53. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/agent/slash/session.py +253 -253
  54. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/agent/slash/skills.py +117 -117
  55. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/agent/slash/upgrade.py +98 -98
  56. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/agent/state.py +27 -27
  57. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/agent/task_state.py +31 -31
  58. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/agent/todo_state.py +260 -260
  59. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/agent/tool_call_ids.py +33 -33
  60. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/agent/tool_exchange_sanitizer.py +168 -158
  61. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/agent/tool_filters.py +24 -24
  62. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/agent/tool_result_storage.py +73 -73
  63. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/config/__init__.py +45 -45
  64. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/config/enums.py +60 -60
  65. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/config/models.py +118 -118
  66. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/config/permissions.py +24 -24
  67. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/config/settings.py +444 -444
  68. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/config/settings_agent.py +21 -21
  69. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/config/settings_api_keys.py +45 -45
  70. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/config/settings_code_ide.py +19 -19
  71. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/config/settings_custom.py +52 -52
  72. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/config/settings_mcp.py +69 -69
  73. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/config/settings_permissions.py +86 -86
  74. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/config/settings_skills.py +79 -79
  75. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/config/settings_update.py +68 -68
  76. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/config/settings_utils.py +9 -9
  77. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/config/settings_web.py +47 -47
  78. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/data/__init__.py +1 -1
  79. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/data/templates/api-doc.md +64 -64
  80. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/data/templates/prd.md +117 -117
  81. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/data/templates/readme.md +55 -55
  82. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/data/templates/rfc.md +38 -38
  83. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/data/templates/tech-design.md +68 -68
  84. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/diffing.py +323 -227
  85. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/llm/catalog.py +201 -201
  86. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/llm/compaction.py +652 -650
  87. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/llm/instruction.py +307 -307
  88. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/llm/message_markers.py +14 -14
  89. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/llm/message_status.py +12 -12
  90. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/llm/provider.py +608 -608
  91. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/llm/service.py +32 -32
  92. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/llm/usage.py +376 -376
  93. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/logging/__init__.py +6 -6
  94. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/logging/request_log.py +147 -147
  95. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/logging/tool_log.py +75 -75
  96. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/lsp/__init__.py +38 -38
  97. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/lsp/client.py +266 -266
  98. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/lsp/detector.py +395 -395
  99. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/lsp/detector_data.py +130 -130
  100. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/lsp/manager.py +388 -388
  101. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/lsp/schema.py +179 -179
  102. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/main.py +167 -167
  103. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/mcp/client/__init__.py +11 -11
  104. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/mcp/client/base.py +354 -354
  105. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/mcp/client/errors.py +15 -15
  106. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/mcp/client/http_transport.py +120 -120
  107. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/mcp/client/sse_transport.py +151 -151
  108. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/mcp/client/stdio_transport.py +116 -116
  109. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/memory/cleanup.py +122 -122
  110. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/memory/context_frames.py +247 -247
  111. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/memory/jsonl_store.py +188 -188
  112. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/memory/runtime_state.py +347 -347
  113. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/memory/service.py +99 -99
  114. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/memory/session.py +408 -408
  115. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/memory/store.py +247 -247
  116. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/memory/subagents.py +21 -21
  117. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/memory/transcript.py +495 -495
  118. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/permission/context.py +59 -59
  119. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/permission/engine.py +186 -186
  120. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/permission/evaluate.py +114 -114
  121. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/permission/rules.py +390 -390
  122. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/permission/service.py +326 -326
  123. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/runtime/__init__.py +46 -46
  124. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/runtime/attachments.py +7 -7
  125. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/runtime/intent.py +46 -46
  126. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/runtime/reference_tokens.py +9 -9
  127. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/runtime/task_state.py +229 -229
  128. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/runtime/todo.py +9 -9
  129. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/runtime/ui.py +254 -252
  130. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/runtime/ui_port.py +178 -178
  131. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/selfupdate.py +208 -208
  132. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/skills/__init__.py +23 -23
  133. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/skills/context.py +115 -115
  134. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/skills/references.py +73 -73
  135. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/skills/registry.py +247 -247
  136. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/skills/schema.py +49 -49
  137. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/skills/service.py +181 -181
  138. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/tools/__init__.py +19 -19
  139. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/tools/agent.py +304 -304
  140. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/tools/base.py +216 -216
  141. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/tools/bash.py +202 -202
  142. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/tools/bash_router.py +1222 -1222
  143. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/tools/clarify.py +113 -113
  144. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/tools/compact_context.py +53 -53
  145. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/tools/file_ops/__init__.py +18 -18
  146. voidx-3.2.0/src/voidx/tools/file_ops/edit_execute.py +289 -0
  147. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/tools/file_ops/edit_resolve.py +229 -325
  148. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/tools/file_ops/file.py +184 -184
  149. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/tools/file_ops/read.py +232 -232
  150. voidx-3.2.0/src/voidx/tools/file_ops/types.py +35 -0
  151. voidx-3.2.0/src/voidx/tools/file_ops/write.py +140 -0
  152. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/tools/file_state.py +353 -353
  153. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/tools/git.py +1335 -1335
  154. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/tools/load_doc_template.py +64 -64
  155. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/tools/load_skills.py +206 -206
  156. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/tools/lsp.py +134 -134
  157. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/tools/plan_checkpoint.py +362 -254
  158. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/tools/registry.py +139 -139
  159. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/tools/repomap.py +249 -249
  160. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/tools/search.py +299 -299
  161. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/tools/service.py +32 -32
  162. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/tools/task_status.py +59 -59
  163. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/tools/task_tracker.py +99 -99
  164. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/tools/todo.py +86 -86
  165. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/tools/web_mcp.py +108 -108
  166. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/tools/webfetch.py +253 -253
  167. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/tools/websearch.py +282 -282
  168. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/tools/workflow.py +553 -553
  169. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/ui/commands.py +110 -110
  170. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/ui/output/agent_display.py +25 -25
  171. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/ui/output/browse.py +174 -174
  172. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/ui/output/capture.py +180 -180
  173. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/ui/output/console/app.py +357 -356
  174. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/ui/output/console/formatting.py +100 -100
  175. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/ui/output/console/streaming.py +212 -212
  176. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/ui/output/diff.py +130 -130
  177. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/ui/output/display_policy.py +137 -137
  178. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/ui/output/dock/__init__.py +24 -16
  179. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/ui/output/dock/agent_placeholder.py +21 -21
  180. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/ui/output/dock/app.py +419 -411
  181. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/ui/output/dock/formatting.py +146 -146
  182. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/ui/output/dock/nodes.py +422 -416
  183. voidx-3.2.0/src/voidx/ui/output/dock/nodes_checkpoint.py +126 -0
  184. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/ui/output/dock/nodes_permission.py +50 -50
  185. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/ui/output/dock/nodes_startup.py +60 -60
  186. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/ui/output/dock/nodes_status.py +79 -79
  187. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/ui/output/dock/status.py +87 -66
  188. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/ui/output/dock/stream.py +113 -113
  189. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/ui/output/dock/todo.py +106 -106
  190. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/ui/output/events/__init__.py +110 -102
  191. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/ui/output/events/bus.py +119 -119
  192. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/ui/output/events/consumers.py +386 -363
  193. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/ui/output/events/schema.py +322 -289
  194. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/ui/output/tree.py +739 -738
  195. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/ui/output/types.py +44 -44
  196. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/ui/session.py +378 -378
  197. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/ui/tools/__init__.py +32 -32
  198. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/ui/tools/clipboard_image.py +241 -241
  199. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/ui/tools/clipboard_text.py +72 -72
  200. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/ui/tools/file_picker.py +139 -139
  201. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/ui/tools/skill_picker.py +83 -83
  202. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/ui/transcript.py +150 -149
  203. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/ui/tui/activity.py +64 -64
  204. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/ui/tui/app.py +615 -615
  205. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/ui/tui/choice_mixin.py +59 -59
  206. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/ui/tui/clipboard_mixin.py +83 -83
  207. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/ui/tui/helpers.py +144 -144
  208. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/ui/tui/input.py +345 -345
  209. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/ui/tui/overlays.py +157 -157
  210. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/ui/tui/panels.py +340 -340
  211. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/ui/tui/parser.py +440 -440
  212. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/ui/tui/render_activity.py +100 -89
  213. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/ui/tui/render_frame.py +587 -587
  214. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/ui/tui/render_input.py +154 -154
  215. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/ui/tui/render_status.py +266 -266
  216. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/ui/tui/render_todo.py +81 -81
  217. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/ui/tui/renderer.py +24 -24
  218. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/ui/tui/state.py +254 -254
  219. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/ui/tui/terminal_mixin.py +95 -95
  220. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/ui/tui/text_prompt_mixin.py +49 -49
  221. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/workflow/__init__.py +70 -70
  222. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/workflow/auto_advance.py +162 -162
  223. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/workflow/context.py +61 -61
  224. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/workflow/dag.py +30 -30
  225. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/workflow/nodes.py +418 -418
  226. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/workflow/policy.py +82 -82
  227. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/workflow/reconcile.py +293 -293
  228. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/workflow/render.py +91 -91
  229. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/workflow/route.py +49 -49
  230. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/workflow/runtime.py +281 -281
  231. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/workflow/schema.py +177 -177
  232. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/workflow/service.py +143 -143
  233. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/workflow/types.py +101 -101
  234. {voidx-3.1.1 → voidx-3.2.0}/src/voidx.egg-info/PKG-INFO +95 -95
  235. {voidx-3.1.1 → voidx-3.2.0}/src/voidx.egg-info/SOURCES.txt +1 -1
  236. {voidx-3.1.1 → voidx-3.2.0}/tests/test_install_sh.py +162 -162
  237. {voidx-3.1.1 → voidx-3.2.0}/tests/test_npm_package.py +327 -327
  238. voidx-3.1.1/src/voidx/tools/file_ops/edit_execute.py +0 -559
  239. voidx-3.1.1/src/voidx/tools/file_ops/line.py +0 -150
  240. voidx-3.1.1/src/voidx/tools/file_ops/types.py +0 -79
  241. voidx-3.1.1/src/voidx/tools/file_ops/write.py +0 -89
  242. {voidx-3.1.1 → voidx-3.2.0}/README.md +0 -0
  243. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/agent/__init__.py +0 -0
  244. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/agent/graph/__init__.py +0 -0
  245. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/agent/slash/__init__.py +0 -0
  246. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/agent/tool_messages.py +0 -0
  247. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/llm/__init__.py +0 -0
  248. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/llm/context.py +0 -0
  249. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/lsp/config.py +0 -0
  250. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/lsp/errors.py +0 -0
  251. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/lsp/service.py +0 -0
  252. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/mcp/__init__.py +0 -0
  253. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/mcp/manager.py +0 -0
  254. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/mcp/schema.py +0 -0
  255. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/mcp/tool.py +0 -0
  256. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/mcp_servers/__init__.py +0 -0
  257. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/mcp_servers/web.py +0 -0
  258. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/memory/__init__.py +0 -0
  259. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/memory/model_profiles.py +0 -0
  260. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/permission/__init__.py +0 -0
  261. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/permission/sandbox.py +0 -0
  262. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/permission/schema.py +0 -0
  263. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/permission/wildcard.py +0 -0
  264. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/tools/web_content.py +0 -0
  265. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/ui/__init__.py +0 -0
  266. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/ui/frontend.py +0 -0
  267. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/ui/gateway/__init__.py +0 -0
  268. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/ui/gateway/bootstrap.py +0 -0
  269. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/ui/gateway/server.py +0 -0
  270. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/ui/gateway/session.py +0 -0
  271. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/ui/output/__init__.py +0 -0
  272. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/ui/output/console/__init__.py +0 -0
  273. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/ui/output/dock/state.py +0 -0
  274. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/ui/protocol/__init__.py +0 -0
  275. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/ui/protocol/commands.py +0 -0
  276. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/ui/protocol/envelope.py +0 -0
  277. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/ui/protocol/requests.py +0 -0
  278. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/ui/protocol/schema.py +0 -0
  279. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/ui/protocol/transcript.py +0 -0
  280. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/ui/tools/attachment_tokens.py +0 -0
  281. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/ui/tools/code_ide.py +0 -0
  282. {voidx-3.1.1 → voidx-3.2.0}/src/voidx/ui/tui/__init__.py +0 -0
  283. {voidx-3.1.1 → voidx-3.2.0}/src/voidx.egg-info/dependency_links.txt +0 -0
  284. {voidx-3.1.1 → voidx-3.2.0}/src/voidx.egg-info/entry_points.txt +0 -0
  285. {voidx-3.1.1 → voidx-3.2.0}/src/voidx.egg-info/requires.txt +0 -0
  286. {voidx-3.1.1 → voidx-3.2.0}/src/voidx.egg-info/top_level.txt +0 -0
@@ -1,95 +1,95 @@
1
- Metadata-Version: 2.4
2
- Name: voidx
3
- Version: 3.1.1
4
- Summary: A coding agent that quantifies everything and solves with tools, not fuzzy prompts.
5
- Requires-Python: >=3.11
6
- Description-Content-Type: text/markdown
7
- Requires-Dist: langgraph>=0.3.0
8
- Requires-Dist: langchain>=0.3.0
9
- Requires-Dist: langchain-anthropic>=0.3.0
10
- Requires-Dist: langchain-openai>=0.3.0
11
- Requires-Dist: pydantic>=2.10.0
12
- Requires-Dist: pydantic-settings>=2.7.0
13
- Requires-Dist: typer>=0.15.0
14
- Requires-Dist: rich>=13.9.0
15
- Requires-Dist: tiktoken>=0.8.0
16
- Requires-Dist: httpx>=0.28.0
17
- Requires-Dist: websockets>=14
18
- Requires-Dist: pathspec>=0.12
19
- Provides-Extra: gemini
20
- Requires-Dist: langchain-google-genai>=4.0.0; extra == "gemini"
21
- Provides-Extra: dev
22
- Requires-Dist: build>=1.2.0; extra == "dev"
23
- Requires-Dist: pytest>=8.0.0; extra == "dev"
24
- Requires-Dist: pytest-asyncio>=0.25.0; extra == "dev"
25
-
26
- # voidx
27
-
28
- voidx is a terminal AI coding agent built in Python.
29
-
30
- ## Install
31
-
32
- ### One-line install (no Python or npm required)
33
-
34
- macOS / Linux:
35
-
36
- ```bash
37
- curl -fsSL https://raw.githubusercontent.com/chikhamx/voidx/master/scripts/install.sh | bash
38
- ```
39
-
40
- Windows (PowerShell):
41
-
42
- ```powershell
43
- irm https://raw.githubusercontent.com/chikhamx/voidx/master/scripts/install.ps1 | iex
44
- ```
45
-
46
- The installer downloads a standalone Python runtime and sets up voidx in an
47
- isolated environment — nothing else is needed on your machine.
48
-
49
- ### pip
50
-
51
- ```bash
52
- pip install voidx
53
- voidx
54
- ```
55
-
56
- ### npm
57
-
58
- ```bash
59
- npm install -g @chikhamx/voidx
60
- voidx
61
- ```
62
-
63
- ### From source
64
-
65
- ```bash
66
- git clone https://github.com/chikhamx/voidx.git
67
- cd voidx
68
- pip install -e .
69
- voidx
70
- ```
71
-
72
- ### China / slow network
73
-
74
- Set mirror environment variables before running any install method:
75
-
76
- ```bash
77
- export VOIDX_PYTHON_MIRROR=https://npmmirror.com/mirrors/python-standalone
78
- export VOIDX_PIP_INDEX=https://pypi.tuna.tsinghua.edu.cn/simple
79
- ```
80
-
81
- ## Useful Commands
82
-
83
- ```bash
84
- voidx version
85
- voidx sessions
86
- voidx -w /path/to/project
87
- ```
88
-
89
- ## Development
90
-
91
- ```bash
92
- .venv/bin/python -m pytest
93
- .venv/bin/python scripts/package.py --format all --clean
94
- npm --prefix npm run check
95
- ```
1
+ Metadata-Version: 2.4
2
+ Name: voidx
3
+ Version: 3.2.0
4
+ Summary: A coding agent that quantifies everything and solves with tools, not fuzzy prompts.
5
+ Requires-Python: >=3.11
6
+ Description-Content-Type: text/markdown
7
+ Requires-Dist: langgraph>=0.3.0
8
+ Requires-Dist: langchain>=0.3.0
9
+ Requires-Dist: langchain-anthropic>=0.3.0
10
+ Requires-Dist: langchain-openai>=0.3.0
11
+ Requires-Dist: pydantic>=2.10.0
12
+ Requires-Dist: pydantic-settings>=2.7.0
13
+ Requires-Dist: typer>=0.15.0
14
+ Requires-Dist: rich>=13.9.0
15
+ Requires-Dist: tiktoken>=0.8.0
16
+ Requires-Dist: httpx>=0.28.0
17
+ Requires-Dist: websockets>=14
18
+ Requires-Dist: pathspec>=0.12
19
+ Provides-Extra: gemini
20
+ Requires-Dist: langchain-google-genai>=4.0.0; extra == "gemini"
21
+ Provides-Extra: dev
22
+ Requires-Dist: build>=1.2.0; extra == "dev"
23
+ Requires-Dist: pytest>=8.0.0; extra == "dev"
24
+ Requires-Dist: pytest-asyncio>=0.25.0; extra == "dev"
25
+
26
+ # voidx
27
+
28
+ voidx is a terminal AI coding agent built in Python.
29
+
30
+ ## Install
31
+
32
+ ### One-line install (no Python or npm required)
33
+
34
+ macOS / Linux:
35
+
36
+ ```bash
37
+ curl -fsSL https://raw.githubusercontent.com/chikhamx/voidx/master/scripts/install.sh | bash
38
+ ```
39
+
40
+ Windows (PowerShell):
41
+
42
+ ```powershell
43
+ irm https://raw.githubusercontent.com/chikhamx/voidx/master/scripts/install.ps1 | iex
44
+ ```
45
+
46
+ The installer downloads a standalone Python runtime and sets up voidx in an
47
+ isolated environment — nothing else is needed on your machine.
48
+
49
+ ### pip
50
+
51
+ ```bash
52
+ pip install voidx
53
+ voidx
54
+ ```
55
+
56
+ ### npm
57
+
58
+ ```bash
59
+ npm install -g @chikhamx/voidx
60
+ voidx
61
+ ```
62
+
63
+ ### From source
64
+
65
+ ```bash
66
+ git clone https://github.com/chikhamx/voidx.git
67
+ cd voidx
68
+ pip install -e .
69
+ voidx
70
+ ```
71
+
72
+ ### China / slow network
73
+
74
+ Set mirror environment variables before running any install method:
75
+
76
+ ```bash
77
+ export VOIDX_PYTHON_MIRROR=https://npmmirror.com/mirrors/python-standalone
78
+ export VOIDX_PIP_INDEX=https://pypi.tuna.tsinghua.edu.cn/simple
79
+ ```
80
+
81
+ ## Useful Commands
82
+
83
+ ```bash
84
+ voidx version
85
+ voidx sessions
86
+ voidx -w /path/to/project
87
+ ```
88
+
89
+ ## Development
90
+
91
+ ```bash
92
+ .venv/bin/python -m pytest
93
+ .venv/bin/python scripts/package.py --format all --clean
94
+ npm --prefix npm run check
95
+ ```
@@ -1,57 +1,57 @@
1
- [project]
2
- name = "voidx"
3
- version = "3.1.1"
4
- description = "A coding agent that quantifies everything and solves with tools, not fuzzy prompts."
5
- readme = "README.md"
6
- requires-python = ">=3.11"
7
- dependencies = [
8
- "langgraph>=0.3.0",
9
- "langchain>=0.3.0",
10
- "langchain-anthropic>=0.3.0",
11
- "langchain-openai>=0.3.0",
12
- "pydantic>=2.10.0",
13
- "pydantic-settings>=2.7.0",
14
- "typer>=0.15.0",
15
- "rich>=13.9.0",
16
- "tiktoken>=0.8.0",
17
- "httpx>=0.28.0",
18
- "websockets>=14",
19
- "pathspec>=0.12",
20
- ]
21
-
22
- [project.scripts]
23
- voidx = "voidx.main:cli"
24
-
25
- [project.optional-dependencies]
26
- gemini = ["langchain-google-genai>=4.0.0"]
27
- dev = [
28
- "build>=1.2.0",
29
- "pytest>=8.0.0",
30
- "pytest-asyncio>=0.25.0",
31
- ]
32
-
33
- [dependency-groups]
34
- dev = [
35
- "build>=1.2.0",
36
- "pytest>=8.0.0",
37
- "pytest-asyncio>=0.25.0",
38
- ]
39
-
40
- [build-system]
41
- requires = ["setuptools>=68", "wheel"]
42
- build-backend = "setuptools.build_meta"
43
-
44
- [tool.setuptools.packages.find]
45
- where = ["src"]
46
-
47
- [tool.setuptools.package-data]
48
- "voidx.skills" = [
49
- "bundled/*/SKILL.md",
50
- ]
51
- "voidx.data" = [
52
- "templates/*.md",
53
- ]
54
-
55
- [tool.pytest.ini_options]
56
- asyncio_mode = "auto"
57
- testpaths = ["tests"]
1
+ [project]
2
+ name = "voidx"
3
+ version = "3.2.0"
4
+ description = "A coding agent that quantifies everything and solves with tools, not fuzzy prompts."
5
+ readme = "README.md"
6
+ requires-python = ">=3.11"
7
+ dependencies = [
8
+ "langgraph>=0.3.0",
9
+ "langchain>=0.3.0",
10
+ "langchain-anthropic>=0.3.0",
11
+ "langchain-openai>=0.3.0",
12
+ "pydantic>=2.10.0",
13
+ "pydantic-settings>=2.7.0",
14
+ "typer>=0.15.0",
15
+ "rich>=13.9.0",
16
+ "tiktoken>=0.8.0",
17
+ "httpx>=0.28.0",
18
+ "websockets>=14",
19
+ "pathspec>=0.12",
20
+ ]
21
+
22
+ [project.scripts]
23
+ voidx = "voidx.main:cli"
24
+
25
+ [project.optional-dependencies]
26
+ gemini = ["langchain-google-genai>=4.0.0"]
27
+ dev = [
28
+ "build>=1.2.0",
29
+ "pytest>=8.0.0",
30
+ "pytest-asyncio>=0.25.0",
31
+ ]
32
+
33
+ [dependency-groups]
34
+ dev = [
35
+ "build>=1.2.0",
36
+ "pytest>=8.0.0",
37
+ "pytest-asyncio>=0.25.0",
38
+ ]
39
+
40
+ [build-system]
41
+ requires = ["setuptools>=68", "wheel"]
42
+ build-backend = "setuptools.build_meta"
43
+
44
+ [tool.setuptools.packages.find]
45
+ where = ["src"]
46
+
47
+ [tool.setuptools.package-data]
48
+ "voidx.skills" = [
49
+ "bundled/*/SKILL.md",
50
+ ]
51
+ "voidx.data" = [
52
+ "templates/*.md",
53
+ ]
54
+
55
+ [tool.pytest.ini_options]
56
+ asyncio_mode = "auto"
57
+ testpaths = ["tests"]
@@ -1,4 +1,4 @@
1
- [egg_info]
2
- tag_build =
3
- tag_date = 0
4
-
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+
@@ -1,3 +1,3 @@
1
- """VoidX - A coding agent that quantifies everything."""
2
-
3
- __version__ = "3.1.1"
1
+ """VoidX - A coding agent that quantifies everything."""
2
+
3
+ __version__ = "3.2.0"
@@ -1,77 +1,77 @@
1
- """Agent definitions — typed config and whenToUse descriptions.
2
-
3
- voidx uses one agent identity:
4
- voidx — primary identity, also used for isolated child runs
5
-
6
- Runtime personas (coordinate/explore/plan/implement/review) are thinking-mode
7
- labels, not AgentDef ids.
8
-
9
- Tool visibility is controlled by the ToolRegistry and permission layer,
10
- not by a static whitelist on AgentDef.
11
- """
12
-
13
-
14
- from __future__ import annotations
15
-
16
- from pydantic import BaseModel
17
-
18
- # ── agent definitions ─────────────────────────────────────────────────────
19
-
20
- class AgentDef(BaseModel):
21
- """An agent's complete definition — typed, no loose config."""
22
- name: str
23
- description: str
24
- when_to_use: str
25
- can_write: bool
26
- can_delegate: bool # can it start child agents via the agent tool?
27
- hidden: bool = False # hidden from user-facing lists?
28
- model: str | None = None # None = inherit from parent
29
-
30
- # ── built-in agents ────────────────────────────────────────────────────────
31
-
32
- BUILTIN_AGENTS: dict[str, AgentDef] = {
33
- "voidx": AgentDef(
34
- name="voidx",
35
- description="Primary agent. Understands intent, edits small scoped changes directly, "
36
- "delegates broad work to specialists, reviews results.",
37
- when_to_use="Default agent for all user interactions. Always use first.",
38
- can_write=True,
39
- can_delegate=True,
40
- hidden=False,
41
- ),
42
- }
43
-
44
-
45
- def get_agent(name: str) -> AgentDef | None:
46
- return BUILTIN_AGENTS.get(name)
47
-
48
-
49
- def get_visible_agents() -> list[AgentDef]:
50
- return [a for a in BUILTIN_AGENTS.values() if not a.hidden]
51
-
52
-
53
- def get_subagents() -> list[AgentDef]:
54
- """Child-run identities voidx can delegate to."""
55
- agent = get_agent("voidx")
56
- return [child_run_agent_def(agent)] if agent is not None else []
57
-
58
-
59
- def child_run_agent_def(agent: AgentDef) -> AgentDef:
60
- """Return the child-run view of the public voidx identity."""
61
- return agent.model_copy(update={
62
- "name": "voidx",
63
- "description": "Isolated child run of voidx that follows the supplied workflow route.",
64
- "when_to_use": "Use for delegated child work that benefits from isolated context.",
65
- "can_delegate": False,
66
- })
67
-
68
-
69
- def child_agent_descriptions_for_llm() -> str:
70
- """Generate child-agent descriptions for the agent tool."""
71
- lines = ["Available child agents:"]
72
- for agent in get_subagents():
73
- lines.append(
74
- f"- {agent.name}: {agent.description}\n"
75
- f" Write access: {agent.can_write}"
76
- )
77
- return "\n".join(lines)
1
+ """Agent definitions — typed config and whenToUse descriptions.
2
+
3
+ voidx uses one agent identity:
4
+ voidx — primary identity, also used for isolated child runs
5
+
6
+ Runtime personas (coordinate/explore/plan/implement/review) are thinking-mode
7
+ labels, not AgentDef ids.
8
+
9
+ Tool visibility is controlled by the ToolRegistry and permission layer,
10
+ not by a static whitelist on AgentDef.
11
+ """
12
+
13
+
14
+ from __future__ import annotations
15
+
16
+ from pydantic import BaseModel
17
+
18
+ # ── agent definitions ─────────────────────────────────────────────────────
19
+
20
+ class AgentDef(BaseModel):
21
+ """An agent's complete definition — typed, no loose config."""
22
+ name: str
23
+ description: str
24
+ when_to_use: str
25
+ can_write: bool
26
+ can_delegate: bool # can it start child agents via the agent tool?
27
+ hidden: bool = False # hidden from user-facing lists?
28
+ model: str | None = None # None = inherit from parent
29
+
30
+ # ── built-in agents ────────────────────────────────────────────────────────
31
+
32
+ BUILTIN_AGENTS: dict[str, AgentDef] = {
33
+ "voidx": AgentDef(
34
+ name="voidx",
35
+ description="Primary agent. Understands intent, edits small scoped changes directly, "
36
+ "delegates broad work to specialists, reviews results.",
37
+ when_to_use="Default agent for all user interactions. Always use first.",
38
+ can_write=True,
39
+ can_delegate=True,
40
+ hidden=False,
41
+ ),
42
+ }
43
+
44
+
45
+ def get_agent(name: str) -> AgentDef | None:
46
+ return BUILTIN_AGENTS.get(name)
47
+
48
+
49
+ def get_visible_agents() -> list[AgentDef]:
50
+ return [a for a in BUILTIN_AGENTS.values() if not a.hidden]
51
+
52
+
53
+ def get_subagents() -> list[AgentDef]:
54
+ """Child-run identities voidx can delegate to."""
55
+ agent = get_agent("voidx")
56
+ return [child_run_agent_def(agent)] if agent is not None else []
57
+
58
+
59
+ def child_run_agent_def(agent: AgentDef) -> AgentDef:
60
+ """Return the child-run view of the public voidx identity."""
61
+ return agent.model_copy(update={
62
+ "name": "voidx",
63
+ "description": "Isolated child run of voidx that follows the supplied workflow route.",
64
+ "when_to_use": "Use for delegated child work that benefits from isolated context.",
65
+ "can_delegate": False,
66
+ })
67
+
68
+
69
+ def child_agent_descriptions_for_llm() -> str:
70
+ """Generate child-agent descriptions for the agent tool."""
71
+ lines = ["Available child agents:"]
72
+ for agent in get_subagents():
73
+ lines.append(
74
+ f"- {agent.name}: {agent.description}\n"
75
+ f" Write access: {agent.can_write}"
76
+ )
77
+ return "\n".join(lines)