qi-coding-agent 0.3.0__tar.gz → 0.4.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 (459) hide show
  1. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/.gitignore +5 -2
  2. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/.pi-lens.json +2 -0
  3. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/PKG-INFO +1 -1
  4. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/design/agent-config-design.md +2 -1
  5. qi_coding_agent-0.4.0/design/architecture-layers.png +0 -0
  6. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/design/development.md +19 -6
  7. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/design/overview.md +1 -1
  8. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/design/pi-alignment.md +8 -1
  9. qi_coding_agent-0.4.0/design/sequence-layers.png +0 -0
  10. qi_coding_agent-0.4.0/design/web-lab.md +472 -0
  11. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/design/web.md +23 -4
  12. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/docs/environment-variables.md +1 -0
  13. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/docs/json.md +1 -1
  14. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/docs/models.md +37 -4
  15. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/docs/providers.md +65 -40
  16. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/docs/settings.md +17 -1
  17. qi_coding_agent-0.4.0/extensions/qi-a2a/README.md +243 -0
  18. qi_coding_agent-0.4.0/extensions/qi-a2a/pyproject.toml +20 -0
  19. qi_coding_agent-0.4.0/extensions/qi-a2a/qi_a2a/__init__.py +109 -0
  20. qi_coding_agent-0.4.0/extensions/qi-a2a/qi_a2a/card.py +232 -0
  21. qi_coding_agent-0.4.0/extensions/qi-a2a/qi_a2a/client.py +319 -0
  22. qi_coding_agent-0.4.0/extensions/qi-a2a/qi_a2a/config.py +371 -0
  23. qi_coding_agent-0.4.0/extensions/qi-a2a/qi_a2a/direct.py +88 -0
  24. qi_coding_agent-0.4.0/extensions/qi-a2a/qi_a2a/proxy.py +353 -0
  25. qi_coding_agent-0.4.0/extensions/qi-a2a/qi_a2a/remote.py +250 -0
  26. qi_coding_agent-0.4.0/extensions/qi-a2a/qi_a2a/state.py +59 -0
  27. qi_coding_agent-0.4.0/extensions/qi-a2a/tests/conftest.py +70 -0
  28. qi_coding_agent-0.4.0/extensions/qi-a2a/tests/test_qi_a2a_config.py +160 -0
  29. qi_coding_agent-0.4.0/extensions/qi-a2a/tests/test_qi_a2a_protocol.py +322 -0
  30. qi_coding_agent-0.4.0/extensions/qi-a2a/tests/test_qi_a2a_proxy.py +332 -0
  31. qi_coding_agent-0.4.0/extensions/qi-a2a/tests/test_qi_a2a_remote.py +311 -0
  32. qi_coding_agent-0.4.0/extensions/qi-agents/README.md +270 -0
  33. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/extensions/qi-agents/pyproject.toml +1 -1
  34. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/extensions/qi-agents/qi_agents/__init__.py +25 -3
  35. qi_coding_agent-0.4.0/extensions/qi-agents/qi_agents/discovery.py +242 -0
  36. qi_coding_agent-0.4.0/extensions/qi-agents/qi_agents/render.py +448 -0
  37. qi_coding_agent-0.4.0/extensions/qi-agents/qi_agents/subagent.py +887 -0
  38. qi_coding_agent-0.4.0/extensions/qi-agents/tests/conftest.py +59 -0
  39. qi_coding_agent-0.4.0/extensions/qi-agents/tests/test_qi_agents_activity.py +266 -0
  40. qi_coding_agent-0.4.0/extensions/qi-agents/tests/test_qi_agents_extension.py +1204 -0
  41. qi_coding_agent-0.4.0/extensions/qi-agents/tests/test_qi_agents_render.py +148 -0
  42. qi_coding_agent-0.4.0/extensions/qi-kb/README.md +134 -0
  43. qi_coding_agent-0.4.0/extensions/qi-kb/docs/design.md +1053 -0
  44. qi_coding_agent-0.4.0/extensions/qi-kb/extension.py +14 -0
  45. qi_coding_agent-0.4.0/extensions/qi-kb/pyproject.toml +19 -0
  46. qi_coding_agent-0.4.0/extensions/qi-kb/qi_kb/__init__.py +108 -0
  47. qi_coding_agent-0.4.0/extensions/qi-kb/qi_kb/auth.py +348 -0
  48. qi_coding_agent-0.4.0/extensions/qi-kb/qi_kb/cli.py +357 -0
  49. qi_coding_agent-0.4.0/extensions/qi-kb/qi_kb/client.py +286 -0
  50. qi_coding_agent-0.4.0/extensions/qi-kb/qi_kb/config.py +514 -0
  51. qi_coding_agent-0.4.0/extensions/qi-kb/qi_kb/errors.py +77 -0
  52. qi_coding_agent-0.4.0/extensions/qi-kb/qi_kb/format.py +199 -0
  53. qi_coding_agent-0.4.0/extensions/qi-kb/qi_kb/paths.py +51 -0
  54. qi_coding_agent-0.4.0/extensions/qi-kb/qi_kb/providers.py +315 -0
  55. qi_coding_agent-0.4.0/extensions/qi-kb/qi_kb/service.py +567 -0
  56. qi_coding_agent-0.4.0/extensions/qi-kb/qi_kb/tools.py +143 -0
  57. qi_coding_agent-0.4.0/extensions/qi-kb/tests/conftest.py +38 -0
  58. qi_coding_agent-0.4.0/extensions/qi-kb/tests/test_qi_kb_cli.py +74 -0
  59. qi_coding_agent-0.4.0/extensions/qi-kb/tests/test_qi_kb_client.py +176 -0
  60. qi_coding_agent-0.4.0/extensions/qi-kb/tests/test_qi_kb_config.py +154 -0
  61. qi_coding_agent-0.4.0/extensions/qi-kb/tests/test_qi_kb_tool.py +100 -0
  62. qi_coding_agent-0.4.0/extensions/qi-lab/README.md +342 -0
  63. qi_coding_agent-0.4.0/extensions/qi-lab/docs/api/README.md +232 -0
  64. qi_coding_agent-0.4.0/extensions/qi-lab/docs/api/a2a.md +240 -0
  65. qi_coding_agent-0.4.0/extensions/qi-lab/docs/api/ag-ui.md +185 -0
  66. qi_coding_agent-0.4.0/extensions/qi-lab/docs/api/agents.md +136 -0
  67. qi_coding_agent-0.4.0/extensions/qi-lab/docs/api/config.md +221 -0
  68. qi_coding_agent-0.4.0/extensions/qi-lab/docs/api/files.md +137 -0
  69. qi_coding_agent-0.4.0/extensions/qi-lab/docs/api/kb.md +310 -0
  70. qi_coding_agent-0.4.0/extensions/qi-lab/docs/api/mcp.md +227 -0
  71. qi_coding_agent-0.4.0/extensions/qi-lab/docs/api/meta.md +100 -0
  72. qi_coding_agent-0.4.0/extensions/qi-lab/docs/api/sessions.md +213 -0
  73. qi_coding_agent-0.4.0/extensions/qi-lab/docs/api/skills.md +266 -0
  74. qi_coding_agent-0.4.0/extensions/qi-lab/docs/api/store.md +226 -0
  75. qi_coding_agent-0.4.0/extensions/qi-lab/docs/api/workspaces.md +101 -0
  76. qi_coding_agent-0.4.0/extensions/qi-lab/pyproject.toml +19 -0
  77. qi_coding_agent-0.4.0/extensions/qi-lab/qi_lab/__init__.py +24 -0
  78. qi_coding_agent-0.4.0/extensions/qi-lab/qi_lab/activity.py +58 -0
  79. qi_coding_agent-0.4.0/extensions/qi-lab/qi_lab/agents.py +120 -0
  80. qi_coding_agent-0.4.0/extensions/qi-lab/qi_lab/agui.py +582 -0
  81. qi_coding_agent-0.4.0/extensions/qi-lab/qi_lab/app.py +2412 -0
  82. qi_coding_agent-0.4.0/extensions/qi-lab/qi_lab/pages/a2a.html +517 -0
  83. qi_coding_agent-0.4.0/extensions/qi-lab/qi_lab/schemas.py +1080 -0
  84. qi_coding_agent-0.4.0/extensions/qi-lab/qi_lab/security.py +72 -0
  85. qi_coding_agent-0.4.0/extensions/qi-lab/qi_lab/serve.py +230 -0
  86. qi_coding_agent-0.4.0/extensions/qi-lab/qi_lab/skills.py +348 -0
  87. qi_coding_agent-0.4.0/extensions/qi-lab/qi_lab/state.py +246 -0
  88. qi_coding_agent-0.4.0/extensions/qi-lab/qi_lab/static/assets/index-Ccv5_d6Y.css +1 -0
  89. qi_coding_agent-0.4.0/extensions/qi-lab/qi_lab/static/assets/index-G0tOoCq8.js +30 -0
  90. qi_coding_agent-0.4.0/extensions/qi-lab/qi_lab/static/index.html +14 -0
  91. qi_coding_agent-0.4.0/extensions/qi-lab/tests/conftest.py +90 -0
  92. qi_coding_agent-0.4.0/extensions/qi-lab/tests/test_lab_a2a_agent_pin.py +292 -0
  93. qi_coding_agent-0.4.0/extensions/qi-lab/tests/test_lab_a2a_api.py +564 -0
  94. qi_coding_agent-0.4.0/extensions/qi-lab/tests/test_lab_a2a_page.py +94 -0
  95. qi_coding_agent-0.4.0/extensions/qi-lab/tests/test_lab_activity.py +417 -0
  96. qi_coding_agent-0.4.0/extensions/qi-lab/tests/test_lab_agent_write_api.py +263 -0
  97. qi_coding_agent-0.4.0/extensions/qi-lab/tests/test_lab_api.py +1174 -0
  98. qi_coding_agent-0.4.0/extensions/qi-lab/tests/test_lab_browse.py +77 -0
  99. qi_coding_agent-0.4.0/extensions/qi-lab/tests/test_lab_docs_api.py +107 -0
  100. qi_coding_agent-0.4.0/extensions/qi-lab/tests/test_lab_extensions_api.py +399 -0
  101. qi_coding_agent-0.4.0/extensions/qi-lab/tests/test_lab_files.py +252 -0
  102. qi_coding_agent-0.4.0/extensions/qi-lab/tests/test_lab_kb_api.py +185 -0
  103. qi_coding_agent-0.4.0/extensions/qi-lab/tests/test_lab_mcp_write_api.py +454 -0
  104. qi_coding_agent-0.4.0/extensions/qi-lab/tests/test_lab_provider_add.py +114 -0
  105. qi_coding_agent-0.4.0/extensions/qi-lab/tests/test_lab_skill_api.py +422 -0
  106. qi_coding_agent-0.4.0/extensions/qi-lab/tests/test_lab_store_api.py +571 -0
  107. qi_coding_agent-0.4.0/extensions/qi-lab/tests/test_lab_subagent_stream.py +329 -0
  108. qi_coding_agent-0.4.0/extensions/qi-lab/ui/package-lock.json +2584 -0
  109. qi_coding_agent-0.4.0/extensions/qi-lab/ui/package.json +38 -0
  110. qi_coding_agent-0.4.0/extensions/qi-lab/ui/scripts/check-design.mjs +200 -0
  111. qi_coding_agent-0.4.0/extensions/qi-lab/ui/scripts/check-dsh-tokens.mjs +344 -0
  112. qi_coding_agent-0.4.0/extensions/qi-lab/ui/src/App.tsx +1213 -0
  113. qi_coding_agent-0.4.0/extensions/qi-lab/ui/src/api/client.test.ts +198 -0
  114. qi_coding_agent-0.4.0/extensions/qi-lab/ui/src/api/client.ts +712 -0
  115. qi_coding_agent-0.4.0/extensions/qi-lab/ui/src/api/contract.test.ts +139 -0
  116. qi_coding_agent-0.4.0/extensions/qi-lab/ui/src/api/types.ts +1019 -0
  117. qi_coding_agent-0.4.0/extensions/qi-lab/ui/src/components/A2APanel.test.ts +129 -0
  118. qi_coding_agent-0.4.0/extensions/qi-lab/ui/src/components/A2APanel.tsx +641 -0
  119. qi_coding_agent-0.4.0/extensions/qi-lab/ui/src/components/AgentDelete.test.ts +110 -0
  120. qi_coding_agent-0.4.0/extensions/qi-lab/ui/src/components/AgentDelete.tsx +89 -0
  121. qi_coding_agent-0.4.0/extensions/qi-lab/ui/src/components/AgentMenu.tsx +177 -0
  122. qi_coding_agent-0.4.0/extensions/qi-lab/ui/src/components/ConfirmDialog.tsx +76 -0
  123. qi_coding_agent-0.4.0/extensions/qi-lab/ui/src/components/DirPicker.tsx +168 -0
  124. qi_coding_agent-0.4.0/extensions/qi-lab/ui/src/components/Dock.tsx +454 -0
  125. qi_coding_agent-0.4.0/extensions/qi-lab/ui/src/components/KbMenu.tsx +151 -0
  126. qi_coding_agent-0.4.0/extensions/qi-lab/ui/src/components/KbPanel.tsx +425 -0
  127. qi_coding_agent-0.4.0/extensions/qi-lab/ui/src/components/McpPanel.test.ts +187 -0
  128. qi_coding_agent-0.4.0/extensions/qi-lab/ui/src/components/McpPanel.tsx +647 -0
  129. qi_coding_agent-0.4.0/extensions/qi-lab/ui/src/components/Rows.tsx +794 -0
  130. qi_coding_agent-0.4.0/extensions/qi-lab/ui/src/components/Settings.tsx +1685 -0
  131. qi_coding_agent-0.4.0/extensions/qi-lab/ui/src/components/StorePanel.tsx +544 -0
  132. qi_coding_agent-0.4.0/extensions/qi-lab/ui/src/components/icons.tsx +554 -0
  133. qi_coding_agent-0.4.0/extensions/qi-lab/ui/src/state/scope.test.ts +210 -0
  134. qi_coding_agent-0.4.0/extensions/qi-lab/ui/src/state/scope.ts +89 -0
  135. qi_coding_agent-0.4.0/extensions/qi-lab/ui/src/state/segments.test.ts +141 -0
  136. qi_coding_agent-0.4.0/extensions/qi-lab/ui/src/state/segments.ts +123 -0
  137. qi_coding_agent-0.4.0/extensions/qi-lab/ui/src/state/stats.test.ts +117 -0
  138. qi_coding_agent-0.4.0/extensions/qi-lab/ui/src/state/turn.test.ts +643 -0
  139. qi_coding_agent-0.4.0/extensions/qi-lab/ui/src/state/turn.ts +983 -0
  140. qi_coding_agent-0.4.0/extensions/qi-lab/ui/src/theme/app.css +4313 -0
  141. qi_coding_agent-0.4.0/extensions/qi-lab/ui/src/theme/tokens.css +659 -0
  142. qi_coding_agent-0.4.0/extensions/qi-lab/ui/vite.config.ts +22 -0
  143. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/extensions/qi-mcp/README.md +2 -1
  144. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/extensions/qi-mcp/pyproject.toml +1 -1
  145. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/extensions/qi-mcp/qi_mcp/role.py +18 -6
  146. qi_coding_agent-0.4.0/extensions/qi-store/README.md +613 -0
  147. qi_coding_agent-0.4.0/extensions/qi-store/docs/config-files.md +146 -0
  148. qi_coding_agent-0.4.0/extensions/qi-store/docs/hikqin-api.md +192 -0
  149. qi_coding_agent-0.4.0/extensions/qi-store/extension.py +14 -0
  150. qi_coding_agent-0.4.0/extensions/qi-store/pyproject.toml +19 -0
  151. qi_coding_agent-0.4.0/extensions/qi-store/qi_store/__init__.py +25 -0
  152. qi_coding_agent-0.4.0/extensions/qi-store/qi_store/actions.py +92 -0
  153. qi_coding_agent-0.4.0/extensions/qi-store/qi_store/catalog.py +213 -0
  154. qi_coding_agent-0.4.0/extensions/qi-store/qi_store/cli.py +1093 -0
  155. qi_coding_agent-0.4.0/extensions/qi-store/qi_store/client.py +295 -0
  156. qi_coding_agent-0.4.0/extensions/qi-store/qi_store/config.py +233 -0
  157. qi_coding_agent-0.4.0/extensions/qi-store/qi_store/errors.py +75 -0
  158. qi_coding_agent-0.4.0/extensions/qi-store/qi_store/installer.py +257 -0
  159. qi_coding_agent-0.4.0/extensions/qi-store/qi_store/kinds/__init__.py +31 -0
  160. qi_coding_agent-0.4.0/extensions/qi-store/qi_store/kinds/a2a.py +87 -0
  161. qi_coding_agent-0.4.0/extensions/qi-store/qi_store/kinds/agent.py +356 -0
  162. qi_coding_agent-0.4.0/extensions/qi-store/qi_store/kinds/base.py +83 -0
  163. qi_coding_agent-0.4.0/extensions/qi-store/qi_store/kinds/kb.py +77 -0
  164. qi_coding_agent-0.4.0/extensions/qi-store/qi_store/kinds/mcp.py +126 -0
  165. qi_coding_agent-0.4.0/extensions/qi-store/qi_store/kinds/skill.py +209 -0
  166. qi_coding_agent-0.4.0/extensions/qi-store/qi_store/ledger.py +142 -0
  167. qi_coding_agent-0.4.0/extensions/qi-store/qi_store/ops.py +108 -0
  168. qi_coding_agent-0.4.0/extensions/qi-store/qi_store/paths.py +86 -0
  169. qi_coding_agent-0.4.0/extensions/qi-store/qi_store/planner.py +86 -0
  170. qi_coding_agent-0.4.0/extensions/qi-store/qi_store/service.py +519 -0
  171. qi_coding_agent-0.4.0/extensions/qi-store/qi_store/verify.py +45 -0
  172. qi_coding_agent-0.4.0/extensions/qi-store/tests/conftest.py +73 -0
  173. qi_coding_agent-0.4.0/extensions/qi-store/tests/fixtures/a2a_agents.json +70 -0
  174. qi_coding_agent-0.4.0/extensions/qi-store/tests/fixtures/agent_detail.json +62 -0
  175. qi_coding_agent-0.4.0/extensions/qi-store/tests/fixtures/agents_list.json +128 -0
  176. qi_coding_agent-0.4.0/extensions/qi-store/tests/fixtures/error_401.json +5 -0
  177. qi_coding_agent-0.4.0/extensions/qi-store/tests/fixtures/login.json +13 -0
  178. qi_coding_agent-0.4.0/extensions/qi-store/tests/fixtures/mcp_server_synthetic.json +21 -0
  179. qi_coding_agent-0.4.0/extensions/qi-store/tests/fixtures/mcp_servers_live_empty.json +6 -0
  180. qi_coding_agent-0.4.0/extensions/qi-store/tests/fixtures/rag_kb_available.json +34 -0
  181. qi_coding_agent-0.4.0/extensions/qi-store/tests/fixtures/skill_detail.json +21 -0
  182. qi_coding_agent-0.4.0/extensions/qi-store/tests/fixtures/skill_files.json +27 -0
  183. qi_coding_agent-0.4.0/extensions/qi-store/tests/fixtures/skills.json +51 -0
  184. qi_coding_agent-0.4.0/extensions/qi-store/tests/qstore_testkit.py +205 -0
  185. qi_coding_agent-0.4.0/extensions/qi-store/tests/test_qi_store_agent_kind.py +323 -0
  186. qi_coding_agent-0.4.0/extensions/qi-store/tests/test_qi_store_cli.py +228 -0
  187. qi_coding_agent-0.4.0/extensions/qi-store/tests/test_qi_store_client.py +204 -0
  188. qi_coding_agent-0.4.0/extensions/qi-store/tests/test_qi_store_config.py +123 -0
  189. qi_coding_agent-0.4.0/extensions/qi-store/tests/test_qi_store_flow.py +452 -0
  190. qi_coding_agent-0.4.0/extensions/qi-store/tests/test_qi_store_kb_kind.py +74 -0
  191. qi_coding_agent-0.4.0/extensions/qi-store/tests/test_qi_store_lifecycle.py +214 -0
  192. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/extensions/qi-web/pyproject.toml +1 -1
  193. qi_coding_agent-0.4.0/extensions/qi-web/qi_web/browse.py +85 -0
  194. qi_coding_agent-0.4.0/extensions/qi-web/qi_web/files.py +230 -0
  195. qi_coding_agent-0.4.0/extensions/qi-web/ui/index.html +13 -0
  196. qi_coding_agent-0.4.0/extensions/qi-web/ui/src/commands.tsx +163 -0
  197. qi_coding_agent-0.4.0/extensions/qi-web/ui/src/components/CommandMenu.tsx +157 -0
  198. qi_coding_agent-0.4.0/extensions/qi-web/ui/src/components/FilePanel.tsx +386 -0
  199. qi_coding_agent-0.4.0/extensions/qi-web/ui/src/components/ModelMenu.test.ts +28 -0
  200. qi_coding_agent-0.4.0/extensions/qi-web/ui/src/components/ModelMenu.tsx +211 -0
  201. qi_coding_agent-0.4.0/extensions/qi-web/ui/src/components/ProjectMenu.tsx +141 -0
  202. qi_coding_agent-0.4.0/extensions/qi-web/ui/src/components/Rail.tsx +371 -0
  203. qi_coding_agent-0.4.0/extensions/qi-web/ui/src/components/RowMenu.tsx +165 -0
  204. qi_coding_agent-0.4.0/extensions/qi-web/ui/src/components/SidebarSection.tsx +126 -0
  205. qi_coding_agent-0.4.0/extensions/qi-web/ui/src/main.tsx +14 -0
  206. qi_coding_agent-0.4.0/extensions/qi-web/ui/src/markdown/cjk.ts +100 -0
  207. qi_coding_agent-0.4.0/extensions/qi-web/ui/src/markdown/markdown.test.ts +121 -0
  208. qi_coding_agent-0.4.0/extensions/qi-web/ui/src/markdown/parse.ts +29 -0
  209. qi_coding_agent-0.4.0/extensions/qi-web/ui/src/markdown/render.tsx +324 -0
  210. qi_coding_agent-0.4.0/extensions/qi-web/ui/src/state/projects.test.ts +265 -0
  211. qi_coding_agent-0.4.0/extensions/qi-web/ui/src/state/projects.ts +233 -0
  212. qi_coding_agent-0.4.0/extensions/qi-web/ui/src/state/route.test.ts +46 -0
  213. qi_coding_agent-0.4.0/extensions/qi-web/ui/src/state/route.ts +40 -0
  214. qi_coding_agent-0.4.0/extensions/qi-web/ui/src/state/stats.ts +85 -0
  215. qi_coding_agent-0.4.0/extensions/qi-web/ui/src/theme/theme.ts +23 -0
  216. qi_coding_agent-0.4.0/extensions/qi-web/ui/src/vite-env.d.ts +5 -0
  217. qi_coding_agent-0.4.0/extensions/qi-web/ui/tsconfig.json +19 -0
  218. qi_coding_agent-0.4.0/extensions/qi-web/ui/vitest.config.ts +15 -0
  219. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/pyproject.toml +6 -2
  220. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/pyrightconfig.json +4 -1
  221. qi_coding_agent-0.4.0/scripts/e2e_ui_lab.py +392 -0
  222. qi_coding_agent-0.4.0/src/qi_agent/__init__.py +33 -0
  223. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/src/qi_agent/auth.py +17 -8
  224. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/src/qi_agent/cli.py +286 -39
  225. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/src/qi_agent/config.py +36 -4
  226. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/src/qi_agent/llm.py +136 -10
  227. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/src/qi_agent/model_catalog.py +15 -2
  228. qi_coding_agent-0.4.0/src/qi_agent/presets.py +487 -0
  229. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/src/qi_agent/prompt.py +25 -18
  230. qi_coding_agent-0.4.0/src/qi_agent/provider_headers.py +49 -0
  231. qi_coding_agent-0.4.0/src/qi_agent/retry.py +146 -0
  232. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/src/qi_agent/runner.py +108 -31
  233. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/src/qi_agent/runtime.py +40 -3
  234. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/src/qi_agent/tui.py +29 -1
  235. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/tests/conftest.py +6 -6
  236. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/tests/test_auth_key.py +16 -0
  237. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/tests/test_cli_init.py +261 -4
  238. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/tests/test_config.py +53 -0
  239. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/tests/test_contract_p0.py +57 -0
  240. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/tests/test_extension_run_agent.py +41 -1
  241. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/tests/test_model_catalog.py +63 -2
  242. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/tests/test_presets.py +216 -16
  243. qi_coding_agent-0.4.0/tests/test_provider_headers.py +225 -0
  244. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/tests/test_qi_mcp_http.py +2 -0
  245. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/tests/test_qi_mcp_role.py +104 -11
  246. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/tests/test_qi_mcp_stdio.py +2 -0
  247. qi_coding_agent-0.4.0/tests/test_retry.py +118 -0
  248. qi_coding_agent-0.4.0/tests/test_runner_retry.py +174 -0
  249. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/tests/test_streaming.py +149 -2
  250. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/tests/test_web_api.py +1 -0
  251. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/tests/test_web_files.py +2 -0
  252. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/uv.lock +1 -1
  253. qi_coding_agent-0.3.0/extensions/qi-agents/README.md +0 -160
  254. qi_coding_agent-0.3.0/extensions/qi-agents/qi_agents/discovery.py +0 -133
  255. qi_coding_agent-0.3.0/extensions/qi-agents/qi_agents/subagent.py +0 -296
  256. qi_coding_agent-0.3.0/src/qi_agent/__init__.py +0 -18
  257. qi_coding_agent-0.3.0/src/qi_agent/presets.py +0 -293
  258. qi_coding_agent-0.3.0/tests/test_qi_agents_extension.py +0 -441
  259. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/.github/workflows/publish.yml +0 -0
  260. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/LICENSE +0 -0
  261. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/README.md +0 -0
  262. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/THIRD_PARTY_NOTICES.md +0 -0
  263. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/design/PLAN.md +0 -0
  264. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/design/bash-allowlist.md +0 -0
  265. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/design/dispatcher.md +0 -0
  266. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/design/extensions-design.md +0 -0
  267. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/design/internals.md +0 -0
  268. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/design/plugins.md +0 -0
  269. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/docs/cli.md +0 -0
  270. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/docs/compaction.md +0 -0
  271. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/docs/configuration.md +0 -0
  272. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/docs/containerization.md +0 -0
  273. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/docs/docs.json +0 -0
  274. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/docs/extensions.md +0 -0
  275. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/docs/how-qi-works.md +0 -0
  276. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/docs/index.md +0 -0
  277. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/docs/keybindings.md +0 -0
  278. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/docs/packages.md +0 -0
  279. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/docs/quickstart.md +0 -0
  280. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/docs/security.md +0 -0
  281. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/docs/session-format.md +0 -0
  282. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/docs/sessions.md +0 -0
  283. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/docs/skills.md +0 -0
  284. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/docs/slash-commands.md +0 -0
  285. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/docs/themes.md +0 -0
  286. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/docs/tui.md +0 -0
  287. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/docs/usage.md +0 -0
  288. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/examples/agents/README.md +0 -0
  289. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/examples/agents/code-analyst/agent.md +0 -0
  290. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/examples/agents/code-analyst/assets/review-rules.md +0 -0
  291. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/examples/agents/code-analyst/mcp.json +0 -0
  292. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/examples/agents/code-analyst/skills/code-review-checklist/SKILL.md +0 -0
  293. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/examples/agents/code-reviewer/agent.md +0 -0
  294. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/examples/agents/data-analyst/agent.md +0 -0
  295. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/examples/agents/doc-writer/agent.md +0 -0
  296. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/examples/agents/doc-writer/assets/doc-style.md +0 -0
  297. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/examples/agents/general/agent.md +0 -0
  298. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/examples/agents/test-runner/agent.md +0 -0
  299. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/examples/agents/writer/agent.md +0 -0
  300. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/examples/extensions/README.md +0 -0
  301. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/examples/extensions/hello/README.md +0 -0
  302. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/examples/extensions/hello/extension.py +0 -0
  303. {qi_coding_agent-0.3.0/extensions/qi-web/qi_web → qi_coding_agent-0.4.0/extensions/qi-lab/qi_lab}/browse.py +0 -0
  304. {qi_coding_agent-0.3.0/extensions/qi-web/qi_web → qi_coding_agent-0.4.0/extensions/qi-lab/qi_lab}/files.py +0 -0
  305. {qi_coding_agent-0.3.0/extensions/qi-web → qi_coding_agent-0.4.0/extensions/qi-lab}/ui/index.html +0 -0
  306. {qi_coding_agent-0.3.0/extensions/qi-web → qi_coding_agent-0.4.0/extensions/qi-lab}/ui/src/commands.tsx +0 -0
  307. {qi_coding_agent-0.3.0/extensions/qi-web → qi_coding_agent-0.4.0/extensions/qi-lab}/ui/src/components/CommandMenu.tsx +0 -0
  308. {qi_coding_agent-0.3.0/extensions/qi-web → qi_coding_agent-0.4.0/extensions/qi-lab}/ui/src/components/FilePanel.tsx +0 -0
  309. {qi_coding_agent-0.3.0/extensions/qi-web → qi_coding_agent-0.4.0/extensions/qi-lab}/ui/src/components/ModelMenu.test.ts +0 -0
  310. {qi_coding_agent-0.3.0/extensions/qi-web → qi_coding_agent-0.4.0/extensions/qi-lab}/ui/src/components/ModelMenu.tsx +0 -0
  311. {qi_coding_agent-0.3.0/extensions/qi-web → qi_coding_agent-0.4.0/extensions/qi-lab}/ui/src/components/ProjectMenu.tsx +0 -0
  312. {qi_coding_agent-0.3.0/extensions/qi-web → qi_coding_agent-0.4.0/extensions/qi-lab}/ui/src/components/Rail.tsx +0 -0
  313. {qi_coding_agent-0.3.0/extensions/qi-web → qi_coding_agent-0.4.0/extensions/qi-lab}/ui/src/components/RowMenu.tsx +0 -0
  314. {qi_coding_agent-0.3.0/extensions/qi-web → qi_coding_agent-0.4.0/extensions/qi-lab}/ui/src/components/SidebarSection.tsx +0 -0
  315. {qi_coding_agent-0.3.0/extensions/qi-web → qi_coding_agent-0.4.0/extensions/qi-lab}/ui/src/main.tsx +0 -0
  316. {qi_coding_agent-0.3.0/extensions/qi-web → qi_coding_agent-0.4.0/extensions/qi-lab}/ui/src/markdown/cjk.ts +0 -0
  317. {qi_coding_agent-0.3.0/extensions/qi-web → qi_coding_agent-0.4.0/extensions/qi-lab}/ui/src/markdown/markdown.test.ts +0 -0
  318. {qi_coding_agent-0.3.0/extensions/qi-web → qi_coding_agent-0.4.0/extensions/qi-lab}/ui/src/markdown/parse.ts +0 -0
  319. {qi_coding_agent-0.3.0/extensions/qi-web → qi_coding_agent-0.4.0/extensions/qi-lab}/ui/src/markdown/render.tsx +0 -0
  320. {qi_coding_agent-0.3.0/extensions/qi-web → qi_coding_agent-0.4.0/extensions/qi-lab}/ui/src/state/projects.test.ts +0 -0
  321. {qi_coding_agent-0.3.0/extensions/qi-web → qi_coding_agent-0.4.0/extensions/qi-lab}/ui/src/state/projects.ts +0 -0
  322. {qi_coding_agent-0.3.0/extensions/qi-web → qi_coding_agent-0.4.0/extensions/qi-lab}/ui/src/state/route.test.ts +0 -0
  323. {qi_coding_agent-0.3.0/extensions/qi-web → qi_coding_agent-0.4.0/extensions/qi-lab}/ui/src/state/route.ts +0 -0
  324. {qi_coding_agent-0.3.0/extensions/qi-web → qi_coding_agent-0.4.0/extensions/qi-lab}/ui/src/state/stats.ts +0 -0
  325. {qi_coding_agent-0.3.0/extensions/qi-web → qi_coding_agent-0.4.0/extensions/qi-lab}/ui/src/theme/theme.ts +0 -0
  326. {qi_coding_agent-0.3.0/extensions/qi-web → qi_coding_agent-0.4.0/extensions/qi-lab}/ui/src/vite-env.d.ts +0 -0
  327. {qi_coding_agent-0.3.0/extensions/qi-web → qi_coding_agent-0.4.0/extensions/qi-lab}/ui/tsconfig.json +0 -0
  328. {qi_coding_agent-0.3.0/extensions/qi-web → qi_coding_agent-0.4.0/extensions/qi-lab}/ui/vitest.config.ts +0 -0
  329. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/extensions/qi-mcp/qi_mcp/__init__.py +0 -0
  330. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/extensions/qi-mcp/qi_mcp/client.py +0 -0
  331. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/extensions/qi-mcp/qi_mcp/config.py +0 -0
  332. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/extensions/qi-mcp/qi_mcp/direct.py +0 -0
  333. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/extensions/qi-mcp/qi_mcp/proxy.py +0 -0
  334. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/extensions/qi-mcp/qi_mcp/servers.py +0 -0
  335. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/extensions/qi-web/README.md +0 -0
  336. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/extensions/qi-web/qi_web/__init__.py +0 -0
  337. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/extensions/qi-web/qi_web/agui.py +0 -0
  338. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/extensions/qi-web/qi_web/app.py +0 -0
  339. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/extensions/qi-web/qi_web/schemas.py +0 -0
  340. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/extensions/qi-web/qi_web/security.py +0 -0
  341. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/extensions/qi-web/qi_web/serve.py +0 -0
  342. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/extensions/qi-web/qi_web/state.py +0 -0
  343. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/extensions/qi-web/qi_web/static/assets/index-96aT_6NK.js +0 -0
  344. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/extensions/qi-web/qi_web/static/assets/index-DePFgopp.css +0 -0
  345. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/extensions/qi-web/qi_web/static/index.html +0 -0
  346. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/extensions/qi-web/ui/package-lock.json +0 -0
  347. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/extensions/qi-web/ui/package.json +0 -0
  348. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/extensions/qi-web/ui/scripts/check-design.mjs +0 -0
  349. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/extensions/qi-web/ui/scripts/check-dsh-tokens.mjs +0 -0
  350. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/extensions/qi-web/ui/src/App.tsx +0 -0
  351. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/extensions/qi-web/ui/src/api/client.test.ts +0 -0
  352. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/extensions/qi-web/ui/src/api/client.ts +0 -0
  353. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/extensions/qi-web/ui/src/api/contract.test.ts +0 -0
  354. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/extensions/qi-web/ui/src/api/types.ts +0 -0
  355. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/extensions/qi-web/ui/src/components/AgentMenu.tsx +0 -0
  356. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/extensions/qi-web/ui/src/components/ConfirmDialog.tsx +0 -0
  357. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/extensions/qi-web/ui/src/components/DirPicker.tsx +0 -0
  358. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/extensions/qi-web/ui/src/components/Dock.tsx +0 -0
  359. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/extensions/qi-web/ui/src/components/Rows.tsx +0 -0
  360. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/extensions/qi-web/ui/src/components/Settings.tsx +0 -0
  361. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/extensions/qi-web/ui/src/components/icons.tsx +0 -0
  362. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/extensions/qi-web/ui/src/state/stats.test.ts +0 -0
  363. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/extensions/qi-web/ui/src/state/turn.test.ts +0 -0
  364. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/extensions/qi-web/ui/src/state/turn.ts +0 -0
  365. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/extensions/qi-web/ui/src/theme/app.css +0 -0
  366. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/extensions/qi-web/ui/src/theme/tokens.css +0 -0
  367. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/extensions/qi-web/ui/vite.config.ts +0 -0
  368. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/scripts/check_versions.py +0 -0
  369. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/scripts/e2e_ui_model.py +0 -0
  370. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/scripts/prune_empty_sessions.py +0 -0
  371. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/src/qi_agent/abort.py +0 -0
  372. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/src/qi_agent/compaction.py +0 -0
  373. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/src/qi_agent/export_html.py +0 -0
  374. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/src/qi_agent/extensions.py +0 -0
  375. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/src/qi_agent/loader.py +0 -0
  376. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/src/qi_agent/models.py +0 -0
  377. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/src/qi_agent/packages.py +0 -0
  378. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/src/qi_agent/paths.py +0 -0
  379. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/src/qi_agent/pep723.py +0 -0
  380. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/src/qi_agent/registry.py +0 -0
  381. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/src/qi_agent/session.py +0 -0
  382. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/src/qi_agent/settings.py +0 -0
  383. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/src/qi_agent/share.py +0 -0
  384. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/src/qi_agent/system_prompt.py +0 -0
  385. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/src/qi_agent/theme.py +0 -0
  386. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/src/qi_agent/themes/README.md +0 -0
  387. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/src/qi_agent/themes/dark.json +0 -0
  388. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/src/qi_agent/themes/light.json +0 -0
  389. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/src/qi_agent/titling.py +0 -0
  390. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/src/qi_agent/tools/__init__.py +0 -0
  391. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/src/qi_agent/tools/shell.py +0 -0
  392. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/src/qi_agent/trust.py +0 -0
  393. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/src/qi_agent/workspaces.py +0 -0
  394. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/tests/test_branch_summary_prompt.py +0 -0
  395. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/tests/test_browse.py +0 -0
  396. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/tests/test_cli_install.py +0 -0
  397. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/tests/test_cli_pi_alignment.py +0 -0
  398. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/tests/test_cli_run.py +0 -0
  399. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/tests/test_cli_tool_flags.py +0 -0
  400. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/tests/test_compaction.py +0 -0
  401. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/tests/test_compaction_events.py +0 -0
  402. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/tests/test_config_resources.py +0 -0
  403. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/tests/test_docs_injection.py +0 -0
  404. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/tests/test_doctor_extensions.py +0 -0
  405. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/tests/test_example_extension.py +0 -0
  406. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/tests/test_export_html.py +0 -0
  407. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/tests/test_extension_alignment.py +0 -0
  408. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/tests/test_extension_bus.py +0 -0
  409. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/tests/test_extension_cli_commands.py +0 -0
  410. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/tests/test_extension_commands.py +0 -0
  411. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/tests/test_extension_deps.py +0 -0
  412. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/tests/test_extension_entry_points.py +0 -0
  413. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/tests/test_extension_events.py +0 -0
  414. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/tests/test_extension_exclusions.py +0 -0
  415. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/tests/test_extension_flags.py +0 -0
  416. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/tests/test_extension_interop.py +0 -0
  417. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/tests/test_extension_messages.py +0 -0
  418. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/tests/test_extension_model.py +0 -0
  419. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/tests/test_extension_resolvers.py +0 -0
  420. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/tests/test_extension_runner_events.py +0 -0
  421. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/tests/test_extension_session.py +0 -0
  422. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/tests/test_extension_tools.py +0 -0
  423. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/tests/test_extension_ui.py +0 -0
  424. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/tests/test_extensions.py +0 -0
  425. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/tests/test_interrupt.py +0 -0
  426. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/tests/test_litellm_offline.py +0 -0
  427. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/tests/test_missing_extension_hints.py +0 -0
  428. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/tests/test_model_thinking_levels.py +0 -0
  429. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/tests/test_package_resource_toggle.py +0 -0
  430. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/tests/test_packages.py +0 -0
  431. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/tests/test_pep723.py +0 -0
  432. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/tests/test_project_root.py +0 -0
  433. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/tests/test_prune_empty_sessions.py +0 -0
  434. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/tests/test_qi_mcp_config.py +0 -0
  435. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/tests/test_qi_mcp_direct.py +0 -0
  436. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/tests/test_qi_mcp_proxy.py +0 -0
  437. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/tests/test_runner_core.py +0 -0
  438. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/tests/test_session_model_entries.py +0 -0
  439. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/tests/test_session_store.py +0 -0
  440. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/tests/test_session_tree.py +0 -0
  441. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/tests/test_settings_skills.py +0 -0
  442. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/tests/test_share.py +0 -0
  443. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/tests/test_shell.py +0 -0
  444. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/tests/test_skill_commands.py +0 -0
  445. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/tests/test_system_prompt.py +0 -0
  446. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/tests/test_theme.py +0 -0
  447. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/tests/test_thinking.py +0 -0
  448. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/tests/test_thinking_budgets.py +0 -0
  449. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/tests/test_third_party_notices.py +0 -0
  450. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/tests/test_titling.py +0 -0
  451. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/tests/test_tool_execution_mode.py +0 -0
  452. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/tests/test_trust_scope.py +0 -0
  453. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/tests/test_tui_extension_render.py +0 -0
  454. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/tests/test_tui_model_restore.py +0 -0
  455. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/tests/test_tui_no_model.py +0 -0
  456. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/tests/test_tui_smoke.py +0 -0
  457. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/tests/test_tui_style.py +0 -0
  458. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/tests/test_web_extensions_api.py +0 -0
  459. {qi_coding_agent-0.3.0 → qi_coding_agent-0.4.0}/tests/test_workspaces.py +0 -0
