opencode-semantic-memory 0.8.2__tar.gz → 0.8.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.
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/0/0/d/f/d/00dfda658f2fcde6926308004100798ad2247e2f45d1313ebfef973d +0 -0
- opencode_semantic_memory-0.8.2/.cache/pip/http-v2/9/e/d/3/7/9ed377a761861346a483546ee4ebbe92a83f2d3a40e917849c2eb140 → opencode_semantic_memory-0.8.3/.cache/pip/http-v2/1/a/a/9/3/1aa93177f63584761c951c731336f631596e12d3b4e0b67c5c164470 +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/1/f/d/9/a/1fd9ade2b751542e96db097082f121ecac23098b3cd95c8a877f0716 +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/2/a/8/c/5/2a8c5a56aa7e75a42e474464b0e75e78380050445086fa2e6626b678 +0 -0
- opencode_semantic_memory-0.8.2/.cache/pip/http-v2/6/2/e/2/c/62e2caaadb9fd2d0a88b65a7d2043b2c343936491ef44dc753aa91e0 → opencode_semantic_memory-0.8.3/.cache/pip/http-v2/2/e/5/b/6/2e5b6ced06806dcc8a76919087cfc0d76c4240a8acb8d34511ad15d6 +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/3/2/7/f/0/327f0380de23010729d12b6a8a48f24b952353d527064c8bf3cfd875 +0 -0
- opencode_semantic_memory-0.8.2/.cache/pip/http-v2/5/b/5/7/6/5b576ddc69cb2cda42f61333b85f066e4990a5eab5c96e0670cbb445 → opencode_semantic_memory-0.8.3/.cache/pip/http-v2/3/3/9/7/4/33974f84394d9a943f68359da08431dab4af9f86c33962982ea21b5f +0 -0
- opencode_semantic_memory-0.8.3/.cache/pip/http-v2/3/6/1/b/f/361bf053ab706a1212f013301d35a0c4b0af9cd8cc559d24c73d6a6f +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/3/8/4/d/c/384dc122488f965cecab29f1722d1db789313763e22373f38c7fbbef +0 -0
- opencode_semantic_memory-0.8.3/.cache/pip/http-v2/4/4/e/5/b/44e5b11a6caa92636d8ccfe658d420ba4ed8f67f7f4e835b214255aa +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/4/b/e/0/7/4be07d3ac353e38d2c9e3a257cad36ee2a758fc88b4cd5f0d479a5a9 +0 -0
- opencode_semantic_memory-0.8.2/.cache/pip/http-v2/3/3/9/7/4/33974f84394d9a943f68359da08431dab4af9f86c33962982ea21b5f → opencode_semantic_memory-0.8.3/.cache/pip/http-v2/5/b/5/7/6/5b576ddc69cb2cda42f61333b85f066e4990a5eab5c96e0670cbb445 +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/5/b/d/8/9/5bd894eeb3dfe1c8aaee1daecdfb74bbb314293813a730238621f077 +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/5/b/e/1/1/5be1135dcb7a68de4427c71119ff80f66b671ae16db019966320bd6b +0 -0
- opencode_semantic_memory-0.8.3/.cache/pip/http-v2/6/2/e/2/c/62e2caaadb9fd2d0a88b65a7d2043b2c343936491ef44dc753aa91e0 +0 -0
- opencode_semantic_memory-0.8.3/.cache/pip/http-v2/6/c/3/7/f/6c37fbfdf697cce77ac3a3add5b61c639e47de9b9b9d1eb63cf429d5 +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/6/e/b/6/c/6eb6c130f2e60d2739ddb376352e395a8d86e4f80b402f5f7854d07d +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/7/a/5/f/7/7a5f717e7b3fb99ec006f4d173aad55224eb063005c662c586ba0518 +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/8/b/2/4/2/8b24226e2da88df4abeee0d8ca6bce79b19ca2bcd5f94b543939c66c +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/8/c/5/4/2/8c54213ac80b2536d9dbc88d24229468300e07d0d4883935e180e4d8 +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/8/d/0/e/1/8d0e104919449355aedb55b5b546bb9fd53f0e1a8ca1b082109464e9 +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/9/8/8/9/3/98893f0b227721063df57aa66878132bb1592344007b1842b6681340 +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/9/8/a/a/c/98aaccf247f7044601019ac72b3323db416a60a3b922e914db3b02bc +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/9/e/2/9/3/9e293f5a39d8466e2b362aa21216c5e4bc32898b0a39bfff792d145e +0 -0
- opencode_semantic_memory-0.8.3/.cache/pip/http-v2/9/e/d/3/7/9ed377a761861346a483546ee4ebbe92a83f2d3a40e917849c2eb140 +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/9/f/9/3/7/9f937e100a133ace0f86a717e0ada066b9e9d82f4d2982affb4e0344 +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/a/4/6/b/7/a46b74c1407dd55ebf9eeb7eb2c73000028b7639a6ed9edc7981950c +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/b/6/f/4/d/b6f4dcb64ca093b3c3ae363be21ccc40760e60e58f24e7541ab876c7 +0 -0
- opencode_semantic_memory-0.8.2/.cache/pip/http-v2/c/6/3/0/6/c6306d205b48faecb62eb823053e850df036f38e59b11523829f5c31 → opencode_semantic_memory-0.8.3/.cache/pip/http-v2/b/b/a/d/c/bbadc07fc383ff650474f2a8246a59ba64776ab6b35809d02400a398 +0 -0
- opencode_semantic_memory-0.8.3/.cache/pip/http-v2/c/6/3/0/6/c6306d205b48faecb62eb823053e850df036f38e59b11523829f5c31 +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/c/d/2/3/6/cd2366d413a2e8e87377cfadece7d8173562ece48b2be25218d5714a +0 -0
- opencode_semantic_memory-0.8.3/.cache/pip/http-v2/d/c/b/6/1/dcb61fa48ca00e206822fed148e38d1d4494a0b43064c07dcadec607 +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/e/a/c/6/1/eac61126daf80149d2a016f12a54eab5e3b5c1dbc77410ff1a97edc4 +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/e/d/2/5/d/ed25d1bb38edf83d84e0a08c7e2111da8cb788eddb019df7a96d3213 +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/f/3/6/d/5/f36d58c71164036f2cff3c9d0bb0c2b4d1d94bd0814c26b9cbe036b2 +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/f/9/6/5/9/f9659e50df363f8369e6abe4c4008418f9de6a660e264dbba624109f +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/CHANGELOG.md +16 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/PKG-INFO +1 -1
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/pyproject.toml +3 -1
- opencode_semantic_memory-0.8.3/scripts/memory-mcp.sh +65 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/src/opencode_memory/background_worker.py +26 -2
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/src/opencode_memory/http_server.py +30 -8
- opencode_semantic_memory-0.8.3/src/opencode_memory/jobs/__init__.py +64 -0
- opencode_semantic_memory-0.8.3/src/opencode_memory/jobs/circuit_breaker.py +237 -0
- opencode_semantic_memory-0.8.3/src/opencode_memory/jobs/executor.py +297 -0
- opencode_semantic_memory-0.8.3/src/opencode_memory/jobs/handlers.py +465 -0
- opencode_semantic_memory-0.8.3/src/opencode_memory/jobs/queue.py +424 -0
- opencode_semantic_memory-0.8.3/src/opencode_memory/jobs/scheduler.py +265 -0
- opencode_semantic_memory-0.8.3/src/opencode_memory/jobs/worker.py +237 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/src/opencode_memory/models.py +149 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/src/opencode_memory/server.py +44 -1
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/src/opencode_memory/storage/sqlite.py +1016 -2
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/tests/test_http_server.py +43 -7
- opencode_semantic_memory-0.8.3/tests/test_jobs.py +768 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/tests/test_server.py +37 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/tests/test_storage.py +582 -14
- opencode_semantic_memory-0.8.3/tests/test_worker_integration.py +310 -0
- opencode_semantic_memory-0.8.2/.cache/pip/http-v2/1/a/a/9/3/1aa93177f63584761c951c731336f631596e12d3b4e0b67c5c164470 +0 -0
- opencode_semantic_memory-0.8.2/.cache/pip/http-v2/2/e/5/b/6/2e5b6ced06806dcc8a76919087cfc0d76c4240a8acb8d34511ad15d6 +0 -0
- opencode_semantic_memory-0.8.2/.cache/pip/http-v2/3/6/1/b/f/361bf053ab706a1212f013301d35a0c4b0af9cd8cc559d24c73d6a6f +0 -0
- opencode_semantic_memory-0.8.2/.cache/pip/http-v2/4/4/e/5/b/44e5b11a6caa92636d8ccfe658d420ba4ed8f67f7f4e835b214255aa +0 -0
- opencode_semantic_memory-0.8.2/.cache/pip/http-v2/6/c/3/7/f/6c37fbfdf697cce77ac3a3add5b61c639e47de9b9b9d1eb63cf429d5 +0 -0
- opencode_semantic_memory-0.8.2/.cache/pip/http-v2/b/b/a/d/c/bbadc07fc383ff650474f2a8246a59ba64776ab6b35809d02400a398 +0 -0
- opencode_semantic_memory-0.8.2/.cache/pip/http-v2/d/c/b/6/1/dcb61fa48ca00e206822fed148e38d1d4494a0b43064c07dcadec607 +0 -0
- opencode_semantic_memory-0.8.2/scripts/memory-mcp.sh +0 -37
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/0/0/d/f/d/00dfda658f2fcde6926308004100798ad2247e2f45d1313ebfef973d.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/0/2/1/0/5/02105206f60ee8a62c7d923e21bb4bd2d8f3db94c5bb87bd806d5e74 +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/0/2/1/0/5/02105206f60ee8a62c7d923e21bb4bd2d8f3db94c5bb87bd806d5e74.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/0/4/3/c/5/043c5436ab58fe00f4947e073da46878751ec535f5fb37ee31d056d4 +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/0/4/3/c/5/043c5436ab58fe00f4947e073da46878751ec535f5fb37ee31d056d4.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/0/6/e/f/6/06ef6c69cac06b70bc0c72267a631e29bc34b67d12daa0467e642f68 +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/0/6/e/f/6/06ef6c69cac06b70bc0c72267a631e29bc34b67d12daa0467e642f68.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/0/a/6/b/7/0a6b76df38e61ac4e1f757a1132d2c6424dcb9c23751423afee448ac +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/0/a/6/b/7/0a6b76df38e61ac4e1f757a1132d2c6424dcb9c23751423afee448ac.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/0/d/0/c/8/0d0c8773df337e6f9e71ac49b74b6022225cab83efe9780dbf45afd6 +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/0/d/0/c/8/0d0c8773df337e6f9e71ac49b74b6022225cab83efe9780dbf45afd6.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/0/e/0/5/5/0e055813e840b7b873253f9f5c1cd4a7b06e0256c8de713dec25b93d +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/0/e/0/5/5/0e055813e840b7b873253f9f5c1cd4a7b06e0256c8de713dec25b93d.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/0/e/d/3/3/0ed336d749e009fe1267c844e36c442e5b3dc645d5eb9865c545b81a +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/0/e/d/3/3/0ed336d749e009fe1267c844e36c442e5b3dc645d5eb9865c545b81a.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/1/0/b/2/a/10b2a8b62ea67a4cd49d0d353a09c43832fb02ba7b3a804e29c73417 +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/1/0/b/2/a/10b2a8b62ea67a4cd49d0d353a09c43832fb02ba7b3a804e29c73417.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/1/1/4/a/4/114a432b2bd8b6284c600aa9e3f2bd6b180cacf11a94027a1a3ebafd +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/1/1/4/a/4/114a432b2bd8b6284c600aa9e3f2bd6b180cacf11a94027a1a3ebafd.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/1/1/5/8/4/11584f31ec41215071940705e8c92c248476c2eb9f8321e581bc327d +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/1/1/5/8/4/11584f31ec41215071940705e8c92c248476c2eb9f8321e581bc327d.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/1/2/1/8/1/121816d8cda4aebb8eef187064632e8ae9502de5f2c95b48f84a7404 +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/1/2/1/8/1/121816d8cda4aebb8eef187064632e8ae9502de5f2c95b48f84a7404.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/1/5/9/c/5/159c56e4ec3c8e71dacef647c600365ad192876d095dd29b5b5c8ace +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/1/5/9/c/5/159c56e4ec3c8e71dacef647c600365ad192876d095dd29b5b5c8ace.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/1/7/1/4/7/1714748212f1de43b155667695179ce5864620d5dacb8cf4aed74142 +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/1/7/1/4/7/1714748212f1de43b155667695179ce5864620d5dacb8cf4aed74142.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/1/a/a/9/3/1aa93177f63584761c951c731336f631596e12d3b4e0b67c5c164470.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/1/c/8/1/b/1c81b93817f31aa9418642808feaab487be448dbe0773e4bd01b9229 +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/1/c/8/1/b/1c81b93817f31aa9418642808feaab487be448dbe0773e4bd01b9229.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/1/c/c/f/2/1ccf222879210db389c3a9cad286511f6d242e8f0f9678f4322d324c +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/1/c/c/f/2/1ccf222879210db389c3a9cad286511f6d242e8f0f9678f4322d324c.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/1/e/d/5/5/1ed556defd2a8ab2cc731547ac075b6d45780b497beca6fbad1e4b42 +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/1/e/d/5/5/1ed556defd2a8ab2cc731547ac075b6d45780b497beca6fbad1e4b42.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/1/f/d/9/a/1fd9ade2b751542e96db097082f121ecac23098b3cd95c8a877f0716.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/2/4/d/b/9/24db9366753b8559a96fe294a29ebf32f13c5cff54739e41b20a46e8 +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/2/4/d/b/9/24db9366753b8559a96fe294a29ebf32f13c5cff54739e41b20a46e8.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/2/6/e/b/e/26ebeea7399d8249c69cb68cb12dd2c21339342ab0b9493ab076d6e8 +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/2/6/e/b/e/26ebeea7399d8249c69cb68cb12dd2c21339342ab0b9493ab076d6e8.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/2/8/3/9/a/2839a1e60014c8f0cdf9453a6036b2fef7bf06342761e3d37258b029 +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/2/8/3/9/a/2839a1e60014c8f0cdf9453a6036b2fef7bf06342761e3d37258b029.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/2/8/9/c/6/289c6f7419360f0297e671f8a8d5f9af72c5243124e001a3663cac72 +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/2/8/9/c/6/289c6f7419360f0297e671f8a8d5f9af72c5243124e001a3663cac72.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/2/a/8/c/5/2a8c5a56aa7e75a42e474464b0e75e78380050445086fa2e6626b678.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/2/b/0/a/4/2b0a4fda1a2c912a5a1c5245a8b34b5da87876e311f607befabc98ee +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/2/b/0/a/4/2b0a4fda1a2c912a5a1c5245a8b34b5da87876e311f607befabc98ee.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/2/b/4/a/8/2b4a8461b0c542cab777b0b365023942af997bbb25607ac8b3782391 +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/2/b/4/a/8/2b4a8461b0c542cab777b0b365023942af997bbb25607ac8b3782391.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/2/b/a/1/c/2ba1cd6fadf1cd59b11c7feb8b68f1b786ade023c8f2ebe0f752e45e +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/2/b/a/1/c/2ba1cd6fadf1cd59b11c7feb8b68f1b786ade023c8f2ebe0f752e45e.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/2/e/5/b/6/2e5b6ced06806dcc8a76919087cfc0d76c4240a8acb8d34511ad15d6.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/2/e/b/6/a/2eb6afae3ceaa5367896f67f058455efab497b680ac114e94caa3e10 +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/2/e/b/6/a/2eb6afae3ceaa5367896f67f058455efab497b680ac114e94caa3e10.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/2/e/e/f/c/2eefc290e650f410245e06439d9986a9e086c5e8b61f232f1e12891f +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/2/e/e/f/c/2eefc290e650f410245e06439d9986a9e086c5e8b61f232f1e12891f.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/3/2/7/f/0/327f0380de23010729d12b6a8a48f24b952353d527064c8bf3cfd875.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/3/3/5/e/4/335e4fae780121b49f966edba3e2b1f1f00b06637723db2e7e731f26 +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/3/3/5/e/4/335e4fae780121b49f966edba3e2b1f1f00b06637723db2e7e731f26.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/3/3/9/7/4/33974f84394d9a943f68359da08431dab4af9f86c33962982ea21b5f.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/3/4/f/3/5/34f35e68224a7918339af3f1e6f6dfcfd5192fd17c6ebb73cd6dd91a +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/3/4/f/3/5/34f35e68224a7918339af3f1e6f6dfcfd5192fd17c6ebb73cd6dd91a.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/3/6/1/b/f/361bf053ab706a1212f013301d35a0c4b0af9cd8cc559d24c73d6a6f.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/3/6/7/8/5/36785bb40858912d7449d47de604d597609db89b1962e5e1e238542b +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/3/6/7/8/5/36785bb40858912d7449d47de604d597609db89b1962e5e1e238542b.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/3/6/a/5/d/36a5d6132567ff173f730ddcc6ab65962d399aaa9f302927ca97b3eb +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/3/6/a/5/d/36a5d6132567ff173f730ddcc6ab65962d399aaa9f302927ca97b3eb.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/3/8/4/d/c/384dc122488f965cecab29f1722d1db789313763e22373f38c7fbbef.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/3/9/8/1/3/398134aaeacada9feb8b12654a25e878c4f41490786622fc606a7a1c +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/3/9/8/1/3/398134aaeacada9feb8b12654a25e878c4f41490786622fc606a7a1c.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/3/f/e/c/3/3fec34894257a80934e9246a0a3053a6a96740587f3ddbf5b4fa6f02 +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/3/f/e/c/3/3fec34894257a80934e9246a0a3053a6a96740587f3ddbf5b4fa6f02.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/4/1/e/3/c/41e3c68bb5038e20a3418971e070f9076b9eaa6e2c345d3e7f55e6b3 +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/4/1/e/3/c/41e3c68bb5038e20a3418971e070f9076b9eaa6e2c345d3e7f55e6b3.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/4/3/6/8/4/436846b847c9c90a13539a872e2084e3f9ca23eb93b4b1cc44b55964 +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/4/3/6/8/4/436846b847c9c90a13539a872e2084e3f9ca23eb93b4b1cc44b55964.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/4/3/9/4/0/43940c1ffa291a23244e10de06849b33fae6638badc063f4ade3cc1a +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/4/3/9/4/0/43940c1ffa291a23244e10de06849b33fae6638badc063f4ade3cc1a.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/4/4/e/5/b/44e5b11a6caa92636d8ccfe658d420ba4ed8f67f7f4e835b214255aa.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/4/5/8/c/7/458c7a7721c5d95619ebccea457715f5b1720258d02ce8362016a55c +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/4/5/8/c/7/458c7a7721c5d95619ebccea457715f5b1720258d02ce8362016a55c.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/4/7/7/4/2/47742615f5189ebbf61bb31c8c50f7f39cc38c5173f10ec7146e3989 +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/4/7/7/4/2/47742615f5189ebbf61bb31c8c50f7f39cc38c5173f10ec7146e3989.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/4/8/3/8/e/4838e51432c6c88a78b5234e817caf0cf3bf1c3fc933f4861329b80f +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/4/8/3/8/e/4838e51432c6c88a78b5234e817caf0cf3bf1c3fc933f4861329b80f.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/4/b/e/0/7/4be07d3ac353e38d2c9e3a257cad36ee2a758fc88b4cd5f0d479a5a9.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/4/c/7/5/1/4c751248c578c4b8d67722e607a019d0909438b8cbe82066c393dfde +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/4/c/7/5/1/4c751248c578c4b8d67722e607a019d0909438b8cbe82066c393dfde.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/4/e/7/a/c/4e7ac19406cd6f20bb5f8145cca2f74c5f704ef378b0f4334628b440 +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/4/e/7/a/c/4e7ac19406cd6f20bb5f8145cca2f74c5f704ef378b0f4334628b440.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/5/5/9/a/2/559a28d2d50a6d0988e3c56e5d0d411789da84005e4420f1a26bb23e +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/5/5/9/a/2/559a28d2d50a6d0988e3c56e5d0d411789da84005e4420f1a26bb23e.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/5/8/f/2/8/58f285f2173a5d23a2aa46ffc8e8b1bc64b6c3da91902d4ebd85c64d +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/5/8/f/2/8/58f285f2173a5d23a2aa46ffc8e8b1bc64b6c3da91902d4ebd85c64d.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/5/b/5/7/6/5b576ddc69cb2cda42f61333b85f066e4990a5eab5c96e0670cbb445.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/5/b/d/8/9/5bd894eeb3dfe1c8aaee1daecdfb74bbb314293813a730238621f077.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/5/b/e/1/1/5be1135dcb7a68de4427c71119ff80f66b671ae16db019966320bd6b.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/5/d/5/7/5/5d575692ffb3194739604e9e1622e2fa8c882afc9517932bd2ce40df +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/5/d/5/7/5/5d575692ffb3194739604e9e1622e2fa8c882afc9517932bd2ce40df.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/6/2/e/2/c/62e2caaadb9fd2d0a88b65a7d2043b2c343936491ef44dc753aa91e0.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/6/c/3/7/f/6c37fbfdf697cce77ac3a3add5b61c639e47de9b9b9d1eb63cf429d5.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/6/e/b/6/c/6eb6c130f2e60d2739ddb376352e395a8d86e4f80b402f5f7854d07d.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/6/e/f/c/7/6efc76a8ab292a15bc9bca02c950f72e1ce263d0a701323e9af5a358 +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/6/e/f/c/7/6efc76a8ab292a15bc9bca02c950f72e1ce263d0a701323e9af5a358.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/7/0/b/9/c/70b9c022893d41f3d2b5cd47c3935b21f2c02945201dbf0acd4f302c +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/7/0/b/9/c/70b9c022893d41f3d2b5cd47c3935b21f2c02945201dbf0acd4f302c.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/7/2/f/6/0/72f60d542675f65a9677981499f07ae27fe97e3ac82f8e2224d72113 +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/7/2/f/6/0/72f60d542675f65a9677981499f07ae27fe97e3ac82f8e2224d72113.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/7/3/3/0/8/73308e5c1402c6bb3b38e3b0f1deabe3b20b6248ed18126597a2a901 +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/7/3/3/0/8/73308e5c1402c6bb3b38e3b0f1deabe3b20b6248ed18126597a2a901.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/7/6/f/a/7/76fa74418db194f57a03dff1a0900e3bb30fca5fcb07e76f411cd937 +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/7/6/f/a/7/76fa74418db194f57a03dff1a0900e3bb30fca5fcb07e76f411cd937.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/7/7/4/6/9/77469a77c0c5007f8e0ef36b73b2bdb8cbe7d9c8be102fd7d4efaf35 +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/7/7/4/6/9/77469a77c0c5007f8e0ef36b73b2bdb8cbe7d9c8be102fd7d4efaf35.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/7/a/5/f/7/7a5f717e7b3fb99ec006f4d173aad55224eb063005c662c586ba0518.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/8/2/6/f/6/826f657d92b77c09dc5003a2b07bdbf9bb82259638dc4579ee230b4d +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/8/2/6/f/6/826f657d92b77c09dc5003a2b07bdbf9bb82259638dc4579ee230b4d.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/8/3/a/9/9/83a99ac063795cf6d06df343c06449f8777237c8c3ad06917c4344ef +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/8/3/a/9/9/83a99ac063795cf6d06df343c06449f8777237c8c3ad06917c4344ef.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/8/3/d/e/5/83de5cc65dfecf3a6e4c4c0025f0873b77d3c9243e6a038bd0ca39b9 +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/8/3/d/e/5/83de5cc65dfecf3a6e4c4c0025f0873b77d3c9243e6a038bd0ca39b9.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/8/6/c/3/3/86c33a8b2bab9735c4478352d670d16d3abe4f1a006f7c8e395d413f +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/8/6/c/3/3/86c33a8b2bab9735c4478352d670d16d3abe4f1a006f7c8e395d413f.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/8/8/f/0/6/88f06a944c734c3736badbb02d887cddfeb74de4f837c06db79e749c +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/8/8/f/0/6/88f06a944c734c3736badbb02d887cddfeb74de4f837c06db79e749c.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/8/9/6/5/1/896514be855e753c50f0e30b1a0e384a9a68b4db7b2ad62e28f4f6c0 +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/8/9/6/5/1/896514be855e753c50f0e30b1a0e384a9a68b4db7b2ad62e28f4f6c0.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/8/9/b/7/2/89b72b053e1e45d15f7f77bd17b706e1b4010f0d87afb98ea49c07e1 +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/8/9/b/7/2/89b72b053e1e45d15f7f77bd17b706e1b4010f0d87afb98ea49c07e1.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/8/a/9/8/c/8a98cf67dec8a2d33fd9e0b916651e7664ecf9dac97e99bcebb334f9 +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/8/a/9/8/c/8a98cf67dec8a2d33fd9e0b916651e7664ecf9dac97e99bcebb334f9.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/8/b/2/4/2/8b24226e2da88df4abeee0d8ca6bce79b19ca2bcd5f94b543939c66c.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/8/c/5/4/2/8c54213ac80b2536d9dbc88d24229468300e07d0d4883935e180e4d8.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/8/d/0/e/1/8d0e104919449355aedb55b5b546bb9fd53f0e1a8ca1b082109464e9.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/8/f/0/2/c/8f02ceda6b874413150afa5cd29cd5b10e2fcba552cc363083b9d073 +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/8/f/0/2/c/8f02ceda6b874413150afa5cd29cd5b10e2fcba552cc363083b9d073.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/9/2/8/c/7/928c755db48c17282ed7a16aa7cbf0ae7aa370d2e20d939a3292aa75 +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/9/2/8/c/7/928c755db48c17282ed7a16aa7cbf0ae7aa370d2e20d939a3292aa75.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/9/4/d/0/2/94d022fb6c12e6dc453f3090252f397a80e9c2dbb7341fb45c1b150f +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/9/4/d/0/2/94d022fb6c12e6dc453f3090252f397a80e9c2dbb7341fb45c1b150f.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/9/8/8/9/3/98893f0b227721063df57aa66878132bb1592344007b1842b6681340.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/9/8/a/a/c/98aaccf247f7044601019ac72b3323db416a60a3b922e914db3b02bc.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/9/9/6/4/b/9964b58defdc05f741bfcb3abd6a4eebcb73af9497c5e6d1c828971c +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/9/9/6/4/b/9964b58defdc05f741bfcb3abd6a4eebcb73af9497c5e6d1c828971c.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/9/a/a/7/5/9aa7515b527eee59a0b02e85169b5a03e55bdc51dd9ff5255db0c90b +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/9/a/a/7/5/9aa7515b527eee59a0b02e85169b5a03e55bdc51dd9ff5255db0c90b.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/9/d/0/1/f/9d01f27365759b718ef77536f4a3d30fd989884b0e53418e1275a79d +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/9/d/0/1/f/9d01f27365759b718ef77536f4a3d30fd989884b0e53418e1275a79d.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/9/d/5/d/f/9d5dfb0dedf17094821c37079d37c9f4a1256a7dc457c1192cfa1573 +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/9/d/5/d/f/9d5dfb0dedf17094821c37079d37c9f4a1256a7dc457c1192cfa1573.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/9/d/7/3/1/9d731f2c786de32b646a4a55c324f4853068bfd6c6f1fd7f9a0e296b +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/9/d/7/3/1/9d731f2c786de32b646a4a55c324f4853068bfd6c6f1fd7f9a0e296b.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/9/e/2/9/3/9e293f5a39d8466e2b362aa21216c5e4bc32898b0a39bfff792d145e.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/9/e/d/3/7/9ed377a761861346a483546ee4ebbe92a83f2d3a40e917849c2eb140.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/9/f/9/3/7/9f937e100a133ace0f86a717e0ada066b9e9d82f4d2982affb4e0344.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/a/1/9/5/3/a19537d3cf37c122db841d6fe4cd322bc10d1a558bb00d146b85cb9a +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/a/1/9/5/3/a19537d3cf37c122db841d6fe4cd322bc10d1a558bb00d146b85cb9a.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/a/4/6/b/7/a46b74c1407dd55ebf9eeb7eb2c73000028b7639a6ed9edc7981950c.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/a/6/9/f/7/a69f7807d8670d33b4a34f2be06cdd5812c8d0da9ec20e9dea88a6b5 +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/a/6/9/f/7/a69f7807d8670d33b4a34f2be06cdd5812c8d0da9ec20e9dea88a6b5.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/a/c/b/4/e/acb4e40f64eef2a73d680e437d7e413b10909b60941ff39f0528cce7 +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/a/c/b/4/e/acb4e40f64eef2a73d680e437d7e413b10909b60941ff39f0528cce7.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/a/c/f/5/f/acf5f0d5e5d9c652369524c1aa52bc12c871949618d42c9cf23f3425 +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/a/c/f/5/f/acf5f0d5e5d9c652369524c1aa52bc12c871949618d42c9cf23f3425.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/a/d/0/9/9/ad0993b61e45706eeae6cade19b9ea76c815f37701089250e72421e5 +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/a/d/0/9/9/ad0993b61e45706eeae6cade19b9ea76c815f37701089250e72421e5.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/a/d/f/d/a/adfdac1a71358ae7b47b92917f8a6af8c5acecccb52b186c45372c03 +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/a/d/f/d/a/adfdac1a71358ae7b47b92917f8a6af8c5acecccb52b186c45372c03.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/a/e/4/3/7/ae4373cec48f7725665273a898a1c1c6bb89464ae81e2d57d920fc2e +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/a/e/4/3/7/ae4373cec48f7725665273a898a1c1c6bb89464ae81e2d57d920fc2e.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/a/f/9/2/4/af924cace590eaa7f5a948286460f4a79ae9e083cd5843c70be7bcdc +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/a/f/9/2/4/af924cace590eaa7f5a948286460f4a79ae9e083cd5843c70be7bcdc.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/b/0/c/3/0/b0c304a2d0d2dd17cd2e818948220da223f52dfe26c6e170a35508ec +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/b/0/c/3/0/b0c304a2d0d2dd17cd2e818948220da223f52dfe26c6e170a35508ec.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/b/2/b/3/5/b2b35b24e6fe74c8ffc02d1a4a1ddbd75ba2a82f3623471ee047b2ed +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/b/2/b/3/5/b2b35b24e6fe74c8ffc02d1a4a1ddbd75ba2a82f3623471ee047b2ed.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/b/3/6/c/0/b36c03663a3f9be503a38ab3381e55a1c5e2392e9271c976f5e2b956 +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/b/3/6/c/0/b36c03663a3f9be503a38ab3381e55a1c5e2392e9271c976f5e2b956.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/b/6/f/4/d/b6f4dcb64ca093b3c3ae363be21ccc40760e60e58f24e7541ab876c7.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/b/9/3/9/c/b939c4552b20c2f2a36204f6bb1d2e526af7e96070b43b1d2e2e9ae4 +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/b/9/3/9/c/b939c4552b20c2f2a36204f6bb1d2e526af7e96070b43b1d2e2e9ae4.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/b/b/a/d/c/bbadc07fc383ff650474f2a8246a59ba64776ab6b35809d02400a398.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/b/c/5/b/a/bc5baf40560ff46e68ca4c99692ddaaf9ca29f999555e36e150ea6f1 +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/b/c/5/b/a/bc5baf40560ff46e68ca4c99692ddaaf9ca29f999555e36e150ea6f1.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/b/e/d/4/e/bed4e7c2b407105e5c80f6f3c9c9ce06074cd1bc90409700e4489759 +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/b/e/d/4/e/bed4e7c2b407105e5c80f6f3c9c9ce06074cd1bc90409700e4489759.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/c/4/1/9/b/c419b5211317322d2f929c4249b25fb3a2a5deaac5ca898ef2889e82 +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/c/4/1/9/b/c419b5211317322d2f929c4249b25fb3a2a5deaac5ca898ef2889e82.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/c/5/5/1/6/c5516052911272854847b94d1c7e5dcdda18d04768795c313b9958bc +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/c/5/5/1/6/c5516052911272854847b94d1c7e5dcdda18d04768795c313b9958bc.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/c/6/3/0/6/c6306d205b48faecb62eb823053e850df036f38e59b11523829f5c31.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/c/6/e/e/4/c6ee4aaa63f8847bfbe25565d073b6c57d624c7f7c4708994746c09c +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/c/6/e/e/4/c6ee4aaa63f8847bfbe25565d073b6c57d624c7f7c4708994746c09c.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/c/7/0/c/6/c70c631b8d2fff6b4f7fd6ebc7fad8e500b50f8fa7da0af627bf1f0b +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/c/7/0/c/6/c70c631b8d2fff6b4f7fd6ebc7fad8e500b50f8fa7da0af627bf1f0b.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/c/7/7/1/f/c771f1dbbe2a60b07758757a5e715103105323f69596e50cebedebeb +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/c/7/7/1/f/c771f1dbbe2a60b07758757a5e715103105323f69596e50cebedebeb.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/c/9/4/a/e/c94ae1695304888e79191be0f465ad0b2a85880ee474d189ee9126ed +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/c/9/4/a/e/c94ae1695304888e79191be0f465ad0b2a85880ee474d189ee9126ed.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/c/d/2/3/6/cd2366d413a2e8e87377cfadece7d8173562ece48b2be25218d5714a.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/c/d/e/c/3/cdec3d0140a615c153130a37691576ea1707e32a1ab5e60ae5a540f4 +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/c/d/e/c/3/cdec3d0140a615c153130a37691576ea1707e32a1ab5e60ae5a540f4.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/c/e/6/7/6/ce6762d91f1e7c3c4bece64762122d18df14d8f8e7532d5f15dfdb37 +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/c/e/6/7/6/ce6762d91f1e7c3c4bece64762122d18df14d8f8e7532d5f15dfdb37.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/c/e/8/f/d/ce8fd146fb2bb37feff63c8f224f1a8b178c26a332d13562e417fead +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/c/e/8/f/d/ce8fd146fb2bb37feff63c8f224f1a8b178c26a332d13562e417fead.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/c/f/e/5/3/cfe53db609feaba2efb2139916693c3ff859e7f1e6e6e557fbd82ae0 +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/c/f/e/5/3/cfe53db609feaba2efb2139916693c3ff859e7f1e6e6e557fbd82ae0.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/d/0/9/f/6/d09f6ac5e031c49248311012191c6416673b97ee2e299116b629ff88 +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/d/0/9/f/6/d09f6ac5e031c49248311012191c6416673b97ee2e299116b629ff88.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/d/3/7/f/1/d37f17c4b7b25f8b5df752972b9c2301f59d0c55586cac7f15268689 +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/d/3/7/f/1/d37f17c4b7b25f8b5df752972b9c2301f59d0c55586cac7f15268689.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/d/5/4/b/b/d54bb21df9a8549867c7c0c30dcdda927be8994b07f4c933db9a04ab +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/d/5/4/b/b/d54bb21df9a8549867c7c0c30dcdda927be8994b07f4c933db9a04ab.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/d/5/9/0/b/d590bdf80aa5f6230e0e49a9f10b63aa0c44f77ccd99f25a6ad7841a +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/d/5/9/0/b/d590bdf80aa5f6230e0e49a9f10b63aa0c44f77ccd99f25a6ad7841a.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/d/6/b/d/f/d6bdf32d1c16362f083791f397046d0fa2aa6875fb754c605afbef26 +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/d/6/b/d/f/d6bdf32d1c16362f083791f397046d0fa2aa6875fb754c605afbef26.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/d/8/f/6/6/d8f6658f33493176286485c04b4350d8cca524052cba0aea8d4cb82e +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/d/8/f/6/6/d8f6658f33493176286485c04b4350d8cca524052cba0aea8d4cb82e.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/d/a/4/3/1/da431bf4bec8d6d3c8eda94dac7a309e829b61d10ffd31c5d846f4d5 +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/d/a/4/3/1/da431bf4bec8d6d3c8eda94dac7a309e829b61d10ffd31c5d846f4d5.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/d/c/b/6/1/dcb61fa48ca00e206822fed148e38d1d4494a0b43064c07dcadec607.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/d/f/1/1/f/df11f101ff0165c7df447aaf1ab175fcd1af98711e498eef0c3d0dfa +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/d/f/1/1/f/df11f101ff0165c7df447aaf1ab175fcd1af98711e498eef0c3d0dfa.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/e/1/2/c/b/e12cb67639406869a81116005289318bf75720fc4d58ce1eff838d0c +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/e/1/2/c/b/e12cb67639406869a81116005289318bf75720fc4d58ce1eff838d0c.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/e/1/6/2/5/e16255f8dfb39b0298f7cb7edd062dd0d3f7ae4c5014de5fc4e17070 +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/e/1/6/2/5/e16255f8dfb39b0298f7cb7edd062dd0d3f7ae4c5014de5fc4e17070.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/e/a/c/6/1/eac61126daf80149d2a016f12a54eab5e3b5c1dbc77410ff1a97edc4.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/e/d/2/5/d/ed25d1bb38edf83d84e0a08c7e2111da8cb788eddb019df7a96d3213.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/e/d/3/a/c/ed3acad79bebd48e93f9254a4702825f833ffd8119c8d2cbff43abfc +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/e/d/3/a/c/ed3acad79bebd48e93f9254a4702825f833ffd8119c8d2cbff43abfc.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/f/2/d/a/b/f2dabcdf97e445f98036aadbe7dddc4c9ecb47a8a60783427f548b2c +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/f/2/d/a/b/f2dabcdf97e445f98036aadbe7dddc4c9ecb47a8a60783427f548b2c.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/f/3/0/6/9/f3069b463c09d30c7cc1996d8b8a3423c70ff01f7a9e7a62d31aca05 +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/f/3/0/6/9/f3069b463c09d30c7cc1996d8b8a3423c70ff01f7a9e7a62d31aca05.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/f/3/6/d/5/f36d58c71164036f2cff3c9d0bb0c2b4d1d94bd0814c26b9cbe036b2.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/f/9/6/5/9/f9659e50df363f8369e6abe4c4008418f9de6a660e264dbba624109f.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/f/9/9/b/3/f99b3487d2b9c55edcd311aeafa35cbf852ab2cc5c3f5d1a1a08e2b5 +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/f/9/9/b/3/f99b3487d2b9c55edcd311aeafa35cbf852ab2cc5c3f5d1a1a08e2b5.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/f/c/c/6/f/fcc6fbc30e8c9f7e5cfd4f86edead21005705c18238a90d9673eeb47 +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/f/c/c/6/f/fcc6fbc30e8c9f7e5cfd4f86edead21005705c18238a90d9673eeb47.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/f/d/b/e/3/fdbe380932457c2da0b68a223546fd0f6b84c31a8f4a6b63757becce +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/f/d/b/e/3/fdbe380932457c2da0b68a223546fd0f6b84c31a8f4a6b63757becce.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/f/f/6/3/f/ff63f8aee48f79bb6d2cdeff8f7863b5820a3c507a2623f007846bb0 +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/http-v2/f/f/6/3/f/ff63f8aee48f79bb6d2cdeff8f7863b5820a3c507a2623f007846bb0.body +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.cache/pip/selfcheck/fe300af6f7d708c14827daac3afc81fbb8306b73de8dd6e3f1f8ea3b +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.gitignore +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/.gitlab-ci.yml +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/AGENTS.md +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/ARCHITECTURE.md +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/BOOTSTRAP.md +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/README.md +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/backfill.log +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/com.opencode.memory.plist +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/docs/BOOTSTRAP_MEMORIES.md +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/docs/GITLAB_WORKFLOW_MEMORIES.md +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/docs/TIPS_FOR_HUMANS.md +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/flake.lock +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/flake.nix +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/lefthook.yml +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/nix/model.nix +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/nix/module.nix +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/nix/package.nix +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/opencode-mcp-config.json +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/opencode-memory-daemon.service +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/opencode-memory-reload.path +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/opencode-memory-worker.service +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/opencode-memory.service +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/opencode.json +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/plugin/.gitignore +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/plugin/README.md +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/plugin/package-lock.json +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/plugin/package.json +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/plugin/src/boot-context-formatter.ts +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/plugin/src/context-formatter.ts +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/plugin/src/entity-extractor.ts +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/plugin/src/index.ts +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/plugin/src/memory-client.ts +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/plugin/tsconfig.json +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/scripts/backfill_extraction.py +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/scripts/check-version-sync.py +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/scripts/reingest_insights.py +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/scripts/setup.sh +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/scripts/sync-version.py +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/slack-post-memory-effectiveness.md +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/src/opencode_memory/__init__.py +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/src/opencode_memory/activity_log.py +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/src/opencode_memory/analysis/__init__.py +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/src/opencode_memory/analysis/effectiveness.py +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/src/opencode_memory/backfill_introspection.py +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/src/opencode_memory/bulk_ingest/__init__.py +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/src/opencode_memory/bulk_ingest/cli.py +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/src/opencode_memory/bulk_ingest/config.py +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/src/opencode_memory/bulk_ingest/daemon.py +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/src/opencode_memory/bulk_ingest/fetcher.py +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/src/opencode_memory/bulk_ingest/keywords.py +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/src/opencode_memory/bulk_ingest/query.py +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/src/opencode_memory/bulk_ingest/storage.py +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/src/opencode_memory/bulk_ingest/summarizer.py +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/src/opencode_memory/bulk_ingest/tiering.py +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/src/opencode_memory/bulk_ingest/vectors.py +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/src/opencode_memory/cache.py +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/src/opencode_memory/cli.py +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/src/opencode_memory/config.py +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/src/opencode_memory/daemon.py +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/src/opencode_memory/enrichment/__init__.py +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/src/opencode_memory/enrichment/gitlab.py +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/src/opencode_memory/enrichment/orbit.py +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/src/opencode_memory/enrichment_worker.py +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/src/opencode_memory/extraction.py +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/src/opencode_memory/historical_ingest.py +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/src/opencode_memory/indexing/__init__.py +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/src/opencode_memory/indexing/code_structure.py +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/src/opencode_memory/ingestion/__init__.py +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/src/opencode_memory/ingestion/embeddings.py +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/src/opencode_memory/ingestion/extractors.py +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/src/opencode_memory/ingestion/opencode_db.py +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/src/opencode_memory/ingestion/parser.py +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/src/opencode_memory/ingestion/watcher.py +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/src/opencode_memory/linking/__init__.py +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/src/opencode_memory/linking/linker.py +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/src/opencode_memory/llm.py +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/src/opencode_memory/metrics.py +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/src/opencode_memory/proactive_context.py +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/src/opencode_memory/project.py +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/src/opencode_memory/query/__init__.py +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/src/opencode_memory/query/hybrid.py +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/src/opencode_memory/session/__init__.py +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/src/opencode_memory/session/registry.py +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/src/opencode_memory/spider/__init__.py +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/src/opencode_memory/spider/crawler.py +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/src/opencode_memory/spider/references.py +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/src/opencode_memory/storage/__init__.py +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/src/opencode_memory/storage/vectors.py +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/tests/__init__.py +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/tests/test_cache.py +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/tests/test_concept_propagation.py +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/tests/test_config.py +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/tests/test_daemon.py +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/tests/test_extraction.py +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/tests/test_extractors.py +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/tests/test_linking.py +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/tests/test_llm.py +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/tests/test_opencode_db.py +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/tests/test_orbit.py +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/tests/test_parser.py +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/tests/test_proactive_context.py +0 -0
- {opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/uv.lock +0 -0
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -7,6 +7,22 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.8.3] - 2026-06-03
|
|
11
|
+
|
|
12
|
+
### Fixed
|
|
13
|
+
|
|
14
|
+
- **Concurrent subagent MCP connections** - Background tasks that spawned multiple
|
|
15
|
+
subagents at once could fail silently with `MCP error -32000: Connection closed`
|
|
16
|
+
when their `mcp-remote` clients all performed their startup handshake against the
|
|
17
|
+
shared HTTP server simultaneously. Two fixes:
|
|
18
|
+
- `scripts/memory-mcp.sh` now retries `mcp-remote` with exponential backoff
|
|
19
|
+
(up to 5 attempts) so a transient startup-time connection drop recovers instead
|
|
20
|
+
of leaving the subagent without memory access.
|
|
21
|
+
- The HTTP server's rate limiter now exempts loopback addresses (all local
|
|
22
|
+
sessions are trusted) and keys non-local clients by the `X-OpenCode-Session`
|
|
23
|
+
header, so concurrent sessions no longer share a single localhost bucket whose
|
|
24
|
+
limit a startup burst could trip.
|
|
25
|
+
|
|
10
26
|
## [0.8.0] - 2026-06-02
|
|
11
27
|
|
|
12
28
|
### Added
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "opencode-semantic-memory"
|
|
7
|
-
version = "0.8.
|
|
7
|
+
version = "0.8.3"
|
|
8
8
|
description = "Persistent semantic memory system for OpenCode sessions"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = "MIT"
|
|
@@ -52,6 +52,8 @@ opencode-memory = "opencode_memory.cli:main"
|
|
|
52
52
|
opencode-memory-server = "opencode_memory.http_server:main"
|
|
53
53
|
opencode-memory-daemon = "opencode_memory.daemon:main"
|
|
54
54
|
opencode-memory-worker = "opencode_memory.background_worker:main"
|
|
55
|
+
# New job-based worker (Sidekiq-like)
|
|
56
|
+
opencode-memory-job-worker = "opencode_memory.jobs.worker:main"
|
|
55
57
|
# Bulk ingestion commands
|
|
56
58
|
opencode-memory-bulk-ingest = "opencode_memory.bulk_ingest.cli:main"
|
|
57
59
|
opencode-memory-bulk-ingest-daemon = "opencode_memory.bulk_ingest.daemon:main"
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Wrapper script for opencode-memory MCP server
|
|
3
|
+
# Connects to the HTTP server via mcp-remote
|
|
4
|
+
#
|
|
5
|
+
# Prerequisites:
|
|
6
|
+
# Linux: systemctl --user enable --now opencode-memory
|
|
7
|
+
# macOS: launchctl load ~/Library/LaunchAgents/com.opencode.memory.plist
|
|
8
|
+
|
|
9
|
+
set -e
|
|
10
|
+
|
|
11
|
+
SERVER_URL="http://localhost:9824"
|
|
12
|
+
|
|
13
|
+
# Quick health check (fail fast if server not running)
|
|
14
|
+
if ! curl -s --max-time 1 "$SERVER_URL/health" >/dev/null 2>&1; then
|
|
15
|
+
OS="$(uname -s)"
|
|
16
|
+
case "$OS" in
|
|
17
|
+
Linux*)
|
|
18
|
+
echo "Memory server not running. Start it with: systemctl --user start opencode-memory" >&2
|
|
19
|
+
;;
|
|
20
|
+
Darwin*)
|
|
21
|
+
echo "Memory server not running. Start it with: launchctl load ~/Library/LaunchAgents/com.opencode.memory.plist" >&2
|
|
22
|
+
;;
|
|
23
|
+
*)
|
|
24
|
+
echo "Memory server not running at $SERVER_URL" >&2
|
|
25
|
+
;;
|
|
26
|
+
esac
|
|
27
|
+
exit 1
|
|
28
|
+
fi
|
|
29
|
+
|
|
30
|
+
# Resolve the mcp-remote command (locally installed is faster than npx)
|
|
31
|
+
if [ -x "$HOME/.local/bin/mcp-remote" ]; then
|
|
32
|
+
MCP_REMOTE=("$HOME/.local/bin/mcp-remote")
|
|
33
|
+
elif command -v mcp-remote >/dev/null 2>&1; then
|
|
34
|
+
MCP_REMOTE=(mcp-remote)
|
|
35
|
+
else
|
|
36
|
+
MCP_REMOTE=(npx --yes mcp-remote)
|
|
37
|
+
fi
|
|
38
|
+
|
|
39
|
+
# Start mcp-remote with retry/backoff to absorb transient "Connection closed"
|
|
40
|
+
# failures that occur when many subagents start concurrently (thundering herd
|
|
41
|
+
# against the shared HTTP server). A clean long-running proxy never returns 0
|
|
42
|
+
# here, so a fast non-zero exit means a startup-time connection drop worth retrying.
|
|
43
|
+
MAX_ATTEMPTS=5
|
|
44
|
+
attempt=1
|
|
45
|
+
while true; do
|
|
46
|
+
start_ts=$(date +%s)
|
|
47
|
+
# Disable errexit around the proxy call; we handle its exit code explicitly.
|
|
48
|
+
set +e
|
|
49
|
+
"${MCP_REMOTE[@]}" "$SERVER_URL/mcp"
|
|
50
|
+
exit_code=$?
|
|
51
|
+
set -e
|
|
52
|
+
elapsed=$(( $(date +%s) - start_ts ))
|
|
53
|
+
|
|
54
|
+
# Exited cleanly, or ran long enough to be a real session (not a startup
|
|
55
|
+
# collision): propagate the exit code and stop.
|
|
56
|
+
if [ "$exit_code" -eq 0 ] || [ "$elapsed" -ge 10 ] || [ "$attempt" -ge "$MAX_ATTEMPTS" ]; then
|
|
57
|
+
exit "$exit_code"
|
|
58
|
+
fi
|
|
59
|
+
|
|
60
|
+
# Transient startup failure: back off (2s, 4s, 6s, 8s) and retry.
|
|
61
|
+
backoff=$(( attempt * 2 ))
|
|
62
|
+
echo "memory-mcp: mcp-remote exited ($exit_code) after ${elapsed}s on attempt ${attempt}; retrying in ${backoff}s" >&2
|
|
63
|
+
sleep "$backoff"
|
|
64
|
+
attempt=$(( attempt + 1 ))
|
|
65
|
+
done
|
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
"""Unified background worker for all memory processing.
|
|
2
2
|
|
|
3
|
+
DEPRECATED: This module is superseded by the new job-based system in
|
|
4
|
+
opencode_memory.jobs.worker. The new system provides:
|
|
5
|
+
- Proper job queue with claim/timeout/retry
|
|
6
|
+
- Circuit breaker protection for external APIs
|
|
7
|
+
- Dead job tracking and alerting
|
|
8
|
+
- Metrics collection for all job types
|
|
9
|
+
|
|
10
|
+
Use instead: python -m opencode_memory.jobs.worker
|
|
11
|
+
|
|
12
|
+
This file is kept for backwards compatibility and will be removed in v0.10.0.
|
|
13
|
+
|
|
14
|
+
Legacy documentation:
|
|
3
15
|
This runs as a separate process from the MCP server, handling:
|
|
4
16
|
- Embedding computation and vector storage
|
|
5
17
|
- Semantic deduplication
|
|
@@ -8,8 +20,6 @@ This runs as a separate process from the MCP server, handling:
|
|
|
8
20
|
- Memory cleanup
|
|
9
21
|
- LLM-based knowledge extraction
|
|
10
22
|
- Concept extraction
|
|
11
|
-
|
|
12
|
-
Run with: python -m opencode_memory.background_worker
|
|
13
23
|
"""
|
|
14
24
|
|
|
15
25
|
import asyncio
|
|
@@ -979,6 +989,20 @@ Your response (one line only):"""
|
|
|
979
989
|
|
|
980
990
|
def main():
|
|
981
991
|
"""Entry point for the background worker."""
|
|
992
|
+
import warnings
|
|
993
|
+
|
|
994
|
+
warnings.warn(
|
|
995
|
+
"background_worker is deprecated and will be removed in v0.10.0. "
|
|
996
|
+
"Use 'python -m opencode_memory.jobs.worker' or the 'opencode-memory-job-worker' "
|
|
997
|
+
"command instead. The new system provides job queuing, retries, and metrics.",
|
|
998
|
+
DeprecationWarning,
|
|
999
|
+
stacklevel=2,
|
|
1000
|
+
)
|
|
1001
|
+
logger.warning(
|
|
1002
|
+
"DEPRECATION: background_worker is deprecated. "
|
|
1003
|
+
"Use 'opencode-memory-job-worker' instead for the new job-based system."
|
|
1004
|
+
)
|
|
1005
|
+
|
|
982
1006
|
worker = BackgroundWorker()
|
|
983
1007
|
|
|
984
1008
|
def handle_signal(signum, frame):
|
{opencode_semantic_memory-0.8.2 → opencode_semantic_memory-0.8.3}/src/opencode_memory/http_server.py
RENAMED
|
@@ -60,6 +60,10 @@ DEFAULT_PORT = int(os.environ.get("OPENCODE_MEMORY_PORT", "9824"))
|
|
|
60
60
|
API_KEY = os.environ.get("OPENCODE_MEMORY_API_KEY") # Optional auth
|
|
61
61
|
RATE_LIMIT = int(os.environ.get("OPENCODE_MEMORY_RATE_LIMIT", "60")) # per minute
|
|
62
62
|
|
|
63
|
+
# Loopback addresses are exempt from rate limiting: all local opencode sessions
|
|
64
|
+
# and their subagents connect over loopback and are trusted.
|
|
65
|
+
_LOCAL_IPS = frozenset({"127.0.0.1", "::1", "localhost"})
|
|
66
|
+
|
|
63
67
|
|
|
64
68
|
class RateLimiter:
|
|
65
69
|
"""Simple in-memory rate limiter using sliding window."""
|
|
@@ -69,20 +73,38 @@ class RateLimiter:
|
|
|
69
73
|
self.window_seconds = 60
|
|
70
74
|
self._requests: dict[str, list[float]] = defaultdict(list)
|
|
71
75
|
|
|
72
|
-
def
|
|
73
|
-
"""Get
|
|
74
|
-
# Use X-Forwarded-For if behind proxy, otherwise use client IP
|
|
76
|
+
def _get_client_ip(self, scope: dict) -> str:
|
|
77
|
+
"""Get the originating IP for a request."""
|
|
75
78
|
headers = dict(scope.get("headers", []))
|
|
76
79
|
forwarded = headers.get(b"x-forwarded-for", b"").decode()
|
|
77
80
|
if forwarded:
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
81
|
+
return forwarded.split(",")[0].strip()
|
|
82
|
+
client = scope.get("client", ("unknown", 0))
|
|
83
|
+
return client[0] if client else "unknown"
|
|
84
|
+
|
|
85
|
+
def _get_client_id(self, scope: dict) -> str:
|
|
86
|
+
"""Get client identifier for rate limiting.
|
|
87
|
+
|
|
88
|
+
Prefers the opencode session header so that multiple concurrent
|
|
89
|
+
sessions/subagents on the same host get independent rate-limit
|
|
90
|
+
buckets rather than all sharing a single localhost IP bucket
|
|
91
|
+
(which caused startup bursts to trip the limit and drop the
|
|
92
|
+
mcp-remote connection). Falls back to client IP.
|
|
93
|
+
"""
|
|
94
|
+
headers = dict(scope.get("headers", []))
|
|
95
|
+
session_id = headers.get(b"x-opencode-session", b"").decode()
|
|
96
|
+
if session_id:
|
|
97
|
+
return f"session:{session_id[:16]}"
|
|
98
|
+
return self._get_client_ip(scope)
|
|
83
99
|
|
|
84
100
|
def is_allowed(self, scope: dict) -> tuple[bool, int]:
|
|
85
101
|
"""Check if request is allowed. Returns (allowed, retry_after_seconds)."""
|
|
102
|
+
# Local traffic is trusted and must not be rate limited: all opencode
|
|
103
|
+
# sessions and subagents connect over loopback, and throttling them
|
|
104
|
+
# only serves to break legitimate concurrent usage.
|
|
105
|
+
if self._get_client_ip(scope) in _LOCAL_IPS:
|
|
106
|
+
return True, 0
|
|
107
|
+
|
|
86
108
|
client_id = self._get_client_id(scope)
|
|
87
109
|
now = time.time()
|
|
88
110
|
window_start = now - self.window_seconds
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"""Background job queue system (Sidekiq-like)."""
|
|
2
|
+
|
|
3
|
+
from opencode_memory.jobs.circuit_breaker import (
|
|
4
|
+
CircuitBreakerManager,
|
|
5
|
+
CircuitBreakerOpenError,
|
|
6
|
+
)
|
|
7
|
+
from opencode_memory.jobs.executor import (
|
|
8
|
+
JobExecutor,
|
|
9
|
+
JobExecutorBuilder,
|
|
10
|
+
ResourceLimits,
|
|
11
|
+
)
|
|
12
|
+
from opencode_memory.jobs.handlers import JobHandlers
|
|
13
|
+
from opencode_memory.jobs.queue import (
|
|
14
|
+
DEFAULT_CONFIGS,
|
|
15
|
+
JobConfigRegistry,
|
|
16
|
+
JobQueue,
|
|
17
|
+
)
|
|
18
|
+
from opencode_memory.jobs.scheduler import (
|
|
19
|
+
DEFAULT_SCHEDULES,
|
|
20
|
+
JobScheduler,
|
|
21
|
+
ScheduleConfig,
|
|
22
|
+
)
|
|
23
|
+
from opencode_memory.jobs.worker import BackgroundJobWorker
|
|
24
|
+
from opencode_memory.models import (
|
|
25
|
+
BackgroundJob,
|
|
26
|
+
CircuitBreaker,
|
|
27
|
+
CircuitBreakerState,
|
|
28
|
+
DeadJob,
|
|
29
|
+
JobConfig,
|
|
30
|
+
JobMetrics,
|
|
31
|
+
JobStatus,
|
|
32
|
+
ResourceType,
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
__all__ = [
|
|
36
|
+
# Queue
|
|
37
|
+
"JobQueue",
|
|
38
|
+
"JobConfigRegistry",
|
|
39
|
+
"DEFAULT_CONFIGS",
|
|
40
|
+
# Scheduler
|
|
41
|
+
"JobScheduler",
|
|
42
|
+
"ScheduleConfig",
|
|
43
|
+
"DEFAULT_SCHEDULES",
|
|
44
|
+
# Executor
|
|
45
|
+
"JobExecutor",
|
|
46
|
+
"JobExecutorBuilder",
|
|
47
|
+
"ResourceLimits",
|
|
48
|
+
# Handlers
|
|
49
|
+
"JobHandlers",
|
|
50
|
+
# Worker
|
|
51
|
+
"BackgroundJobWorker",
|
|
52
|
+
# Circuit Breaker
|
|
53
|
+
"CircuitBreakerManager",
|
|
54
|
+
"CircuitBreakerOpenError",
|
|
55
|
+
# Models
|
|
56
|
+
"BackgroundJob",
|
|
57
|
+
"CircuitBreaker",
|
|
58
|
+
"CircuitBreakerState",
|
|
59
|
+
"DeadJob",
|
|
60
|
+
"JobConfig",
|
|
61
|
+
"JobMetrics",
|
|
62
|
+
"JobStatus",
|
|
63
|
+
"ResourceType",
|
|
64
|
+
]
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
"""Circuit breaker pattern for protecting external resources."""
|
|
2
|
+
|
|
3
|
+
import logging
|
|
4
|
+
from collections.abc import Generator
|
|
5
|
+
from contextlib import contextmanager
|
|
6
|
+
from datetime import UTC, datetime
|
|
7
|
+
|
|
8
|
+
from opencode_memory.models import (
|
|
9
|
+
CircuitBreaker as CircuitBreakerModel,
|
|
10
|
+
)
|
|
11
|
+
from opencode_memory.models import (
|
|
12
|
+
CircuitBreakerState,
|
|
13
|
+
Memory,
|
|
14
|
+
MemoryCategory,
|
|
15
|
+
ResourceType,
|
|
16
|
+
)
|
|
17
|
+
from opencode_memory.storage.sqlite import SQLiteStorage
|
|
18
|
+
|
|
19
|
+
logger = logging.getLogger(__name__)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class CircuitBreakerOpenError(Exception):
|
|
23
|
+
"""Raised when the circuit breaker is open."""
|
|
24
|
+
|
|
25
|
+
def __init__(self, resource_type: str, message: str | None = None):
|
|
26
|
+
self.resource_type = resource_type
|
|
27
|
+
super().__init__(message or f"Circuit breaker for {resource_type} is OPEN")
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class CircuitBreakerManager:
|
|
31
|
+
"""Manages circuit breakers for different resource types.
|
|
32
|
+
|
|
33
|
+
The circuit breaker pattern prevents cascade failures by:
|
|
34
|
+
1. CLOSED: Normal operation, requests allowed
|
|
35
|
+
2. OPEN: After N failures, block all requests for a timeout period
|
|
36
|
+
3. HALF_OPEN: After timeout, allow one test request
|
|
37
|
+
|
|
38
|
+
State persistence is backed by SQLite for durability across restarts.
|
|
39
|
+
When a circuit breaker opens, it creates a blocker in memory for boot context visibility.
|
|
40
|
+
"""
|
|
41
|
+
|
|
42
|
+
# Configuration
|
|
43
|
+
FAILURE_THRESHOLD = 5 # Failures before opening
|
|
44
|
+
RESET_TIMEOUT_SECONDS = 300 # 5 minutes before trying half-open
|
|
45
|
+
HALF_OPEN_MAX_ATTEMPTS = 2 # Successes needed to close from half-open
|
|
46
|
+
|
|
47
|
+
def __init__(self, sqlite: SQLiteStorage):
|
|
48
|
+
self.sqlite = sqlite
|
|
49
|
+
self._breakers: dict[ResourceType, CircuitBreakerModel] = {}
|
|
50
|
+
|
|
51
|
+
def _get_breaker(self, resource_type: ResourceType) -> CircuitBreakerModel:
|
|
52
|
+
"""Get or create a circuit breaker for a resource type."""
|
|
53
|
+
if resource_type not in self._breakers:
|
|
54
|
+
self._breakers[resource_type] = self.sqlite.circuit_breaker_get(resource_type.value)
|
|
55
|
+
return self._breakers[resource_type]
|
|
56
|
+
|
|
57
|
+
def _save_breaker(self, breaker: CircuitBreakerModel) -> None:
|
|
58
|
+
"""Save breaker state to database."""
|
|
59
|
+
self.sqlite.circuit_breaker_update(breaker)
|
|
60
|
+
self._breakers[breaker.resource_type] = breaker
|
|
61
|
+
|
|
62
|
+
def can_execute(self, resource_type: ResourceType) -> bool:
|
|
63
|
+
"""Check if requests are allowed for this resource.
|
|
64
|
+
|
|
65
|
+
Returns True if the circuit is closed or half-open.
|
|
66
|
+
"""
|
|
67
|
+
breaker = self._get_breaker(resource_type)
|
|
68
|
+
|
|
69
|
+
if breaker.state == CircuitBreakerState.CLOSED:
|
|
70
|
+
return True
|
|
71
|
+
|
|
72
|
+
if breaker.state == CircuitBreakerState.OPEN:
|
|
73
|
+
# Check if timeout has elapsed
|
|
74
|
+
if breaker.opened_at:
|
|
75
|
+
elapsed = (datetime.now(UTC) - breaker.opened_at).total_seconds()
|
|
76
|
+
if elapsed >= self.RESET_TIMEOUT_SECONDS:
|
|
77
|
+
# Transition to half-open
|
|
78
|
+
breaker.state = CircuitBreakerState.HALF_OPEN
|
|
79
|
+
breaker.half_open_attempts = 0
|
|
80
|
+
self._save_breaker(breaker)
|
|
81
|
+
logger.info(f"{resource_type.value} circuit breaker entering half-open state")
|
|
82
|
+
return True
|
|
83
|
+
return False
|
|
84
|
+
|
|
85
|
+
# Half-open: allow requests for testing
|
|
86
|
+
return True
|
|
87
|
+
|
|
88
|
+
def record_success(self, resource_type: ResourceType) -> None:
|
|
89
|
+
"""Record a successful call to the resource."""
|
|
90
|
+
breaker = self._get_breaker(resource_type)
|
|
91
|
+
breaker.last_success_at = datetime.now(UTC)
|
|
92
|
+
|
|
93
|
+
if breaker.state == CircuitBreakerState.HALF_OPEN:
|
|
94
|
+
breaker.half_open_attempts += 1
|
|
95
|
+
if breaker.half_open_attempts >= self.HALF_OPEN_MAX_ATTEMPTS:
|
|
96
|
+
# Close the circuit
|
|
97
|
+
breaker.state = CircuitBreakerState.CLOSED
|
|
98
|
+
breaker.failure_count = 0
|
|
99
|
+
breaker.opened_at = None
|
|
100
|
+
logger.info(f"{resource_type.value} circuit breaker CLOSED (recovered)")
|
|
101
|
+
self._resolve_blocker(resource_type)
|
|
102
|
+
|
|
103
|
+
elif breaker.state == CircuitBreakerState.CLOSED:
|
|
104
|
+
# Reset failure count on success
|
|
105
|
+
if breaker.failure_count > 0:
|
|
106
|
+
breaker.failure_count = 0
|
|
107
|
+
|
|
108
|
+
self._save_breaker(breaker)
|
|
109
|
+
|
|
110
|
+
def record_failure(self, resource_type: ResourceType, error: Exception) -> None:
|
|
111
|
+
"""Record a failed call to the resource."""
|
|
112
|
+
breaker = self._get_breaker(resource_type)
|
|
113
|
+
now = datetime.now(UTC)
|
|
114
|
+
|
|
115
|
+
breaker.failure_count += 1
|
|
116
|
+
breaker.last_failure_at = now
|
|
117
|
+
|
|
118
|
+
if breaker.state == CircuitBreakerState.HALF_OPEN:
|
|
119
|
+
# Failure in half-open: go back to open
|
|
120
|
+
breaker.state = CircuitBreakerState.OPEN
|
|
121
|
+
breaker.opened_at = now
|
|
122
|
+
breaker.half_open_attempts = 0
|
|
123
|
+
logger.warning(f"{resource_type.value} circuit breaker re-OPENED from half-open: {error}")
|
|
124
|
+
|
|
125
|
+
elif breaker.state == CircuitBreakerState.CLOSED:
|
|
126
|
+
if breaker.failure_count >= self.FAILURE_THRESHOLD:
|
|
127
|
+
# Trip the breaker
|
|
128
|
+
breaker.state = CircuitBreakerState.OPEN
|
|
129
|
+
breaker.opened_at = now
|
|
130
|
+
logger.error(
|
|
131
|
+
f"{resource_type.value} circuit breaker OPENED after {breaker.failure_count} failures: {error}"
|
|
132
|
+
)
|
|
133
|
+
self._create_blocker(resource_type, error)
|
|
134
|
+
|
|
135
|
+
self._save_breaker(breaker)
|
|
136
|
+
|
|
137
|
+
def _create_blocker(self, resource_type: ResourceType, error: Exception) -> None:
|
|
138
|
+
"""Create a blocker memory when circuit opens."""
|
|
139
|
+
content = (
|
|
140
|
+
f"Circuit breaker for {resource_type.value.upper()} is OPEN.\n\n"
|
|
141
|
+
f"The {resource_type.value} service experienced {self.FAILURE_THRESHOLD} "
|
|
142
|
+
f"consecutive failures and has been temporarily disabled.\n\n"
|
|
143
|
+
f"Last error: {type(error).__name__}: {error}\n\n"
|
|
144
|
+
f"The circuit will automatically test recovery in "
|
|
145
|
+
f"{self.RESET_TIMEOUT_SECONDS // 60} minutes."
|
|
146
|
+
)
|
|
147
|
+
|
|
148
|
+
memory = Memory(
|
|
149
|
+
category=MemoryCategory.BLOCKER,
|
|
150
|
+
content=content,
|
|
151
|
+
what=f"{resource_type.value.upper()} circuit breaker OPEN",
|
|
152
|
+
why="Prevent cascade failures from repeated service errors",
|
|
153
|
+
entities=[f"circuit_breaker:{resource_type.value}"],
|
|
154
|
+
)
|
|
155
|
+
self.sqlite.insert_memory(memory)
|
|
156
|
+
|
|
157
|
+
def _resolve_blocker(self, resource_type: ResourceType) -> None:
|
|
158
|
+
"""Resolve the blocker when circuit closes."""
|
|
159
|
+
# Find and resolve the blocker
|
|
160
|
+
with self.sqlite._get_conn() as conn:
|
|
161
|
+
cursor = conn.execute(
|
|
162
|
+
"""
|
|
163
|
+
UPDATE memories
|
|
164
|
+
SET resolved_at = ?
|
|
165
|
+
WHERE category = 'blocker'
|
|
166
|
+
AND content LIKE ?
|
|
167
|
+
AND resolved_at IS NULL
|
|
168
|
+
""",
|
|
169
|
+
(
|
|
170
|
+
datetime.now(UTC).isoformat(),
|
|
171
|
+
f"%circuit breaker for {resource_type.value.upper()}%",
|
|
172
|
+
),
|
|
173
|
+
)
|
|
174
|
+
if cursor.rowcount > 0:
|
|
175
|
+
logger.info(f"Resolved {resource_type.value} circuit breaker blocker")
|
|
176
|
+
|
|
177
|
+
def get_state(self, resource_type: ResourceType) -> CircuitBreakerState:
|
|
178
|
+
"""Get the current state of a circuit breaker."""
|
|
179
|
+
breaker = self._get_breaker(resource_type)
|
|
180
|
+
return breaker.state
|
|
181
|
+
|
|
182
|
+
def get_all_states(self) -> dict[str, CircuitBreakerState]:
|
|
183
|
+
"""Get all circuit breaker states."""
|
|
184
|
+
return self.sqlite.circuit_breaker_get_all()
|
|
185
|
+
|
|
186
|
+
def force_open(self, resource_type: ResourceType, reason: str) -> None:
|
|
187
|
+
"""Manually open a circuit breaker."""
|
|
188
|
+
breaker = self._get_breaker(resource_type)
|
|
189
|
+
breaker.state = CircuitBreakerState.OPEN
|
|
190
|
+
breaker.opened_at = datetime.now(UTC)
|
|
191
|
+
self._save_breaker(breaker)
|
|
192
|
+
|
|
193
|
+
# Create a blocker
|
|
194
|
+
memory = Memory(
|
|
195
|
+
category=MemoryCategory.BLOCKER,
|
|
196
|
+
content=(f"Circuit breaker for {resource_type.value.upper()} manually OPENED.\n\nReason: {reason}"),
|
|
197
|
+
what=f"{resource_type.value.upper()} circuit breaker manually opened",
|
|
198
|
+
why=reason,
|
|
199
|
+
entities=[f"circuit_breaker:{resource_type.value}"],
|
|
200
|
+
)
|
|
201
|
+
self.sqlite.insert_memory(memory)
|
|
202
|
+
logger.warning(f"{resource_type.value} circuit breaker manually OPENED: {reason}")
|
|
203
|
+
|
|
204
|
+
def force_close(self, resource_type: ResourceType) -> None:
|
|
205
|
+
"""Manually close a circuit breaker."""
|
|
206
|
+
breaker = self._get_breaker(resource_type)
|
|
207
|
+
breaker.state = CircuitBreakerState.CLOSED
|
|
208
|
+
breaker.failure_count = 0
|
|
209
|
+
breaker.opened_at = None
|
|
210
|
+
breaker.half_open_attempts = 0
|
|
211
|
+
self._save_breaker(breaker)
|
|
212
|
+
self._resolve_blocker(resource_type)
|
|
213
|
+
logger.info(f"{resource_type.value} circuit breaker manually CLOSED")
|
|
214
|
+
|
|
215
|
+
@contextmanager
|
|
216
|
+
def protect(self, resource_type: ResourceType) -> Generator[None, None, None]:
|
|
217
|
+
"""Context manager for protected calls.
|
|
218
|
+
|
|
219
|
+
Usage:
|
|
220
|
+
with circuit_breaker.protect(ResourceType.LLM):
|
|
221
|
+
result = call_llm(...)
|
|
222
|
+
|
|
223
|
+
Raises:
|
|
224
|
+
CircuitBreakerOpenError: If the circuit is open
|
|
225
|
+
"""
|
|
226
|
+
if not self.can_execute(resource_type):
|
|
227
|
+
raise CircuitBreakerOpenError(resource_type.value)
|
|
228
|
+
|
|
229
|
+
try:
|
|
230
|
+
yield
|
|
231
|
+
self.record_success(resource_type)
|
|
232
|
+
except CircuitBreakerOpenError:
|
|
233
|
+
# Re-raise without recording as failure
|
|
234
|
+
raise
|
|
235
|
+
except Exception as e:
|
|
236
|
+
self.record_failure(resource_type, e)
|
|
237
|
+
raise
|