gdmcode 0.1.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- gdmcode-0.1.0.dist-info/METADATA +240 -0
- gdmcode-0.1.0.dist-info/RECORD +131 -0
- gdmcode-0.1.0.dist-info/WHEEL +4 -0
- gdmcode-0.1.0.dist-info/entry_points.txt +2 -0
- src/__init__.py +1 -0
- src/_internal/__init__.py +0 -0
- src/_internal/constants.py +244 -0
- src/_internal/domain_skills.py +339 -0
- src/agent/__init__.py +0 -0
- src/agent/commit_classifier.py +91 -0
- src/agent/context_budget.py +391 -0
- src/agent/daemon.py +681 -0
- src/agent/dag_validator.py +153 -0
- src/agent/debug_loop.py +473 -0
- src/agent/impact_analyzer.py +149 -0
- src/agent/impact_graph.py +117 -0
- src/agent/loop.py +1410 -0
- src/agent/orchestrator.py +141 -0
- src/agent/regression_guard.py +251 -0
- src/agent/review_gate.py +648 -0
- src/agent/risk_scorer.py +169 -0
- src/agent/self_healing.py +145 -0
- src/agent/smart_test_selector.py +89 -0
- src/agent/system_prompt.py +226 -0
- src/agent/task_tracker.py +320 -0
- src/agent/test_validator.py +210 -0
- src/agent/tool_orchestrator.py +402 -0
- src/agent/transcript.py +230 -0
- src/agent/verification_loop.py +133 -0
- src/agent/work_director.py +136 -0
- src/agent/worktree_manager.py +53 -0
- src/artifacts/__init__.py +16 -0
- src/artifacts/artifact_store.py +456 -0
- src/artifacts/verification_graph.py +75 -0
- src/auth.py +411 -0
- src/cli.py +1290 -0
- src/commands.py +1398 -0
- src/config.py +762 -0
- src/cost_tracker.py +348 -0
- src/db/__init__.py +4 -0
- src/db/migrations.py +337 -0
- src/enterprise/__init__.py +3 -0
- src/enterprise/audit_log.py +182 -0
- src/enterprise/identity.py +90 -0
- src/enterprise/rbac.py +100 -0
- src/enterprise/team_config.py +125 -0
- src/enterprise/usage_analytics.py +261 -0
- src/exceptions.py +207 -0
- src/git_workflow.py +651 -0
- src/integrations/__init__.py +6 -0
- src/integrations/github_actions.py +106 -0
- src/integrations/mcp_server.py +333 -0
- src/integrations/sentry_integration.py +100 -0
- src/integrations/sentry_server.py +82 -0
- src/integrations/webhook_security.py +19 -0
- src/main.py +27 -0
- src/memory/__init__.py +0 -0
- src/memory/code_index.py +376 -0
- src/memory/compressor.py +378 -0
- src/memory/context_memory.py +135 -0
- src/memory/continuous_memory.py +234 -0
- src/memory/conventions.py +495 -0
- src/memory/db.py +1119 -0
- src/memory/document_index.py +205 -0
- src/memory/file_cache.py +128 -0
- src/memory/project_scanner.py +178 -0
- src/memory/session_store.py +201 -0
- src/models/__init__.py +0 -0
- src/models/client.py +715 -0
- src/models/definitions.py +459 -0
- src/models/router.py +418 -0
- src/models/schemas.py +389 -0
- src/permissions.py +294 -0
- src/remote/__init__.py +5 -0
- src/remote/command_filter.py +33 -0
- src/remote/models.py +31 -0
- src/remote/permission_handler.py +79 -0
- src/remote/phone_ui.py +48 -0
- src/remote/protocol.py +59 -0
- src/remote/qr.py +65 -0
- src/remote/server.py +586 -0
- src/remote/token_manager.py +61 -0
- src/remote/tunnel.py +212 -0
- src/repl.py +475 -0
- src/runtime/__init__.py +1 -0
- src/runtime/branch_farm.py +372 -0
- src/runtime/replay.py +351 -0
- src/sandbox/__init__.py +2 -0
- src/sandbox/hermetic.py +214 -0
- src/sandbox/policy.py +44 -0
- src/sdk/__init__.py +3 -0
- src/sdk/plugin_base.py +39 -0
- src/sdk/plugin_host.py +100 -0
- src/sdk/plugin_loader.py +101 -0
- src/security.py +409 -0
- src/server/__init__.py +7 -0
- src/server/bridge.py +427 -0
- src/server/bridge_cli.py +103 -0
- src/server/bridge_client.py +170 -0
- src/server/protocol_version.py +103 -0
- src/session/__init__.py +10 -0
- src/session/event_fanout.py +46 -0
- src/session/input_broker.py +38 -0
- src/session/permission_bridge.py +100 -0
- src/tools/__init__.py +160 -0
- src/tools/_atomic.py +72 -0
- src/tools/agent_tools.py +423 -0
- src/tools/ask_user_tool.py +83 -0
- src/tools/bash_tool.py +384 -0
- src/tools/browser_tool.py +352 -0
- src/tools/browser_tools.py +179 -0
- src/tools/dep_tools.py +210 -0
- src/tools/document_reader.py +167 -0
- src/tools/document_tool.py +240 -0
- src/tools/document_writer.py +171 -0
- src/tools/impact_tools.py +240 -0
- src/tools/playwright_tool.py +172 -0
- src/tools/quality_tools.py +366 -0
- src/tools/read_tools.py +318 -0
- src/tools/result_cache.py +157 -0
- src/tools/search_tools.py +310 -0
- src/tools/shell_tools.py +311 -0
- src/tools/write_tools.py +337 -0
- src/voice/__init__.py +25 -0
- src/voice/audio_capture.py +92 -0
- src/voice/audio_playback.py +68 -0
- src/voice/errors.py +14 -0
- src/voice/models.py +35 -0
- src/voice/providers.py +143 -0
- src/voice/vad.py +55 -0
- src/voice/voice_loop.py +156 -0
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: gdmcode
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: gdm: AI coding agent for professional developers
|
|
5
|
+
Project-URL: Homepage, https://github.com/guidegdm/gdmcode
|
|
6
|
+
Project-URL: Repository, https://github.com/guidegdm/gdmcode
|
|
7
|
+
Project-URL: Bug Tracker, https://github.com/guidegdm/gdmcode/issues
|
|
8
|
+
Project-URL: Documentation, https://github.com/guidegdm/gdmcode#readme
|
|
9
|
+
Project-URL: Changelog, https://github.com/guidegdm/gdmcode/blob/main/CHANGELOG.md
|
|
10
|
+
License: MIT
|
|
11
|
+
Keywords: ai,coding-agent,developer-tools,llm
|
|
12
|
+
Classifier: Development Status :: 3 - Alpha
|
|
13
|
+
Classifier: Environment :: Console
|
|
14
|
+
Classifier: Intended Audience :: Developers
|
|
15
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
19
|
+
Classifier: Topic :: Software Development :: Code Generators
|
|
20
|
+
Classifier: Topic :: Utilities
|
|
21
|
+
Requires-Python: >=3.11
|
|
22
|
+
Requires-Dist: httpx>=0.27.0
|
|
23
|
+
Requires-Dist: keyring>=25.0.0
|
|
24
|
+
Requires-Dist: markdownify>=0.12.0
|
|
25
|
+
Requires-Dist: openai>=1.30.0
|
|
26
|
+
Requires-Dist: prompt-toolkit>=3.0.43
|
|
27
|
+
Requires-Dist: pydantic>=2.7.0
|
|
28
|
+
Requires-Dist: requests>=2.32.0
|
|
29
|
+
Requires-Dist: rich>=13.7.0
|
|
30
|
+
Requires-Dist: tiktoken>=0.7.0
|
|
31
|
+
Requires-Dist: tomli-w>=1.0.0
|
|
32
|
+
Requires-Dist: tree-sitter-javascript>=0.23.0
|
|
33
|
+
Requires-Dist: tree-sitter-python>=0.23.0
|
|
34
|
+
Requires-Dist: tree-sitter-typescript>=0.23.0
|
|
35
|
+
Requires-Dist: tree-sitter>=0.23.0
|
|
36
|
+
Requires-Dist: typer>=0.12.0
|
|
37
|
+
Requires-Dist: websockets>=12.0
|
|
38
|
+
Provides-Extra: all
|
|
39
|
+
Requires-Dist: faiss-cpu>=1.8.0; extra == 'all'
|
|
40
|
+
Requires-Dist: itsdangerous>=2.2.0; extra == 'all'
|
|
41
|
+
Requires-Dist: numpy>=1.26.0; extra == 'all'
|
|
42
|
+
Requires-Dist: openpyxl>=3.1.0; extra == 'all'
|
|
43
|
+
Requires-Dist: pdfplumber>=0.11.0; extra == 'all'
|
|
44
|
+
Requires-Dist: playwright>=1.44.0; extra == 'all'
|
|
45
|
+
Requires-Dist: python-docx>=1.1.0; extra == 'all'
|
|
46
|
+
Requires-Dist: qrcode>=7.4.0; extra == 'all'
|
|
47
|
+
Requires-Dist: sounddevice>=0.4.6; extra == 'all'
|
|
48
|
+
Requires-Dist: starlette>=0.37.0; extra == 'all'
|
|
49
|
+
Requires-Dist: uvicorn>=0.29.0; extra == 'all'
|
|
50
|
+
Requires-Dist: webrtcvad>=2.0.10; extra == 'all'
|
|
51
|
+
Requires-Dist: websockets>=12.0; extra == 'all'
|
|
52
|
+
Requires-Dist: xlrd>=2.0.1; extra == 'all'
|
|
53
|
+
Provides-Extra: browser
|
|
54
|
+
Requires-Dist: playwright>=1.44.0; extra == 'browser'
|
|
55
|
+
Requires-Dist: websockets>=12.0; extra == 'browser'
|
|
56
|
+
Provides-Extra: dev
|
|
57
|
+
Requires-Dist: pytest-asyncio>=0.23.0; extra == 'dev'
|
|
58
|
+
Requires-Dist: pytest-cov>=5.0.0; extra == 'dev'
|
|
59
|
+
Requires-Dist: pytest-mock>=3.14.0; extra == 'dev'
|
|
60
|
+
Requires-Dist: pytest>=8.2.0; extra == 'dev'
|
|
61
|
+
Provides-Extra: docs
|
|
62
|
+
Requires-Dist: openpyxl>=3.1.0; extra == 'docs'
|
|
63
|
+
Requires-Dist: pdfplumber>=0.11.0; extra == 'docs'
|
|
64
|
+
Requires-Dist: python-docx>=1.1.0; extra == 'docs'
|
|
65
|
+
Requires-Dist: xlrd>=2.0.1; extra == 'docs'
|
|
66
|
+
Provides-Extra: evals
|
|
67
|
+
Requires-Dist: bandit[toml]>=1.7.0; extra == 'evals'
|
|
68
|
+
Requires-Dist: datasets>=2.20.0; extra == 'evals'
|
|
69
|
+
Requires-Dist: docker>=7.1.0; extra == 'evals'
|
|
70
|
+
Requires-Dist: jinja2>=3.1.0; extra == 'evals'
|
|
71
|
+
Requires-Dist: mypy>=1.10.0; extra == 'evals'
|
|
72
|
+
Requires-Dist: pandas>=2.2.0; extra == 'evals'
|
|
73
|
+
Requires-Dist: pyyaml>=6.0.0; extra == 'evals'
|
|
74
|
+
Requires-Dist: ruff>=0.4.0; extra == 'evals'
|
|
75
|
+
Requires-Dist: swebench>=3.0.0; extra == 'evals'
|
|
76
|
+
Provides-Extra: faiss
|
|
77
|
+
Requires-Dist: faiss-cpu>=1.8.0; extra == 'faiss'
|
|
78
|
+
Provides-Extra: mobile
|
|
79
|
+
Provides-Extra: plugin-dev
|
|
80
|
+
Requires-Dist: build>=1.2; extra == 'plugin-dev'
|
|
81
|
+
Requires-Dist: twine>=5.0; extra == 'plugin-dev'
|
|
82
|
+
Provides-Extra: remote
|
|
83
|
+
Requires-Dist: itsdangerous>=2.2.0; extra == 'remote'
|
|
84
|
+
Requires-Dist: qrcode>=7.4.0; extra == 'remote'
|
|
85
|
+
Requires-Dist: starlette>=0.37.0; extra == 'remote'
|
|
86
|
+
Requires-Dist: uvicorn>=0.29.0; extra == 'remote'
|
|
87
|
+
Requires-Dist: websockets>=12.0; extra == 'remote'
|
|
88
|
+
Provides-Extra: sentry
|
|
89
|
+
Requires-Dist: fastapi>=0.111; extra == 'sentry'
|
|
90
|
+
Requires-Dist: httpx>=0.27; extra == 'sentry'
|
|
91
|
+
Requires-Dist: uvicorn[standard]>=0.29; extra == 'sentry'
|
|
92
|
+
Provides-Extra: voice
|
|
93
|
+
Requires-Dist: numpy>=1.26.0; extra == 'voice'
|
|
94
|
+
Requires-Dist: sounddevice>=0.4.6; extra == 'voice'
|
|
95
|
+
Requires-Dist: webrtcvad>=2.0.10; extra == 'voice'
|
|
96
|
+
Description-Content-Type: text/markdown
|
|
97
|
+
|
|
98
|
+
# gdm — Open-Source AI Coding Agent
|
|
99
|
+
|
|
100
|
+
A terminal-native coding agent that reads your codebase, reasons over it, and edits files autonomously — with configurable autonomy, local model support, and a full audit trail.
|
|
101
|
+
|
|
102
|
+
  