@@ -22,14 +22,17 @@ data/
22
22
  # pi 自身的运行期目录(tasks 输出等,非源码)
23
23
  .pi/
24
24
 
25
- # qi-web 前端依赖与构建中间产物
25
+ # qi-web / qi-lab 前端依赖与构建中间产物
26
26
  extensions/qi-web/ui/node_modules/
27
27
  extensions/qi-web/ui/dist/
28
+ extensions/qi-lab/ui/node_modules/
29
+ extensions/qi-lab/ui/dist/
28
30
 
29
31
  # 编辑器配置
30
32
  .vscode/
31
33
 
32
34
  # vitest 输出(node 侧测试报告;含绝对路径与时间戳,不入库)。
33
- # 旧 core web 与 qi-web 扩展两条路径都要盖。
35
+ # 旧 core web 与 qi-web / qi-lab 扩展的路径都要盖。
34
36
  web/.vitest/
35
37
  extensions/qi-web/ui/.vitest/
38
+ extensions/qi-lab/ui/.vitest/
@@ -3,6 +3,8 @@
3
3
  "src/qi_agent/web/static/**",
4
4
  "extensions/qi-web/ui/node_modules/**",
5
5
  "extensions/qi-web/ui/dist/**",
6
+ "extensions/qi-lab/ui/node_modules/**",
7
+ "extensions/qi-lab/ui/dist/**",
6
8
  "**/*.min.js"
