alter-runtime 0.3.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.
Files changed (92) hide show
  1. alter_runtime/__init__.py +11 -0
  2. alter_runtime/adapters/__init__.py +19 -0
  3. alter_runtime/adapters/claude_jsonl_watcher.py +545 -0
  4. alter_runtime/adapters/git_watcher.py +457 -0
  5. alter_runtime/adapters/household/__init__.py +29 -0
  6. alter_runtime/adapters/household/_base.py +138 -0
  7. alter_runtime/adapters/household/compost/__init__.py +17 -0
  8. alter_runtime/adapters/household/compost/adapter.py +81 -0
  9. alter_runtime/adapters/household/compost/storage.py +75 -0
  10. alter_runtime/adapters/household/compost/tests/__init__.py +0 -0
  11. alter_runtime/adapters/household/compost/tests/test_adapter.py +62 -0
  12. alter_runtime/adapters/household/compost/tests/test_storage.py +23 -0
  13. alter_runtime/adapters/household/compost/tests/test_traits.py +38 -0
  14. alter_runtime/adapters/household/compost/traits.py +79 -0
  15. alter_runtime/adapters/household/self_hoster/__init__.py +30 -0
  16. alter_runtime/adapters/household/self_hoster/adapter.py +248 -0
  17. alter_runtime/adapters/household/self_hoster/storage.py +83 -0
  18. alter_runtime/adapters/household/self_hoster/tests/__init__.py +0 -0
  19. alter_runtime/adapters/household/self_hoster/tests/test_adapter.py +216 -0
  20. alter_runtime/adapters/household/self_hoster/tests/test_storage.py +25 -0
  21. alter_runtime/adapters/household/self_hoster/tests/test_traits.py +55 -0
  22. alter_runtime/adapters/household/self_hoster/traits.py +105 -0
  23. alter_runtime/adapters/household/tapo_ecosystem/__init__.py +22 -0
  24. alter_runtime/adapters/household/tapo_ecosystem/adapter.py +98 -0
  25. alter_runtime/adapters/household/tapo_ecosystem/storage.py +95 -0
  26. alter_runtime/adapters/household/tapo_ecosystem/tests/__init__.py +0 -0
  27. alter_runtime/adapters/household/tapo_ecosystem/tests/test_adapter.py +55 -0
  28. alter_runtime/adapters/household/tapo_ecosystem/tests/test_storage.py +28 -0
  29. alter_runtime/adapters/household/tapo_ecosystem/tests/test_traits.py +45 -0
  30. alter_runtime/adapters/household/tapo_ecosystem/traits.py +97 -0
  31. alter_runtime/adapters/household/workshop_tools/__init__.py +25 -0
  32. alter_runtime/adapters/household/workshop_tools/adapter.py +77 -0
  33. alter_runtime/adapters/household/workshop_tools/storage.py +92 -0
  34. alter_runtime/adapters/household/workshop_tools/tests/__init__.py +0 -0
  35. alter_runtime/adapters/household/workshop_tools/tests/test_adapter.py +48 -0
  36. alter_runtime/adapters/household/workshop_tools/tests/test_storage.py +26 -0
  37. alter_runtime/adapters/household/workshop_tools/tests/test_traits.py +45 -0
  38. alter_runtime/adapters/household/workshop_tools/traits.py +95 -0
  39. alter_runtime/adapters/worktree_watcher.py +378 -0
  40. alter_runtime/atlas/__init__.py +48 -0
  41. alter_runtime/atlas/base.py +102 -0
  42. alter_runtime/atlas/ledger.py +196 -0
  43. alter_runtime/atlas/observations.py +136 -0
  44. alter_runtime/atlas/schema.py +106 -0
  45. alter_runtime/cap_cache.py +392 -0
  46. alter_runtime/cli.py +517 -0
  47. alter_runtime/clients/__init__.py +0 -0
  48. alter_runtime/clients/token_usage_client.py +273 -0
  49. alter_runtime/config.py +648 -0
  50. alter_runtime/consent.py +425 -0
  51. alter_runtime/daemon.py +518 -0
  52. alter_runtime/floor_loop.py +335 -0
  53. alter_runtime/floor_preflight.py +734 -0
  54. alter_runtime/http_auth.py +173 -0
  55. alter_runtime/notifiers/__init__.py +18 -0
  56. alter_runtime/notifiers/desktop.py +321 -0
  57. alter_runtime/sdk/__init__.py +12 -0
  58. alter_runtime/sdk/client.py +399 -0
  59. alter_runtime/service_install.py +616 -0
  60. alter_runtime/services/__init__.py +59 -0
  61. alter_runtime/services/launchd/com.alter.runtime.plist.in +90 -0
  62. alter_runtime/services/systemd/alter-runtime.service.in +74 -0
  63. alter_runtime/services/systemd/cf-access-env.conf.in +29 -0
  64. alter_runtime/sockets/__init__.py +20 -0
  65. alter_runtime/sockets/dbus.py +272 -0
  66. alter_runtime/sockets/unix.py +702 -0
  67. alter_runtime/subscribers/__init__.py +58 -0
  68. alter_runtime/subscribers/active_sessions_cron_emitter.py +313 -0
  69. alter_runtime/subscribers/active_sessions_do_publisher.py +1159 -0
  70. alter_runtime/subscribers/active_sessions_gc.py +432 -0
  71. alter_runtime/subscribers/active_sessions_writer.py +446 -0
  72. alter_runtime/subscribers/adapters_writer.py +415 -0
  73. alter_runtime/subscribers/agent_frames.py +461 -0
  74. alter_runtime/subscribers/bus.py +188 -0
  75. alter_runtime/subscribers/cache_writer.py +347 -0
  76. alter_runtime/subscribers/ceremony_echo.py +290 -0
  77. alter_runtime/subscribers/do_sse.py +864 -0
  78. alter_runtime/subscribers/ebpf.py +506 -0
  79. alter_runtime/subscribers/inbox_writer.py +469 -0
  80. alter_runtime/subscribers/mcp_fallback.py +391 -0
  81. alter_runtime/subscribers/presence_writer.py +426 -0
  82. alter_runtime/subscribers/session_presence.py +467 -0
  83. alter_runtime/subscribers/sse.py +125 -0
  84. alter_runtime/subscribers/weave_intent_writer.py +608 -0
  85. alter_runtime/update_loop.py +519 -0
  86. alter_runtime/weave/__init__.py +21 -0
  87. alter_runtime/weave/resolver.py +544 -0
  88. alter_runtime-0.3.0.dist-info/METADATA +289 -0
  89. alter_runtime-0.3.0.dist-info/RECORD +92 -0
  90. alter_runtime-0.3.0.dist-info/WHEEL +4 -0
  91. alter_runtime-0.3.0.dist-info/entry_points.txt +2 -0
  92. alter_runtime-0.3.0.dist-info/licenses/LICENSE +190 -0
