bantamkit 0.29.1__tar.gz → 0.30.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.
- {bantamkit-0.29.1 → bantamkit-0.30.0}/PKG-INFO +1 -1
- bantamkit-0.30.0/_assets/tools/memory_dream.json +20 -0
- bantamkit-0.30.0/_assets/tools/repo_map.json +44 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/src/bantamkit/__init__.py +1 -1
- bantamkit-0.30.0/src/bantamkit/docmanifest.py +99 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/src/bantamkit/docread.py +334 -25
- {bantamkit-0.29.1 → bantamkit-0.30.0}/src/bantamkit/evalrun.py +17 -21
- {bantamkit-0.29.1 → bantamkit-0.30.0}/src/bantamkit/eventlog.py +5 -4
- {bantamkit-0.29.1 → bantamkit-0.30.0}/src/bantamkit/mcpserver.py +286 -26
- {bantamkit-0.29.1 → bantamkit-0.30.0}/src/bantamkit/memory/__init__.py +15 -1
- {bantamkit-0.29.1 → bantamkit-0.30.0}/src/bantamkit/memory/__main__.py +26 -1
- {bantamkit-0.29.1 → bantamkit-0.30.0}/src/bantamkit/memory/component.py +206 -4
- bantamkit-0.30.0/src/bantamkit/memory/dream.py +751 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/src/bantamkit/memory/store.py +161 -5
- bantamkit-0.30.0/src/bantamkit/repomap.py +1026 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/tests/data/served-tool-surface.json +68 -1
- {bantamkit-0.29.1 → bantamkit-0.30.0}/tests/test_bantamkit_read_tool.py +2 -0
- bantamkit-0.30.0/tests/test_conformance_suite_table_gate.py +124 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/tests/test_docread.py +9 -1
- bantamkit-0.30.0/tests/test_docread_ceilings.py +675 -0
- bantamkit-0.30.0/tests/test_document_manifest_parity.py +401 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/tests/test_eventlog.py +4 -2
- {bantamkit-0.29.1 → bantamkit-0.30.0}/tests/test_mcpserver.py +11 -5
- {bantamkit-0.29.1 → bantamkit-0.30.0}/tests/test_memory.py +453 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/tests/test_memory_compact_tool.py +3 -1
- {bantamkit-0.29.1 → bantamkit-0.30.0}/tests/test_memory_component.py +72 -1
- bantamkit-0.30.0/tests/test_memory_dream.py +875 -0
- bantamkit-0.30.0/tests/test_repo_map_tool.py +296 -0
- bantamkit-0.30.0/tests/test_repomap.py +649 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/tests/test_served_tool_count_records.py +153 -4
- {bantamkit-0.29.1 → bantamkit-0.30.0}/tests/test_skillaudit.py +6 -1
- {bantamkit-0.29.1 → bantamkit-0.30.0}/tests/test_status_surface.py +1 -1
- {bantamkit-0.29.1 → bantamkit-0.30.0}/tests/test_tool_manifest.py +2 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/.gitignore +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/README.md +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/_assets/contracts/default.yaml +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/_assets/evals/devteam/manifest.yaml +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/_assets/evals/devteam/repo/HISTORY.md +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/_assets/evals/devteam/repo/README.md +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/_assets/evals/devteam/repo/docs/architecture.md +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/_assets/evals/devteam/repo/docs/runbook.md +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/_assets/evals/devteam/repo/issues/142-settlement-timeout.md +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/_assets/evals/devteam/repo/patches/0009-retry-budget.patch +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/_assets/evals/devteam/repo/src/ledger/__init__.py +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/_assets/evals/devteam/repo/src/ledger/config.py +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/_assets/evals/devteam/repo/src/ledger/errors.py +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/_assets/evals/devteam/repo/src/ledger/posting.py +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/_assets/evals/devteam/repo/src/ledger/registry.py +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/_assets/evals/devteam/repo/src/ledger/report.py +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/_assets/evals/devteam/repo/src/ledger/retry.py +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/_assets/evals/devteam/repo/src/ledger/settle.py +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/_assets/evals/devteam/repo/src/ledger/validate.py +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/_assets/evals/devteam/repo/tests/test_posting.py +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/_assets/evals/devteam/repo/tests/test_settle.py +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/_assets/evals/devteam/tasks/dt-error-contract.yaml +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/_assets/evals/devteam/tasks/dt-handler-map.yaml +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/_assets/evals/devteam/tasks/dt-patch-before-after.yaml +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/_assets/evals/devteam/tasks/dt-retry-attempts.yaml +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/_assets/evals/devteam/tasks/dt-settlement-config.yaml +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/_assets/evals/devteam/tasks/dt-symbol-home.yaml +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/_assets/evals/devteam/tasks/dt-trace-blame.yaml +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/_assets/evals/devteam/tasks/dt-unread-key.yaml +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/_assets/evals/document/tasks/doc-large-in-137.yaml +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/_assets/evals/document/tasks/doc-large-in-359.yaml +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/_assets/evals/document/tasks/doc-large-in-372.yaml +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/_assets/evals/document/tasks/doc-large-out-11764.yaml +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/_assets/evals/document/tasks/doc-large-out-4137.yaml +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/_assets/evals/document/tasks/doc-large-out-8022.yaml +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/_assets/evals/document/tasks/doc-small-137.yaml +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/_assets/evals/document/tasks/doc-small-261.yaml +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/_assets/evals/document/tasks/doc-small-388.yaml +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/_assets/evals/fixtures/.gitkeep +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/_assets/evals/fixtures/catalog.json +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/_assets/evals/perturbations/task-completion.yaml +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/_assets/evals/tasks/.gitkeep +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/_assets/evals/tasks/extract-contact.yaml +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/_assets/evals/tasks/extract-invoice.yaml +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/_assets/evals/tasks/extract-order.yaml +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/_assets/evals/tasks/extract-schedule.yaml +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/_assets/evals/tasks/extract-versions.yaml +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/_assets/evals/tasks/nav-prod-port.yaml +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/_assets/evals/tasks/nav-release-bundle.yaml +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/_assets/evals/tasks/recall-audit-retention.yaml +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/_assets/evals/tasks/recall-cache-ttl.yaml +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/_assets/evals/tasks/recall-db-port.yaml +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/_assets/evals/tasks/recall-deploy.yaml +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/_assets/evals/tasks/recall-env-endpoint.yaml +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/_assets/evals/tasks/recall-oncall-rotation.yaml +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/_assets/evals/tasks/recall-oncall.yaml +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/_assets/evals/tasks/recall-org-quota.yaml +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/_assets/evals/tasks/recall-owner.yaml +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/_assets/evals/tasks/shop-basket-total.yaml +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/_assets/evals/tasks/shop-cheapest.yaml +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/_assets/evals/tasks/shop-compare.yaml +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/_assets/evals/tasks/shop-gadget-value.yaml +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/_assets/evals/tasks/shop-stock-total.yaml +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/_assets/evals/tasks/shop-total.yaml +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/_assets/profiles/default.yaml +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/_assets/profiles/patient.yaml +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/_assets/rubrics/.gitkeep +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/_assets/rubrics/code-quality.yaml +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/_assets/rubrics/grounded-completion.yaml +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/_assets/rubrics/task-completion.yaml +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/_assets/schemas/shiftwork-checkpoint.json +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/_assets/skills/.gitkeep +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/_assets/skills/file-graph.md +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/_assets/skills/memory.md +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/_assets/tools/.gitkeep +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/_assets/tools/bantamkit_read.json +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/_assets/tools/bantamkit_status.json +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/_assets/tools/build_identity.json +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/_assets/tools/document_list.json +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/_assets/tools/document_read.json +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/_assets/tools/file_graph.json +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/_assets/tools/memory_compact.json +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/_assets/tools/memory_recall.json +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/_assets/tools/memory_save.json +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/_assets/tools/shiftwork_clock_in.json +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/_assets/tools/shiftwork_clock_out.json +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/_assets/tools/shiftwork_status.json +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/_assets/tools/skill_audit.json +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/_assets/tools/validate_json.json +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/hatch_build.py +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/pyproject.toml +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/src/bantamkit/agent.py +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/src/bantamkit/assets.py +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/src/bantamkit/budget.py +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/src/bantamkit/client.py +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/src/bantamkit/contract.py +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/src/bantamkit/criticreplay.py +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/src/bantamkit/critique.py +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/src/bantamkit/filegraph.py +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/src/bantamkit/hostinstall.py +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/src/bantamkit/loopguard.py +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/src/bantamkit/mcpreport.py +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/src/bantamkit/memory/divergence.py +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/src/bantamkit/memory/layers.py +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/src/bantamkit/pdfread.py +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/src/bantamkit/profile.py +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/src/bantamkit/shiftwork.py +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/src/bantamkit/skillaudit.py +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/src/bantamkit/statusline.py +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/src/bantamkit/structured.py +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/src/bantamkit/textutil.py +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/tests/cli_exit_status_probe.py +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/tests/conftest.py +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/tests/data/docread/bad-crc.docx +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/tests/data/docread/charref-4301-digits.html +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/tests/data/docread/charset-table.json +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/tests/data/docread/compression-method-9.docx +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/tests/data/docread/corrupt-deflate.docx +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/tests/data/docread/encrypted-member.docx +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/tests/data/docread/encrypted-mimetype.odt +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/tests/data/docread/eszett-cell-ref.xlsx +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/tests/data/docread/internal-dtd-entity.docx +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/tests/data/docread/rfc2231-charset.eml +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/tests/data/docread/rfc822-nested-twice.eml +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/tests/data/docread/unicode-digit-shared-string.xlsx +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/tests/data/docread/x-uuencode.eml +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/tests/data/f8404ab-perturbation-baseline.json +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/tests/data/platform-assumption-baseline.json +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/tests/docread_fixtures.py +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/tests/perturbation_baseline_harness.py +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/tests/rbp16_effect_probe.py +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/tests/rbp18_payload_probe.py +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/tests/test_adapter.py +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/tests/test_agent.py +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/tests/test_amendguard.py +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/tests/test_budget.py +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/tests/test_build_identity.py +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/tests/test_client.py +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/tests/test_compaction_corpus_survey.py +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/tests/test_conformance.py +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/tests/test_contract_fanout.py +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/tests/test_criticreplay.py +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/tests/test_critique.py +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/tests/test_doc_commands_gate.py +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/tests/test_document_setup.py +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/tests/test_document_tasks.py +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/tests/test_document_tools.py +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/tests/test_encoding_gate.py +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/tests/test_evalrun.py +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/tests/test_field_program_gates.py +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/tests/test_field_programs.py +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/tests/test_filegraph.py +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/tests/test_hostinstall.py +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/tests/test_ladder_statistics.py +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/tests/test_launcher_which.py +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/tests/test_layers.py +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/tests/test_loopguard.py +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/tests/test_mcp_endpoint.py +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/tests/test_mcpdrift.py +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/tests/test_mcpreport.py +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/tests/test_memory_divergence.py +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/tests/test_memory_layers.py +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/tests/test_memory_store_tripwire.py +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/tests/test_mutmatrix.py +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/tests/test_newline_gate.py +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/tests/test_packaging.py +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/tests/test_pdfread.py +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/tests/test_pinharness_ledger.py +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/tests/test_platform_assumption_gate.py +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/tests/test_shiftwork.py +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/tests/test_statusline.py +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/tests/test_structured.py +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/tests/test_thread_exception_gate.py +0 -0
- {bantamkit-0.29.1 → bantamkit-0.30.0}/tests/test_version_agreement.py +0 -0
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "memory_dream",
|
|
3
|
+
"description": "Consolidate the memories the project layer and the machine-wide profile layer hold under the SAME NAME, and say exactly what changed. Byte-identical copies collapse to one; a pair that has diverged is UNIONED — every claim from both copies survives, never a winner-takes-all — and a relative date in a body is annotated with the day it resolves to against that fact's own mtime, never against today. The survivor stays in the writable project layer and the profile copy MOVES to that store's archive/: nothing is deleted and any consumed memory can be restored by name. This is a correctness pass, not a token saving: the profile index is derived at read time and is not loaded from a prompt, so consolidating it frees approximately no bytes — what it buys is one copy of a ruling instead of two that can disagree. It defaults to a DRY RUN because the profile store is machine-wide: a memory archived out of it stops answering for every other project on this machine that has no store of its own. Read the plan first, then call it again with dry_run false to apply it.",
|
|
4
|
+
"surfaces": ["mcp"],
|
|
5
|
+
"parameters": {
|
|
6
|
+
"type": "object",
|
|
7
|
+
"properties": {
|
|
8
|
+
"dry_run": {
|
|
9
|
+
"type": "boolean",
|
|
10
|
+
"description": "Preview only. True (the default) performs every read, merge and projection and writes nothing. Pass false to apply the plan."
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"output_schema": {
|
|
15
|
+
"properties": { "result": { "title": "Result", "type": "string" } },
|
|
16
|
+
"required": ["result"],
|
|
17
|
+
"type": "object",
|
|
18
|
+
"title": "memory_dreamOutput"
|
|
19
|
+
}
|
|
20
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "repo_map",
|
|
3
|
+
"description": "A ranked map of a source tree: every file's definitions, ordered by how central that file is to the files you name in `focus`, truncated to a byte budget. Call it when you are about to work on a file and want to know which OTHER files matter to it — the ports, the callers, the module it reaches through a private helper — rather than reading a directory listing and guessing. `focus` is the file or files you are editing, relative to `root` and POSIX-separated; they are excluded from the listing because you already have them open, and an empty focus gives plain centrality over the whole tree. This is a PRECISION pass and it is not a token saving: the gate this feature was supposed to clear was refuted by measurement — discovery is 0.114% of real prompt tokens, because 97.8% of the bill is cache_read — so a map does not make a session cheaper. What it buys is the right file found sooner. Nothing the scanner cannot read is dropped silently: every unread file resolves into a named omission (unknown-language, unreadable-bytes, size-cap, no-definitions, unreachable, per-file-cap, budget) counted in a footer that is NOT charged to the budget. The budget is UTF-8 BYTES of the listing, not tokens; there is no model tokenizer in either runtime and this tool will not pretend to one.",
|
|
4
|
+
"surfaces": [
|
|
5
|
+
"mcp"
|
|
6
|
+
],
|
|
7
|
+
"parameters": {
|
|
8
|
+
"type": "object",
|
|
9
|
+
"required": [
|
|
10
|
+
"root"
|
|
11
|
+
],
|
|
12
|
+
"properties": {
|
|
13
|
+
"root": {
|
|
14
|
+
"type": "string",
|
|
15
|
+
"description": "Directory to map, absolute or relative to the server's working directory"
|
|
16
|
+
},
|
|
17
|
+
"focus": {
|
|
18
|
+
"type": "array",
|
|
19
|
+
"items": {
|
|
20
|
+
"type": "string"
|
|
21
|
+
},
|
|
22
|
+
"description": "The files you are working on, relative to `root` and POSIX-separated. They are excluded from the listing. A name that is not a scanned source is ignored rather than refused."
|
|
23
|
+
},
|
|
24
|
+
"budget": {
|
|
25
|
+
"type": "integer",
|
|
26
|
+
"minimum": 0,
|
|
27
|
+
"description": "UTF-8 bytes of listing to render; default 4000. The omission footer is not charged against it."
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
"output_schema": {
|
|
32
|
+
"properties": {
|
|
33
|
+
"result": {
|
|
34
|
+
"title": "Result",
|
|
35
|
+
"type": "string"
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
"required": [
|
|
39
|
+
"result"
|
|
40
|
+
],
|
|
41
|
+
"type": "object",
|
|
42
|
+
"title": "repo_mapOutput"
|
|
43
|
+
}
|
|
44
|
+
}
|
|
@@ -29,4 +29,4 @@ from bantamkit.structured import StructuredOutputError, extract_json, structured
|
|
|
29
29
|
# file as its dynamic version source, so the wheel's metadata and the string the MCP
|
|
30
30
|
# server advertises are the same committed bytes, and neither is a function of when
|
|
31
31
|
# someone last ran `pip`.
|
|
32
|
-
__version__ = "0.
|
|
32
|
+
__version__ = "0.30.0"
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
"""One rendering of a `docread.Document` as a manifest — for every caller that has one.
|
|
2
|
+
|
|
3
|
+
Register entries (b) and (h), `docs/roadmap-toolbox.md` row 8. The entry dict
|
|
4
|
+
`{document, kind, index, part, row_count, rows, omissions}` that `contract.document_manifest`
|
|
5
|
+
takes was built by hand in `evalrun._document_tools` and again in `mcpserver.bantamkit_read`,
|
|
6
|
+
with no shared helper and no test that the two produced the same bytes for the same file. They
|
|
7
|
+
did not: the eval harness answered a zero-row part with `document_offset_past_end`, whose
|
|
8
|
+
sentence reads `numbered 0 to -1`, while the MCP server answered `"<part>" in <path> has no
|
|
9
|
+
rows`. One runtime disagreeing with itself about a file is not a two-runtime divergence and
|
|
10
|
+
costs no `docs/porting.md` row — it just had to stop.
|
|
11
|
+
|
|
12
|
+
**Why this is its own module and not a function on either caller.** `evalrun` is the
|
|
13
|
+
measurement harness and `mcpserver` is Layer 5; making either import the other to reach a
|
|
14
|
+
shared renderer would put the eval harness behind the MCP SDK's import, or the server behind
|
|
15
|
+
`yaml` and the whole eval config surface. `docread` itself is the other candidate and is the
|
|
16
|
+
better one on paper — but the entry dict is the *contract layer's* input shape, not the
|
|
17
|
+
reader's, and `docread` is deliberately ignorant of who renders it. So the adapter between the
|
|
18
|
+
two sits here: it imports `docread` for nothing at all (it reads attributes off whatever it is
|
|
19
|
+
handed) and `contract` for the sentences, which is the direction the layer rule allows.
|
|
20
|
+
|
|
21
|
+
The sentences are `contract`'s, with ONE exception this module inherited rather than chose:
|
|
22
|
+
`document_no_rows` builds its text here, exactly as `mcpserver` built it inline before. It is
|
|
23
|
+
not in `assets/contracts/default.yaml` beside every other model-facing sentence in this
|
|
24
|
+
repository, and the port spells it a third time in `runtime-ts/src/mcp/server.ts`. Moving it
|
|
25
|
+
into the contract asset is a two-runtime contract change and is registered, not done here.
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
from __future__ import annotations
|
|
29
|
+
|
|
30
|
+
from collections.abc import Iterable
|
|
31
|
+
from typing import Any
|
|
32
|
+
|
|
33
|
+
from bantamkit.contract import document_error, document_manifest
|
|
34
|
+
|
|
35
|
+
__all__ = [
|
|
36
|
+
"document_no_rows",
|
|
37
|
+
"manifest_entries",
|
|
38
|
+
"package_entries",
|
|
39
|
+
"render_manifest",
|
|
40
|
+
]
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def manifest_entries(document: str, doc: Any) -> list[dict]:
|
|
44
|
+
"""The PART-grain entries for one document, keyed by the label the caller uses.
|
|
45
|
+
|
|
46
|
+
`document` is the caller's name for the file — a path on the MCP surface, a fixture name
|
|
47
|
+
in the eval harness — and it is the only thing about this rendering that legitimately
|
|
48
|
+
differs between the two. Everything else is a fact about the bytes.
|
|
49
|
+
"""
|
|
50
|
+
return [
|
|
51
|
+
{
|
|
52
|
+
"document": document,
|
|
53
|
+
"kind": doc.kind,
|
|
54
|
+
"index": part.index,
|
|
55
|
+
"part": part.name,
|
|
56
|
+
"row_count": part.row_count,
|
|
57
|
+
"rows": part.rows,
|
|
58
|
+
"omissions": [o.as_dict() for o in part.omissions],
|
|
59
|
+
}
|
|
60
|
+
for part in doc.parts
|
|
61
|
+
]
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def package_entries(document: str, doc: Any) -> list[dict]:
|
|
65
|
+
"""The DOCUMENT-grain entries: what the container holds that belongs to no part.
|
|
66
|
+
|
|
67
|
+
Empty when the document has no such omissions, because `contract.document_manifest`
|
|
68
|
+
renders an entry without them byte-for-byte as it did before the disclosure existed —
|
|
69
|
+
which is what keeps the committed `document-read` rows where they are.
|
|
70
|
+
"""
|
|
71
|
+
if not doc.omissions:
|
|
72
|
+
return []
|
|
73
|
+
return [{"document": document, "omissions": [o.as_dict() for o in doc.omissions]}]
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def render_manifest(documents: Iterable[tuple[str, Any]]) -> str:
|
|
77
|
+
"""The manifest for one or many (label, `Document`) pairs, as one observation."""
|
|
78
|
+
parts: list[dict] = []
|
|
79
|
+
package: list[dict] = []
|
|
80
|
+
for document, doc in documents:
|
|
81
|
+
parts.extend(manifest_entries(document, doc))
|
|
82
|
+
package.extend(package_entries(document, doc))
|
|
83
|
+
return document_manifest(parts, package)
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
def document_no_rows(part: str, document: str) -> str:
|
|
87
|
+
"""The refusal for a part that has no rows at all — NOT an offset past the end.
|
|
88
|
+
|
|
89
|
+
`document_offset_past_end` over a zero-row part prints `numbered 0 to -1`, a range with
|
|
90
|
+
no members, and it says "offset N is past the end" about an offset of 0, which is not
|
|
91
|
+
past anything. No offset can be in range here, so the reply states that fact instead.
|
|
92
|
+
|
|
93
|
+
This exact string is pinned ON THE WIRE for both runtimes by
|
|
94
|
+
`tools/conformance/suites/wire.mjs` (`read: id 12`), which asserts it as a literal on each
|
|
95
|
+
side precisely so that both sides drifting back together would still fail. Changing it is
|
|
96
|
+
a two-runtime change plus that case; it is why this is the sentence that survived (b)/(h)
|
|
97
|
+
rather than the eval harness's.
|
|
98
|
+
"""
|
|
99
|
+
return document_error(f'"{part}" in {document} has no rows')
|