work-recall 0.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. work_recall-0.1.0/.env.example +4 -0
  2. work_recall-0.1.0/.gitignore +43 -0
  3. work_recall-0.1.0/LICENSE +21 -0
  4. work_recall-0.1.0/Makefile +47 -0
  5. work_recall-0.1.0/PKG-INFO +118 -0
  6. work_recall-0.1.0/README.md +81 -0
  7. work_recall-0.1.0/docker-compose.yml +0 -0
  8. work_recall-0.1.0/pyproject.toml +67 -0
  9. work_recall-0.1.0/recall/__init__.py +3 -0
  10. work_recall-0.1.0/recall/cli.py +418 -0
  11. work_recall-0.1.0/recall/config/__init__.py +5 -0
  12. work_recall-0.1.0/recall/config/secrets.py +44 -0
  13. work_recall-0.1.0/recall/config/settings.py +70 -0
  14. work_recall-0.1.0/recall/connectors/__init__.py +16 -0
  15. work_recall-0.1.0/recall/connectors/calendar.py +65 -0
  16. work_recall-0.1.0/recall/connectors/composio_client.py +71 -0
  17. work_recall-0.1.0/recall/connectors/gmail.py +51 -0
  18. work_recall-0.1.0/recall/connectors/linear.py +57 -0
  19. work_recall-0.1.0/recall/connectors/slack.py +71 -0
  20. work_recall-0.1.0/recall/constants.py +45 -0
  21. work_recall-0.1.0/recall/extract/__init__.py +1 -0
  22. work_recall-0.1.0/recall/extract/blockers.py +52 -0
  23. work_recall-0.1.0/recall/extract/commitments.py +48 -0
  24. work_recall-0.1.0/recall/extract/entities.py +78 -0
  25. work_recall-0.1.0/recall/extract/projects.py +55 -0
  26. work_recall-0.1.0/recall/extract/risks.py +52 -0
  27. work_recall-0.1.0/recall/extract/signals.py +109 -0
  28. work_recall-0.1.0/recall/intelligence/__init__.py +1 -0
  29. work_recall-0.1.0/recall/intelligence/followups.py +36 -0
  30. work_recall-0.1.0/recall/intelligence/meeting_prep.py +113 -0
  31. work_recall-0.1.0/recall/intelligence/risks.py +68 -0
  32. work_recall-0.1.0/recall/intelligence/standup.py +51 -0
  33. work_recall-0.1.0/recall/intelligence/timeline.py +78 -0
  34. work_recall-0.1.0/recall/intelligence/today.py +72 -0
  35. work_recall-0.1.0/recall/llm/__init__.py +5 -0
  36. work_recall-0.1.0/recall/llm/openai_client.py +32 -0
  37. work_recall-0.1.0/recall/llm/prompts.py +121 -0
  38. work_recall-0.1.0/recall/memory/__init__.py +1 -0
  39. work_recall-0.1.0/recall/memory/cleanup.py +12 -0
  40. work_recall-0.1.0/recall/memory/promoter.py +113 -0
  41. work_recall-0.1.0/recall/memory/router.py +218 -0
  42. work_recall-0.1.0/recall/memory/scorer.py +36 -0
  43. work_recall-0.1.0/recall/normalize/__init__.py +16 -0
  44. work_recall-0.1.0/recall/normalize/base.py +58 -0
  45. work_recall-0.1.0/recall/normalize/calendar.py +56 -0
  46. work_recall-0.1.0/recall/normalize/gmail.py +83 -0
  47. work_recall-0.1.0/recall/normalize/linear.py +86 -0
  48. work_recall-0.1.0/recall/normalize/slack.py +93 -0
  49. work_recall-0.1.0/recall/output/__init__.py +5 -0
  50. work_recall-0.1.0/recall/output/console.py +7 -0
  51. work_recall-0.1.0/recall/output/formatters.py +277 -0
  52. work_recall-0.1.0/recall/sample/__init__.py +1 -0
  53. work_recall-0.1.0/recall/sample/data/calendar.json +88 -0
  54. work_recall-0.1.0/recall/sample/data/gmail.json +120 -0
  55. work_recall-0.1.0/recall/sample/data/linear.json +174 -0
  56. work_recall-0.1.0/recall/sample/data/slack.json +132 -0
  57. work_recall-0.1.0/recall/sample/seed.py +53 -0
  58. work_recall-0.1.0/recall/storage/__init__.py +10 -0
  59. work_recall-0.1.0/recall/storage/chunks.py +77 -0
  60. work_recall-0.1.0/recall/storage/commitments.py +85 -0
  61. work_recall-0.1.0/recall/storage/db.py +55 -0
  62. work_recall-0.1.0/recall/storage/entities.py +131 -0
  63. work_recall-0.1.0/recall/storage/graph.py +82 -0
  64. work_recall-0.1.0/recall/storage/hot_memory.py +77 -0
  65. work_recall-0.1.0/recall/storage/migrations.py +56 -0
  66. work_recall-0.1.0/recall/storage/normalized_events.py +148 -0
  67. work_recall-0.1.0/recall/storage/raw_events.py +142 -0
  68. work_recall-0.1.0/recall/storage/schema.sql +160 -0
  69. work_recall-0.1.0/recall/storage/sync_state.py +87 -0
  70. work_recall-0.1.0/recall/sync/__init__.py +5 -0
  71. work_recall-0.1.0/recall/sync/checkpoint.py +37 -0
  72. work_recall-0.1.0/recall/sync/planner.py +33 -0
  73. work_recall-0.1.0/recall/sync/runner.py +156 -0
  74. work_recall-0.1.0/recall/sync/scheduler.py +80 -0
  75. work_recall-0.1.0/recall/vector/__init__.py +1 -0
  76. work_recall-0.1.0/recall/vector/embeddings.py +57 -0
  77. work_recall-0.1.0/recall/vector/search.py +65 -0
  78. work_recall-0.1.0/recall/vector/sqlite_vec.py +12 -0
  79. work_recall-0.1.0/scripts/dev_seed.py +21 -0
  80. work_recall-0.1.0/scripts/reset_local_db.py +20 -0
  81. work_recall-0.1.0/tests/test_noise_filter.py +73 -0
  82. work_recall-0.1.0/tests/test_normalizers.py +86 -0
  83. work_recall-0.1.0/tests/test_scorer.py +75 -0
  84. work_recall-0.1.0/tests/test_sync.py +81 -0
  85. work_recall-0.1.0/tests/test_today.py +61 -0
