luminary-memory 0.3.2__tar.gz → 0.3.3__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 (285) hide show
  1. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/.github/workflows/ci.yml +1 -1
  2. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/.github/workflows/publish.yml +56 -2
  3. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/.gitignore +3 -0
  4. luminary_memory-0.3.3/AGENTS.md +6 -0
  5. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/CHANGELOG.md +234 -7
  6. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/CONTRIBUTING.md +70 -13
  7. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/PKG-INFO +20 -9
  8. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/README.md +19 -8
  9. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/benchmarks/README.md +26 -23
  10. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/benchmarks/RESULTS.md +30 -9
  11. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/benchmarks/baselines/README.md +12 -5
  12. luminary_memory-0.3.3/benchmarks/baselines/gold-real-v3.json +243 -0
  13. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/benchmarks/run_benchmarks.py +20 -7
  14. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/docs/agent-integrations.md +204 -32
  15. luminary_memory-0.3.3/hatch_build.py +32 -0
  16. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/hermes/SKILL.md +4 -4
  17. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/hermes/install.sh +3 -4
  18. luminary_memory-0.3.3/opencode/SKILL.md +247 -0
  19. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/package-lock.json +2401 -264
  20. luminary_memory-0.3.3/package.json +42 -0
  21. luminary_memory-0.3.3/plugins/hermes/__init__.py +11 -0
  22. luminary_memory-0.3.3/plugins/hermes/dashboard/manifest.json +10 -0
  23. luminary_memory-0.3.3/plugins/hermes/dashboard/plugin_api.py +177 -0
  24. luminary_memory-0.3.3/plugins/hermes/desktop/plugin.js +722 -0
  25. luminary_memory-0.3.3/plugins/hermes/plugin.yaml +2 -0
  26. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/plugins/omp/README.md +19 -7
  27. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/plugins/omp/package.json +11 -2
  28. luminary_memory-0.3.3/plugins/opencode/README.md +182 -0
  29. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/plugins/opencode/package.json +19 -5
  30. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/plugins/pi/README.md +19 -7
  31. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/plugins/pi/package.json +5 -1
  32. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/pyproject.toml +7 -1
  33. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/scripts/build-plugins.mjs +49 -2
  34. luminary_memory-0.3.3/scripts/build-uis.mjs +37 -0
  35. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/scripts/bump-version.sh +50 -29
  36. luminary_memory-0.3.3/scripts/check-opencode-types.mjs +15 -0
  37. luminary_memory-0.3.3/scripts/opencode-gui.vite.mjs +13 -0
  38. luminary_memory-0.3.3/scripts/test-hermes-sdk.py +32 -0
  39. luminary_memory-0.3.3/scripts/test-installed-inspector.mjs +63 -0
  40. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/src/luminary_memory/__init__.py +1 -1
  41. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/src/luminary_memory/api.py +186 -86
  42. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/src/luminary_memory/backends/base.py +26 -3
  43. luminary_memory-0.3.3/src/luminary_memory/backends/inspector.py +341 -0
  44. luminary_memory-0.3.3/src/luminary_memory/backends/inspector_features.py +93 -0
  45. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/src/luminary_memory/backends/pgvector.py +69 -73
  46. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/src/luminary_memory/backends/sqlite.py +39 -38
  47. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/src/luminary_memory/cli.py +3 -1
  48. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/src/luminary_memory/config.py +154 -18
  49. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/src/luminary_memory/export.py +134 -72
  50. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/src/luminary_memory/hermes/activation.py +4 -38
  51. luminary_memory-0.3.3/src/luminary_memory/hermes/activity.py +39 -0
  52. luminary_memory-0.3.3/src/luminary_memory/hermes/cli.py +113 -0
  53. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/src/luminary_memory/hermes/config.py +33 -2
  54. luminary_memory-0.3.3/src/luminary_memory/hermes/config_schema.py +50 -0
  55. luminary_memory-0.3.3/src/luminary_memory/hermes/inspector.py +139 -0
  56. luminary_memory-0.3.3/src/luminary_memory/hermes/inspector_settings.py +64 -0
  57. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/src/luminary_memory/hermes/plugin.yaml +2 -2
  58. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/src/luminary_memory/hermes/provider.py +100 -103
  59. luminary_memory-0.3.3/src/luminary_memory/inspector/__init__.py +6 -0
  60. luminary_memory-0.3.3/src/luminary_memory/inspector/activity.py +64 -0
  61. luminary_memory-0.3.3/src/luminary_memory/inspector/assets/browser/app.js +831 -0
  62. luminary_memory-0.3.3/src/luminary_memory/inspector/assets/browser/index.html +19 -0
  63. luminary_memory-0.3.3/src/luminary_memory/inspector/assets/browser/style.css +1 -0
  64. luminary_memory-0.3.3/src/luminary_memory/inspector/authorization.py +96 -0
  65. luminary_memory-0.3.3/src/luminary_memory/inspector/contracts.py +104 -0
  66. luminary_memory-0.3.3/src/luminary_memory/inspector/explanations.py +98 -0
  67. luminary_memory-0.3.3/src/luminary_memory/inspector/features.py +42 -0
  68. luminary_memory-0.3.3/src/luminary_memory/inspector/identity.py +91 -0
  69. luminary_memory-0.3.3/src/luminary_memory/inspector/mutations.py +355 -0
  70. luminary_memory-0.3.3/src/luminary_memory/inspector/queries.py +274 -0
  71. luminary_memory-0.3.3/src/luminary_memory/inspector/service.py +120 -0
  72. luminary_memory-0.3.3/src/luminary_memory/inspector/settings.py +98 -0
  73. luminary_memory-0.3.3/src/luminary_memory/inspector/summary.py +20 -0
  74. luminary_memory-0.3.3/src/luminary_memory/inspector/transfer.py +234 -0
  75. luminary_memory-0.3.3/src/luminary_memory/inspector/web.py +237 -0
  76. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/src/luminary_memory/integrations/__init__.py +134 -40
  77. luminary_memory-0.3.3/src/luminary_memory/integrations/assets/common/bridge-source.ts +16 -0
  78. luminary_memory-0.3.3/src/luminary_memory/integrations/assets/common/console-actions.ts +202 -0
  79. luminary_memory-0.3.3/src/luminary_memory/integrations/assets/common/console-contract.ts +17 -0
  80. luminary_memory-0.3.3/src/luminary_memory/integrations/assets/common/console-controller.ts +99 -0
  81. luminary_memory-0.3.3/src/luminary_memory/integrations/assets/common/inspector-transport.ts +120 -0
  82. luminary_memory-0.3.3/src/luminary_memory/integrations/assets/common/terminal-view.ts +94 -0
  83. luminary_memory-0.3.3/src/luminary_memory/integrations/assets/compiled/hermes/__init__.py +11 -0
  84. luminary_memory-0.3.3/src/luminary_memory/integrations/assets/compiled/hermes/dashboard/dist/index.js +700 -0
  85. luminary_memory-0.3.3/src/luminary_memory/integrations/assets/compiled/hermes/dashboard/manifest.json +10 -0
  86. luminary_memory-0.3.3/src/luminary_memory/integrations/assets/compiled/hermes/dashboard/plugin_api.py +177 -0
  87. luminary_memory-0.3.3/src/luminary_memory/integrations/assets/compiled/hermes/desktop/plugin.js +722 -0
  88. luminary_memory-0.3.3/src/luminary_memory/integrations/assets/compiled/hermes/plugin.yaml +2 -0
  89. luminary_memory-0.3.3/src/luminary_memory/integrations/assets/compiled/omp/index.js +3 -0
  90. luminary_memory-0.3.3/src/luminary_memory/integrations/assets/compiled/opencode/gui-experimental.cjs +58 -0
  91. luminary_memory-0.3.3/src/luminary_memory/integrations/assets/compiled/opencode/index.js +1 -0
  92. luminary_memory-0.3.3/src/luminary_memory/integrations/assets/compiled/opencode/rpc.js +1 -0
  93. luminary_memory-0.3.3/src/luminary_memory/integrations/assets/compiled/opencode/tui.js +1 -0
  94. luminary_memory-0.3.3/src/luminary_memory/integrations/assets/compiled/pi/index.js +3 -0
  95. luminary_memory-0.3.3/src/luminary_memory/integrations/assets/omp/inspector.ts +83 -0
  96. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/src/luminary_memory/integrations/assets/omp/luminary.ts +39 -34
  97. luminary_memory-0.3.3/src/luminary_memory/integrations/assets/opencode/dialogs.tsx +59 -0
  98. luminary_memory-0.3.3/src/luminary_memory/integrations/assets/opencode/gui.tsx +203 -0
  99. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/src/luminary_memory/integrations/assets/opencode/luminary-memory.ts +101 -17
  100. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/src/luminary_memory/integrations/assets/opencode/package.json +2 -1
  101. luminary_memory-0.3.3/src/luminary_memory/integrations/assets/opencode/rpc.ts +14 -0
  102. luminary_memory-0.3.3/src/luminary_memory/integrations/assets/opencode/tui.tsx +117 -0
  103. luminary_memory-0.3.3/src/luminary_memory/integrations/assets/pi/inspector.ts +81 -0
  104. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/src/luminary_memory/integrations/assets/pi/luminary.ts +31 -28
  105. luminary_memory-0.3.3/src/luminary_memory/integrations/cli.py +275 -0
  106. luminary_memory-0.3.3/src/luminary_memory/integrations/inspector_cli.py +159 -0
  107. luminary_memory-0.3.3/src/luminary_memory/lifecycle/cleanup.py +67 -0
  108. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/src/luminary_memory/lifecycle/prune.py +19 -18
  109. luminary_memory-0.3.3/src/luminary_memory/recall/filters.py +20 -0
  110. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/src/luminary_memory/recall/graph.py +2 -2
  111. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/src/luminary_memory/recall/semantic.py +43 -5
  112. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/src/luminary_memory/schema.py +26 -8
  113. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/src/luminary_memory/types.py +16 -0
  114. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/tests/conftest.py +16 -0
  115. luminary_memory-0.3.3/tests/hermes/conftest.py +14 -0
  116. luminary_memory-0.3.3/tests/hermes/test_cli_owner_commands.py +176 -0
  117. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/tests/hermes/test_config.py +9 -27
  118. luminary_memory-0.3.3/tests/hermes/test_inspector_api.py +89 -0
  119. luminary_memory-0.3.3/tests/hermes/test_inspector_settings.py +100 -0
  120. luminary_memory-0.3.3/tests/hermes/test_native_contract.py +384 -0
  121. luminary_memory-0.3.3/tests/hermes/test_native_execution.py +81 -0
  122. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/tests/hermes/test_provider_context.py +8 -25
  123. luminary_memory-0.3.3/tests/hermes/test_session_resolution.py +174 -0
  124. luminary_memory-0.3.3/tests/hermes/ui.test.mjs +115 -0
  125. luminary_memory-0.3.3/tests/inspector/conftest.py +112 -0
  126. luminary_memory-0.3.3/tests/inspector/test_activity.py +142 -0
  127. luminary_memory-0.3.3/tests/inspector/test_embedded_service.py +46 -0
  128. luminary_memory-0.3.3/tests/inspector/test_explanations.py +188 -0
  129. luminary_memory-0.3.3/tests/inspector/test_identity.py +52 -0
  130. luminary_memory-0.3.3/tests/inspector/test_inspector_process.py +342 -0
  131. luminary_memory-0.3.3/tests/inspector/test_mutations.py +321 -0
  132. luminary_memory-0.3.3/tests/inspector/test_permissions.py +123 -0
  133. luminary_memory-0.3.3/tests/inspector/test_queries.py +64 -0
  134. luminary_memory-0.3.3/tests/inspector/test_relations.py +74 -0
  135. luminary_memory-0.3.3/tests/inspector/test_settings.py +93 -0
  136. luminary_memory-0.3.3/tests/inspector/test_summary.py +77 -0
  137. luminary_memory-0.3.3/tests/inspector/test_transfer.py +280 -0
  138. luminary_memory-0.3.3/tests/inspector/test_transport.py +146 -0
  139. luminary_memory-0.3.3/tests/inspector/test_web.py +72 -0
  140. luminary_memory-0.3.3/tests/inspector/test_web_transport.py +275 -0
  141. luminary_memory-0.3.3/tests/plugins/context.test.mjs +123 -0
  142. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/tests/plugins/packages.test.mjs +29 -6
  143. luminary_memory-0.3.3/tests/test_agent_integrations.py +448 -0
  144. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/tests/test_api_extended.py +13 -12
  145. luminary_memory-0.3.3/tests/test_backend_contract.py +121 -0
  146. luminary_memory-0.3.3/tests/test_backend_pgvector.py +248 -0
  147. luminary_memory-0.3.3/tests/test_config_file.py +152 -0
  148. luminary_memory-0.3.3/tests/test_integration_cli.py +94 -0
  149. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/tests/test_query_expansion.py +68 -0
  150. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/tests/test_schema.py +42 -9
  151. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/tests/test_soak_behaviour.py +0 -1
  152. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/tests/test_strict_recall_calibration.py +7 -5
  153. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/tests/test_t10_export.py +131 -0
  154. luminary_memory-0.3.3/tests/ui/controller.test.mjs +175 -0
  155. luminary_memory-0.3.3/tests/ui/installed-consumer.ts +69 -0
  156. luminary_memory-0.3.3/ui/browser/app.ts +235 -0
  157. luminary_memory-0.3.3/ui/hermes/console.mjs +382 -0
  158. luminary_memory-0.3.3/ui/hermes/dashboard.mjs +51 -0
  159. luminary_memory-0.3.3/ui/hermes/desktop.mjs +64 -0
  160. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/website/docs.html +2 -2
  161. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/website/index.html +3 -3
  162. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/website/js/docs-guides.js +12 -10
  163. luminary_memory-0.3.2/package.json +0 -19
  164. luminary_memory-0.3.2/plugins/opencode/README.md +0 -118
  165. luminary_memory-0.3.2/src/luminary_memory/hermes/config_schema.py +0 -61
  166. luminary_memory-0.3.2/src/luminary_memory/integrations/cli.py +0 -130
  167. luminary_memory-0.3.2/src/luminary_memory/lifecycle/cleanup.py +0 -65
  168. luminary_memory-0.3.2/tests/test_agent_integrations.py +0 -160
  169. luminary_memory-0.3.2/tests/test_backend_pgvector.py +0 -416
  170. luminary_memory-0.3.2/tests/test_t1_hnsw.py +0 -54
  171. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  172. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  173. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  174. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/.github/workflows/contributor-check.yml +0 -0
  175. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/.github/workflows/pages.yml +0 -0
  176. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/.github/workflows/stale.yml +0 -0
  177. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/.github/workflows/triage.yml +0 -0
  178. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/CODE_OF_CONDUCT.md +0 -0
  179. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/DESIGN.md +0 -0
  180. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/LICENSE +0 -0
  181. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/PRODUCT.md +0 -0
  182. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/SECURITY.md +0 -0
  183. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/benchmarks/__init__.py +0 -0
  184. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/benchmarks/baselines/gold-real-v1.json +0 -0
  185. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/benchmarks/baselines/gold-real-v2.json +0 -0
  186. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/benchmarks/build_gold_extended.py +0 -0
  187. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/benchmarks/gold.py +0 -0
  188. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/benchmarks/gold_extended.jsonl +0 -0
  189. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/benchmarks/gold_micro.jsonl +0 -0
  190. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/benchmarks/hermes_provider_bench.py +0 -0
  191. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/benchmarks/metrics.py +0 -0
  192. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/benchmarks/synthetic.py +0 -0
  193. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/hermes/README.md +0 -0
  194. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/hermes/hooks/luminary-activity/HOOK.yaml +0 -0
  195. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/hermes/hooks/luminary-activity/README.md +0 -0
  196. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/hermes/hooks/luminary-activity/handler.py +0 -0
  197. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/hermes/test.sh +0 -0
  198. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/scripts/pack-plugins.mjs +0 -0
  199. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/scripts/repair_memory_authority.py +0 -0
  200. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/scripts/smoke-real-model.py +0 -0
  201. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/scripts/soak-test.py +0 -0
  202. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/src/luminary_memory/backends/__init__.py +0 -0
  203. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/src/luminary_memory/budget.py +0 -0
  204. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/src/luminary_memory/embeddings/__init__.py +0 -0
  205. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/src/luminary_memory/embeddings/fastembed.py +0 -0
  206. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/src/luminary_memory/hermes/__init__.py +0 -0
  207. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/src/luminary_memory/ingest/__init__.py +0 -0
  208. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/src/luminary_memory/ingest/llm.py +0 -0
  209. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/src/luminary_memory/ingest/rules.py +0 -0
  210. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/src/luminary_memory/ingest/whitelist.py +0 -0
  211. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/src/luminary_memory/integrations/__main__.py +0 -0
  212. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/src/luminary_memory/lifecycle/__init__.py +0 -0
  213. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/src/luminary_memory/lifecycle/consolidate.py +0 -0
  214. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/src/luminary_memory/lifecycle/importance.py +0 -0
  215. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/src/luminary_memory/lifecycle/runner.py +0 -0
  216. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/src/luminary_memory/recall/__init__.py +0 -0
  217. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/src/luminary_memory/recall/dedup.py +0 -0
  218. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/src/luminary_memory/recall/fusion.py +0 -0
  219. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/src/luminary_memory/recall/keyword.py +0 -0
  220. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/src/luminary_memory/recall/planner.py +0 -0
  221. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/src/luminary_memory/recall/snippets.py +0 -0
  222. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/src/luminary_memory/recall/temporal.py +0 -0
  223. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/src/luminary_memory/scope.py +0 -0
  224. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/tests/__init__.py +0 -0
  225. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/tests/hermes/test_activation.py +0 -0
  226. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/tests/hermes/test_activity_hook.py +0 -0
  227. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/tests/hermes/test_authority_lifecycle.py +0 -0
  228. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/tests/hermes/test_autonomous_review.py +0 -0
  229. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/tests/hermes/test_backup_paths.py +0 -0
  230. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/tests/hermes/test_context_continuity.py +0 -0
  231. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/tests/hermes/test_core_memory.py +0 -0
  232. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/tests/hermes/test_entrypoint.py +0 -0
  233. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/tests/hermes/test_hooks.py +0 -0
  234. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/tests/hermes/test_lifecycle.py +0 -0
  235. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/tests/hermes/test_long_term_stability.py +0 -0
  236. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/tests/hermes/test_pre_compress.py +0 -0
  237. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/tests/hermes/test_provider_import.py +0 -0
  238. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/tests/hermes/test_recall.py +0 -0
  239. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/tests/hermes/test_recall_smartness.py +0 -0
  240. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/tests/hermes/test_session_boundaries.py +0 -0
  241. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/tests/hermes/test_sync_turn.py +0 -0
  242. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/tests/hermes/test_system_prompt.py +0 -0
  243. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/tests/hermes/test_tools.py +0 -0
  244. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/tests/hermes/test_transparency_log.py +0 -0
  245. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/tests/hermes_stubs/agent/memory_provider.py +0 -0
  246. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/tests/test_accuracy_safety.py +0 -0
  247. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/tests/test_api.py +0 -0
  248. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/tests/test_backend_sqlite.py +0 -0
  249. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/tests/test_budget.py +0 -0
  250. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/tests/test_cli.py +0 -0
  251. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/tests/test_dedup_jaccard.py +0 -0
  252. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/tests/test_embeddings.py +0 -0
  253. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/tests/test_fusion.py +0 -0
  254. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/tests/test_fusion_rrf.py +0 -0
  255. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/tests/test_gold_benchmark.py +0 -0
  256. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/tests/test_importance.py +0 -0
  257. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/tests/test_ingest_llm.py +0 -0
  258. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/tests/test_ingest_whitelist.py +0 -0
  259. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/tests/test_lifecycle.py +0 -0
  260. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/tests/test_llm_enricher.py +0 -0
  261. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/tests/test_long_term_stability.py +0 -0
  262. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/tests/test_memory_authority_migration.py +0 -0
  263. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/tests/test_recall_adaptive.py +0 -0
  264. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/tests/test_recall_graph.py +0 -0
  265. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/tests/test_recall_keyword.py +0 -0
  266. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/tests/test_recall_orchestrator.py +0 -0
  267. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/tests/test_recall_semantic.py +0 -0
  268. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/tests/test_recall_temporal.py +0 -0
  269. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/tests/test_scope_boundaries.py +0 -0
  270. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/tests/test_t11_limit_zero.py +0 -0
  271. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/tests/test_t3_planner.py +0 -0
  272. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/tests/test_t4_batch.py +0 -0
  273. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/tests/test_t5_enricher.py +0 -0
  274. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/tests/test_t6_tag_scoped.py +0 -0
  275. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/tests/test_t7_updated_at.py +0 -0
  276. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/tests/test_t8_snippets.py +0 -0
  277. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/tests/test_t9_cli_json.py +0 -0
  278. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/tests/test_validity_window.py +0 -0
  279. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/website/.nojekyll +0 -0
  280. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/website/assets/full-moon.jpg +0 -0
  281. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/website/css/docs.css +0 -0
  282. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/website/css/luminary.css +0 -0
  283. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/website/js/docs-content.js +0 -0
  284. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/website/js/docs-page.js +0 -0
  285. {luminary_memory-0.3.2 → luminary_memory-0.3.3}/website/js/luminary.js +0 -0