|
|
103
|
+
|
|
104
|
+
---
|
|
105
|
+
|
|
106
|
+
## ⚡ Quick start (30 seconds)
|
|
107
|
+
|
|
108
|
+
```bash
|
|
109
|
+
pipx install gdm-code
|
|
110
|
+
gdm version
|
|
111
|
+
gdm health
|
|
112
|
+
cd my-project && gdm "fix the login bug"
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
See [docs/quick-start.md](docs/quick-start.md) for a step-by-step walkthrough.
|
|
116
|
+
|
|
117
|
+
---
|
|
118
|
+
|
|
119
|
+
## Why gdm?
|
|
120
|
+
|
|
121
|
+
- **Local-model support** — run fully air-gapped with Ollama or vLLM; no data leaves your machine.
|
|
122
|
+
- **Autonomy slider** — five levels from "ask everything" to "fully autonomous"; start low, build trust.
|
|
123
|
+
- **Open source and auditable** — MIT licensed, hash-chained audit log, team policy enforcement.
|
|
124
|
+
|
|
125
|
+
---
|
|
126
|
+
|
|
127
|
+
## Feature status
|
|
128
|
+
|
|
129
|
+
| Feature | Status | Task(s) |
|
|
130
|
+
|---|---|---|
|
|
131
|
+
| Multi-model routing (Grok / Gemini / Codex) | ✅ implemented | models-001/002/005 |
|
|
132
|
+
| Local model support — Ollama / vLLM | ✅ implemented | models-003 |
|
|
133
|
+
| Cost tracking and budget caps | ✅ implemented | runtime-005 |
|
|
134
|
+
| Session checkpoint / restore | ✅ implemented | core-002/003 |
|
|
135
|
+
| Audit log with hash chain | ✅ implemented | enterprise-002 |
|
|
136
|
+
| Team configuration and policy | ✅ implemented | enterprise-001 |
|
|
137
|
+
| Web search (debug / research) | ✅ implemented | tools-003 |
|
|
138
|
+
| Code index + whole-codebase mode | ✅ implemented | memory-001/005 |
|
|
139
|
+
| Git workflow automation | ✅ implemented | autonomous-003 |
|
|
140
|
+
| Verification loop | ✅ implemented | autonomous-002 |
|
|
141
|
+
| Self-healing debug loop | ✅ implemented | autonomous-004 |
|
|
142
|
+
| Multi-file orchestration | ✅ implemented | autonomous-001 |
|
|
143
|
+
| Impact analysis gate | ✅ implemented | autonomous-005 |
|
|
144
|
+
| Autonomy slider — 5 levels | ✅ implemented | ide-004 |
|
|
145
|
+
| VS Code extension | ✅ implemented | ide-001/002/003 |
|
|
146
|
+
| Voice interface (PTT + streaming) | ✅ implemented | voice-001/002/003 |
|
|
147
|
+
| Remote / LAN server + phone UI | ✅ implemented | remote-001/002/003 |
|
|
148
|
+
| Chrome extension + bridge | ✅ implemented | extensions-002 |
|
|
149
|
+
| MCP protocol server | ✅ implemented | integrations-003 |
|
|
150
|
+
| GitHub Actions CI integration | ✅ implemented | integrations-001 |
|
|
151
|
+
| Playwright browser automation | ✅ implemented | tools-002 |
|
|
152
|
+
| Sub-agent parallel execution | ✅ implemented | tools-005 |
|
|
153
|
+
| RBAC (role-based access control) | 📋 planned | enterprise-003 |
|
|
154
|
+
| Usage analytics dashboard | 📋 planned | enterprise-004 |
|
|
155
|
+
| Hermetic sandbox | ✅ implemented | moonshot-002 |
|
|
156
|
+
| Patch risk scoring | ✅ implemented | moonshot-006 |
|
|
157
|
+
| Impact graph smart test selection | ✅ implemented | moonshot-007 |
|
|
158
|
+
| CI eval pipeline | ✅ implemented | evals-002 |
|
|
159
|
+
| Continuous memory | ✅ implemented | memory-003 |
|
|
160
|
+
| Proxy/relay mode (geo-restricted regions) | ✅ implemented | proxy-001 |
|
|
161
|
+
| OIDC identity integration | 📋 planned | — |
|
|
162
|
+
|
|
163
|
+
---
|
|
164
|
+
|
|
165
|
+
## Installation
|
|
166
|
+
|
|
167
|
+
**Recommended (isolated environment):**
|
|
168
|
+
```bash
|
|
169
|
+
pipx install gdm-code
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
**pip:**
|
|
173
|
+
```bash
|
|
174
|
+
pip install gdm-code
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
**Development install:**
|
|
178
|
+
```bash
|
|
179
|
+
git clone https://github.com/GedeonMatabaro/gdmcode
|
|
180
|
+
cd gdmcode
|
|
181
|
+
pip install -e ".[dev]"
|
|
182
|
+
gdm health
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
**Note:** The PyPI package is `gdm-code`. The command is `gdm`.
|
|
186
|
+
|
|
187
|
+
---
|
|
188
|
+
|
|
189
|
+
## Configuration
|
|
190
|
+
|
|
191
|
+
gdm uses a 7-layer precedence system (highest wins):
|
|
192
|
+
|
|
193
|
+
```
|
|
194
|
+
CLI flags > env vars (GDM_*) > team policy > team preferences
|
|
195
|
+
> project .gdm/config.toml > user ~/.config/gdm/config.toml > defaults
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
Quick setup:
|
|
199
|
+
```bash
|
|
200
|
+
gdm login grok # or: gemini | codex | all
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
Secrets are stored in the OS keychain — never in TOML files.
|
|
204
|
+
|
|
205
|
+
Full configuration reference: [docs/configuration.md](docs/configuration.md)
|
|
206
|
+
|
|
207
|
+
---
|
|
208
|
+
|
|
209
|
+
## Enterprise
|
|
210
|
+
|
|
211
|
+
gdm includes audit and governance features suitable for team deployment:
|
|
212
|
+
|
|
213
|
+
- **Audit log** — every tool call is logged with a hash chain for tamper detection.
|
|
214
|
+
- **Team policy** — `.gdm/team.toml` enforces autonomy caps, network allowlists, and git permissions.
|
|
215
|
+
- **RBAC** — planned (enterprise-003).
|
|
216
|
+
|
|
217
|
+
See [docs/security-hardening.md](docs/security-hardening.md) for deployment guidance.
|
|
218
|
+
|
|
219
|
+
---
|
|
220
|
+
|
|
221
|
+
## Architecture
|
|
222
|
+
|
|
223
|
+
gdm runs a tool-calling agent loop: the model receives a task, selects tools from a registered
|
|
224
|
+
registry, executes them (subject to injection checks, RBAC, and network policy), and writes the
|
|
225
|
+
results back into context. Sessions are checkpointed to SQLite; memory is indexed for whole-codebase
|
|
226
|
+
reasoning.
|
|
227
|
+
|
|
228
|
+
Full architecture diagram: [docs/architecture.md](docs/architecture.md)
|
|
229
|
+
|
|
230
|
+
---
|
|
231
|
+
|
|
232
|
+
## Contributing
|
|
233
|
+
|
|
234
|
+
See [CONTRIBUTING.md](CONTRIBUTING.md). Issues and PRs welcome.
|
|
235
|
+
|
|
236
|
+
---
|
|
237
|
+
|
|
238
|
+
## License
|
|
239
|
+
|
|
240
|
+
MIT — Copyright GedeonMatabaro
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
src/__init__.py,sha256=QTYqXqSTHFRkM9TEgpDFcHvwLbvqHDqvqfQ9EiXkcAM,23
|
|
2
|
+
src/auth.py,sha256=uUxDCmRd8vUEWMFAT75bfCWS-rQuI-pQmOcocMaIG3w,15289
|
|
3
|
+
src/cli.py,sha256=4hTzYeOcZdek0pquabe75HukCQJAbrbCSpjyb07Dr-Q,50560
|
|
4
|
+
src/commands.py,sha256=uyuNheaX2701-BiAfvk0XN_MVTZgJKFs55uT7UlQV2g,63435
|
|
5
|
+
src/config.py,sha256=mu1CYErSpjhwzcT95Knbavj36E3DLxL06jpVn_T9eLA,31697
|
|
6
|
+
src/cost_tracker.py,sha256=ipGbFIVL2nh1ByQSMVP8ag1y-ZxfLac0AErxFDQOuug,12744
|
|
7
|
+
src/exceptions.py,sha256=fPmG4nKVWQW5MW75SuFmNmEUN_LwEougqHkGIYmdJ_Y,6491
|
|
8
|
+
src/git_workflow.py,sha256=msZCW4WHhgOxNcRBOhUwU9dqY90poQIZqg46-yW3ItY,24398
|
|
9
|
+
src/main.py,sha256=QgRDVzPZvL-lB31m2KE3oVUysND2QQPCb6rx7WOLh7k,594
|
|
10
|
+
src/permissions.py,sha256=QBrVqDaudBnZRY9u1K3IeQPsJcyi5Puc6fi8Xh31Q8I,11906
|
|
11
|
+
src/repl.py,sha256=huiMdqAlXDIslqnma3UwdRtoQP--pfEiJj2fy8WWhHw,19056
|
|
12
|
+
src/security.py,sha256=1bHQtkolCF1nPm1pybgNdsSZXlPcjy2dbyZiUSqDND0,16983
|
|
13
|
+
src/_internal/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
14
|
+
src/_internal/constants.py,sha256=cH6PwTaJ92v1bqjoj8s915VMIgKQsXdT-rNJ-aZAztY,7776
|
|
15
|
+
src/_internal/domain_skills.py,sha256=1iH9p-hozxVjDfCoZz3EoaC0GCFFd0LHxWrTvty-S94,15033
|
|
16
|
+
src/agent/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
17
|
+
src/agent/commit_classifier.py,sha256=wDIylvh30LIl5Ye4s30laSj6usLJW_FMo7w54MG90HQ,3512
|
|
18
|
+
src/agent/context_budget.py,sha256=TRARZ8OcRvalwJyUWknzRmi6l18UHYtLSy8rcLBsmhM,13847
|
|
19
|
+
src/agent/daemon.py,sha256=1Y7aeoMQN_6J6YOLh_68TsWUTajoiR6mdnCBr1EfRzg,27143
|
|
20
|
+
src/agent/dag_validator.py,sha256=5JaxoxoLzzppi3FmYfwLYFcX4mDXFQWR59FgSRtxi8U,5358
|
|
21
|
+
src/agent/debug_loop.py,sha256=pKcFT9qKmuekEdXW1WG4428waghWUfarzagoxqD-tpA,19300
|
|
22
|
+
src/agent/impact_analyzer.py,sha256=GMB3FwXPCpOXbWY2wQTHVVLzCwGnWCGczAQkcMT2lUE,5334
|
|
23
|
+
src/agent/impact_graph.py,sha256=_39EYdTGrdwp3u0bgOj-YVgx_KsrHwVgGO-MteCwU-c,4402
|
|
24
|
+
src/agent/loop.py,sha256=Bp3bparGT8Y0s1FoH4zk38qW0oZomgMJLGjI6-oLoyw,62460
|
|
25
|
+
src/agent/orchestrator.py,sha256=a5fWYLXtUUjx_1Czy6EFE9mN9Fxw3wEJK_3PZE3kaTk,4981
|
|
26
|
+
src/agent/regression_guard.py,sha256=NfJ9FJ6cPoN2SV__7xT3HLKbpqakjrdCUH_iD_QwyY0,9117
|
|
27
|
+
src/agent/review_gate.py,sha256=gby4IF_I4zJNZYBXmnUzsbZQk3vjxkV_KPmPlrYSZj8,24713
|
|
28
|
+
src/agent/risk_scorer.py,sha256=_7qF4MG7t0__i794T0uFGj0uaW7IyvGiE6IkxUjXs-I,5376
|
|
29
|
+
src/agent/self_healing.py,sha256=kA_vTtb2tBsGWYMAoIcvtTwdzQH8dJKN4JCBWmkO1CQ,5298
|
|
30
|
+
src/agent/smart_test_selector.py,sha256=zW26Zwmbh4DuCw0POTEgO8XU1C-KgWnuc3FQSzxGFlI,3419
|
|
31
|
+
src/agent/system_prompt.py,sha256=D8Z6xtXLxcahxftIw0CXvA8cc4A9KcMTAZCjr1k8XPk,9089
|
|
32
|
+
src/agent/task_tracker.py,sha256=XnPh5AcDXPZH6EO3f02gqvm6ZCigIidzEDEav74ruuc,11502
|
|
33
|
+
src/agent/test_validator.py,sha256=V-XUDagYJsPJv9KgVDlAUKOPH5mNpGbTE9TOv6yVS9g,7653
|
|
34
|
+
src/agent/tool_orchestrator.py,sha256=dHwO_aZvcSuEI8oHcXUWVP9QVviLu3wnW5c6M8KddkY,15925
|
|
35
|
+
src/agent/transcript.py,sha256=XIeRqEaJiLUCkI8MLHhW7dHmOkHt9G7XGiuM4kWU4T4,9068
|
|
36
|
+
src/agent/verification_loop.py,sha256=cdB0Gbf2bb12wLcjUAubADaVd3ud9XZynzYE1rLyncY,4775
|
|
37
|
+
src/agent/work_director.py,sha256=k0UE-PhdVdS87F9ehcMXXj7mYF1D-NYYtnu-cDuFBSE,5237
|
|
38
|
+
src/agent/worktree_manager.py,sha256=-g5y8U81jN85csOHupFOVssktRwiv4wF7PSeQvIpRds,1769
|
|
39
|
+
src/artifacts/__init__.py,sha256=JZwJSlUWkyejuSIZ2LeSY3bd6jHOvxP-o1UU20XjnfY,335
|
|
40
|
+
src/artifacts/artifact_store.py,sha256=xwEyLNmGtgIhxB7ltYId7s0rGjx05yxflYQvwqQli6M,16637
|
|
41
|
+
src/artifacts/verification_graph.py,sha256=s-HURmT_CF9aEhx6IE5znuEcR6VeFUp5C-uxFCqmR9g,3404
|
|
42
|
+
src/db/__init__.py,sha256=J7ffJGDtr3GK-IVGeeUupoHXfiZa6eCx9CWH2E7WnTk,201
|
|
43
|
+
src/db/migrations.py,sha256=sfn2huJR6PgECnpzaD6hbq9CsZujfFRI_qbphDVJq0U,13523
|
|
44
|
+
src/enterprise/__init__.py,sha256=YNnw6AbWCSu6E3waPcd_9TI4wxoKkZW-2cZ4tdznflQ,177
|
|
45
|
+
src/enterprise/audit_log.py,sha256=CkqC4H7kdgOaVjr1GstT2fLBFioYyPhPgugZMNkF8NM,6735
|
|
46
|
+
src/enterprise/identity.py,sha256=XVDY38qnH2qGRt5I1CDUoTNVhzxH4e2Yqg4MDabdbrI,3203
|
|
47
|
+
src/enterprise/rbac.py,sha256=_KkZomwQmn4MUBiuSyKkU2D5tLKvd86mduItAcwi3XU,3471
|
|
48
|
+
src/enterprise/team_config.py,sha256=ZZZ8geTWNEIutGnJNHfFsqH034ZharlEgHZjGvocl6s,4605
|
|
49
|
+
src/enterprise/usage_analytics.py,sha256=RB5-tx4i_vlnR0adi-eBG2mvIe1Tv4dRQaDNKhzlQZs,9944
|
|
50
|
+
src/integrations/__init__.py,sha256=FzpdFjTJmn_kYVR6WN3YnnUzAw0yq1_3UOxebeiKBbM,224
|
|
51
|
+
src/integrations/github_actions.py,sha256=YMVmmNwzan6O_j7Qp1GIiTZlqzHnEbahRF6ZFG-Jggo,3793
|
|
52
|
+
src/integrations/mcp_server.py,sha256=877c6E2_nhQFWugTTrrQ5ONRdLEcLghEmA57ajkP18w,11665
|
|
53
|
+
src/integrations/sentry_integration.py,sha256=NRfwM6M7uX71c3QXpPNfCA_EyXNN0sIFsTXYW_ek-y8,3733
|
|
54
|
+
src/integrations/sentry_server.py,sha256=K0gn5JFZPcMGEX5IN44BMnZPF8kj-SAzeggl3nqF290,2623
|
|
55
|
+
src/integrations/webhook_security.py,sha256=UNal_dNPsitKbjvJy7eyjX3KrpURPR6iRpNhBmMeXRQ,744
|
|
56
|
+
src/memory/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
57
|
+
src/memory/code_index.py,sha256=ykB_LEtuCf2uaqkcUFasi3Q0FNVtmVBM55rrU-Qh0Ow,14053
|
|
58
|
+
src/memory/compressor.py,sha256=TwZ1h2U91p93i6iNd5hhEiLPw3YbqAIpskcJBvSxnJ0,15790
|
|
59
|
+
src/memory/context_memory.py,sha256=yfll23vrteDugSDrx8m4_xk-ALGhROMKRGM4rJMcrKk,5059
|
|
60
|
+
src/memory/continuous_memory.py,sha256=8gb5VZ-8amdFMCvzk9G8sX7DFCxo9aoDjKqUkuTBaBw,9064
|
|
61
|
+
src/memory/conventions.py,sha256=RnQLgaZhoqkrqODJB6HPbcD4ETBYjmOFD2ZKaKPp5oc,20196
|
|
62
|
+
src/memory/db.py,sha256=RoOMEFTkFSKe8ms1wFL8-V3o_pD5UkduOQ51CLo2YvY,45588
|
|
63
|
+
src/memory/document_index.py,sha256=CkjvRTq2IoekUY1-rpPp5vM0_Py3ommzDIq0IevJdow,7798
|
|
64
|
+
src/memory/file_cache.py,sha256=Dfw7nidqTyrmG3PpJg4PxTciAxJ2ri5er8GPqnGv_dM,4547
|
|
65
|
+
src/memory/project_scanner.py,sha256=MHqYnCxPLeuWIrZPDGfjMoAlEcjH4VVSQOGGyM3bcoE,6309
|
|
66
|
+
src/memory/session_store.py,sha256=n75sYesKnXfWsJJyRqJjhL5gUriod9W0RCoFADSbNTU,7522
|
|
67
|
+
src/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
68
|
+
src/models/client.py,sha256=lfBQfnZE5_6QOfIb4T_knFJt_Z-twYuSBGEkfkxKviQ,27781
|
|
69
|
+
src/models/definitions.py,sha256=QspEisTp_hv6LxuzOIsV6Xv7pebBiU1qU1S5MRkdQZk,15050
|
|
70
|
+
src/models/router.py,sha256=w-DQMInV6Ly6ozN1a2edr9m8zzs5vL3ZTnjCtVHLbl0,15197
|
|
71
|
+
src/models/schemas.py,sha256=b4SV_pHq9uMO8TWq9CTplkMqTGzNb1WO8w1dv6ZLVJ0,12007
|
|
72
|
+
src/remote/__init__.py,sha256=Vxr55VU1Uf5vlaQO54sp_sSlCStwDNdiJdM_SAFWvzo,308
|
|
73
|
+
src/remote/command_filter.py,sha256=P2mmDQflP47zLLA3EuKKXHsiRZl__eLqwcGlmMLODSw,1161
|
|
74
|
+
src/remote/models.py,sha256=rRmD6zNI8_3HZurqjZ6WHBpjlTXQwJ85ZUjr1j3ETzg,576
|
|
75
|
+
src/remote/permission_handler.py,sha256=eV6gDxWK4XTS8DyUHsjCk2cuQveM8K44nOgsMaV_6q4,2717
|
|
76
|
+
src/remote/phone_ui.py,sha256=oVV28x1ZcZadXUtoMVTmhrHgzGFe0_DLu8Hoaj306s0,1396
|
|
77
|
+
src/remote/protocol.py,sha256=gJielwHsaAYq86u0a6bCwHxlwkDpSJptbJY2WAAn5Pg,1143
|
|
78
|
+
src/remote/qr.py,sha256=pM7-9CwhqjFigOhFbN3Ypr8lAEL1mqSABjESBp1uqPw,2050
|
|
79
|
+
src/remote/server.py,sha256=-jiZ4aqWroxH4lsYCG4VjxqW2GRl1XDk2Qe47ZY2fDs,20661
|
|
80
|
+
src/remote/token_manager.py,sha256=dKW0kDIbZ47YRQYB8NwQax3lMDoLuuL7LGF4V3cKJVE,1789
|
|
81
|
+
src/remote/tunnel.py,sha256=Wc3X4xSbQEY2I0_ZfVYI3thuuBlYn36iVyJAbkpW9Z0,7000
|
|
82
|
+
src/runtime/__init__.py,sha256=RWBGqreHJ0WSFM2axiks37GrqhP9Wm762VyNT6xLdms,79
|
|
83
|
+
src/runtime/branch_farm.py,sha256=qazVSPUh-cjfqLNPok7HKDqUZ9IRtqdYXIL_7l9E4Jg,13470
|
|
84
|
+
src/runtime/replay.py,sha256=81PNmOvER3xrPnxoeqKsNvVpZmc99ysfywo_dMFlMFs,13077
|
|
85
|
+
src/sandbox/__init__.py,sha256=wLZlh-D3ih3F53pYgC8av1epv70aqMPe-8LqHLLEeA8,179
|
|
86
|
+
src/sandbox/hermetic.py,sha256=bP2xMe8SAXoFLd0kbcBRpHtxxwMRTdciyqr5xjQVAVM,8432
|
|
87
|
+
src/sandbox/policy.py,sha256=Ate2rt-ELXIw9z2LEbE6CupibB5OE9ih3XpxfGEtF84,1467
|
|
88
|
+
src/sdk/__init__.py,sha256=zRUSuW2pLFOPybogVTWxRcPBnVBwZbdjgk39udCwiNo,146
|
|
89
|
+
src/sdk/plugin_base.py,sha256=5WqMK1xtr92i8hB7sjUUUJ8I80u8O0gBJn7IVRyOmUo,1029
|
|
90
|
+
src/sdk/plugin_host.py,sha256=RVfj1YtI9nBaqSXNavMXont1otCBkZkkeh1Nf6SmFGM,3428
|
|
91
|
+
src/sdk/plugin_loader.py,sha256=UDWZelnk6aBIMM_XxRc2HxCVzsYelDdejx36MsiuO18,3201
|
|
92
|
+
src/server/__init__.py,sha256=khJO5MAPPH8PXwRXLo7-HrG1G-bf9gvwebsV3rJDDP4,237
|
|
93
|
+
src/server/bridge.py,sha256=l8Y_p_RcCMycf37UIXx9dtG9YfcsUsVGfi3MURWB5e4,15934
|
|
94
|
+
src/server/bridge_cli.py,sha256=7zNirDRQSUg29JbtQpxB55wfB3LMiPm1xbpca3xKu-o,3136
|
|
95
|
+
src/server/bridge_client.py,sha256=F2G1g-LBcsFDMtsSETJtzZ12mdKxZ3KpYjKO41U0nI4,6393
|
|
96
|
+
src/server/protocol_version.py,sha256=f9_ancEV3SSt0x925Puz1aAoMVn5yIoSzRPbDZYV-74,3375
|
|
97
|
+
src/session/__init__.py,sha256=yFP5VBvDRp57VWCyjcYdu7LbxQ9RP68E-CgiYSuvoWw,372
|
|
98
|
+
src/session/event_fanout.py,sha256=lTYK7wnaJw-s3NpBnSXpy5Fqi4FbQWgE0UlTKOfXxZQ,1664
|
|
99
|
+
src/session/input_broker.py,sha256=O1dNcmIk6ipmgjU90gar-EG1AB8PoAYsM0CnczYkZAU,1335
|
|
100
|
+
src/session/permission_bridge.py,sha256=jl7WnnKqxHNrV6Dh4F5ky6LDRgCmtMpL0WHk6ka0tLo,3649
|
|
101
|
+
src/tools/__init__.py,sha256=vAS5X2HL7eogtIb0JwaVP3FutL9EAiLk1QcQiUDY1gw,5495
|
|
102
|
+
src/tools/_atomic.py,sha256=-JTyI9vGX79QrfLq6hXoGVn9PABLPXRzTsFa-wQK-Nw,2445
|
|
103
|
+
src/tools/agent_tools.py,sha256=OjO8LJQbe-SOD2pmTgdzQHsQQmEAL8pP9RKPLh9A7dw,16120
|
|
104
|
+
src/tools/ask_user_tool.py,sha256=dE1e8gQhunL-_bqlzy9bkY8lhbMxULjLSOws4JrDuhU,2939
|
|
105
|
+
src/tools/bash_tool.py,sha256=Y7fooiRuLiEz_6iVUJF9lGv12PpYPuumWacRu-jnQRo,14131
|
|
106
|
+
src/tools/browser_tool.py,sha256=7imtlUra7DbECeAQdaCVHK7_tSVTxR02llFGT3ap1b0,12879
|
|
107
|
+
src/tools/browser_tools.py,sha256=Kzd0OLg7SdBwmSHksVrImTv6QJLrr7fZkLn9tsyf_sw,7224
|
|
108
|
+
src/tools/dep_tools.py,sha256=FWXS15cspycGeAHlF8iwVUxxsHnOvHhmnKRGmHsEfq8,7783
|
|
109
|
+
src/tools/document_reader.py,sha256=Jyb20HXwRFGOLv8JWAVXujskch0fQSLfOXchH7LDk-Y,6308
|
|
110
|
+
src/tools/document_tool.py,sha256=DRWD03h2TJtPN_mtZhgCv_15GxhkI0CTypCoSh7DSXY,9243
|
|
111
|
+
src/tools/document_writer.py,sha256=XCr3eJ-27FBEwOr7cDlDAHAAEgT3ex7iMxrSmSvnm5g,7604
|
|
112
|
+
src/tools/impact_tools.py,sha256=DRbSkvUBdjox8l736DeyrX7OtfvnC4_Q5m_F1nBQK6U,9254
|
|
113
|
+
src/tools/playwright_tool.py,sha256=yie_fMZIAgNXcAGrDXpMaNiURCg9mIes4h2V0moI6Po,6274
|
|
114
|
+
src/tools/quality_tools.py,sha256=egD4qM2m5oQbCMX54GGjjzl7ZXAGT1t6qz_HYk9lVOA,12980
|
|
115
|
+
src/tools/read_tools.py,sha256=dKLOPn_oCwuxmA8rAx9fWBE2-AZCDMay67B9ai66CIM,12411
|
|
116
|
+
src/tools/result_cache.py,sha256=d7DBl7kkAq5FvJw8d1n9kyCcJZZXb1GnOFAr_ru-oFc,5130
|
|
117
|
+
src/tools/search_tools.py,sha256=iHnOakdnZDa6rVKNax0iDlptjoiodRVQBeaep87sTqk,10662
|
|
118
|
+
src/tools/shell_tools.py,sha256=_0mtZah07eYWkcJMrl4u5umue6uV9SjK2JSUmaxfJIA,11300
|
|
119
|
+
src/tools/write_tools.py,sha256=iIVrpzmmAgvh4JPFUw0BAeoPE5tnX3QV2ZrqVuhM3hI,12213
|
|
120
|
+
src/voice/__init__.py,sha256=UMyce3O2NoC0nsCzVvxbH8PtCWuZ0_zHXiFaqwD9ciU,764
|
|
121
|
+
src/voice/audio_capture.py,sha256=ZZnorwu9fe18dZ9ECDppSOfyq2HkFM8LKYEps0jIL_k,3206
|
|
122
|
+
src/voice/audio_playback.py,sha256=3QI2iYxDiR3LewQ4OyJgZ8y6hCL8LwBS4ivhjsRmh1U,2206
|
|
123
|
+
src/voice/errors.py,sha256=_zf03xIlh_SZy6-1v86SxOZmhYBCvr33DBvC7DWNmLk,290
|
|
124
|
+
src/voice/models.py,sha256=9UES4u6ZPabojuINmSZbENwI5aUDWbJPQ-ZRp5YGuF4,1113
|
|
125
|
+
src/voice/providers.py,sha256=3Rl-tpIG9JfM8Oj2i9LEsZw91J5xNKpFxpA8Aaxo_5k,4183
|
|
126
|
+
src/voice/vad.py,sha256=k7I4SRZVyW_AF-DZmDwcKwhiUDSa6QQotpvU5CyW1J8,1662
|
|
127
|
+
src/voice/voice_loop.py,sha256=V_uHh7nHSMrJCDArqf1V7flaHLkB3XIXQVKZ09BOFBc,5330
|
|
128
|
+
gdmcode-0.1.0.dist-info/METADATA,sha256=Nd-_KY3Lj8fVmA-crf2-aW3tx9JkkmRbZ1Z60q0DZwM,8862
|
|
129
|
+
gdmcode-0.1.0.dist-info/WHEEL,sha256=QccIxa26bgl1E6uMy58deGWi-0aeIkkangHcxk2kWfw,87
|
|
130
|
+
gdmcode-0.1.0.dist-info/entry_points.txt,sha256=KZh6NHdsE2APMgg8FjO-HkfiXO2G9auMB3-8s53uoaU,38
|
|
131
|
+
gdmcode-0.1.0.dist-info/RECORD,,
|
src/__init__.py
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "0.1.0"
|
|
File without changes
|
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
"""Internal constants — not user-facing, not exported, prefixed with _."""
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
|
|
4
|
+
__all__: list[str] = [] # nothing exported from this module intentionally
|
|
5
|
+
|
|
6
|
+
# ---------------------------------------------------------------------------
|
|
7
|
+
# Spinner verbs — shown while the agent is thinking/working
|
|
8
|
+
#
|
|
9
|
+
# _PRIORITY_VERBS: shown at least once per calendar day (weighted 15× heavier).
|
|
10
|
+
# Private to this module — NOT exposed in user-editable configs.
|
|
11
|
+
#
|
|
12
|
+
# _ALL_SPINNER_VERBS: the full randomised pool. Order is irrelevant — the REPL
|
|
13
|
+
# picks at random (with weighting). Do NOT put these in any
|
|
14
|
+
# user-facing file or config — they live here intentionally.
|
|
15
|
+
# ---------------------------------------------------------------------------
|
|
16
|
+
|
|
17
|
+
_PRIORITY_VERBS: tuple[str, ...] = ("Gedeoning", "Gdming")
|
|
18
|
+
|
|
19
|
+
_ALL_SPINNER_VERBS: tuple[str, ...] = (
|
|
20
|
+
# ── Thinking / ideation ──────────────────────────────────────────────
|
|
21
|
+
"Cogitating",
|
|
22
|
+
"Pondering",
|
|
23
|
+
"Contemplating",
|
|
24
|
+
"Deliberating",
|
|
25
|
+
"Musing",
|
|
26
|
+
"Ruminating",
|
|
27
|
+
"Mulling",
|
|
28
|
+
"Reflecting",
|
|
29
|
+
"Meditating",
|
|
30
|
+
"Noodling",
|
|
31
|
+
"Percolating",
|
|
32
|
+
"Simmering",
|
|
33
|
+
"Brainstorming",
|
|
34
|
+
"Strategizing",
|
|
35
|
+
"Theorising",
|
|
36
|
+
"Hypothesising",
|
|
37
|
+
"Reckoning",
|
|
38
|
+
"Calculating",
|
|
39
|
+
"Extrapolating",
|
|
40
|
+
"Interpolating",
|
|
41
|
+
"Connecting dots",
|
|
42
|
+
"Cross-referencing",
|
|
43
|
+
"Synthesising",
|
|
44
|
+
"Distilling",
|
|
45
|
+
"Crystallising",
|
|
46
|
+
"Ideating",
|
|
47
|
+
"Incubating",
|
|
48
|
+
"Marinating",
|
|
49
|
+
"Fermenting",
|
|
50
|
+
"Steeping",
|
|
51
|
+
# ── Brewing / cooking metaphors ──────────────────────────────────────
|
|
52
|
+
"Brewing",
|
|
53
|
+
"Cooking up",
|
|
54
|
+
"Baking",
|
|
55
|
+
"Mixing",
|
|
56
|
+
"Blending",
|
|
57
|
+
"Whipping up",
|
|
58
|
+
"Sautéing logic",
|
|
59
|
+
"Slow-cooking",
|
|
60
|
+
"Seasoning",
|
|
61
|
+
"Stirring the pot",
|
|
62
|
+
# ── Action / work ────────────────────────────────────────────────────
|
|
63
|
+
"Crafting",
|
|
64
|
+
"Forging",
|
|
65
|
+
"Assembling",
|
|
66
|
+
"Constructing",
|
|
67
|
+
"Engineering",
|
|
68
|
+
"Architecting",
|
|
69
|
+
"Sculpting",
|
|
70
|
+
"Weaving",
|
|
71
|
+
"Knitting",
|
|
72
|
+
"Stitching",
|
|
73
|
+
"Soldering",
|
|
74
|
+
"Wiring",
|
|
75
|
+
"Debugging",
|
|
76
|
+
"Tracing",
|
|
77
|
+
"Triangulating",
|
|
78
|
+
"Navigating",
|
|
79
|
+
"Charting a course",
|
|
80
|
+
"Plotting",
|
|
81
|
+
"Sketching",
|
|
82
|
+
"Drafting",
|
|
83
|
+
"Blueprinting",
|
|
84
|
+
"Prototyping",
|
|
85
|
+
"Iterating",
|
|
86
|
+
"Refining",
|
|
87
|
+
"Polishing",
|
|
88
|
+
"Sharpening",
|
|
89
|
+
"Honing",
|
|
90
|
+
"Fine-tuning",
|
|
91
|
+
"Calibrating",
|
|
92
|
+
"Optimising",
|
|
93
|
+
"Pruning",
|
|
94
|
+
"Compressing",
|
|
95
|
+
"Expanding",
|
|
96
|
+
"Unpacking",
|
|
97
|
+
"Unravelling",
|
|
98
|
+
"Untangling",
|
|
99
|
+
"Disentangling",
|
|
100
|
+
"Piecing together",
|
|
101
|
+
"Reverse engineering",
|
|
102
|
+
"Decomposing",
|
|
103
|
+
"Composing",
|
|
104
|
+
# ── Discovery / exploration ──────────────────────────────────────────
|
|
105
|
+
"Exploring",
|
|
106
|
+
"Excavating",
|
|
107
|
+
"Mining",
|
|
108
|
+
"Spelunking",
|
|
109
|
+
"Surfacing",
|
|
110
|
+
"Unearthing",
|
|
111
|
+
"Discovering",
|
|
112
|
+
"Mapping",
|
|
113
|
+
"Surveying",
|
|
114
|
+
"Scanning",
|
|
115
|
+
"Inspecting",
|
|
116
|
+
"Auditing",
|
|
117
|
+
"Scouting",
|
|
118
|
+
"Reconnoitring",
|
|
119
|
+
"Investigating",
|
|
120
|
+
"Analysing",
|
|
121
|
+
"Examining",
|
|
122
|
+
"Dissecting",
|
|
123
|
+
"Probing",
|
|
124
|
+
"Diving deep",
|
|
125
|
+
"Going further",
|
|
126
|
+
"Following the thread",
|
|
127
|
+
"Chasing the rabbit",
|
|
128
|
+
"Down the rabbit hole",
|
|
129
|
+
"Zooming in",
|
|
130
|
+
"Zooming out",
|
|
131
|
+
"Triangulating",
|
|
132
|
+
"Cross-checking",
|
|
133
|
+
"Fact-checking",
|
|
134
|
+
# ── Clever / witty ───────────────────────────────────────────────────
|
|
135
|
+
"Summoning neurons",
|
|
136
|
+
"Consulting the oracle",
|
|
137
|
+
"Reading the tea leaves",
|
|
138
|
+
"Staring into the void",
|
|
139
|
+
"Feeding the hamsters",
|
|
140
|
+
"Spinning up the flux capacitor",
|
|
141
|
+
"Aligning the planets",
|
|
142
|
+
"Charging the lasers",
|
|
143
|
+
"Overclocking imagination",
|
|
144
|
+
"Defragging thoughts",
|
|
145
|
+
"Garbage collecting",
|
|
146
|
+
"Reticulating splines",
|
|
147
|
+
"Sharpening the pencil",
|
|
148
|
+
"Warming up the engines",
|
|
149
|
+
"Lighting the fuse",
|
|
150
|
+
"Dropping into the matrix",
|
|
151
|
+
"Running the simulation",
|
|
152
|
+
"Consulting the rubber duck",
|
|
153
|
+
"Talking to myself",
|
|
154
|
+
"Arguing with myself",
|
|
155
|
+
"Winning the argument",
|
|
156
|
+
"Losing the argument productively",
|
|
157
|
+
"Having a eureka moment",
|
|
158
|
+
"Pretending to be confident",
|
|
159
|
+
"Manifesting solutions",
|
|
160
|
+
"Channelling 10x devs",
|
|
161
|
+
"Touching grass (digitally)",
|
|
162
|
+
"Checking Stack Overflow (in my mind)",
|
|
163
|
+
"Reinventing the wheel (briefly)",
|
|
164
|
+
"Actually reading the docs",
|
|
165
|
+
"Skimming the docs",
|
|
166
|
+
"Writing better docs than the docs",
|
|
167
|
+
"Not reading the docs but it works",
|
|
168
|
+
"Googling furiously",
|
|
169
|
+
"Asking the universe",
|
|
170
|
+
"Vibing",
|
|
171
|
+
"Grooving",
|
|
172
|
+
"In the zone",
|
|
173
|
+
"Locked in",
|
|
174
|
+
"Cooking rn",
|
|
175
|
+
"Built different",
|
|
176
|
+
"Sending it",
|
|
177
|
+
"No cap, solving this",
|
|
178
|
+
"Based problem-solving",
|
|
179
|
+
# ── Priority verbs — duplicated here so they appear in normal rotation too
|
|
180
|
+
# (the DB-weighted daily-guarantee logic is separate in db.py)
|
|
181
|
+
"Gedeoning",
|
|
182
|
+
"Gdming",
|
|
183
|
+
)
|
|
184
|
+
|
|
185
|
+
# ---------------------------------------------------------------------------
|
|
186
|
+
# Security
|
|
187
|
+
# ---------------------------------------------------------------------------
|
|
188
|
+
_UNTRUSTED_TAG_PREFIX = "[UNTRUSTED: "
|
|
189
|
+
_UNTRUSTED_TAG_SUFFIX = "]"
|
|
190
|
+
_USER_INSTRUCTIONS_TAG = "[USER INSTRUCTIONS]"
|
|
191
|
+
|
|
192
|
+
# Patterns that indicate prompt injection attempts in file content.
|
|
193
|
+
# Checked before injecting any file content into a prompt.
|
|
194
|
+
_INJECTION_PATTERNS: tuple[str, ...] = (
|
|
195
|
+
"ignore previous instructions",
|
|
196
|
+
"ignore all previous",
|
|
197
|
+
"disregard your",
|
|
198
|
+
"forget your instructions",
|
|
199
|
+
"you are now",
|
|
200
|
+
"act as if",
|
|
201
|
+
"new instructions:",
|
|
202
|
+
"system prompt:",
|
|
203
|
+
"assistant:",
|
|
204
|
+
"### instruction",
|
|
205
|
+
"<|system|>",
|
|
206
|
+
"<|user|>",
|
|
207
|
+
"<|assistant|>",
|
|
208
|
+
)
|
|
209
|
+
|
|
210
|
+
# ---------------------------------------------------------------------------
|
|
211
|
+
# Agent loop
|
|
212
|
+
# ---------------------------------------------------------------------------
|
|
213
|
+
_MAX_AGENT_TURNS: int = 50
|
|
214
|
+
_DEFAULT_COST_LIMIT_USD: float = 5.0
|
|
215
|
+
_COMPRESSION_TRIGGER_RATIO: float = 0.80 # compress at 80% of context window
|
|
216
|
+
_MAX_DEBUG_CYCLES: int = 5
|
|
217
|
+
_ENSEMBLE_PATCH_COST_CAP_USD: float = 0.30
|
|
218
|
+
|
|
219
|
+
# ---------------------------------------------------------------------------
|
|
220
|
+
# Database
|
|
221
|
+
# ---------------------------------------------------------------------------
|
|
222
|
+
_DB_FILENAME = "gdm.db"
|
|
223
|
+
_CONTEXT_MEMORY_DIR = ".context-memory"
|
|
224
|
+
_SCHEMA_VERSION: int = 11
|
|
225
|
+
|
|
226
|
+
# ---------------------------------------------------------------------------
|
|
227
|
+
# Permissions
|
|
228
|
+
# ---------------------------------------------------------------------------
|
|
229
|
+
# ---------------------------------------------------------------------------
|
|
230
|
+
# Canonical write-tool names — tools that modify files on disk.
|
|
231
|
+
# Both loop.py and tool_orchestrator.py must use this set; never hardcode locally.
|
|
232
|
+
# ---------------------------------------------------------------------------
|
|
233
|
+
_WRITE_TOOLS: frozenset[str] = frozenset({"write_file", "edit_file", "create_file", "apply_patch"})
|
|
234
|
+
|
|
235
|
+
# ---------------------------------------------------------------------------
|
|
236
|
+
# These tool names can NEVER be approved — not by user, not by session flag.
|
|
237
|
+
_ALWAYS_DENY_TOOLS: frozenset[str] = frozenset({
|
|
238
|
+
"reboot",
|
|
239
|
+
"shutdown",
|
|
240
|
+
"format_disk",
|
|
241
|
+
"drop_database",
|
|
242
|
+
"delete_all",
|
|
243
|
+
"wipe",
|
|
244
|
+
})
|