@@ -0,0 +1,4 @@
1
+ # Recall reads keys from ~/.recall/config.yaml after `recall config set ...`.
2
+ # These .env values are only used as a fallback (e.g., during development).
3
+ OPENAI_API_KEY=
4
+ COMPOSIO_API_KEY=
@@ -0,0 +1,43 @@
1
+ # Python
2
+ __pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+ *.so
6
+ .Python
7
+ build/
8
+ dist/
9
+ *.egg-info/
10
+ .eggs/
11
+ *.egg
12
+
13
+ # Virtualenvs
14
+ .venv/
15
+ venv/
16
+ env/
17
+ ENV/
18
+
19
+ # Tooling caches
20
+ .pytest_cache/
21
+ .mypy_cache/
22
+ .ruff_cache/
23
+ .coverage
24
+ .coverage.*
25
+ htmlcov/
26
+
27
+ # Editor
28
+ .vscode/
29
+ .idea/
30
+ *.swp
31
+ *.swo
32
+ .DS_Store
33
+
34
+ # Local secrets
35
+ .env
36
+ .env.local
37
+
38
+ # Recall local state (should never live in repo)
39
+ .recall/
40
+ *.sqlite
41
+ *.sqlite-journal
42
+ *.sqlite-wal
43
+ *.sqlite-shm
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Recall contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,47 @@
1
+ .PHONY: install dev test lint fmt typecheck clean reset seed build publish publish-test
2
+
3
+ PY ?= python
4
+
5
+ install:
6
+ pip install -e .
7
+
8
+ dev:
9
+ pip install -e ".[dev]"
10
+
11
+ test:
12
+ pytest -q
13
+
14
+ lint:
15
+ ruff check recall tests
16
+
17
+ fmt:
18
+ ruff format recall tests
19
+
20
+ typecheck:
21
+ mypy recall
22
+
23
+ clean:
24
+ rm -rf build dist *.egg-info .pytest_cache .ruff_cache .mypy_cache .coverage htmlcov
25
+
26
+ build:
27
+ $(PY) -m pip install -q build
28
+ $(PY) -m build
29
+
30
+ # Upload to TestPyPI first: https://test.pypi.org/project/work-recall/
31
+ publish-test: build
32
+ $(PY) -m pip install -q twine
33
+ twine upload --repository testpypi dist/*
34
+
35
+ # Production PyPI: https://pypi.org/project/work-recall/
36
+ # Requires: export TWINE_USERNAME=__token__ TWINE_PASSWORD=pypi-...
37
+ publish: build
38
+ $(PY) -m pip install -q twine
39
+ @test -n "$$TWINE_USERNAME" || (echo "Set TWINE_USERNAME=__token__" && exit 1)
40
+ @test -n "$$TWINE_PASSWORD" || (echo "Set TWINE_PASSWORD to your PyPI API token" && exit 1)
41
+ twine upload dist/*
42
+
43
+ reset:
44
+ python scripts/reset_local_db.py
45
+
46
+ seed:
47
+ python scripts/dev_seed.py
@@ -0,0 +1,118 @@
1
+ Metadata-Version: 2.4
2
+ Name: work-recall
3
+ Version: 0.1.0
4
+ Summary: Local-first AI chief of staff for engineers
5
+ Project-URL: Homepage, https://github.com/recall-ai/recall
6
+ Project-URL: Issues, https://github.com/recall-ai/recall/issues
7
+ Author: Recall
8
+ License-Expression: MIT
9
+ License-File: LICENSE
10
+ Keywords: ai,cli,knowledge-management,local-first,productivity
11
+ Classifier: Development Status :: 3 - Alpha
12
+ Classifier: Environment :: Console
13
+ Classifier: Intended Audience :: Developers
14
+ Classifier: Programming Language :: Python :: 3.11
15
+ Classifier: Programming Language :: Python :: 3.12
16
+ Classifier: Topic :: Office/Business
17
+ Requires-Python: >=3.11
18
+ Requires-Dist: apscheduler>=3.10
19
+ Requires-Dist: composio-core>=0.5
20
+ Requires-Dist: openai>=1.30
21
+ Requires-Dist: platformdirs>=4.2
22
+ Requires-Dist: pydantic>=2.7
23
+ Requires-Dist: python-dateutil>=2.9
24
+ Requires-Dist: pyyaml>=6.0
25
+ Requires-Dist: rich>=13.7
26
+ Requires-Dist: sqlite-vec>=0.1.1
27
+ Requires-Dist: typer>=0.12
28
+ Provides-Extra: dev
29
+ Requires-Dist: mypy>=1.10; extra == 'dev'
30
+ Requires-Dist: pytest-cov>=5.0; extra == 'dev'
31
+ Requires-Dist: pytest>=8.0; extra == 'dev'
32
+ Requires-Dist: ruff>=0.5; extra == 'dev'
33
+ Provides-Extra: publish
34
+ Requires-Dist: build>=1.2; extra == 'publish'
35
+ Requires-Dist: twine>=5.1; extra == 'publish'
36
+ Description-Content-Type: text/markdown
37
+
38
+ # Recall
39
+
40
+ **Local-first AI chief of staff for engineers.**
41
+
42
+ Recall connects your engineering tools (Slack, Gmail, Calendar, Linear), syncs them into a
43
+ local SQLite database, and builds intelligence on top of your work — meetings, blockers,
44
+ risks, follow-ups, project timelines.
45
+
46
+ Everything indexed stays **on your machine**. No cloud DB. No SaaS backend.
47
+
48
+ ## Install
49
+
50
+ ```bash
51
+ pip install work-recall
52
+ ```
53
+
54
+ ## Quick start
55
+
56
+ ```bash
57
+ recall init
58
+ recall config set OPENAI_API_KEY sk-...
59
+ recall config set COMPOSIO_API_KEY ...
60
+
61
+ # Try the sample data (no OAuth needed)
62
+ recall sync --sample
63
+ recall today
64
+ recall risks
65
+ recall timeline auth
66
+
67
+ # Or connect your real accounts
68
+ recall connect slack
69
+ recall connect gmail
70
+ recall connect calendar
71
+ recall connect linear
72
+ recall sync
73
+ recall schedule enable --every 4h
74
+ recall schedule run # foreground; background with `nohup`/launchd/systemd
75
+ ```
76
+
77
+ ## Commands
78
+
79
+ | Command | Purpose |
80
+ |----------------------------------|------------------------------------------------------|
81
+ | `recall init` | Create `~/.recall/`, run migrations. |
82
+ | `recall doctor` | Verify setup. |
83
+ | `recall config set KEY VALUE` | Manage API keys / settings. |
84
+ | `recall connect <source>` | OAuth via Composio. |
85
+ | `recall sync [--sample]` | Incremental sync. |
86
+ | `recall today` | Today's meetings, blockers, focus items. |
87
+ | `recall prep <meeting>` | Prep brief for an upcoming meeting. |
88
+ | `recall risks` | At-risk projects, overdue commitments. |
89
+ | `recall followups [--for X]` | Open commitments. |
90
+ | `recall timeline <project>` | Chronological project timeline. |
91
+ | `recall standup` | Yesterday + today, for stand-up. |
92
+ | `recall schedule {enable|disable|status|run}` | Local scheduler. |
93
+
94
+ ## Architecture
95
+
96
+ ```
97
+ Connectors (Composio)
98
+
99
+
100
+ Raw events ─▶ Noise filter ─▶ Normalize ─▶ Score ─▶ Route by tier
101
+
102
+ ┌──────────────────────────┼──────────────────────────┐
103
+ ▼ ▼ ▼
104
+ Entity + graph Chunks + embeddings Hot memory
105
+ └──────────────────────────┴──────────────────────────┘
106
+
107
+ Intelligence (today, risks, timeline…)
108
+ ```
109
+
110
+ Storage lives at `~/.recall/`.
111
+
112
+ ## Development
113
+
114
+ ```bash
115
+ make dev
116
+ make test
117
+ recall sync --sample
118
+ ```
@@ -0,0 +1,81 @@
1
+ # Recall
2
+
3
+ **Local-first AI chief of staff for engineers.**
4
+
5
+ Recall connects your engineering tools (Slack, Gmail, Calendar, Linear), syncs them into a
6
+ local SQLite database, and builds intelligence on top of your work — meetings, blockers,
7
+ risks, follow-ups, project timelines.
8
+
9
+ Everything indexed stays **on your machine**. No cloud DB. No SaaS backend.
10
+
11
+ ## Install
12
+
13
+ ```bash
14
+ pip install work-recall
15
+ ```
16
+
17
+ ## Quick start
18
+
19
+ ```bash
20
+ recall init
21
+ recall config set OPENAI_API_KEY sk-...
22
+ recall config set COMPOSIO_API_KEY ...
23
+
24
+ # Try the sample data (no OAuth needed)
25
+ recall sync --sample
26
+ recall today
27
+ recall risks
28
+ recall timeline auth
29
+
30
+ # Or connect your real accounts
31
+ recall connect slack
32
+ recall connect gmail
33
+ recall connect calendar
34
+ recall connect linear
35
+ recall sync
36
+ recall schedule enable --every 4h
37
+ recall schedule run # foreground; background with `nohup`/launchd/systemd
38
+ ```
39
+
40
+ ## Commands
41
+
42
+ | Command | Purpose |
43
+ |----------------------------------|------------------------------------------------------|
44
+ | `recall init` | Create `~/.recall/`, run migrations. |
45
+ | `recall doctor` | Verify setup. |
46
+ | `recall config set KEY VALUE` | Manage API keys / settings. |
47
+ | `recall connect <source>` | OAuth via Composio. |
48
+ | `recall sync [--sample]` | Incremental sync. |
49
+ | `recall today` | Today's meetings, blockers, focus items. |
50
+ | `recall prep <meeting>` | Prep brief for an upcoming meeting. |
51
+ | `recall risks` | At-risk projects, overdue commitments. |
52
+ | `recall followups [--for X]` | Open commitments. |
53
+ | `recall timeline <project>` | Chronological project timeline. |
54
+ | `recall standup` | Yesterday + today, for stand-up. |
55
+ | `recall schedule {enable|disable|status|run}` | Local scheduler. |
56
+
57
+ ## Architecture
58
+
59
+ ```
60
+ Connectors (Composio)
61
+
62
+
63
+ Raw events ─▶ Noise filter ─▶ Normalize ─▶ Score ─▶ Route by tier
64
+
65
+ ┌──────────────────────────┼──────────────────────────┐
66
+ ▼ ▼ ▼
67
+ Entity + graph Chunks + embeddings Hot memory
68
+ └──────────────────────────┴──────────────────────────┘
69
+
70
+ Intelligence (today, risks, timeline…)
71
+ ```
72
+
73
+ Storage lives at `~/.recall/`.
74
+
75
+ ## Development
76
+
77
+ ```bash
78
+ make dev
79
+ make test
80
+ recall sync --sample
81
+ ```
File without changes
@@ -0,0 +1,67 @@
1
+ [build-system]
2
+ requires = ["hatchling>=1.26.1"]
3
+ build-backend = "hatchling.build"
4
+
5
+ [project]
6
+ name = "work-recall"
7
+ version = "0.1.0"
8
+ description = "Local-first AI chief of staff for engineers"
9
+ readme = "README.md"
10
+ requires-python = ">=3.11"
11
+ authors = [{ name = "Recall" }]
12
+ license = "MIT"
13
+ keywords = ["cli", "ai", "productivity", "knowledge-management", "local-first"]
14
+ classifiers = [
15
+ "Development Status :: 3 - Alpha",
16
+ "Environment :: Console",
17
+ "Intended Audience :: Developers",
18
+ "Programming Language :: Python :: 3.11",
19
+ "Programming Language :: Python :: 3.12",
20
+ "Topic :: Office/Business",
21
+ ]
22
+ dependencies = [
23
+ "typer>=0.12",
24
+ "rich>=13.7",
25
+ "pydantic>=2.7",
26
+ "PyYAML>=6.0",
27
+ "python-dateutil>=2.9",
28
+ "APScheduler>=3.10",
29
+ "platformdirs>=4.2",
30
+ "openai>=1.30",
31
+ "sqlite-vec>=0.1.1",
32
+ "composio-core>=0.5",
33
+ ]
34
+
35
+ [project.optional-dependencies]
36
+ dev = [
37
+ "pytest>=8.0",
38
+ "pytest-cov>=5.0",
39
+ "ruff>=0.5",
40
+ "mypy>=1.10",
41
+ ]
42
+ publish = [
43
+ "build>=1.2",
44
+ "twine>=5.1",
45
+ ]
46
+
47
+ [project.scripts]
48
+ recall = "recall.cli:app"
49
+
50
+ [project.urls]
51
+ Homepage = "https://github.com/recall-ai/recall"
52
+ Issues = "https://github.com/recall-ai/recall/issues"
53
+
54
+ [tool.hatch.build.targets.wheel]
55
+ packages = ["recall"]
56
+
57
+ [tool.ruff]
58
+ line-length = 100
59
+ target-version = "py311"
60
+
61
+ [tool.ruff.lint]
62
+ select = ["E", "F", "I", "B", "UP", "SIM", "RUF"]
63
+ ignore = ["E501"]
64
+
65
+ [tool.pytest.ini_options]
66
+ testpaths = ["tests"]
67
+ addopts = "-ra -q"
@@ -0,0 +1,3 @@
1
+ """Recall — local-first AI chief of staff for engineers."""
2
+
3
+ __version__ = "0.1.0"