memuron 0.1.1__py3-none-any.whl

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 (74) hide show
  1. memuron/__init__.py +3 -0
  2. memuron/actions/__init__.py +12 -0
  3. memuron/actions/context.py +63 -0
  4. memuron/actions/helpers.py +88 -0
  5. memuron/actions/memory.py +340 -0
  6. memuron/actions/memory_write.py +290 -0
  7. memuron/actions/nodes.py +340 -0
  8. memuron/actions/registry.py +5 -0
  9. memuron/actions/runtime.py +37 -0
  10. memuron/actions/spaces_documents.py +720 -0
  11. memuron/actions/sync.py +155 -0
  12. memuron/application/__init__.py +1 -0
  13. memuron/application/api.py +206 -0
  14. memuron/application/app.py +103 -0
  15. memuron/application/capabilities.py +82 -0
  16. memuron/application/cli.py +35 -0
  17. memuron/application/config.py +176 -0
  18. memuron/application/mcp.py +44 -0
  19. memuron/application/mcp_oauth.py +290 -0
  20. memuron/application/registry.py +52 -0
  21. memuron/context.py +532 -0
  22. memuron/documents/__init__.py +1 -0
  23. memuron/documents/link_guardian.py +192 -0
  24. memuron/documents/linking.py +292 -0
  25. memuron/documents/parser.py +1152 -0
  26. memuron/documents/storage.py +151 -0
  27. memuron/documents/url_ingest.py +375 -0
  28. memuron/domain/__init__.py +1 -0
  29. memuron/domain/decoders.py +1 -0
  30. memuron/domain/encoders.py +185 -0
  31. memuron/domain/lifecycles.py +8 -0
  32. memuron/domain/limits.py +6 -0
  33. memuron/domain/representations.py +56 -0
  34. memuron/domain/schemas.py +581 -0
  35. memuron/domain/scope_filter.py +104 -0
  36. memuron/graphfs/__init__.py +1 -0
  37. memuron/graphfs/manual.py +635 -0
  38. memuron/graphfs/projection.py +578 -0
  39. memuron/graphfs/query.py +1782 -0
  40. memuron/graphfs/read_model.py +574 -0
  41. memuron/ingest/__init__.py +1 -0
  42. memuron/ingest/guardian.py +213 -0
  43. memuron/ingest/jobs.py +424 -0
  44. memuron/ingest/prompts.py +147 -0
  45. memuron/memory/__init__.py +1 -0
  46. memuron/memory/engine.py +35 -0
  47. memuron/memory/projections.py +452 -0
  48. memuron/memory/recipes.py +3247 -0
  49. memuron/persistence/__init__.py +1 -0
  50. memuron/persistence/db_pool.py +57 -0
  51. memuron/persistence/identity_store.py +918 -0
  52. memuron/persistence/store_helpers.py +16 -0
  53. memuron/search/__init__.py +1 -0
  54. memuron/search/fulltext.py +110 -0
  55. memuron/search/hybrid.py +284 -0
  56. memuron/search/pgvector.py +252 -0
  57. memuron/security/__init__.py +1 -0
  58. memuron/security/auth.py +143 -0
  59. memuron/security/auth_provider.py +119 -0
  60. memuron/security/authorization.py +53 -0
  61. memuron/security/clerk_scopes.py +94 -0
  62. memuron/security/clerk_webhooks.py +61 -0
  63. memuron/security/jwt_tokens.py +53 -0
  64. memuron/security/passwords.py +38 -0
  65. memuron/security/tenant.py +58 -0
  66. memuron/spaces/__init__.py +1 -0
  67. memuron/spaces/model.py +35 -0
  68. memuron/spaces/service.py +155 -0
  69. memuron/sync/__init__.py +25 -0
  70. memuron/sync/folder.py +828 -0
  71. memuron-0.1.1.dist-info/METADATA +242 -0
  72. memuron-0.1.1.dist-info/RECORD +74 -0
  73. memuron-0.1.1.dist-info/WHEEL +4 -0
  74. memuron-0.1.1.dist-info/entry_points.txt +4 -0