@@ -82,7 +82,7 @@ jobs:
82
82
  run: ruff check src tests hermes/hooks
83
83
  - name: Run pgvector integration tests
84
84
  env:
85
- LUMINARY_PG_DSN: postgresql://luminary:luminary@localhost:5432/luminary
85
+ PG_DSN: postgresql://luminary:luminary@localhost:5432/luminary
86
86
  run: >-
87
87
  python -m coverage run --source=src/luminary_memory/backends
88
88
  -m pytest -q tests/test_backend_pgvector.py
@@ -45,7 +45,9 @@ jobs:
45
45
  node-version: "22"
46
46
  check-latest: true
47
47
  - run: npm ci --ignore-scripts
48
- - run: npm run build:plugins
48
+ - run: npm run build
49
+ - run: npm run check:opencode
50
+ - run: npm run test:ui-contracts
49
51
  - run: npm run test:plugins
50
52
  - run: npm run pack:plugins
51
53
  - name: Check complete, version-matched release tarballs
@@ -78,6 +80,53 @@ jobs:
78
80
  name: native-plugin-packages
79
81
  path: artifacts/plugins/*.tgz
80
82
  if-no-files-found: error
83
+ - name: Upload complete wheel resources
84
+ uses: actions/upload-artifact@v4
85
+ with:
86
+ name: inspector-resources
87
+ path: |
88
+ src/luminary_memory/integrations/assets/compiled/
89
+ src/luminary_memory/inspector/assets/browser/
90
+ if-no-files-found: error
91
+
92
+ python-native-contracts:
93
+ name: Test Python against the official Hermes SDK
94
+ needs: [native-packages]
95
+ runs-on: ubuntu-latest
96
+ steps:
97
+ - uses: actions/checkout@v4
98
+ - uses: actions/checkout@v4
99
+ with:
100
+ repository: NousResearch/hermes-agent
101
+ ref: v0.22.5
102
+ path: .native-sdk/hermes-agent
103
+ - uses: actions/setup-python@v5
104
+ with:
105
+ python-version: "3.11"
106
+ cache: pip
107
+ - name: Install test and native HTTP dependencies
108
+ # Hermes 0.22.5 imports hermes_yaml, which requires ruamel.yaml.
109
+ run: python -m pip install -e ".[dev]" fastapi httpx python-multipart "ruamel.yaml==0.18.16"
110
+ - uses: actions/setup-node@v4
111
+ with:
112
+ node-version: "22"
113
+ check-latest: true
114
+ - name: Install the consumer-test build toolchain
115
+ run: npm ci --ignore-scripts
116
+ - name: Download validated native and UI resources
117
+ uses: actions/download-artifact@v4
118
+ with:
119
+ name: inspector-resources
120
+ path: src/luminary_memory
121
+ - name: Build and install a separate inspector consumer wheel
122
+ run: |
123
+ python -m build --wheel --outdir "$RUNNER_TEMP/inspector-wheel"
124
+ python -m venv "$RUNNER_TEMP/inspector-wheel-env"
125
+ "$RUNNER_TEMP/inspector-wheel-env/bin/python" -m pip install "$RUNNER_TEMP/inspector-wheel/"*.whl
126
+ - name: Require the real SDK and run the Python suite
127
+ env:
128
+ INSPECTOR_INSTALLED_PYTHON: ${{ runner.temp }}/inspector-wheel-env/bin/python
129
+ run: python scripts/test-hermes-sdk.py .native-sdk/hermes-agent -q
81
130
 
82
131
  real-model:
83
132
  # Release gate. Runs public strict recall against the real default
@@ -108,7 +157,7 @@ jobs:
108
157
  if-no-files-found: ignore
109
158
 
110
159
  pypi:
111
- needs: [real-model, native-packages]
160
+ needs: [real-model, native-packages, python-native-contracts]
112
161
  runs-on: ubuntu-latest
113
162
  environment:
114
163
  name: pypi
@@ -122,6 +171,11 @@ jobs:
122
171
  with:
123
172
  python-version: "3.11"
124
173
  cache: pip
174
+ - name: Download validated native and UI resources
175
+ uses: actions/download-artifact@v4
176
+ with:
177
+ name: inspector-resources
178
+ path: src/luminary_memory
125
179
  - name: Build sdist and wheel
126
180
  run: |
127
181
  python -m pip install --upgrade pip
@@ -117,3 +117,6 @@ website/*.png
117
117
 
118
118
  # ---- Internal plan files ----
119
119
  website/plan.md
120
+
121
+ # Private implementation plans, runtime probes and acceptance captures
122
+ .superpowers/
@@ -0,0 +1,6 @@
1
+ # Repository instructions
2
+
3
+ ## GitHub releases
4
+
5
+ Write structured, human-readable release notes. Before creating or editing a
6
+ GitHub release, follow **Release notes style** in `CONTRIBUTING.md`.
@@ -1,6 +1,225 @@
1
1
  # Changelog
2
2
 
3
- ## [Unreleased]
3
+ ## [0.3.3] - 2026-11-10
4
+
5
+ Interactive memory inspection, explicit owner controls and safer native recall.
6
+ This version includes only the verified native surfaces and the opt-in loopback
7
+ companion; the interactive UI roadmap is incomplete.
8
+
9
+ ### Compatibility
10
+
11
+ - Native OpenCode Web GUI discovery remains unsupported. Server tools remain
12
+ separate from a client-native inspector; the companion is not a Web plugin.
13
+ - Hermes CLI/TUI inspector rendering remains blocked on authenticated native
14
+ context and scope lifecycle. Existing provider and command integrations remain
15
+ separate from that unfinished visual target.
16
+
17
+ ### Added
18
+
19
+ - Optional operator config file (`~/.luminary/luminary.env`) shared by native
20
+ integrations and the CLI. Env-style `LUMINARY_*` settings load before
21
+ `Settings` is constructed; process environment wins, `LUMINARY_CONFIG_FILE`
22
+ overrides the path or disables loading with `none`/`off`, and edits apply on
23
+ the next bridge call without restarting the host.
24
+ - Portable OpenCode agent skill (`opencode/SKILL.md`) covering scoped recall,
25
+ user-approved durable writes, ID-scoped retraction, result semantics,
26
+ configuration, and bridge troubleshooting. Install it under
27
+ `~/.config/opencode/skills/luminary-memory/` or a project's `.opencode/skills/`.
28
+ - Authorized memory inspector service with bounded browse/detail/history,
29
+ explicit project bindings and independent sharing capabilities. Confirmed
30
+ corrections preserve ownership and create successor versions; stale revisions
31
+ and revoked proposals fail closed instead of overwriting newer content.
32
+ - Explicit optional loopback inspector with nine views, deterministic Summary,
33
+ separate owner confirmations, one-use sign-in, session cookies and same-origin
34
+ CSRF protection. Installing or opening a UI does not enable saving or call AI.
35
+ - Complete compiled native-package installation instead of copying an orphaned
36
+ TypeScript entry. Unapproved local changes are preserved, and owned legacy
37
+ hooks require an explicit cutover to prevent duplicate loading.
38
+ - Keyboard-accessible entity neighborhoods and supporting-memory inspection.
39
+ Recall Activity records actual retrieval rank/score separately from returned
40
+ context order; unrelated core rows cannot turn native recall abstention into success.
41
+ - Summary includes authorized lifecycle counts and stored created/updated
42
+ timestamp bounds in UTC, including offset-aware ordering and microseconds.
43
+ Missing or invalid timestamp coverage is explicit; refresh remains offline.
44
+
45
+ ### Fixed
46
+
47
+ - Inspector dispatch resolves storage and other settings from the same supplied
48
+ launcher environment and config as the authorized context, without mutating
49
+ the process environment. Config files cannot provide trusted inspector channels.
50
+ A conflicting launcher home or unavailable selected config fails closed, and
51
+ `~` SQLite paths resolve before the store is opened.
52
+ - The companion treats non-object JSON from the inspector process as a bounded,
53
+ redacted failure, distinguishing read failures from unknown mutation outcomes.
54
+ - The release workflow installs the YAML dependency required to import the
55
+ official Hermes SDK in a clean environment.
56
+ - OpenCode's compact inspector shows bounded, server-reported record permissions;
57
+ native session, policy and explicit-project changes discard stale snapshots.
58
+ Read-only shared projects no longer display the previous project's edit rights.
59
+ Native sharing cards identify the granting agent, recipient and capabilities.
60
+ - The opt-in browser companion includes scoped record permissions in compact
61
+ mode, limits activity rendering to five events and clears the overview when
62
+ its project selection changes.
63
+ - Hermes UI installation ignores generated Python bytecode without replacing
64
+ profile-owned caches or activating a provider. Wheels include only required
65
+ native/UI resources, so incidental `__pycache__` files cannot break installation.
66
+ - Hermes panels inherit native text colors and use documented host border
67
+ tokens; dashboard themes can no longer turn the whole inspector transparent.
68
+ - Hermes tab navigation and refresh select the requested backend projection.
69
+ Sharing displays grants instead of memory rows; memory filters stay limited
70
+ to the views that actually support them.
71
+ - Hermes session admission loads the selected view immediately, including the
72
+ native plugin settings page, rather than presenting browse rows as settings.
73
+ - Hermes REST inspectors preserve their bound scope through socket reconnects;
74
+ only native session, profile and gateway activation changes invalidate it.
75
+ - Hermes compact views now show read-only context, server-reported record
76
+ permissions, up to five activity events, and a full-inspector entry instead
77
+ of squeezing all tabs and mutation forms into a sidebar.
78
+ - The dashboard overview uses the rendered native `pre-main` slot, behind an
79
+ explicit open/close control, rather than the unmounted `sidebar` slot.
80
+ - omp headless RPC returns the scoped inspector state instead of silently
81
+ discarding it through unavailable dialogs. UI-enabled RPC keeps its native
82
+ dialogs; neither mode constructs terminal components. Acceptance was
83
+ re-verified on the currently installed omp **18.18.5** with a copy-installed
84
+ extension: `/luminary full` JSON state over a seeded store, headless RPC state
85
+ delivery, and UI-enabled RPC opening all nine native dialogs.
86
+ - Native OpenCode Summary keeps authorized lifecycle totals and UTC time bounds
87
+ visible even when recent changes are present. Activity and Relations now use
88
+ the same operational and supporting-memory labels as the pi/omp inspector.
89
+ - Sharing now lists the native actor's incoming/outgoing grants rather than
90
+ unrelated memory rows. Project, user and actor filtering happens before SQL
91
+ pagination; capability lists remain independent and browsing grants no access.
92
+ - Inspector headers expose secret-safe native agent/profile/store/host labels,
93
+ not frontend-selected identity or the native bearer. Long pi/omp terminal
94
+ proposals use a scrollable review and a separate Cancel-first confirmation;
95
+ narrow terminals no longer hide the decision below a long proposal.
96
+ - Terminal memory rows identify lifecycle state and revision, including deleted
97
+ and superseded records explicitly requested through status filters. Memory
98
+ search controls appear only on supported views; shared-resource selection
99
+ does not offer native-own-project policy mutations.
100
+ - Concurrent store startup now keeps inspector schema inspection and migration
101
+ under the existing cross-process writer transaction. Independent SQLite
102
+ workers no longer race to add the same audit-ownership column.
103
+ - Native recall preserves the engine's abstention and returns only relevant,
104
+ current rows, including core-tagged rows only when retrieval selects them.
105
+ Reference data stays outside system instructions, is request-local, and is
106
+ serialized once as complete records. Empty recall adds no model message or
107
+ transcript entry in OpenCode, pi, or omp.
108
+ - Native model writes require a bounded quote verified against current user
109
+ input by the adapter, not self-evidence or a model-supplied confirmation flag.
110
+ Per-call launcher provenance cannot be restored from an operator config file.
111
+ User-grounded paraphrases retain their original quote without invented full
112
+ confidence; owner-typed commands remain explicit assertions. Core/rule
113
+ promotion uses the owner-confirmed inspector. Existing records are not
114
+ retroactively re-certified or rewritten.
115
+ - Structural transcript-noise filtering now runs in shared API/CLI/bridge
116
+ retrieval as well as Hermes. Short legitimate facts remain eligible.
117
+ Destructive-verb suppression is not reinstated; no language keyword list
118
+ decides whether a live user request may recall.
119
+ - Precompiled OpenCode TUI binds Solid/OpenTUI imports to the host's shared
120
+ runtime instead of creating an independent reactive owner and a blank panel.
121
+ Native review dialogs keep the decision visible while complete proposals
122
+ scroll; cancellation is the default.
123
+ - OpenCode copy installation now explicitly tells the operator to install its
124
+ declared Node dependencies before restart. It does not silently run npm or
125
+ download memory models.
126
+
127
+ - Denied inspector responses now refresh their reference time and context
128
+ metadata while clearing inaccessible content, rather than retaining the
129
+ preceding successful read's timestamp.
130
+ - Direct npm packaging keeps compiler diagnostics on stderr, preserving valid
131
+ machine-readable `npm pack --json` output without hiding build warnings.
132
+ - Native Hermes settings include backend/model configuration and separate
133
+ readiness information without exposing profile credentials. Profile-local
134
+ changes survive restart; unrelated settings do not implicitly enable saving
135
+ or modify sibling profiles.
136
+ - Optional explanation requires a nonblank model selection before disclosure;
137
+ a configured URL alone is not reported as a configured explanation.
138
+
139
+ - Inspector graph reads stay in the selected PostgreSQL schema. A missing graph
140
+ table now reports unavailable instead of silently reading a fallback table.
141
+ - Hermes pagination preserves the original operation, project and filters.
142
+ Context/project changes discard the cursor rather than replaying an old page.
143
+
144
+ - Hermes provider Activity now separates durable saves, duplicate suppression,
145
+ skipped curation, session episodes and recall. Duplicate writes no longer
146
+ claim a new save; replaying an episode does not claim another insertion.
147
+ Queued retention keeps its original session. Prepared context is not reported
148
+ as confirmed model delivery, and operational events do not inflate Summary
149
+ changes or copy raw prompts into Activity.
150
+
151
+ - PostgreSQL entity expansion now groups unique authorized neighbor names and
152
+ ranks their strongest edges. The previous `DISTINCT`/`ORDER BY` combination
153
+ was rejected by PostgreSQL and silently left the query unexpanded; duplicate
154
+ edges no longer make ranking ambiguous.
155
+ - Native bridge recalls now append scoped start/result/error/cancellation events
156
+ without storing raw queries or exception text. Activity replay preserves the
157
+ same source/session/reference metadata; recall never claims a saved memory or
158
+ confirmed injection, and Summary excludes recall events before pagination.
159
+ - Activity checkpoints bind replay to the native session, project and current
160
+ access policy. Missing witnessed history raises a visible gap instead of a
161
+ healthy empty result. “Check new activity” loads only unseen events; Refresh
162
+ resets to a recent snapshot without replaying writes.
163
+ - Memory-record exports retain source IDs, and imports remap predecessor links
164
+ instead of treating source IDs as destination IDs. Invalid/cyclic lineage is
165
+ rejected; lineage imports roll back on incompatible duplicates or audit
166
+ failure. Independent owners and sessions are no longer collapsed by import
167
+ deduplication, and inspector receipts separate actual saves from duplicates.
168
+ Re-importing an unchanged version chain reuses its original ancestors;
169
+ historical source IDs and creation timestamps prevent merging distinct
170
+ observations.
171
+ - Export/native-settings failures after external persistence starts now report
172
+ an unknown outcome, including lost commit acknowledgements. SQL rollback is
173
+ not presented as proof that a selected file or profile stayed unchanged.
174
+ - SQLite keyword indexes now update only when content or tags change. This
175
+ prevents nested content-revision updates from deleting FTS entries twice;
176
+ existing update triggers and derived indexes migrate on the next store open.
177
+ - Confirmed inspector creation preserves the verified native session in both
178
+ the record and durable audit, and distinguishes saved records from duplicates.
179
+ Corrections attribute the new observation to the verified current session
180
+ and a distinct inspector source ID without changing the original ownership.
181
+ Explicit cross-session versioning updates the predecessor and keeps stale
182
+ editor protection; session-bound clients still cannot cross that boundary.
183
+ - Optional AI explanations consume disclosure consent before sending, reject
184
+ redirects, and release database locks during provider calls. Revocation or
185
+ changed facts discard stale responses; model text has no tool/write authority.
186
+ - Telegram activity no longer treats global new memory IDs as this turn's
187
+ writes. Routing, profile-local secrets, exact ownership/session cursors,
188
+ expiry/validity filtering, evidence/ID visibility, and acknowledgement of
189
+ displayed rows prevent cross-chat disclosure and silent backlog loss.
190
+ - Telegram cursor locking now works on Windows and POSIX, fails closed, and
191
+ never yields a contextmanager body twice after a delivery/state failure.
192
+ - **Query expansion no longer decides what answers a question.** Expanded text
193
+ appends entity names harvested from the graph neighbourhood of a shared
194
+ entity, and those names usually belong to the neighbour memory itself, so
195
+ scoring against them let a memory supply its own evidence: one shared entity
196
+ lifted an unrelated memory from `0.5436` to `0.8024` and made "what is the
197
+ cluster fingerprint?" return a memory about load tests. Expansion now only
198
+ selects candidates; every candidate is scored against the question as asked.
199
+ The reported documentation-URL answer for "where will Luminary go live now?"
200
+ is gone, and `tests/test_query_expansion.py` pins it through public
201
+ `MemoryClient.recall`.
202
+ - **Dense similarity decides support, not the loudest signal.** Keyword and
203
+ graph scores saturate (an FTS `bm25` of 2.6 and a graph weight of 8.0 both
204
+ normalise to 1.0), so `max(...)` let one shared word outrank the question.
205
+ They now stand in only for rows without a usable embedding. Combined with the
206
+ scoring change this takes micro recall@10 from `0.70` to `0.85` at
207
+ `wrong_hit_rate` `0.00`, and lifts extended-fixture abstention from `0.33` to
208
+ `1.00`.
209
+ - **The support floor is re-measured, not re-tuned.** `0.74` was chosen while
210
+ expansion could raise a score; on the raw-query scale the highest confident
211
+ wrong answer is `0.5991` and the lowest correct answer `0.6439`, so the floor
212
+ is their midpoint, `0.635`. Nothing outside that gap could be correct.
213
+ - **Tokenisation no longer swallows sentence-final punctuation.** `_token_set`
214
+ keeps `.` `:` `/` inside a token so identifiers such as `gpt-4o` and URLs
215
+ survive, but the same pattern absorbed the last word of every memory
216
+ (`production.`, `cluster.`), which could never match a query token
217
+ (`production`, `cluster`). Matching bug only; no benchmark metric moves.
218
+ - **A weakly-grounded row no longer pads a well-grounded answer.** When a
219
+ candidate covers at least half the question's tokens, rows that cover almost
220
+ none are dropped instead of being returned alongside it.
221
+
222
+ ## [0.3.2] - 2026-10-25
4
223
 
5
224
  ### Added
6
225
 
@@ -181,6 +400,13 @@ Cloudflare-protected gateways.
181
400
  provider/runtime boundary, hook cursor resolution, and the current `505`
182
401
  regression baseline.
183
402
 
403
+ ### Removed
404
+
405
+ - **Destructive-imperative recall suppression** was removed in `f303511`.
406
+ The old Hermes query-word heuristic introduced in 0.2.18 did not remain
407
+ active in 0.3.0. This entry corrects the missing removal history; it does
408
+ not claim an unrecorded rationale or restore that heuristic.
409
+
184
410
  ### Tests & documentation
185
411
 
186
412
  - Added scope, lifecycle, hash-repair, claim-rollback, inactive-hook, and
@@ -211,12 +437,13 @@ Cloudflare-protected gateways.
211
437
 
212
438
  ### Added
213
439
 
214
- - **Recall noise filter** — shell/terminal artifacts (`&&`, `===`, `echo `,
215
- etc.) and near-empty content are dropped before they can pollute context.
216
- - **Destructive-imperative suppression** — a query that is a destructive
217
- instruction (`hapus`, `delete`, `remove`, `stop`, `disable`, ...) suppresses
218
- the recall block so the agent follows the instruction instead of re-anchoring
219
- on the stored topic.
440
+ - **Hermes recall noise filter** — shell/terminal artifacts (`&&`, `===`,
441
+ `echo `, etc.) and near-empty content were dropped by the provider formatter.
442
+ This was not yet filtering on the shared API/CLI retrieval path.
443
+ - **Destructive-imperative suppression (historical)** — Hermes suppressed
444
+ recall for destructive instructions (`hapus`, `delete`, `remove`, `stop`,
445
+ `disable`, ...). This query-word heuristic was removed in 0.3.0; see Removed
446
+ above. It is not the current recall policy.
220
447
  - **Scoped claim/evidence schema** — ownership fields, episodes, claims,
221
448
  claim evidence, memory evidence, conflict/supersession status, and
222
449
  `needs_reindex` repair state are migrated idempotently for existing SQLite
@@ -76,8 +76,9 @@ separate from the package tests.
76
76
 
77
77
  ## Release gate
78
78
 
79
- Tagging `v*` publishes to PyPI through `.github/workflows/publish.yml`, and
80
- `pypi` has a hard prerequisite: the `real-model` job. It runs
79
+ Tagging `v*` publishes to PyPI through `.github/workflows/publish.yml`.
80
+ `pypi` requires the `real-model`, `native-packages`, and
81
+ `python-native-contracts` jobs. The real-model gate runs:
81
82
 
82
83
  ```bash
83
84
  python scripts/smoke-real-model.py --report real-model-gate.json
@@ -119,8 +120,8 @@ before committing the release changes and creating the matching `vX.Y.Z` tag.
119
120
  The publish workflow builds, tests and packs native plugins, checks that every
120
121
  manifest matches `pyproject.toml`, and verifies the exact three nonempty
121
122
  tarballs contain a built entry point, README and license. Tag releases must
122
- also match `v<version>`. Both this package job and the existing real-model gate
123
- must pass before PyPI publication. After PyPI succeeds, tag pushes attach the
123
+ also match `v<version>`. The package, real-model, and official Hermes SDK
124
+ contract gates must pass before PyPI publication. After PyPI succeeds, tag pushes attach the
124
125
  Hermes skill zip and those exact `.tgz` files to the GitHub release, even when
125
126
  npm publication is disabled. Missing or mismatched packages fail closed.
126
127
 
@@ -129,6 +130,20 @@ same gates and builds, but does not create GitHub release assets or publish to
129
130
  npm, even if dispatched from a tag. A tag push, not a manual dispatch, is
130
131
  required for those external release actions.
131
132
 
133
+ ### Release notes style
134
+
135
+ Write structured, human-readable notes for the actual release: a descriptive
136
+ version title, a short summary, and readable `##` feature sections with normal
137
+ prose and focused bullets. These formatting rules are version-independent.
138
+
139
+ Never leave a published release empty or asset-only. Do not use small/subscript
140
+ HTML, wrap the whole description in a code block, or substitute a raw commit
141
+ dump for release notes. Reserve code blocks for short installation commands.
142
+ State only shipped behavior and verified registry availability.
143
+
144
+ The workflow attaching assets does not finish the release. Fill in the release
145
+ notes and inspect the actual GitHub rendering before reporting completion.
146
+
132
147
  ### Optional npm trusted publishing
133
148
 
134
149
  npm publication is **disabled unless** the repository Actions variable
@@ -193,10 +208,11 @@ publication must continue to use the validated release tarballs.
193
208
  - TDD where feasible, test first, then implement.
194
209
  - Keep the public API (`MemoryClient`) stable; add rather than break.
195
210
  - Full-source coverage is reported and must not regress from the current
196
- evidence-backed baseline (`83%`, 5,037 statements). Every changed behavior
197
- needs a targeted regression or invariant test; do not inflate coverage with
198
- tests that only execute lines without checking outcomes. PostgreSQL-only
199
- branches are verified separately by the pgvector integration job.
211
+ evidence-backed baseline (`83%`, 5,092 statements, 876 missed). Every changed
212
+ behavior needs a targeted regression or invariant test; do not inflate
213
+ coverage with tests that only execute lines without checking outcomes.
214
+ PostgreSQL-only branches are verified separately by the pgvector integration
215
+ job.
200
216
 
201
217
  ### Long-run checks
202
218
 
@@ -247,7 +263,7 @@ contributor communication; keep it concise and in your own voice.
247
263
  Run the full suite (SQLite + unit tests) locally:
248
264
 
249
265
  ```bash
250
- python -m pytest # 505 passed, 3 skipped at the current baseline
266
+ python -m pytest
251
267
  python -m ruff check src tests hermes/hooks
252
268
  ```
253
269
 
@@ -257,17 +273,58 @@ Coverage (full-source baseline):
257
273
  python -m pytest --cov=luminary_memory --cov-report=term
258
274
  ```
259
275
 
260
- The current local baseline is `83%` (`5,037` statements, `881` missed). The
276
+ The current local baseline is `541 passed, 3 skipped` at `83%` (`5,092`
277
+ statements, `876` missed). The
261
278
  number is intentionally reported honestly while the defensive PostgreSQL and
262
279
  failure branches continue to receive integration coverage; the quality gate
263
280
  is the invariant-focused test suite plus the CI/verification coverage gate
264
281
  `--fail-under=82`.
265
282
 
283
+ ### Official Hermes SDK contracts
284
+
285
+ Standalone tests skip native schema cases when Hermes is not installed; they
286
+ never install a production SDK substitute. To exercise those cases, use an
287
+ official source checkout matching the supported host:
288
+
289
+ ```bash
290
+ git clone --depth 1 --branch v0.22.5 https://github.com/NousResearch/hermes-agent.git ../hermes-agent-sdk
291
+ python -m pip install -e ".[dev]" fastapi httpx python-multipart
292
+ python scripts/test-hermes-sdk.py ../hermes-agent-sdk -q
293
+ ```
294
+
295
+ The runner imports the real provider/config SDK before pytest, verifies that
296
+ both modules came from that checkout, and uses a temporary Hermes home. Missing
297
+ or incompatible SDK modules fail the run before native cases can be skipped.
298
+ The release workflow runs this mode as a mandatory publication prerequisite.
299
+
300
+ ### Installed inspector consumer
301
+
302
+ After `npm ci --ignore-scripts && npm run build`, build a wheel and install it
303
+ into a separate Python virtual environment. Run its real subprocess/controller
304
+ contract from the checkout:
305
+
306
+ ```bash
307
+ INSPECTOR_INSTALLED_PYTHON=/absolute/path/to/wheel-env/bin/python \
308
+ python -m pytest tests/inspector/test_transport.py -q
309
+ ```
310
+
311
+ On Windows, point the environment variable at `wheel-env/Scripts/python.exe`.
312
+ The runner bundles the controller/transport sources shipped in that installed
313
+ wheel, then runs outside the checkout with repository import paths removed.
314
+ It checks real scoped SQLite reads, permissions, confirmed edits, stale-editor
315
+ conflicts and denied-result metadata. No retrieval/model-quality claim is made.
316
+ A missing optional interpreter skips only this case locally; a configured but
317
+ broken installation fails. The release SDK job always supplies a clean installed
318
+ wheel, making this contract a publication prerequisite.
319
+
320
+
266
321
  ### Postgres / pgvector integration tests
267
322
 
268
323
  `tests/test_backend_pgvector.py` contains real-Postgres round-trips that are
269
- **skipped unless `LUMINARY_PG_DSN` is set**. CI provides a Postgres service for
270
- these (see `.github/workflows/ci.yml`). To run them locally:
324
+ **skipped unless an isolated `PG_DSN` is set**. `LUMINARY_*` operator settings
325
+ are cleared by test isolation; do not point tests at a production store. CI
326
+ provides a disposable Postgres service (see `.github/workflows/ci.yml`).
327
+ To run these checks locally:
271
328
 
272
329
  ```bash
273
330
  # spin up a throwaway Postgres with the pgvector extension
@@ -276,6 +333,6 @@ docker run -d --name luminary-pg -p 5432:5432 \
276
333
  pgvector/pgvector:pg16
277
334
 
278
335
  # point the tests at it
279
- export LUMINARY_PG_DSN=postgresql://luminary:***@localhost:5432/luminary
336
+ export PG_DSN=postgresql://luminary:***@localhost:5432/luminary
280
337
  python -m pytest tests/test_backend_pgvector.py -v
281
338
  ```
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: luminary-memory
3
- Version: 0.3.2
3
+ Version: 0.3.3
4
4
  Summary: A lightweight, self-hosted memory layer for AI agents
5
5
  Project-URL: Homepage, https://github.com/alertxsto/luminary-memory
6
6
  Project-URL: Repository, https://github.com/alertxsto/luminary-memory
@@ -41,8 +41,6 @@ Description-Content-Type: text/markdown
41
41
  [![Python](https://img.shields.io/pypi/pyversions/luminary-memory?color=8ab4e8)](https://pypi.org/project/luminary-memory)
42
42
  [![License](https://img.shields.io/github/license/alertxsto/luminary-memory?color=8ab4e8)](LICENSE)
43
43
  [![CI](https://github.com/alertxsto/luminary-memory/actions/workflows/ci.yml/badge.svg)](https://github.com/alertxsto/luminary-memory/actions)
44
- [![Tests](https://img.shields.io/badge/tests-505%2B%20passing-8ab4e8)](https://github.com/alertxsto/luminary-memory/actions)
45
- [![Coverage](https://img.shields.io/badge/coverage-83%25-8ab4e8)](https://github.com/alertxsto/luminary-memory)
46
44
  [![Stars](https://img.shields.io/github/stars/alertxsto/luminary-memory?color=8ab4e8)](https://github.com/alertxsto/luminary-memory)
47
45
 
48
46
  **Self-hosted · Private · Budget-aware · Self-maintaining**
@@ -63,7 +61,7 @@ Agents are only as good as what they remember. A stateless agent re-learns the s
63
61
 
64
62
  Strategies fuse via **weighted RRF (semantic 0.4, keyword 0.3, graph 0.2, temporal 0.1)** → **scope/status/time filtering** → **conservative confidence and abstention** → **adaptive cutoff** → **Jaccard deduplication** → **token budget**. Short queries may be expanded with graph entities or stored content tokens before embedding; there is no language-specific alias classifier.
65
63
 
66
- **Important rules always in context.** Durable rules tagged `core` are auto-loaded into the system prompt every session (the DB-backed `MEMORY.md`). All other durable memories are surfaced through query retrieval: relevant facts are recalled on demand (ranked by query relevance) and merged with the core block under anti-duplication. When durable recall abstains, the Hermes provider can also expose a bounded exact-session continuity block so an ambiguous follow-up stays attached to its active task without turning raw conversation into durable memory.
64
+ **Core and recall are different surfaces.** The Hermes provider separately loads owner-designated `core` rules (the DB-backed `MEMORY.md`) and deduplicates them against query retrieval. Native OpenCode, pi, and omp adapters return only relevant, evidence-bearing recall; a core tag cannot turn abstention into success. Their historical reference stays outside system instructions and the persistent transcript. Hermes can also expose bounded exact-session continuity without turning raw conversation into durable memory.
67
65
 
68
66
  ---
69
67
 
@@ -103,8 +101,8 @@ luminary-memory stats
103
101
  ## Native hooks for supported harnesses
104
102
 
105
103
  The harness-neutral JSON bridge supports native adapters without coupling the
106
- memory engine to one runner. Shipped adapters cover OpenCode V2's
107
- `@opencode/plugin` 2.1.4 API, pi, and omp; Hermes keeps its provider integration.
104
+ memory engine to one runner. The current source targets OpenCode V2's
105
+ `@opencode/plugin` 2.2.0 API, pi, and omp; Hermes keeps its provider integration.
108
106
 
109
107
  ```bash
110
108
  luminary-memory hook install opencode # or pi / omp; project-local by default
@@ -114,7 +112,19 @@ Automatic scoped recall, opt-in user-grounded curation, explicit memory tools,
114
112
  and accurate stored/duplicate/skipped/error results. pi/omp also expose
115
113
  `/luminary` commands and native UI dialogs. Server tool results/custom messages
116
114
  are available to compatible desktop/web clients; no universal frontend plugin
117
- API or standalone desktop app is assumed.
115
+ API or standalone desktop app is assumed. A portable OpenCode agent skill lives
116
+ at [`opencode/SKILL.md`](opencode/SKILL.md); install it under
117
+ `~/.config/opencode/skills/luminary-memory/` or a project's `.opencode/skills/`.
118
+
119
+ The `0.3.3` source includes native interactive inspectors for the verified
120
+ surfaces: OpenCode CLI/Desktop, pi and omp, Hermes Desktop/dashboard and an
121
+ explicitly launched loopback companion. The `0.3.2` registry packages do not
122
+ include the inspector; see the installation guide for current availability.
123
+ Two native targets remain blocked on upstream
124
+ contracts and are recorded in the roadmap: OpenCode Web GUI contribution
125
+ discovery and Hermes terminal/TUI authority plus scope lifecycle. See
126
+ [development setup and explicit companion launch](docs/agent-integrations.md#interactive-inspectors)
127
+ and the [native support/acceptance roadmap](docs/ROADMAP.md).
118
128
 
119
129
  ### Luminary-maintained plugin packages
120
130
 
@@ -136,7 +146,8 @@ The three installable tarballs are written to `artifacts/plugins/`. Set
136
146
  Choose the native package **or** the copied hook, never both.
137
147
 
138
148
  Registry names are `luminary-memory-pi`, `luminary-memory-opencode`, and
139
- `luminary-memory-omp`. They are not claimed published by this source change.
149
+ `luminary-memory-omp`. All three npm packages and the Python bridge are
150
+ published at `0.3.2`; npm `latest` points to that version.
140
151
  The pi manifest includes `pi-package` for eligibility in the
141
152
  [official package catalog](https://pi.dev/packages). OpenCode's existing
142
153
  Ecosystem PR targets legacy V1 docs, not a verified V2 listing; no V2 website
@@ -307,7 +318,7 @@ after, and a background lifecycle keeps the store lean.
307
318
  | **Abstention** | Strict provider/CLI paths can return `abstain` when support is weak or ambiguous |
308
319
  | **Evidence** | Stored claims retain evidence quote, source, validity time, and audit provenance |
309
320
  | **Conflict safety** | Conflicting claim keys remain versioned/conflicted until explicit supersession or resolution |
310
- | **Core memory** | Rules tagged `core` are auto-loaded into the system prompt every session (the DB-backed MEMORY.md), independent of query match |
321
+ | **Core memory** | Hermes separately loads designated `core` rows; native adapters require core-tagged rows to pass ordinary retrieval |
311
322
  | **Weighted fusion** | Each strategy carries a tunable weight (semantic 0.4, keyword 0.3, graph 0.2, temporal 0.1), so high-signal strategies dominate the ranking |
312
323
  | **Query expansion** | Short queries are expanded with co-occurring graph entities before embedding; when the graph is empty, content tokens from a topically related important memory may be appended (v0.2.15). No language-specific alias list is used. |
313
324
  | **Importance boost** | Memories at importance ≥ 0.8 get a ranking bonus, lifting durable rules above weak-but-recent noise |