okb 1.0.0__py3-none-any.whl → 1.1.0__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.
okb/tokens.py CHANGED
@@ -22,6 +22,7 @@ from psycopg.rows import dict_row
22
22
  class TokenInfo:
23
23
  """Information about a token."""
24
24
 
25
+ id: int
25
26
  token_hash: str
26
27
  database: str
27
28
  permissions: str # 'ro' or 'rw'
@@ -143,7 +144,7 @@ def list_tokens(db_url: str) -> list[TokenInfo]:
143
144
  with psycopg.connect(db_url, row_factory=dict_row) as conn:
144
145
  results = conn.execute(
145
146
  """
146
- SELECT token_hash, permissions, description, created_at, last_used_at
147
+ SELECT id, token_hash, permissions, description, created_at, last_used_at
147
148
  FROM tokens
148
149
  ORDER BY created_at DESC
149
150
  """
@@ -151,6 +152,7 @@ def list_tokens(db_url: str) -> list[TokenInfo]:
151
152
 
152
153
  return [
153
154
  TokenInfo(
155
+ id=r["id"],
154
156
  token_hash=r["token_hash"],
155
157
  database=db_name,
156
158
  permissions=r["permissions"],
@@ -171,7 +173,7 @@ def delete_token(db_url: str, token_or_prefix: str) -> bool:
171
173
 
172
174
  Args:
173
175
  db_url: Database connection URL
174
- token_or_prefix: Full token or token prefix (e.g., 'lkb_personal_ro')
176
+ token_or_prefix: Full token or token prefix (e.g., 'okb_personal_ro')
175
177
 
176
178
  Returns:
177
179
  True if token was deleted, False if not found
@@ -199,6 +201,25 @@ def delete_token(db_url: str, token_or_prefix: str) -> bool:
199
201
  return False
200
202
 
201
203
 
204
+ def delete_token_by_id(db_url: str, token_id: int) -> bool:
205
+ """Delete a token by its ID.
206
+
207
+ Args:
208
+ db_url: Database connection URL
209
+ token_id: Token ID from the tokens table
210
+
211
+ Returns:
212
+ True if token was deleted, False if not found
213
+ """
214
+ with psycopg.connect(db_url) as conn:
215
+ result = conn.execute(
216
+ "DELETE FROM tokens WHERE id = %s RETURNING id",
217
+ (token_id,),
218
+ ).fetchone()
219
+ conn.commit()
220
+ return result is not None
221
+
222
+
202
223
  def verify_token(token: str, get_db_url_fn) -> TokenInfo | None:
203
224
  """Verify a token and return its info if valid.
204
225
 
@@ -225,7 +246,7 @@ def verify_token(token: str, get_db_url_fn) -> TokenInfo | None:
225
246
  with psycopg.connect(db_url, row_factory=dict_row) as conn:
226
247
  result = conn.execute(
227
248
  """
228
- SELECT token_hash, permissions, description, created_at, last_used_at
249
+ SELECT id, token_hash, permissions, description, created_at, last_used_at
229
250
  FROM tokens
230
251
  WHERE token_hash = %s
231
252
  """,
@@ -243,6 +264,7 @@ def verify_token(token: str, get_db_url_fn) -> TokenInfo | None:
243
264
  conn.commit()
244
265
 
245
266
  return TokenInfo(
267
+ id=result["id"],
246
268
  token_hash=result["token_hash"],
247
269
  database=database,
248
270
  permissions=result["permissions"],
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: okb
3
- Version: 1.0.0
3
+ Version: 1.1.0
4
4
  Summary: Personal knowledge base with semantic search for LLMs
5
5
  Requires-Python: >=3.11
6
6
  Classifier: Programming Language :: Python :: 3
@@ -13,6 +13,7 @@ Provides-Extra: docx
13
13
  Provides-Extra: llm
14
14
  Provides-Extra: llm-bedrock
15
15
  Provides-Extra: pdf
16
+ Provides-Extra: todoist
16
17
  Provides-Extra: web
17
18
  Requires-Dist: PyGithub (>=2.0.0)
18
19
  Requires-Dist: anthropic (>=0.40.0) ; extra == "all"
@@ -35,10 +36,15 @@ Requires-Dist: python-docx (>=1.1.0) ; extra == "docx"
35
36
  Requires-Dist: pyyaml (>=6.0)
36
37
  Requires-Dist: ruff (>=0.1.0) ; extra == "dev"
37
38
  Requires-Dist: sentence-transformers (>=2.2.0)
39
+ Requires-Dist: todoist-api-python (>=3.0.0) ; extra == "all"
40
+ Requires-Dist: todoist-api-python (>=3.0.0) ; extra == "todoist"
38
41
  Requires-Dist: trafilatura (>=1.6.0) ; extra == "all"
39
42
  Requires-Dist: trafilatura (>=1.6.0) ; extra == "web"
40
43
  Requires-Dist: watchdog (>=3.0.0)
41
44
  Requires-Dist: yoyo-migrations (>=8.0.0)
45
+ Project-URL: Homepage, https://github.com/username/okb
46
+ Project-URL: Issues, https://github.com/username/okb/issues
47
+ Project-URL: Repository, https://github.com/username/okb
42
48
  Description-Content-Type: text/markdown
43
49
 
44
50
  # Owned Knowledge Base (OKB)
@@ -47,15 +53,14 @@ A local-first semantic search system for personal documents with Claude Code int
47
53
 
48
54
  ## Installation
49
55
 
56
+ pipx - preferred!
50
57
  ```bash
51
- pip install okb
58
+ pipx install okb
52
59
  ```
53
60
 
54
- Or from source:
61
+ Or pip:
55
62
  ```bash
56
- git clone https://github.com/yourusername/okb
57
- cd okb
58
- pip install -e .
63
+ pip install okb
59
64
  ```
60
65
 
61
66
  ## Quick Start
@@ -80,20 +85,25 @@ okb ingest ~/notes ~/docs
80
85
  | `okb db start` | Start pgvector database container |
81
86
  | `okb db stop` | Stop database container |
82
87
  | `okb db status` | Show database status |
88
+ | `okb db migrate [name]` | Apply pending migrations (optionally for specific db) |
89
+ | `okb db list` | List configured databases |
83
90
  | `okb db destroy` | Remove container and volume (destructive) |
84
91
  | `okb ingest <paths>` | Ingest documents into knowledge base |
85
- | `okb ingest <paths> --local` | Ingest using CPU embedding (no Modal) |
92
+ | `okb ingest <paths> --local` | Ingest using local GPU/CPU embedding (no Modal) |
86
93
  | `okb serve` | Start MCP server (stdio, for Claude Code) |
87
94
  | `okb serve --http` | Start HTTP MCP server with token auth |
88
95
  | `okb watch <paths>` | Watch directories for changes |
89
96
  | `okb config init` | Create default config file |
90
97
  | `okb config show` | Show current configuration |
98
+ | `okb config path` | Print config file path |
91
99
  | `okb modal deploy` | Deploy GPU embedder to Modal |
92
100
  | `okb token create` | Create API token for HTTP server |
93
101
  | `okb token list` | List tokens for a database |
94
- | `okb token revoke` | Revoke an API token |
102
+ | `okb token revoke [TOKEN] --id <n>` | Revoke token by full value or ID |
95
103
  | `okb sync list` | List available API sources (plugins) |
104
+ | `okb sync list-projects <source>` | List projects from source (for config) |
96
105
  | `okb sync run <sources>` | Sync data from external APIs |
106
+ | `okb sync auth <source>` | Interactive OAuth setup (e.g., dropbox-paper) |
97
107
  | `okb sync status` | Show last sync times |
98
108
  | `okb rescan` | Check indexed files for changes, re-ingest stale |
99
109
  | `okb rescan --dry-run` | Show what would change without executing |
@@ -101,37 +111,19 @@ okb ingest ~/notes ~/docs
101
111
  | `okb llm status` | Show LLM config and connectivity |
102
112
  | `okb llm deploy` | Deploy Modal LLM for open model inference |
103
113
  | `okb llm clear-cache` | Clear LLM response cache |
114
+ | `okb enrich run` | Extract TODOs and entities from documents |
115
+ | `okb enrich run --dry-run` | Show what would be enriched |
116
+ | `okb enrich pending` | List entities awaiting review |
117
+ | `okb enrich approve <id>` | Approve a pending entity |
118
+ | `okb enrich reject <id>` | Reject a pending entity |
119
+ | `okb enrich analyze` | Analyze database and update description/topics |
120
+ | `okb enrich consolidate` | Run entity consolidation (duplicates, clusters) |
121
+ | `okb enrich merge-proposals` | List pending merge proposals |
122
+ | `okb enrich approve-merge <id>` | Approve an entity merge |
123
+ | `okb enrich reject-merge <id>` | Reject an entity merge |
124
+ | `okb enrich clusters` | List topic clusters |
125
+ | `okb enrich relationships` | List entity relationships |
104
126
 
105
- ## Architecture
106
-
107
- ```
108
- ┌─────────────────────────────────────────────────────────────────────┐
109
- │ INGESTION (Burst GPU) │
110
- │ │
111
- │ Local Files → Contextual Chunking → Modal (GPU T4) → pgvector │
112
- │ │
113
- │ ~/notes/project-x/api-design.md │
114
- │ ↓ │
115
- │ "Document: API Design Notes │
116
- │ Project: project-x │
117
- │ Section: Authentication │
118
- │ Content: Use JWT tokens with..." │
119
- │ ↓ │
120
- │ [0.23, -0.41, 0.87, ...] → pgvector │
121
- └─────────────────────────────────────────────────────────────────────┘
122
-
123
- ┌─────────────────────────────────────────────────────────────────────┐
124
- │ RETRIEVAL (Always-on, Local) │
125
- │ │
126
- │ Claude Code → MCP Server → CPU Embedding → pgvector → Results │
127
- │ │
128
- │ "How do I handle auth?" │
129
- │ ↓ │
130
- │ [0.19, -0.38, 0.91, ...] (local CPU, ~300ms) │
131
- │ ↓ │
132
- │ Cosine similarity search → Top 5 chunks with context │
133
- └─────────────────────────────────────────────────────────────────────┘
134
- ```
135
127
 
136
128
  ## Configuration
137
129
 
@@ -165,7 +157,7 @@ chunking:
165
157
  Use `--db <name>` to target a specific database with any command.
166
158
 
167
159
  Environment variables override config file settings:
168
- - `KB_DATABASE_URL` - Database connection string
160
+ - `OKB_DATABASE_URL` - Database connection string
169
161
  - `OKB_DOCKER_PORT` - Docker port mapping
170
162
  - `OKB_CONTAINER_NAME` - Docker container name
171
163
 
@@ -186,7 +178,7 @@ Merge: scalars replace, lists extend, dicts deep-merge.
186
178
 
187
179
  ### LLM Integration (Optional)
188
180
 
189
- Enable LLM-based document classification and filtering:
181
+ Enable LLM-based document classification, filtering, and enrichment:
190
182
 
191
183
  ```yaml
192
184
  llm:
@@ -202,11 +194,25 @@ llm:
202
194
  | `claude` | `export ANTHROPIC_API_KEY=...` | ~$0.25/1M tokens |
203
195
  | `modal` | `okb llm deploy` | ~$0.02/min GPU |
204
196
 
205
- For Modal (no API key needed):
197
+ **Modal LLM Setup** (no API key needed, runs on Modal's GPUs):
198
+
206
199
  ```yaml
207
200
  llm:
208
201
  provider: modal
209
- model: meta-llama/Llama-3.2-3B-Instruct
202
+ model: microsoft/Phi-3-mini-4k-instruct # Recommended: no gating
203
+ ```
204
+
205
+ Non-gated models (work immediately):
206
+ - `microsoft/Phi-3-mini-4k-instruct` - Good quality, 4K context
207
+ - `Qwen/Qwen2-1.5B-Instruct` - Smaller/faster
208
+
209
+ Gated models (require HuggingFace approval + token):
210
+ - `meta-llama/Llama-3.2-3B-Instruct` - Requires accepting license at HuggingFace
211
+ - Setup: `modal secret create huggingface HF_TOKEN=hf_...`
212
+
213
+ Deploy after configuring:
214
+ ```bash
215
+ okb llm deploy
210
216
  ```
211
217
 
212
218
  **Pre-ingest filtering** - skip low-value content during sync:
@@ -220,6 +226,36 @@ plugins:
220
226
  action_on_skip: discard # or "archive"
221
227
  ```
222
228
 
229
+ ### Document Enrichment
230
+
231
+ Extract TODOs and entities (people, projects, technologies) from documents using LLM:
232
+
233
+ ```bash
234
+ okb enrich run # Enrich un-enriched documents
235
+ okb enrich run --dry-run # Preview what would be enriched
236
+ okb enrich run --source-type markdown # Only markdown files
237
+ okb enrich run --query "meeting" # Filter by semantic search
238
+ ```
239
+
240
+ Entities are created as pending suggestions for review:
241
+ ```bash
242
+ okb enrich pending # List pending entities
243
+ okb enrich approve <id> # Approve → creates entity document
244
+ okb enrich reject <id> # Reject → hidden from future suggestions
245
+ ```
246
+
247
+ Configure enrichment behavior:
248
+ ```yaml
249
+ enrichment:
250
+ enabled: true
251
+ extract_todos: true
252
+ extract_entities: true
253
+ auto_create_todos: true # TODOs created immediately
254
+ auto_create_entities: false # Entities go to pending review
255
+ min_confidence_todo: 0.7
256
+ min_confidence_entity: 0.8
257
+ ```
258
+
223
259
  CLI commands:
224
260
  ```bash
225
261
  okb llm status # Show config and connectivity
@@ -273,7 +309,7 @@ Then configure Claude Code to connect via SSE:
273
309
  }
274
310
  ```
275
311
 
276
- ## MCP Tools (Available in Claude Code)
312
+ ## MCP Tools available to LLM
277
313
 
278
314
  | Tool | Purpose |
279
315
  |------|---------|
@@ -287,6 +323,25 @@ Then configure Claude Code to connect via SSE:
287
323
  | `save_knowledge` | Save knowledge from Claude for future reference |
288
324
  | `delete_knowledge` | Delete a Claude-saved knowledge entry |
289
325
  | `get_actionable_items` | Query tasks/events with structured filters |
326
+ | `get_database_info` | Get database description, topics, and stats |
327
+ | `set_database_description` | Update database description/topics (LLM can self-document) |
328
+ | `add_todo` | Create a TODO item in the knowledge base |
329
+ | `trigger_sync` | Sync API sources (Todoist, GitHub, Dropbox Paper) |
330
+ | `trigger_rescan` | Check indexed files for changes and re-ingest |
331
+ | `list_sync_sources` | List available API sync sources with status |
332
+ | `enrich_document` | Run LLM enrichment to extract TODOs/entities |
333
+ | `list_pending_entities` | List entities awaiting review |
334
+ | `approve_entity` | Approve a pending entity |
335
+ | `reject_entity` | Reject a pending entity |
336
+ | `analyze_knowledge_base` | Analyze content and generate description/topics |
337
+ | `find_entity_duplicates` | Find potential duplicate entities |
338
+ | `merge_entities` | Merge duplicate entities |
339
+ | `list_pending_merges` | List pending merge proposals |
340
+ | `approve_merge` | Approve a merge proposal |
341
+ | `reject_merge` | Reject a merge proposal |
342
+ | `get_topic_clusters` | Get topic clusters from consolidation |
343
+ | `get_entity_relationships` | Get relationships between entities |
344
+ | `run_consolidation` | Run full entity consolidation pipeline |
290
345
 
291
346
  ## Contextual Chunking
292
347
 
@@ -309,31 +364,9 @@ project: student-app
309
364
  category: backend
310
365
  ---
311
366
 
312
- # Query Optimization
367
+ # Your Document Title
313
368
 
314
- Use `select_related()` for foreign keys...
315
- ```
316
-
317
- ## Cost Estimate
318
-
319
- | Component | Local | Cloud Alternative |
320
- |-----------|-------|-------------------|
321
- | pgvector | $0 | ~$15-30/mo (CloudSQL) |
322
- | MCP Server | $0 | ~$5/mo (small VM) |
323
- | Modal embedding | ~$0.50-2/mo | N/A |
324
- | **Total** | **~$1-2/mo** | **~$20-35/mo** |
325
-
326
- ## Development
327
-
328
- ```bash
329
- # Install dev dependencies
330
- pip install -e ".[dev]"
331
-
332
- # Run tests
333
- pytest
334
-
335
- # Lint and format
336
- ruff check . && ruff format .
369
+ Content here...
337
370
  ```
338
371
 
339
372
  ## Plugin System
@@ -385,12 +418,30 @@ plugins:
385
418
  enabled: true
386
419
  token: ${GITHUB_TOKEN} # Resolved from environment
387
420
  repos: [owner/repo1, owner/repo2]
421
+ todoist:
422
+ enabled: true
423
+ token: ${TODOIST_TOKEN}
424
+ include_completed: false # Sync completed tasks
425
+ completed_days: 30 # Days of completed history
426
+ include_comments: false # Include task comments (1 API call per task)
427
+ project_filter: [] # List of project IDs (use sync list-projects to find)
388
428
  dropbox-paper:
389
429
  enabled: true
390
- token: ${DROPBOX_TOKEN}
430
+ # Option 1: Refresh token (recommended, auto-refreshes)
431
+ app_key: ${DROPBOX_APP_KEY}
432
+ app_secret: ${DROPBOX_APP_SECRET}
433
+ refresh_token: ${DROPBOX_REFRESH_TOKEN}
434
+ # Option 2: Access token (short-lived, expires after ~4 hours)
435
+ # token: ${DROPBOX_TOKEN}
391
436
  folders: [/] # Optional: filter to specific folders
392
437
  ```
393
438
 
439
+ **Dropbox Paper OAuth Setup:**
440
+ ```bash
441
+ okb sync auth dropbox-paper
442
+ ```
443
+ This interactive command will guide you through getting a refresh token from Dropbox.
444
+
394
445
  ## License
395
446
 
396
447
  MIT
@@ -0,0 +1,49 @@
1
+ okb/__init__.py,sha256=2yaWIYQbho7N2O2zwTn3ZH11b8b3SaoDVlxluVTqwy4,92
2
+ okb/cli.py,sha256=8v_SaXFOrJYrCPSr6JgIqqzFHHYpPlHvan4CLaYUDTs,88639
3
+ okb/config.py,sha256=vKDC6b6Tm3_XZzvn7nA9WlGCWzCT8vtV9AvLes02YW8,28562
4
+ okb/data/init.sql,sha256=QpsicUN7PQ7d8zyOCRNChOu5XKdUVC3xySlRDPyKSN8,2728
5
+ okb/http_server.py,sha256=JFW5sXuZ0V0egHb_fyytNBORbNdqf9btAhQ_BUYiGUc,27636
6
+ okb/ingest.py,sha256=D5plxCC2tQXZenMNUa482dUDqsyuaq2APAQqaIgRAqU,54505
7
+ okb/llm/__init__.py,sha256=4jelqgXvF-eEPyLCuAmcxagN0H923wI9pBJJZKv4r0E,2368
8
+ okb/llm/analyze.py,sha256=BKW308AtjWStZcZiMKaRqFmQsuTclp3Qp3W4nsdw4vk,18569
9
+ okb/llm/base.py,sha256=gOm7zBiNdHrj7xxJfpb-4qZdYxWM0lA0vKfrBStO60E,2279
10
+ okb/llm/cache.py,sha256=rxRPMNBtP336MSpGWA8F7rDZnF0O2RM3rEsNtoxS0Zk,6142
11
+ okb/llm/consolidate.py,sha256=TjXBWzzlJrX3_z0CysrFAxclp1K7XGgMb_SI5hdK7Y8,23178
12
+ okb/llm/enrich.py,sha256=Yc09xvXynuiCATK451J5sBQ9lkPPllio8vAPYOEVDFo,23133
13
+ okb/llm/extractors/__init__.py,sha256=8sHgtgtydF4CBFiIOfURYcyunVxK770qp_aMz4jxnFU,317
14
+ okb/llm/extractors/base.py,sha256=p_PIMdUoEw8-C5jG8TcbG73jegE5ovmIGbbbdDrRFVs,1250
15
+ okb/llm/extractors/cross_doc.py,sha256=nw1-nHSHKxGlL95rfHFkStdbzpy4H3eRclyUyn2YE1A,18114
16
+ okb/llm/extractors/dedup.py,sha256=TVDBhNX7rPmpipO2WckAhe_Oj1LmSRPce-EceZ6FdbM,16562
17
+ okb/llm/extractors/entity.py,sha256=woIF5AeXD2dmFDoiOVCPgMUVWQPYHOmg1KE-ZRB3o0E,9925
18
+ okb/llm/extractors/todo.py,sha256=LdAyioQ5fZ-KJC_W_-CAU8OlMvju3Oci7E7aueoTnpI,4345
19
+ okb/llm/filter.py,sha256=y20bc3vHtp5gj7T7AhsJ45ZkAkBgztj6WPjsVAmvEeo,5447
20
+ okb/llm/providers.py,sha256=SpbEpJYSQHc43qyvBdv2IuUNKsf0_NfDmnooNM1tzHc,9838
21
+ okb/local_embedder.py,sha256=zzjBUFp4IH2xsvKyKjKZyX9dJuE_3PDMHMwpyRYSISQ,2098
22
+ okb/mcp_server.py,sha256=IUEGo4xmo2HhvKHhgeADqvNxICk4dBTX-6BNSmi8fkY,98610
23
+ okb/migrate.py,sha256=2faYL-SHiQCkGXpTUlBFMCj0B-6JYCHqZl9u6vOlui8,1693
24
+ okb/migrations/0001.initial-schema.sql,sha256=0s5pj9Ad6f0u_mxODAM_-DbDI3aI37Wdu5XMPAzAIqw,2577
25
+ okb/migrations/0002.sync-state.sql,sha256=w34dOA9sPg60NMS1aHvOhORff1k_Di9cO2ghwVQSPHU,696
26
+ okb/migrations/0003.structured-fields.sql,sha256=rPCSrdtotCoRpOfjHf1Ifx0pfizpYS9n4MD4CHxrv_c,1225
27
+ okb/migrations/0004.tokens.sql,sha256=VtcLfA1_SVVQLkEKZ-av_93Fg0ksVWLm1tlR7nJXoaQ,448
28
+ okb/migrations/0005.database-metadata.sql,sha256=0X4LyuUUX34s3ph2C70FnBBau5HEBwR4xyY-hwPEX90,709
29
+ okb/migrations/0006.llm-cache.sql,sha256=azjPpj00WH_8tx4JI8PJKZ1AOAJEhbkneVvYa3ZRZ1w,493
30
+ okb/migrations/0008.enrichment.sql,sha256=pkKtyuFgRiPhZ7YAyYr6yihT2R-Tx64hE18iqphqFAw,2160
31
+ okb/migrations/0009.entity-consolidation.sql,sha256=Q2TBHJqMa1fvAqaopa20KdJCIxqldDAeOPGC5YiuzxY,5800
32
+ okb/migrations/0010.token-id.sql,sha256=odFPvY3z63f6Zfx8j5qBj2LobvPafpT2hDi_MwBBf6Q,231
33
+ okb/modal_embedder.py,sha256=V1cpGWrtEo1MGkrD9Nc-5wRmf9e7IwKPsQj7nVuLlyg,3469
34
+ okb/modal_llm.py,sha256=NpCykbjlhUUdQNQ4NMLu-uEBFJbYwJDV2NdnwUZeG84,5903
35
+ okb/plugins/__init__.py,sha256=50LNAH4bvfIw5CHT82sknGjdCldQ-4ds0wxo1zM9E2k,324
36
+ okb/plugins/base.py,sha256=6TIN1UIItmuIsP4NDJhuRMH0ngKkQiGmtHTeYj1K8OU,3171
37
+ okb/plugins/registry.py,sha256=fN7NfoOaRnMyXSWT2srd6vEr4riJjmncQFfberf0IE8,3741
38
+ okb/plugins/sources/__init__.py,sha256=n58rAbcJC45JbofUY6IA526rSRjkYn4_tGjWma3TOUI,214
39
+ okb/plugins/sources/dropbox_paper.py,sha256=Oi59NbJGQrwjE2Xhcinc2InKRc27Gdg7l8xVTbKLkI8,7493
40
+ okb/plugins/sources/github.py,sha256=YlwsY2hRKlGTyHL5L4vCC1TP-b6WJzEYbPDEXnB4y-I,16309
41
+ okb/plugins/sources/todoist.py,sha256=B22tKYFZhuDhZHhpRdGWDGho9y7FBNgGlI1g2nf13-8,8849
42
+ okb/rescan.py,sha256=dVdQEkVUjsrtOKAGZc0LC2uwcnkjB8hn2SOVWHnY-R8,8396
43
+ okb/scripts/__init__.py,sha256=HPp8YCtIeo9XMOtOGCtntiwYr9eCxAJ1MF9Lo9WVzUA,53
44
+ okb/scripts/watch.py,sha256=b8oGPTN3flNdNQJETeqQ1RNZ8U1LiKvHntLwvHRIviA,6354
45
+ okb/tokens.py,sha256=3Of_PwNCTTexXC3d-EAiPjLdsbyk2F_dTeY30O3mqp8,8635
46
+ okb-1.1.0.dist-info/METADATA,sha256=3Hq4DxyrlEZYa3DhKbbBY1irBmyFZ76gJGGDt9QCPOc,13836
47
+ okb-1.1.0.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
48
+ okb-1.1.0.dist-info/entry_points.txt,sha256=YX6b8BlV9sSAXrneoIm3dkXtRcgHhSzbDaOpJ0yCKRs,230
49
+ okb-1.1.0.dist-info/RECORD,,
@@ -6,4 +6,5 @@ okb=okb.cli:main
6
6
  [okb.sources]
7
7
  dropbox-paper=okb.plugins.sources.dropbox_paper:DropboxPaperSource
8
8
  github=okb.plugins.sources.github:GitHubSource
9
+ todoist=okb.plugins.sources.todoist:TodoistSource
9
10
 
@@ -1,36 +0,0 @@
1
- okb/__init__.py,sha256=2yaWIYQbho7N2O2zwTn3ZH11b8b3SaoDVlxluVTqwy4,92
2
- okb/cli.py,sha256=KZ8LmzHYiD19NZtrTx7UoFeiH4MMFZX621gs5JElLc4,43663
3
- okb/config.py,sha256=DKmX2fgteGdh0QMsA-Immu-mZcvLjHWeB8HIf9rcM5o,22898
4
- okb/data/init.sql,sha256=QpsicUN7PQ7d8zyOCRNChOu5XKdUVC3xySlRDPyKSN8,2728
5
- okb/http_server.py,sha256=H8AvsRiStxupr-KnXrIlHnoRtqeA-2SgphVgGAOnqmQ,18673
6
- okb/ingest.py,sha256=D5plxCC2tQXZenMNUa482dUDqsyuaq2APAQqaIgRAqU,54505
7
- okb/llm/__init__.py,sha256=4jelqgXvF-eEPyLCuAmcxagN0H923wI9pBJJZKv4r0E,2368
8
- okb/llm/base.py,sha256=gOm7zBiNdHrj7xxJfpb-4qZdYxWM0lA0vKfrBStO60E,2279
9
- okb/llm/cache.py,sha256=rxRPMNBtP336MSpGWA8F7rDZnF0O2RM3rEsNtoxS0Zk,6142
10
- okb/llm/filter.py,sha256=y20bc3vHtp5gj7T7AhsJ45ZkAkBgztj6WPjsVAmvEeo,5447
11
- okb/llm/providers.py,sha256=AdVw9FFgv58-KJEfXv9JqWlkxBl-LcRWOao95CsjqWA,9718
12
- okb/local_embedder.py,sha256=zzjBUFp4IH2xsvKyKjKZyX9dJuE_3PDMHMwpyRYSISQ,2098
13
- okb/mcp_server.py,sha256=95e1wEtan0UrzQveCNNyhHXvtpZ18nDsxfaCKYJeX1I,50701
14
- okb/migrate.py,sha256=2faYL-SHiQCkGXpTUlBFMCj0B-6JYCHqZl9u6vOlui8,1693
15
- okb/migrations/0001.initial-schema.sql,sha256=0s5pj9Ad6f0u_mxODAM_-DbDI3aI37Wdu5XMPAzAIqw,2577
16
- okb/migrations/0002.sync-state.sql,sha256=w34dOA9sPg60NMS1aHvOhORff1k_Di9cO2ghwVQSPHU,696
17
- okb/migrations/0003.structured-fields.sql,sha256=rPCSrdtotCoRpOfjHf1Ifx0pfizpYS9n4MD4CHxrv_c,1225
18
- okb/migrations/0004.tokens.sql,sha256=VtcLfA1_SVVQLkEKZ-av_93Fg0ksVWLm1tlR7nJXoaQ,448
19
- okb/migrations/0005.database-metadata.sql,sha256=0X4LyuUUX34s3ph2C70FnBBau5HEBwR4xyY-hwPEX90,709
20
- okb/migrations/0006.llm-cache.sql,sha256=azjPpj00WH_8tx4JI8PJKZ1AOAJEhbkneVvYa3ZRZ1w,493
21
- okb/modal_embedder.py,sha256=V1cpGWrtEo1MGkrD9Nc-5wRmf9e7IwKPsQj7nVuLlyg,3469
22
- okb/modal_llm.py,sha256=4rYE3VZ_T09HXCgTIYFLu1s_C2FRC9y4dgMUGqJuO2M,5368
23
- okb/plugins/__init__.py,sha256=50LNAH4bvfIw5CHT82sknGjdCldQ-4ds0wxo1zM9E2k,324
24
- okb/plugins/base.py,sha256=6TIN1UIItmuIsP4NDJhuRMH0ngKkQiGmtHTeYj1K8OU,3171
25
- okb/plugins/registry.py,sha256=fN7NfoOaRnMyXSWT2srd6vEr4riJjmncQFfberf0IE8,3741
26
- okb/plugins/sources/__init__.py,sha256=CTqgfRXCHWjKiQS0dpx2jRXj98ogcBClNORfVQwzL0I,143
27
- okb/plugins/sources/dropbox_paper.py,sha256=YdNDkMEsaKz7pDfwfirwApg2v3Ub-GsbgWkSm9E4Yi0,6144
28
- okb/plugins/sources/github.py,sha256=ozdTZPkU8h2-ZIx5o1FB58QBZ6P0eoVntluWL3vG87I,16309
29
- okb/rescan.py,sha256=dVdQEkVUjsrtOKAGZc0LC2uwcnkjB8hn2SOVWHnY-R8,8396
30
- okb/scripts/__init__.py,sha256=HPp8YCtIeo9XMOtOGCtntiwYr9eCxAJ1MF9Lo9WVzUA,53
31
- okb/scripts/watch.py,sha256=b8oGPTN3flNdNQJETeqQ1RNZ8U1LiKvHntLwvHRIviA,6354
32
- okb/tokens.py,sha256=JJ1C-mvtnT2O0cmjSu57PI9Nt53Sl9DqbmPuLnHlN6g,8043
33
- okb-1.0.0.dist-info/METADATA,sha256=NVrVwX-U0Nj5qYks0w-UJNoDsiBPFth_J6oxzwftCBM,12002
34
- okb-1.0.0.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
35
- okb-1.0.0.dist-info/entry_points.txt,sha256=P2XvigL7DxPy8F5KvgRilX2G_rRh14bI9hyJpGgi80Y,180
36
- okb-1.0.0.dist-info/RECORD,,
File without changes