qi-coding-agent 0.2.1__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.
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/.gitignore +5 -2
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/.pi-lens.json +2 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/PKG-INFO +1 -1
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/design/PLAN.md +3 -3
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/design/agent-config-design.md +8 -7
- qi_coding_agent-0.4.0/design/architecture-layers.png +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/design/development.md +19 -6
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/design/extensions-design.md +1 -1
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/design/internals.md +2 -2
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/design/overview.md +5 -5
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/design/pi-alignment.md +11 -4
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/design/plugins.md +1 -1
- qi_coding_agent-0.4.0/design/sequence-layers.png +0 -0
- qi_coding_agent-0.4.0/design/web-lab.md +472 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/design/web.md +25 -6
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/docs/configuration.md +10 -2
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/docs/environment-variables.md +2 -1
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/docs/extensions.md +2 -2
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/docs/how-qi-works.md +1 -1
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/docs/json.md +1 -1
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/docs/models.md +39 -6
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/docs/packages.md +2 -2
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/docs/providers.md +66 -41
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/docs/security.md +2 -2
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/docs/settings.md +27 -7
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/docs/skills.md +6 -6
- qi_coding_agent-0.4.0/extensions/qi-a2a/README.md +243 -0
- qi_coding_agent-0.4.0/extensions/qi-a2a/pyproject.toml +20 -0
- qi_coding_agent-0.4.0/extensions/qi-a2a/qi_a2a/__init__.py +109 -0
- qi_coding_agent-0.4.0/extensions/qi-a2a/qi_a2a/card.py +232 -0
- qi_coding_agent-0.4.0/extensions/qi-a2a/qi_a2a/client.py +319 -0
- qi_coding_agent-0.4.0/extensions/qi-a2a/qi_a2a/config.py +371 -0
- qi_coding_agent-0.4.0/extensions/qi-a2a/qi_a2a/direct.py +88 -0
- qi_coding_agent-0.4.0/extensions/qi-a2a/qi_a2a/proxy.py +353 -0
- qi_coding_agent-0.4.0/extensions/qi-a2a/qi_a2a/remote.py +250 -0
- qi_coding_agent-0.4.0/extensions/qi-a2a/qi_a2a/state.py +59 -0
- qi_coding_agent-0.4.0/extensions/qi-a2a/tests/conftest.py +70 -0
- qi_coding_agent-0.4.0/extensions/qi-a2a/tests/test_qi_a2a_config.py +160 -0
- qi_coding_agent-0.4.0/extensions/qi-a2a/tests/test_qi_a2a_protocol.py +322 -0
- qi_coding_agent-0.4.0/extensions/qi-a2a/tests/test_qi_a2a_proxy.py +332 -0
- qi_coding_agent-0.4.0/extensions/qi-a2a/tests/test_qi_a2a_remote.py +311 -0
- qi_coding_agent-0.4.0/extensions/qi-agents/README.md +270 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/extensions/qi-agents/pyproject.toml +1 -1
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/extensions/qi-agents/qi_agents/__init__.py +25 -3
- qi_coding_agent-0.4.0/extensions/qi-agents/qi_agents/discovery.py +242 -0
- qi_coding_agent-0.4.0/extensions/qi-agents/qi_agents/render.py +448 -0
- qi_coding_agent-0.4.0/extensions/qi-agents/qi_agents/subagent.py +887 -0
- qi_coding_agent-0.4.0/extensions/qi-agents/tests/conftest.py +59 -0
- qi_coding_agent-0.4.0/extensions/qi-agents/tests/test_qi_agents_activity.py +266 -0
- qi_coding_agent-0.4.0/extensions/qi-agents/tests/test_qi_agents_extension.py +1204 -0
- qi_coding_agent-0.4.0/extensions/qi-agents/tests/test_qi_agents_render.py +148 -0
- qi_coding_agent-0.4.0/extensions/qi-kb/README.md +134 -0
- qi_coding_agent-0.4.0/extensions/qi-kb/docs/design.md +1053 -0
- qi_coding_agent-0.4.0/extensions/qi-kb/extension.py +14 -0
- qi_coding_agent-0.4.0/extensions/qi-kb/pyproject.toml +19 -0
- qi_coding_agent-0.4.0/extensions/qi-kb/qi_kb/__init__.py +108 -0
- qi_coding_agent-0.4.0/extensions/qi-kb/qi_kb/auth.py +348 -0
- qi_coding_agent-0.4.0/extensions/qi-kb/qi_kb/cli.py +357 -0
- qi_coding_agent-0.4.0/extensions/qi-kb/qi_kb/client.py +286 -0
- qi_coding_agent-0.4.0/extensions/qi-kb/qi_kb/config.py +514 -0
- qi_coding_agent-0.4.0/extensions/qi-kb/qi_kb/errors.py +77 -0
- qi_coding_agent-0.4.0/extensions/qi-kb/qi_kb/format.py +199 -0
- qi_coding_agent-0.4.0/extensions/qi-kb/qi_kb/paths.py +51 -0
- qi_coding_agent-0.4.0/extensions/qi-kb/qi_kb/providers.py +315 -0
- qi_coding_agent-0.4.0/extensions/qi-kb/qi_kb/service.py +567 -0
- qi_coding_agent-0.4.0/extensions/qi-kb/qi_kb/tools.py +143 -0
- qi_coding_agent-0.4.0/extensions/qi-kb/tests/conftest.py +38 -0
- qi_coding_agent-0.4.0/extensions/qi-kb/tests/test_qi_kb_cli.py +74 -0
- qi_coding_agent-0.4.0/extensions/qi-kb/tests/test_qi_kb_client.py +176 -0
- qi_coding_agent-0.4.0/extensions/qi-kb/tests/test_qi_kb_config.py +154 -0
- qi_coding_agent-0.4.0/extensions/qi-kb/tests/test_qi_kb_tool.py +100 -0
- qi_coding_agent-0.4.0/extensions/qi-lab/README.md +342 -0
- qi_coding_agent-0.4.0/extensions/qi-lab/docs/api/README.md +232 -0
- qi_coding_agent-0.4.0/extensions/qi-lab/docs/api/a2a.md +240 -0
- qi_coding_agent-0.4.0/extensions/qi-lab/docs/api/ag-ui.md +185 -0
- qi_coding_agent-0.4.0/extensions/qi-lab/docs/api/agents.md +136 -0
- qi_coding_agent-0.4.0/extensions/qi-lab/docs/api/config.md +221 -0
- qi_coding_agent-0.4.0/extensions/qi-lab/docs/api/files.md +137 -0
- qi_coding_agent-0.4.0/extensions/qi-lab/docs/api/kb.md +310 -0
- qi_coding_agent-0.4.0/extensions/qi-lab/docs/api/mcp.md +227 -0
- qi_coding_agent-0.4.0/extensions/qi-lab/docs/api/meta.md +100 -0
- qi_coding_agent-0.4.0/extensions/qi-lab/docs/api/sessions.md +213 -0
- qi_coding_agent-0.4.0/extensions/qi-lab/docs/api/skills.md +266 -0
- qi_coding_agent-0.4.0/extensions/qi-lab/docs/api/store.md +226 -0
- qi_coding_agent-0.4.0/extensions/qi-lab/docs/api/workspaces.md +101 -0
- qi_coding_agent-0.4.0/extensions/qi-lab/pyproject.toml +19 -0
- qi_coding_agent-0.4.0/extensions/qi-lab/qi_lab/__init__.py +24 -0
- qi_coding_agent-0.4.0/extensions/qi-lab/qi_lab/activity.py +58 -0
- qi_coding_agent-0.4.0/extensions/qi-lab/qi_lab/agents.py +120 -0
- qi_coding_agent-0.4.0/extensions/qi-lab/qi_lab/agui.py +582 -0
- qi_coding_agent-0.4.0/extensions/qi-lab/qi_lab/app.py +2412 -0
- qi_coding_agent-0.4.0/extensions/qi-lab/qi_lab/pages/a2a.html +517 -0
- qi_coding_agent-0.4.0/extensions/qi-lab/qi_lab/schemas.py +1080 -0
- qi_coding_agent-0.4.0/extensions/qi-lab/qi_lab/security.py +72 -0
- qi_coding_agent-0.4.0/extensions/qi-lab/qi_lab/serve.py +230 -0
- qi_coding_agent-0.4.0/extensions/qi-lab/qi_lab/skills.py +348 -0
- qi_coding_agent-0.4.0/extensions/qi-lab/qi_lab/state.py +246 -0
- qi_coding_agent-0.4.0/extensions/qi-lab/qi_lab/static/assets/index-Ccv5_d6Y.css +1 -0
- qi_coding_agent-0.4.0/extensions/qi-lab/qi_lab/static/assets/index-G0tOoCq8.js +30 -0
- qi_coding_agent-0.4.0/extensions/qi-lab/qi_lab/static/index.html +14 -0
- qi_coding_agent-0.4.0/extensions/qi-lab/tests/conftest.py +90 -0
- qi_coding_agent-0.4.0/extensions/qi-lab/tests/test_lab_a2a_agent_pin.py +292 -0
- qi_coding_agent-0.4.0/extensions/qi-lab/tests/test_lab_a2a_api.py +564 -0
- qi_coding_agent-0.4.0/extensions/qi-lab/tests/test_lab_a2a_page.py +94 -0
- qi_coding_agent-0.4.0/extensions/qi-lab/tests/test_lab_activity.py +417 -0
- qi_coding_agent-0.4.0/extensions/qi-lab/tests/test_lab_agent_write_api.py +263 -0
- qi_coding_agent-0.4.0/extensions/qi-lab/tests/test_lab_api.py +1174 -0
- qi_coding_agent-0.4.0/extensions/qi-lab/tests/test_lab_browse.py +77 -0
- qi_coding_agent-0.4.0/extensions/qi-lab/tests/test_lab_docs_api.py +107 -0
- qi_coding_agent-0.4.0/extensions/qi-lab/tests/test_lab_extensions_api.py +399 -0
- qi_coding_agent-0.4.0/extensions/qi-lab/tests/test_lab_files.py +252 -0
- qi_coding_agent-0.4.0/extensions/qi-lab/tests/test_lab_kb_api.py +185 -0
- qi_coding_agent-0.4.0/extensions/qi-lab/tests/test_lab_mcp_write_api.py +454 -0
- qi_coding_agent-0.4.0/extensions/qi-lab/tests/test_lab_provider_add.py +114 -0
- qi_coding_agent-0.4.0/extensions/qi-lab/tests/test_lab_skill_api.py +422 -0
- qi_coding_agent-0.4.0/extensions/qi-lab/tests/test_lab_store_api.py +571 -0
- qi_coding_agent-0.4.0/extensions/qi-lab/tests/test_lab_subagent_stream.py +329 -0
- qi_coding_agent-0.4.0/extensions/qi-lab/ui/package-lock.json +2584 -0
- qi_coding_agent-0.4.0/extensions/qi-lab/ui/package.json +38 -0
- qi_coding_agent-0.4.0/extensions/qi-lab/ui/scripts/check-design.mjs +200 -0
- qi_coding_agent-0.4.0/extensions/qi-lab/ui/scripts/check-dsh-tokens.mjs +344 -0
- qi_coding_agent-0.4.0/extensions/qi-lab/ui/src/App.tsx +1213 -0
- qi_coding_agent-0.4.0/extensions/qi-lab/ui/src/api/client.test.ts +198 -0
- qi_coding_agent-0.4.0/extensions/qi-lab/ui/src/api/client.ts +712 -0
- qi_coding_agent-0.4.0/extensions/qi-lab/ui/src/api/contract.test.ts +139 -0
- qi_coding_agent-0.4.0/extensions/qi-lab/ui/src/api/types.ts +1019 -0
- qi_coding_agent-0.4.0/extensions/qi-lab/ui/src/components/A2APanel.test.ts +129 -0
- qi_coding_agent-0.4.0/extensions/qi-lab/ui/src/components/A2APanel.tsx +641 -0
- qi_coding_agent-0.4.0/extensions/qi-lab/ui/src/components/AgentDelete.test.ts +110 -0
- qi_coding_agent-0.4.0/extensions/qi-lab/ui/src/components/AgentDelete.tsx +89 -0
- qi_coding_agent-0.4.0/extensions/qi-lab/ui/src/components/AgentMenu.tsx +177 -0
- qi_coding_agent-0.4.0/extensions/qi-lab/ui/src/components/ConfirmDialog.tsx +76 -0
- qi_coding_agent-0.4.0/extensions/qi-lab/ui/src/components/DirPicker.tsx +168 -0
- qi_coding_agent-0.4.0/extensions/qi-lab/ui/src/components/Dock.tsx +454 -0
- qi_coding_agent-0.4.0/extensions/qi-lab/ui/src/components/KbMenu.tsx +151 -0
- qi_coding_agent-0.4.0/extensions/qi-lab/ui/src/components/KbPanel.tsx +425 -0
- qi_coding_agent-0.4.0/extensions/qi-lab/ui/src/components/McpPanel.test.ts +187 -0
- qi_coding_agent-0.4.0/extensions/qi-lab/ui/src/components/McpPanel.tsx +647 -0
- qi_coding_agent-0.4.0/extensions/qi-lab/ui/src/components/Rows.tsx +794 -0
- qi_coding_agent-0.4.0/extensions/qi-lab/ui/src/components/Settings.tsx +1685 -0
- qi_coding_agent-0.4.0/extensions/qi-lab/ui/src/components/StorePanel.tsx +544 -0
- qi_coding_agent-0.4.0/extensions/qi-lab/ui/src/components/icons.tsx +554 -0
- qi_coding_agent-0.4.0/extensions/qi-lab/ui/src/state/scope.test.ts +210 -0
- qi_coding_agent-0.4.0/extensions/qi-lab/ui/src/state/scope.ts +89 -0
- qi_coding_agent-0.4.0/extensions/qi-lab/ui/src/state/segments.test.ts +141 -0
- qi_coding_agent-0.4.0/extensions/qi-lab/ui/src/state/segments.ts +123 -0
- qi_coding_agent-0.4.0/extensions/qi-lab/ui/src/state/stats.test.ts +117 -0
- qi_coding_agent-0.4.0/extensions/qi-lab/ui/src/state/turn.test.ts +643 -0
- qi_coding_agent-0.4.0/extensions/qi-lab/ui/src/state/turn.ts +983 -0
- qi_coding_agent-0.4.0/extensions/qi-lab/ui/src/theme/app.css +4313 -0
- qi_coding_agent-0.4.0/extensions/qi-lab/ui/src/theme/tokens.css +659 -0
- qi_coding_agent-0.4.0/extensions/qi-lab/ui/vite.config.ts +22 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/extensions/qi-mcp/README.md +2 -1
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/extensions/qi-mcp/pyproject.toml +1 -1
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/extensions/qi-mcp/qi_mcp/role.py +18 -6
- qi_coding_agent-0.4.0/extensions/qi-store/README.md +613 -0
- qi_coding_agent-0.4.0/extensions/qi-store/docs/config-files.md +146 -0
- qi_coding_agent-0.4.0/extensions/qi-store/docs/hikqin-api.md +192 -0
- qi_coding_agent-0.4.0/extensions/qi-store/extension.py +14 -0
- qi_coding_agent-0.4.0/extensions/qi-store/pyproject.toml +19 -0
- qi_coding_agent-0.4.0/extensions/qi-store/qi_store/__init__.py +25 -0
- qi_coding_agent-0.4.0/extensions/qi-store/qi_store/actions.py +92 -0
- qi_coding_agent-0.4.0/extensions/qi-store/qi_store/catalog.py +213 -0
- qi_coding_agent-0.4.0/extensions/qi-store/qi_store/cli.py +1093 -0
- qi_coding_agent-0.4.0/extensions/qi-store/qi_store/client.py +295 -0
- qi_coding_agent-0.4.0/extensions/qi-store/qi_store/config.py +233 -0
- qi_coding_agent-0.4.0/extensions/qi-store/qi_store/errors.py +75 -0
- qi_coding_agent-0.4.0/extensions/qi-store/qi_store/installer.py +257 -0
- qi_coding_agent-0.4.0/extensions/qi-store/qi_store/kinds/__init__.py +31 -0
- qi_coding_agent-0.4.0/extensions/qi-store/qi_store/kinds/a2a.py +87 -0
- qi_coding_agent-0.4.0/extensions/qi-store/qi_store/kinds/agent.py +356 -0
- qi_coding_agent-0.4.0/extensions/qi-store/qi_store/kinds/base.py +83 -0
- qi_coding_agent-0.4.0/extensions/qi-store/qi_store/kinds/kb.py +77 -0
- qi_coding_agent-0.4.0/extensions/qi-store/qi_store/kinds/mcp.py +126 -0
- qi_coding_agent-0.4.0/extensions/qi-store/qi_store/kinds/skill.py +209 -0
- qi_coding_agent-0.4.0/extensions/qi-store/qi_store/ledger.py +142 -0
- qi_coding_agent-0.4.0/extensions/qi-store/qi_store/ops.py +108 -0
- qi_coding_agent-0.4.0/extensions/qi-store/qi_store/paths.py +86 -0
- qi_coding_agent-0.4.0/extensions/qi-store/qi_store/planner.py +86 -0
- qi_coding_agent-0.4.0/extensions/qi-store/qi_store/service.py +519 -0
- qi_coding_agent-0.4.0/extensions/qi-store/qi_store/verify.py +45 -0
- qi_coding_agent-0.4.0/extensions/qi-store/tests/conftest.py +73 -0
- qi_coding_agent-0.4.0/extensions/qi-store/tests/fixtures/a2a_agents.json +70 -0
- qi_coding_agent-0.4.0/extensions/qi-store/tests/fixtures/agent_detail.json +62 -0
- qi_coding_agent-0.4.0/extensions/qi-store/tests/fixtures/agents_list.json +128 -0
- qi_coding_agent-0.4.0/extensions/qi-store/tests/fixtures/error_401.json +5 -0
- qi_coding_agent-0.4.0/extensions/qi-store/tests/fixtures/login.json +13 -0
- qi_coding_agent-0.4.0/extensions/qi-store/tests/fixtures/mcp_server_synthetic.json +21 -0
- qi_coding_agent-0.4.0/extensions/qi-store/tests/fixtures/mcp_servers_live_empty.json +6 -0
- qi_coding_agent-0.4.0/extensions/qi-store/tests/fixtures/rag_kb_available.json +34 -0
- qi_coding_agent-0.4.0/extensions/qi-store/tests/fixtures/skill_detail.json +21 -0
- qi_coding_agent-0.4.0/extensions/qi-store/tests/fixtures/skill_files.json +27 -0
- qi_coding_agent-0.4.0/extensions/qi-store/tests/fixtures/skills.json +51 -0
- qi_coding_agent-0.4.0/extensions/qi-store/tests/qstore_testkit.py +205 -0
- qi_coding_agent-0.4.0/extensions/qi-store/tests/test_qi_store_agent_kind.py +323 -0
- qi_coding_agent-0.4.0/extensions/qi-store/tests/test_qi_store_cli.py +228 -0
- qi_coding_agent-0.4.0/extensions/qi-store/tests/test_qi_store_client.py +204 -0
- qi_coding_agent-0.4.0/extensions/qi-store/tests/test_qi_store_config.py +123 -0
- qi_coding_agent-0.4.0/extensions/qi-store/tests/test_qi_store_flow.py +452 -0
- qi_coding_agent-0.4.0/extensions/qi-store/tests/test_qi_store_kb_kind.py +74 -0
- qi_coding_agent-0.4.0/extensions/qi-store/tests/test_qi_store_lifecycle.py +214 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/extensions/qi-web/pyproject.toml +1 -1
- qi_coding_agent-0.4.0/extensions/qi-web/qi_web/browse.py +85 -0
- qi_coding_agent-0.4.0/extensions/qi-web/qi_web/files.py +230 -0
- qi_coding_agent-0.4.0/extensions/qi-web/ui/index.html +13 -0
- qi_coding_agent-0.4.0/extensions/qi-web/ui/src/commands.tsx +163 -0
- qi_coding_agent-0.4.0/extensions/qi-web/ui/src/components/CommandMenu.tsx +157 -0
- qi_coding_agent-0.4.0/extensions/qi-web/ui/src/components/FilePanel.tsx +386 -0
- qi_coding_agent-0.4.0/extensions/qi-web/ui/src/components/ModelMenu.test.ts +28 -0
- qi_coding_agent-0.4.0/extensions/qi-web/ui/src/components/ModelMenu.tsx +211 -0
- qi_coding_agent-0.4.0/extensions/qi-web/ui/src/components/ProjectMenu.tsx +141 -0
- qi_coding_agent-0.4.0/extensions/qi-web/ui/src/components/Rail.tsx +371 -0
- qi_coding_agent-0.4.0/extensions/qi-web/ui/src/components/RowMenu.tsx +165 -0
- qi_coding_agent-0.4.0/extensions/qi-web/ui/src/components/SidebarSection.tsx +126 -0
- qi_coding_agent-0.4.0/extensions/qi-web/ui/src/main.tsx +14 -0
- qi_coding_agent-0.4.0/extensions/qi-web/ui/src/markdown/cjk.ts +100 -0
- qi_coding_agent-0.4.0/extensions/qi-web/ui/src/markdown/markdown.test.ts +121 -0
- qi_coding_agent-0.4.0/extensions/qi-web/ui/src/markdown/parse.ts +29 -0
- qi_coding_agent-0.4.0/extensions/qi-web/ui/src/markdown/render.tsx +324 -0
- qi_coding_agent-0.4.0/extensions/qi-web/ui/src/state/projects.test.ts +265 -0
- qi_coding_agent-0.4.0/extensions/qi-web/ui/src/state/projects.ts +233 -0
- qi_coding_agent-0.4.0/extensions/qi-web/ui/src/state/route.test.ts +46 -0
- qi_coding_agent-0.4.0/extensions/qi-web/ui/src/state/route.ts +40 -0
- qi_coding_agent-0.4.0/extensions/qi-web/ui/src/state/stats.ts +85 -0
- qi_coding_agent-0.4.0/extensions/qi-web/ui/src/theme/theme.ts +23 -0
- qi_coding_agent-0.4.0/extensions/qi-web/ui/src/vite-env.d.ts +5 -0
- qi_coding_agent-0.4.0/extensions/qi-web/ui/tsconfig.json +19 -0
- qi_coding_agent-0.4.0/extensions/qi-web/ui/vitest.config.ts +15 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/pyproject.toml +6 -2
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/pyrightconfig.json +4 -1
- qi_coding_agent-0.4.0/scripts/e2e_ui_lab.py +392 -0
- qi_coding_agent-0.4.0/src/qi_agent/__init__.py +33 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/src/qi_agent/auth.py +17 -8
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/src/qi_agent/cli.py +288 -41
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/src/qi_agent/config.py +39 -7
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/src/qi_agent/llm.py +136 -10
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/src/qi_agent/loader.py +6 -6
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/src/qi_agent/model_catalog.py +15 -2
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/src/qi_agent/paths.py +37 -8
- qi_coding_agent-0.4.0/src/qi_agent/presets.py +487 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/src/qi_agent/prompt.py +25 -18
- qi_coding_agent-0.4.0/src/qi_agent/provider_headers.py +49 -0
- qi_coding_agent-0.4.0/src/qi_agent/retry.py +146 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/src/qi_agent/runner.py +108 -31
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/src/qi_agent/runtime.py +40 -3
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/src/qi_agent/settings.py +1 -1
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/src/qi_agent/tui.py +29 -1
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/tests/conftest.py +6 -6
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/tests/test_auth_key.py +16 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/tests/test_cli_init.py +261 -4
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/tests/test_config.py +53 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/tests/test_contract_p0.py +57 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/tests/test_extension_run_agent.py +41 -1
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/tests/test_model_catalog.py +63 -2
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/tests/test_presets.py +216 -16
- qi_coding_agent-0.4.0/tests/test_project_root.py +72 -0
- qi_coding_agent-0.4.0/tests/test_provider_headers.py +225 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/tests/test_qi_mcp_http.py +2 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/tests/test_qi_mcp_role.py +104 -11
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/tests/test_qi_mcp_stdio.py +2 -0
- qi_coding_agent-0.4.0/tests/test_retry.py +118 -0
- qi_coding_agent-0.4.0/tests/test_runner_retry.py +174 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/tests/test_streaming.py +149 -2
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/tests/test_system_prompt.py +6 -4
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/tests/test_web_api.py +1 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/tests/test_web_files.py +2 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/uv.lock +1 -1
- qi_coding_agent-0.2.1/extensions/qi-agents/README.md +0 -160
- qi_coding_agent-0.2.1/extensions/qi-agents/qi_agents/discovery.py +0 -133
- qi_coding_agent-0.2.1/extensions/qi-agents/qi_agents/subagent.py +0 -296
- qi_coding_agent-0.2.1/src/qi_agent/__init__.py +0 -18
- qi_coding_agent-0.2.1/src/qi_agent/presets.py +0 -293
- qi_coding_agent-0.2.1/tests/test_qi_agents_extension.py +0 -441
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/.github/workflows/publish.yml +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/LICENSE +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/README.md +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/THIRD_PARTY_NOTICES.md +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/design/bash-allowlist.md +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/design/dispatcher.md +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/docs/cli.md +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/docs/compaction.md +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/docs/containerization.md +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/docs/docs.json +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/docs/index.md +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/docs/keybindings.md +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/docs/quickstart.md +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/docs/session-format.md +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/docs/sessions.md +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/docs/slash-commands.md +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/docs/themes.md +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/docs/tui.md +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/docs/usage.md +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/examples/agents/README.md +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/examples/agents/code-analyst/agent.md +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/examples/agents/code-analyst/assets/review-rules.md +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/examples/agents/code-analyst/mcp.json +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/examples/agents/code-analyst/skills/code-review-checklist/SKILL.md +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/examples/agents/code-reviewer/agent.md +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/examples/agents/data-analyst/agent.md +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/examples/agents/doc-writer/agent.md +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/examples/agents/doc-writer/assets/doc-style.md +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/examples/agents/general/agent.md +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/examples/agents/test-runner/agent.md +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/examples/agents/writer/agent.md +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/examples/extensions/README.md +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/examples/extensions/hello/README.md +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/examples/extensions/hello/extension.py +0 -0
- {qi_coding_agent-0.2.1/extensions/qi-web/qi_web → qi_coding_agent-0.4.0/extensions/qi-lab/qi_lab}/browse.py +0 -0
- {qi_coding_agent-0.2.1/extensions/qi-web/qi_web → qi_coding_agent-0.4.0/extensions/qi-lab/qi_lab}/files.py +0 -0
- {qi_coding_agent-0.2.1/extensions/qi-web → qi_coding_agent-0.4.0/extensions/qi-lab}/ui/index.html +0 -0
- {qi_coding_agent-0.2.1/extensions/qi-web → qi_coding_agent-0.4.0/extensions/qi-lab}/ui/src/commands.tsx +0 -0
- {qi_coding_agent-0.2.1/extensions/qi-web → qi_coding_agent-0.4.0/extensions/qi-lab}/ui/src/components/CommandMenu.tsx +0 -0
- {qi_coding_agent-0.2.1/extensions/qi-web → qi_coding_agent-0.4.0/extensions/qi-lab}/ui/src/components/FilePanel.tsx +0 -0
- {qi_coding_agent-0.2.1/extensions/qi-web → qi_coding_agent-0.4.0/extensions/qi-lab}/ui/src/components/ModelMenu.test.ts +0 -0
- {qi_coding_agent-0.2.1/extensions/qi-web → qi_coding_agent-0.4.0/extensions/qi-lab}/ui/src/components/ModelMenu.tsx +0 -0
- {qi_coding_agent-0.2.1/extensions/qi-web → qi_coding_agent-0.4.0/extensions/qi-lab}/ui/src/components/ProjectMenu.tsx +0 -0
- {qi_coding_agent-0.2.1/extensions/qi-web → qi_coding_agent-0.4.0/extensions/qi-lab}/ui/src/components/Rail.tsx +0 -0
- {qi_coding_agent-0.2.1/extensions/qi-web → qi_coding_agent-0.4.0/extensions/qi-lab}/ui/src/components/RowMenu.tsx +0 -0
- {qi_coding_agent-0.2.1/extensions/qi-web → qi_coding_agent-0.4.0/extensions/qi-lab}/ui/src/components/SidebarSection.tsx +0 -0
- {qi_coding_agent-0.2.1/extensions/qi-web → qi_coding_agent-0.4.0/extensions/qi-lab}/ui/src/main.tsx +0 -0
- {qi_coding_agent-0.2.1/extensions/qi-web → qi_coding_agent-0.4.0/extensions/qi-lab}/ui/src/markdown/cjk.ts +0 -0
- {qi_coding_agent-0.2.1/extensions/qi-web → qi_coding_agent-0.4.0/extensions/qi-lab}/ui/src/markdown/markdown.test.ts +0 -0
- {qi_coding_agent-0.2.1/extensions/qi-web → qi_coding_agent-0.4.0/extensions/qi-lab}/ui/src/markdown/parse.ts +0 -0
- {qi_coding_agent-0.2.1/extensions/qi-web → qi_coding_agent-0.4.0/extensions/qi-lab}/ui/src/markdown/render.tsx +0 -0
- {qi_coding_agent-0.2.1/extensions/qi-web → qi_coding_agent-0.4.0/extensions/qi-lab}/ui/src/state/projects.test.ts +0 -0
- {qi_coding_agent-0.2.1/extensions/qi-web → qi_coding_agent-0.4.0/extensions/qi-lab}/ui/src/state/projects.ts +0 -0
- {qi_coding_agent-0.2.1/extensions/qi-web → qi_coding_agent-0.4.0/extensions/qi-lab}/ui/src/state/route.test.ts +0 -0
- {qi_coding_agent-0.2.1/extensions/qi-web → qi_coding_agent-0.4.0/extensions/qi-lab}/ui/src/state/route.ts +0 -0
- {qi_coding_agent-0.2.1/extensions/qi-web → qi_coding_agent-0.4.0/extensions/qi-lab}/ui/src/state/stats.ts +0 -0
- {qi_coding_agent-0.2.1/extensions/qi-web → qi_coding_agent-0.4.0/extensions/qi-lab}/ui/src/theme/theme.ts +0 -0
- {qi_coding_agent-0.2.1/extensions/qi-web → qi_coding_agent-0.4.0/extensions/qi-lab}/ui/src/vite-env.d.ts +0 -0
- {qi_coding_agent-0.2.1/extensions/qi-web → qi_coding_agent-0.4.0/extensions/qi-lab}/ui/tsconfig.json +0 -0
- {qi_coding_agent-0.2.1/extensions/qi-web → qi_coding_agent-0.4.0/extensions/qi-lab}/ui/vitest.config.ts +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/extensions/qi-mcp/qi_mcp/__init__.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/extensions/qi-mcp/qi_mcp/client.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/extensions/qi-mcp/qi_mcp/config.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/extensions/qi-mcp/qi_mcp/direct.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/extensions/qi-mcp/qi_mcp/proxy.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/extensions/qi-mcp/qi_mcp/servers.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/extensions/qi-web/README.md +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/extensions/qi-web/qi_web/__init__.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/extensions/qi-web/qi_web/agui.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/extensions/qi-web/qi_web/app.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/extensions/qi-web/qi_web/schemas.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/extensions/qi-web/qi_web/security.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/extensions/qi-web/qi_web/serve.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/extensions/qi-web/qi_web/state.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/extensions/qi-web/qi_web/static/assets/index-96aT_6NK.js +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/extensions/qi-web/qi_web/static/assets/index-DePFgopp.css +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/extensions/qi-web/qi_web/static/index.html +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/extensions/qi-web/ui/package-lock.json +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/extensions/qi-web/ui/package.json +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/extensions/qi-web/ui/scripts/check-design.mjs +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/extensions/qi-web/ui/scripts/check-dsh-tokens.mjs +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/extensions/qi-web/ui/src/App.tsx +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/extensions/qi-web/ui/src/api/client.test.ts +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/extensions/qi-web/ui/src/api/client.ts +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/extensions/qi-web/ui/src/api/contract.test.ts +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/extensions/qi-web/ui/src/api/types.ts +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/extensions/qi-web/ui/src/components/AgentMenu.tsx +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/extensions/qi-web/ui/src/components/ConfirmDialog.tsx +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/extensions/qi-web/ui/src/components/DirPicker.tsx +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/extensions/qi-web/ui/src/components/Dock.tsx +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/extensions/qi-web/ui/src/components/Rows.tsx +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/extensions/qi-web/ui/src/components/Settings.tsx +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/extensions/qi-web/ui/src/components/icons.tsx +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/extensions/qi-web/ui/src/state/stats.test.ts +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/extensions/qi-web/ui/src/state/turn.test.ts +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/extensions/qi-web/ui/src/state/turn.ts +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/extensions/qi-web/ui/src/theme/app.css +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/extensions/qi-web/ui/src/theme/tokens.css +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/extensions/qi-web/ui/vite.config.ts +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/scripts/check_versions.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/scripts/e2e_ui_model.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/scripts/prune_empty_sessions.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/src/qi_agent/abort.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/src/qi_agent/compaction.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/src/qi_agent/export_html.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/src/qi_agent/extensions.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/src/qi_agent/models.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/src/qi_agent/packages.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/src/qi_agent/pep723.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/src/qi_agent/registry.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/src/qi_agent/session.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/src/qi_agent/share.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/src/qi_agent/system_prompt.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/src/qi_agent/theme.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/src/qi_agent/themes/README.md +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/src/qi_agent/themes/dark.json +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/src/qi_agent/themes/light.json +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/src/qi_agent/titling.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/src/qi_agent/tools/__init__.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/src/qi_agent/tools/shell.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/src/qi_agent/trust.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/src/qi_agent/workspaces.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/tests/test_branch_summary_prompt.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/tests/test_browse.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/tests/test_cli_install.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/tests/test_cli_pi_alignment.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/tests/test_cli_run.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/tests/test_cli_tool_flags.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/tests/test_compaction.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/tests/test_compaction_events.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/tests/test_config_resources.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/tests/test_docs_injection.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/tests/test_doctor_extensions.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/tests/test_example_extension.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/tests/test_export_html.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/tests/test_extension_alignment.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/tests/test_extension_bus.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/tests/test_extension_cli_commands.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/tests/test_extension_commands.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/tests/test_extension_deps.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/tests/test_extension_entry_points.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/tests/test_extension_events.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/tests/test_extension_exclusions.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/tests/test_extension_flags.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/tests/test_extension_interop.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/tests/test_extension_messages.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/tests/test_extension_model.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/tests/test_extension_resolvers.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/tests/test_extension_runner_events.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/tests/test_extension_session.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/tests/test_extension_tools.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/tests/test_extension_ui.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/tests/test_extensions.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/tests/test_interrupt.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/tests/test_litellm_offline.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/tests/test_missing_extension_hints.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/tests/test_model_thinking_levels.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/tests/test_package_resource_toggle.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/tests/test_packages.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/tests/test_pep723.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/tests/test_prune_empty_sessions.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/tests/test_qi_mcp_config.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/tests/test_qi_mcp_direct.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/tests/test_qi_mcp_proxy.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/tests/test_runner_core.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/tests/test_session_model_entries.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/tests/test_session_store.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/tests/test_session_tree.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/tests/test_settings_skills.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/tests/test_share.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/tests/test_shell.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/tests/test_skill_commands.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/tests/test_theme.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/tests/test_thinking.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/tests/test_thinking_budgets.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/tests/test_third_party_notices.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/tests/test_titling.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/tests/test_tool_execution_mode.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/tests/test_trust_scope.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/tests/test_tui_extension_render.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/tests/test_tui_model_restore.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/tests/test_tui_no_model.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/tests/test_tui_smoke.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/tests/test_tui_style.py +0 -0
- {qi_coding_agent-0.2.1 → qi_coding_agent-0.4.0}/tests/test_web_extensions_api.py +0 -0
- {qi_coding_agent-0.2.1 → 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/
|
|
@@ -173,10 +173,10 @@ testpaths = ["tests"]
|
|
|
173
173
|
| B9 | agent.md icon | 不进 v1 |
|
|
174
174
|
| B10 | 样例 | examples/ 加 writer + general(演示 auto 多角色) |
|
|
175
175
|
| A7 | 凭证存储 | auth store `~/.qi/agent/auth.json`(0600,git 不跟踪);解析顺序 auth store → 约定 env → models.json `apiKey` 引用;`qi auth login/logout/list` + 只读三件套 `print-api-key` / `print-bearer-token` / `check`(退出码对齐 pi:0/1/2)、`qi init` 引导 |
|
|
176
|
-
| A8 | 全局目录层级 | `~/.qi/agent/` ↔
|
|
176
|
+
| A8 | 全局目录层级 | `~/.qi/agent/` ↔ `<cwd>/.qi` 配对(对齐 pi 的 `~/.pi/agent` ↔ `.pi`);旧扁平布局启动时自动迁移(不覆盖);`QI_AGENT_HOME` = agent 目录、`QI_CONFIG_DIR` = 名字空间根 |
|
|
177
177
|
| A9 | 设置文件 | `settings.json` 两级深合并、数组整体替换;默认模型只属于 settings(`models.json` 里已不读取);字段清单与“仅存储未生效”清单见 [settings.md](../docs/settings.md);`qi config` 读写 |
|
|
178
|
-
| A10 | 顶层技能 | 六级来源(低→高):`~/.agents/skills` → `~/.qi/agent/skills` → user `settings.skills` → 项目 `.agents/skills` 祖先链 → `<
|
|
179
|
-
| A11 | 系统提示词 | 默认基座**代码内**(`system_prompt.py`,按解析后的工具集生成「可用工具 / 指南」+ **手册索引**);`SYSTEM.md` **整体替换**默认基座(项目 > 全局);之后动态追加 `<project_context>`(AGENTS.override.md > AGENTS.md > AGENTS.MD > CLAUDE.md > CLAUDE.MD,全局 +
|
|
178
|
+
| A10 | 顶层技能 | 六级来源(低→高):`~/.agents/skills` → `~/.qi/agent/skills` → user `settings.skills` → 项目 `.agents/skills` 祖先链 → `<cwd>/.qi/skills` → project `settings.skills`;agent 自带者最高;同层同名报错、跳层覆盖;排除项作用于整个发现集 |
|
|
179
|
+
| A11 | 系统提示词 | 默认基座**代码内**(`system_prompt.py`,按解析后的工具集生成「可用工具 / 指南」+ **手册索引**);`SYSTEM.md` **整体替换**默认基座(项目 > 全局);之后动态追加 `<project_context>`(AGENTS.override.md > AGENTS.md > AGENTS.MD > CLAUDE.md > CLAUDE.MD,全局 + 祖先链至文件系统根)→ `<available_skills>` XML(无 `read`/`bash` 则不注入)→ cwd → `--append-system-prompt`。角色层与数据源**不在 core**(归 qi-agents / 提供方扩展)。详见 [configuration.md](../docs/configuration.md) |
|
|
180
180
|
| A12 | 轮次 / 超时 / 中断 | **对齐 pi:runner 里既不设轮次上限,也不套回合级请求超时** —— 循环是 `while True`,退出靠模型不再调工具 / 中止 / 嵌入方谓词 `stop_after`(pi 的 `shouldStopAfterTurn` 同形,默认 `None` = 不限)。**qi 自己从不传谓词**(pi-coding-agent 也从不实现那个钩子):交互式靠 `escape` / 客户端断开,无头靠 `SIGTERM`/`SIGHUP` → `kill_live_children()` + `exit(143/129)`(对齐 pi 的 `killTrackedDetachedChildren`)。请求级超时与重试归 **provider 层**(`settings.json` 的 `retry.provider.timeoutMs` / `maxRetries` → litellm `timeout` / `num_retries`;对齐 pi 的 `getProviderRetrySettings`)。中断是**协作式**(`abort.py` 的 `AbortSignal`):未执行的 tool_call 补“已中断”结果、半截回答照常落盘、照常发 `agent_end`(data 带 `aborted`);TUI `escape` 宽限 3s 后 `cancel_all()` 兜底;硬取消(`CancelledError`,含 SIGINT/ASGI 取消)也先落盘再抛 |
|
|
181
181
|
|
|
182
182
|
### 仍待定(v2 + 实现期)
|
|
@@ -9,7 +9,8 @@
|
|
|
9
9
|
> | 本文的说法 | 现状 |
|
|
10
10
|
> | --- | --- |
|
|
11
11
|
> | §4.1 `tools` 省略或 `["*"]` = 全部可用 | **省略 = 继承父**(不是"全部";解释成全部会构成提权)· `Role.tools=None` 的注释写明了这一点 |
|
|
12
|
-
> | `display_name` / `keywords` / `include`
|
|
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 |
|
|
@@ -49,7 +50,7 @@ agent 只可能出现在 **3 个位置**,目录名都用 `agents/`:
|
|
|
49
50
|
| --- | --- | --- |
|
|
50
51
|
| 包内置 `qi_agent/builtin/agents/` | 框架自带兜底(仅 `general`),随 wheel 发布 | 最低 |
|
|
51
52
|
| `~/.qi/agent/agents/` | 全局(所有项目可用) | 中 |
|
|
52
|
-
|
|
|
53
|
+
| `<cwd>/.qi/agents/` | 项目私有(跟 cwd 走,可提交共享) | **高** |
|
|
53
54
|
|
|
54
55
|
同名规则:
|
|
55
56
|
|
|
@@ -127,7 +128,7 @@ opening:
|
|
|
127
128
|
| 2 | `~/.qi/agent/skills/` | `qi-global` | 认 |
|
|
128
129
|
| 3 | user `settings.json` 的 `skills[]` | `settings-global` | 认 |
|
|
129
130
|
| 4 | `.agents/skills/`(cwd → git 根,远→近) | `agents-project` | 忽略 |
|
|
130
|
-
| 5 | `<
|
|
131
|
+
| 5 | `<cwd>/.qi/skills/` | `qi-project` | 认 |
|
|
131
132
|
| 6 | project `settings.json` 的 `skills[]` | `settings-project` | 认 |
|
|
132
133
|
|
|
133
134
|
- **agent 自带技能优先级最高**:同名时覆盖顶层 —— 越具体越优先。
|
|
@@ -142,7 +143,7 @@ opening:
|
|
|
142
143
|
## 6. 装载与校验流程
|
|
143
144
|
|
|
144
145
|
```text
|
|
145
|
-
扫 ~/.qi/agent/agents/ 与
|
|
146
|
+
扫 ~/.qi/agent/agents/ 与 <cwd>/.qi/agents/(项目优先,同名警告)
|
|
146
147
|
→ 每个 <name>/ 解析 agent.md:
|
|
147
148
|
frontmatter → AgentConfig(pydantic)
|
|
148
149
|
校验: name==目录名 / description 非空 / tools 存在于 ToolCatalog
|
|
@@ -175,7 +176,7 @@ AgentUnit("code-analyst")
|
|
|
175
176
|
| 来源 | 位置 | 可见性 |
|
|
176
177
|
| --- | --- | --- |
|
|
177
178
|
| 全局 server | `~/.qi/agent/mcp.json`(共享基建,凭证仅 env 引用) | 按 agent 声明绑定 |
|
|
178
|
-
| 项目 server | `<
|
|
179
|
+
| 项目 server | `<cwd>/.qi/mcp.json`(跟项目走,可提交共享) | 按 agent 声明绑定 |
|
|
179
180
|
| 私有 server | agent 目录内 `mcp.json`(拷贝即走) | **仅该 agent**,自动绑定 |
|
|
180
181
|
|
|
181
182
|
三处**同一份格式**(`{"mcpServers": {…}}`),共用一个解析器(`loader.read_mcp_file`)。
|
|
@@ -281,7 +282,7 @@ qi agents import skill:path/to/skill # 包装成私有技能进目标 agent
|
|
|
281
282
|
| agent 形态 | 目录形式 `agents/<name>/`,入口固定 `agent.md` |
|
|
282
283
|
| include 机制 | frontmatter `include: [...]` 拼入 system prompt(显式) |
|
|
283
284
|
| 通用小能力 | 做成**全局代码工具**,不做成技能 |
|
|
284
|
-
| 存放位置 | 3 处:包内置 `qi_agent/builtin/agents/` + `~/.qi/agent/agents/` +
|
|
285
|
+
| 存放位置 | 3 处:包内置 `qi_agent/builtin/agents/` + `~/.qi/agent/agents/` + `<cwd>/.qi/agents/`;无 env 层 |
|
|
285
286
|
| 覆盖规则 | 项目 > 用户 > 内置(静默覆盖,不警告);同层重复报错 |
|
|
286
287
|
| 目录命名 | 隐藏目录 `.qi`(全局 `~/.qi`,项目 `.qi`),对齐 pi 的 `.pi` |
|
|
287
288
|
| 内置内容 | 内置 1 个 `general` 兜底 agent(零配置可执行的前提);**不内置技能**;示例放 `examples/agents/`,不自动加载 |
|
|
@@ -289,7 +290,7 @@ qi agents import skill:path/to/skill # 包装成私有技能进目标 agent
|
|
|
289
290
|
| 无内置技能 | 撤销"内置技能覆盖"问题(H4 moot) |
|
|
290
291
|
| opening 字段 | v1 补充:message(agent 开场白,进会话历史)+ suggestions(UI 层快捷提问,不进历史) |
|
|
291
292
|
| 执行参数 | model / temperature 不进 agent.md;模型归 `models.json` + `settings.json`。轮次不是字段而是**谓词**:`RunnerSettings.stop_after`(pi 的 `shouldStopAfterTurn` 同形,默认 `None` = 不限),**qi 自己不传**(同 pi 定义了却不实现)。请求级超时/重试也不在 agent 层:归 provider SDK(`settings.json` 的 `retry.provider`,见 [settings.md](../docs/settings.md)) |
|
|
292
|
-
| MCP | **v1**:私有 mcp.json 仅本 agent 自动绑定;全局(`~/.qi/agent/mcp.json`)+ 项目(`<
|
|
293
|
+
| MCP | **v1**:私有 mcp.json 仅本 agent 自动绑定;全局(`~/.qi/agent/mcp.json`)+ 项目(`<cwd>/.qi/mcp.json`)两张声明表按 `mcp_servers` 声明绑定,**默认无、显式声明**(凭证敏感);同名项目覆盖全局;凭证仅 env 引用 |
|
|
293
294
|
| 数据源 | 实例在 agent 目录 data_sources.json(私有自动绑定,凭证 env);工具/type 能力由 db 插件提供,装载门控见 [plugins.md](plugins.md) |
|
|
294
295
|
| 导入/导出 | agent 自包含目录;import = 拷贝 + 复用装载校验器预检 + 明文凭证扫描;export 产物可直接 import |
|
|
295
296
|
|
|
Binary file
|
|
@@ -45,13 +45,24 @@ uv run qi --mode json "你好" # 改完想看一眼事件流时最快
|
|
|
45
45
|
## 3. 测试
|
|
46
46
|
|
|
47
47
|
```bash
|
|
48
|
-
.venv/bin/python -m pytest # 全量(
|
|
49
|
-
.venv/bin/python -m pytest -q tests/
|
|
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",
|
|
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/ #
|
|
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/` 目前也不进(要把手册随包发布得改
|
|
@@ -228,7 +228,7 @@ tools = await api.resolveTools("mcp_servers", scope=role_dir) # 新增;没人
|
|
|
228
228
|
- **因此角色的 `tools:` 白名单支持通配**:`tools: read, grep, mcp__github__*` —— 这也是唯一让
|
|
229
229
|
“角色只拿到某个 server 的工具”写得出来的办法(逐条列工具名会在 server 升级后失效)。
|
|
230
230
|
|
|
231
|
-
**作用域三层**(沿用 v1,勿改):全局 `~/.qi/agent/mcp.json` → 项目 `<
|
|
231
|
+
**作用域三层**(沿用 v1,勿改):全局 `~/.qi/agent/mcp.json` → 项目 `<cwd>/.qi/mcp.json`
|
|
232
232
|
(同名覆盖全局)→ **agent 私有** `<agent 目录>/mcp.json`(自动绑定,只本角色可见)。
|
|
233
233
|
|
|
234
234
|
**边界澄清(易混,写下来免得绕回去)** —— 分工不是“谁读那个文件”,而是**“谁知道 `mcp.json`
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
有 `bash`/`powershell` 但没有 `grep`/`find`/`ls` 时给"用 shell 做文件操作",措辞分三种)。
|
|
16
16
|
- 基座来源解析:`loader.resolve_base_prompt()` → `("", "builtin")` 表示用代码内默认;
|
|
17
17
|
项目 > 用户 > 内置,**取第一个非空文件**(空文件/读失败视为未配置)。
|
|
18
|
-
- 项目上下文:`paths.
|
|
18
|
+
- 项目上下文:`paths.context_file_ancestors()`(全局 + 祖先链,**走到文件系统根**,按路径去重),
|
|
19
19
|
每级目录按 `AGENTS.override.md > AGENTS.md > AGENTS.MD > CLAUDE.md > CLAUDE.MD` 取第一个命中。
|
|
20
20
|
- 技能块:只给 name / description / location 的 XML;有 `read` 就说"用 read 读全文",只有 `bash` 就说 bash;
|
|
21
21
|
两者都没有 → 整块不注入。相对路径以 SKILL.md 所在目录为基准解析,并在工具命令里用绝对路径。
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
| `APPEND_SYSTEM.md` | 不实现;追加走 `--append-system-prompt` 或写进 `SYSTEM.md` |
|
|
35
35
|
| 空文件 | 视为未配置,继续向下找;不产生空基座 |
|
|
36
36
|
| 工具清单 | 列**解析后**的工具集(模型可调用全集);不写"你可能还有其他工具" |
|
|
37
|
-
| 项目上下文 | 候选顺序 + 全局/祖先链 +
|
|
37
|
+
| 项目上下文 | 候选顺序 + 全局/祖先链 + 走到文件系统根;空文件跳过;**不需要项目信任** |
|
|
38
38
|
| 技能注入 | XML(含 location);无 `read`/`bash` 则整块不注入 |
|
|
39
39
|
| 自身文档索引 | 由 `docs.json` 生成;两处目录都找不到就整块不注入 |
|
|
40
40
|
| 模板化 | 不做 `{{cwd}}` 之类占位符;动态块由代码追加 |
|
|
@@ -41,8 +41,8 @@ core 移除:core 只认 `RunSpec`,而且 `AgentRunner` **不再自己拼 prompt*
|
|
|
41
41
|
| 概念 | 结论 | 详见 |
|
|
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
|
-
| agent 位置 | **2 处**:`~/.qi/agent/agents/` →
|
|
45
|
-
| agent.md 字段 | **v3
|
|
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` / `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) |
|
|
@@ -79,7 +79,7 @@ core 移除:core 只认 `RunSpec`,而且 `AgentRunner` **不再自己拼 prompt*
|
|
|
79
79
|
|
|
80
80
|
## 4. 目录布局(运行时)
|
|
81
81
|
|
|
82
|
-
全局侧比项目侧深一层,与 pi 同构:`~/.pi/agent/` ↔
|
|
82
|
+
全局侧比项目侧深一层,与 pi 同构:`~/.pi/agent/` ↔ `<cwd>/.pi/`。全部用户级状态都挂在 `agent/` 下,
|
|
83
83
|
`~/.qi` 本身只是名字空间外壳(`QI_CONFIG_DIR` 可改)。
|
|
84
84
|
|
|
85
85
|
```text
|
|
@@ -96,7 +96,7 @@ core 移除:core 只认 `RunSpec`,而且 `AgentRunner` **不再自己拼 prompt*
|
|
|
96
96
|
├── mcp.json # 全局 MCP 声明 —— 读它的扩展:qi-mcp
|
|
97
97
|
└── sessions/*.jsonl # 会话
|
|
98
98
|
|
|
99
|
-
|
|
99
|
+
<cwd>/.qi/ # 项目级 = **当前目录**(对齐 pi 的 `<cwd>/.pi/`;扁平,与 ~/.qi/agent 配对)
|
|
100
100
|
├── settings.json # 覆盖全局(深合并;数组整体替换)
|
|
101
101
|
├── models.json
|
|
102
102
|
├── skills/ agents/ extensions/
|
|
@@ -110,7 +110,7 @@ core 移除:core 只认 `RunSpec`,而且 `AgentRunner` **不再自己拼 prompt*
|
|
|
110
110
|
> `agent/` 与 `extensions/`,只在目标不存在时搬,绝不覆盖。
|
|
111
111
|
>
|
|
112
112
|
> 提示词的两个入口不要混:`SYSTEM.md` **整体替换**默认基座(项目 > 全局 > 代码内默认);
|
|
113
|
-
> `AGENTS.md` / `CLAUDE.md`(全局 `~/.qi/agent/` +
|
|
113
|
+
> `AGENTS.md` / `CLAUDE.md`(全局 `~/.qi/agent/` + cwd 及各级祖先,走到文件系统根)则作为
|
|
114
114
|
> `<project_context>` **追加**。两者与角色层、技能、工作目录的推出顺序见
|
|
115
115
|
> [configuration.md](../docs/configuration.md)。
|
|
116
116
|
|
|
@@ -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) 因此不描述不存在的机制)。
|
|
@@ -132,7 +137,7 @@ qi 在这一层**刻意与 pi 保持一致**:字段名、命令名、`/tree` 语
|
|
|
132
137
|
| | pi | qi |
|
|
133
138
|
| --- | --- | --- |
|
|
134
139
|
| 发现规则 | `~/.agents/skills` + 项目 `.agents/skills`(递归、含 SKILL.md 即技能) | 同构(第 1、4 层) |
|
|
135
|
-
| 私有层 | 无 | **多 4 层**:`~/.qi/agent/skills`、`<
|
|
140
|
+
| 私有层 | 无 | **多 4 层**:`~/.qi/agent/skills`、`<cwd>/.qi/skills`、以及两侧 `settings.skills[]` |
|
|
136
141
|
| 注入方式 | `<available_skills>` + 渐进披露 | 同(共用同一形态) |
|
|
137
142
|
| `--skill` / `--no-skills` | 有 | 同,且组合语义一致(`--no-skills` 不影响 `--skill`) |
|
|
138
143
|
| 同层同名 | 报错 | 同 |
|
|
@@ -150,10 +155,10 @@ pi 里其实是两个正交概念:编译进 dist 的**默认 prompt**(代码内
|
|
|
150
155
|
| | pi 0.85.1 | qi v2 |
|
|
151
156
|
| --- | --- | --- |
|
|
152
157
|
| 默认基座 | 代码内字符串 + 运行时拼接 | `src/qi_agent/system_prompt.py`(同样代码内) |
|
|
153
|
-
| 覆盖 | `SYSTEM.md` **整体替换**默认 prompt | 同左(
|
|
158
|
+
| 覆盖 | `SYSTEM.md` **整体替换**默认 prompt | 同左(`<cwd>/.qi/SYSTEM.md` > `~/.qi/agent/SYSTEM.md`) |
|
|
154
159
|
| 追加 | `APPEND_SYSTEM.md` | **不实现**(v1 决策保留;需要时用 `SYSTEM.md` 写全;命令行侧有 `--append-system-prompt`) |
|
|
155
160
|
| 动态块 | 工具清单、条件化 guidelines、`<project_context>`、`<available_skills>`、cwd | 同左;v1 还多过**数据源清单**与**角色层**两项 qi 独有内容,两者随 P-E4c 移出 core(角色层现由 qi-agents 经 `before_agent_start` 注入) |
|
|
156
|
-
| 祖先链边界 | 走到文件系统根 |
|
|
161
|
+
| 祖先链边界 | 走到文件系统根 | **走到文件系统根**(与 pi 一致;`.agents/skills` 那条另止于 git 根) |
|
|
157
162
|
| 自身文档索引 | README/docs/examples 绝对路径 + 12 条指路 | 从 `docs/docs.json` 的 navigation 生成(见 [configuration.md](../docs/configuration.md)) |
|
|
158
163
|
|
|
159
164
|
## 10. 开发与测试(原 `development.md` §7)
|
|
@@ -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/` ↔
|
|
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 一致」 |
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
| 通道 | 怎么装 | 装到哪 | 发现机制 | 场景 |
|
|
17
17
|
| --- | --- | --- | --- | --- |
|
|
18
18
|
| **pip 包** | `qi install qi-db-tools`(PyPI / git / 本地) | venv 的 site-packages(环境级) | **entry point 扫描**(`importlib.metadata`,启动时自动发现) | 分发、团队共享、锁依赖 |
|
|
19
|
-
| **本地目录** | 手动放置/复制源码目录 | `~/.qi/plugins/<name>/`(全局)或
|
|
19
|
+
| **本地目录** | 手动放置/复制源码目录 | `~/.qi/plugins/<name>/`(全局)或 `<cwd>/.qi/plugins/<name>/`(项目,需信任) | **目录扫描** | 未发布/私有/本地开发,拷贝即用 |
|
|
20
20
|
|
|
21
21
|
pip 包通过 **entry point** 声明(对齐 pytest/uvicorn 模式),无需维护安装清单:
|
|
22
22
|
|
|
Binary file
|