loop-memory 0.4.4__tar.gz → 0.4.5__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (130) hide show
  1. {loop_memory-0.4.4 → loop_memory-0.4.5}/PKG-INFO +1 -1
  2. {loop_memory-0.4.4 → loop_memory-0.4.5}/loop_memory/__init__.py +11 -1
  3. {loop_memory-0.4.4 → loop_memory-0.4.5}/loop_memory.egg-info/PKG-INFO +1 -1
  4. {loop_memory-0.4.4 → loop_memory-0.4.5}/loop_memory.egg-info/SOURCES.txt +1 -0
  5. {loop_memory-0.4.4 → loop_memory-0.4.5}/pyproject.toml +1 -1
  6. loop_memory-0.4.5/tests/test_package_version.py +97 -0
  7. {loop_memory-0.4.4 → loop_memory-0.4.5}/LICENSE +0 -0
  8. {loop_memory-0.4.4 → loop_memory-0.4.5}/README.md +0 -0
  9. {loop_memory-0.4.4 → loop_memory-0.4.5}/loop_memory/backends/__init__.py +0 -0
  10. {loop_memory-0.4.4 → loop_memory-0.4.5}/loop_memory/backends/embedding.py +0 -0
  11. {loop_memory-0.4.4 → loop_memory-0.4.5}/loop_memory/backends/sentence_embedder.py +0 -0
  12. {loop_memory-0.4.4 → loop_memory-0.4.5}/loop_memory/backends/vector_store.py +0 -0
  13. {loop_memory-0.4.4 → loop_memory-0.4.5}/loop_memory/cli/__init__.py +0 -0
  14. {loop_memory-0.4.4 → loop_memory-0.4.5}/loop_memory/cli/_common.py +0 -0
  15. {loop_memory-0.4.4 → loop_memory-0.4.5}/loop_memory/cli/commands/__init__.py +0 -0
  16. {loop_memory-0.4.4 → loop_memory-0.4.5}/loop_memory/cli/commands/cognitive.py +0 -0
  17. {loop_memory-0.4.4 → loop_memory-0.4.5}/loop_memory/cli/commands/diag.py +0 -0
  18. {loop_memory-0.4.4 → loop_memory-0.4.5}/loop_memory/cli/commands/graph.py +0 -0
  19. {loop_memory-0.4.4 → loop_memory-0.4.5}/loop_memory/cli/commands/hooks.py +0 -0
  20. {loop_memory-0.4.4 → loop_memory-0.4.5}/loop_memory/cli/commands/read.py +0 -0
  21. {loop_memory-0.4.4 → loop_memory-0.4.5}/loop_memory/cli/commands/rules.py +0 -0
  22. {loop_memory-0.4.4 → loop_memory-0.4.5}/loop_memory/cli/commands/serve.py +0 -0
  23. {loop_memory-0.4.4 → loop_memory-0.4.5}/loop_memory/cli/commands/write.py +0 -0
  24. {loop_memory-0.4.4 → loop_memory-0.4.5}/loop_memory/cli/main.py +0 -0
  25. {loop_memory-0.4.4 → loop_memory-0.4.5}/loop_memory/engine/__init__.py +0 -0
  26. {loop_memory-0.4.4 → loop_memory-0.4.5}/loop_memory/engine/loop.py +0 -0
  27. {loop_memory-0.4.4 → loop_memory-0.4.5}/loop_memory/engine/reflect.py +0 -0
  28. {loop_memory-0.4.4 → loop_memory-0.4.5}/loop_memory/examples/__init__.py +0 -0
  29. {loop_memory-0.4.4 → loop_memory-0.4.5}/loop_memory/examples/demo.py +0 -0
  30. {loop_memory-0.4.4 → loop_memory-0.4.5}/loop_memory/export/__init__.py +0 -0
  31. {loop_memory-0.4.4 → loop_memory-0.4.5}/loop_memory/export/memory_md.py +0 -0
  32. {loop_memory-0.4.4 → loop_memory-0.4.5}/loop_memory/graph/__init__.py +0 -0
  33. {loop_memory-0.4.4 → loop_memory-0.4.5}/loop_memory/graph/build.py +0 -0
  34. {loop_memory-0.4.4 → loop_memory-0.4.5}/loop_memory/graph/extract.py +0 -0
  35. {loop_memory-0.4.4 → loop_memory-0.4.5}/loop_memory/ingest/__init__.py +0 -0
  36. {loop_memory-0.4.4 → loop_memory-0.4.5}/loop_memory/ingest/loader.py +0 -0
  37. {loop_memory-0.4.4 → loop_memory-0.4.5}/loop_memory/ingest/pipeline.py +0 -0
  38. {loop_memory-0.4.4 → loop_memory-0.4.5}/loop_memory/jobs/__init__.py +0 -0
  39. {loop_memory-0.4.4 → loop_memory-0.4.5}/loop_memory/jobs/cognitive.py +0 -0
  40. {loop_memory-0.4.4 → loop_memory-0.4.5}/loop_memory/jobs/compact.py +0 -0
  41. {loop_memory-0.4.4 → loop_memory-0.4.5}/loop_memory/jobs/consolidate.py +0 -0
  42. {loop_memory-0.4.4 → loop_memory-0.4.5}/loop_memory/jobs/contradiction.py +0 -0
  43. {loop_memory-0.4.4 → loop_memory-0.4.5}/loop_memory/jobs/evolution.py +0 -0
  44. {loop_memory-0.4.4 → loop_memory-0.4.5}/loop_memory/jobs/graph.py +0 -0
  45. {loop_memory-0.4.4 → loop_memory-0.4.5}/loop_memory/jobs/llm_compact_pass.py +0 -0
  46. {loop_memory-0.4.4 → loop_memory-0.4.5}/loop_memory/jobs/llm_consolidate.py +0 -0
  47. {loop_memory-0.4.4 → loop_memory-0.4.5}/loop_memory/jobs/scheduler.py +0 -0
  48. {loop_memory-0.4.4 → loop_memory-0.4.5}/loop_memory/llm/__init__.py +0 -0
  49. {loop_memory-0.4.4 → loop_memory-0.4.5}/loop_memory/llm/base.py +0 -0
  50. {loop_memory-0.4.4 → loop_memory-0.4.5}/loop_memory/llm/openai_adapter.py +0 -0
  51. {loop_memory-0.4.4 → loop_memory-0.4.5}/loop_memory/llm/providers.py +0 -0
  52. {loop_memory-0.4.4 → loop_memory-0.4.5}/loop_memory/mcp/__init__.py +0 -0
  53. {loop_memory-0.4.4 → loop_memory-0.4.5}/loop_memory/memory/__init__.py +0 -0
  54. {loop_memory-0.4.4 → loop_memory-0.4.5}/loop_memory/memory/types.py +0 -0
  55. {loop_memory-0.4.4 → loop_memory-0.4.5}/loop_memory/privacy/__init__.py +0 -0
  56. {loop_memory-0.4.4 → loop_memory-0.4.5}/loop_memory/privacy/private.py +0 -0
  57. {loop_memory-0.4.4 → loop_memory-0.4.5}/loop_memory/privacy/redact.py +0 -0
  58. {loop_memory-0.4.4 → loop_memory-0.4.5}/loop_memory/py.typed +0 -0
  59. {loop_memory-0.4.4 → loop_memory-0.4.5}/loop_memory/sdk.py +0 -0
  60. {loop_memory-0.4.4 → loop_memory-0.4.5}/loop_memory/sdk_extensions.py +0 -0
  61. {loop_memory-0.4.4 → loop_memory-0.4.5}/loop_memory/security/__init__.py +0 -0
  62. {loop_memory-0.4.4 → loop_memory-0.4.5}/loop_memory/security/secrets.py +0 -0
  63. {loop_memory-0.4.4 → loop_memory-0.4.5}/loop_memory/serve/__init__.py +0 -0
  64. {loop_memory-0.4.4 → loop_memory-0.4.5}/loop_memory/serve/app.py +0 -0
  65. {loop_memory-0.4.4 → loop_memory-0.4.5}/loop_memory/serve/handlers.py +0 -0
  66. {loop_memory-0.4.4 → loop_memory-0.4.5}/loop_memory/serve/routes/_shared.py +0 -0
  67. {loop_memory-0.4.4 → loop_memory-0.4.5}/loop_memory/serve/routes/admin.py +0 -0
  68. {loop_memory-0.4.4 → loop_memory-0.4.5}/loop_memory/serve/routes/cognitive.py +0 -0
  69. {loop_memory-0.4.4 → loop_memory-0.4.5}/loop_memory/serve/routes/export.py +0 -0
  70. {loop_memory-0.4.4 → loop_memory-0.4.5}/loop_memory/serve/routes/graph.py +0 -0
  71. {loop_memory-0.4.4 → loop_memory-0.4.5}/loop_memory/serve/routes/insights.py +0 -0
  72. {loop_memory-0.4.4 → loop_memory-0.4.5}/loop_memory/serve/routes/memories.py +0 -0
  73. {loop_memory-0.4.4 → loop_memory-0.4.5}/loop_memory/serve/routes/sessions.py +0 -0
  74. {loop_memory-0.4.4 → loop_memory-0.4.5}/loop_memory/serve/routes/system.py +0 -0
  75. {loop_memory-0.4.4 → loop_memory-0.4.5}/loop_memory/serve/routes/wiki.py +0 -0
  76. {loop_memory-0.4.4 → loop_memory-0.4.5}/loop_memory/serve/static/__init__.py +0 -0
  77. {loop_memory-0.4.4 → loop_memory-0.4.5}/loop_memory/serve/static/index.html +0 -0
  78. {loop_memory-0.4.4 → loop_memory-0.4.5}/loop_memory/serve/watcher.py +0 -0
  79. {loop_memory-0.4.4 → loop_memory-0.4.5}/loop_memory/storage/__init__.py +0 -0
  80. {loop_memory-0.4.4 → loop_memory-0.4.5}/loop_memory/storage/retrieval.py +0 -0
  81. {loop_memory-0.4.4 → loop_memory-0.4.5}/loop_memory/storage/sqlite_store.py +0 -0
  82. {loop_memory-0.4.4 → loop_memory-0.4.5}/loop_memory/wiki/__init__.py +0 -0
  83. {loop_memory-0.4.4 → loop_memory-0.4.5}/loop_memory/wiki/backfill.py +0 -0
  84. {loop_memory-0.4.4 → loop_memory-0.4.5}/loop_memory/wiki/classifier.py +0 -0
  85. {loop_memory-0.4.4 → loop_memory-0.4.5}/loop_memory/wiki/prompts.py +0 -0
  86. {loop_memory-0.4.4 → loop_memory-0.4.5}/loop_memory/wiki/scope.py +0 -0
  87. {loop_memory-0.4.4 → loop_memory-0.4.5}/loop_memory.egg-info/dependency_links.txt +0 -0
  88. {loop_memory-0.4.4 → loop_memory-0.4.5}/loop_memory.egg-info/entry_points.txt +0 -0
  89. {loop_memory-0.4.4 → loop_memory-0.4.5}/loop_memory.egg-info/requires.txt +0 -0
  90. {loop_memory-0.4.4 → loop_memory-0.4.5}/loop_memory.egg-info/top_level.txt +0 -0
  91. {loop_memory-0.4.4 → loop_memory-0.4.5}/setup.cfg +0 -0
  92. {loop_memory-0.4.4 → loop_memory-0.4.5}/tests/test_admin_ingest_route.py +0 -0
  93. {loop_memory-0.4.4 → loop_memory-0.4.5}/tests/test_agent_memory_api.py +0 -0
  94. {loop_memory-0.4.4 → loop_memory-0.4.5}/tests/test_agent_memory_sdk.py +0 -0
  95. {loop_memory-0.4.4 → loop_memory-0.4.5}/tests/test_auth_token_rotate.py +0 -0
  96. {loop_memory-0.4.4 → loop_memory-0.4.5}/tests/test_cli_rules.py +0 -0
  97. {loop_memory-0.4.4 → loop_memory-0.4.5}/tests/test_cli_v7.py +0 -0
  98. {loop_memory-0.4.4 → loop_memory-0.4.5}/tests/test_cli_version.py +0 -0
  99. {loop_memory-0.4.4 → loop_memory-0.4.5}/tests/test_contradictions.py +0 -0
  100. {loop_memory-0.4.4 → loop_memory-0.4.5}/tests/test_evolution.py +0 -0
  101. {loop_memory-0.4.4 → loop_memory-0.4.5}/tests/test_evolution_quality.py +0 -0
  102. {loop_memory-0.4.4 → loop_memory-0.4.5}/tests/test_expanduser.py +0 -0
  103. {loop_memory-0.4.4 → loop_memory-0.4.5}/tests/test_export_ask.py +0 -0
  104. {loop_memory-0.4.4 → loop_memory-0.4.5}/tests/test_graph.py +0 -0
  105. {loop_memory-0.4.4 → loop_memory-0.4.5}/tests/test_ingest.py +0 -0
  106. {loop_memory-0.4.4 → loop_memory-0.4.5}/tests/test_llm_consolidator.py +0 -0
  107. {loop_memory-0.4.4 → loop_memory-0.4.5}/tests/test_llm_fingerprint_not_persisted.py +0 -0
  108. {loop_memory-0.4.4 → loop_memory-0.4.5}/tests/test_llm_providers.py +0 -0
  109. {loop_memory-0.4.4 → loop_memory-0.4.5}/tests/test_llm_test_endpoint.py +0 -0
  110. {loop_memory-0.4.4 → loop_memory-0.4.5}/tests/test_loop.py +0 -0
  111. {loop_memory-0.4.4 → loop_memory-0.4.5}/tests/test_mcp.py +0 -0
  112. {loop_memory-0.4.4 → loop_memory-0.4.5}/tests/test_memories_pagination.py +0 -0
  113. {loop_memory-0.4.4 → loop_memory-0.4.5}/tests/test_openclaw_loader.py +0 -0
  114. {loop_memory-0.4.4 → loop_memory-0.4.5}/tests/test_reflection.py +0 -0
  115. {loop_memory-0.4.4 → loop_memory-0.4.5}/tests/test_repo_framing.py +0 -0
  116. {loop_memory-0.4.4 → loop_memory-0.4.5}/tests/test_score_api.py +0 -0
  117. {loop_memory-0.4.4 → loop_memory-0.4.5}/tests/test_scoring_v2.py +0 -0
  118. {loop_memory-0.4.4 → loop_memory-0.4.5}/tests/test_secrets.py +0 -0
  119. {loop_memory-0.4.4 → loop_memory-0.4.5}/tests/test_serve_app.py +0 -0
  120. {loop_memory-0.4.4 → loop_memory-0.4.5}/tests/test_serve_handlers.py +0 -0
  121. {loop_memory-0.4.4 → loop_memory-0.4.5}/tests/test_session_order.py +0 -0
  122. {loop_memory-0.4.4 → loop_memory-0.4.5}/tests/test_short_query.py +0 -0
  123. {loop_memory-0.4.4 → loop_memory-0.4.5}/tests/test_store.py +0 -0
  124. {loop_memory-0.4.4 → loop_memory-0.4.5}/tests/test_summarization.py +0 -0
  125. {loop_memory-0.4.4 → loop_memory-0.4.5}/tests/test_universal_memory.py +0 -0
  126. {loop_memory-0.4.4 → loop_memory-0.4.5}/tests/test_vector_store.py +0 -0
  127. {loop_memory-0.4.4 → loop_memory-0.4.5}/tests/test_watcher.py +0 -0
  128. {loop_memory-0.4.4 → loop_memory-0.4.5}/tests/test_wiki_classifier.py +0 -0
  129. {loop_memory-0.4.4 → loop_memory-0.4.5}/tests/test_wiki_export_escape.py +0 -0
  130. {loop_memory-0.4.4 → loop_memory-0.4.5}/tests/test_wiki_prompts.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: loop-memory
