curu-memory 0.2.0__tar.gz → 0.4.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {curu_memory-0.2.0 → curu_memory-0.4.0}/CHANGELOG.md +23 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/PKG-INFO +96 -16
- {curu_memory-0.2.0 → curu_memory-0.4.0}/README.md +91 -12
- {curu_memory-0.2.0 → curu_memory-0.4.0}/pyproject.toml +12 -4
- curu_memory-0.4.0/src/curu_memory/__init__.py +68 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/src/curu_memory/__main__.py +37 -70
- {curu_memory-0.2.0 → curu_memory-0.4.0}/src/curu_memory/access.py +73 -1
- {curu_memory-0.2.0 → curu_memory-0.4.0}/src/curu_memory/auth.py +2 -1
- {curu_memory-0.2.0 → curu_memory-0.4.0}/src/curu_memory/config.py +2 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/src/curu_memory/embedders.py +16 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/src/curu_memory/errors.py +3 -18
- {curu_memory-0.2.0 → curu_memory-0.4.0}/src/curu_memory/indexing.py +67 -35
- curu_memory-0.4.0/src/curu_memory/library.py +205 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/src/curu_memory/okf.py +50 -1
- curu_memory-0.4.0/src/curu_memory/okf_v0_2/fixtures/expected.toml +57 -0
- curu_memory-0.4.0/src/curu_memory/okf_v0_2/fixtures/invalid/link-in-code.md +8 -0
- curu_memory-0.4.0/src/curu_memory/okf_v0_2/fixtures/invalid/no-closing-line.md +4 -0
- curu_memory-0.4.0/src/curu_memory/okf_v0_2/fixtures/invalid/not-a-mapping.md +5 -0
- curu_memory-0.4.0/src/curu_memory/okf_v0_2/fixtures/invalid/not-utf-8.md +4 -0
- curu_memory-0.4.0/src/curu_memory/okf_v0_2/fixtures/valid/all-fields.md +28 -0
- curu_memory-0.4.0/src/curu_memory/okf_v0_2/fixtures/valid/code-is-not-a-link.md +9 -0
- curu_memory-0.4.0/src/curu_memory/okf_v0_2/schema.json +56 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/src/curu_memory/server.py +27 -16
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/conftest.py +6 -2
- curu_memory-0.4.0/tests/contract/public_api.txt +26 -0
- curu_memory-0.4.0/tests/contract/test_okf_conformance.py +159 -0
- curu_memory-0.4.0/tests/contract/test_tool_schemas.py +222 -0
- curu_memory-0.4.0/tests/contract/tool_schemas.json +547 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/e2e/test_browser.py +4 -4
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/e2e/test_cli_index.py +3 -3
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/e2e/test_cli_search.py +3 -3
- curu_memory-0.4.0/tests/e2e/test_core_install.py +107 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/e2e/test_leak_paths.py +20 -0
- curu_memory-0.4.0/tests/e2e/test_library.py +182 -0
- curu_memory-0.4.0/tests/e2e/test_library_access.py +179 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/e2e/test_no_secrets.py +3 -3
- curu_memory-0.4.0/tests/fixtures/eval_corpus/README.md +21 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/fixtures/search_eval.toml +1 -1
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/integration/conftest.py +10 -10
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/unit/test_access.py +127 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/unit/test_embedder_http.py +12 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/unit/test_errors.py +10 -1
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/unit/test_index_determinism.py +2 -2
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/unit/test_indexing.py +6 -2
- curu_memory-0.4.0/tests/unit/test_okf.py +248 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/unit/test_okf_faults.py +3 -3
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/unit/test_packaging.py +27 -0
- curu_memory-0.4.0/tests/unit/test_public_api.py +58 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/unit/test_readme.py +42 -5
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/unit/test_search_eval.py +4 -4
- curu_memory-0.2.0/src/curu_memory/__init__.py +0 -3
- curu_memory-0.2.0/tests/fixtures/curu_concepts/README.md +0 -8
- curu_memory-0.2.0/tests/unit/test_okf.py +0 -119
- {curu_memory-0.2.0 → curu_memory-0.4.0}/.gitignore +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/LICENSE +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/src/curu_memory/audit.py +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/src/curu_memory/browser.py +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/src/curu_memory/media.py +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/src/curu_memory/oidc.py +0 -0
- {curu_memory-0.2.0/tests/fixtures/bad_corpus → curu_memory-0.4.0/src/curu_memory/okf_v0_2/fixtures/invalid}/bad-yaml.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/bad_corpus → curu_memory-0.4.0/src/curu_memory/okf_v0_2/fixtures/invalid}/dup/same-name.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/bad_corpus → curu_memory-0.4.0/src/curu_memory/okf_v0_2/fixtures/invalid}/link-no-kind.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/bad_corpus → curu_memory-0.4.0/src/curu_memory/okf_v0_2/fixtures/invalid}/link-unknown-kind.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/bad_corpus → curu_memory-0.4.0/src/curu_memory/okf_v0_2/fixtures/invalid}/no-description.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/bad_corpus → curu_memory-0.4.0/src/curu_memory/okf_v0_2/fixtures/invalid}/no-front-matter.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/bad_corpus → curu_memory-0.4.0/src/curu_memory/okf_v0_2/fixtures/invalid}/same-name.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/bad_corpus → curu_memory-0.4.0/src/curu_memory/okf_v0_2/fixtures/invalid}/wiki-link.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/bad_corpus → curu_memory-0.4.0/src/curu_memory/okf_v0_2/fixtures/valid}/valid.md +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/src/curu_memory/ports.py +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/src/curu_memory/render.py +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/src/curu_memory/retrieval.py +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/src/curu_memory/store_sqlite.py +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/__init__.py +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/contract/__init__.py +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/contract/test_index_store.py +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/contract/test_store_spaces.py +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/e2e/__init__.py +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/e2e/test_browser_media.py +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/e2e/test_cli_access.py +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/e2e/test_cli_browse.py +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/e2e/test_concept_tools.py +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/e2e/test_http_agents.py +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/e2e/test_http_oidc.py +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/e2e/test_search_by_media_tool.py +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/e2e/test_search_tool.py +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/e2e/test_stdio_process.py +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/e2e/test_transports.py +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/fixtures/audio/1272-128104-0008.flac +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/fixtures/audio/1272-128104-0010.flac +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/fixtures/audio/1272-135031-0003.flac +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/fixtures/audio/1272-135031-0004.flac +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/fixtures/audio/1272-135031-0015.flac +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/fixtures/audio/1272-135031-0023.flac +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/fixtures/audio/README.md +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/fixtures/audio/query-1272-128104-0008.mp3 +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/fixtures/audio/query-1272-128104-0010.mp3 +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/fixtures/audio/query-1272-135031-0003.mp3 +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/fixtures/audio/query-1272-135031-0004.mp3 +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/fixtures/audio/query-1272-135031-0015.mp3 +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/fixtures/audio/query-1272-135031-0023.mp3 +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/fixtures/audio/tiny.flac +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/fixtures/audio/tiny.mp3 +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/fixtures/audio/tiny.ogg +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/fixtures/audio/tiny.wav +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/fixtures/audio_eval.toml +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/a-calibration-delta-without-its-coverage-is-a-claim-the-reader-cannot-audit.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/a-calibration-run-scored-an-embellished-phrase-a-template-header-and-numbered-criteria.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/a-check-nobody-has-executed-is-not-a-check-that-works.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/a-cold-load-cut-by-the-proxy-keeps-loading-behind-the-auth-gate-and-api-ps-cannot-say-otherwise.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/a-crop-check-that-reports-the-subject-absent-caps-nothing-when-the-box-is-grounded.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/a-declared-manifest-filename-nothing-checks-is-a-rented-pod.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/a-declared-pin-is-not-applied-until-something-converges-to-it.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/a-documented-procedure-is-a-capability-that-does-not-exist.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/a-dropped-connection-is-not-an-answer-so-it-is-not-a-permanent-failure.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/a-grounded-box-off-its-subject-is-the-models-aim-not-the-coordinate-mapping.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/a-grounding-question-that-states-the-place-gets-the-place-back.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/a-hermetic-test-that-races-the-machine-decides-nothing.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/a-hermetic-tests-isolation-stops-at-the-process-boundary.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/a-holder-that-cannot-serve-is-not-a-holder.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/a-keep-set-derived-by-its-own-rule-deletes-the-file-it-meant-to-keep.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/a-manifest-family-name-is-not-an-atom-family-name.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/a-pairwise-judge-is-qualified-against-human-labels-in-both-orders-before-a-campaign-trusts-it.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/a-pod-curu-can-name-is-terminated-by-id-not-found-by-listing.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/a-pod-that-outlives-its-process-needs-a-third-word-for-who-owns-it.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/a-positive-control-that-passes-is-not-evidence-the-judge-can-finish-the-run.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/a-pull-request-body-closes-an-issue-you-only-meant-to-name.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/a-reasoning-phase-is-charged-to-the-same-output-budget-so-an-empty-answer-is-a-budget-symptom.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/a-record-that-names-a-cause-its-own-evidence-contradicts.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/a-repair-of-a-run-whose-pod-is-gone-rents-its-family-like-generate.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/a-reporting-path-is-handed-liveness-never-left-to-infer-it.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/a-requirement-that-says-explicit-can-ship-inferred-and-pass-every-test.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/a-research-conclusion-is-a-record-checked-against-the-trace-not-prose.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/a-role-binds-when-its-work-runs-not-when-the-plane-is-built.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/a-role-model-still-arriving-is-not-a-model-that-is-unavailable.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/a-rubric-scored-one-image-at-a-time-saturates-so-compare-pairs-blind-in-both-orders.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/a-rule-stated-twice-is-a-rule-that-will-disagree.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/a-run-journal-is-a-projection-of-one-file-per-run.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/a-run-time-union-is-invisible-to-every-resolver-that-does-not-consult-it.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/a-runpod-volume-reports-the-cluster-not-the-volume.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/a-scene-is-not-a-controlled-base-until-its-rubric-and-prompt-are-shared.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/a-second-entrypoint-does-not-inherit-a-fix-and-nothing-says-so.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/a-specialist-model-that-falls-back-to-the-workstation-is-not-slow-it-is-unusable.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/a-structural-usability-criterion-cannot-tell-whether-a-model-looked-at-the-image.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/a-subgraph-hides-the-nodes-a-workflow-really-needs.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/a-substring-substantiation-check-cannot-tell-a-quote-from-an-echo.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/a-usable-rate-collapses-silent-vacuity-with-loud-constraint-violation.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/a-word-from-the-prose-is-not-a-value-in-the-enum.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/a-worktree-venv-repoint-hijacks-the-main-checkouts-editable-install.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/adr-061s-family-gate-covers-only-the-curated-topology-path.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/after-provisioning-a-run-is-unreported-not-unbounded.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/an-api-workflow-does-not-announce-itself-in-its-name.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/an-atom-without-a-manifest-is-a-family-that-can-be-chosen-and-never-served.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/an-empty-artefact-can-be-an-answer-not-a-gap-to-fill.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/an-idle-parent-is-not-a-stalled-run.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/an-index-pass-must-record-and-verify-the-revision-it-read.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/an-interrupted-ollama-pull-resumes-so-a-stalled-transfer-is-worth-retrying.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/an-unreachable-backend-is-not-an-empty-one-so-preflight-before-reading-inventory.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/analyse-intent-context-window-gap.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/analyse-intent-failure-observability-gap.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/anatomy-crop-exemplars-are-operator-labelled-balanced-and-never-the-image-checked.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/anima-qwen-image.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/anna-frozen.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/architecture-family-recognition-is-filename-pattern-only.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/artifact-presence-confidence-is-not-real-calibration.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/artifact-presence-style-classification-prestep-dead-end.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/artifact-presence-stylization-wording-dead-end.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/bounding-a-comfyui-generation-on-silence-not-on-elapsed-time.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/cheap-deterministic-gate-shipped-inert.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/checkpoint-larger-than-vram-degrades-not-fails.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/chroma.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/comfyui-rescans-model-directories-by-mtime.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/comfyui-textgen-node.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/comfyui-upgrade-reaches-latest-not-a-named-version.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/comfyui-workflow-templates-catalogue.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/components/ae-vae.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/components/anima-turbo-checkpoint.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/components/anima-turbo-lora.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/components/chroma-hyper-flash-turbo.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/components/chroma1-hd-fp8mixed.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/components/clip-g-hidream.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/components/clip-l-hidream.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/components/flux2-dev-fp8mixed.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/components/flux2-vae.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/components/gemma-2-2b-fp16.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/components/gemma-3-12b-it-fp4-mixed.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/components/hidream-ae-vae.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/components/hidream-i1-dev-bf16.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/components/hunyuan-image-2.1-vae-fp16.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/components/hunyuanimage2.1-bf16.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/components/krea2-turbo-checkpoint.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/components/krea2-turbo-lora-rank64.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/components/krea2-turbo-projector-lora.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/components/llama-3.1-8b-instruct-fp8-scaled.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/components/ltx23-distilled-lora.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/components/mistral-3-small-flux2-fp8.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/components/omnigen2-fp16.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/components/qwen-2.5-vl-7b-fp8-scaled.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/components/qwen-2.5-vl-7b.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/components/qwen-2.5-vl-fp16.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/components/qwen-3-06b-base.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/components/qwen-3-4b.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/components/qwen-3-8b-fp8mixed.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/components/qwen-image-fp8-e4m3fn.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/components/qwen-image-vae.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/components/qwen3vl-4b-fp8-scaled.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/components/t5xxl-fp8-e4m3fn-scaled.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/components/umt5-xxl-fp8-e4m3fn-scaled.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/components/wan22-a14b-moe-high-noise-diffusion-model.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/components/wan22-a14b-moe-low-noise-diffusion-model.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/components/wan22-lightx2v-high-noise-lora.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/components/wan22-lightx2v-low-noise-lora.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/components/wan22-ti2v-5b-diffusion-model.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/components/wan22-vae-dual-expert.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/components/wan22-vae-unified.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/components/z-image-turbo-bf16.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/configured-versus-provisioned-model-cross-check.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/content-frame-fraction-low-key-investigation.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/corpus-replay-artifact-presence-yield.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/could-not-do-it-and-nothing-to-do-returned-the-same-value.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/decompose-shots-native-transport-gap.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/deterministic-gate-opacity-and-best-attempt-selection-bug.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/dry-run-provisioning-claims-come-from-the-live-path.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/eager-role-model-resolution-rents-a-pod-before-any-backend-exists.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/fft-psd-periodicity-halftone-detector-dead-end.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/first-last-frame-video-conditioning.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/flux-klein.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/flux2.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/giving-a-rented-pod-back-is-defence-in-depth.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/graph-prompt-refiner-content-fidelity-gap.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/hidream.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/hpsv3-is-an-uncalibrated-second-preference-instrument.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/hunyuan-image.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/illustrious.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/installed-from-a-working-copy-drifts-from-its-source.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/karras-and-exponential-ignore-flux2s-shift-so-flux2-declares-its-known-good-schedulers.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/knowledge-is-three-file-tiers-and-the-database-is-only-their-projection.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/krea2.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/ltx2-3.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/lumina2.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/manifest-tables-must-be-read-through-the-include-chain.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/minimax-h3.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/omnigen2.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/one-backend-per-selection-is-not-one-per-run-so-nothing-stopped-a-second-comfyui-backend.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/pinning-the-base-image-does-not-pin-what-the-build-installs.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/pixel-quality-gate-content-class-generalization.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/pod-volume-must-be-sized-against-the-inherited-llm-set.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/ponyxl.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/prompt-refiner-draft-quality-gap.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/prompt-refiner-loop-convergence-gap.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/provision-model-civitai-multi-file-version-silent-wrong-pick.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/quantised-embedding-serving-llama-server.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/qwen-image.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/rank-fusion-starves-the-single-best-answer.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/reported-success-beside-real-failure.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/revision-seed-patch-mechanism.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/rife-frame-interpolation.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/runpod-comfyui-image-missing-zstd-breaks-ollama-install.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/sam3-multi-entity-disambiguation-limit.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/sam3-text-grounding-is-the-primary-grounder-the-vlm-its-fallback.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/saracen9-style-classification-gate-positive-signal.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/sddb-benchmark-campaign.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/sddb-video-benchmark-fixtures.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/seedvr2-rife-combined-pipeline.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/seedvr2-upscale.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/shared-gpu-ollama-comfyui-memory-contention.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/small-decision-encoders-do-not-replace-curus-llm-judgement-calls.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/some-models-ship-thinking-as-a-separate-tag-so-think-false-cannot-switch-it-off.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/streaming-does-not-cover-the-wait-for-the-first-byte-and-the-runpod-proxy-cuts-it-at-100s.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/streaming-ollama-pull-through-runpod-proxy-and-auth-gate.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/structured-output-field-order-required-fields-affect-decoding-quality.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/style-aware-artifact-gate-shipped-inert.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/testcontainers-ephemeral-port-forwarding-failure-mimics-a-red-suite.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/the-embedder-that-served-a-command-is-not-the-placement-its-config-names.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/the-glimmer-judge-answered-each-pair-with-one-position-in-both-orders.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/the-log-that-settles-a-wedge-was-truncated-by-the-next-start.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/the-second-sigterm-is-the-window-the-first-one-opened.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/the-three-saracen9-models-are-two-27b-siblings-and-a-9b.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/the-vlm-branch-measured-capture-provenance-where-the-cheap-gate-measured-style.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/timeout-discards-the-only-evidence-there-is.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/two-files-can-claim-one-atom-pairing-filename.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/two-seed-unanimity-is-not-evidence-and-more-seeds-make-it-credit-less.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/video-frame-defect-gate-fresh-generation-stress-test.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/wan22-5b.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/wan22-a14b-moe.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/wd14-tagging-structural-malformation-discrimination.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/whole-corpus-reconciliation-is-incoherent-under-concurrency.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/workflow-planner-emitted-no-patches-because-the-field-was-optional.md +0 -0
- {curu_memory-0.2.0/tests/fixtures/curu_concepts → curu_memory-0.4.0/tests/fixtures/eval_corpus}/z-image.md +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/fixtures/image_eval.toml +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/fixtures/images/blue-circle.png +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/fixtures/images/checkerboard.png +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/fixtures/images/green-triangle.png +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/fixtures/images/not-an-image.png +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/fixtures/images/query-blue-circle.png +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/fixtures/images/query-checkerboard.png +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/fixtures/images/query-green-triangle.png +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/fixtures/images/query-rainbow-stripes.png +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/fixtures/images/query-red-square.png +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/fixtures/images/query-sunset.png +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/fixtures/images/rainbow-stripes.png +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/fixtures/images/red-square.png +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/fixtures/images/sunset.png +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/fixtures/images/tiny.jpg +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/fixtures/images/tiny.png +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/fixtures/images/tiny.webp +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/fixtures/meaning_eval.toml +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/fixtures/small_corpus/.obsidian/workspace.md +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/fixtures/small_corpus/README.md +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/fixtures/small_corpus/alpha-family.md +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/fixtures/small_corpus/alpha-turbo.md +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/fixtures/small_corpus/cfg-finding.md +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/fixtures/small_corpus/components/alpha-vae.md +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/fixtures/small_corpus/sdxl_base_1.0.md +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/fixtures/video/README.md +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/fixtures/video/blue-circle-grows.mp4 +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/fixtures/video/checkerboard-flashes.mp4 +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/fixtures/video/green-triangle-turns.mp4 +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/fixtures/video/query-blue-circle-grows.webm +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/fixtures/video/query-checkerboard-flashes.webm +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/fixtures/video/query-green-triangle-turns.webm +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/fixtures/video/query-rainbow-scrolls.webm +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/fixtures/video/query-red-square-moves.webm +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/fixtures/video/query-sun-sets.webm +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/fixtures/video/rainbow-scrolls.mp4 +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/fixtures/video/red-square-moves.mp4 +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/fixtures/video/sun-sets.mp4 +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/fixtures/video/tiny.mkv +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/fixtures/video/tiny.mov +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/fixtures/video/tiny.mp4 +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/fixtures/video/tiny.webm +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/fixtures/video_eval.toml +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/integration/__init__.py +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/integration/test_audio_limit.py +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/integration/test_audio_query_limit.py +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/integration/test_image_limit.py +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/integration/test_image_query_limit.py +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/integration/test_rauthy.py +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/integration/test_real_embedder.py +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/integration/test_similarity_limit.py +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/integration/test_video_limit.py +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/integration/test_video_query_limit.py +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/support/__init__.py +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/support/fake_issuer.py +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/support/http_server.py +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/unit/__init__.py +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/unit/test_adr_019.py +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/unit/test_audit.py +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/unit/test_auth.py +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/unit/test_cli_help.py +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/unit/test_config.py +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/unit/test_embedders.py +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/unit/test_fusion.py +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/unit/test_indexing_images.py +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/unit/test_media.py +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/unit/test_oidc.py +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/unit/test_prompts.py +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/unit/test_release_check.py +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/unit/test_render.py +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/unit/test_retrieval.py +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/unit/test_spaces.py +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/unit/test_store_threads.py +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/unit/test_store_v1.py +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/unit/test_units.py +0 -0
- {curu_memory-0.2.0 → curu_memory-0.4.0}/tests/unit/test_workflows.py +0 -0
|
@@ -4,6 +4,29 @@ All notable changes to this project are in this file. The format follows [Keep a
|
|
|
4
4
|
|
|
5
5
|
## [Unreleased]
|
|
6
6
|
|
|
7
|
+
## [0.4.0] - 2026-11-01
|
|
8
|
+
|
|
9
|
+
### Added
|
|
10
|
+
|
|
11
|
+
- `validate(path)` in `curu_memory.__all__`: the faults of a concept file or a directory, with the rules of the index command. Each `OkfFault` has `path`, `line` and `message`.
|
|
12
|
+
- `OKF_VERSION`, `LINK_KINDS` and `conformance_fixtures()` in `curu_memory.__all__`. The package ships `okf_v0_2/schema.json`, a JSON Schema of the front matter, and valid and invalid conformance fixtures with their expected faults.
|
|
13
|
+
- ADR-020: the copy of the curu concepts is a frozen evaluation corpus, not a reference of the format.
|
|
14
|
+
- `TOOL_SCHEMA_VERSION` in `curu_memory.__all__`: the version of the MCP tool schemas and the error codes. It is 1 for the tools of 0.3.0.
|
|
15
|
+
- `tests/contract/tool_schemas.json` and `tools/tool_schemas.py`. A test fails when a tool, a field or an error code changes and `TOOL_SCHEMA_VERSION` does not go up. A changed description needs no new version.
|
|
16
|
+
|
|
17
|
+
## [0.3.0] - 2026-11-01
|
|
18
|
+
|
|
19
|
+
### Added
|
|
20
|
+
|
|
21
|
+
- The public Python API in `curu_memory.__all__`: `build_space`, `open_knowledge` and `Knowledge`, with its result types and errors. `Knowledge.search`, `get_concept` and `neighbours` give the results of the matching tools.
|
|
22
|
+
- The library reads as one principal: a person, the agent of one grant, or nobody. It uses the rules of the server, and each refused read writes the same audit line.
|
|
23
|
+
- `tests/contract/public_api.txt`: a test fails when `__all__` changes and the snapshot does not.
|
|
24
|
+
|
|
25
|
+
### Changed
|
|
26
|
+
|
|
27
|
+
- **Breaking:** `mcp`, `starlette` and `uvicorn` moved to the `server` extra. `serve` and `browse` need `curu-memory[server]`. Without it, they stop with exit code 78 and name the extra. `index`, `search` and `access` need no extra.
|
|
28
|
+
- `tool_result_from` moved from `curu_memory.errors` to `curu_memory.server`, so the errors import no MCP package.
|
|
29
|
+
|
|
7
30
|
## [0.2.0] - 2026-11-01
|
|
8
31
|
|
|
9
32
|
This is the first release on PyPI. Version 0.1.0 was not published.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: curu-memory
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.4.0
|
|
4
4
|
Summary: A shared knowledge base and GraphRAG store for ComfyUI and generative media, served to agents over MCP.
|
|
5
5
|
Project-URL: Repository, https://github.com/darth-veitcher/curu-memory
|
|
6
6
|
Project-URL: Documentation, https://github.com/darth-veitcher/curu-memory#readme
|
|
@@ -10,11 +10,12 @@ License-File: LICENSE
|
|
|
10
10
|
Requires-Python: >=3.12
|
|
11
11
|
Requires-Dist: httpx2>=2.10
|
|
12
12
|
Requires-Dist: markdown-it-py>=4.0
|
|
13
|
-
Requires-Dist: mcp==2.3.0
|
|
14
13
|
Requires-Dist: pydantic>=2.12
|
|
15
14
|
Requires-Dist: pyyaml>=6.0
|
|
16
|
-
|
|
17
|
-
Requires-Dist:
|
|
15
|
+
Provides-Extra: server
|
|
16
|
+
Requires-Dist: mcp==2.3.0; extra == 'server'
|
|
17
|
+
Requires-Dist: starlette>=1.0; extra == 'server'
|
|
18
|
+
Requires-Dist: uvicorn>=0.31.1; extra == 'server'
|
|
18
19
|
Description-Content-Type: text/markdown
|
|
19
20
|
|
|
20
21
|
# curu-memory
|
|
@@ -28,6 +29,7 @@ curu-memory is a shared knowledge base for ComfyUI and generative media. It read
|
|
|
28
29
|
| Task | Command | Section |
|
|
29
30
|
|---|---|---|
|
|
30
31
|
| Write a concept for the index | Add `<name>.md` with front matter | [Write a concept file](#write-a-concept-file) |
|
|
32
|
+
| Check concept files before you index them | `curu_memory.validate("knowledge")` | [Check concept files](#check-concept-files) |
|
|
31
33
|
| Add images, audio and video to a concept | Add a `media:` list to the front matter | [Add media to a concept](#add-media-to-a-concept) |
|
|
32
34
|
| Build the index from your concept files | `curu-memory index --concepts ./knowledge` | [Index your knowledge](#index-your-knowledge) |
|
|
33
35
|
| Keep team notes and personal notes apart from the global knowledge | `curu-memory index --space personal/me` | [Keep team and personal knowledge apart](#keep-team-and-personal-knowledge-apart) |
|
|
@@ -42,24 +44,25 @@ curu-memory is a shared knowledge base for ComfyUI and generative media. It read
|
|
|
42
44
|
| Browse the knowledge in a web browser | `curu-memory browse` | [Browse the knowledge](#browse-the-knowledge) |
|
|
43
45
|
| Read a concept and its links | The `get_concept` and `concept_neighbours` tools | [Read a concept and follow its links](#read-a-concept-and-follow-its-links) |
|
|
44
46
|
| Find why a call failed | The `code` of the error | [Handle errors](#handle-errors) |
|
|
47
|
+
| Build and read the knowledge from a Python program | `curu_memory.open_knowledge()` | [Use curu-memory from Python](#use-curu-memory-from-python) |
|
|
45
48
|
|
|
46
49
|
## Install
|
|
47
50
|
|
|
48
51
|
You need Python 3.12 or later and [uv](https://docs.astral.sh/uv/).
|
|
49
52
|
|
|
50
53
|
```bash
|
|
51
|
-
uv tool install git+https://github.com/darth-veitcher/curu-memory
|
|
54
|
+
uv tool install "curu-memory[server] @ git+https://github.com/darth-veitcher/curu-memory"
|
|
52
55
|
```
|
|
53
56
|
|
|
54
|
-
This installs the `curu-memory` command.
|
|
57
|
+
This installs the `curu-memory` command with the `server` [extra](#glossary). `serve` and `browse` need the extra. Without it, `index`, `search` and `access` work, and `serve` and `browse` stop with exit code 78.
|
|
55
58
|
|
|
56
59
|
To install a release from PyPI, give a version range:
|
|
57
60
|
|
|
58
61
|
```bash
|
|
59
|
-
uv tool install "curu-memory>=0.
|
|
62
|
+
uv tool install "curu-memory[server]>=0.4,<0.5"
|
|
60
63
|
```
|
|
61
64
|
|
|
62
|
-
A program that uses curu-memory as a library pins
|
|
65
|
+
A program that uses curu-memory as a library pins a range in its `pyproject.toml`, with no extra. A new minor version can change the Python API or the MCP tools, so the range stops before the next minor version.
|
|
63
66
|
|
|
64
67
|
## Quickstart
|
|
65
68
|
|
|
@@ -119,6 +122,25 @@ A concept file is a Markdown file with YAML front matter between two `---` lines
|
|
|
119
122
|
- A link resolves by file name in all the subdirectories, so two concept files must not have the same name.
|
|
120
123
|
- Write each `##` heading for one topic. Search by meaning compares each section separately.
|
|
121
124
|
|
|
125
|
+
### Check concept files
|
|
126
|
+
|
|
127
|
+
Check a file or a directory before you index it. The check uses the rules of the index command, and it writes nothing.
|
|
128
|
+
|
|
129
|
+
```python
|
|
130
|
+
import curu_memory
|
|
131
|
+
|
|
132
|
+
for fault in curu_memory.validate("knowledge"):
|
|
133
|
+
print(fault.path, fault.line, fault.message)
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
- `validate` gives a list of [faults](#glossary). An empty list means that the index command indexes each file of the directory, unless an identifier is also in another space.
|
|
137
|
+
- `path` is relative to the directory that you give. For one file, it is the file name. `line` counts from the first `---` line, and it is None when the fault has no line. `message` is the reason that the index command reports.
|
|
138
|
+
- A warning of the index command is not a fault, for example a missing `type` or a link to a missing concept.
|
|
139
|
+
- A Markdown link in a code block still needs a link kind. A wiki-link `[[...]]` in code is text.
|
|
140
|
+
- `curu_memory.LINK_KINDS` holds the link kinds. `curu_memory.OKF_VERSION` is `0.2`, the version of the format.
|
|
141
|
+
- The package ships the format: `schema.json`, a JSON Schema of the front matter, and conformance fixtures. `curu_memory.conformance_fixtures()` gives the directory of the fixtures. Its parent directory holds `schema.json`.
|
|
142
|
+
- To test a parser in another language, give it each file of `valid/` and of `invalid/`. Compare its faults with `expected.toml`.
|
|
143
|
+
|
|
122
144
|
### Add media to a concept
|
|
123
145
|
|
|
124
146
|
Add example outputs, reference images, audio clips or videos to a concept with a `media` list. Each path is relative to the concept file:
|
|
@@ -587,11 +609,59 @@ The `curu-memory` command uses these exit codes:
|
|
|
587
609
|
| 0 | Success. |
|
|
588
610
|
| 1 | `index` skipped a file, the embedder failed, another index run held the lock, or the embedder model was not the model of another space. `search` found no index, or no readable space. `access` refused a change. |
|
|
589
611
|
| 2 | A usage error, for example `--limit 51`. |
|
|
590
|
-
| 78 | A configuration error, for example HTTP with no token. |
|
|
612
|
+
| 78 | A configuration error, for example HTTP with no token, or `serve` with no `server` extra. |
|
|
613
|
+
|
|
614
|
+
## Use curu-memory from Python
|
|
615
|
+
|
|
616
|
+
Use the library to build a space and to read it from a Python program, with no server. Import each name from `curu_memory` only. The names of `curu_memory.__all__` are the public API. Each other name can change in any release. The public API starts with version 0.3.0. `validate` and `TOOL_SCHEMA_VERSION` start with 0.4.0, so a program pins `curu-memory>=0.4,<0.5`.
|
|
617
|
+
|
|
618
|
+
```python
|
|
619
|
+
from pathlib import Path
|
|
620
|
+
|
|
621
|
+
import curu_memory
|
|
622
|
+
|
|
623
|
+
report = curu_memory.build_space(Path("knowledge"))
|
|
624
|
+
print(report.concepts_indexed, len(report.skipped))
|
|
625
|
+
|
|
626
|
+
knowledge = curu_memory.open_knowledge()
|
|
627
|
+
for hit in knowledge.search("VAE for WAN2.2 5B", limit=3).results:
|
|
628
|
+
print(hit.id, hit.space)
|
|
629
|
+
|
|
630
|
+
concept = knowledge.get_concept("wan22-5b-vae")
|
|
631
|
+
links = knowledge.neighbours(concept.id)
|
|
632
|
+
```
|
|
633
|
+
|
|
634
|
+
- `build_space` builds one space, as the index command does. `space=` names the space, and the default is `global`. A skipped file is not an error. The fields of the report are the values of [Index your knowledge](#index-your-knowledge), except `index`, for example `concepts_indexed`. `skipped` holds a (path, reason) pair for each skipped file.
|
|
635
|
+
- `open_knowledge` reads as one [principal](#glossary). Give `person="<handle>"` to read the spaces of that person. Give `grant=<id>` to read only the space of that grant. With neither, the library reads `global` only.
|
|
636
|
+
- An unknown, ended or revoked grant does not stop `open_knowledge`. Each read then raises `NoReadableSpace`. `serve --grant` stops at the start for such a grant.
|
|
637
|
+
- Each read gets the readable spaces again. A removed role or a revoked grant stops the next read.
|
|
638
|
+
- `search`, `get_concept` and `neighbours` give the same results as the tools `search_knowledge`, `get_concept` and `concept_neighbours`. Each hit gives its `space`.
|
|
639
|
+
- Each refused read writes the line in the audit log that the server writes, with the name of the matching tool as the action.
|
|
640
|
+
- `data_dir=` replaces the data directory. `env=` gives the `CURU_MEMORY_*` variables as a dictionary, for example the embedder settings of [Search by meaning](#search-by-meaning). With no `env`, the library reads the environment of the process.
|
|
641
|
+
- The library does not use `CURU_MEMORY_PRINCIPAL` to select the principal. A value that is not a valid handle raises `ConfigError`.
|
|
642
|
+
- The principal is not a security boundary in one process. The boundary is who can read the data directory.
|
|
643
|
+
|
|
644
|
+
Each error is in `curu_memory`:
|
|
645
|
+
|
|
646
|
+
| Call | Cause | Error |
|
|
647
|
+
|---|---|---|
|
|
648
|
+
| `build_space` | The concept directory does not exist, or the space name is not valid. `details.field` names the argument. | `InvalidArgument` |
|
|
649
|
+
| `build_space` | Another index run holds the lock. | `IndexLocked` |
|
|
650
|
+
| `build_space` | The embedder model is not the model of another space. | `IndexRefused` |
|
|
651
|
+
| `build_space` | The embedder failed. The old index stays. | `EmbedderFailed` |
|
|
652
|
+
| `build_space`, `open_knowledge` | A `CURU_MEMORY_*` variable is not valid. | `ConfigError` |
|
|
653
|
+
| `validate` | The path does not exist. `details.field` is `path`. | `InvalidArgument` |
|
|
654
|
+
| `open_knowledge` | No person has the handle, or `person` and `grant` are both given. | `InvalidArgument` |
|
|
655
|
+
| each read | The principal can read no space. | `NoReadableSpace` |
|
|
656
|
+
| `get_concept`, `neighbours` | No readable space holds the concept. | `ConceptNotFound` |
|
|
657
|
+
| `search` | The question is empty or too long, or the limit is not from 1 to 50. | `InvalidArgument` |
|
|
658
|
+
| each read | No readable space has an index. | `IndexMissing` |
|
|
659
|
+
|
|
660
|
+
Each error except `IndexLocked` and `ConfigError` is a `CuruMemoryError`. Its `code` is the code that a tool gives, for example `concept_not_found`.
|
|
591
661
|
|
|
592
662
|
## Limits
|
|
593
663
|
|
|
594
|
-
- On stdio, in the browser and with the static token, one process reads as one person (`CURU_MEMORY_PRINCIPAL`). On stdio, `serve --grant` makes the process read as the agent of one grant. Only the OIDC mode of HTTP gives each request its own person or agent.
|
|
664
|
+
- On stdio, in the browser and with the static token, one process reads as one person (`CURU_MEMORY_PRINCIPAL`). In Python, each `Knowledge` reads as the principal of its `open_knowledge`. On stdio, `serve --grant` makes the process read as the agent of one grant. Only the OIDC mode of HTTP gives each request its own person or agent.
|
|
595
665
|
- There is no encryption at rest yet.
|
|
596
666
|
- The browser has no OIDC login.
|
|
597
667
|
- Agents and persons cannot write knowledge through curu-memory yet. Edit the concept files, then run the index command.
|
|
@@ -609,7 +679,8 @@ The `curu-memory` command uses these exit codes:
|
|
|
609
679
|
- A match between a question in words and a clip needs 0.68 or more with EmbeddingGemma 2. The limit comes from speech clips. Speech test clips scored from 0.73 with their own questions. Wrong clips and unrelated questions reached 0.64. Music and sound effects can score lower.
|
|
610
680
|
- The index holds a copy of each media file. One hundred files of 2 MB make the index about 200 MB larger.
|
|
611
681
|
- There is no file watcher. Run the index command after each change.
|
|
612
|
-
-
|
|
682
|
+
- `validate` does not read the index, so it does not find an identifier that is also in another space. For one file, it does not find a duplicate identifier.
|
|
683
|
+
- The Python API cannot search with media, and it cannot write a concept. Use `curu-memory search --media` or the tool `search_knowledge_by_media` for media.
|
|
613
684
|
|
|
614
685
|
## Technical notes
|
|
615
686
|
|
|
@@ -625,10 +696,13 @@ The `curu-memory` command uses these exit codes:
|
|
|
625
696
|
- The plan for keys and encryption of private knowledge is [ADR-002](project-management/ADRs/ADR-002-server-held-envelope-keys.md).
|
|
626
697
|
- The word match uses SQLite FTS5 (the full-text search of SQLite) with the `unicode61` tokenizer (the rule that splits a text into words). The tokenizer keeps `.`, `_` and `-` in a word. A word of three or more characters also matches as a prefix.
|
|
627
698
|
- Search fuses the two rankings with reciprocal rank fusion, with k = 60. The lower of the two values counts one tenth. So ten rivals that are a little worse in both rankings do not push out the best answer of one ranking. See [ADR-006](project-management/ADRs/ADR-006-damped-rank-fusion.md). The identifier breaks a tie, so the order is stable.
|
|
628
|
-
- The concept rules are the same as the rules of the curu index, so each curu concept file indexes here.
|
|
699
|
+
- The concept rules are the same as the rules of the curu index, so each curu concept file indexes here. The index command and `validate` use one implementation of them. The schema and the fixtures are in `src/curu_memory/okf_v0_2/`. See [specs/017-the-okf-v0-2-schema/contracts/okf.md](specs/017-the-okf-v0-2-schema/contracts/okf.md). The copy of the curu concepts in `tests/fixtures/eval_corpus/` is a frozen evaluation corpus, not a reference of the format. See [ADR-020](project-management/ADRs/ADR-020-a-frozen-evaluation-corpus.md).
|
|
629
700
|
- The tool contracts are in [specs/001-okf-index-mcp-search/contracts/](specs/001-okf-index-mcp-search/contracts/).
|
|
630
701
|
- curu-memory uses the official MCP Python SDK. It never loads model weights.
|
|
631
|
-
- curu uses curu-memory as a library, and the version range of a release follows a version policy. See [ADR-019](project-management/ADRs/ADR-019-curu-uses-curu-memory-as-a-library.md).
|
|
702
|
+
- curu uses curu-memory as a library, and the version range of a release follows a version policy. See [ADR-019](project-management/ADRs/ADR-019-curu-uses-curu-memory-as-a-library.md). `tests/contract/public_api.txt` holds the names of `curu_memory.__all__`. The contract is [specs/015-the-public-library-api/contracts/public-api.md](specs/015-the-public-library-api/contracts/public-api.md).
|
|
703
|
+
- The core install has `pydantic`, `httpx2`, `markdown-it-py` and `pyyaml`. The `server` extra adds `mcp`, `starlette` and `uvicorn`.
|
|
704
|
+
- `curu_memory.TOOL_SCHEMA_VERSION` is the version of the MCP tool schemas and the error codes. The value is 1 for the tools of 0.3.0. It goes up by 1 in each pull request that changes a tool, a field or an error code. A change of a description or a title does not change it. It is not the package version.
|
|
705
|
+
- A Python program that imports `curu_memory` can compare `TOOL_SCHEMA_VERSION` with the version that it expects. A different value means that a tool, a field or an error code is different. The MCP server does not send the value. `tests/contract/tool_schemas.json` holds the schemas of the current version.
|
|
632
706
|
|
|
633
707
|
## Develop
|
|
634
708
|
|
|
@@ -639,7 +713,7 @@ uv sync
|
|
|
639
713
|
uv run pytest
|
|
640
714
|
```
|
|
641
715
|
|
|
642
|
-
The default tests need no network, no GPU and no model. They use a fake embedder and a copy of
|
|
716
|
+
`uv sync` installs the `server` extra, because the development group names it. The default tests need no network, no GPU and no model. They use a fake embedder and the frozen evaluation corpus in `tests/fixtures/eval_corpus/`, a copy of 183 curu concept files. The corpus is for the search measurements only. The shipped fixtures are the reference of the format. The tests with a real embedder have the `integration` marker. With no GPU embedder server, start the [development embedder](#glossary) first, as [tools/embedder_server/README.md](tools/embedder_server/README.md) says. Then run:
|
|
643
717
|
|
|
644
718
|
```bash
|
|
645
719
|
CURU_MEMORY_EMBEDDER_URL=http://127.0.0.1:30000 CURU_MEMORY_EMBEDDER_TIMEOUT=300 uv run pytest -m integration
|
|
@@ -673,10 +747,15 @@ The CI runs the same gates on each pull request and on each push to `main`. A re
|
|
|
673
747
|
- **Data URI**: a text that holds the bytes of a file in base64, with their MIME type, for example `data:image/png;base64,...`.
|
|
674
748
|
- **Data directory**: the directory of the index, the embedding cache, the access store `access.sqlite` and the audit log `audit.jsonl`. The default is `~/.local/share/curu-memory`, or `$XDG_DATA_HOME/curu-memory`. `CURU_MEMORY_DATA_DIR` changes it.
|
|
675
749
|
- **Development embedder**: the CPU server in `tools/embedder_server/` that serves EmbeddingGemma 2 for the integration tier.
|
|
750
|
+
- **Conformance fixtures**: the valid and invalid concept files that the package ships, with the expected faults in `expected.toml`.
|
|
751
|
+
- **Evaluation corpus**: the frozen copy of 183 curu concept files in `tests/fixtures/eval_corpus/`, for the search measurements.
|
|
752
|
+
- **Extra**: a named set of optional packages of a Python package, for example `server` in `curu-memory[server]`.
|
|
676
753
|
- **Embedder**: a server that changes a text, an image, a clip or a video into an embedding.
|
|
677
754
|
- **Embedding**: a list of numbers that holds the meaning of a text, an image, a clip or a video. Items with a near meaning have near embeddings.
|
|
755
|
+
- **Fault**: one problem that makes the index command skip a concept file. `validate` gives each fault with its `path`, `line` and `message`.
|
|
678
756
|
- **GraphRAG**: retrieval that uses a search and the links between concepts to give an agent its context.
|
|
679
757
|
- **Index**: the searchable copy of the concept files that the index command makes.
|
|
758
|
+
- **JSON Schema**: a standard JSON document that gives the fields and the types of a JSON or YAML value.
|
|
680
759
|
- **Link kind**: the type of a link between two concepts, for example `USES_COMPONENT`.
|
|
681
760
|
- **MCP**: the Model Context Protocol, which lets an agent find and call tools.
|
|
682
761
|
- **Minor version**: the second number of `X.Y.Z`. Below 1.0, a new minor version can remove or change a name or a tool field.
|
|
@@ -687,14 +766,15 @@ The CI runs the same gates on each pull request and on each push to `main`. A re
|
|
|
687
766
|
- **Task prompt**: a fixed text that curu-memory puts around a question or a section before it sends the text to the embedder.
|
|
688
767
|
- **Stdio**: the standard input and output of a process. A local MCP client talks to the server through them.
|
|
689
768
|
- **Streamable HTTP**: the MCP transport over HTTP, for remote agents.
|
|
769
|
+
- **Wiki-link**: a link of the form `[[name]]`. OKF does not accept it outside code.
|
|
690
770
|
- **Web browser**: the program that shows web pages, for example Firefox.
|
|
691
771
|
- **SHA-256**: a hash of 64 hexadecimal characters that the bytes of a file give. Different bytes give a different SHA-256.
|
|
692
772
|
- **Unit**: one part of a concept that has its own embedding: the summary, the overview, a `##` section, an image, a clip or a video.
|
|
693
|
-
- **Version range**: the lowest version and the first version to exclude, for example `>=0.
|
|
773
|
+
- **Version range**: the lowest version and the first version to exclude, for example `>=0.4,<0.5`.
|
|
694
774
|
- **Space**: a part of the knowledge with its own index: `global`, `team/<slug>` or `personal/<handle>`. Each request reads only the spaces that its caller can read.
|
|
695
775
|
- **Team slug**: the short name of a team in a space name, for example `look` in `team/look`.
|
|
696
776
|
- **Instance owner**: a person with `admin` on `global` and on each team space. The first registered person is an instance owner.
|
|
697
|
-
- **Principal**: the person or the agent of a request
|
|
777
|
+
- **Principal**: the person or the agent of a request, or `anonymous` with no principal. It comes from `CURU_MEMORY_PRINCIPAL`, `serve --grant`, the OIDC token on HTTP or `open_knowledge`.
|
|
698
778
|
- **Operator**: the person who runs `curu-memory access` and `curu-memory index` on the computer of the server.
|
|
699
779
|
- **Access store**: `access.sqlite`, with the persons, the teams, the members, the agents and the grants.
|
|
700
780
|
- **Audit log**: `audit.jsonl`, with one line for each change of access, each refused read and each refused token.
|
|
@@ -9,6 +9,7 @@ curu-memory is a shared knowledge base for ComfyUI and generative media. It read
|
|
|
9
9
|
| Task | Command | Section |
|
|
10
10
|
|---|---|---|
|
|
11
11
|
| Write a concept for the index | Add `<name>.md` with front matter | [Write a concept file](#write-a-concept-file) |
|
|
12
|
+
| Check concept files before you index them | `curu_memory.validate("knowledge")` | [Check concept files](#check-concept-files) |
|
|
12
13
|
| Add images, audio and video to a concept | Add a `media:` list to the front matter | [Add media to a concept](#add-media-to-a-concept) |
|
|
13
14
|
| Build the index from your concept files | `curu-memory index --concepts ./knowledge` | [Index your knowledge](#index-your-knowledge) |
|
|
14
15
|
| Keep team notes and personal notes apart from the global knowledge | `curu-memory index --space personal/me` | [Keep team and personal knowledge apart](#keep-team-and-personal-knowledge-apart) |
|
|
@@ -23,24 +24,25 @@ curu-memory is a shared knowledge base for ComfyUI and generative media. It read
|
|
|
23
24
|
| Browse the knowledge in a web browser | `curu-memory browse` | [Browse the knowledge](#browse-the-knowledge) |
|
|
24
25
|
| Read a concept and its links | The `get_concept` and `concept_neighbours` tools | [Read a concept and follow its links](#read-a-concept-and-follow-its-links) |
|
|
25
26
|
| Find why a call failed | The `code` of the error | [Handle errors](#handle-errors) |
|
|
27
|
+
| Build and read the knowledge from a Python program | `curu_memory.open_knowledge()` | [Use curu-memory from Python](#use-curu-memory-from-python) |
|
|
26
28
|
|
|
27
29
|
## Install
|
|
28
30
|
|
|
29
31
|
You need Python 3.12 or later and [uv](https://docs.astral.sh/uv/).
|
|
30
32
|
|
|
31
33
|
```bash
|
|
32
|
-
uv tool install git+https://github.com/darth-veitcher/curu-memory
|
|
34
|
+
uv tool install "curu-memory[server] @ git+https://github.com/darth-veitcher/curu-memory"
|
|
33
35
|
```
|
|
34
36
|
|
|
35
|
-
This installs the `curu-memory` command.
|
|
37
|
+
This installs the `curu-memory` command with the `server` [extra](#glossary). `serve` and `browse` need the extra. Without it, `index`, `search` and `access` work, and `serve` and `browse` stop with exit code 78.
|
|
36
38
|
|
|
37
39
|
To install a release from PyPI, give a version range:
|
|
38
40
|
|
|
39
41
|
```bash
|
|
40
|
-
uv tool install "curu-memory>=0.
|
|
42
|
+
uv tool install "curu-memory[server]>=0.4,<0.5"
|
|
41
43
|
```
|
|
42
44
|
|
|
43
|
-
A program that uses curu-memory as a library pins
|
|
45
|
+
A program that uses curu-memory as a library pins a range in its `pyproject.toml`, with no extra. A new minor version can change the Python API or the MCP tools, so the range stops before the next minor version.
|
|
44
46
|
|
|
45
47
|
## Quickstart
|
|
46
48
|
|
|
@@ -100,6 +102,25 @@ A concept file is a Markdown file with YAML front matter between two `---` lines
|
|
|
100
102
|
- A link resolves by file name in all the subdirectories, so two concept files must not have the same name.
|
|
101
103
|
- Write each `##` heading for one topic. Search by meaning compares each section separately.
|
|
102
104
|
|
|
105
|
+
### Check concept files
|
|
106
|
+
|
|
107
|
+
Check a file or a directory before you index it. The check uses the rules of the index command, and it writes nothing.
|
|
108
|
+
|
|
109
|
+
```python
|
|
110
|
+
import curu_memory
|
|
111
|
+
|
|
112
|
+
for fault in curu_memory.validate("knowledge"):
|
|
113
|
+
print(fault.path, fault.line, fault.message)
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
- `validate` gives a list of [faults](#glossary). An empty list means that the index command indexes each file of the directory, unless an identifier is also in another space.
|
|
117
|
+
- `path` is relative to the directory that you give. For one file, it is the file name. `line` counts from the first `---` line, and it is None when the fault has no line. `message` is the reason that the index command reports.
|
|
118
|
+
- A warning of the index command is not a fault, for example a missing `type` or a link to a missing concept.
|
|
119
|
+
- A Markdown link in a code block still needs a link kind. A wiki-link `[[...]]` in code is text.
|
|
120
|
+
- `curu_memory.LINK_KINDS` holds the link kinds. `curu_memory.OKF_VERSION` is `0.2`, the version of the format.
|
|
121
|
+
- The package ships the format: `schema.json`, a JSON Schema of the front matter, and conformance fixtures. `curu_memory.conformance_fixtures()` gives the directory of the fixtures. Its parent directory holds `schema.json`.
|
|
122
|
+
- To test a parser in another language, give it each file of `valid/` and of `invalid/`. Compare its faults with `expected.toml`.
|
|
123
|
+
|
|
103
124
|
### Add media to a concept
|
|
104
125
|
|
|
105
126
|
Add example outputs, reference images, audio clips or videos to a concept with a `media` list. Each path is relative to the concept file:
|
|
@@ -568,11 +589,59 @@ The `curu-memory` command uses these exit codes:
|
|
|
568
589
|
| 0 | Success. |
|
|
569
590
|
| 1 | `index` skipped a file, the embedder failed, another index run held the lock, or the embedder model was not the model of another space. `search` found no index, or no readable space. `access` refused a change. |
|
|
570
591
|
| 2 | A usage error, for example `--limit 51`. |
|
|
571
|
-
| 78 | A configuration error, for example HTTP with no token. |
|
|
592
|
+
| 78 | A configuration error, for example HTTP with no token, or `serve` with no `server` extra. |
|
|
593
|
+
|
|
594
|
+
## Use curu-memory from Python
|
|
595
|
+
|
|
596
|
+
Use the library to build a space and to read it from a Python program, with no server. Import each name from `curu_memory` only. The names of `curu_memory.__all__` are the public API. Each other name can change in any release. The public API starts with version 0.3.0. `validate` and `TOOL_SCHEMA_VERSION` start with 0.4.0, so a program pins `curu-memory>=0.4,<0.5`.
|
|
597
|
+
|
|
598
|
+
```python
|
|
599
|
+
from pathlib import Path
|
|
600
|
+
|
|
601
|
+
import curu_memory
|
|
602
|
+
|
|
603
|
+
report = curu_memory.build_space(Path("knowledge"))
|
|
604
|
+
print(report.concepts_indexed, len(report.skipped))
|
|
605
|
+
|
|
606
|
+
knowledge = curu_memory.open_knowledge()
|
|
607
|
+
for hit in knowledge.search("VAE for WAN2.2 5B", limit=3).results:
|
|
608
|
+
print(hit.id, hit.space)
|
|
609
|
+
|
|
610
|
+
concept = knowledge.get_concept("wan22-5b-vae")
|
|
611
|
+
links = knowledge.neighbours(concept.id)
|
|
612
|
+
```
|
|
613
|
+
|
|
614
|
+
- `build_space` builds one space, as the index command does. `space=` names the space, and the default is `global`. A skipped file is not an error. The fields of the report are the values of [Index your knowledge](#index-your-knowledge), except `index`, for example `concepts_indexed`. `skipped` holds a (path, reason) pair for each skipped file.
|
|
615
|
+
- `open_knowledge` reads as one [principal](#glossary). Give `person="<handle>"` to read the spaces of that person. Give `grant=<id>` to read only the space of that grant. With neither, the library reads `global` only.
|
|
616
|
+
- An unknown, ended or revoked grant does not stop `open_knowledge`. Each read then raises `NoReadableSpace`. `serve --grant` stops at the start for such a grant.
|
|
617
|
+
- Each read gets the readable spaces again. A removed role or a revoked grant stops the next read.
|
|
618
|
+
- `search`, `get_concept` and `neighbours` give the same results as the tools `search_knowledge`, `get_concept` and `concept_neighbours`. Each hit gives its `space`.
|
|
619
|
+
- Each refused read writes the line in the audit log that the server writes, with the name of the matching tool as the action.
|
|
620
|
+
- `data_dir=` replaces the data directory. `env=` gives the `CURU_MEMORY_*` variables as a dictionary, for example the embedder settings of [Search by meaning](#search-by-meaning). With no `env`, the library reads the environment of the process.
|
|
621
|
+
- The library does not use `CURU_MEMORY_PRINCIPAL` to select the principal. A value that is not a valid handle raises `ConfigError`.
|
|
622
|
+
- The principal is not a security boundary in one process. The boundary is who can read the data directory.
|
|
623
|
+
|
|
624
|
+
Each error is in `curu_memory`:
|
|
625
|
+
|
|
626
|
+
| Call | Cause | Error |
|
|
627
|
+
|---|---|---|
|
|
628
|
+
| `build_space` | The concept directory does not exist, or the space name is not valid. `details.field` names the argument. | `InvalidArgument` |
|
|
629
|
+
| `build_space` | Another index run holds the lock. | `IndexLocked` |
|
|
630
|
+
| `build_space` | The embedder model is not the model of another space. | `IndexRefused` |
|
|
631
|
+
| `build_space` | The embedder failed. The old index stays. | `EmbedderFailed` |
|
|
632
|
+
| `build_space`, `open_knowledge` | A `CURU_MEMORY_*` variable is not valid. | `ConfigError` |
|
|
633
|
+
| `validate` | The path does not exist. `details.field` is `path`. | `InvalidArgument` |
|
|
634
|
+
| `open_knowledge` | No person has the handle, or `person` and `grant` are both given. | `InvalidArgument` |
|
|
635
|
+
| each read | The principal can read no space. | `NoReadableSpace` |
|
|
636
|
+
| `get_concept`, `neighbours` | No readable space holds the concept. | `ConceptNotFound` |
|
|
637
|
+
| `search` | The question is empty or too long, or the limit is not from 1 to 50. | `InvalidArgument` |
|
|
638
|
+
| each read | No readable space has an index. | `IndexMissing` |
|
|
639
|
+
|
|
640
|
+
Each error except `IndexLocked` and `ConfigError` is a `CuruMemoryError`. Its `code` is the code that a tool gives, for example `concept_not_found`.
|
|
572
641
|
|
|
573
642
|
## Limits
|
|
574
643
|
|
|
575
|
-
- On stdio, in the browser and with the static token, one process reads as one person (`CURU_MEMORY_PRINCIPAL`). On stdio, `serve --grant` makes the process read as the agent of one grant. Only the OIDC mode of HTTP gives each request its own person or agent.
|
|
644
|
+
- On stdio, in the browser and with the static token, one process reads as one person (`CURU_MEMORY_PRINCIPAL`). In Python, each `Knowledge` reads as the principal of its `open_knowledge`. On stdio, `serve --grant` makes the process read as the agent of one grant. Only the OIDC mode of HTTP gives each request its own person or agent.
|
|
576
645
|
- There is no encryption at rest yet.
|
|
577
646
|
- The browser has no OIDC login.
|
|
578
647
|
- Agents and persons cannot write knowledge through curu-memory yet. Edit the concept files, then run the index command.
|
|
@@ -590,7 +659,8 @@ The `curu-memory` command uses these exit codes:
|
|
|
590
659
|
- A match between a question in words and a clip needs 0.68 or more with EmbeddingGemma 2. The limit comes from speech clips. Speech test clips scored from 0.73 with their own questions. Wrong clips and unrelated questions reached 0.64. Music and sound effects can score lower.
|
|
591
660
|
- The index holds a copy of each media file. One hundred files of 2 MB make the index about 200 MB larger.
|
|
592
661
|
- There is no file watcher. Run the index command after each change.
|
|
593
|
-
-
|
|
662
|
+
- `validate` does not read the index, so it does not find an identifier that is also in another space. For one file, it does not find a duplicate identifier.
|
|
663
|
+
- The Python API cannot search with media, and it cannot write a concept. Use `curu-memory search --media` or the tool `search_knowledge_by_media` for media.
|
|
594
664
|
|
|
595
665
|
## Technical notes
|
|
596
666
|
|
|
@@ -606,10 +676,13 @@ The `curu-memory` command uses these exit codes:
|
|
|
606
676
|
- The plan for keys and encryption of private knowledge is [ADR-002](project-management/ADRs/ADR-002-server-held-envelope-keys.md).
|
|
607
677
|
- The word match uses SQLite FTS5 (the full-text search of SQLite) with the `unicode61` tokenizer (the rule that splits a text into words). The tokenizer keeps `.`, `_` and `-` in a word. A word of three or more characters also matches as a prefix.
|
|
608
678
|
- Search fuses the two rankings with reciprocal rank fusion, with k = 60. The lower of the two values counts one tenth. So ten rivals that are a little worse in both rankings do not push out the best answer of one ranking. See [ADR-006](project-management/ADRs/ADR-006-damped-rank-fusion.md). The identifier breaks a tie, so the order is stable.
|
|
609
|
-
- The concept rules are the same as the rules of the curu index, so each curu concept file indexes here.
|
|
679
|
+
- The concept rules are the same as the rules of the curu index, so each curu concept file indexes here. The index command and `validate` use one implementation of them. The schema and the fixtures are in `src/curu_memory/okf_v0_2/`. See [specs/017-the-okf-v0-2-schema/contracts/okf.md](specs/017-the-okf-v0-2-schema/contracts/okf.md). The copy of the curu concepts in `tests/fixtures/eval_corpus/` is a frozen evaluation corpus, not a reference of the format. See [ADR-020](project-management/ADRs/ADR-020-a-frozen-evaluation-corpus.md).
|
|
610
680
|
- The tool contracts are in [specs/001-okf-index-mcp-search/contracts/](specs/001-okf-index-mcp-search/contracts/).
|
|
611
681
|
- curu-memory uses the official MCP Python SDK. It never loads model weights.
|
|
612
|
-
- curu uses curu-memory as a library, and the version range of a release follows a version policy. See [ADR-019](project-management/ADRs/ADR-019-curu-uses-curu-memory-as-a-library.md).
|
|
682
|
+
- curu uses curu-memory as a library, and the version range of a release follows a version policy. See [ADR-019](project-management/ADRs/ADR-019-curu-uses-curu-memory-as-a-library.md). `tests/contract/public_api.txt` holds the names of `curu_memory.__all__`. The contract is [specs/015-the-public-library-api/contracts/public-api.md](specs/015-the-public-library-api/contracts/public-api.md).
|
|
683
|
+
- The core install has `pydantic`, `httpx2`, `markdown-it-py` and `pyyaml`. The `server` extra adds `mcp`, `starlette` and `uvicorn`.
|
|
684
|
+
- `curu_memory.TOOL_SCHEMA_VERSION` is the version of the MCP tool schemas and the error codes. The value is 1 for the tools of 0.3.0. It goes up by 1 in each pull request that changes a tool, a field or an error code. A change of a description or a title does not change it. It is not the package version.
|
|
685
|
+
- A Python program that imports `curu_memory` can compare `TOOL_SCHEMA_VERSION` with the version that it expects. A different value means that a tool, a field or an error code is different. The MCP server does not send the value. `tests/contract/tool_schemas.json` holds the schemas of the current version.
|
|
613
686
|
|
|
614
687
|
## Develop
|
|
615
688
|
|
|
@@ -620,7 +693,7 @@ uv sync
|
|
|
620
693
|
uv run pytest
|
|
621
694
|
```
|
|
622
695
|
|
|
623
|
-
The default tests need no network, no GPU and no model. They use a fake embedder and a copy of
|
|
696
|
+
`uv sync` installs the `server` extra, because the development group names it. The default tests need no network, no GPU and no model. They use a fake embedder and the frozen evaluation corpus in `tests/fixtures/eval_corpus/`, a copy of 183 curu concept files. The corpus is for the search measurements only. The shipped fixtures are the reference of the format. The tests with a real embedder have the `integration` marker. With no GPU embedder server, start the [development embedder](#glossary) first, as [tools/embedder_server/README.md](tools/embedder_server/README.md) says. Then run:
|
|
624
697
|
|
|
625
698
|
```bash
|
|
626
699
|
CURU_MEMORY_EMBEDDER_URL=http://127.0.0.1:30000 CURU_MEMORY_EMBEDDER_TIMEOUT=300 uv run pytest -m integration
|
|
@@ -654,10 +727,15 @@ The CI runs the same gates on each pull request and on each push to `main`. A re
|
|
|
654
727
|
- **Data URI**: a text that holds the bytes of a file in base64, with their MIME type, for example `data:image/png;base64,...`.
|
|
655
728
|
- **Data directory**: the directory of the index, the embedding cache, the access store `access.sqlite` and the audit log `audit.jsonl`. The default is `~/.local/share/curu-memory`, or `$XDG_DATA_HOME/curu-memory`. `CURU_MEMORY_DATA_DIR` changes it.
|
|
656
729
|
- **Development embedder**: the CPU server in `tools/embedder_server/` that serves EmbeddingGemma 2 for the integration tier.
|
|
730
|
+
- **Conformance fixtures**: the valid and invalid concept files that the package ships, with the expected faults in `expected.toml`.
|
|
731
|
+
- **Evaluation corpus**: the frozen copy of 183 curu concept files in `tests/fixtures/eval_corpus/`, for the search measurements.
|
|
732
|
+
- **Extra**: a named set of optional packages of a Python package, for example `server` in `curu-memory[server]`.
|
|
657
733
|
- **Embedder**: a server that changes a text, an image, a clip or a video into an embedding.
|
|
658
734
|
- **Embedding**: a list of numbers that holds the meaning of a text, an image, a clip or a video. Items with a near meaning have near embeddings.
|
|
735
|
+
- **Fault**: one problem that makes the index command skip a concept file. `validate` gives each fault with its `path`, `line` and `message`.
|
|
659
736
|
- **GraphRAG**: retrieval that uses a search and the links between concepts to give an agent its context.
|
|
660
737
|
- **Index**: the searchable copy of the concept files that the index command makes.
|
|
738
|
+
- **JSON Schema**: a standard JSON document that gives the fields and the types of a JSON or YAML value.
|
|
661
739
|
- **Link kind**: the type of a link between two concepts, for example `USES_COMPONENT`.
|
|
662
740
|
- **MCP**: the Model Context Protocol, which lets an agent find and call tools.
|
|
663
741
|
- **Minor version**: the second number of `X.Y.Z`. Below 1.0, a new minor version can remove or change a name or a tool field.
|
|
@@ -668,14 +746,15 @@ The CI runs the same gates on each pull request and on each push to `main`. A re
|
|
|
668
746
|
- **Task prompt**: a fixed text that curu-memory puts around a question or a section before it sends the text to the embedder.
|
|
669
747
|
- **Stdio**: the standard input and output of a process. A local MCP client talks to the server through them.
|
|
670
748
|
- **Streamable HTTP**: the MCP transport over HTTP, for remote agents.
|
|
749
|
+
- **Wiki-link**: a link of the form `[[name]]`. OKF does not accept it outside code.
|
|
671
750
|
- **Web browser**: the program that shows web pages, for example Firefox.
|
|
672
751
|
- **SHA-256**: a hash of 64 hexadecimal characters that the bytes of a file give. Different bytes give a different SHA-256.
|
|
673
752
|
- **Unit**: one part of a concept that has its own embedding: the summary, the overview, a `##` section, an image, a clip or a video.
|
|
674
|
-
- **Version range**: the lowest version and the first version to exclude, for example `>=0.
|
|
753
|
+
- **Version range**: the lowest version and the first version to exclude, for example `>=0.4,<0.5`.
|
|
675
754
|
- **Space**: a part of the knowledge with its own index: `global`, `team/<slug>` or `personal/<handle>`. Each request reads only the spaces that its caller can read.
|
|
676
755
|
- **Team slug**: the short name of a team in a space name, for example `look` in `team/look`.
|
|
677
756
|
- **Instance owner**: a person with `admin` on `global` and on each team space. The first registered person is an instance owner.
|
|
678
|
-
- **Principal**: the person or the agent of a request
|
|
757
|
+
- **Principal**: the person or the agent of a request, or `anonymous` with no principal. It comes from `CURU_MEMORY_PRINCIPAL`, `serve --grant`, the OIDC token on HTTP or `open_knowledge`.
|
|
679
758
|
- **Operator**: the person who runs `curu-memory access` and `curu-memory index` on the computer of the server.
|
|
680
759
|
- **Access store**: `access.sqlite`, with the persons, the teams, the members, the agents and the grants.
|
|
681
760
|
- **Audit log**: `audit.jsonl`, with one line for each change of access, each refused read and each refused token.
|
|
@@ -5,12 +5,18 @@ description = "A shared knowledge base and GraphRAG store for ComfyUI and genera
|
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
license = "MIT"
|
|
7
7
|
requires-python = ">=3.12"
|
|
8
|
+
# The core: the library, `index`, `search` and `access`. No server package (spec 015).
|
|
8
9
|
dependencies = [
|
|
9
|
-
"mcp==2.3.0",
|
|
10
10
|
"pydantic>=2.12",
|
|
11
11
|
"httpx2>=2.10",
|
|
12
12
|
"markdown-it-py>=4.0",
|
|
13
13
|
"pyyaml>=6.0",
|
|
14
|
+
]
|
|
15
|
+
|
|
16
|
+
[project.optional-dependencies]
|
|
17
|
+
# `serve` and `browse` need these. Install them with curu-memory[server].
|
|
18
|
+
server = [
|
|
19
|
+
"mcp==2.3.0",
|
|
14
20
|
"starlette>=1.0",
|
|
15
21
|
"uvicorn>=0.31.1",
|
|
16
22
|
]
|
|
@@ -25,11 +31,12 @@ Changelog = "https://github.com/darth-veitcher/curu-memory/blob/main/CHANGELOG.m
|
|
|
25
31
|
|
|
26
32
|
[dependency-groups]
|
|
27
33
|
dev = [
|
|
34
|
+
# The extra itself, so that the pin of mcp has one place (research R7).
|
|
35
|
+
"curu-memory[server]",
|
|
28
36
|
"pytest>=8",
|
|
29
37
|
"pytest-timeout>=2.3",
|
|
30
38
|
"ruff>=0.15",
|
|
31
39
|
"ty>=0.0.1a20",
|
|
32
|
-
"uvicorn>=0.31.1",
|
|
33
40
|
]
|
|
34
41
|
|
|
35
42
|
[build-system]
|
|
@@ -57,8 +64,9 @@ include = [
|
|
|
57
64
|
[tool.ruff]
|
|
58
65
|
line-length = 100
|
|
59
66
|
target-version = "py312"
|
|
60
|
-
# The fixture corpora are copies of real concept files
|
|
61
|
-
|
|
67
|
+
# The fixture corpora are copies of real concept files, and the OKF fixtures hold a
|
|
68
|
+
# file that is not UTF-8 on purpose. They must stay byte for byte.
|
|
69
|
+
extend-exclude = ["tests/fixtures", "src/curu_memory/okf_v0_2/fixtures"]
|
|
62
70
|
|
|
63
71
|
[tool.ruff.lint]
|
|
64
72
|
select = ["E", "F", "I", "UP", "B", "SIM", "ASYNC"]
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"""curu-memory: a shared knowledge base for ComfyUI, served to agents over MCP.
|
|
2
|
+
|
|
3
|
+
The names in `__all__` are the public Python API (ADR-019). Each other name is internal
|
|
4
|
+
and can change in any release. `tests/contract/public_api.txt` holds the same names.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
__version__ = "0.4.0"
|
|
8
|
+
#: The version of the MCP tool schemas and error codes. It goes up by 1 for each change
|
|
9
|
+
#: of `tests/contract/tool_schemas.json` (ADR-019). It is not the package version.
|
|
10
|
+
TOOL_SCHEMA_VERSION = 1
|
|
11
|
+
|
|
12
|
+
from curu_memory.config import ConfigError # noqa: E402
|
|
13
|
+
from curu_memory.errors import ( # noqa: E402
|
|
14
|
+
ConceptNotFound,
|
|
15
|
+
CuruMemoryError,
|
|
16
|
+
EmbedderFailed,
|
|
17
|
+
IndexMissing,
|
|
18
|
+
IndexRefused,
|
|
19
|
+
InvalidArgument,
|
|
20
|
+
NoReadableSpace,
|
|
21
|
+
)
|
|
22
|
+
from curu_memory.indexing import IndexReport # noqa: E402
|
|
23
|
+
from curu_memory.library import Knowledge, build_space, open_knowledge # noqa: E402
|
|
24
|
+
from curu_memory.okf import ( # noqa: E402
|
|
25
|
+
LINK_KINDS,
|
|
26
|
+
OKF_VERSION,
|
|
27
|
+
OkfFault,
|
|
28
|
+
conformance_fixtures,
|
|
29
|
+
validate,
|
|
30
|
+
)
|
|
31
|
+
from curu_memory.ports import IndexLocked # noqa: E402
|
|
32
|
+
from curu_memory.retrieval import ( # noqa: E402
|
|
33
|
+
ConceptDetail,
|
|
34
|
+
MediaItem,
|
|
35
|
+
Neighbour,
|
|
36
|
+
Neighbours,
|
|
37
|
+
SearchHit,
|
|
38
|
+
SearchResult,
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
__all__ = [
|
|
42
|
+
"ConceptDetail",
|
|
43
|
+
"ConceptNotFound",
|
|
44
|
+
"ConfigError",
|
|
45
|
+
"CuruMemoryError",
|
|
46
|
+
"EmbedderFailed",
|
|
47
|
+
"IndexLocked",
|
|
48
|
+
"IndexMissing",
|
|
49
|
+
"IndexRefused",
|
|
50
|
+
"IndexReport",
|
|
51
|
+
"InvalidArgument",
|
|
52
|
+
"Knowledge",
|
|
53
|
+
"LINK_KINDS",
|
|
54
|
+
"MediaItem",
|
|
55
|
+
"Neighbour",
|
|
56
|
+
"Neighbours",
|
|
57
|
+
"NoReadableSpace",
|
|
58
|
+
"OKF_VERSION",
|
|
59
|
+
"OkfFault",
|
|
60
|
+
"SearchHit",
|
|
61
|
+
"SearchResult",
|
|
62
|
+
"TOOL_SCHEMA_VERSION",
|
|
63
|
+
"__version__",
|
|
64
|
+
"build_space",
|
|
65
|
+
"conformance_fixtures",
|
|
66
|
+
"open_knowledge",
|
|
67
|
+
"validate",
|
|
68
|
+
]
|