opendots 0.2.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 (89) hide show
  1. opendots-0.2.0/CHANGELOG.md +36 -0
  2. opendots-0.2.0/LICENSE +21 -0
  3. opendots-0.2.0/MANIFEST.in +4 -0
  4. opendots-0.2.0/NOTICE +5 -0
  5. opendots-0.2.0/PKG-INFO +216 -0
  6. opendots-0.2.0/README.md +194 -0
  7. opendots-0.2.0/deploy/docker-entrypoint.sh +16 -0
  8. opendots-0.2.0/deploy/opendots.service.example +16 -0
  9. opendots-0.2.0/docs/DEVELOPMENT.md +180 -0
  10. opendots-0.2.0/docs/EVENTS.md +197 -0
  11. opendots-0.2.0/docs/GOALS_AND_EVENTS.md +315 -0
  12. opendots-0.2.0/docs/IMPLEMENTATION.md +167 -0
  13. opendots-0.2.0/docs/NOTIFICATIONS.md +154 -0
  14. opendots-0.2.0/docs/PLUGINS.md +240 -0
  15. opendots-0.2.0/docs/PROVIDERS.md +228 -0
  16. opendots-0.2.0/docs/ROADMAP.md +30 -0
  17. opendots-0.2.0/docs/VALIDATION.md +139 -0
  18. opendots-0.2.0/examples/config.json +163 -0
  19. opendots-0.2.0/examples/five-events.json +7 -0
  20. opendots-0.2.0/examples/goal-agent.json +61 -0
  21. opendots-0.2.0/examples/live-cases/scale.json +228 -0
  22. opendots-0.2.0/examples/live-cases/set-2.json +80 -0
  23. opendots-0.2.0/examples/workspaces/kubernetes/MAINTAINER.md +6 -0
  24. opendots-0.2.0/examples/workspaces/kubernetes/check.py +11 -0
  25. opendots-0.2.0/examples/workspaces/kubernetes/deployment.json +5 -0
  26. opendots-0.2.0/examples/workspaces/react/SCOUT.md +7 -0
  27. opendots-0.2.0/examples/workspaces/react/check.py +9 -0
  28. opendots-0.2.0/examples/workspaces/react/src/SearchButton.jsx +3 -0
  29. opendots-0.2.0/install.sh +50 -0
  30. opendots-0.2.0/opendots/__init__.py +3 -0
  31. opendots-0.2.0/opendots/__main__.py +172 -0
  32. opendots-0.2.0/opendots/agents.py +287 -0
  33. opendots-0.2.0/opendots/builtin_plugins.py +71 -0
  34. opendots-0.2.0/opendots/config.py +240 -0
  35. opendots-0.2.0/opendots/connectors/__init__.py +1 -0
  36. opendots-0.2.0/opendots/connectors/github.py +114 -0
  37. opendots-0.2.0/opendots/connectors/jsonl.py +57 -0
  38. opendots-0.2.0/opendots/engine.py +456 -0
  39. opendots-0.2.0/opendots/evidence.py +45 -0
  40. opendots-0.2.0/opendots/extensions.py +25 -0
  41. opendots-0.2.0/opendots/goals.py +26 -0
  42. opendots-0.2.0/opendots/http_client.py +53 -0
  43. opendots-0.2.0/opendots/maintenance.py +105 -0
  44. opendots-0.2.0/opendots/model_providers.py +245 -0
  45. opendots-0.2.0/opendots/notifications.py +235 -0
  46. opendots-0.2.0/opendots/plugins.py +187 -0
  47. opendots-0.2.0/opendots/process_guard.py +64 -0
  48. opendots-0.2.0/opendots/sandbox.py +38 -0
  49. opendots-0.2.0/opendots/schema.py +34 -0
  50. opendots-0.2.0/opendots/server.py +210 -0
  51. opendots-0.2.0/opendots/service.py +58 -0
  52. opendots-0.2.0/opendots/setup.py +129 -0
  53. opendots-0.2.0/opendots/sources.py +237 -0
  54. opendots-0.2.0/opendots/store.py +431 -0
  55. opendots-0.2.0/opendots/templates/config.json +163 -0
  56. opendots-0.2.0/opendots/templates/workspaces/kubernetes/MAINTAINER.md +6 -0
  57. opendots-0.2.0/opendots/templates/workspaces/kubernetes/check.py +11 -0
  58. opendots-0.2.0/opendots/templates/workspaces/kubernetes/deployment.json +5 -0
  59. opendots-0.2.0/opendots/templates/workspaces/react/SCOUT.md +7 -0
  60. opendots-0.2.0/opendots/templates/workspaces/react/check.py +9 -0
  61. opendots-0.2.0/opendots/templates/workspaces/react/src/SearchButton.jsx +3 -0
  62. opendots-0.2.0/opendots/terminal.py +359 -0
  63. opendots-0.2.0/opendots/tools.py +262 -0
  64. opendots-0.2.0/opendots/web/app.js +205 -0
  65. opendots-0.2.0/opendots/web/index.html +21 -0
  66. opendots-0.2.0/opendots/web/opendots-logo.png +0 -0
  67. opendots-0.2.0/opendots/web/style.css +11 -0
  68. opendots-0.2.0/opendots/workspaces.py +139 -0
  69. opendots-0.2.0/opendots.egg-info/PKG-INFO +216 -0
  70. opendots-0.2.0/opendots.egg-info/SOURCES.txt +87 -0
  71. opendots-0.2.0/opendots.egg-info/dependency_links.txt +1 -0
  72. opendots-0.2.0/opendots.egg-info/entry_points.txt +3 -0
  73. opendots-0.2.0/opendots.egg-info/top_level.txt +2 -0
  74. opendots-0.2.0/pyproject.toml +38 -0
  75. opendots-0.2.0/setup.cfg +4 -0
  76. opendots-0.2.0/spots/__init__.py +9 -0
  77. opendots-0.2.0/spots/__main__.py +6 -0
  78. opendots-0.2.0/tests/test_audit_fixes.py +432 -0
  79. opendots-0.2.0/tests/test_claude.py +97 -0
  80. opendots-0.2.0/tests/test_events.py +153 -0
  81. opendots-0.2.0/tests/test_evidence.py +157 -0
  82. opendots-0.2.0/tests/test_extensions.py +326 -0
  83. opendots-0.2.0/tests/test_goal_guide.py +57 -0
  84. opendots-0.2.0/tests/test_maintenance.py +78 -0
  85. opendots-0.2.0/tests/test_model_providers.py +226 -0
  86. opendots-0.2.0/tests/test_notifications.py +177 -0
  87. opendots-0.2.0/tests/test_onboarding.py +39 -0
  88. opendots-0.2.0/tests/test_plugins.py +311 -0
  89. opendots-0.2.0/tests/test_runtime.py +291 -0