3
- Version: 0.4.4
3
+ Version: 0.4.5
4
4
  Summary: A general-purpose, local memory system for every AI agent you run. Loop Memory auto-captures conversations from Codex / Claude / Hermes / OpenClaw, scores them by importance × recency × usage × feedback, distils them into a curated wiki, and serves everything from a single web UI.
5
5
  Author: Loop Memory contributors <loop-memory@users.noreply.github.com>
6
6
  License-Expression: MIT
@@ -31,7 +31,17 @@ from .memory.types import (
31
31
  )
32
32
  from .storage.sqlite_store import MemoryStore, StoredMemory, StoredSession
33
33
 
34
- __version__ = "0.2.0"
34
+ # Single source of truth for the version string: read it from the
35
+ # installed distribution metadata so `loop_memory.__version__` always
36
+ # matches what `pip show loop-memory` reports. When the package is run
37
+ # from a source checkout (no installed metadata) we fall back to
38
+ # "0.0.0+source" instead of a hard-coded string — this was the root
39
+ # cause of the long-standing stale "0.2.0" since 0.3.0.
40
+ try:
41
+ from importlib.metadata import version as _dist_version, PackageNotFoundError
42
+ __version__ = _dist_version("loop-memory")
43
+ except PackageNotFoundError:
44
+ __version__ = "0.0.0+source"
35
45
 
