@scemoon/cdh 1.0.7 → 1.0.9-beta.1
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.
- package/ai-dlc-skill/SKILL.md +106 -0
- package/ai-dlc-skill/architecture/project-structure.md +78 -0
- package/ai-dlc-skill/brownfield/README.md +36 -0
- package/ai-dlc-skill/brownfield/entry.md +45 -0
- package/ai-dlc-skill/brownfield/generate-context.sh +64 -0
- package/ai-dlc-skill/brownfield/scripts/deps.sh +27 -0
- package/ai-dlc-skill/brownfield/scripts/discover.sh +34 -0
- package/ai-dlc-skill/brownfield/scripts/extract-api.sh +45 -0
- package/ai-dlc-skill/components/backend.md +47 -0
- package/ai-dlc-skill/components/desktop.md +63 -0
- package/ai-dlc-skill/components/mya.md +219 -0
- package/ai-dlc-skill/components/native.md +73 -0
- package/ai-dlc-skill/components/tta.md +235 -0
- package/ai-dlc-skill/components/web.md +77 -0
- package/ai-dlc-skill/components/wxa.md +219 -0
- package/ai-dlc-skill/contracts/README.md +25 -0
- package/ai-dlc-skill/core/adaptive-flow.md +107 -0
- package/ai-dlc-skill/core/security.md +29 -0
- package/ai-dlc-skill/core/task-registry.md +153 -0
- package/ai-dlc-skill/cross-tool/README.md +20 -0
- package/ai-dlc-skill/cross-tool/cline/export.sh +38 -0
- package/ai-dlc-skill/cross-tool/copilot/export.sh +41 -0
- package/ai-dlc-skill/cross-tool/cursor/export.sh +53 -0
- package/ai-dlc-skill/cross-tool/onecode/export.sh +27 -0
- package/ai-dlc-skill/cross-tool/opencode/export.sh +38 -0
- package/ai-dlc-skill/phases/debug/entry.md +48 -0
- package/ai-dlc-skill/phases/debug/lifecycle.md +284 -0
- package/ai-dlc-skill/phases/deliver/entry.md +35 -0
- package/ai-dlc-skill/phases/deliver/lifecycle.md +185 -0
- package/ai-dlc-skill/phases/deliver/prompt.md +54 -0
- package/ai-dlc-skill/phases/deliver/rules.md +61 -0
- package/ai-dlc-skill/phases/plan/design_system/accessibility.md +268 -0
- package/ai-dlc-skill/phases/plan/design_system/atomic_design.md +341 -0
- package/ai-dlc-skill/phases/plan/design_system/component_spec.md +398 -0
- package/ai-dlc-skill/phases/plan/design_system/design_tokens.md +190 -0
- package/ai-dlc-skill/phases/plan/design_system/iconography.md +299 -0
- package/ai-dlc-skill/phases/plan/design_system/platform_ui/desktop.md +318 -0
- package/ai-dlc-skill/phases/plan/design_system/platform_ui/mya.md +354 -0
- package/ai-dlc-skill/phases/plan/design_system/platform_ui/native.md +328 -0
- package/ai-dlc-skill/phases/plan/design_system/platform_ui/tta.md +394 -0
- package/ai-dlc-skill/phases/plan/design_system/platform_ui/web.md +287 -0
- package/ai-dlc-skill/phases/plan/design_system/platform_ui/wxa.md +374 -0
- package/ai-dlc-skill/phases/plan/design_system/theme_system.md +318 -0
- package/ai-dlc-skill/phases/plan/entry.md +33 -0
- package/ai-dlc-skill/phases/plan/lifecycle.md +260 -0
- package/ai-dlc-skill/phases/plan/prompt.md +75 -0
- package/ai-dlc-skill/phases/plan/rules.md +60 -0
- package/ai-dlc-skill/phases/understand/entry.md +36 -0
- package/ai-dlc-skill/phases/understand/lifecycle.md +184 -0
- package/ai-dlc-skill/phases/understand/prompt.md +58 -0
- package/ai-dlc-skill/phases/understand/rules.md +49 -0
- package/ai-dlc-skill/phases/verify/config/base_url.md +65 -0
- package/ai-dlc-skill/phases/verify/entry.md +59 -0
- package/ai-dlc-skill/phases/verify/gates/browser_e2e.md +96 -0
- package/ai-dlc-skill/phases/verify/lifecycle.md +217 -0
- package/ai-dlc-skill/phases/verify/prompt.md +73 -0
- package/ai-dlc-skill/phases/verify/rules.md +91 -0
- package/ai-dlc-skill/phases/verify/runners/playwright_local.md +103 -0
- package/ai-dlc-skill/practices/bdd.md +119 -0
- package/ai-dlc-skill/practices/sdd.md +84 -0
- package/ai-dlc-skill/practices/tdd.md +128 -0
- package/ai-dlc-skill/providers/README.md +114 -0
- package/ai-dlc-skill/providers/aliyun/SKILL.md +204 -0
- package/ai-dlc-skill/providers/aliyun/api/rest-api.md +214 -0
- package/ai-dlc-skill/providers/aliyun/api/sdk.md +307 -0
- package/ai-dlc-skill/providers/aliyun/best-practices/database-design.md +363 -0
- package/ai-dlc-skill/providers/aliyun/best-practices/function-design.md +424 -0
- package/ai-dlc-skill/providers/aliyun/best-practices/troubleshooting.md +258 -0
- package/ai-dlc-skill/providers/aliyun/cli/database.md +263 -0
- package/ai-dlc-skill/providers/aliyun/cli/functions.md +263 -0
- package/ai-dlc-skill/providers/aliyun/cli/hosting.md +226 -0
- package/ai-dlc-skill/providers/aliyun/cli/setup.md +235 -0
- package/ai-dlc-skill/providers/aliyun/cli/storage.md +315 -0
- package/ai-dlc-skill/providers/aliyun/deployment.yaml +66 -0
- package/ai-dlc-skill/providers/aliyun/integration/ci-cd.md +288 -0
- package/ai-dlc-skill/providers/aliyun/preview.yaml +84 -0
- package/ai-dlc-skill/providers/aliyun/provider.yaml +160 -0
- package/ai-dlc-skill/providers/aliyun/security/authentication.md +254 -0
- package/ai-dlc-skill/providers/aliyun/services/cdn-hosting.md +220 -0
- package/ai-dlc-skill/providers/aliyun/services/database.md +319 -0
- package/ai-dlc-skill/providers/aliyun/services/function-compute.md +273 -0
- package/ai-dlc-skill/providers/aliyun/services/overview.md +163 -0
- package/ai-dlc-skill/providers/aliyun/services/serverless-app-engine.md +266 -0
- package/ai-dlc-skill/providers/aliyun/services/storage.md +269 -0
- package/ai-dlc-skill/providers/tcb/SKILL.md +208 -0
- package/ai-dlc-skill/providers/tcb/api/rest-api.md +338 -0
- package/ai-dlc-skill/providers/tcb/api/sdk.md +288 -0
- package/ai-dlc-skill/providers/tcb/best-practices/database-design.md +452 -0
- package/ai-dlc-skill/providers/tcb/best-practices/function-design.md +502 -0
- package/ai-dlc-skill/providers/tcb/best-practices/troubleshooting.md +462 -0
- package/ai-dlc-skill/providers/tcb/cli/cls.md +133 -0
- package/ai-dlc-skill/providers/tcb/cli/database.md +230 -0
- package/ai-dlc-skill/providers/tcb/cli/env.md +207 -0
- package/ai-dlc-skill/providers/tcb/cli/functions.md +276 -0
- package/ai-dlc-skill/providers/tcb/cli/hosting.md +219 -0
- package/ai-dlc-skill/providers/tcb/cli/setup.md +218 -0
- package/ai-dlc-skill/providers/tcb/cli/storage.md +233 -0
- package/ai-dlc-skill/providers/tcb/deployment.yaml +111 -0
- package/ai-dlc-skill/providers/tcb/integration/ci-cd.md +309 -0
- package/ai-dlc-skill/providers/tcb/integration/mcp-server.md +371 -0
- package/ai-dlc-skill/providers/tcb/preview.yaml +83 -0
- package/ai-dlc-skill/providers/tcb/provider.yaml +172 -0
- package/ai-dlc-skill/providers/tcb/security/authentication.md +241 -0
- package/ai-dlc-skill/providers/tcb/services/cloud-database.md +299 -0
- package/ai-dlc-skill/providers/tcb/services/cloud-functions.md +265 -0
- package/ai-dlc-skill/providers/tcb/services/cloud-hosting.md +264 -0
- package/ai-dlc-skill/providers/tcb/services/cloud-run.md +285 -0
- package/ai-dlc-skill/providers/tcb/services/cloud-storage.md +245 -0
- package/ai-dlc-skill/providers/tcb/services/overview.md +174 -0
- package/ai-dlc-skill/pybdd/README.md +41 -0
- package/ai-dlc-skill/pybdd/conftest.py +17 -0
- package/ai-dlc-skill/pybdd/example/auth/login.feature +32 -0
- package/ai-dlc-skill/pybdd/pytest.ini +5 -0
- package/ai-dlc-skill/pybdd/steps/.gitkeep +1 -0
- package/ai-dlc-skill/pybdd/steps/test_example_steps.py +65 -0
- package/ai-dlc-skill/requirements.md +140 -0
- package/ai-dlc-skill/skill.yaml +135 -0
- package/ai-dlc-skill/templates/brownfield/context.md +78 -0
- package/ai-dlc-skill/templates/integration/CHANGELOG.md +41 -0
- package/ai-dlc-skill/templates/integration/asyncapi.yaml +43 -0
- package/ai-dlc-skill/templates/integration/contract-diff.md +63 -0
- package/ai-dlc-skill/templates/integration/contract-spec.md +49 -0
- package/ai-dlc-skill/templates/integration/openapi.yaml +18 -0
- package/ai-dlc-skill/templates/integration/runtime-contract.yaml +36 -0
- package/ai-dlc-skill/templates/plan/design.md +49 -0
- package/ai-dlc-skill/templates/plan/task-list.md +32 -0
- package/ai-dlc-skill/templates/project/README.md +126 -0
- package/ai-dlc-skill/templates/project/template.md +119 -0
- package/ai-dlc-skill/templates/understand/feature.feature +30 -0
- package/ai-dlc-skill/templates/understand/intent.md +29 -0
- package/ai-dlc-skill/templates/understand/spec-delta.md +47 -0
- package/ai-dlc-skill/templates/verify/test-unit.py +27 -0
- package/ai-dlc-skill/walkthrough/collect.sh +50 -0
- package/ai-dlc-skill/walkthrough/template.md +54 -0
- package/cdh/__init__.py +0 -0
- package/cdh/__main__.py +4 -0
- package/cdh/__pycache__/__init__.cpython-314.pyc +0 -0
- package/cdh/__pycache__/cli.cpython-314.pyc +0 -0
- package/cdh/__pycache__/cli_logging.cpython-314.pyc +0 -0
- package/cdh/__pycache__/config.cpython-314.pyc +0 -0
- package/cdh/__pycache__/project_loader.cpython-314.pyc +0 -0
- package/cdh/__pycache__/scaffold.cpython-314.pyc +0 -0
- package/cdh/__pycache__/session_store.cpython-314.pyc +0 -0
- package/cdh/cdh_session_aggregator.py +258 -0
- package/cdh/cli.py +3000 -0
- package/cdh/cli_logging.py +45 -0
- package/cdh/config.py +28 -0
- package/cdh/event_loop/__init__.py +7 -0
- package/cdh/event_loop/bus.py +123 -0
- package/cdh/event_loop/events.py +25 -0
- package/cdh/event_loop/runner.py +28 -0
- package/cdh/event_loop/scheduler.py +158 -0
- package/cdh/generators/__init__.py +35 -0
- package/cdh/generators/_runtime.py +176 -0
- package/cdh/generators/ada/MANIFEST.toml +14 -0
- package/cdh/generators/ada/template.ads.tmpl +7 -0
- package/cdh/generators/bash/MANIFEST.toml +14 -0
- package/cdh/generators/bash/template.sh.tmpl +16 -0
- package/cdh/generators/builtin_index.json +590 -0
- package/cdh/generators/c/MANIFEST.toml +14 -0
- package/cdh/generators/c/template.h.tmpl +20 -0
- package/cdh/generators/cli.py +379 -0
- package/cdh/generators/clojure/MANIFEST.toml +14 -0
- package/cdh/generators/clojure/template.clj.tmpl +13 -0
- package/cdh/generators/cobol/MANIFEST.toml +14 -0
- package/cdh/generators/cobol/template.cbl.tmpl +14 -0
- package/cdh/generators/cpp/MANIFEST.toml +14 -0
- package/cdh/generators/cpp/template.hpp.tmpl +32 -0
- package/cdh/generators/crystal/MANIFEST.toml +14 -0
- package/cdh/generators/crystal/template.cr.tmpl +11 -0
- package/cdh/generators/csharp/MANIFEST.toml +23 -0
- package/cdh/generators/csharp/template.cs.tmpl +14 -0
- package/cdh/generators/cython/MANIFEST.toml +14 -0
- package/cdh/generators/cython/template.pyx.tmpl +17 -0
- package/cdh/generators/d/MANIFEST.toml +14 -0
- package/cdh/generators/d/template.d.tmpl +24 -0
- package/cdh/generators/dart/MANIFEST.toml +17 -0
- package/cdh/generators/dart/template.dart.tmpl +27 -0
- package/cdh/generators/elixir/MANIFEST.toml +17 -0
- package/cdh/generators/elixir/template.ex.tmpl +27 -0
- package/cdh/generators/elm/MANIFEST.toml +14 -0
- package/cdh/generators/elm/template.elm.tmpl +20 -0
- package/cdh/generators/erlang/MANIFEST.toml +14 -0
- package/cdh/generators/erlang/template.erl.tmpl +18 -0
- package/cdh/generators/fortran/MANIFEST.toml +14 -0
- package/cdh/generators/fortran/template.f90.tmpl +24 -0
- package/cdh/generators/fsharp/MANIFEST.toml +14 -0
- package/cdh/generators/fsharp/template.fs.tmpl +17 -0
- package/cdh/generators/go/MANIFEST.toml +18 -0
- package/cdh/generators/go/imports.go.tmpl +3 -0
- package/cdh/generators/go/template.go.tmpl +9 -0
- package/cdh/generators/graphql-schema/MANIFEST.toml +18 -0
- package/cdh/generators/graphql-schema/template.graphqls.tmpl +12 -0
- package/cdh/generators/groovy/MANIFEST.toml +14 -0
- package/cdh/generators/groovy/template.groovy.tmpl +28 -0
- package/cdh/generators/hack/MANIFEST.toml +14 -0
- package/cdh/generators/hack/template.hh.tmpl +24 -0
- package/cdh/generators/haskell/MANIFEST.toml +14 -0
- package/cdh/generators/haskell/template.hs.tmpl +20 -0
- package/cdh/generators/haxe/MANIFEST.toml +14 -0
- package/cdh/generators/haxe/template.hx.tmpl +20 -0
- package/cdh/generators/idris/MANIFEST.toml +14 -0
- package/cdh/generators/idris/template.idr.tmpl +22 -0
- package/cdh/generators/java/MANIFEST.toml +18 -0
- package/cdh/generators/java/template.java.tmpl +13 -0
- package/cdh/generators/julia/MANIFEST.toml +14 -0
- package/cdh/generators/julia/template.jl.tmpl +27 -0
- package/cdh/generators/kotlin/MANIFEST.toml +18 -0
- package/cdh/generators/kotlin/template.kt.tmpl +12 -0
- package/cdh/generators/lua/MANIFEST.toml +14 -0
- package/cdh/generators/lua/template.lua.tmpl +27 -0
- package/cdh/generators/matlab/MANIFEST.toml +14 -0
- package/cdh/generators/matlab/template.m.tmpl +26 -0
- package/cdh/generators/nim/MANIFEST.toml +14 -0
- package/cdh/generators/nim/template.nim.tmpl +12 -0
- package/cdh/generators/nix/MANIFEST.toml +14 -0
- package/cdh/generators/nix/template.nix.tmpl +8 -0
- package/cdh/generators/objective-c/MANIFEST.toml +14 -0
- package/cdh/generators/objective-c/template.m.tmpl +31 -0
- package/cdh/generators/ocaml/MANIFEST.toml +14 -0
- package/cdh/generators/ocaml/template.ml.tmpl +13 -0
- package/cdh/generators/pascal/MANIFEST.toml +14 -0
- package/cdh/generators/pascal/template.pas.tmpl +5 -0
- package/cdh/generators/perl/MANIFEST.toml +14 -0
- package/cdh/generators/perl/template.pm.tmpl +27 -0
- package/cdh/generators/php/MANIFEST.toml +17 -0
- package/cdh/generators/php/template.php.tmpl +31 -0
- package/cdh/generators/powershell/MANIFEST.toml +14 -0
- package/cdh/generators/powershell/template.ps1.tmpl +20 -0
- package/cdh/generators/protobuf/MANIFEST.toml +18 -0
- package/cdh/generators/protobuf/template.proto.tmpl +13 -0
- package/cdh/generators/python/MANIFEST.toml +18 -0
- package/cdh/generators/python/template.py.tmpl +12 -0
- package/cdh/generators/r/MANIFEST.toml +14 -0
- package/cdh/generators/r/template.R.tmpl +29 -0
- package/cdh/generators/racket/MANIFEST.toml +14 -0
- package/cdh/generators/racket/template.rkt.tmpl +15 -0
- package/cdh/generators/registry.py +211 -0
- package/cdh/generators/ruby/MANIFEST.toml +17 -0
- package/cdh/generators/ruby/template.rb.tmpl +27 -0
- package/cdh/generators/rust/MANIFEST.toml +18 -0
- package/cdh/generators/rust/template.rs.tmpl +16 -0
- package/cdh/generators/scala/MANIFEST.toml +20 -0
- package/cdh/generators/scala/template.scala.tmpl +13 -0
- package/cdh/generators/scheme/MANIFEST.toml +14 -0
- package/cdh/generators/scheme/template.scm.tmpl +16 -0
- package/cdh/generators/solidity/MANIFEST.toml +14 -0
- package/cdh/generators/solidity/template.sol.tmpl +24 -0
- package/cdh/generators/swift/MANIFEST.toml +18 -0
- package/cdh/generators/swift/template.swift.tmpl +10 -0
- package/cdh/generators/typescript/MANIFEST.toml +18 -0
- package/cdh/generators/typescript/template.ts.tmpl +7 -0
- package/cdh/generators/version.py +214 -0
- package/cdh/generators/zig/MANIFEST.toml +14 -0
- package/cdh/generators/zig/template.zig.tmpl +20 -0
- package/cdh/logging.py +314 -0
- package/cdh/optimizer/__init__.py +7 -0
- package/cdh/optimizer/loop.py +201 -0
- package/cdh/optimizer/mutation.py +85 -0
- package/cdh/optimizer/reward.py +51 -0
- package/cdh/optimizer/tracker.py +118 -0
- package/cdh/project_loader.py +1022 -0
- package/cdh/rules/patterns.yaml +132 -0
- package/cdh/rules/spectral.yaml +301 -0
- package/cdh/scaffold.py +1436 -0
- package/cdh/session_store.py +221 -0
- package/cdh/state_schema.py +127 -0
- package/cdh/tools/__init__.py +57 -0
- package/cdh/tools/cls_search.py +406 -0
- package/cdh/tools/contract_diff.py +644 -0
- package/cdh/tools/deploy_stack.py +590 -0
- package/cdh/tools/generate_shared.py +300 -0
- package/cdh/tools/iac_gen.py +224 -0
- package/cdh/tools/otel_export.py +125 -0
- package/cdh/tools/pattern_detect.py +451 -0
- package/cdh/tools/retrofit_labels.py +505 -0
- package/cdh/trace/__init__.py +101 -0
- package/cdh/trace/__pycache__/__init__.cpython-314.pyc +0 -0
- package/cdh/trace/dashboard/__init__.py +61 -0
- package/cdh/trace/dashboard/api.py +1032 -0
- package/cdh/trace/dashboard/app.html +1321 -0
- package/cdh/trace/dashboard/server.py +310 -0
- package/cdh/trace/otel_exporter.py +462 -0
- package/cdh/trace/otel_tracer.py +281 -0
- package/cdh/tui.py +1084 -0
- package/cdh/validators/__init__.py +16 -0
- package/cdh/validators/__pycache__/__init__.cpython-314.pyc +0 -0
- package/cdh/validators/__pycache__/bdd.cpython-314.pyc +0 -0
- package/cdh/validators/__pycache__/dag.cpython-314.pyc +0 -0
- package/cdh/validators/__pycache__/ears.cpython-314.pyc +0 -0
- package/cdh/validators/__pycache__/fr_namespace.cpython-314.pyc +0 -0
- package/cdh/validators/bdd.py +144 -0
- package/cdh/validators/dag.py +179 -0
- package/cdh/validators/ears.py +452 -0
- package/cdh/validators/fr_namespace.py +143 -0
- package/cdh/validators/spectral.py +475 -0
- package/cdh/verification/__init__.py +3 -0
- package/cdh/verification/aggregation.py +53 -0
- package/cdh/verification/gates/__init__.py +5 -0
- package/cdh/verification/gates/base.py +18 -0
- package/cdh/verification/gates/lint_gate.py +37 -0
- package/cdh/verification/gates/test_gate.py +41 -0
- package/cdh/verification/loop.py +93 -0
- package/cdh/verification/policy.py +24 -0
- package/onecode/__init__.py +1 -0
- package/onecode/__main__.py +4 -0
- package/onecode/__pycache__/__init__.cpython-314.pyc +0 -0
- package/onecode/__pycache__/cli.cpython-314.pyc +0 -0
- package/onecode/__pycache__/commands.cpython-314.pyc +0 -0
- package/onecode/__pycache__/config.cpython-314.pyc +0 -0
- package/onecode/__pycache__/migrate.cpython-314.pyc +0 -0
- package/onecode/agent/__init__.py +0 -0
- package/onecode/agent/__pycache__/__init__.cpython-314.pyc +0 -0
- package/onecode/agent/__pycache__/cdh_loader.cpython-314.pyc +0 -0
- package/onecode/agent/__pycache__/checkpoint.cpython-314.pyc +0 -0
- package/onecode/agent/__pycache__/context.cpython-314.pyc +0 -0
- package/onecode/agent/__pycache__/engine.cpython-314.pyc +0 -0
- package/onecode/agent/__pycache__/hooks.cpython-314.pyc +0 -0
- package/onecode/agent/__pycache__/onecode_agent_acp.cpython-314.pyc +0 -0
- package/onecode/agent/__pycache__/permissions.cpython-314.pyc +0 -0
- package/onecode/agent/__pycache__/permissions_store.cpython-314.pyc +0 -0
- package/onecode/agent/__pycache__/project_doc.cpython-314.pyc +0 -0
- package/onecode/agent/__pycache__/session.cpython-314.pyc +0 -0
- package/onecode/agent/__pycache__/turn_record.cpython-314.pyc +0 -0
- package/onecode/agent/agents/__init__.py +29 -0
- package/onecode/agent/agents/__pycache__/__init__.cpython-314.pyc +0 -0
- package/onecode/agent/agents/__pycache__/types.cpython-314.pyc +0 -0
- package/onecode/agent/agents/prompts/build-agent.md +50 -0
- package/onecode/agent/agents/prompts/compaction-instructions.md +12 -0
- package/onecode/agent/agents/prompts/explore-agent.md +42 -0
- package/onecode/agent/agents/prompts/plan-agent.md +44 -0
- package/onecode/agent/agents/prompts/plan-gate-hard.md +4 -0
- package/onecode/agent/agents/prompts/plan-gate-soft.md +3 -0
- package/onecode/agent/agents/prompts/solo-agent.md +57 -0
- package/onecode/agent/agents/prompts/subagent-constraints.md +10 -0
- package/onecode/agent/agents/prompts/summary-instructions.md +7 -0
- package/onecode/agent/agents/prompts/title-instructions.md +3 -0
- package/onecode/agent/agents/prompts/tool-descriptions.md +129 -0
- package/onecode/agent/agents/types.py +786 -0
- package/onecode/agent/attachments.py +112 -0
- package/onecode/agent/cdh_loader.py +3 -0
- package/onecode/agent/checkpoint.py +285 -0
- package/onecode/agent/context.py +465 -0
- package/onecode/agent/engine.py +3547 -0
- package/onecode/agent/event_bridge.py +75 -0
- package/onecode/agent/hooks.py +86 -0
- package/onecode/agent/onecode_agent_acp.py +2993 -0
- package/onecode/agent/permissions.py +150 -0
- package/onecode/agent/permissions_store.py +73 -0
- package/onecode/agent/project_doc.py +19 -0
- package/onecode/agent/question_detect.py +230 -0
- package/onecode/agent/session.py +3 -0
- package/onecode/agent/snapshot.py +144 -0
- package/onecode/agent/tools/__init__.py +17 -0
- package/onecode/agent/tools/__pycache__/__init__.cpython-314.pyc +0 -0
- package/onecode/agent/tools/__pycache__/agent_tools.cpython-314.pyc +0 -0
- package/onecode/agent/tools/__pycache__/apply_patch_tool.cpython-314.pyc +0 -0
- package/onecode/agent/tools/__pycache__/bash_tool.cpython-314.pyc +0 -0
- package/onecode/agent/tools/__pycache__/communication_tools.cpython-314.pyc +0 -0
- package/onecode/agent/tools/__pycache__/config_tool.cpython-314.pyc +0 -0
- package/onecode/agent/tools/__pycache__/cron_tools.cpython-314.pyc +0 -0
- package/onecode/agent/tools/__pycache__/errors.cpython-314.pyc +0 -0
- package/onecode/agent/tools/__pycache__/file_ops.cpython-314.pyc +0 -0
- package/onecode/agent/tools/__pycache__/file_tools.cpython-314.pyc +0 -0
- package/onecode/agent/tools/__pycache__/git_tools.cpython-314.pyc +0 -0
- package/onecode/agent/tools/__pycache__/lsp_tools.cpython-314.pyc +0 -0
- package/onecode/agent/tools/__pycache__/mcp_tools.cpython-314.pyc +0 -0
- package/onecode/agent/tools/__pycache__/permission_handler.cpython-314.pyc +0 -0
- package/onecode/agent/tools/__pycache__/permissions.cpython-314.pyc +0 -0
- package/onecode/agent/tools/__pycache__/protocol.cpython-314.pyc +0 -0
- package/onecode/agent/tools/__pycache__/registry.cpython-314.pyc +0 -0
- package/onecode/agent/tools/__pycache__/sandbox.cpython-314.pyc +0 -0
- package/onecode/agent/tools/__pycache__/schema_validation.cpython-314.pyc +0 -0
- package/onecode/agent/tools/__pycache__/skill_tools.cpython-314.pyc +0 -0
- package/onecode/agent/tools/__pycache__/todo_tools.cpython-314.pyc +0 -0
- package/onecode/agent/tools/__pycache__/web_tools.cpython-314.pyc +0 -0
- package/onecode/agent/tools/agent_tools.py +128 -0
- package/onecode/agent/tools/apply_patch_tool.py +138 -0
- package/onecode/agent/tools/bash_tool.py +121 -0
- package/onecode/agent/tools/communication_tools.py +154 -0
- package/onecode/agent/tools/config_tool.py +130 -0
- package/onecode/agent/tools/cron_tools.py +178 -0
- package/onecode/agent/tools/errors.py +17 -0
- package/onecode/agent/tools/file_ops.py +221 -0
- package/onecode/agent/tools/file_tools.py +225 -0
- package/onecode/agent/tools/git_tools.py +88 -0
- package/onecode/agent/tools/lsp_tools.py +404 -0
- package/onecode/agent/tools/mcp_tools.py +211 -0
- package/onecode/agent/tools/permission_handler.py +46 -0
- package/onecode/agent/tools/permissions.py +77 -0
- package/onecode/agent/tools/protocol.py +20 -0
- package/onecode/agent/tools/registry.py +210 -0
- package/onecode/agent/tools/sandbox.py +460 -0
- package/onecode/agent/tools/schema_validation.py +100 -0
- package/onecode/agent/tools/skill_tools.py +52 -0
- package/onecode/agent/tools/todo_tools.py +208 -0
- package/onecode/agent/tools/web_tools.py +530 -0
- package/onecode/agent/turn_record.py +28 -0
- package/onecode/builtin_skills/agent-browser/SKILL.md +212 -0
- package/onecode/builtin_skills/agent-browser/skill.yaml +8 -0
- package/onecode/builtin_skills/cloudbase/SKILL.md +162 -0
- package/onecode/builtin_skills/cloudbase/skill.yaml +7 -0
- package/onecode/builtin_skills/git/SKILL.md +64 -0
- package/onecode/builtin_skills/git/skill.yaml +7 -0
- package/onecode/builtin_skills/shell/SKILL.md +58 -0
- package/onecode/builtin_skills/shell/skill.yaml +8 -0
- package/onecode/builtin_skills/skill-creator/SKILL.md +106 -0
- package/onecode/builtin_skills/skill-creator/skill.yaml +8 -0
- package/onecode/cli.py +1325 -0
- package/onecode/codebase/__init__.py +69 -0
- package/onecode/codebase/__pycache__/__init__.cpython-314.pyc +0 -0
- package/onecode/codebase/__pycache__/chunker.cpython-314.pyc +0 -0
- package/onecode/codebase/__pycache__/indexer.cpython-314.pyc +0 -0
- package/onecode/codebase/__pycache__/retriever.cpython-314.pyc +0 -0
- package/onecode/codebase/__pycache__/storage.cpython-314.pyc +0 -0
- package/onecode/codebase/__pycache__/tools.cpython-314.pyc +0 -0
- package/onecode/codebase/chunker.py +125 -0
- package/onecode/codebase/indexer.py +154 -0
- package/onecode/codebase/retriever.py +240 -0
- package/onecode/codebase/storage.py +153 -0
- package/onecode/codebase/tools.py +59 -0
- package/onecode/commands.py +673 -0
- package/onecode/config.py +539 -0
- package/onecode/config_screen.py +486 -0
- package/onecode/cron/__init__.py +3 -0
- package/onecode/lsp/__init__.py +3 -0
- package/onecode/mcp/__init__.py +11 -0
- package/onecode/mcp/__pycache__/__init__.cpython-314.pyc +0 -0
- package/onecode/mcp/__pycache__/client.cpython-314.pyc +0 -0
- package/onecode/mcp/__pycache__/cloudbase.cpython-314.pyc +0 -0
- package/onecode/mcp/__pycache__/config.cpython-314.pyc +0 -0
- package/onecode/mcp/__pycache__/manager.cpython-314.pyc +0 -0
- package/onecode/mcp/__pycache__/oauth.cpython-314.pyc +0 -0
- package/onecode/mcp/client.py +305 -0
- package/onecode/mcp/cloudbase.py +188 -0
- package/onecode/mcp/config.py +363 -0
- package/onecode/mcp/manager.py +603 -0
- package/onecode/mcp/oauth.py +199 -0
- package/onecode/memory/__init__.py +106 -0
- package/onecode/memory/__pycache__/__init__.cpython-314.pyc +0 -0
- package/onecode/memory/__pycache__/backend.cpython-314.pyc +0 -0
- package/onecode/memory/__pycache__/pyramid.cpython-314.pyc +0 -0
- package/onecode/memory/__pycache__/recall.cpython-314.pyc +0 -0
- package/onecode/memory/backend.py +179 -0
- package/onecode/memory/pyramid.py +145 -0
- package/onecode/memory/recall.py +322 -0
- package/onecode/migrate.py +122 -0
- package/onecode/models/__init__.py +4 -0
- package/onecode/models/__pycache__/__init__.cpython-314.pyc +0 -0
- package/onecode/models/__pycache__/errors.cpython-314.pyc +0 -0
- package/onecode/models/__pycache__/messages.cpython-314.pyc +0 -0
- package/onecode/models/__pycache__/ollama_manager.cpython-314.pyc +0 -0
- package/onecode/models/__pycache__/provider.cpython-314.pyc +0 -0
- package/onecode/models/__pycache__/registry.cpython-314.pyc +0 -0
- package/onecode/models/errors.py +104 -0
- package/onecode/models/messages.py +750 -0
- package/onecode/models/ollama_manager.py +167 -0
- package/onecode/models/provider.py +730 -0
- package/onecode/models/providers/__init__.py +17 -0
- package/onecode/models/providers/__pycache__/__init__.cpython-314.pyc +0 -0
- package/onecode/models/providers/__pycache__/anthropic_provider.cpython-314.pyc +0 -0
- package/onecode/models/providers/__pycache__/deepseek_provider.cpython-314.pyc +0 -0
- package/onecode/models/providers/__pycache__/glm_provider.cpython-314.pyc +0 -0
- package/onecode/models/providers/__pycache__/minimax_provider.cpython-314.pyc +0 -0
- package/onecode/models/providers/__pycache__/minimaxi_provider.cpython-314.pyc +0 -0
- package/onecode/models/providers/__pycache__/ollama_provider.cpython-314.pyc +0 -0
- package/onecode/models/providers/__pycache__/openai_provider.cpython-314.pyc +0 -0
- package/onecode/models/providers/anthropic_provider.py +286 -0
- package/onecode/models/providers/deepseek_provider.py +221 -0
- package/onecode/models/providers/glm_provider.py +219 -0
- package/onecode/models/providers/minimax_provider.py +182 -0
- package/onecode/models/providers/minimaxi_provider.py +426 -0
- package/onecode/models/providers/ollama_provider.py +183 -0
- package/onecode/models/providers/openai_provider.py +234 -0
- package/onecode/models/registry.py +349 -0
- package/onecode/server/__init__.py +3 -0
- package/onecode/server/app.py +251 -0
- package/onecode/skills/__init__.py +11 -0
- package/onecode/skills/__pycache__/__init__.cpython-314.pyc +0 -0
- package/onecode/skills/__pycache__/argument_substitution.cpython-314.pyc +0 -0
- package/onecode/skills/__pycache__/bootstrap.cpython-314.pyc +0 -0
- package/onecode/skills/__pycache__/create.cpython-314.pyc +0 -0
- package/onecode/skills/__pycache__/frontmatter.cpython-314.pyc +0 -0
- package/onecode/skills/__pycache__/loader.cpython-314.pyc +0 -0
- package/onecode/skills/__pycache__/model.cpython-314.pyc +0 -0
- package/onecode/skills/argument_substitution.py +38 -0
- package/onecode/skills/bootstrap.py +37 -0
- package/onecode/skills/create.py +56 -0
- package/onecode/skills/frontmatter.py +33 -0
- package/onecode/skills/loader.py +215 -0
- package/onecode/skills/manager.py +75 -0
- package/onecode/skills/model.py +43 -0
- package/onecode/storage/__init__.py +0 -0
- package/onecode/storage/activity.py +63 -0
- package/onecode/storage/project.py +54 -0
- package/onecode/storage/session.py +112 -0
- package/onecode/tasks/__init__.py +26 -0
- package/onecode/tasks/manager.py +232 -0
- package/onecode/tasks/models.py +240 -0
- package/onecode/trace/__init__.py +0 -0
- package/onecode/trace/tracer.py +173 -0
- package/onecode/utils/__init__.py +0 -0
- package/onecode/utils/helpers.py +20 -0
- package/onecode/verification/__init__.py +5 -0
- package/onecode/verification/__pycache__/__init__.cpython-314.pyc +0 -0
- package/onecode/verification/__pycache__/aggregation.cpython-314.pyc +0 -0
- package/onecode/verification/__pycache__/loop.cpython-314.pyc +0 -0
- package/onecode/verification/__pycache__/policy.cpython-314.pyc +0 -0
- package/onecode/verification/aggregation.py +53 -0
- package/onecode/verification/gates/__init__.py +6 -0
- package/onecode/verification/gates/__pycache__/__init__.cpython-314.pyc +0 -0
- package/onecode/verification/gates/__pycache__/base.cpython-314.pyc +0 -0
- package/onecode/verification/gates/__pycache__/lint_gate.cpython-314.pyc +0 -0
- package/onecode/verification/gates/__pycache__/test_gate.cpython-314.pyc +0 -0
- package/onecode/verification/gates/__pycache__/type_gate.cpython-314.pyc +0 -0
- package/onecode/verification/gates/base.py +20 -0
- package/onecode/verification/gates/lint_gate.py +45 -0
- package/onecode/verification/gates/test_gate.py +62 -0
- package/onecode/verification/gates/type_gate.py +46 -0
- package/onecode/verification/loop.py +95 -0
- package/onecode/verification/policy.py +29 -0
- package/package.json +2 -2
- package/pyproject.toml +84 -0
- package/run.js +2 -1
- package/tui/__init__.py +46 -0
- package/tui/__main__.py +4 -0
- package/tui/__pycache__/__init__.cpython-314.pyc +0 -0
- package/tui/__pycache__/_loop.cpython-314.pyc +0 -0
- package/tui/__pycache__/_path_fuzzy_search.cpython-314.pyc +0 -0
- package/tui/__pycache__/_path_match.cpython-314.pyc +0 -0
- package/tui/__pycache__/agent.cpython-314.pyc +0 -0
- package/tui/__pycache__/agent_schema.cpython-314.pyc +0 -0
- package/tui/__pycache__/agents.cpython-314.pyc +0 -0
- package/tui/__pycache__/answer.cpython-314.pyc +0 -0
- package/tui/__pycache__/app.cpython-314.pyc +0 -0
- package/tui/__pycache__/atomic.cpython-314.pyc +0 -0
- package/tui/__pycache__/complete.cpython-314.pyc +0 -0
- package/tui/__pycache__/constants.cpython-314.pyc +0 -0
- package/tui/__pycache__/conversation_markdown.cpython-314.pyc +0 -0
- package/tui/__pycache__/db.cpython-314.pyc +0 -0
- package/tui/__pycache__/dec.cpython-314.pyc +0 -0
- package/tui/__pycache__/directory.cpython-314.pyc +0 -0
- package/tui/__pycache__/directory_watcher.cpython-314.pyc +0 -0
- package/tui/__pycache__/format_path.cpython-314.pyc +0 -0
- package/tui/__pycache__/fuzzy.cpython-314.pyc +0 -0
- package/tui/__pycache__/fuzzy_index.cpython-314.pyc +0 -0
- package/tui/__pycache__/history.cpython-314.pyc +0 -0
- package/tui/__pycache__/jsonrpc.cpython-314.pyc +0 -0
- package/tui/__pycache__/menus.cpython-314.pyc +0 -0
- package/tui/__pycache__/message_log.cpython-314.pyc +0 -0
- package/tui/__pycache__/messages.cpython-314.pyc +0 -0
- package/tui/__pycache__/path_complete.cpython-314.pyc +0 -0
- package/tui/__pycache__/path_filter.cpython-314.pyc +0 -0
- package/tui/__pycache__/paths.cpython-314.pyc +0 -0
- package/tui/__pycache__/pill.cpython-314.pyc +0 -0
- package/tui/__pycache__/platform_commands.cpython-314.pyc +0 -0
- package/tui/__pycache__/protocol.cpython-314.pyc +0 -0
- package/tui/__pycache__/session_tracker.cpython-314.pyc +0 -0
- package/tui/__pycache__/settings.cpython-314.pyc +0 -0
- package/tui/__pycache__/settings_schema.cpython-314.pyc +0 -0
- package/tui/__pycache__/shell.cpython-314.pyc +0 -0
- package/tui/__pycache__/shell_read.cpython-314.pyc +0 -0
- package/tui/__pycache__/slash_command.cpython-314.pyc +0 -0
- package/tui/__pycache__/version.cpython-314.pyc +0 -0
- package/tui/_loop.py +86 -0
- package/tui/_path_fuzzy_search.py +48 -0
- package/tui/_path_match.py +141 -0
- package/tui/about.py +95 -0
- package/tui/acp/__pycache__/agent.cpython-314.pyc +0 -0
- package/tui/acp/__pycache__/api.cpython-314.pyc +0 -0
- package/tui/acp/__pycache__/encode_tool_call_id.cpython-314.pyc +0 -0
- package/tui/acp/__pycache__/event_tap.cpython-314.pyc +0 -0
- package/tui/acp/__pycache__/messages.cpython-314.pyc +0 -0
- package/tui/acp/__pycache__/prompt.cpython-314.pyc +0 -0
- package/tui/acp/__pycache__/protocol.cpython-314.pyc +0 -0
- package/tui/acp/agent.py +1212 -0
- package/tui/acp/api.py +79 -0
- package/tui/acp/encode_tool_call_id.py +12 -0
- package/tui/acp/event_tap.py +107 -0
- package/tui/acp/messages.py +222 -0
- package/tui/acp/prompt.py +53 -0
- package/tui/acp/protocol.py +551 -0
- package/tui/agent.py +70 -0
- package/tui/agent_schema.py +76 -0
- package/tui/agents.py +46 -0
- package/tui/ansi/__init__.py +1 -0
- package/tui/ansi/__pycache__/__init__.cpython-314.pyc +0 -0
- package/tui/ansi/__pycache__/_ansi.cpython-314.pyc +0 -0
- package/tui/ansi/__pycache__/_ansi_colors.cpython-314.pyc +0 -0
- package/tui/ansi/__pycache__/_control_codes.cpython-314.pyc +0 -0
- package/tui/ansi/__pycache__/_keys.cpython-314.pyc +0 -0
- package/tui/ansi/__pycache__/_sgr_styles.cpython-314.pyc +0 -0
- package/tui/ansi/__pycache__/_stream_parser.cpython-314.pyc +0 -0
- package/tui/ansi/_ansi.py +1689 -0
- package/tui/ansi/_ansi_colors.py +264 -0
- package/tui/ansi/_control_codes.py +37 -0
- package/tui/ansi/_keys.py +251 -0
- package/tui/ansi/_sgr_styles.py +64 -0
- package/tui/ansi/_stream_parser.py +418 -0
- package/tui/answer.py +12 -0
- package/tui/app.py +1195 -0
- package/tui/atomic.py +37 -0
- package/tui/cli.py +208 -0
- package/tui/code_analyze.py +27 -0
- package/tui/complete.py +38 -0
- package/tui/constants.py +61 -0
- package/tui/conversation_markdown.py +30 -0
- package/tui/danger.py +372 -0
- package/tui/data/agents/ampcode.com.toml +52 -0
- package/tui/data/agents/augmentcode.com.toml +41 -0
- package/tui/data/agents/cdh.cloud-dev-harness.toml +23 -0
- package/tui/data/agents/claude.com.toml +41 -0
- package/tui/data/agents/copilot.github.com.toml +29 -0
- package/tui/data/agents/crowai.dev.toml +36 -0
- package/tui/data/agents/cursor.com.toml +38 -0
- package/tui/data/agents/deepagents.langchain.com +34 -0
- package/tui/data/agents/docker.com.toml +60 -0
- package/tui/data/agents/geminicli.com.toml +28 -0
- package/tui/data/agents/goose.ai.toml +52 -0
- package/tui/data/agents/inference.huggingface.co.toml +41 -0
- package/tui/data/agents/kimi.com.toml +35 -0
- package/tui/data/agents/kiro.dev.toml +43 -0
- package/tui/data/agents/onecode.dev.toml +22 -0
- package/tui/data/agents/openai.com.toml +53 -0
- package/tui/data/agents/openclaw.ai.toml +37 -0
- package/tui/data/agents/opencode.ai.toml +39 -0
- package/tui/data/agents/openhands.dev.toml +46 -0
- package/tui/data/agents/stakpak.dev.toml +62 -0
- package/tui/data/agents/vibe.mistral.ai.toml +31 -0
- package/tui/data/agents/vtcode.dev.toml +63 -0
- package/tui/data/images/frog.png +0 -0
- package/tui/data/sounds/question.wav +0 -0
- package/tui/data/sounds/turn-over.wav +0 -0
- package/tui/db.py +213 -0
- package/tui/dec.py +332 -0
- package/tui/diff_utils.py +131 -0
- package/tui/directory.py +234 -0
- package/tui/directory_suggester.py +93 -0
- package/tui/directory_watcher.py +231 -0
- package/tui/format_path.py +25 -0
- package/tui/fuzzy.py +140 -0
- package/tui/fuzzy_index.py +275 -0
- package/tui/gist.py +33 -0
- package/tui/history.py +138 -0
- package/tui/jsonrpc.py +599 -0
- package/tui/menus.py +14 -0
- package/tui/message_log.py +69 -0
- package/tui/messages.py +144 -0
- package/tui/option_content.py +51 -0
- package/tui/os.py +0 -0
- package/tui/path_complete.py +217 -0
- package/tui/path_filter.py +124 -0
- package/tui/paths.py +87 -0
- package/tui/pill.py +23 -0
- package/tui/platform_commands.py +52 -0
- package/tui/prompt/__pycache__/extract.cpython-314.pyc +0 -0
- package/tui/prompt/__pycache__/resource.cpython-314.pyc +0 -0
- package/tui/prompt/extract.py +19 -0
- package/tui/prompt/resource.py +68 -0
- package/tui/protocol.py +28 -0
- package/tui/screens/__init__.py +0 -0
- package/tui/screens/__pycache__/__init__.cpython-314.pyc +0 -0
- package/tui/screens/__pycache__/diff_screen.cpython-314.pyc +0 -0
- package/tui/screens/__pycache__/main.cpython-314.pyc +0 -0
- package/tui/screens/__pycache__/sessions.cpython-314.pyc +0 -0
- package/tui/screens/action_modal.py +94 -0
- package/tui/screens/agent_modal.py +175 -0
- package/tui/screens/command_edit_modal.py +74 -0
- package/tui/screens/diff_explorer_screen.py +419 -0
- package/tui/screens/diff_screen.py +84 -0
- package/tui/screens/ide_screen.py +461 -0
- package/tui/screens/main.py +397 -0
- package/tui/screens/main.tcss +662 -0
- package/tui/screens/permissions.py +404 -0
- package/tui/screens/permissions.tcss +72 -0
- package/tui/screens/projects.tcss +84 -0
- package/tui/screens/projects_app.py +341 -0
- package/tui/screens/projects_screen.py +277 -0
- package/tui/screens/session_resume_modal.py +172 -0
- package/tui/screens/session_resume_modal.tcss +35 -0
- package/tui/screens/sessions.py +171 -0
- package/tui/screens/sessions.tcss +119 -0
- package/tui/screens/settings.py +293 -0
- package/tui/screens/settings.tcss +113 -0
- package/tui/screens/store.py +502 -0
- package/tui/screens/store.tcss +274 -0
- package/tui/screens/tool_content_screen.py +59 -0
- package/tui/screens/trace.py +317 -0
- package/tui/session_tracker.py +123 -0
- package/tui/settings.py +353 -0
- package/tui/settings_schema.py +467 -0
- package/tui/shell.py +304 -0
- package/tui/shell_read.py +42 -0
- package/tui/slash_command.py +34 -0
- package/tui/tui.tcss +246 -0
- package/tui/twitter.py +38 -0
- package/tui/version.py +80 -0
- package/tui/visuals/__init__.py +0 -0
- package/tui/visuals/__pycache__/__init__.cpython-314.pyc +0 -0
- package/tui/visuals/__pycache__/columns.cpython-314.pyc +0 -0
- package/tui/visuals/columns.py +272 -0
- package/tui/widgets/__init__.py +0 -0
- package/tui/widgets/__pycache__/__init__.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/agent_response.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/agent_thought.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/aidlc.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/ask_user.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/condensed_path.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/context_stats.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/conversation.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/diff_view.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/flash.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/future_text.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/grid_select.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/highlighted_textarea.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/load_more.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/menu.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/modified_files.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/non_selectable_label.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/note.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/path_search.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/pending_prompts.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/plan.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/project_directory_tree.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/prompt.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/question.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/session_grid_select.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/session_summary.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/session_tabs.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/shell_terminal.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/side_bar.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/slash_complete.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/strike_text.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/terminal.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/throbber.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/tool_call.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/user_input.cpython-314.pyc +0 -0
- package/tui/widgets/acp_content.py +70 -0
- package/tui/widgets/agent_response.py +76 -0
- package/tui/widgets/agent_thought.py +167 -0
- package/tui/widgets/aidlc.py +334 -0
- package/tui/widgets/ask_user.py +604 -0
- package/tui/widgets/command_pane.py +223 -0
- package/tui/widgets/condensed_path.py +115 -0
- package/tui/widgets/context_stats.py +66 -0
- package/tui/widgets/conversation.py +3235 -0
- package/tui/widgets/danger_warning.py +65 -0
- package/tui/widgets/diff_view.py +69 -0
- package/tui/widgets/directory_input.py +8 -0
- package/tui/widgets/edit_field.py +206 -0
- package/tui/widgets/flash.py +81 -0
- package/tui/widgets/future_text.py +126 -0
- package/tui/widgets/grid_select.py +234 -0
- package/tui/widgets/highlighted_textarea.py +183 -0
- package/tui/widgets/load_more.py +24 -0
- package/tui/widgets/mandelbrot.py +294 -0
- package/tui/widgets/markdown_note.py +13 -0
- package/tui/widgets/menu.py +147 -0
- package/tui/widgets/model_status.py +230 -0
- package/tui/widgets/modified_files.py +315 -0
- package/tui/widgets/non_selectable_label.py +5 -0
- package/tui/widgets/note.py +18 -0
- package/tui/widgets/path_search.py +492 -0
- package/tui/widgets/pending_prompts.py +36 -0
- package/tui/widgets/plan.py +285 -0
- package/tui/widgets/project_directory_tree.py +102 -0
- package/tui/widgets/project_grid_select.py +68 -0
- package/tui/widgets/project_summary.py +33 -0
- package/tui/widgets/prompt.py +935 -0
- package/tui/widgets/question.py +360 -0
- package/tui/widgets/session_grid_select.py +230 -0
- package/tui/widgets/session_summary.py +115 -0
- package/tui/widgets/session_tabs.py +194 -0
- package/tui/widgets/shell_result.py +35 -0
- package/tui/widgets/shell_terminal.py +40 -0
- package/tui/widgets/side_bar.py +124 -0
- package/tui/widgets/slash_complete.py +235 -0
- package/tui/widgets/strike_text.py +70 -0
- package/tui/widgets/subagent.py +287 -0
- package/tui/widgets/subagent_screen.py +715 -0
- package/tui/widgets/terminal.py +576 -0
- package/tui/widgets/terminal_tool.py +360 -0
- package/tui/widgets/throbber.py +100 -0
- package/tui/widgets/tool_call.py +432 -0
- package/tui/widgets/user_input.py +23 -0
- package/tui/widgets/version.py +5 -0
- package/tui/widgets/welcome.py +31 -0
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import fnmatch
|
|
4
|
+
from dataclasses import dataclass, field
|
|
5
|
+
from enum import Enum
|
|
6
|
+
from pathlib import Path
|
|
7
|
+
from typing import Optional
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class PermissionResult(Enum):
|
|
11
|
+
ALLOW = "allow"
|
|
12
|
+
DENY = "deny"
|
|
13
|
+
ASK = "ask"
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
@dataclass
|
|
17
|
+
class PathRule:
|
|
18
|
+
pattern: str
|
|
19
|
+
permission: PermissionResult = PermissionResult.ALLOW
|
|
20
|
+
|
|
21
|
+
def matches(self, path: str) -> bool:
|
|
22
|
+
return (
|
|
23
|
+
fnmatch.fnmatch(path, self.pattern) or
|
|
24
|
+
fnmatch.fnmatch(Path(path).name, self.pattern) or
|
|
25
|
+
fnmatch.fnmatch(Path(path).stem, self.pattern)
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
@dataclass
|
|
30
|
+
class CommandRule:
|
|
31
|
+
pattern: str
|
|
32
|
+
permission: PermissionResult = PermissionResult.ALLOW
|
|
33
|
+
|
|
34
|
+
def matches(self, cmd: str) -> bool:
|
|
35
|
+
normalized = cmd.strip()
|
|
36
|
+
if fnmatch.fnmatch(normalized, self.pattern):
|
|
37
|
+
return True
|
|
38
|
+
parts = normalized.split()
|
|
39
|
+
if parts:
|
|
40
|
+
cmd_base = parts[0]
|
|
41
|
+
args = " ".join(parts[1:]) if len(parts) > 1 else ""
|
|
42
|
+
if args and fnmatch.fnmatch(f"{cmd_base} {args}", self.pattern):
|
|
43
|
+
return True
|
|
44
|
+
if fnmatch.fnmatch(cmd_base, self.pattern):
|
|
45
|
+
return True
|
|
46
|
+
return False
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
@dataclass
|
|
50
|
+
class PermissionSet:
|
|
51
|
+
path_rules: list[PathRule] = field(default_factory=list)
|
|
52
|
+
command_rules: list[CommandRule] = field(default_factory=list)
|
|
53
|
+
default_path_permission: PermissionResult = PermissionResult.ALLOW
|
|
54
|
+
default_command_permission: PermissionResult = PermissionResult.ALLOW
|
|
55
|
+
|
|
56
|
+
def check_path(self, path: str) -> PermissionResult:
|
|
57
|
+
matched = self.default_path_permission
|
|
58
|
+
for rule in self.path_rules:
|
|
59
|
+
if rule.matches(path):
|
|
60
|
+
matched = rule.permission
|
|
61
|
+
return matched
|
|
62
|
+
|
|
63
|
+
def check_command(self, cmd: str) -> PermissionResult:
|
|
64
|
+
matched = self.default_command_permission
|
|
65
|
+
for rule in self.command_rules:
|
|
66
|
+
if rule.matches(cmd):
|
|
67
|
+
matched = rule.permission
|
|
68
|
+
return matched
|
|
69
|
+
|
|
70
|
+
def allow_path(self, pattern: str) -> None:
|
|
71
|
+
self.path_rules.append(PathRule(pattern, PermissionResult.ALLOW))
|
|
72
|
+
|
|
73
|
+
def deny_path(self, pattern: str) -> None:
|
|
74
|
+
self.path_rules.append(PathRule(pattern, PermissionResult.DENY))
|
|
75
|
+
|
|
76
|
+
def ask_path(self, pattern: str) -> None:
|
|
77
|
+
self.path_rules.append(PathRule(pattern, PermissionResult.ASK))
|
|
78
|
+
|
|
79
|
+
def allow_command(self, pattern: str) -> None:
|
|
80
|
+
self.command_rules.append(CommandRule(pattern, PermissionResult.ALLOW))
|
|
81
|
+
|
|
82
|
+
def deny_command(self, pattern: str) -> None:
|
|
83
|
+
self.command_rules.append(CommandRule(pattern, PermissionResult.DENY))
|
|
84
|
+
|
|
85
|
+
def ask_command(self, pattern: str) -> None:
|
|
86
|
+
self.command_rules.append(CommandRule(pattern, PermissionResult.ASK))
|
|
87
|
+
|
|
88
|
+
@classmethod
|
|
89
|
+
def from_config(cls, config: dict) -> "PermissionSet":
|
|
90
|
+
ps = cls()
|
|
91
|
+
perm_map = {"allow": PermissionResult.ALLOW, "ask": PermissionResult.ASK, "deny": PermissionResult.DENY}
|
|
92
|
+
|
|
93
|
+
if "path" in config:
|
|
94
|
+
for pattern, action in config["path"].items():
|
|
95
|
+
if action in perm_map:
|
|
96
|
+
getattr(ps, f"{action}_path")(pattern)
|
|
97
|
+
|
|
98
|
+
if "command" in config:
|
|
99
|
+
for pattern, action in config["command"].items():
|
|
100
|
+
if action in perm_map:
|
|
101
|
+
getattr(ps, f"{action}_command")(pattern)
|
|
102
|
+
|
|
103
|
+
if "default" in config:
|
|
104
|
+
default = config["default"]
|
|
105
|
+
if "path" in default and default["path"] in perm_map:
|
|
106
|
+
ps.default_path_permission = perm_map[default["path"]]
|
|
107
|
+
if "command" in default and default["command"] in perm_map:
|
|
108
|
+
ps.default_command_permission = perm_map[default["command"]]
|
|
109
|
+
|
|
110
|
+
return ps
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
class PermissionChecker:
|
|
114
|
+
def __init__(self, permission_set: Optional[PermissionSet] = None):
|
|
115
|
+
self.permission_set = permission_set or PermissionSet()
|
|
116
|
+
|
|
117
|
+
def check_file_read(self, path: str) -> PermissionResult:
|
|
118
|
+
return self.permission_set.check_path(path)
|
|
119
|
+
|
|
120
|
+
def check_file_write(self, path: str) -> PermissionResult:
|
|
121
|
+
return self.permission_set.check_path(path)
|
|
122
|
+
|
|
123
|
+
def check_command(self, cmd: str) -> PermissionResult:
|
|
124
|
+
return self.permission_set.check_command(cmd)
|
|
125
|
+
|
|
126
|
+
def is_allowed(self, permission: PermissionResult) -> bool:
|
|
127
|
+
return permission == PermissionResult.ALLOW
|
|
128
|
+
|
|
129
|
+
def is_denied(self, permission: PermissionResult) -> bool:
|
|
130
|
+
return permission == PermissionResult.DENY
|
|
131
|
+
|
|
132
|
+
def requires_approval(self, permission: PermissionResult) -> bool:
|
|
133
|
+
return permission == PermissionResult.ASK
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
def create_safe_permission_set() -> PermissionSet:
|
|
137
|
+
ps = PermissionSet()
|
|
138
|
+
ps.deny_path("**/.env")
|
|
139
|
+
ps.deny_path("**/secrets/**")
|
|
140
|
+
ps.deny_path("**/credentials/**")
|
|
141
|
+
ps.deny_command("rm -rf /")
|
|
142
|
+
ps.deny_command("rm -rf /*")
|
|
143
|
+
ps.deny_command("dd if=*")
|
|
144
|
+
ps.deny_command("mkfs.*")
|
|
145
|
+
ps.deny_command(":(){:|:&};:")
|
|
146
|
+
ps.ask_command("sudo *")
|
|
147
|
+
ps.ask_command("chmod 777 *")
|
|
148
|
+
ps.ask_command("curl *")
|
|
149
|
+
ps.ask_command("wget *")
|
|
150
|
+
return ps
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import Optional
|
|
4
|
+
|
|
5
|
+
from onecode.agent.agents.types import AgentPermission
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class PermissionStore:
|
|
9
|
+
"""Persists user-defined allow_always / reject_always overrides across
|
|
10
|
+
``set_agent()`` calls so permissions survive mode switches.
|
|
11
|
+
|
|
12
|
+
Usage::
|
|
13
|
+
|
|
14
|
+
store = PermissionStore()
|
|
15
|
+
store.set_override("bash", AgentPermission.ALLOW) # user said "Allow always"
|
|
16
|
+
store.set_override("edit", AgentPermission.DENY) # user said "Reject always"
|
|
17
|
+
...
|
|
18
|
+
store.apply_to(current_agent) # re-apply after set_agent
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
def __init__(self) -> None:
|
|
22
|
+
# perm_key → AgentPermission (e.g. "bash" → AgentPermission.ALLOW)
|
|
23
|
+
self._overrides: dict[str, AgentPermission] = {}
|
|
24
|
+
|
|
25
|
+
def set_override(self, perm_key: str, perm: AgentPermission) -> None:
|
|
26
|
+
"""Record a user override for the given permission key."""
|
|
27
|
+
self._overrides[perm_key] = perm
|
|
28
|
+
|
|
29
|
+
def get_override(self, perm_key: str) -> Optional[AgentPermission]:
|
|
30
|
+
return self._overrides.get(perm_key)
|
|
31
|
+
|
|
32
|
+
def clear_override(self, perm_key: str) -> None:
|
|
33
|
+
self._overrides.pop(perm_key, None)
|
|
34
|
+
|
|
35
|
+
def clear_all(self) -> None:
|
|
36
|
+
self._overrides.clear()
|
|
37
|
+
|
|
38
|
+
def apply_to(self, agent) -> None:
|
|
39
|
+
"""Apply all recorded overrides to an AgentConfig instance.
|
|
40
|
+
|
|
41
|
+
Call this after ``set_agent()`` to restore the user's choices.
|
|
42
|
+
|
|
43
|
+
Agents with ``permissions_locked`` (e.g. PlanAgent) are skipped
|
|
44
|
+
entirely — their permission set is an intentional mode-level
|
|
45
|
+
restriction (read-only plan gate) that user overrides from other
|
|
46
|
+
modes must never bypass, including fields that happen to be ASK
|
|
47
|
+
rather than hard-DENY.
|
|
48
|
+
"""
|
|
49
|
+
if getattr(agent, "permissions_locked", False):
|
|
50
|
+
return
|
|
51
|
+
for perm_key, perm in self._overrides.items():
|
|
52
|
+
attr_name = f"permission_{perm_key}"
|
|
53
|
+
if hasattr(agent, attr_name):
|
|
54
|
+
current = getattr(agent, attr_name)
|
|
55
|
+
if current == AgentPermission.DENY:
|
|
56
|
+
continue
|
|
57
|
+
setattr(agent, attr_name, perm)
|
|
58
|
+
|
|
59
|
+
def to_dict(self) -> dict[str, str]:
|
|
60
|
+
return {k: v.value for k, v in self._overrides.items()}
|
|
61
|
+
|
|
62
|
+
@classmethod
|
|
63
|
+
def from_dict(cls, d: dict[str, str]) -> PermissionStore:
|
|
64
|
+
store = cls()
|
|
65
|
+
for k, v in d.items():
|
|
66
|
+
try:
|
|
67
|
+
store._overrides[k] = AgentPermission(v)
|
|
68
|
+
except ValueError:
|
|
69
|
+
pass
|
|
70
|
+
return store
|
|
71
|
+
|
|
72
|
+
def snapshot(self) -> dict[str, AgentPermission]:
|
|
73
|
+
return dict(self._overrides)
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from pathlib import Path
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
def load_project_doc(workspace_root: Path) -> str:
|
|
7
|
+
"""Read ``AGENTS.md`` at the project root if present.
|
|
8
|
+
|
|
9
|
+
Convention mirrors ``AGENTS.md`` / ``CLAUDE.md``: exactly one file at
|
|
10
|
+
the workspace root that all AI agents must read. Unlike skills,
|
|
11
|
+
this is not registered — it's injected directly as project context.
|
|
12
|
+
"""
|
|
13
|
+
path = workspace_root.resolve() / "AGENTS.md"
|
|
14
|
+
if not path.exists():
|
|
15
|
+
return ""
|
|
16
|
+
try:
|
|
17
|
+
return path.read_text(encoding="utf-8")
|
|
18
|
+
except Exception:
|
|
19
|
+
return ""
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
"""Shared plain-text question detection for auto-AskUser conversion.
|
|
2
|
+
|
|
3
|
+
Both the engine (intercepts mid-turn, before tool execution) and the ACP
|
|
4
|
+
adapter (end-of-turn fallback) must agree on what counts as a question, or
|
|
5
|
+
plain-text questions slip through and the user's input gets queued instead
|
|
6
|
+
of becoming an AskUser dialog.
|
|
7
|
+
|
|
8
|
+
Detection uses two layers:
|
|
9
|
+
- Layer 1 — Semantic (intent): explicit "need user input" signals
|
|
10
|
+
- Layer 2 — Syntax (punctuation): question marks as fallback
|
|
11
|
+
|
|
12
|
+
Self-talk patterns are excluded (the LLM is reasoning to itself, no input
|
|
13
|
+
needed).
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
from __future__ import annotations
|
|
17
|
+
|
|
18
|
+
import re
|
|
19
|
+
|
|
20
|
+
# Patterns indicating the LLM explicitly needs human input
|
|
21
|
+
SEMANTIC_NEEDS_INPUT = [
|
|
22
|
+
r"需要用户", r"需要您", r"需要您提供",
|
|
23
|
+
r"请确认", r"请选择", r"询问您", r"问您",
|
|
24
|
+
r"需要确认", r"需要知道", r"请告诉我",
|
|
25
|
+
r"等待您的", r"需要.*信息", r"需要哪些参数",
|
|
26
|
+
r"请提供", r"请问要", r"请问您", r"需要.*id",
|
|
27
|
+
r"哪个用户", r"哪个文件", r"什么参数", r"如何处理",
|
|
28
|
+
r"^请问",
|
|
29
|
+
r"could you (tell me|confirm|provide|let me know)",
|
|
30
|
+
r"i need to know",
|
|
31
|
+
r"please (confirm|tell me|specify|provide|select|choose)",
|
|
32
|
+
r"which .*(user|file|parameter|option|setting)",
|
|
33
|
+
r"what .*(parameter|user|file|option|setting)",
|
|
34
|
+
r"what should i",
|
|
35
|
+
r"which (file|user|option|one)",
|
|
36
|
+
r"should i (proceed|continue|upgrade|execute)",
|
|
37
|
+
r"do you want (me to|to)",
|
|
38
|
+
r"can you (tell me|confirm|specify)",
|
|
39
|
+
r"let me know (which|what|if|whether)",
|
|
40
|
+
r"i'?m not sure (which|what|who|how)",
|
|
41
|
+
r"you('d| would) like (me to|to)",
|
|
42
|
+
r"would you like (me to|to)",
|
|
43
|
+
r"(could i|may i) get (the|your)",
|
|
44
|
+
r"pick (a|an|the)",
|
|
45
|
+
r"choose (a|an|the|which)",
|
|
46
|
+
r"what'?s the (user|file|path|parameter)",
|
|
47
|
+
r"which one",
|
|
48
|
+
r"confirm the (user|file|path|parameter)",
|
|
49
|
+
r"specify (the|which|what)",
|
|
50
|
+
r"what .*(file|user|path|parameter)",
|
|
51
|
+
r"which .*should i",
|
|
52
|
+
r"(do you|would you|should i)",
|
|
53
|
+
]
|
|
54
|
+
|
|
55
|
+
# Patterns where SEMANTIC_NEEDS_INPUT matched but it's actually a polite
|
|
56
|
+
# instruction/statement rather than a genuine question. These are LLM
|
|
57
|
+
# self-talk statements of what it needs ("请告诉我错误信息" = "tell me the error"
|
|
58
|
+
# as a statement of need, not a question).
|
|
59
|
+
SEMANTIC_NEEDS_INPUT_EXCLUSIONS = [
|
|
60
|
+
r"请尝试后告知结果", r"请尝试", r"请告知", r"请先",
|
|
61
|
+
r"请试试", r"请按", r"请过一会儿", r"请执行",
|
|
62
|
+
r"请查看", r"请参考", r"请注意", r"请检查",
|
|
63
|
+
r"请运行", r"请输入", r"请提交", r"请刷新",
|
|
64
|
+
]
|
|
65
|
+
|
|
66
|
+
# Patterns indicating the LLM is just reasoning (self-talk, no input needed)
|
|
67
|
+
SEMANTIC_SELF_TALK = [
|
|
68
|
+
r"^让我想想", r"^我需要先", r"^我可以先",
|
|
69
|
+
r"^首先", r"^然后", r"^接下来", r"^好的",
|
|
70
|
+
r"自言自语", r"我在想", r"我在考虑",
|
|
71
|
+
r"让我先", r"我先来", r"先执行",
|
|
72
|
+
r"^let me (think|check|read|look|find|see)",
|
|
73
|
+
r"^i('ll| will| can| should)?( be)? (checking|reading|looking|finding|seeing|thinking)",
|
|
74
|
+
r"^first(ly)?(,| )?(i('ll| will| can| should)?)?",
|
|
75
|
+
r"^then(,| )?(i('ll| will| can| should)?)?",
|
|
76
|
+
r"^next(,| )?(i('ll| will| can| should)?)?",
|
|
77
|
+
r"^okay(|,| ) (so|let me|i('ll| will| can| should)?)",
|
|
78
|
+
r"^alright(|,| ) (so|let me|i('ll| will| can| should)?)",
|
|
79
|
+
r"^sure(|,| ) (so|let me|i('ll| will| can| should)?)",
|
|
80
|
+
r"^sounds good(|,| )",
|
|
81
|
+
r"^i('ll| will| can| should)?( go ahead| start| begin| proceed| execute)",
|
|
82
|
+
r"^i('ll| will| can| should)?( need to| have to| want to) (check|read|look|find|see|think|consider|proceed|execute|verify|confirm|fix|update|change|add|remove)",
|
|
83
|
+
r"^i('m| am)( going to| about to)?",
|
|
84
|
+
r"^looks like",
|
|
85
|
+
r"^it seems (like|that)",
|
|
86
|
+
r"^based on",
|
|
87
|
+
r"^let me just",
|
|
88
|
+
r"^i('ll| will)? just (check|read|look|find|see|try)",
|
|
89
|
+
r"^i think (that )?",
|
|
90
|
+
r"^i believe (that )?",
|
|
91
|
+
r"i('m| am) thinking (about|that)",
|
|
92
|
+
r"i('m| am) considering",
|
|
93
|
+
r"^here('s| is)",
|
|
94
|
+
r"^so(,| )? i('ll| will| can| should)?",
|
|
95
|
+
r"^okay so",
|
|
96
|
+
r"i need to consider",
|
|
97
|
+
]
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
def semantic_needs_input(text: str) -> bool:
|
|
101
|
+
"""True when the text carries an explicit "I need user input" signal.
|
|
102
|
+
|
|
103
|
+
Self-talk patterns take precedence: an LLM reasoning to itself does not
|
|
104
|
+
need the user, even if it happens to mention an input-like phrase.
|
|
105
|
+
|
|
106
|
+
Polite instruction exclusions: phrases like "请尝试后告知结果" are
|
|
107
|
+
statements of what the LLM needs, not genuine questions.
|
|
108
|
+
"""
|
|
109
|
+
if not text:
|
|
110
|
+
return False
|
|
111
|
+
for pattern in SEMANTIC_SELF_TALK:
|
|
112
|
+
if re.search(pattern, text, re.IGNORECASE):
|
|
113
|
+
return False
|
|
114
|
+
for pattern in SEMANTIC_NEEDS_INPUT:
|
|
115
|
+
if re.search(pattern, text, re.IGNORECASE):
|
|
116
|
+
for excl in SEMANTIC_NEEDS_INPUT_EXCLUSIONS:
|
|
117
|
+
if re.search(excl, text, re.IGNORECASE):
|
|
118
|
+
return False
|
|
119
|
+
return True
|
|
120
|
+
return False
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
def has_trailing_question_mark(text: str) -> bool:
|
|
124
|
+
"""True when the text ends with a question marker (?/CJK+?)."""
|
|
125
|
+
stripped = text.rstrip() if text else ""
|
|
126
|
+
if not stripped:
|
|
127
|
+
return False
|
|
128
|
+
if stripped.endswith("\uff1f"):
|
|
129
|
+
return True
|
|
130
|
+
if stripped.endswith("?") and len(stripped) >= 2:
|
|
131
|
+
prev = stripped[-2]
|
|
132
|
+
return "\u4e00" <= prev <= "\u9fff" or "\u3000" <= prev <= "\u303f"
|
|
133
|
+
return False
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
def has_question_mark_in_last_sentence(text: str) -> bool:
|
|
137
|
+
"""True when the FINAL sentence of the text contains a question mark.
|
|
138
|
+
|
|
139
|
+
This is the loose fallback: unlike checking anywhere in the output, an
|
|
140
|
+
aside or rhetorical ``?`` buried in the middle of the response does not
|
|
141
|
+
count — only a question that closes the turn does. This keeps auto-ask
|
|
142
|
+
from firing on every turn just because the LLM's prose happens to
|
|
143
|
+
contain a question mark.
|
|
144
|
+
"""
|
|
145
|
+
stripped = text.rstrip() if text else ""
|
|
146
|
+
if not stripped:
|
|
147
|
+
return False
|
|
148
|
+
m = max(
|
|
149
|
+
stripped.rfind("。"), stripped.rfind("!"), stripped.rfind("?"),
|
|
150
|
+
stripped.rfind("."), stripped.rfind("!"), stripped.rfind("?"),
|
|
151
|
+
stripped.rfind("\n"),
|
|
152
|
+
)
|
|
153
|
+
tail = stripped[m + 1:] if m >= 0 else stripped
|
|
154
|
+
return "?" in tail or "?" in tail
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
def looks_like_question(text: str, *, strict: bool = False) -> bool:
|
|
158
|
+
"""True when the text asks the user for input.
|
|
159
|
+
|
|
160
|
+
``strict=True`` (used when the LLM made no tool calls): the question
|
|
161
|
+
must be signalled by intent or by trailing question punctuation, so
|
|
162
|
+
ordinary prose or code containing a stray ``?`` is not misread.
|
|
163
|
+
|
|
164
|
+
``strict=False`` (used when tool calls accompany the text): a question
|
|
165
|
+
mark in the FINAL sentence also counts, so a question followed by tool
|
|
166
|
+
execution is still intercepted — but an aside ``?`` in the middle of the
|
|
167
|
+
output does not trigger auto-ask.
|
|
168
|
+
"""
|
|
169
|
+
if not text or not text.strip():
|
|
170
|
+
return False
|
|
171
|
+
if semantic_needs_input(text):
|
|
172
|
+
return True
|
|
173
|
+
if has_trailing_question_mark(text):
|
|
174
|
+
return True
|
|
175
|
+
if not strict and has_question_mark_in_last_sentence(text):
|
|
176
|
+
return True
|
|
177
|
+
return False
|
|
178
|
+
|
|
179
|
+
|
|
180
|
+
# Common markdown block/emphasis markers that bloat the AskUser widget.
|
|
181
|
+
# We strip these from the auto-ask question so the dialog stays compact.
|
|
182
|
+
_MARKDOWN_STRIP = (
|
|
183
|
+
r"\*\*", r"__", r"`", r"```", r"\*",
|
|
184
|
+
r"^#+\s?", r"^>\s?", r"^\s*[-*+]\s+", r"^\s*\d+\.\s+",
|
|
185
|
+
r"^---\s*$", r"^\|", r"\|\s*$",
|
|
186
|
+
)
|
|
187
|
+
|
|
188
|
+
|
|
189
|
+
def strip_markdown(text: str) -> str:
|
|
190
|
+
"""Strip common markdown syntax so question text renders cleanly."""
|
|
191
|
+
if not text:
|
|
192
|
+
return ""
|
|
193
|
+
lines = []
|
|
194
|
+
for raw in text.splitlines():
|
|
195
|
+
line = raw
|
|
196
|
+
for pat in _MARKDOWN_STRIP:
|
|
197
|
+
line = re.sub(pat, "", line)
|
|
198
|
+
lines.append(line.strip())
|
|
199
|
+
return "\n".join(lines).strip()
|
|
200
|
+
|
|
201
|
+
|
|
202
|
+
def compact_question(text: str, *, max_chars: int = 240) -> str:
|
|
203
|
+
"""Condense a (possibly markdown-laden) question to a compact snippet.
|
|
204
|
+
|
|
205
|
+
Used for auto-AskUser conversion so the dialog shows the trailing
|
|
206
|
+
question sentence instead of the whole preamble/plan text.
|
|
207
|
+
"""
|
|
208
|
+
if not text:
|
|
209
|
+
return ""
|
|
210
|
+
clean = strip_markdown(text)
|
|
211
|
+
|
|
212
|
+
# Prefer the final sentence, anchored on CJK/Latin sentence terminators.
|
|
213
|
+
tail = ""
|
|
214
|
+
for marker in ("。", "!", "\uff1f", ". ", "! ", "? ", "\n"):
|
|
215
|
+
idx = clean.rfind(marker)
|
|
216
|
+
if idx >= 0:
|
|
217
|
+
tail = clean[idx + 1:].strip()
|
|
218
|
+
break
|
|
219
|
+
if len(tail) < 12:
|
|
220
|
+
tail = clean
|
|
221
|
+
|
|
222
|
+
if len(tail) <= max_chars:
|
|
223
|
+
return tail
|
|
224
|
+
|
|
225
|
+
# Hard truncate at a sentence boundary near the limit.
|
|
226
|
+
prefix = tail[:max_chars]
|
|
227
|
+
cut = max(prefix.rfind("。"), prefix.rfind(","), prefix.rfind(". "), prefix.rfind(", "))
|
|
228
|
+
if cut >= max_chars * 3 // 4:
|
|
229
|
+
prefix = prefix[:cut + 1]
|
|
230
|
+
return prefix.rstrip() + "…"
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import fnmatch
|
|
4
|
+
import json
|
|
5
|
+
import os
|
|
6
|
+
import shutil
|
|
7
|
+
import tarfile
|
|
8
|
+
import uuid
|
|
9
|
+
from dataclasses import dataclass
|
|
10
|
+
from datetime import datetime, timezone
|
|
11
|
+
from pathlib import Path
|
|
12
|
+
from typing import Optional
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
@dataclass
|
|
16
|
+
class SnapshotInfo:
|
|
17
|
+
id: str
|
|
18
|
+
name: str
|
|
19
|
+
timestamp: str
|
|
20
|
+
description: str
|
|
21
|
+
size_bytes: int
|
|
22
|
+
file_count: int
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class SnapshotManager:
|
|
26
|
+
def __init__(self, base_path: Optional[Path] = None):
|
|
27
|
+
from onecode.config import ONECODE_DIR
|
|
28
|
+
self.base_path = base_path or (ONECODE_DIR / "snapshots")
|
|
29
|
+
self.base_path.mkdir(parents=True, exist_ok=True)
|
|
30
|
+
|
|
31
|
+
def create(
|
|
32
|
+
self,
|
|
33
|
+
workspace: Path,
|
|
34
|
+
name: str,
|
|
35
|
+
description: str = "",
|
|
36
|
+
exclude_patterns: Optional[list[str]] = None,
|
|
37
|
+
) -> SnapshotInfo:
|
|
38
|
+
snapshot_id = str(uuid.uuid4())[:8]
|
|
39
|
+
snapshot_dir = self.base_path / snapshot_id
|
|
40
|
+
snapshot_dir.mkdir(parents=True, exist_ok=True)
|
|
41
|
+
|
|
42
|
+
tar_path = snapshot_dir / "snapshot.tar.gz"
|
|
43
|
+
manifest_path = snapshot_dir / "manifest.json"
|
|
44
|
+
|
|
45
|
+
exclude_patterns = exclude_patterns or [
|
|
46
|
+
".git",
|
|
47
|
+
"node_modules",
|
|
48
|
+
"__pycache__",
|
|
49
|
+
"*.pyc",
|
|
50
|
+
".pytest_cache",
|
|
51
|
+
".venv",
|
|
52
|
+
"venv",
|
|
53
|
+
".env",
|
|
54
|
+
"*.egg-info",
|
|
55
|
+
".cdh",
|
|
56
|
+
"snapshots",
|
|
57
|
+
]
|
|
58
|
+
|
|
59
|
+
file_count = 0
|
|
60
|
+
with tarfile.open(str(tar_path), "w:gz") as tar:
|
|
61
|
+
for root, dirs, files in os.walk(workspace):
|
|
62
|
+
dirs[:] = [d for d in dirs if not self._should_exclude(d, exclude_patterns)]
|
|
63
|
+
|
|
64
|
+
for file in files:
|
|
65
|
+
file_path = Path(root) / file
|
|
66
|
+
if not self._should_exclude(file_path.name, exclude_patterns):
|
|
67
|
+
try:
|
|
68
|
+
tar.add(str(file_path), arcname=str(file_path.relative_to(workspace)))
|
|
69
|
+
file_count += 1
|
|
70
|
+
except Exception:
|
|
71
|
+
pass
|
|
72
|
+
|
|
73
|
+
size_bytes = tar_path.stat().st_size
|
|
74
|
+
|
|
75
|
+
manifest = {
|
|
76
|
+
"id": snapshot_id,
|
|
77
|
+
"name": name,
|
|
78
|
+
"description": description,
|
|
79
|
+
"timestamp": datetime.now(timezone.utc).isoformat(),
|
|
80
|
+
"workspace": str(workspace),
|
|
81
|
+
"file_count": file_count,
|
|
82
|
+
"size_bytes": size_bytes,
|
|
83
|
+
}
|
|
84
|
+
manifest_path.write_text(json.dumps(manifest, indent=2), encoding="utf-8")
|
|
85
|
+
|
|
86
|
+
return SnapshotInfo(
|
|
87
|
+
id=snapshot_id,
|
|
88
|
+
name=name,
|
|
89
|
+
timestamp=manifest["timestamp"],
|
|
90
|
+
description=description,
|
|
91
|
+
size_bytes=size_bytes,
|
|
92
|
+
file_count=file_count,
|
|
93
|
+
)
|
|
94
|
+
|
|
95
|
+
def restore(self, snapshot_id: str, target_dir: Path) -> bool:
|
|
96
|
+
snapshot_dir = self.base_path / snapshot_id
|
|
97
|
+
if not snapshot_dir.exists():
|
|
98
|
+
return False
|
|
99
|
+
|
|
100
|
+
tar_path = snapshot_dir / "snapshot.tar.gz"
|
|
101
|
+
if not tar_path.exists():
|
|
102
|
+
return False
|
|
103
|
+
|
|
104
|
+
target_dir.mkdir(parents=True, exist_ok=True)
|
|
105
|
+
|
|
106
|
+
with tarfile.open(str(tar_path), "r:gz") as tar:
|
|
107
|
+
tar.extractall(target_dir)
|
|
108
|
+
|
|
109
|
+
return True
|
|
110
|
+
|
|
111
|
+
def list(self) -> list[SnapshotInfo]:
|
|
112
|
+
snapshots = []
|
|
113
|
+
for snapshot_dir in self.base_path.iterdir():
|
|
114
|
+
if not snapshot_dir.is_dir():
|
|
115
|
+
continue
|
|
116
|
+
manifest_path = snapshot_dir / "manifest.json"
|
|
117
|
+
if not manifest_path.exists():
|
|
118
|
+
continue
|
|
119
|
+
try:
|
|
120
|
+
manifest = json.loads(manifest_path.read_text(encoding="utf-8"))
|
|
121
|
+
snapshots.append(SnapshotInfo(
|
|
122
|
+
id=manifest["id"],
|
|
123
|
+
name=manifest["name"],
|
|
124
|
+
timestamp=manifest["timestamp"],
|
|
125
|
+
description=manifest.get("description", ""),
|
|
126
|
+
size_bytes=manifest.get("size_bytes", 0),
|
|
127
|
+
file_count=manifest.get("file_count", 0),
|
|
128
|
+
))
|
|
129
|
+
except Exception:
|
|
130
|
+
continue
|
|
131
|
+
return sorted(snapshots, key=lambda s: s.timestamp, reverse=True)
|
|
132
|
+
|
|
133
|
+
def delete(self, snapshot_id: str) -> bool:
|
|
134
|
+
snapshot_dir = self.base_path / snapshot_id
|
|
135
|
+
if snapshot_dir.exists():
|
|
136
|
+
shutil.rmtree(snapshot_dir)
|
|
137
|
+
return True
|
|
138
|
+
return False
|
|
139
|
+
|
|
140
|
+
def _should_exclude(self, name: str, patterns: list[str]) -> bool:
|
|
141
|
+
for pattern in patterns:
|
|
142
|
+
if fnmatch.fnmatch(name, pattern):
|
|
143
|
+
return True
|
|
144
|
+
return False
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
from onecode.agent.tools.file_ops import FileOps, ShellTool, ToolFactory
|
|
2
|
+
from onecode.agent.tools.protocol import ToolCall, ToolResult
|
|
3
|
+
from onecode.agent.tools.errors import ToolError, ToolInputError, ToolPermissionError, ToolExecutionError
|
|
4
|
+
from onecode.agent.tools.registry import Tool, ToolRegistry, ToolSpec
|
|
5
|
+
from onecode.agent.tools.permissions import ToolPermissionContext, PermissionResult
|
|
6
|
+
from onecode.agent.tools.permission_handler import InteractivePermissionHandler, PermissionDecision, PermissionHandler
|
|
7
|
+
from onecode.agent.tools.schema_validation import validate_json_schema
|
|
8
|
+
|
|
9
|
+
__all__ = [
|
|
10
|
+
"FileOps", "ShellTool", "ToolFactory",
|
|
11
|
+
"ToolCall", "ToolResult",
|
|
12
|
+
"ToolError", "ToolInputError", "ToolPermissionError", "ToolExecutionError",
|
|
13
|
+
"Tool", "ToolRegistry", "ToolSpec",
|
|
14
|
+
"ToolPermissionContext", "PermissionResult",
|
|
15
|
+
"InteractivePermissionHandler", "PermissionDecision", "PermissionHandler",
|
|
16
|
+
"validate_json_schema",
|
|
17
|
+
]
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|