7
9
  ],
8
10
  "format": {
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: qi-coding-agent
3
- Version: 0.3.0
3
+ Version: 0.4.0
4
4
  Summary: 编码 agent 框架:单 agent core + 扩展(MCP / 多 agent / web)
5
5
  Project-URL: Homepage, https://github.com/viewnah/qi
6
6
  Project-URL: Repository, https://github.com/viewnah/qi
@@ -9,7 +9,8 @@
9
9
  > | 本文的说法 | 现状 |
10
10
  > | --- | --- |
11
11
  > | §4.1 `tools` 省略或 `["*"]` = 全部可用 | **省略 = 继承父**(不是"全部";解释成全部会构成提权)· `Role.tools=None` 的注释写明了这一点 |
12
- > | `display_name` / `keywords` / `include` / `opening` 字段 | `qi_agents/discovery.py` **不解析**这四个;`display_name` 只在读旧会话的 dispatch entry 时回落 |
12
+ > | `display_name` / `keywords` / `include` 字段 | `qi_agents/discovery.py` **不解析**这三个;`display_name` 只在读旧会话的 dispatch entry 时回落 |
13
+ | `opening` 字段 | **已解析**为 `Role.opening`(`message` / `suggestions`),随 `GET /api/agents` 返回;运行期 `qi.opening` 事件仍不再发射 |
13
14
  > | §3 包内置 `builtin/agents/general` 兜底 | P-E4c 已去掉;裸 core 不带角色 |
14
15
  > | §9 数据源(`data_sources.json`) | **已无实现**(`runtime.py`:「v3 里没有 `data_sources` 了」) |
15
16
  > | §8 MCP(v1:只解析与门控) | 已被 **E25 取代**:qi-mcp 有真客户端、代理工具与 `directTools`;现行语义见 qi-mcp README |
@@ -45,13 +45,24 @@ uv run qi --mode json "你好" # 改完想看一眼事件流时最快
45
45
  ## 3. 测试
46
46
 
47
47
  ```bash
48
- .venv/bin/python -m pytest # 全量(53 个测试文件,约 50 秒)
49
- .venv/bin/python -m pytest -q tests/test_session.py # 单个文件
48
+ .venv/bin/python -m pytest # 全量(88 个测试文件,约 90 秒)
49
+ .venv/bin/python -m pytest -q tests/test_session_store.py # 单个文件
50
50
  uv run pytest -q # 等价写法
51
51
  ```
52
52
 
53
53
  **qi 没有 `test.sh`** —— 上面就是唯一入口(别去敲不存在的包装脚本)。
54
54
 
55
+ ### 扩展的测试放扩展自己目录下
56
+
57
+ `tests/` 是**宿主**的用例;扩展自带的用例放各自目录(`extensions/qi-agents/tests/`、
58
+ `extensions/qi-lab/tests/`),不往根目录里搬 —— 扩展是独立发行包,测试跟着它走。两个前提缺一不可:
59
+
60
+ 1. **`pyproject.toml` 的 `testpaths` 要同时登记**新目录。pytest 只认列出来的目录,
61
+ 忘了登记不会报错,只是那一批测试**静默不跑**(没失败、也没覆盖);
62
+ 2. **conftest 按目录生效**,根 `tests/conftest.py` 覆盖不到子目录 —— 所以每个扩展的 tests/
63
+ 自带一份同源精简版(entry-point stub、`~/.qi` 隔离、必要时再加 `minimal_config`)。
64
+ 改根 conftest 的隔离逻辑时**两边一起改**,否则隔离只对一半测试生效。
65
+
55
66
  ### 默认不装载"本机真装的扩展"
56
67
 
57
68
  `tests/conftest.py` 里有一个 autouse 夹具,把 `qi.extensions` 这组 entry point **stub 成空**。
@@ -82,7 +93,8 @@ pytestmark = pytest.mark.real_extensions # 只对这类文件生效
82
93
 
83
94
  ```jsonc
84
95
  "include": ["src", "tests", "extensions"],
85
- "extraPaths": ["extensions/qi-agents", "extensions/qi-mcp", "extensions/qi-web", "src"]
96
+ "extraPaths": ["extensions/qi-agents", "extensions/qi-mcp", "extensions/qi-web",
97
+ "extensions/qi-lab", "src"]
86
98
  ```
87
99
 
88
100
  `extraPaths` 是为了让跨包 import(`from qi_agents.discovery import discover`)在类型检查器里也能解析 ——
@@ -96,14 +108,15 @@ pytestmark = pytest.mark.real_extensions # 只对这类文件生效
96
108
 
97
109
  ```text
98
110
  src/qi_agent/ # core:单包(一个 wheel)。裸启动 = 单 agent
99
- extensions/ # 三个独立 pip 包,各自有自己的 pyproject.toml / README
100
- qi-agents/ # 角色系统 + subagent 委派
111
+ extensions/ # 四个独立 pip 包,各自有自己的 pyproject.toml / README / tests
112
+ qi-agents/ # 角色系统 + subagent 委派(用例在 qi-agents/tests/)
101
113
  qi-mcp/ # MCP 支持
102
114
  qi-web/ # HTTP 宿主 + 官方 UI(UI 在 qi-web/ui/,自带 package.json)
115
+ qi-lab/ # qi-web 的副本 + 分化(用例在 qi-lab/tests/,契约在 qi-lab/docs/api/)
103
116
  design/ # 内部设计、决策记录、变更记录 —— **不进 wheel、不注入提示词**
104
117
  docs/ # 手册(见 docs/index.md)+ docs.json(导航清单)
105
118
  examples/ # 教学样例(不自动加载)
106
- tests/ # pytest
119
+ tests/ # 宿主的 pytest 用例(扩展自带的在各自 extensions/*/tests/)
107
120
  ```
108
121
 
109
122
  判据很简单:**只有 `src/qi_agent/` 进 wheel**;`docs/` 目前也不进(要把手册随包发布得改
@@ -42,7 +42,7 @@ core 移除:core 只认 `RunSpec`,而且 `AgentRunner` **不再自己拼 prompt*
42
42
  | --- | --- | --- |
43
43
  | agent | **内容**:自包含目录 `agents/<name>/`(`agent.md` + `skills/` + `mcp.json`);frontmatter + 正文即 system prompt。**v3 归 qi-agents** | [qi-agents README](../extensions/qi-agents/README.md) |
44
44
  | agent 位置 | **2 处**:`~/.qi/agent/agents/` → `<cwd>/.qi/agents/`(v1 还有"包内置 `general`"那层,P-E4c 删除);项目覆盖全局;同层重复报错 | [agent-config-design.md §3](agent-config-design.md) |
45
- | agent.md 字段 | **v3 只有 `name` / `description` / `tools` / `model`**;`tools: None` = **继承父**(不是"全部":那会提权)。v1 还有 `display_name` / `keywords` / `include` / `opening` | [agent-config-design.md §4](agent-config-design.md) |
45
+ | agent.md 字段 | **v3 有 `name` / `description` / `tools` / `model` / `opening`**;`tools: None` = **继承父**(不是"全部":那会提权)。`opening` = 开场白 + 选择期快捷提问。v1 还有 `display_name` / `keywords` / `include` | [agent-config-design.md §4](agent-config-design.md) |
46
46
  | 技能 | 私有自动绑定、渐进披露、无内置共享库;同一 agent 内同名报错 | [skills.md](../docs/skills.md) |
47
47
  | MCP | 全局 `~/.qi/agent/mcp.json` + 项目 `.qi/mcp.json`(项目覆盖全局)+ 角色私有 `mcp.json`;角色能不能用由它的 `tools:` 里写什么决定(**默认拒绝**) | [qi-mcp README](../extensions/qi-mcp/README.md) |
48
48
  | 数据源 | 设计上住在 agent `data_sources.json`(私有,凭证 env);**v3 无实现**(没有消费它的扩展) | [agent-config-design.md §9](agent-config-design.md) |
@@ -110,6 +110,11 @@ qi 在这一层**刻意与 pi 保持一致**:字段名、命令名、`/tree` 语
110
110
  | 订阅登录(Claude Pro/Max、Copilot、Codex、xAI) | **支持**(OAuth,带刷新) | **不支持** —— 只有 API key。`print-bearer-token` 与 `--no-refresh` 为兼容 pi 命令面而存在,语义是空操作 |
111
111
  | auth store 结构 | `type` 支持多种(含 OAuth 凭证) | 只有 `type: api_key` |
112
112
  | 云 provider(Azure / Bedrock / Vertex / Cloudflare) | 有独立章节 | 走 litellm 通用 provider 配置,没有专门文档 |
113
+ | 小米的四个 provider | `xiaomi`(按量付费)、`xiaomi-token-plan-cn/-sgp/-ams`(套餐) | 同 拆法:`mimo`(按量付费)+ `mimo-token-plan`(CN 套餐,`mimo-token-plan-cn` 为别名;sgp/ams 换 baseUrl) |
114
+ | 其余套餐/订阅变体 | `zai` / `zai-coding-cn`(智谱)、`qwen-token-plan-cn` / `-individual`(阿里)、`kimi-coding`(月之暗面,Anthropic 形态) | 同 拆法:`zai-coding` / `zai-coding-cn`、`qwen-token-plan` / `-cn`、`kimi-coding`;区域差异用 baseUrl 表达,key 环境变量各一套 |
115
+ | 国际站 / 国内站命名 | `moonshotai` / `moonshotai-cn`、`minimax` / `minimax-cn`、`zai` / `zai-coding-cn` | 同约定:**裸名 = 国际站,`-cn` = 国内站**(`zai` / `zai-cn`、`qwen` / `qwen-cn`、`moonshot` / `moonshot-cn`、`minimax` / `minimax-cn`);旧名 `zhipu` / `dashscope` 留作别名 |
116
+ | 内置 provider(预置) | opencode / opencode-go / xiaomi 等随 pi-ai 发布的模型目录 | `presets.py` 预置表;opencode 两个(Zen 按量付费 / Go 套餐额度),端点与 pi 的 `models-store.json` 对齐(`/inference/…`;`api`+`baseUrl` 落在**模型**上),种子 id 对厂商 `/models` 目录核过 |
117
+ | OpenCode 会话头 `x-opencode-session` | `withOpenCodeSessionHeader` 包住全部 4 种 api 实现自动注入 | **同**(内置 `provider_headers.py`:值 = 当前会话 id,没会话回退 `"qi"`;provider/模型 `headers` 可覆盖,扩展事件最后跑) |
113
118
 
114
119
  **没有 OAuth 的直接后果**:用订阅额度(而非 API key)的用户在 qi 上跑不通,必须换成 API key。
115
120
  要补这块,需要的是 auth store 的 `type` 扩展 + 刷新逻辑 —— 现在没有([providers.md](../docs/providers.md) 因此不描述不存在的机制)。
@@ -297,6 +302,8 @@ pi 的 `ToolDefinition.executionMode` 是 `"sequential" | "parallel"`(默认顺
297
302
  | `apiKey` 值语法 | `!cmd` / `$ENV` / 转义 | 同 |
298
303
  | `auth.json` 结构 | `type: api_key` 等 | 同格式,但只有 `api_key` 一种 |
299
304
  | **分派模型**(`routerProvider` / `routerModel`) | pi 无此概念(qi v1 的 Dispatcher 用) | **已作废**:`auto` 分派取消,core 是单 agent。配置里这两个键仍在(老配置不报错),但没有自动分派会用到它们;`qi doctor` 仍会打印解析结果 |
305
+ | 模型数据里的 API 形态 | 模型数据全量标注 `api` + `baseUrl`,按 `model.api` 分发到实现(api map) | 同语义走**覆盖链**:`models[].api` / `models[].baseUrl` > `providers.<name>.api|baseUrl`(默认值)> `openai-completions`。预置物化照 pi 的目录形状**每条模型都写 `api`+`baseUrl`**(单端点厂商从统一值展开),所以端点随形态变后缀(opencode:`/inference/v1` vs `/inference`)与单端点(deepseek/mimo)是同一形状;mimo 的 anthropic 端点由此成对表达 |
306
+ | `openai-responses` 的请求形态 | 直接用 responses 实现(打 `/v1/responses`) | 走 litellm 的 `openai/responses/` 前缀桥接(修复后与 pi 同形态;此前被当 chat completions 发) |
300
307
 
301
308
  ## 13. TUI(原 `tui.md` 的几段对照)
302
309
 
@@ -341,7 +348,7 @@ pi 的 `~/.pi/agent/models-store.json` 不是用户配置,而是**远程模型
341
348
  | --- | --- |
342
349
  | `cli.md` | 头部「参数尽量与 pi 保持一致」;§1/§2/§4/§5/§6 表格的「pi 对齐」整列(逐个开关的命令名/✅ 对照);各单元格里的出处注(`Print response and exit`、`pi --tools`/`-xt`/`-nbt`/`-nt`、`pi -e`、`pi --models`、`pi --api-key`、`pi -ne`/`-nc`、`pi config`、`pi /login` `/logout`、`pi auth print-*`/`check` 的 0/1/2 退出码);§3 `remove`「与 pi 同义」、`update` 默认「pi 同默认」、`--models` 拉远端目录;§4「面板/清单范围与 pi 逐字相同」、`--no-refresh` 为兼容 pi 命令面;§7 `--offline` 对齐 pi 的语义、输出约定与轮次/中断表的 pi 对照(`killTrackedDetachedChildren`、`shouldStopAfterTurn`);§8 二期「pi 能当场换渲染器」 |
343
350
  | `how-qi-works.md` | 标题「8 个对齐 pi core tools」;`find` 与 `glob` 的命名分歧(hikqin/pi);`powershell`「pi 同款、参数与 UTF-8 前缀照搬 pi」;shell 解析顺序对齐 pi(`utils/shell.js`、`commandTransport`);`edit` 按 pi 精确编辑;截断策略对齐 pi 的 `output-accumulator`;会话环境变量对齐 `exposeSessionEnvironment`;bash 无过滤「与 pi 取向一致」+ pi `docs/security.md` 引文;`--tools`/`defaultTools` 对齐;`shellPath` 对齐;stdin 对齐 pi 的 `ignore`;容器化路线;文件工具路径限会话目录「与 pi 同为进程权限模型」;真实文件系统「pi 路线」;变更记录「与 pi 对齐」 |
344
- | `settings.md` | 「文件位置与字段名对齐 pi」;全局/项目配对 `~/.pi/agent/` ↔ `<cwd>/.pi/`;数组整体替换「与 pi 一致」;`shellPath`/`skillsEnabled`/`enableSkillCommands`/`editorPaddingX`/`outputPad`/`autocompleteMaxVisible` 的 pi 默认值;`tuiMode`「qi 默认与 pi 不同(pi 默认 regular)」;第二张表的「pi 中的用途」列;`branchSummary`(pi 的 defaults to no summary);`thinkingBudgets`(pi 另有内置默认表);`defaultThinkingLevel`(`DEFAULT_THINKING_LEVEL`);`defaultTools`「pi 同义」;`retry.provider`(`getProviderRetrySettings`,pi 用毫秒);`retry.enabled`/`maxRetryDelayMs`(pi 有回合级退避重试);`extensions`「对齐 pi」 |
351
+ | `settings.md` | 「文件位置与字段名对齐 pi」;全局/项目配对 `~/.pi/agent/` ↔ `<cwd>/.pi/`;数组整体替换「与 pi 一致」;`shellPath`/`skillsEnabled`/`enableSkillCommands`/`editorPaddingX`/`outputPad`/`autocompleteMaxVisible` 的 pi 默认值;`tuiMode`「qi 默认与 pi 不同(pi 默认 regular)」;第二张表的「pi 中的用途」列;`branchSummary`(pi 的 defaults to no summary);`thinkingBudgets`(pi 另有内置默认表);`defaultThinkingLevel`(`DEFAULT_THINKING_LEVEL`);`defaultTools`「pi 同义」;`retry.provider`(`getProviderRetrySettings`,pi 用毫秒);`retry.enabled`/`maxRetries`/`baseDelayMs`/`maxAgentDelayMs`(**已接**:agent 级退避重试,见 docs/settings.md §8);`extensions`「对齐 pi」 |
345
352
  | `configuration.md` | 头部「对齐 pi 的 `core/system-prompt.js`」;「与 pi 的差异(语义)」小节;§3「pi 同款行为」;§4 三处(「不写 pi 那句"你可能还有别的工具"」、pi 的条件化 guidelines、措辞「与 pi 同形」);§5 三处(「对齐 pi」、「pi 会注入空块」、pi 的 `git worktree` 影子去重);§6 三处(「pi 式 XML」×2、「pi 同款」);§6.1 标题「pi 的 `Additional docs`」与「pi 把"主题 → 文件"写死在源码里」;§6.2「pi 的 text or file contents 口径」;§8 决策表(`customPrompt`、`APPEND_SYSTEM.md`、工具清单措辞、XML 形态) |
346
353
  | `session-format.md` | `parentSession`「pi 同名字段」;`firstMessage` 回落;`isChanging`;`isSettingsEntry`;`getSessionContextSettings` + `restoredModel`;`hasConfiguredAuth`;`appendModelChange`(只在新会话写);`modelId` 命名差异(pi 驼峰 vs qi `model_id`);`_persist`;`SessionManager` 构造时就 `newSession()` |
347
354
  | `tui.md` | §1「逐项对齐 pi」+「以 pi 的 `modes/interactive` 为基线、`theme/*.json` 逐字移植、渲染细节对照过 `user-message.js`/`assistant-message.js`/`tool-execution.js`/`footer.js`/`dynamic-border.js`」;§1.1「与 pi 同名同义,默认相反」+「pi 的默认 `regular`」行;样例里「照搬 pi 句式」;§1.3「命令选择器 = pi 的 `showSelector()`」「`pi_select_text` 的 `SelectList` 版式」「勾选标记是 pi 的 `✓`/空格」;`md*`/`syntax*` 键;已知差异「Textual 与 pi 自研渲染器的边界」「pi 能当场换渲染器」「pi 有 `fullscreenExitOutput`」;§2 命令表里的 `showModelSelector`、`getAvailableSnapshot()`、`→ ✓ 模型 [provider]` 行、「与 pi 的差异:pi 的 `/login` 主要做订阅登录(`auth.oauth`)」、「对齐 pi」;会话树「对齐 pi 的 `id`/`parentId`」+ 整列 pi + 「pi 在加载时迁移」;树键位「pi 的 `app.tree.*`」;压缩「对齐 pi 的 `core/compaction`」「pi 同款底色块」;键位「已对齐 pi;`core/keybindings.js`」+ 整列「pi 的 action」;思考「对齐 pi 的 `thinkingLevel`」「按 pi 的写法显示 `• thinking off`」「pi `DEFAULT_THINKING_LEVEL`」;「匹配 pi 语义」「`ctrl+p` 在 pi 里是切模型」;「尚未对齐」表头「pi 用途」;会话选择器「对齐 pi 的 `SessionSelectorComponent`」「pi 的三档同名同义」「版式与 pi 一致」「pi 的 `firstMessage` 回落」;补全「对齐 pi 的 autocomplete / `handleBashCommand`」「`getArgumentCompletions`」「`select-list.js` 版式」「来源标签是 pi 的口径」;输入层「对齐 pi `pi-tui/components/editor.js`」+ 整列「pi 的 action」「`undo`(pi 不用 `ctrl+z`)」「`kill-ring.js`」;§3「语义对齐 pi」+ 整列 pi + 「与 pi 一致」 |