36
46
  __all__ = [
37
47
  # engine
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: loop-memory
3
- Version: 0.4.4
3
+ Version: 0.4.5
4
4
  Summary: A general-purpose, local memory system for every AI agent you run. Loop Memory auto-captures conversations from Codex / Claude / Hermes / OpenClaw, scores them by importance × recency × usage × feedback, distils them into a curated wiki, and serves everything from a single web UI.
5
5
  Author: Loop Memory contributors <loop-memory@users.noreply.github.com>
6
6
  License-Expression: MIT
@@ -108,6 +108,7 @@ tests/test_loop.py
108
108
  tests/test_mcp.py
109
109
  tests/test_memories_pagination.py
110
110
  tests/test_openclaw_loader.py
111
+ tests/test_package_version.py
111
112
  tests/test_reflection.py
112
113
  tests/test_repo_framing.py
113
114
  tests/test_score_api.py
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "loop-memory"
7
- version = "0.4.4"
7
+ version = "0.4.5"
8
8
  description = "A general-purpose, local memory system for every AI agent you run. Loop Memory auto-captures conversations from Codex / Claude / Hermes / OpenClaw, scores them by importance × recency × usage × feedback, distils them into a curated wiki, and serves everything from a single web UI."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -0,0 +1,97 @@
1
+ """Regression tests pinning ``loop_memory.__version__`` to the installed
2
+ distribution version.
3
+
4
+ Before this fix, ``__version__`` was hard-coded to ``"0.2.0"`` in
5
+ ``loop_memory/__init__.py`` and had been stale since the 0.3.0 line —
6
+ every release from 0.4.0 → 0.4.4 shipped with ``pip show loop-memory``
7
+ reporting the real version but ``import loop_memory; loop_memory.__version__``
8
+ still saying ``0.2.0``.
9
+
10
+ The fix reads the version from installed distribution metadata, with a
11
+ fallback to ``"0.0.0+source"`` for source checkouts.
12
+ """
13
+ from __future__ import annotations
14
+
15
+ import re
16
+ import unittest
17
+ from importlib import metadata as importlib_metadata
18
+
19
+
20
+ class PackageVersionTests(unittest.TestCase):
21
+ def test_dunder_version_is_a_nonempty_string(self) -> None:
22
+ import loop_memory
23
+ self.assertIsInstance(loop_memory.__version__, str)
24
+ self.assertTrue(loop_memory.__version__.strip(),
25
+ "loop_memory.__version__ must not be empty")
26
+
27
+ def test_dunder_version_is_not_stale_0_2_0(self) -> None:
28
+ """The bug that triggered this fix: ``__version__`` was
29
+ hard-coded to "0.2.0" since 0.3.0 — every release since then
30
+ had to ship with the wrong value. This test makes the regression
31
+ loud if it ever comes back.
32
+ """
33
+ import loop_memory
34
+ self.assertNotEqual(
35
+ loop_memory.__version__,
36
+ "0.2.0",
37
+ "loop_memory.__version__ is hard-coded to '0.2.0' — "
38
+ "should read from importlib.metadata instead",
39
+ )
40
+
41
+ def test_dunder_version_matches_installed_metadata(self) -> None:
42
+ """When installed via pip, ``__version__`` MUST equal the
43
+ distribution's own metadata version. This is the contract users
44
+ rely on: ``pip show`` and ``import loop_memory; __version__``
45
+ must agree.
46
+ """
47
+ import loop_memory
48
+ try:
49
+ installed = importlib_metadata.version("loop-memory")
50
+ except importlib_metadata.PackageNotFoundError:
51
+ self.skipTest("loop-memory is not installed (source checkout)")
52
+ self.assertEqual(
53
+ loop_memory.__version__,
54
+ installed,
55
+ f"loop_memory.__version__={loop_memory.__version__!r} "
56
+ f"but pip metadata says {installed!r}",
57
+ )
58
+
59
+ def test_source_checkout_fallback_is_marker_not_silent_2_0(self) -> None:
60
+ """When the package isn't installed (e.g. running tests from a
61
+ fresh ``git clone``), ``__version__`` MUST surface that it came
62
+ from source — never silently masquerade as a real release.
63
+ """
64
+ import loop_memory
65
+ if loop_memory.__version__ == "0.0.0+source":
66
+ return # source-checkout fallback is active; good.
67
+ # Otherwise it must match the installed distribution exactly,
68
+ # which the test above already enforced.
69
+ try:
70
+ installed = importlib_metadata.version("loop-memory")
71
+ except importlib_metadata.PackageNotFoundError:
72
+ self.fail(
73
+ "loop_memory.__version__ did not fall back to "
74
+ "'0.0.0+source' even though no installed metadata exists; "
75
+ f"got {loop_memory.__version__!r}"
76
+ )
77
+ self.assertEqual(loop_memory.__version__, installed)
78
+
79
+ def test_version_string_looks_like_a_pep440_version(self) -> None:
80
+ """Sanity: the version string must parse as something PEP 440-ish
81
+ (X.Y.Z with optional pre/post suffixes), not be a hard-coded
82
+ marker like 'unknown' or 'dev'.
83
+ """
84
+ import loop_memory
85
+ v = loop_memory.__version__
86
+ if v == "0.0.0+source":
87
+ self.skipTest("source-checkout fallback")
88
+ # Allow X.Y.Z plus optional a/b/rc/post/dev suffixes
89
+ self.assertRegex(
90
+ v,
91
+ r"^\d+\.\d+\.\d+(?:[abc]|rc|\.post|\.dev|\.local|[\-+.][\w.]+)*$",
92
+ f"version {v!r} is not PEP 440-shaped",
93
+ )
94
+
95
+
96
+ if __name__ == "__main__":
97
+ unittest.main()
File without changes
File without changes
File without changes