@@ -0,0 +1,289 @@
1
+ Metadata-Version: 2.4
2
+ Name: alter-runtime
3
+ Version: 0.3.0
4
+ Summary: ~Alter Identity Runtime - local sovereign daemon for the continuous identity field. Subscribes to per-~handle Cloudflare Durable Objects, exposes Unix socket + D-Bus + CLI surfaces, falls back gracefully to direct MCP polling.
5
+ Project-URL: Homepage, https://truealter.com
6
+ Project-URL: Documentation, https://truealter.com/docs/alter-runtime
7
+ Project-URL: Repository, https://github.com/true-alter/Alter
8
+ Project-URL: Bug Tracker, https://github.com/true-alter/Alter/issues
9
+ Author: Blake Morrison
10
+ Author-email: ALTER Meridian Pty Ltd <hello@truealter.com>
11
+ License: Apache-2.0
12
+ License-File: LICENSE
13
+ Keywords: agent,ai-agents,alter,cloudflare,durable-object,identity,llm,mcp,model-context-protocol,psychometric,sovereign-identity,verifiable-credentials,x402
14
+ Classifier: Development Status :: 3 - Alpha
15
+ Classifier: Framework :: AsyncIO
16
+ Classifier: Intended Audience :: Developers
17
+ Classifier: Intended Audience :: Information Technology
18
+ Classifier: Intended Audience :: System Administrators
19
+ Classifier: License :: OSI Approved :: Apache Software License
20
+ Classifier: Operating System :: MacOS :: MacOS X
21
+ Classifier: Operating System :: Microsoft :: Windows
22
+ Classifier: Operating System :: POSIX :: Linux
23
+ Classifier: Programming Language :: Python :: 3
24
+ Classifier: Programming Language :: Python :: 3.10
25
+ Classifier: Programming Language :: Python :: 3.11
26
+ Classifier: Programming Language :: Python :: 3.12
27
+ Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
28
+ Classifier: Topic :: Security
29
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
30
+ Classifier: Topic :: System :: Distributed Computing
31
+ Classifier: Topic :: System :: Systems Administration :: Authentication/Directory
32
+ Requires-Python: >=3.10
33
+ Requires-Dist: cryptography>=42.0
34
+ Requires-Dist: httpx-sse>=0.4.0
35
+ Requires-Dist: httpx>=0.26.0
36
+ Requires-Dist: pathspec>=0.12.0
37
+ Requires-Dist: pydantic>=2.5.0
38
+ Requires-Dist: pyyaml>=6.0.1
39
+ Requires-Dist: tree-sitter-python>=0.23.0
40
+ Requires-Dist: tree-sitter>=0.23.0
41
+ Requires-Dist: watchdog>=4.0.0
42
+ Provides-Extra: all
43
+ Requires-Dist: bcc>=0.29.0; (sys_platform == 'linux') and extra == 'all'
44
+ Requires-Dist: dbus-next>=0.2.3; (sys_platform == 'linux') and extra == 'all'
45
+ Requires-Dist: pywin32>=306; (sys_platform == 'win32') and extra == 'all'
46
+ Requires-Dist: slack-bolt>=1.18.0; extra == 'all'
47
+ Requires-Dist: slack-sdk>=3.27.0; extra == 'all'
48
+ Requires-Dist: systemd-python>=235; (sys_platform == 'linux') and extra == 'all'
49
+ Provides-Extra: dbus
50
+ Requires-Dist: dbus-next>=0.2.3; (sys_platform == 'linux') and extra == 'dbus'
51
+ Provides-Extra: dev
52
+ Requires-Dist: jsonschema>=4.21.0; extra == 'dev'
53
+ Requires-Dist: mypy>=1.10.0; extra == 'dev'
54
+ Requires-Dist: pytest-asyncio>=0.23.0; extra == 'dev'
55
+ Requires-Dist: pytest-cov>=4.1.0; extra == 'dev'
56
+ Requires-Dist: pytest>=8.0.0; extra == 'dev'
57
+ Requires-Dist: ruff>=0.5.0; extra == 'dev'
58
+ Provides-Extra: ebpf
59
+ Requires-Dist: bcc>=0.29.0; (sys_platform == 'linux') and extra == 'ebpf'
60
+ Provides-Extra: slack
61
+ Requires-Dist: slack-bolt>=1.18.0; extra == 'slack'
62
+ Requires-Dist: slack-sdk>=3.27.0; extra == 'slack'
63
+ Provides-Extra: systemd
64
+ Requires-Dist: systemd-python>=235; (sys_platform == 'linux') and extra == 'systemd'
65
+ Provides-Extra: windows
66
+ Requires-Dist: pywin32>=306; (sys_platform == 'win32') and extra == 'windows'
67
+ Description-Content-Type: text/markdown
68
+
69
+ # alter-runtime - ~Alter Identity Runtime
70
+
71
+ > **L3 of the six-layer identity distribution surface.** The local sovereign daemon that
72
+ > lives alongside you, subscribes to your per-`~handle` Cloudflare Durable Object, and
73
+ > renders your identity field across every surface your device touches - terminal, IDE,
74
+ > status bars, desktop tray, browser extension. Falls back gracefully to direct MCP
75
+ > polling when the edge is unreachable.
76
+
77
+ The alter-runtime daemon architecture was established in April 2026.
78
+
79
+ ## Alpha release - filesystem key storage
80
+
81
+ **`0.1.0` is an alpha release.** The public API surface (CLI flags,
82
+ Unix-socket JSON schema, D-Bus interface, Python SDK signatures) may change in
83
+ backwards-incompatible ways before the `0.2.0` stable cut. Pin exact versions in
84
+ downstream tooling and read the CHANGELOG before upgrading.
85
+
86
+ **Private keys are stored on the filesystem, not in an OS keychain.** On first
87
+ `alter-runtime init`, the device Ed25519 keypair is written to
88
+ `~/.config/alter/keypair.json` (or `$XDG_CONFIG_HOME/alter/keypair.json` if the
89
+ XDG variable is set) with `0600` permissions. The file is readable only by the
90
+ owning user and never leaves the device. This behaviour is deliberate for the
91
+ alpha: it keeps the daemon self-contained on any POSIX host and avoids a hard
92
+ dependency on distro-specific secret stores during early testing.
93
+
94
+ **OS-native secret storage is deferred to `0.2.0`:** Linux `libsecret` /
95
+ `kwallet`, macOS Keychain, and Windows Credential Manager integration will ship
96
+ behind a `keystore = "native"` config knob. Filesystem storage will remain the
97
+ documented fallback.
98
+
99
+ **For high-stakes use during the alpha** - any deployment where a device
100
+ compromise would imply identity compromise - pair the runtime with
101
+ hardware-attested passkey registration via the browser claim flow (graduated
102
+ attestation). The filesystem-stored device key then scopes only to ambient
103
+ signal ingestion, not to Sovereign-tier authorisations, which require a fresh
104
+ hardware passkey ceremony per session.
105
+
106
+ **Reporting issues.** Security-relevant reports: please follow
107
+ [SECURITY.md](./SECURITY.md) and email `security@truealter.com` rather than
108
+ filing a public issue. Non-security bugs and feature requests: email
109
+ `support@truealter.com`.
110
+
111
+ ## Status
112
+
113
+ | Wave | Stream | Status |
114
+ |------|--------|--------|
115
+ | 1 | 1c - Daemon skeleton + `AlterClient` SDK | Shipped |
116
+ | 2 | 2b - Subscribers, Unix socket, D-Bus, git watcher | Shipped |
117
+ | 2 | 2c - systemd + launchd service units | Shipped |
118
+ | 2 | 2d - First pixel: CC hook + scripts upgrade | Shipped |
119
+ | 2 | 2e - eBPF subscriber (Patent M, reference impl in `alter-ebpf`) | Shipped |
120
+ | 3 | 3a - Cross-platform tray surfaces | Planned |
121
+ | 3 | 3b - Windows Service + `pam_alter` stub | Planned |
122
+ | 3 | 3c - PyPI release CI + signed binaries | Planned |
123
+
124
+ ## Install
125
+
126
+ ```bash
127
+ # PyPI (cross-platform)
128
+ pip install truealter
129
+
130
+ # Arch Linux (AUR)
131
+ pacman -S alter-runtime # via your AUR helper (yay -S alter-runtime, paru -S alter-runtime, etc.)
132
+
133
+ # macOS / Linux Homebrew tap
134
+ brew install alter-runtime
135
+
136
+ # Optional extras (advanced - direct install of the runtime package)
137
+ pip install 'alter-runtime[dbus,systemd]' # Linux desktop
138
+ pip install 'alter-runtime[windows]' # Windows
139
+ pip install 'alter-runtime[all]' # Everything
140
+ ```
141
+
142
+ ## Quickstart
143
+
144
+ ```bash
145
+ # 1. Generate device keypair, install host service unit, authenticate via alter-cli
146
+ alter-runtime init
147
+
148
+ # 2. Start the daemon
149
+ alter-runtime start # Launches via systemd/launchd/Windows Service
150
+ # or run in the foreground for debugging
151
+ alter-runtime daemon
152
+
153
+ # 3. Query current field state
154
+ alter-runtime status
155
+ alter-runtime query attunement
156
+
157
+ # 4. Manually ingest a signal (useful for testing)
158
+ alter-runtime ingest --kind git_commit --payload '{"sha":"abc123"}'
159
+
160
+ # 5. Stop
161
+ alter-runtime stop
162
+ ```
163
+
164
+ ## What it does
165
+
166
+ 1. **Subscribes** to your per-`~handle` Cloudflare Durable Object over Server-Sent Events
167
+ at `https://mcp.truealter.com/events/~yourhandle/stream`. Events arrive with ~50ms
168
+ latency worldwide.
169
+
170
+ 2. **Falls back gracefully** to direct polling of the ALTER MCP endpoint at
171
+ `https://api.truealter.com/api/v1/mcp` when the DO is unreachable for more than 3
172
+ seconds. Your surfaces never know which path served them.
173
+
174
+ 3. **Exposes three local transports:**
175
+ - **Unix socket** at `/run/user/$UID/alter.sock` (Linux) or
176
+ `~/Library/Application Support/alter/runtime.sock` (macOS) - line-delimited JSON
177
+ - **D-Bus** interface `org.alter.Identity1` on the session bus (Linux) - used by
178
+ GNOME/KDE/Waybar modules
179
+ - **HTTP/SSE** loopback at `http://127.0.0.1:<port>/events` - used by the CC hook
180
+ and shell scripts
181
+
182
+ 4. **Collects ambient signals** via adapters (Wave 2):
183
+ - Git commits, branch switches, pushes (via `watchdog` on `.git/refs/heads/`)
184
+ - CC hook events (forwarded from `.claude/hooks/*.sh`)
185
+ - Shell command invocations (opt-in)
186
+ - eBPF kernel attestations (shipped; reference impl in `alter-ebpf`, Patent M)
187
+
188
+ 5. **Maintains a local cache** of your last-known-good field state so the first-paint
189
+ tilde warmth renders in <1 second, even offline. Per IFA's Five OS-Native Properties,
190
+ this is the **monotonic continuity** guarantee.
191
+
192
+ ## Layout
193
+
194
+ ```
195
+ alter-runtime/
196
+ ├── pyproject.toml
197
+ ├── README.md
198
+ ├── LICENSE
199
+ ├── alter_runtime/
200
+ │ ├── __init__.py
201
+ │ ├── config.py # XDG loader, reads alter-cli session.json
202
+ │ ├── daemon.py # asyncio supervisor
203
+ │ ├── cli.py # argparse entrypoint: init|start|stop|status|query|ingest|daemon
204
+ │ ├── sdk/
205
+ │ │ ├── __init__.py
206
+ │ │ └── client.py # AlterClient (lifted from backend/openclaw-skill)
207
+ │ ├── subscribers/ # (Wave 2)
208
+ │ │ ├── do_sse.py # primary - subscribes to handle-alter DO SSE
209
+ │ │ └── mcp_fallback.py # fallback - polls api.truealter.com/api/v1/mcp
210
+ │ ├── sockets/ # (Wave 2)
211
+ │ │ ├── unix.py # /run/user/$UID/alter.sock
212
+ │ │ └── dbus.py # org.alter.Identity1
213
+ │ ├── adapters/ # (Wave 2)
214
+ │ │ └── git_watcher.py # watchdog on .git/refs/heads/
215
+ │ └── services/ # (Wave 2)
216
+ │ ├── systemd/alter-runtime.service
217
+ │ ├── launchd/com.alter.runtime.plist
218
+ │ └── windows/AlterRuntimeService.py
219
+ └── tests/
220
+ ├── conftest.py
221
+ ├── test_cli.py
222
+ ├── test_daemon.py
223
+ └── test_client.py
224
+ ```
225
+
226
+ ## SDK usage
227
+
228
+ ```python
229
+ import asyncio
230
+ from alter_runtime import AlterClient
231
+
232
+ async def main():
233
+ # Auto-discovers the local daemon's Unix socket first, falls back to
234
+ # direct MCP if the daemon isn't running.
235
+ client = AlterClient.auto_discover()
236
+
237
+ async with client:
238
+ whoami = await client.whoami()
239
+ print(f"{whoami['handle']}: attunement={whoami['attunement']}")
240
+
241
+ # Ingest an ambient signal
242
+ await client.ingest(
243
+ kind="tool_invocation",
244
+ payload={"tool": "my-custom-cli", "duration_ms": 42},
245
+ )
246
+
247
+ asyncio.run(main())
248
+ ```
249
+
250
+ ## Packaging
251
+
252
+ - **PyPI** - `pip install alter-runtime` (publish is tag-gated; see
253
+ `.github/workflows/ci.yml`).
254
+ - **AUR** - draft PKGBUILD at [`aur/PKGBUILD`](aur/PKGBUILD). Submission is
255
+ blocked on the PyPI publish resolving the sdist URL. Regenerate `.SRCINFO`
256
+ with `makepkg --printsrcinfo > .SRCINFO` before AUR upload.
257
+ - **`truealter` PyPI shim** - thin console-script package at
258
+ [`pypi-truealter/`](pypi-truealter/) that execs the npm-installed
259
+ `alter` binary. Distinct from `alter-runtime`: `pip install truealter`
260
+ gets pip-centric users a fourth CLI install channel alongside npm,
261
+ Homebrew (planned), and the AUR (planned). Tag format
262
+ `truealter-v<version>`; see
263
+ [`.github/workflows/truealter-publish.yml`](.github/workflows/truealter-publish.yml).
264
+
265
+ ## Contributing
266
+
267
+ After cloning, wire the identity-trailer hook so commits land with `Acted-By:`, `Drafted-With:`, and `Co-Authored-By:` trailers automatically:
268
+
269
+ ```
270
+ bash scripts/setup-githooks.sh
271
+ ```
272
+
273
+ The helper sets the local `core.hooksPath` to `.githooks/` and marks every hook executable. It is idempotent - safe to re-run after pulls. Equivalent one-liner without the helper:
274
+
275
+ ```
276
+ git config core.hooksPath .githooks
277
+ ```
278
+
279
+ The hook reads your ALTER session at `~/.config/alter/session.json` (run `alter login` from the [`@truealter/cli`](https://www.npmjs.com/package/@truealter/cli) once) plus `$CLAUDE_MODEL` for the Instrument tier attribution. It is silent when the session is missing or `jq` is unavailable, so a contributor without an ALTER session still gets a normal commit; the CI verifier catches missing trailers at PR time (warn-only during the Rung 1/2 migration window).
280
+
281
+ Python projects don't have npm's `prepare`-on-install lifecycle, so this step is manual - done once after clone and persisted in your local `.git/config`.
282
+
283
+ ## Related projects
284
+
285
+ - [`@truealter/sdk`](https://www.npmjs.com/package/@truealter/sdk) - TypeScript
286
+ SDK client for the public MCP server.
287
+ - ALTER MCP endpoint - `https://mcp.truealter.com` (SSE per-`~handle` stream)
288
+ and `https://api.truealter.com/api/v1/mcp` (HTTP fallback). Both are documented
289
+ at [truealter.com](https://truealter.com).
@@ -0,0 +1,92 @@
1
+ alter_runtime/__init__.py,sha256=v2Eeowtwc5UJR7om26RLrq3Pu-oqFW0zA5OEywFsi-4,327
2
+ alter_runtime/cap_cache.py,sha256=Lx3X5tZEQi-LNoCFKvNefXpP9LTMcn4iHnBRw-8oRPs,13625
3
+ alter_runtime/cli.py,sha256=Imii3LrxXnJ9wap1E8kGeDV7vEaZscJBxYDJIi5ryOk,16861
4
+ alter_runtime/config.py,sha256=-DrkYy7tVjgvHeeqkEVFfPzyorDuDEXhz1AQ8MTm8b0,28895
5
+ alter_runtime/consent.py,sha256=lRnqguJDMDBMcjQz7C1XxfZg8XXkWpzM_xkjKAeCvtY,14005
6
+ alter_runtime/daemon.py,sha256=8Y-9-KQrpAO90ANWLX2FPDbWtVLA3pfh7KBj7akwOOg,21969
7
+ alter_runtime/floor_loop.py,sha256=A6WjGTmDFhNeEZ4K9KxPLtc-JrvPuzuYLbhjbshJPcI,12344
8
+ alter_runtime/floor_preflight.py,sha256=LNWtQa17BR6QUDhKKiGhhnGvHIccaMhAOhQX7PgQS1s,25608
9
+ alter_runtime/http_auth.py,sha256=am2o7hur6_svl-6BP1OVNCEEES1F90mPPqwaP4sPLmI,7416
10
+ alter_runtime/service_install.py,sha256=riXA45oNlHthwrcCM0PXBU3ZttX-h1bwDGASz_Am7d8,21034
11
+ alter_runtime/update_loop.py,sha256=dI19cfxR5mwyV3NaleAG1Elvb9Nv9bWVwewjZMi6afg,19365
12
+ alter_runtime/adapters/__init__.py,sha256=qtKeev2pnnjjRi9gjTEtq-U7DDJSwYlbIvkj8ceyak4,920
13
+ alter_runtime/adapters/claude_jsonl_watcher.py,sha256=i5wEAFlKiBUJ6FyC9cQdps8zhftSu3aw6Ea6LJTiFKM,20021
14
+ alter_runtime/adapters/git_watcher.py,sha256=oYvC023ZBipHxTXfMFkRvO-72rRdXEqNxLBdPEdAYdk,17749
15
+ alter_runtime/adapters/worktree_watcher.py,sha256=FeFu_jpCMv88hRwxLPyUggeMOWO0OKQhO8yw4U13XFE,13764
16
+ alter_runtime/adapters/household/__init__.py,sha256=bDY5Sv1iUr9XiOGcZ7tCJCKbC6H8v6vdvcbs0wjmRx4,1089
17
+ alter_runtime/adapters/household/_base.py,sha256=_NAd6DULPCdEGwTSXm0er1uYn4Ezi8XOcVWB3j4f6CM,5268
18
+ alter_runtime/adapters/household/compost/__init__.py,sha256=4nbkMoiBEZbTDzxsfJg8wpjXnP8BlQzmVk8r2gSMQGI,641
19
+ alter_runtime/adapters/household/compost/adapter.py,sha256=Mxzi0mm3U3qwA5FRwlNUgFx-u-Uw22a-hmFpqjqAWxw,3432
20
+ alter_runtime/adapters/household/compost/storage.py,sha256=XsE7vNK_cYi-C5FYhJNsJWs3RnZgBb7oNTRF1xuPnIg,2547
21
+ alter_runtime/adapters/household/compost/traits.py,sha256=riDxQN1vN2NvU5r8qPJWHh05fFCciA9K4qqThBqegYQ,2766
22
+ alter_runtime/adapters/household/compost/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
23
+ alter_runtime/adapters/household/compost/tests/test_adapter.py,sha256=zwyqgWgDhGqxTEKmNtxh4kg7rJqcv4k8HZ4rcIQaIY8,2099
24
+ alter_runtime/adapters/household/compost/tests/test_storage.py,sha256=ARiLulWY8Rlk7RIivU-BBeotGYneKxEwjHos2mmQRAU,798
25
+ alter_runtime/adapters/household/compost/tests/test_traits.py,sha256=DThZw70FHvZ0hRZDQ9bApQ2bMHtq-I3lGskEdzHGr2A,1244
26
+ alter_runtime/adapters/household/self_hoster/__init__.py,sha256=jgZ-2h2I7TEchDB2jiSu7gN8BDl_td3zqpZkLjHEiTM,892
27
+ alter_runtime/adapters/household/self_hoster/adapter.py,sha256=uw2XWxc5E_jbkxwHwQ3SuZc3aLNh3cCT7kILUoaBe8Q,10822
28
+ alter_runtime/adapters/household/self_hoster/storage.py,sha256=P7Ki1HJneF6k8_byZGCaPR3Ul53PWZ_0tkGHg8qqRO0,2952
29
+ alter_runtime/adapters/household/self_hoster/traits.py,sha256=xtCVZCmuOZXQg5OsdCudLJQbF3qLiwj4Vt4tEgeg1P0,3589
30
+ alter_runtime/adapters/household/self_hoster/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
31
+ alter_runtime/adapters/household/self_hoster/tests/test_adapter.py,sha256=RGIORmXMhyz3N5bsoAfs0hie_fuMQfMhJx0TUksbf2U,7084
32
+ alter_runtime/adapters/household/self_hoster/tests/test_storage.py,sha256=NqeETgENNIKjhX2JFx215FxQ0nu4XpZ8H93k6PoAx3s,994
33
+ alter_runtime/adapters/household/self_hoster/tests/test_traits.py,sha256=9SXfPzATu8Nj4Ch_DAngL-LPOuBhsWJDRvV-fwnFXis,1633
34
+ alter_runtime/adapters/household/tapo_ecosystem/__init__.py,sha256=RW2RwsL-ESODnyU0nnCw9hd14b2fnjBX5gynMZ0QZ0I,805
35
+ alter_runtime/adapters/household/tapo_ecosystem/adapter.py,sha256=wVmM2QbLnSxsgpEONwfLzS03klJBFCpaBLj69ZOgTzk,3834
36
+ alter_runtime/adapters/household/tapo_ecosystem/storage.py,sha256=h-yzQaCnYiDX3Lt4eo7TsxugfsTnj9eCnC7I4VNNc_4,3023
37
+ alter_runtime/adapters/household/tapo_ecosystem/traits.py,sha256=fqZDXWW3e1soAlbJfhyhVXVFQf27-NCbcGGRbODwzEU,3307
38
+ alter_runtime/adapters/household/tapo_ecosystem/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
39
+ alter_runtime/adapters/household/tapo_ecosystem/tests/test_adapter.py,sha256=an--eWK3tth1e9UDP5cUKaYVvMjo10yPvhmsjc3G_-k,1807
40
+ alter_runtime/adapters/household/tapo_ecosystem/tests/test_storage.py,sha256=v-kQx9G_ZAoeIjapNeN8qG_IpeDIjJxiegEhMYmlHlg,977
41
+ alter_runtime/adapters/household/tapo_ecosystem/tests/test_traits.py,sha256=dlnfANFxukAp0BllWnu6AVQVZDPbwwhh0tukG99OVp0,1553
42
+ alter_runtime/adapters/household/workshop_tools/__init__.py,sha256=cIk9TOPWUAoePl-SBVQT8-y_TtOn_V9OlGHcg7VrxcQ,813
43
+ alter_runtime/adapters/household/workshop_tools/adapter.py,sha256=7ggFwRhzPNV-p3-JsfzPclga8iytoWQpQi6BucQF4X0,3194
44
+ alter_runtime/adapters/household/workshop_tools/storage.py,sha256=9uFDf--gQ9Qv6r6SMI-CD97BAV1pgjZoW1u3V1t_a_o,3322
45
+ alter_runtime/adapters/household/workshop_tools/traits.py,sha256=5I3EYqdASYI_0dY8qzDltm91iexDhBrjphOguQozJm8,3401
46
+ alter_runtime/adapters/household/workshop_tools/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
47
+ alter_runtime/adapters/household/workshop_tools/tests/test_adapter.py,sha256=9pxQWHbSle41ug5EN6Kk20q-SmkbW6LR8kejOXReW8g,1691
48
+ alter_runtime/adapters/household/workshop_tools/tests/test_storage.py,sha256=xxHKldZM0ctyu7w4Ty_xv408cbcei3qUsws5eGZUF8E,937
49
+ alter_runtime/adapters/household/workshop_tools/tests/test_traits.py,sha256=QexEd2R4D5bNNfY3-XYF7MEoHtVc_jS1IqmmBApP3nw,1400
50
+ alter_runtime/atlas/__init__.py,sha256=gFbACt1uWdWp74lLLdiFjOJGoTafEpEvL9xRAb0M_P4,1679
51
+ alter_runtime/atlas/base.py,sha256=PWnG1XDrhowa19Lx1OwwwJFr0IYthd-nrpTT9zVNvi0,3541
52
+ alter_runtime/atlas/ledger.py,sha256=66VXJ8iLtXY7YdNCCAP0AZBs8aDY6X5Re3pk_gnEcQk,7206
53
+ alter_runtime/atlas/observations.py,sha256=Qq9pH3720yk1NXefmXsifiKUQgEkQQc6Icf1MfW7l7k,5037
54
+ alter_runtime/atlas/schema.py,sha256=DWfcuDgEw27OrYUK-0JRP6AaIyFg0PAceHmy2zd56nM,3561
55
+ alter_runtime/clients/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
56
+ alter_runtime/clients/token_usage_client.py,sha256=QsjA-7wFD9NCPWqkp10MfhoOPtMVp718uDDYdLKkU2w,10527
57
+ alter_runtime/notifiers/__init__.py,sha256=hm-lPWjpEvXbmlokrKXYnCWyBXUpU8sDhuFgPXiwddE,815
58
+ alter_runtime/notifiers/desktop.py,sha256=Nda8KO2DtiEThiEYg7s79-q_e3zKmlmM_mqg1gE4XkQ,12900
59
+ alter_runtime/sdk/__init__.py,sha256=JzZnzClF5c6n0y0TcgvjthELRumKMEWMGFipqRAI-GI,480
60
+ alter_runtime/sdk/client.py,sha256=zBE-tXFy_VuPOe1d_iJty554FjDVdv7aMlrc3I5A_Jc,14988
61
+ alter_runtime/services/__init__.py,sha256=RcZTFs7wyERAoY6U4R-IuxFoyK-SEt6_WendIL2ekGk,2447
62
+ alter_runtime/services/systemd/cf-access-env.conf.in,sha256=39UNzPW284yE3lVSCe92F0F0MCZnoVwQgCAR2wBKo_Q,1482
63
+ alter_runtime/sockets/__init__.py,sha256=HqKG6dCc_qIdDBzyxnwX4fo4YjKqoxmtacr6aS9AJy8,822
64
+ alter_runtime/sockets/dbus.py,sha256=Ozu4Y0Kum5TJdD5QKyY56YkyLH6LGS6si-DQO0njd9Y,10205
65
+ alter_runtime/sockets/unix.py,sha256=T7izWBXBiZEiNnFCQcCT7-H15iehL2EAMIHZFwgVmX4,31162
66
+ alter_runtime/subscribers/__init__.py,sha256=HRXWVdxUnD4hQZkT2XAz-0BHeliL_6gZU0XGDaecQcM,2740
67
+ alter_runtime/subscribers/active_sessions_cron_emitter.py,sha256=QHgkWAn8hS6WR5F1w0Z8YvSY56YVvMWAoFSOcEYY9Co,12584
68
+ alter_runtime/subscribers/active_sessions_do_publisher.py,sha256=ahmwdnBfx-ovGdpLTj0kmd0mAZVYUvTCojW2Uh264aU,48263
69
+ alter_runtime/subscribers/active_sessions_gc.py,sha256=4RR9rwTlWO95YpaexYIdQTtC83esex0f_XUVWQNC5iM,16468
70
+ alter_runtime/subscribers/active_sessions_writer.py,sha256=AVfIQEE_xT5QRjyZGFWAG9MihkADkSXk7y2PrHeeRcI,16800
71
+ alter_runtime/subscribers/adapters_writer.py,sha256=m3R2STHwTKC4r9x5BXuGlEuZ9oQci4WN0ckNknO2BCo,14982
72
+ alter_runtime/subscribers/agent_frames.py,sha256=Mch4BdZ_6j4V_3oWc1BA7FEaI3Xu4GmeqwQM-lBdQ3g,18643
73
+ alter_runtime/subscribers/bus.py,sha256=0DD1MX5oH1bR9dSeuDKGYJKbzu_ETmNRZXljTgpWl8o,7665
74
+ alter_runtime/subscribers/cache_writer.py,sha256=qq5brBd0HpJwMJIf_1NDDGdCwuZcM69DE58jpbaIK0k,12306
75
+ alter_runtime/subscribers/ceremony_echo.py,sha256=fRz-uZqDjpJydMLzzadD9EV28sCTv33b8i9Y2lma0ro,11042
76
+ alter_runtime/subscribers/do_sse.py,sha256=XYNGHpcty-gJV1Bm2W-svLSErJv5IQJIO2nuoEpyZf0,38997
77
+ alter_runtime/subscribers/ebpf.py,sha256=mXt31Ot8AVAEVvZ5pjq9LVLxzE8fHBgIaYXvJFuszqI,20423
78
+ alter_runtime/subscribers/inbox_writer.py,sha256=pwBcA2njv1Vb0DgIYkG7kiZP0K76mB4_GnQCMPxsbH4,19627
79
+ alter_runtime/subscribers/mcp_fallback.py,sha256=RwiHXT1VczeTudfeBgcLw_cf7h0QwWORSoMMilIqvEQ,15251
80
+ alter_runtime/subscribers/presence_writer.py,sha256=DIr_oIjNb76SmwqALrO0T3qEoNwj6PI6KNLyIEa-8ZQ,16170
81
+ alter_runtime/subscribers/session_presence.py,sha256=6lElCehOI7h2LUDMqE_Anwum4QDrEjLluQfs4fH2ri8,17582
82
+ alter_runtime/subscribers/sse.py,sha256=0MCKHzI_q7wgJCgoTpgKAceW7BbuJLlmioxSj8LIjOg,3921
83
+ alter_runtime/subscribers/weave_intent_writer.py,sha256=qboTP7CTv4yl5yaxWnG6x8cswLwtqKoAv-uon9Zu0d0,22146
84
+ alter_runtime/weave/__init__.py,sha256=15S-p_jeqvjzVe0kXFbAA-janLfPEaJFppiJePiNJ1A,512
85
+ alter_runtime/weave/resolver.py,sha256=BUGRmjoU0e1Iv9NtlTgumPS1oPE8UZ67DzDVSP0quJ8,20138
86
+ alter_runtime/services/launchd/com.alter.runtime.plist.in,sha256=4oQ2TAbq6GNdRfuPhtcmkBMcs5PF91MqB2prlFhkwlU,3401
87
+ alter_runtime/services/systemd/alter-runtime.service.in,sha256=Mj_LI9ExPfIj73ChW6_TByc48mjHJjwVzml3U8ri2GU,2512
88
+ alter_runtime-0.3.0.dist-info/METADATA,sha256=NTusPllPyV-tGDLcs3vV9g2UW-Swtb8GvZ3eGyJyCbA,12854
89
+ alter_runtime-0.3.0.dist-info/WHEEL,sha256=mffPy8wBnZQn2VnJUU5jE99KsxaSfiyMHV9Yt0aLVxs,87
90
+ alter_runtime-0.3.0.dist-info/entry_points.txt,sha256=NcOLe73J0SKzW2gH-p4ycT9u4r7FUMl_OMdTqCQ_8h8,57
91
+ alter_runtime-0.3.0.dist-info/licenses/LICENSE,sha256=XgYf0P5xh89FddhCTgSw05qMZhaiT8sTixCUVB-rYGY,10709
92
+ alter_runtime-0.3.0.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: hatchling 1.30.1
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ alter-runtime = alter_runtime.cli:main
@@ -0,0 +1,190 @@
1
+ Apache License
2
+ Version 2.0, January 2004
3
+ http://www.apache.org/licenses/
4
+
5
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6
+
7
+ 1. Definitions.
8
+
9
+ "License" shall mean the terms and conditions for use, reproduction,
10
+ and distribution as defined by Sections 1 through 9 of this document.
11
+
12
+ "Licensor" shall mean the copyright owner or entity authorized by
13
+ the copyright owner that is granting the License.
14
+
15
+ "Legal Entity" shall mean the union of the acting entity and all
16
+ other entities that control, are controlled by, or are under common
17
+ control with that entity. For the purposes of this definition,
18
+ "control" means (i) the power, direct or indirect, to cause the
19
+ direction or management of such entity, whether by contract or
20
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
21
+ outstanding shares, or (iii) beneficial ownership of such entity.
22
+
23
+ "You" (or "Your") shall mean an individual or Legal Entity
24
+ exercising permissions granted by this License.
25
+
26
+ "Source" form shall mean the preferred form for making modifications,
27
+ including but not limited to software source code, documentation
28
+ source, and configuration files.
29
+
30
+ "Object" form shall mean any form resulting from mechanical
31
+ transformation or translation of a Source form, including but
32
+ not limited to compiled object code, generated documentation,
33
+ and conversions to other media types.
34
+
35
+ "Work" shall mean the work of authorship, whether in Source or
36
+ Object form, made available under the License, as indicated by a
37
+ copyright notice that is included in or attached to the work
38
+ (an example is provided in the Appendix below).
39
+
40
+ "Derivative Works" shall mean any work, whether in Source or Object
41
+ form, that is based on (or derived from) the Work and for which the
42
+ editorial revisions, annotations, elaborations, or other modifications
43
+ represent, as a whole, an original work of authorship. For the purposes
44
+ of this License, Derivative Works shall not include works that remain
45
+ separable from, or merely link (or bind by name) to the interfaces of,
46
+ the Work and Derivative Works thereof.
47
+
48
+ "Contribution" shall mean any work of authorship, including
49
+ the original version of the Work and any modifications or additions
50
+ to that Work or Derivative Works thereof, that is intentionally
51
+ submitted to Licensor for inclusion in the Work by the copyright owner
52
+ or by an individual or Legal Entity authorized to submit on behalf of
53
+ the copyright owner. For the purposes of this definition, "submitted"
54
+ means any form of electronic, verbal, or written communication sent
55
+ to the Licensor or its representatives, including but not limited to
56
+ communication on electronic mailing lists, source code control systems,
57
+ and issue tracking systems that are managed by, or on behalf of, the
58
+ Licensor for the purpose of discussing and improving the Work, but
59
+ excluding communication that is conspicuously marked or otherwise
60
+ designated in writing by the copyright owner as "Not a Contribution."
61
+
62
+ "Contributor" shall mean Licensor and any individual or Legal Entity
63
+ on behalf of whom a Contribution has been received by Licensor and
64
+ subsequently incorporated within the Work.
65
+
66
+ 2. Grant of Copyright License. Subject to the terms and conditions of
67
+ this License, each Contributor hereby grants to You a perpetual,
68
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
69
+ copyright license to reproduce, prepare Derivative Works of,
70
+ publicly display, publicly perform, sublicense, and distribute the
71
+ Work and such Derivative Works in Source or Object form.
72
+
73
+ 3. Grant of Patent License. Subject to the terms and conditions of
74
+ this License, each Contributor hereby grants to You a perpetual,
75
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
76
+ (except as stated in this section) patent license to make, have made,
77
+ use, offer to sell, sell, import, and otherwise transfer the Work,
78
+ where such license applies only to those patent claims licensable
79
+ by such Contributor that are necessarily infringed by their
80
+ Contribution(s) alone or by combination of their Contribution(s)
81
+ with the Work to which such Contribution(s) was submitted. If You
82
+ institute patent litigation against any entity (including a
83
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
84
+ or a Contribution incorporated within the Work constitutes direct
85
+ or contributory patent infringement, then any patent licenses
86
+ granted to You under this License for that Work shall terminate
87
+ as of the date such litigation is filed.
88
+
89
+ 4. Redistribution. You may reproduce and distribute copies of the
90
+ Work or Derivative Works thereof in any medium, with or without
91
+ modifications, and in Source or Object form, provided that You
92
+ meet the following conditions:
93
+
94
+ (a) You must give any other recipients of the Work or
95
+ Derivative Works a copy of this License; and
96
+
97
+ (b) You must cause any modified files to carry prominent notices
98
+ stating that You changed the files; and
99
+
100
+ (c) You must retain, in the Source form of any Derivative Works
101
+ that You distribute, all copyright, patent, trademark, and
102
+ attribution notices from the Source form of the Work,
103
+ excluding those notices that do not pertain to any part of
104
+ the Derivative Works; and
105
+
106
+ (d) If the Work includes a "NOTICE" text file as part of its
107
+ distribution, then any Derivative Works that You distribute must
108
+ include a readable copy of the attribution notices contained
109
+ within such NOTICE file, excluding those notices that do not
110
+ pertain to any part of the Derivative Works, in at least one
111
+ of the following places: within a NOTICE text file distributed
112
+ as part of the Derivative Works; within the Source form or
113
+ documentation, if provided along with the Derivative Works; or,
114
+ within a display generated by the Derivative Works, if and
115
+ wherever such third-party notices normally appear. The contents
116
+ of the NOTICE file are for informational purposes only and
117
+ do not modify the License. You may add Your own attribution
118
+ notices within Derivative Works that You distribute, alongside
119
+ or as an addendum to the NOTICE text from the Work, provided
120
+ that such additional attribution notices cannot be construed
121
+ as modifying the License.
122
+
123
+ You may add Your own copyright statement to Your modifications and
124
+ may provide additional or different license terms and conditions
125
+ for use, reproduction, or distribution of Your modifications, or
126
+ for any such Derivative Works as a whole, provided Your use,
127
+ reproduction, and distribution of the Work otherwise complies with
128
+ the conditions stated in this License.
129
+
130
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
131
+ any Contribution intentionally submitted for inclusion in the Work
132
+ by You to the Licensor shall be under the terms and conditions of
133
+ this License, without any additional terms or conditions.
134
+ Notwithstanding the above, nothing herein shall supersede or modify
135
+ the terms of any separate license agreement you may have executed
136
+ with Licensor regarding such Contributions.
137
+
138
+ 6. Trademarks. This License does not grant permission to use the trade
139
+ names, trademarks, service marks, or product names of the Licensor,
140
+ except as required for describing the origin of the Work and
141
+ reproducing the content of the NOTICE file.
142
+
143
+ 7. Disclaimer of Warranty. Unless required by applicable law or
144
+ agreed to in writing, Licensor provides the Work (and each
145
+ Contributor provides its Contributions) on an "AS IS" BASIS,
146
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
147
+ implied, including, without limitation, any warranties or conditions
148
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
149
+ PARTICULAR PURPOSE. You are solely responsible for determining the
150
+ appropriateness of using or redistributing the Work and assume any
151
+ risks associated with Your exercise of permissions under this License.
152
+
153
+ 8. Limitation of Liability. In no event and under no legal theory,
154
+ whether in tort (including negligence), contract, or otherwise,
155
+ unless required by applicable law (such as deliberate and grossly
156
+ negligent acts) or agreed to in writing, shall any Contributor be
157
+ liable to You for damages, including any direct, indirect, special,
158
+ incidental, or consequential damages of any character arising as a
159
+ result of this License or out of the use or inability to use the
160
+ Work (including but not limited to damages for loss of goodwill,
161
+ work stoppage, computer failure or malfunction, or any and all
162
+ other commercial damages or losses), even if such Contributor
163
+ has been advised of the possibility of such damages.
164
+
165
+ 9. Accepting Warranty or Support. While redistributing the Work or
166
+ Derivative Works thereof, You may choose to offer, and charge a
167
+ fee for, acceptance of support, warranty, indemnity, or other
168
+ liability obligations and/or rights consistent with this License.
169
+ However, in accepting such obligations, You may act only on Your
170
+ own behalf and on Your sole responsibility, not on behalf of any
171
+ other Contributor, and only if You agree to indemnify, defend,
172
+ and hold each Contributor harmless for any liability incurred by,
173
+ or claims asserted against, such Contributor by reason of your
174
+ accepting any such warranty or support.
175
+
176
+ END OF TERMS AND CONDITIONS
177
+
178
+ Copyright 2026 ALTER Meridian Pty Ltd
179
+
180
+ Licensed under the Apache License, Version 2.0 (the "License");
181
+ you may not use this file except in compliance with the License.
182
+ You may obtain a copy of the License at
183
+
184
+ http://www.apache.org/licenses/LICENSE-2.0
185
+
186
+ Unless required by applicable law or agreed to in writing, software
187
+ distributed under the License is distributed on an "AS IS" BASIS,
188
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
189
+ See the License for the specific language governing permissions and
190
+ limitations under the License.