@@ -0,0 +1,36 @@
1
+ # OpenDots 0.2.0
2
+
3
+ This release develops the local prototype with a prompt-first terminal client,
4
+ safer proposal handling, packaged setup, and runtime maintenance.
5
+
6
+ - Exact-action approvals bind check commands, workspace content and owner policy.
7
+ - Write scopes reject symlink bypasses and protect owner validation harnesses.
8
+ - Failed checks can trigger bounded repair; completion requires current evidence.
9
+ - Complete binary-capable Git patches are retained without preview truncation.
10
+ - Completed proposals require explicit acceptance before future tasks use them.
11
+ - Source synchronization creates new snapshots while preserving old proposals.
12
+ - Prompt-first terminal UI supports reviews, history, activity, cancellation,
13
+ proposal acceptance, command completion and input editing.
14
+ - Packaged `init`, `doctor`, Bash installation and user systemd lifecycle commands.
15
+ - Non-root Docker deployment initializes persistent configuration on first run.
16
+ - Durable daily invocation budgets, queue limits, priority aging and source health.
17
+ - Bounded connector polling, poisoned-line quarantine, gap reporting and deduplication.
18
+ - Explicitly enabled package extensions and typed custom tool arguments.
19
+ - Offline backup, verified restore, and preview-first workspace retention.
20
+ - CI covers Python 3.11–3.13, installed wheels, Bubblewrap and container lifecycle.
21
+
22
+ ## Upgrade notes
23
+
24
+ Back up runtime data before upgrading and install into a new environment. Stop
25
+ old services before switching their executable to the new environment.
26
+
27
+ Existing `latest_branch` metadata does not automatically become an accepted
28
+ base. Review the relevant completed proposal and explicitly accept its commit.
29
+ Omitted `write_paths` in JSON configuration now grants no write access. Default
30
+ protected paths include `check.py`, `tests/**` and `.github/**`; review your scopes
31
+ and checks when migrating. Shipped demo configurations now require validation.
32
+
33
+ A draft GitHub release contains the wheel, source archive, installer and SHA-256
34
+ checksums after validation. Publishing the draft is a maintainer action. Packages
35
+ are not automatically published to PyPI. OpenDots remains a local alpha; live
36
+ Codex behavior and stronger deployment boundaries require separate validation.
opendots-0.2.0/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Shashank Shekhar Singh
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,4 @@
1
+ include README.md LICENSE NOTICE CHANGELOG.md install.sh
2
+ recursive-include examples *.json *.jsonl *.py *.md *.jsx
3
+ recursive-include deploy *.sh *.example
4
+ recursive-include docs *.md
opendots-0.2.0/NOTICE ADDED
@@ -0,0 +1,5 @@
1
+ OpenDots includes source previously distributed under the name Spots.
2
+ Original source notice: Copyright (c) 2026 Spots contributors.
3
+ That source was distributed under the MIT license. The permission and warranty
4
+ terms are reproduced in LICENSE. The repository owner's existing LICENSE has
5
+ been preserved without modification.
@@ -0,0 +1,216 @@
1
+ Metadata-Version: 2.4
2
+ Name: opendots
3
+ Version: 0.2.0
4
+ Summary: Event-driven agents with persistent targets and reviewable local actions
5
+ License-Expression: MIT
6
+ Project-URL: Homepage, https://github.com/Shashankss1205/OpenDots
7
+ Project-URL: Repository, https://github.com/Shashankss1205/OpenDots
8
+ Project-URL: Issues, https://github.com/Shashankss1205/OpenDots/issues
9
+ Project-URL: Documentation, https://github.com/Shashankss1205/OpenDots/tree/main/docs
10
+ Keywords: agents,automation,terminal,event-driven
11
+ Classifier: Development Status :: 3 - Alpha
12
+ Classifier: Operating System :: POSIX :: Linux
13
+ Classifier: Programming Language :: Python :: 3
14
+ Classifier: Programming Language :: Python :: 3.11
15
+ Classifier: Programming Language :: Python :: 3.12
16
+ Classifier: Programming Language :: Python :: 3.13
17
+ Requires-Python: >=3.11
18
+ Description-Content-Type: text/markdown
19
+ License-File: LICENSE
20
+ License-File: NOTICE
21
+ Dynamic: license-file
22
+
23
+ # OpenDots
24
+
25
+ ![OpenDots architecture: your goal and incoming events drive planning, permitted actions, checks, and changes for your review.](https://raw.githubusercontent.com/Shashankss1205/OpenDots/main/assets/opendots-overview.svg)
26
+
27
+ **Give an agent your goal. Connect the information it needs. Review the work it proposes.**
28
+
29
+ OpenDots runs on your computer and coordinates CLI agents, cloud models or local Ollama models around a goal you choose. It listens for incoming information, keeps task history and notes, and can check progress on a schedule. You choose the project, allowed changes, checks, and approval rules.
30
+
31
+ A **heartbeat** is a scheduled check-in. An **event** is a message from you or a connected tool. A **target** is one configured agent with its own goal. The **runtime** is the process you leave running.
32
+
33
+ ## What can it do?
34
+
35
+ - Pursue your saved goal using Claude Code, Codex, OpenAI, Anthropic, compatible APIs or Ollama.
36
+ - React to terminal requests, local HTTP messages, JSONL files, and GitHub activity.
37
+ - Assess matching events against each goal, with a visible confidence estimate and reason.
38
+ - Revisit progress on a configurable heartbeat schedule.
39
+ - Read project files, propose scoped edits, and run checks you configure.
40
+ - Ask for approval, retain local patches, and preserve history across restarts.
41
+ - Send [notifications](https://github.com/Shashankss1205/OpenDots/blob/main/docs/NOTIFICATIONS.md) to local files or configured webhooks, including Slack/Discord formats.
42
+ - Manage multiple agents through a terminal or a local web interface.
43
+ - Extend providers, tools and polling or persistent event listeners through a [shared plugin framework](https://github.com/Shashankss1205/OpenDots/blob/main/docs/PLUGINS.md).
44
+
45
+ This is a local prototype. It does not automatically publish PRs, deploy applications, or pull upstream changes. Model access comes from your provider account. Checks prove only what you configure them to test.
46
+
47
+ Inspect loaded integrations with `opendots plugins`, `/plugins` in the TUI, or **Loaded plugins** in the web interface. Connection status appears under `/listeners`. Slack and Discord require a connector plugin or an external bridge; they are not bundled integrations.
48
+
49
+ ## What you need
50
+
51
+ - **Linux, Python 3.11+, Git, and Bubblewrap** with working namespaces for isolated checks.
52
+ - **Model access**: a signed-in Claude Code/Codex CLI, an API key, or a running Ollama server with a model. See [provider setup](https://github.com/Shashankss1205/OpenDots/blob/main/docs/PROVIDERS.md).
53
+ - **Your own project directory and a goal** you want the agent to pursue.
54
+
55
+ On Ubuntu/Debian, install prerequisites with `sudo apt-get install python3 python3-venv git bubblewrap curl`. Check `python3 --version` is at least 3.11. Docker and a GitHub token are not needed to start.
56
+
57
+ ## Install OpenDots
58
+
59
+ Choose **one** method.
60
+
61
+ ### Option A: install from PyPI
62
+
63
+ With [pipx](https://pipx.pypa.io/stable/installation/) installed:
64
+
65
+ ```bash
66
+ pipx install opendots
67
+ pipx ensurepath
68
+ ```
69
+
70
+ Alternatively, install in a Python virtual environment with `python -m pip install opendots`.
71
+
72
+ ### Option B: download and run the installer
73
+
74
+ ```bash
75
+ curl -fsSLo install-opendots.sh https://raw.githubusercontent.com/Shashankss1205/OpenDots/main/install.sh
76
+ bash install-opendots.sh
77
+ ```
78
+
79
+ The script installs into a separate Python environment without sudo. Follow its printed PATH instruction; with the default location:
80
+
81
+ ```bash
82
+ export PATH="$HOME/.local/share/opendots/runtime/bin:$PATH"
83
+ ```
84
+
85
+ Add that line to your shell startup file for new terminals. `--prefix DIR` chooses a different installation directory; `--ref COMMIT` pins a reviewed revision. Existing installations are not overwritten.
86
+
87
+ ### Option C: install the Python package from GitHub
88
+
89
+ With [pipx](https://pipx.pypa.io/stable/installation/) installed:
90
+
91
+ ```bash
92
+ pipx install 'git+https://github.com/Shashankss1205/OpenDots.git'
93
+ pipx ensurepath
94
+ ```
95
+
96
+ Open a new terminal if pipx asks you to. All methods provide the `opendots` command.
97
+
98
+ ## Start with your project and your goal
99
+
100
+ ### 1. Create your configuration
101
+
102
+ First sign in to your chosen CLI (`claude auth login`, or `codex login`). From your project's directory, replace the goal text below with your own objective:
103
+
104
+ ```bash
105
+ opendots init --workspace "$PWD" --goal "Describe what you want this agent to achieve" --backend claude
106
+ ```
107
+
108
+ Use `--backend codex` if that is your provider. For OpenAI, Anthropic, compatible APIs or Ollama, follow the [model setup commands](https://github.com/Shashankss1205/OpenDots/blob/main/docs/PROVIDERS.md#direct-apis-and-local-models). No sample project, predefined repair, or demo event is created.
109
+
110
+ The command prints your configuration path. By default it is `~/.config/opendots/config.json` (or under `XDG_CONFIG_HOME`). Open that file to review your saved goal and settings. Normal setup starts with **reads and notes allowed, no writable paths, no configured checks, model goal-relevance assessment enabled, and no heartbeat**. Before enabling changes, set `write_paths`, `checks`, and `required_checks` for your project.
111
+
112
+ Want periodic work? Add `--heartbeat 1800` to `init` for a 30-minute check-in. A heartbeat can start work immediately when the runtime starts, and uses your provider's allowance. You can also configure schedules later.
113
+
114
+ ### 2. Check the setup, then start the runtime
115
+
116
+ ```bash
117
+ opendots doctor
118
+ opendots serve
119
+ ```
120
+
121
+ Continue only when `doctor` reports top-level `"ok": true`. It checks configuration, executables, authentication, and isolation; it is not proof of a completed live model task. Leave the `serve` terminal open.
122
+
123
+ If you used `init --directory DIR`, pass the printed path explicitly: `opendots --config DIR/config.json doctor` and `opendots --config DIR/config.json serve`. Configuration and runtime data must stay outside your project directory.
124
+
125
+ ### 3. Open an interface
126
+
127
+ In another terminal:
128
+
129
+ ```bash
130
+ opendots
131
+ ```
132
+
133
+ Or open **http://127.0.0.1:8765** on the same machine. Both interfaces use the same runtime.
134
+
135
+ ## Talk to your agent
136
+
137
+ Type these commands inside the OpenDots terminal interface, not your shell:
138
+
139
+ ```text
140
+ /agents
141
+ /use project
142
+ ```
143
+
144
+ Then type a normal message about your goal. It becomes an `owner.request` event for the selected agent. The agent can investigate, save notes, or explain a blocker. It cannot write until you configure allowed paths and approve the proposed action.
145
+
146
+ | Command | What it does |
147
+ | --- | --- |
148
+ | `/listeners` | See configured sources, subscriptions, schedules, and relevance settings. |
149
+ | `/notifications` | See notification destinations and delivery status. |
150
+ | `/plugins` | Inspect loaded plugins, versions, and the capabilities each owns. |
151
+ | `/events` / `/event ID` | Browse received events and inspect payloads, routing reasons, and confidence. |
152
+ | `/send TYPE MESSAGE` | Create a message with your chosen event type. |
153
+ | `/connect` | Learn how to connect an event producer. |
154
+ | `/providers` | Show models, provider profiles and agent assignments. |
155
+ | `/status` | Show the provider, source health, and model usage. |
156
+ | `/activity` | See what is happening. |
157
+ | `/reviews` | Find work waiting for approval. |
158
+ | `/review ID` | Inspect the action for the task number shown. |
159
+ | `/approve ID` | Request approval; type the requested confirmation to permit that exact action. |
160
+ | `/work ID` | Inspect task results and check evidence. |
161
+ | `/proposal ID` | Inspect a completed patch and its acceptance command. |
162
+ | `/pause` / `/resume` | Stop or resume the selected agent taking new work. |
163
+ | `/help` | Show all commands. |
164
+
165
+ Accepting a completed proposal makes its commit the base of future tasks; it does not change your original checkout or push code. Pause the agent and finish or cancel active work before acceptance. Editing your saved goal or subscriptions requires restarting the runtime.
166
+
167
+ `/quit` or Ctrl+D disconnects the interface. **Ctrl+C in the `serve` terminal stops the runtime.** Pausing does not cancel active work or stop incoming messages from queuing.
168
+
169
+ ## Connect incoming information
170
+
171
+ Use `/listeners` and `/events` in the terminal, or **What is listening?** and **Received events** in the web interface. The web form can preview and send arbitrary JSON payloads.
172
+
173
+ A **source** brings messages into OpenDots. A **subscription** specifies which message types an agent listens to. Setting up one without the other does not create useful work.
174
+
175
+ | Method | How information arrives |
176
+ | --- | --- |
177
+ | Terminal / web form | You submit a message. |
178
+ | HTTP | Your tool sends a JSON event to `POST /api/events`. |
179
+ | JSONL | Your tool appends one JSON object per line to a watched inbox. |
180
+ | GitHub polling | OpenDots periodically fetches new repository activity. |
181
+ | GitHub webhook | A separately configured receiver forwards signed deliveries. |
182
+ | Heartbeat | OpenDots emits a scheduled event while running. |
183
+
184
+ **[Create events and connect sources](https://github.com/Shashankss1205/OpenDots/blob/main/docs/EVENTS.md)** explains each setup with producer commands, subscription rules, and how confidence controls execution. New setups assess matching events before actions; uncertain decisions block work for inspection. Confidence is a model estimate, not a calibrated probability.
185
+
186
+ Native Slack, email, Kafka, Redis, and arbitrary filesystem-watch adapters are not built in. External tools can bridge into HTTP or JSONL. GitHub activity does not automatically refresh the agent's source-code snapshot.
187
+
188
+ ## Documentation
189
+
190
+ - [Notifications](https://github.com/Shashankss1205/OpenDots/blob/main/docs/NOTIFICATIONS.md): configure alerts, webhooks, retries and delivery history.
191
+
192
+ - [Plugins](https://github.com/Shashankss1205/OpenDots/blob/main/docs/PLUGINS.md): install packages and build providers, tools, polling adapters or persistent listeners.
193
+ - [Events and listeners](https://github.com/Shashankss1205/OpenDots/blob/main/docs/EVENTS.md): create messages, connect tools, inspect history and relevance.
194
+ - [Provider setup](https://github.com/Shashankss1205/OpenDots/blob/main/docs/PROVIDERS.md): CLI authentication, API keys, local models and per-agent model profiles.
195
+ - [Implementation](https://github.com/Shashankss1205/OpenDots/blob/main/docs/IMPLEMENTATION.md): configuration, policies, event routing, and storage.
196
+ - [Development and operations](https://github.com/Shashankss1205/OpenDots/blob/main/docs/DEVELOPMENT.md): checks, packaging, services, backup, and source refresh.
197
+ - [Validation](https://github.com/Shashankss1205/OpenDots/blob/main/docs/VALIDATION.md): tested behavior and remaining live-provider validation.
198
+ - [Roadmap](https://github.com/Shashankss1205/OpenDots/blob/main/docs/ROADMAP.md) and [Contributing](https://github.com/Shashankss1205/OpenDots/blob/main/CONTRIBUTING.md).
199
+
200
+ <details>
201
+ <summary>Show me a demo or a worked sample</summary>
202
+
203
+ Demos are optional and separate from normal setup. For deterministic fixtures:
204
+
205
+ ```bash
206
+ opendots init --demo --directory "$HOME/.config/opendots-demo"
207
+ opendots --config "$HOME/.config/opendots-demo/config.json" serve --port 8766
208
+ ```
209
+
210
+ Open http://127.0.0.1:8766 and explicitly select the five-event demo. It uses no model and makes no changes to a real cluster or upstream repository.
211
+
212
+ For a fully worked real-provider sample using OpenDots' own source, see [the optional goal walkthrough](https://github.com/Shashankss1205/OpenDots/blob/main/docs/GOALS_AND_EVENTS.md). Its predefined goal and syntax check are illustrative; they are not applied to your project by normal setup.
213
+
214
+ </details>
215
+
216
+ OpenDots is an independent experiment inspired by OpenAI's Dots idea. MIT licensed; see [LICENSE](https://github.com/Shashankss1205/OpenDots/blob/main/LICENSE) and [NOTICE](https://github.com/Shashankss1205/OpenDots/blob/main/NOTICE).
@@ -0,0 +1,194 @@
1
+ # OpenDots
2
+
3
+ ![OpenDots architecture: your goal and incoming events drive planning, permitted actions, checks, and changes for your review.](https://raw.githubusercontent.com/Shashankss1205/OpenDots/main/assets/opendots-overview.svg)
4
+
5
+ **Give an agent your goal. Connect the information it needs. Review the work it proposes.**
6
+
7
+ OpenDots runs on your computer and coordinates CLI agents, cloud models or local Ollama models around a goal you choose. It listens for incoming information, keeps task history and notes, and can check progress on a schedule. You choose the project, allowed changes, checks, and approval rules.
8
+
9
+ A **heartbeat** is a scheduled check-in. An **event** is a message from you or a connected tool. A **target** is one configured agent with its own goal. The **runtime** is the process you leave running.
10
+
11
+ ## What can it do?
12
+
13
+ - Pursue your saved goal using Claude Code, Codex, OpenAI, Anthropic, compatible APIs or Ollama.
14
+ - React to terminal requests, local HTTP messages, JSONL files, and GitHub activity.
15
+ - Assess matching events against each goal, with a visible confidence estimate and reason.
16
+ - Revisit progress on a configurable heartbeat schedule.
17
+ - Read project files, propose scoped edits, and run checks you configure.
18
+ - Ask for approval, retain local patches, and preserve history across restarts.
19
+ - Send [notifications](https://github.com/Shashankss1205/OpenDots/blob/main/docs/NOTIFICATIONS.md) to local files or configured webhooks, including Slack/Discord formats.
20
+ - Manage multiple agents through a terminal or a local web interface.
21
+ - Extend providers, tools and polling or persistent event listeners through a [shared plugin framework](https://github.com/Shashankss1205/OpenDots/blob/main/docs/PLUGINS.md).
22
+
23
+ This is a local prototype. It does not automatically publish PRs, deploy applications, or pull upstream changes. Model access comes from your provider account. Checks prove only what you configure them to test.
24
+
25
+ Inspect loaded integrations with `opendots plugins`, `/plugins` in the TUI, or **Loaded plugins** in the web interface. Connection status appears under `/listeners`. Slack and Discord require a connector plugin or an external bridge; they are not bundled integrations.
26
+
27
+ ## What you need
28
+
29
+ - **Linux, Python 3.11+, Git, and Bubblewrap** with working namespaces for isolated checks.
30
+ - **Model access**: a signed-in Claude Code/Codex CLI, an API key, or a running Ollama server with a model. See [provider setup](https://github.com/Shashankss1205/OpenDots/blob/main/docs/PROVIDERS.md).
31
+ - **Your own project directory and a goal** you want the agent to pursue.
32
+
33
+ On Ubuntu/Debian, install prerequisites with `sudo apt-get install python3 python3-venv git bubblewrap curl`. Check `python3 --version` is at least 3.11. Docker and a GitHub token are not needed to start.
34
+
35
+ ## Install OpenDots
36
+
37
+ Choose **one** method.
38
+
39
+ ### Option A: install from PyPI
40
+
41
+ With [pipx](https://pipx.pypa.io/stable/installation/) installed:
42
+
43
+ ```bash
44
+ pipx install opendots
45
+ pipx ensurepath
46
+ ```
47
+
48
+ Alternatively, install in a Python virtual environment with `python -m pip install opendots`.
49
+
50
+ ### Option B: download and run the installer
51
+
52
+ ```bash
53
+ curl -fsSLo install-opendots.sh https://raw.githubusercontent.com/Shashankss1205/OpenDots/main/install.sh
54
+ bash install-opendots.sh
55
+ ```
56
+
57
+ The script installs into a separate Python environment without sudo. Follow its printed PATH instruction; with the default location:
58
+
59
+ ```bash
60
+ export PATH="$HOME/.local/share/opendots/runtime/bin:$PATH"
61
+ ```
62
+
63
+ Add that line to your shell startup file for new terminals. `--prefix DIR` chooses a different installation directory; `--ref COMMIT` pins a reviewed revision. Existing installations are not overwritten.
64
+
65
+ ### Option C: install the Python package from GitHub
66
+
67
+ With [pipx](https://pipx.pypa.io/stable/installation/) installed:
68
+
69
+ ```bash
70
+ pipx install 'git+https://github.com/Shashankss1205/OpenDots.git'
71
+ pipx ensurepath
72
+ ```
73
+
74
+ Open a new terminal if pipx asks you to. All methods provide the `opendots` command.
75
+
76
+ ## Start with your project and your goal
77
+
78
+ ### 1. Create your configuration
79
+
80
+ First sign in to your chosen CLI (`claude auth login`, or `codex login`). From your project's directory, replace the goal text below with your own objective:
81
+
82
+ ```bash
83
+ opendots init --workspace "$PWD" --goal "Describe what you want this agent to achieve" --backend claude
84
+ ```
85
+
86
+ Use `--backend codex` if that is your provider. For OpenAI, Anthropic, compatible APIs or Ollama, follow the [model setup commands](https://github.com/Shashankss1205/OpenDots/blob/main/docs/PROVIDERS.md#direct-apis-and-local-models). No sample project, predefined repair, or demo event is created.
87
+
88
+ The command prints your configuration path. By default it is `~/.config/opendots/config.json` (or under `XDG_CONFIG_HOME`). Open that file to review your saved goal and settings. Normal setup starts with **reads and notes allowed, no writable paths, no configured checks, model goal-relevance assessment enabled, and no heartbeat**. Before enabling changes, set `write_paths`, `checks`, and `required_checks` for your project.
89
+
90
+ Want periodic work? Add `--heartbeat 1800` to `init` for a 30-minute check-in. A heartbeat can start work immediately when the runtime starts, and uses your provider's allowance. You can also configure schedules later.
91
+
92
+ ### 2. Check the setup, then start the runtime
93
+
94
+ ```bash
95
+ opendots doctor
96
+ opendots serve
97
+ ```
98
+
99
+ Continue only when `doctor` reports top-level `"ok": true`. It checks configuration, executables, authentication, and isolation; it is not proof of a completed live model task. Leave the `serve` terminal open.
100
+
101
+ If you used `init --directory DIR`, pass the printed path explicitly: `opendots --config DIR/config.json doctor` and `opendots --config DIR/config.json serve`. Configuration and runtime data must stay outside your project directory.
102
+
103
+ ### 3. Open an interface
104
+
105
+ In another terminal:
106
+
107
+ ```bash
108
+ opendots
109
+ ```
110
+
111
+ Or open **http://127.0.0.1:8765** on the same machine. Both interfaces use the same runtime.
112
+
113
+ ## Talk to your agent
114
+
115
+ Type these commands inside the OpenDots terminal interface, not your shell:
116
+
117
+ ```text
118
+ /agents
119
+ /use project
120
+ ```
121
+
122
+ Then type a normal message about your goal. It becomes an `owner.request` event for the selected agent. The agent can investigate, save notes, or explain a blocker. It cannot write until you configure allowed paths and approve the proposed action.
123
+
124
+ | Command | What it does |
125
+ | --- | --- |
126
+ | `/listeners` | See configured sources, subscriptions, schedules, and relevance settings. |
127
+ | `/notifications` | See notification destinations and delivery status. |
128
+ | `/plugins` | Inspect loaded plugins, versions, and the capabilities each owns. |
129
+ | `/events` / `/event ID` | Browse received events and inspect payloads, routing reasons, and confidence. |
130
+ | `/send TYPE MESSAGE` | Create a message with your chosen event type. |
131
+ | `/connect` | Learn how to connect an event producer. |
132
+ | `/providers` | Show models, provider profiles and agent assignments. |
133
+ | `/status` | Show the provider, source health, and model usage. |
134
+ | `/activity` | See what is happening. |
135
+ | `/reviews` | Find work waiting for approval. |
136
+ | `/review ID` | Inspect the action for the task number shown. |
137
+ | `/approve ID` | Request approval; type the requested confirmation to permit that exact action. |
138
+ | `/work ID` | Inspect task results and check evidence. |
139
+ | `/proposal ID` | Inspect a completed patch and its acceptance command. |
140
+ | `/pause` / `/resume` | Stop or resume the selected agent taking new work. |
141
+ | `/help` | Show all commands. |
142
+
143
+ Accepting a completed proposal makes its commit the base of future tasks; it does not change your original checkout or push code. Pause the agent and finish or cancel active work before acceptance. Editing your saved goal or subscriptions requires restarting the runtime.
144
+
145
+ `/quit` or Ctrl+D disconnects the interface. **Ctrl+C in the `serve` terminal stops the runtime.** Pausing does not cancel active work or stop incoming messages from queuing.
146
+
147
+ ## Connect incoming information
148
+
149
+ Use `/listeners` and `/events` in the terminal, or **What is listening?** and **Received events** in the web interface. The web form can preview and send arbitrary JSON payloads.
150
+
151
+ A **source** brings messages into OpenDots. A **subscription** specifies which message types an agent listens to. Setting up one without the other does not create useful work.
152
+
153
+ | Method | How information arrives |
154
+ | --- | --- |
155
+ | Terminal / web form | You submit a message. |
156
+ | HTTP | Your tool sends a JSON event to `POST /api/events`. |
157
+ | JSONL | Your tool appends one JSON object per line to a watched inbox. |
158
+ | GitHub polling | OpenDots periodically fetches new repository activity. |
159
+ | GitHub webhook | A separately configured receiver forwards signed deliveries. |
160
+ | Heartbeat | OpenDots emits a scheduled event while running. |
161
+
162
+ **[Create events and connect sources](https://github.com/Shashankss1205/OpenDots/blob/main/docs/EVENTS.md)** explains each setup with producer commands, subscription rules, and how confidence controls execution. New setups assess matching events before actions; uncertain decisions block work for inspection. Confidence is a model estimate, not a calibrated probability.
163
+
164
+ Native Slack, email, Kafka, Redis, and arbitrary filesystem-watch adapters are not built in. External tools can bridge into HTTP or JSONL. GitHub activity does not automatically refresh the agent's source-code snapshot.
165
+
166
+ ## Documentation
167
+
168
+ - [Notifications](https://github.com/Shashankss1205/OpenDots/blob/main/docs/NOTIFICATIONS.md): configure alerts, webhooks, retries and delivery history.
169
+
170
+ - [Plugins](https://github.com/Shashankss1205/OpenDots/blob/main/docs/PLUGINS.md): install packages and build providers, tools, polling adapters or persistent listeners.
171
+ - [Events and listeners](https://github.com/Shashankss1205/OpenDots/blob/main/docs/EVENTS.md): create messages, connect tools, inspect history and relevance.
172
+ - [Provider setup](https://github.com/Shashankss1205/OpenDots/blob/main/docs/PROVIDERS.md): CLI authentication, API keys, local models and per-agent model profiles.
173
+ - [Implementation](https://github.com/Shashankss1205/OpenDots/blob/main/docs/IMPLEMENTATION.md): configuration, policies, event routing, and storage.
174
+ - [Development and operations](https://github.com/Shashankss1205/OpenDots/blob/main/docs/DEVELOPMENT.md): checks, packaging, services, backup, and source refresh.
175
+ - [Validation](https://github.com/Shashankss1205/OpenDots/blob/main/docs/VALIDATION.md): tested behavior and remaining live-provider validation.
176
+ - [Roadmap](https://github.com/Shashankss1205/OpenDots/blob/main/docs/ROADMAP.md) and [Contributing](https://github.com/Shashankss1205/OpenDots/blob/main/CONTRIBUTING.md).
177
+
178
+ <details>
179
+ <summary>Show me a demo or a worked sample</summary>
180
+
181
+ Demos are optional and separate from normal setup. For deterministic fixtures:
182
+
183
+ ```bash
184
+ opendots init --demo --directory "$HOME/.config/opendots-demo"
185
+ opendots --config "$HOME/.config/opendots-demo/config.json" serve --port 8766
186
+ ```
187
+
188
+ Open http://127.0.0.1:8766 and explicitly select the five-event demo. It uses no model and makes no changes to a real cluster or upstream repository.
189
+
190
+ For a fully worked real-provider sample using OpenDots' own source, see [the optional goal walkthrough](https://github.com/Shashankss1205/OpenDots/blob/main/docs/GOALS_AND_EVENTS.md). Its predefined goal and syntax check are illustrative; they are not applied to your project by normal setup.
191
+
192
+ </details>
193
+
194
+ OpenDots is an independent experiment inspired by OpenAI's Dots idea. MIT licensed; see [LICENSE](https://github.com/Shashankss1205/OpenDots/blob/main/LICENSE) and [NOTICE](https://github.com/Shashankss1205/OpenDots/blob/main/NOTICE).
@@ -0,0 +1,16 @@
1
+ #!/bin/sh
2
+ set -eu
3
+ runtime_config="${OPENDOTS_CONFIG:-/data/config.json}"
4
+ if [ ! -f "$runtime_config" ]; then
5
+ if [ "$runtime_config" != /data/config.json ]; then
6
+ echo "Configured file is missing: $runtime_config" >&2
7
+ exit 1
8
+ fi
9
+ if [ "${OPENDOTS_DEMO:-0}" = 1 ]; then
10
+ opendots init --demo --directory /data
11
+ else
12
+ echo 'Mount your real config and set OPENDOTS_CONFIG. Optional fixtures require OPENDOTS_DEMO=1.' >&2
13
+ exit 1
14
+ fi
15
+ fi
16
+ exec opendots --config "$runtime_config" "$@"
@@ -0,0 +1,16 @@
1
+ [Unit]
2
+ Description=OpenDots local event-driven agent runtime
3
+ After=network-online.target
4
+ Wants=network-online.target
5
+
6
+ [Service]
7
+ Type=simple
8
+ WorkingDirectory=/absolute/path/to/opendots
9
+ ExecStart=/usr/bin/python3 -m opendots --config /absolute/path/to/your/config.json serve
10
+ Restart=on-failure
11
+ RestartSec=5
12
+ TimeoutStopSec=240
13
+ Environment=PYTHONDONTWRITEBYTECODE=1
14
+
15
+ [Install]
16
+ WantedBy=default.target