@@ -0,0 +1,242 @@
1
+ Metadata-Version: 2.3
2
+ Name: memuron
3
+ Version: 0.1.1
4
+ Summary: Arthaanu application built on Artha Engine.
5
+ Requires-Dist: artha-engine[auth,mcp,app]>=0.1.3
6
+ Requires-Dist: agno>=2.3.11
7
+ Requires-Dist: fastapi>=0.115.0
8
+ Requires-Dist: uvicorn[standard]>=0.34.0
9
+ Requires-Dist: psycopg[binary]>=3.2.0
10
+ Requires-Dist: psycopg-pool>=3.3.1
11
+ Requires-Dist: pyjwt>=2.10.0
12
+ Requires-Dist: email-validator>=2.2.0
13
+ Requires-Dist: pypdf>=6.0.0
14
+ Requires-Dist: python-multipart>=0.0.20
15
+ Requires-Dist: requests>=2.34.0
16
+ Requires-Dist: pymupdf>=1.23
17
+ Requires-Dist: python-docx>=1.1.0
18
+ Requires-Dist: openpyxl>=3.1.5
19
+ Requires-Dist: python-pptx>=1.0.2
20
+ Requires-Dist: xlrd>=2.0.2
21
+ Requires-Dist: olefile>=0.47
22
+ Requires-Dist: svix>=1.40.0
23
+ Requires-Dist: boto3>=1.35.0
24
+ Requires-Python: >=3.12
25
+ Description-Content-Type: text/markdown
26
+
27
+ # memuron
28
+
29
+ An Arthaanu application built on Artha Engine.
30
+
31
+ **Documentation:** see [`docs/`](./docs/README.md) for architecture, rich nodes, document ingest, Guardian/spaces, frontend workbench, deployment, [Railway agent deploy guide](./docs/railway-deploy.md), and troubleshooting.
32
+
33
+ ## Mental Model
34
+
35
+ Keep the engine small and generic. Put product memory behavior here:
36
+
37
+ - custom Arthaanu types in `memuron/representations.py`
38
+ - encoders that turn raw product input into meaning objects
39
+ - lifecycle steps that normalize, merge, dedupe, or retire objects
40
+ - projections that replay the event ledger into fast read models
41
+ - decoders/API routes that expose product-specific reads
42
+
43
+ The semantic event ledger is canonical. Projections are derived and rebuildable.
44
+
45
+ Memuron writes product semantics into that ledger, but keeps the engine model clean:
46
+
47
+ - memory create/update events stay product-specific: `memory.created`, `memory.updated`
48
+ - memory/link deletes use the canonical engine event type `delete`
49
+ - Memuron-specific delete meaning lives in metadata as `domain_event_type = memory.deleted` or `link.removed`
50
+ - request identity is audit metadata, not hidden global state
51
+
52
+ ## Database
53
+
54
+ Production uses **PostgreSQL** (Railway project `talented-exploration`).
55
+
56
+ | Variable | Purpose |
57
+ |----------|---------|
58
+ | `ARTHA_DATABASE_URL` | PostgreSQL DSN for ledger + projections (preferred) |
59
+ | `ARTHA_DB_PATH` | Fallback SQLite path for local-only dev |
60
+ | `OPENROUTER_API_KEY` | OpenRouter key for Agno Guardian writes |
61
+ | `GUARDIAN_MODEL` | Guardian LLM model (default: `inception/mercury-2`) |
62
+ | `ARTHA_EMBEDDER` | `fastembed` (default) or `deterministic` |
63
+ | `ARTHA_EMBED_MODEL` | Nomic embed model (default: `nomic-ai/nomic-embed-text-v1.5-Q`) |
64
+ | `MEMURON_API_KEY` | Optional API key for `/memuron/*` and `/engine/*` routes |
65
+
66
+ Copy `.env.example` to `.env` and set `ARTHA_DATABASE_URL` to the Railway **public** Postgres URL for local development.
67
+
68
+ ## Run
69
+
70
+ Use **two terminals**, both starting from the **memuron repo root** (`Documents/memuron`), not `frontend/`.
71
+
72
+ **Terminal 1 — backend**
73
+
74
+ ```bash
75
+ cd /Users/rakshithg/Documents/memuron
76
+ ./scripts/dev-backend.sh
77
+ # or manually:
78
+ # source .env && uv run uvicorn memuron.application.api:create_app --factory --host 127.0.0.1 --port 8767
79
+ ```
80
+
81
+ **Terminal 2 — frontend**
82
+
83
+ ```bash
84
+ cd /Users/rakshithg/Documents/memuron
85
+ ./scripts/dev-frontend.sh
86
+ # or: cd frontend && npm run dev
87
+ ```
88
+
89
+ Open http://localhost:3000 — the workbench proxies to `http://127.0.0.1:8767/engine`; Memories uses `http://127.0.0.1:8767/memuron`.
90
+
91
+ `frontend/.env.local` must use the **`/engine` suffix**:
92
+
93
+ ```bash
94
+ ARTHA_ENGINE_URL=http://127.0.0.1:8767/engine
95
+ MEMURON_API_URL=http://127.0.0.1:8767/memuron
96
+ ```
97
+
98
+ If you see **502** on `/api/engine/*`, the backend is not running or the URL is wrong. Do not run `source .env` or `uv run` from inside `frontend/` — `.env` lives in the repo root and `uv` must use the memuron project.
99
+
100
+ ```bash
101
+ uv sync
102
+ cp .env.example .env # then edit ARTHA_DATABASE_URL
103
+ uv run pytest # fast local suite (SQLite, skips integration)
104
+ uv run pytest -m integration # Postgres job queue + live Guardian (needs .env)
105
+ uv run artha doctor
106
+ ```
107
+
108
+ ## MCP and CLI
109
+
110
+ The stdio MCP server is intentionally restricted to one explicit Clerk user
111
+ and organization. Configure its identity before starting it:
112
+
113
+ ```bash
114
+ export MEMURON_MCP_ACTOR_ID=user_...
115
+ export MEMURON_MCP_TENANT_ID=org_...
116
+ export MEMURON_MCP_SCOPES=memory:read,memory:write,memory:delete,space:admin
117
+ uv run memuron-mcp
118
+ ```
119
+
120
+ The compact MCP surface centers on `memuron_help` and `memuron_query`, with
121
+ memory ingest/get/update/delete/job polling and the complete space lifecycle.
122
+ `memuron_document_source` resolves a document, chunk, image, or document
123
+ collection node to the original uploaded file metadata and a short-lived
124
+ download URL.
125
+ Lower-level graph, list, collection, and bulk operations remain available
126
+ through HTTP and the broader CLI without overwhelming an agent's tool picker.
127
+ `memuron_get` bounds content by default and supports field selection, while
128
+ `memuron_update` exposes flat `memory_id`, `content`, and `scope` arguments.
129
+ Space arguments accept UUIDs, slugs, `space.*` tokens, and `/spaces/space.*`
130
+ paths.
131
+
132
+ ```bash
133
+ uv run memuron --help
134
+ uv run memuron --tenant-id org_... query \
135
+ --cwd /spaces/space.personal \
136
+ --query 'semantic "deployment decisions" | head 5'
137
+ uv run memuron --tenant-id org_... space list
138
+ ```
139
+
140
+ All direct-ID operations verify that the target belongs to the active
141
+ organization. API-key and local CLI callers must therefore provide a tenant.
142
+
143
+ For editor login/logout, use the Railway-hosted Streamable HTTP endpoint:
144
+
145
+ ```json
146
+ {
147
+ "mcpServers": {
148
+ "memuron": {
149
+ "url": "https://memuron-production.up.railway.app/mcp"
150
+ }
151
+ }
152
+ }
153
+ ```
154
+
155
+ Cursor discovers Clerk through OAuth protected-resource metadata, opens the
156
+ Clerk consent flow, and stores its own access and refresh tokens. The OAuth
157
+ application only needs the standard `profile` scope. Memuron resolves the
158
+ signed-in user's Clerk organization membership server-side and maps it to the
159
+ configured Memuron tenant. Enable Dynamic client registration in the Clerk
160
+ Dashboard under OAuth applications so MCP clients can register with PKCE
161
+ automatically.
162
+
163
+ For users who belong to several mapped Clerk organizations, set
164
+ `MEMURON_MCP_DEFAULT_CLERK_ORG_ID` to select one explicitly when the OAuth token
165
+ does not carry an active organization.
166
+
167
+ ### Document storage
168
+
169
+ Memuron keeps the searchable document graph in Postgres: normalized markdown,
170
+ chunks, embeddings, links, metadata, and append-only events. Original uploads
171
+ and extracted binary assets belong in S3-compatible object storage. This hybrid
172
+ boundary preserves transactional graph queries without turning Postgres into a
173
+ binary file store.
174
+
175
+ ## API (prefix `/memuron`)
176
+
177
+ Core routes (see [`docs/README.md`](./docs/README.md) for full detail):
178
+
179
+ | Method | Path | Description |
180
+ |--------|------|-------------|
181
+ | POST | `/memories` | Create memory (async Guardian ingest, returns job id) |
182
+ | POST | `/nodes` | Rich node (text / image / document / collection) + optional auto-link |
183
+ | POST | `/documents/ingest` | Multipart file → collection + source + chunks + filtered images |
184
+ | POST | `/collections` | Collection node |
185
+ | POST | `/collections/{id}/placements` | Place member in collection |
186
+ | GET | `/collections/{id}/members` | List collection members |
187
+ | GET | `/graph/export` | Graph for UI |
188
+ | GET | `/memories` | List memories (`scope`, `limit`, `offset`) |
189
+ | POST | `/memories/search` | Semantic search (`query`, `k`, optional `scope`) |
190
+ | GET | `/memories/{id}` | Get one memory |
191
+ | POST | `/memories/batch` | Get many by id |
192
+ | PUT | `/memories/{id}` | Update content/scope (sync, no Guardian) |
193
+ | DELETE | `/memories/{id}` | Delete one memory |
194
+ | POST | `/memories/bulk-delete` | Delete by scope filter |
195
+ | POST | `/memories/unlink` | Remove link between two memories |
196
+ | GET | `/memories/count` | Count with optional filters |
197
+ | GET | `/jobs/{id}` | Poll async ingest job status |
198
+ | GET | `/spaces` | List org spaces |
199
+
200
+ ## Auth and Audit Metadata
201
+
202
+ Memuron uses bring-your-own API-key auth at the product boundary. When `MEMURON_API_KEY` is set, protected routes accept either:
203
+
204
+ ```text
205
+ Authorization: Bearer <key>
206
+ X-Memuron-Api-Key: <key>
207
+ ```
208
+
209
+ Optional audit headers are copied into semantic event metadata:
210
+
211
+ ```text
212
+ X-Memuron-Actor-Id: agent_123
213
+ X-Memuron-Tenant-Id: workspace_456
214
+ X-Memuron-Scopes: memory:write,memory:delete
215
+ X-Request-Id: req_abc
216
+ ```
217
+
218
+ This applies to Memuron writes and to the mounted Artha Engine API under `/engine`. The engine remains auth-provider agnostic; Memuron decides how API keys, actors, tenants, and scopes map to product permissions.
219
+
220
+ The mounted engine exposes profile discovery at:
221
+
222
+ ```text
223
+ GET /engine/runtime/capabilities
224
+ ```
225
+
226
+ Example create → read flow:
227
+
228
+ ```bash
229
+ # Create (async)
230
+ curl -s -X POST http://127.0.0.1:8767/memuron/memories \
231
+ -H 'Content-Type: application/json' \
232
+ -d '{"content":"User enjoys rock climbing on weekends.","scope":["fitness.climbing"]}'
233
+
234
+ # Poll job until completed, then read
235
+ curl -s http://127.0.0.1:8767/memuron/memories/{memory_id}
236
+
237
+ # List and search
238
+ curl -s 'http://127.0.0.1:8767/memuron/memories?limit=20'
239
+ curl -s -X POST http://127.0.0.1:8767/memuron/memories/search \
240
+ -H 'Content-Type: application/json' \
241
+ -d '{"query":"rock climbing","k":5}'
242
+ ```
@@ -0,0 +1,74 @@
1
+ memuron/__init__.py,sha256=B7RUbuIzYVRBKVygo7DtGLkwIPHc8l9ZvyQTKtS3KnQ,86
2
+ memuron/actions/__init__.py,sha256=0E9guFn3cve6XZGKkIIAYC1yEkkJPHNJzfdthg6jvR0,596
3
+ memuron/actions/context.py,sha256=H8HRj8E5Ns4HDYad5nbywAOOWFsos3xK1c-amf63Iww,2141
4
+ memuron/actions/helpers.py,sha256=m9pu5-KT3YlxcTX2AYYfePuNCCkZsmVpqgzkmFW0Lp8,2915
5
+ memuron/actions/memory.py,sha256=inzsCA7V5evWPnHfLPPgVoIVMgjkVCivBRdl9R6kgME,10358
6
+ memuron/actions/memory_write.py,sha256=YKp6i0LIVBYqPcov1ddMfjLh-945Xykwf6a_ST0SIYg,9534
7
+ memuron/actions/nodes.py,sha256=bOcQmvhYyy3Y6rve2RbBI3vMoqUub7gjlZMfW3HIJHM,10712
8
+ memuron/actions/registry.py,sha256=q1ND_FRoCrII4e2jXTc8Inds2HOmH0japHfi4aUfqLY,109
9
+ memuron/actions/runtime.py,sha256=UNSwk1pXrP8RomsRPOUTT3KX7AB47dCJwO_ywIVsGcM,908
10
+ memuron/actions/spaces_documents.py,sha256=rT__Vd8DsS8OxWoDzE3oE87L-0Bo0rGrqNX3NkGYkIY,22909
11
+ memuron/actions/sync.py,sha256=zsFhpeF8RqmHhbdXuBY0CnBmQWt2N4p94YBOhHYbLSg,4779
12
+ memuron/application/__init__.py,sha256=5P4r1E_-k8WWW8G0GJ8bWausjJw7VmG9fHC6IeZ2yis,68
13
+ memuron/application/api.py,sha256=iKx7SXbS1xEZig8sMiDnslvlDJFjE-AByvDAt7rmgO0,7776
14
+ memuron/application/app.py,sha256=_Nvae_wPKtAPStFKXvRNAvz4CPZQALuWdspvZBU3oFA,4075
15
+ memuron/application/capabilities.py,sha256=bWLQTynWVmaQ59h7K1deB7ZNrOg0y9CIExi_TO6c9og,2676
16
+ memuron/application/cli.py,sha256=_q4k3TtJejctKyxo18c3jASfBZAZAL1E-n9glIxHjWU,1201
17
+ memuron/application/config.py,sha256=8zU4_1-xXCOIyVRphJQ7vocbLnz8XULVDFpcMwXGkpY,7289
18
+ memuron/application/mcp.py,sha256=w3j6Td_WB7IBOTQrSO4bt_xPMOlTiO4GivJQ8N8yf7o,1234
19
+ memuron/application/mcp_oauth.py,sha256=mKtwBf1jTvk0dFtW7qEn30eM_QF1zSgEFs8OKyKlDCk,10685
20
+ memuron/application/registry.py,sha256=eN-JCfI5b5-oKkbklJRVhvXDPa4pbU_7SROfvVgyEpU,2019
21
+ memuron/context.py,sha256=TRy-v9lnvskG_9CpR8TF_jKzlbvT2q_f2sjjKvnJ_Fo,16442
22
+ memuron/documents/__init__.py,sha256=RI4li-GMS2zMN61hdsaS4BYOGJlwscBILvtpazbDpE4,75
23
+ memuron/documents/link_guardian.py,sha256=upxx8xPpr94VynEe39FGBdbB0FEwRL5zmmyKrrtPh3I,6866
24
+ memuron/documents/linking.py,sha256=Ml3BklEN91l7-mfvGFmLkvlgZnTBMqd2lV_GENqvmVs,9567
25
+ memuron/documents/parser.py,sha256=nMmoJ-oUe86BDH-SnhdIPG71092jL1IjFFDdsTI9E5k,41138
26
+ memuron/documents/storage.py,sha256=I9LrN6VJOmrm4IUN6AQI1LbGMK-W9qbYzQT_mkV3LMQ,4592
27
+ memuron/documents/url_ingest.py,sha256=NohxeV7RKQjVjmFII4ENPEoTe3iMHkagfLfZT7tasm0,12716
28
+ memuron/domain/__init__.py,sha256=cm7Jcksowm9UFFi4E6uvIxMECcBDeysBv1W_UXeF8r8,71
29
+ memuron/domain/decoders.py,sha256=RTECAU_0aEGUTZMcBe-4u8wuU0eB3EAWOK6Kna8IXok,43
30
+ memuron/domain/encoders.py,sha256=_gtuDn0fybFM753XTyqEQnOq4vD__O86LW6ytGSzqpw,6727
31
+ memuron/domain/lifecycles.py,sha256=cCcdoU1Gmdo_bo-yzn-h-wJT4wGMnqoUkFByDEVlU2Q,397
32
+ memuron/domain/limits.py,sha256=POH2nC65doANRWqALoLJDFjj6RMThAUklbQh6JYIVpE,154
33
+ memuron/domain/representations.py,sha256=Y_AzUYa4vVNIlbKpH9H5ZT--IogvPzRaPB8oQmuRnJc,1583
34
+ memuron/domain/schemas.py,sha256=cx7R4PWJCZ1_PxVIDbuLgzgNGtbdmVErIfsX8TZbEiE,17435
35
+ memuron/domain/scope_filter.py,sha256=5CVoDJJG5a4wB0FmfeWvhwccbi8_WgPH_T_nOcsAUWE,3452
36
+ memuron/graphfs/__init__.py,sha256=5W2hz6Eugt5AjX_SYkDHD4ndC4aBKZ8rtc3oln2uvH4,76
37
+ memuron/graphfs/manual.py,sha256=WZFGEAuVvq9nF3yaGkOppK01lXyLEme6Vayx7GG67QA,28292
38
+ memuron/graphfs/projection.py,sha256=U3xAKP3hDQM8HUKRizqAfzzLwQ7BI9VwjqG9LuKpJ2c,23231
39
+ memuron/graphfs/query.py,sha256=XtHJohvYP8c0b5ZjROdtBm8BhZRqOVevF-NuEpevIaA,71044
40
+ memuron/graphfs/read_model.py,sha256=74yk1rH-TI6MYoy6QVfUKLT_OCCWA5yvQE3_a800loE,17927
41
+ memuron/ingest/__init__.py,sha256=TEIQXPab4cKDIYKIGZVkC2jW2jH2Jon-lGRQ4C3Cev4,71
42
+ memuron/ingest/guardian.py,sha256=wNz9To2_jC5eLiu7dzPogouUaEOm3_GgbO-e-1dwOaU,8140
43
+ memuron/ingest/jobs.py,sha256=O5yfcws2r3frDgOn-aMDGT7pnue-YPsXeJRSmaM_Z5w,15145
44
+ memuron/ingest/prompts.py,sha256=YUQJeIxUW9zARUZp9qaty_1zk_dPP1_ShMdgnKcSDpo,5377
45
+ memuron/memory/__init__.py,sha256=fErWrBOwv1XzXyTdDJP8lK37CmG1v6CxycJLEDOZU_8,67
46
+ memuron/memory/engine.py,sha256=H7mWlxA8C6EDNOUYc-RxPRdXE8We09v3VCsTO0SvTHg,1118
47
+ memuron/memory/projections.py,sha256=EVbua9n_WzTaZE8CsZ1PQF6KDVbzrCKkaIHsMDa7rRk,17978
48
+ memuron/memory/recipes.py,sha256=tPpIlSaP9RvcDgdQhdanQ8mBc_ZOcr0uwkKR0vKzIJs,113174
49
+ memuron/persistence/__init__.py,sha256=kwsZs154QTvUsV_2fsqkfJtJbRK0niFkV6tVk_Sb9Sk,68
50
+ memuron/persistence/db_pool.py,sha256=bL9cmw_JBtFPUSsxo419NUR4xlr1zd1fN9TSdkINIFU,1842
51
+ memuron/persistence/identity_store.py,sha256=lVLU9awJ8dQCNEqvaI7Jv0SpQo9cIeWf_8PmaAOcPic,35319
52
+ memuron/persistence/store_helpers.py,sha256=5Scnn6GSnh7Bvxll_g-CxdmnMxVNJMMBbBLOrRZqnW0,635
53
+ memuron/search/__init__.py,sha256=o1H6jl6QEY1umPkSl47pRGBQpusclXRIfS_15Tc1dYM,56
54
+ memuron/search/fulltext.py,sha256=vEolp5s5tNz-IBInl0c_YPYYmMx-bOkHFWKu24jO3lI,3301
55
+ memuron/search/hybrid.py,sha256=wU_nLnZ6tBOjxCut00A7h-MJb8AGybmCG6FI6QUxy7E,9759
56
+ memuron/search/pgvector.py,sha256=7hrWUxSH4_Ki15d2_JYE-khbZDBUUlfd3x261QWrjEM,8198
57
+ memuron/security/__init__.py,sha256=Men1S7LEuzD5EsiALh6FmOhi6073g21DBzrvA5s8t0Q,68
58
+ memuron/security/auth.py,sha256=YPCZZDVtDCOkVcfQZQPME3CA8J7t9RaqPn9D0Vn8rhc,4740
59
+ memuron/security/auth_provider.py,sha256=fVq4YC5MmTBL2t9DF2eJLVljicLKN7WkYRLBUR3yTzs,4213
60
+ memuron/security/authorization.py,sha256=SyqciJXNYRcqfVjMIri3xGpgUZUU7Y0wOcM4zwmq1Wg,1573
61
+ memuron/security/clerk_scopes.py,sha256=LeZR46-_mA443D2vEZPtVYdXPD9PMwqwfOvSRGGklvU,3002
62
+ memuron/security/clerk_webhooks.py,sha256=My5zS1_MaC5nE5JuHlQOqvnh6WTFgdwTzb40GMw7GNY,2317
63
+ memuron/security/jwt_tokens.py,sha256=dq0UdZw9M8dfLxE4IlmkJRjc_609ut0vjnsuzdior68,1337
64
+ memuron/security/passwords.py,sha256=mrKiV84Vz9WFBxafJE1tEYvJFIKogsgKZyMAMODfvxs,988
65
+ memuron/security/tenant.py,sha256=bpjZ3pdMteYffv3RgMcDMA9TmlE8w72YYmmtD-o7xWs,1667
66
+ memuron/spaces/__init__.py,sha256=BfkEhQc0fvSZ5VYD8hTuY20MG6d1lmeZ24sTLl6UI7g,52
67
+ memuron/spaces/model.py,sha256=HDwAfPTsxcnbaUeIMTBWX8-SzREIwfuKIr2Yls_ew-E,986
68
+ memuron/spaces/service.py,sha256=FpeQULzZRbCBExf0Mlg_-g5k8cc39-kAissM61a2bTY,4870
69
+ memuron/sync/__init__.py,sha256=gL7dLxgVSkHhuLnj3m0ZniEwoUkee9T-WbnmBeFHFzI,485
70
+ memuron/sync/folder.py,sha256=Yasn4PPOyYM5MdQT8iKy1CwrzvSanNe4uopDBh5eX4s,27551
71
+ memuron-0.1.1.dist-info/WHEEL,sha256=5w2T7AS2mz1-rW9CNagNYWRCaB0iQqBMYLwKdlgiR4Q,78
72
+ memuron-0.1.1.dist-info/entry_points.txt,sha256=gAxxXUnTzi2Xm_jpdEwCDpL5ZPe-0YyXEYJ2mikkTto,101
73
+ memuron-0.1.1.dist-info/METADATA,sha256=OpMGRGXJJAFlDNb0yRC2oxvIvbhMnu4JS5gwjckNpCc,9198
74
+ memuron-0.1.1.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: uv 0.9.7
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
@@ -0,0 +1,4 @@
1
+ [console_scripts]
2
+ memuron = memuron.application.cli:main
3
+ memuron-mcp = memuron.application.mcp:main
4
+