Leon4gr45 commited on
Commit
9719e8c
·
verified ·
1 Parent(s): 91ff7bb

Cleanse repository and redeploy Agent-Zero with HF adaptations

Browse files
This view is limited to 50 files because it contains too many changes.   See raw diff
.agent/workflows/update_clawdbot.md DELETED
@@ -1,366 +0,0 @@
1
- ---
2
- description: Update Clawdbot from upstream when branch has diverged (ahead/behind)
3
- ---
4
-
5
- # Clawdbot Upstream Sync Workflow
6
-
7
- Use this workflow when your fork has diverged from upstream (e.g., "18 commits ahead, 29 commits behind").
8
-
9
- ## Quick Reference
10
-
11
- ```bash
12
- # Check divergence status
13
- git fetch upstream && git rev-list --left-right --count main...upstream/main
14
-
15
- # Full sync (rebase preferred)
16
- git fetch upstream && git rebase upstream/main && pnpm install && pnpm build && ./scripts/restart-mac.sh
17
-
18
- # Check for Swift 6.2 issues after sync
19
- grep -r "FileManager\.default\|Thread\.isMainThread" src/ apps/ --include="*.swift"
20
- ```
21
-
22
- ---
23
-
24
- ## Step 1: Assess Divergence
25
-
26
- ```bash
27
- git fetch upstream
28
- git log --oneline --left-right main...upstream/main | head -20
29
- ```
30
-
31
- This shows:
32
- - `<` = your local commits (ahead)
33
- - `>` = upstream commits you're missing (behind)
34
-
35
- **Decision point:**
36
- - Few local commits, many upstream → **Rebase** (cleaner history)
37
- - Many local commits or shared branch → **Merge** (preserves history)
38
-
39
- ---
40
-
41
- ## Step 2A: Rebase Strategy (Preferred)
42
-
43
- Replays your commits on top of upstream. Results in linear history.
44
-
45
- ```bash
46
- # Ensure working tree is clean
47
- git status
48
-
49
- # Rebase onto upstream
50
- git rebase upstream/main
51
- ```
52
-
53
- ### Handling Rebase Conflicts
54
-
55
- ```bash
56
- # When conflicts occur:
57
- # 1. Fix conflicts in the listed files
58
- # 2. Stage resolved files
59
- git add <resolved-files>
60
-
61
- # 3. Continue rebase
62
- git rebase --continue
63
-
64
- # If a commit is no longer needed (already in upstream):
65
- git rebase --skip
66
-
67
- # To abort and return to original state:
68
- git rebase --abort
69
- ```
70
-
71
- ### Common Conflict Patterns
72
-
73
- | File | Resolution |
74
- |------|------------|
75
- | `package.json` | Take upstream deps, keep local scripts if needed |
76
- | `pnpm-lock.yaml` | Accept upstream, regenerate with `pnpm install` |
77
- | `*.patch` files | Usually take upstream version |
78
- | Source files | Merge logic carefully, prefer upstream structure |
79
-
80
- ---
81
-
82
- ## Step 2B: Merge Strategy (Alternative)
83
-
84
- Preserves all history with a merge commit.
85
-
86
- ```bash
87
- git merge upstream/main --no-edit
88
- ```
89
-
90
- Resolve conflicts same as rebase, then:
91
- ```bash
92
- git add <resolved-files>
93
- git commit
94
- ```
95
-
96
- ---
97
-
98
- ## Step 3: Rebuild Everything
99
-
100
- After sync completes:
101
-
102
- ```bash
103
- # Install dependencies (regenerates lock if needed)
104
- pnpm install
105
-
106
- # Build TypeScript
107
- pnpm build
108
-
109
- # Build UI assets
110
- pnpm ui:build
111
-
112
- # Run diagnostics
113
- pnpm clawdbot doctor
114
- ```
115
-
116
- ---
117
-
118
- ## Step 4: Rebuild macOS App
119
-
120
- ```bash
121
- # Full rebuild, sign, and launch
122
- ./scripts/restart-mac.sh
123
-
124
- # Or just package without restart
125
- pnpm mac:package
126
- ```
127
-
128
- ### Install to /Applications
129
-
130
- ```bash
131
- # Kill running app
132
- pkill -x "Clawdbot" || true
133
-
134
- # Move old version
135
- mv /Applications/Clawdbot.app /tmp/Clawdbot-backup.app
136
-
137
- # Install new build
138
- cp -R dist/Clawdbot.app /Applications/
139
-
140
- # Launch
141
- open /Applications/Clawdbot.app
142
- ```
143
-
144
- ---
145
-
146
- ## Step 4A: Verify macOS App & Agent
147
-
148
- After rebuilding the macOS app, always verify it works correctly:
149
-
150
- ```bash
151
- # Check gateway health
152
- pnpm clawdbot health
153
-
154
- # Verify no zombie processes
155
- ps aux | grep -E "(clawdbot|gateway)" | grep -v grep
156
-
157
- # Test agent functionality by sending a verification message
158
- pnpm clawdbot agent --message "Verification: macOS app rebuild successful - agent is responding." --session-id YOUR_TELEGRAM_SESSION_ID
159
-
160
- # Confirm the message was received on Telegram
161
- # (Check your Telegram chat with the bot)
162
- ```
163
-
164
- **Important:** Always wait for the Telegram verification message before proceeding. If the agent doesn't respond, troubleshoot the gateway or model configuration before pushing.
165
-
166
- ---
167
-
168
- ## Step 5: Handle Swift/macOS Build Issues (Common After Upstream Sync)
169
-
170
- Upstream updates may introduce Swift 6.2 / macOS 26 SDK incompatibilities. Use analyze-mode for systematic debugging:
171
-
172
- ### Analyze-Mode Investigation
173
- ```bash
174
- # Gather context with parallel agents
175
- morph-mcp_warpgrep_codebase_search search_string="Find deprecated FileManager.default and Thread.isMainThread usages in Swift files" repo_path="/Volumes/Main SSD/Developer/clawdis"
176
- morph-mcp_warpgrep_codebase_search search_string="Locate Peekaboo submodule and macOS app Swift files with concurrency issues" repo_path="/Volumes/Main SSD/Developer/clawdis"
177
- ```
178
-
179
- ### Common Swift 6.2 Fixes
180
-
181
- **FileManager.default Deprecation:**
182
- ```bash
183
- # Search for deprecated usage
184
- grep -r "FileManager\.default" src/ apps/ --include="*.swift"
185
-
186
- # Replace with proper initialization
187
- # OLD: FileManager.default
188
- # NEW: FileManager()
189
- ```
190
-
191
- **Thread.isMainThread Deprecation:**
192
- ```bash
193
- # Search for deprecated usage
194
- grep -r "Thread\.isMainThread" src/ apps/ --include="*.swift"
195
-
196
- # Replace with modern concurrency check
197
- # OLD: Thread.isMainThread
198
- # NEW: await MainActor.run { ... } or DispatchQueue.main.sync { ... }
199
- ```
200
-
201
- ### Peekaboo Submodule Fixes
202
- ```bash
203
- # Check Peekaboo for concurrency issues
204
- cd src/canvas-host/a2ui
205
- grep -r "Thread\.isMainThread\|FileManager\.default" . --include="*.swift"
206
-
207
- # Fix and rebuild submodule
208
- cd /Volumes/Main SSD/Developer/clawdis
209
- pnpm canvas:a2ui:bundle
210
- ```
211
-
212
- ### macOS App Concurrency Fixes
213
- ```bash
214
- # Check macOS app for issues
215
- grep -r "Thread\.isMainThread\|FileManager\.default" apps/macos/ --include="*.swift"
216
-
217
- # Clean and rebuild after fixes
218
- cd apps/macos && rm -rf .build .swiftpm
219
- ./scripts/restart-mac.sh
220
- ```
221
-
222
- ### Model Configuration Updates
223
- If upstream introduced new model configurations:
224
- ```bash
225
- # Check for OpenRouter API key requirements
226
- grep -r "openrouter\|OPENROUTER" src/ --include="*.ts" --include="*.js"
227
-
228
- # Update clawdbot.json with fallback chains
229
- # Add model fallback configurations as needed
230
- ```
231
-
232
- ---
233
-
234
- ## Step 6: Verify & Push
235
-
236
- ```bash
237
- # Verify everything works
238
- pnpm clawdbot health
239
- pnpm test
240
-
241
- # Push (force required after rebase)
242
- git push origin main --force-with-lease
243
-
244
- # Or regular push after merge
245
- git push origin main
246
- ```
247
-
248
- ---
249
-
250
- ## Troubleshooting
251
-
252
- ### Build Fails After Sync
253
-
254
- ```bash
255
- # Clean and rebuild
256
- rm -rf node_modules dist
257
- pnpm install
258
- pnpm build
259
- ```
260
-
261
- ### Type Errors (Bun/Node Incompatibility)
262
-
263
- Common issue: `fetch.preconnect` type mismatch. Fix by using `FetchLike` type instead of `typeof fetch`.
264
-
265
- ### macOS App Crashes on Launch
266
-
267
- Usually resource bundle mismatch. Full rebuild required:
268
- ```bash
269
- cd apps/macos && rm -rf .build .swiftpm
270
- ./scripts/restart-mac.sh
271
- ```
272
-
273
- ### Patch Failures
274
-
275
- ```bash
276
- # Check patch status
277
- pnpm install 2>&1 | grep -i patch
278
-
279
- # If patches fail, they may need updating for new dep versions
280
- # Check patches/ directory against package.json patchedDependencies
281
- ```
282
-
283
- ### Swift 6.2 / macOS 26 SDK Build Failures
284
-
285
- **Symptoms:** Build fails with deprecation warnings about `FileManager.default` or `Thread.isMainThread`
286
-
287
- **Search-Mode Investigation:**
288
- ```bash
289
- # Exhaustive search for deprecated APIs
290
- morph-mcp_warpgrep_codebase_search search_string="Find all Swift files using deprecated FileManager.default or Thread.isMainThread" repo_path="/Volumes/Main SSD/Developer/clawdis"
291
- ```
292
-
293
- **Quick Fix Commands:**
294
- ```bash
295
- # Find all affected files
296
- find . -name "*.swift" -exec grep -l "FileManager\.default\|Thread\.isMainThread" {} \;
297
-
298
- # Replace FileManager.default with FileManager()
299
- find . -name "*.swift" -exec sed -i '' 's/FileManager\.default/FileManager()/g' {} \;
300
-
301
- # For Thread.isMainThread, need manual review of each usage
302
- grep -rn "Thread\.isMainThread" --include="*.swift" .
303
- ```
304
-
305
- **Rebuild After Fixes:**
306
- ```bash
307
- # Clean all build artifacts
308
- rm -rf apps/macos/.build apps/macos/.swiftpm
309
- rm -rf src/canvas-host/a2ui/.build
310
-
311
- # Rebuild Peekaboo bundle
312
- pnpm canvas:a2ui:bundle
313
-
314
- # Full macOS rebuild
315
- ./scripts/restart-mac.sh
316
- ```
317
-
318
- ---
319
-
320
- ## Automation Script
321
-
322
- Save as `scripts/sync-upstream.sh`:
323
-
324
- ```bash
325
- #!/usr/bin/env bash
326
- set -euo pipefail
327
-
328
- echo "==> Fetching upstream..."
329
- git fetch upstream
330
-
331
- echo "==> Current divergence:"
332
- git rev-list --left-right --count main...upstream/main
333
-
334
- echo "==> Rebasing onto upstream/main..."
335
- git rebase upstream/main
336
-
337
- echo "==> Installing dependencies..."
338
- pnpm install
339
-
340
- echo "==> Building..."
341
- pnpm build
342
- pnpm ui:build
343
-
344
- echo "==> Running doctor..."
345
- pnpm clawdbot doctor
346
-
347
- echo "==> Rebuilding macOS app..."
348
- ./scripts/restart-mac.sh
349
-
350
- echo "==> Verifying gateway health..."
351
- pnpm clawdbot health
352
-
353
- echo "==> Checking for Swift 6.2 compatibility issues..."
354
- if grep -r "FileManager\.default\|Thread\.isMainThread" src/ apps/ --include="*.swift" --quiet; then
355
- echo "⚠️ Found potential Swift 6.2 deprecated API usage"
356
- echo " Run manual fixes or use analyze-mode investigation"
357
- else
358
- echo "✅ No obvious Swift deprecation issues found"
359
- fi
360
-
361
- echo "==> Testing agent functionality..."
362
- # Note: Update YOUR_TELEGRAM_SESSION_ID with actual session ID
363
- pnpm clawdbot agent --message "Verification: Upstream sync and macOS rebuild completed successfully." --session-id YOUR_TELEGRAM_SESSION_ID || echo "Warning: Agent test failed - check Telegram for verification message"
364
-
365
- echo "==> Done! Check Telegram for verification message, then run 'git push --force-with-lease' when ready."
366
- ```
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
.cursor/mcp.json DELETED
@@ -1,8 +0,0 @@
1
- {
2
- "mcpServers": {
3
- "dev3000": {
4
- "type": "http",
5
- "url": "http://localhost:3684/mcp"
6
- }
7
- }
8
- }
 
 
 
 
 
 
 
 
 
.detect-secrets.cfg DELETED
@@ -1,30 +0,0 @@
1
- # detect-secrets exclusion patterns (regex)
2
- #
3
- # Note: detect-secrets does not read this file by default. If you want these
4
- # applied, wire them into your scan command (e.g. translate to --exclude-files
5
- # / --exclude-lines) or into a baseline's filters_used.
6
-
7
- [exclude-files]
8
- # pnpm lockfiles contain lots of high-entropy package integrity blobs.
9
- pattern = (^|/)pnpm-lock\.yaml$
10
- # Generated output and vendored assets.
11
- pattern = (^|/)(dist|vendor)/
12
- # Local config file with allowlist patterns.
13
- pattern = (^|/)\.detect-secrets\.cfg$
14
-
15
- [exclude-lines]
16
- # Fastlane checks for private key marker; not a real key.
17
- pattern = key_content\.include\?\("BEGIN PRIVATE KEY"\)
18
- # UI label string for Anthropic auth mode.
19
- pattern = case \.apiKeyEnv: "API key \(env var\)"
20
- # CodingKeys mapping uses apiKey literal.
21
- pattern = case apikey = "apiKey"
22
- # Schema labels referencing password fields (not actual secrets).
23
- pattern = "gateway\.remote\.password"
24
- pattern = "gateway\.auth\.password"
25
- # Schema label for talk API key (label text only).
26
- pattern = "talk\.apiKey"
27
- # checking for typeof is not something we care about.
28
- pattern = === "string"
29
- # specific optional-chaining password check that didn't match the line above.
30
- pattern = typeof remote\?\.password === "string"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
.dockerignore DELETED
@@ -1,48 +0,0 @@
1
- .git
2
- .worktrees
3
- .bun-cache
4
- .bun
5
- .tmp
6
- **/.tmp
7
- .DS_Store
8
- **/.DS_Store
9
- *.png
10
- *.jpg
11
- *.jpeg
12
- *.webp
13
- *.gif
14
- *.mp4
15
- *.mov
16
- *.wav
17
- *.mp3
18
- node_modules
19
- **/node_modules
20
- .pnpm-store
21
- **/.pnpm-store
22
- .turbo
23
- **/.turbo
24
- .cache
25
- **/.cache
26
- .next
27
- **/.next
28
- coverage
29
- **/coverage
30
- *.log
31
- tmp
32
- **/tmp
33
-
34
- # build artifacts
35
- dist
36
- **/dist
37
- apps/macos/.build
38
- apps/ios/build
39
- **/*.trace
40
-
41
- # large app trees not needed for CLI build
42
- apps/
43
- assets/
44
- Peekaboo/
45
- Swabble/
46
- Core/
47
- Users/
48
- vendor/
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
.env.example DELETED
@@ -1,5 +0,0 @@
1
- # Copy to .env and fill with your Twilio credentials
2
- TWILIO_ACCOUNT_SID=ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
3
- TWILIO_AUTH_TOKEN=your_auth_token_here
4
- # Must be a WhatsApp-enabled Twilio number, prefixed with whatsapp:
5
- TWILIO_WHATSAPP_FROM=whatsapp:+17343367101
 
 
 
 
 
 
.github/FUNDING.yml DELETED
@@ -1 +0,0 @@
1
- custom: ['https://github.com/sponsors/steipete']
 
 
.github/ISSUE_TEMPLATE/bug_report.md DELETED
@@ -1,28 +0,0 @@
1
- ---
2
- name: Bug report
3
- about: Report a problem or unexpected behavior in Clawdbot.
4
- title: "[Bug]: "
5
- labels: bug
6
- ---
7
-
8
- ## Summary
9
- What went wrong?
10
-
11
- ## Steps to reproduce
12
- 1.
13
- 2.
14
- 3.
15
-
16
- ## Expected behavior
17
- What did you expect to happen?
18
-
19
- ## Actual behavior
20
- What actually happened?
21
-
22
- ## Environment
23
- - Clawdbot version:
24
- - OS:
25
- - Install method (pnpm/npx/docker/etc):
26
-
27
- ## Logs or screenshots
28
- Paste relevant logs or add screenshots (redact secrets).
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
.github/ISSUE_TEMPLATE/config.yml DELETED
@@ -1,8 +0,0 @@
1
- blank_issues_enabled: true
2
- contact_links:
3
- - name: Onboarding
4
- url: https://discord.gg/clawd
5
- about: New to Clawdbot? Join Discord for setup guidance from Krill in #help.
6
- - name: Support
7
- url: https://discord.gg/clawd
8
- about: Get help from Krill and the community on Discord in #help.
 
 
 
 
 
 
 
 
 
.github/ISSUE_TEMPLATE/feature_request.md DELETED
@@ -1,18 +0,0 @@
1
- ---
2
- name: Feature request
3
- about: Suggest an idea or improvement for Clawdbot.
4
- title: "[Feature]: "
5
- labels: enhancement
6
- ---
7
-
8
- ## Summary
9
- Describe the problem you are trying to solve or the opportunity you see.
10
-
11
- ## Proposed solution
12
- What would you like Clawdbot to do?
13
-
14
- ## Alternatives considered
15
- Any other approaches you have considered?
16
-
17
- ## Additional context
18
- Links, screenshots, or related issues.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
.github/actionlint.yaml DELETED
@@ -1,17 +0,0 @@
1
- # actionlint configuration
2
- # https://github.com/rhysd/actionlint/blob/main/docs/config.md
3
-
4
- self-hosted-runner:
5
- labels:
6
- # Blacksmith CI runners
7
- - blacksmith-4vcpu-ubuntu-2404
8
- - blacksmith-4vcpu-windows-2025
9
-
10
- # Ignore patterns for known issues
11
- paths:
12
- .github/workflows/**/*.yml:
13
- ignore:
14
- # Ignore shellcheck warnings (we run shellcheck separately)
15
- - 'shellcheck reported issue.+'
16
- # Ignore intentional if: false for disabled jobs
17
- - 'constant expression "false" in condition'
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
.github/dependabot.yml DELETED
@@ -1,113 +0,0 @@
1
- # Dependabot configuration
2
- # https://docs.github.com/en/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file
3
-
4
- version: 2
5
-
6
- registries:
7
- npm-npmjs:
8
- type: npm-registry
9
- url: https://registry.npmjs.org
10
- replaces-base: true
11
-
12
- updates:
13
- # npm dependencies (root)
14
- - package-ecosystem: npm
15
- directory: /
16
- schedule:
17
- interval: weekly
18
- cooldown:
19
- default-days: 7
20
- groups:
21
- production:
22
- dependency-type: production
23
- update-types:
24
- - minor
25
- - patch
26
- development:
27
- dependency-type: development
28
- update-types:
29
- - minor
30
- - patch
31
- open-pull-requests-limit: 10
32
- registries:
33
- - npm-npmjs
34
-
35
- # GitHub Actions
36
- - package-ecosystem: github-actions
37
- directory: /
38
- schedule:
39
- interval: weekly
40
- cooldown:
41
- default-days: 7
42
- groups:
43
- actions:
44
- patterns:
45
- - "*"
46
- update-types:
47
- - minor
48
- - patch
49
- open-pull-requests-limit: 5
50
-
51
- # Swift Package Manager - macOS app
52
- - package-ecosystem: swift
53
- directory: /apps/macos
54
- schedule:
55
- interval: weekly
56
- cooldown:
57
- default-days: 7
58
- groups:
59
- swift-deps:
60
- patterns:
61
- - "*"
62
- update-types:
63
- - minor
64
- - patch
65
- open-pull-requests-limit: 5
66
-
67
- # Swift Package Manager - shared MoltbotKit
68
- - package-ecosystem: swift
69
- directory: /apps/shared/MoltbotKit
70
- schedule:
71
- interval: weekly
72
- cooldown:
73
- default-days: 7
74
- groups:
75
- swift-deps:
76
- patterns:
77
- - "*"
78
- update-types:
79
- - minor
80
- - patch
81
- open-pull-requests-limit: 5
82
-
83
- # Swift Package Manager - Swabble
84
- - package-ecosystem: swift
85
- directory: /Swabble
86
- schedule:
87
- interval: weekly
88
- cooldown:
89
- default-days: 7
90
- groups:
91
- swift-deps:
92
- patterns:
93
- - "*"
94
- update-types:
95
- - minor
96
- - patch
97
- open-pull-requests-limit: 5
98
-
99
- # Gradle - Android app
100
- - package-ecosystem: gradle
101
- directory: /apps/android
102
- schedule:
103
- interval: weekly
104
- cooldown:
105
- default-days: 7
106
- groups:
107
- android-deps:
108
- patterns:
109
- - "*"
110
- update-types:
111
- - minor
112
- - patch
113
- open-pull-requests-limit: 5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
.github/labeler.yml DELETED
@@ -1,222 +0,0 @@
1
- "channel: bluebubbles":
2
- - changed-files:
3
- - any-glob-to-any-file:
4
- - "extensions/bluebubbles/**"
5
- - "docs/channels/bluebubbles.md"
6
- "channel: discord":
7
- - changed-files:
8
- - any-glob-to-any-file:
9
- - "src/discord/**"
10
- - "extensions/discord/**"
11
- - "docs/channels/discord.md"
12
- "channel: googlechat":
13
- - changed-files:
14
- - any-glob-to-any-file:
15
- - "extensions/googlechat/**"
16
- - "docs/channels/googlechat.md"
17
- "channel: imessage":
18
- - changed-files:
19
- - any-glob-to-any-file:
20
- - "src/imessage/**"
21
- - "extensions/imessage/**"
22
- - "docs/channels/imessage.md"
23
- "channel: line":
24
- - changed-files:
25
- - any-glob-to-any-file:
26
- - "extensions/line/**"
27
- - "docs/channels/line.md"
28
- "channel: matrix":
29
- - changed-files:
30
- - any-glob-to-any-file:
31
- - "extensions/matrix/**"
32
- - "docs/channels/matrix.md"
33
- "channel: mattermost":
34
- - changed-files:
35
- - any-glob-to-any-file:
36
- - "extensions/mattermost/**"
37
- - "docs/channels/mattermost.md"
38
- "channel: msteams":
39
- - changed-files:
40
- - any-glob-to-any-file:
41
- - "extensions/msteams/**"
42
- - "docs/channels/msteams.md"
43
- "channel: nextcloud-talk":
44
- - changed-files:
45
- - any-glob-to-any-file:
46
- - "extensions/nextcloud-talk/**"
47
- - "docs/channels/nextcloud-talk.md"
48
- "channel: nostr":
49
- - changed-files:
50
- - any-glob-to-any-file:
51
- - "extensions/nostr/**"
52
- - "docs/channels/nostr.md"
53
- "channel: signal":
54
- - changed-files:
55
- - any-glob-to-any-file:
56
- - "src/signal/**"
57
- - "extensions/signal/**"
58
- - "docs/channels/signal.md"
59
- "channel: slack":
60
- - changed-files:
61
- - any-glob-to-any-file:
62
- - "src/slack/**"
63
- - "extensions/slack/**"
64
- - "docs/channels/slack.md"
65
- "channel: telegram":
66
- - changed-files:
67
- - any-glob-to-any-file:
68
- - "src/telegram/**"
69
- - "extensions/telegram/**"
70
- - "docs/channels/telegram.md"
71
- "channel: tlon":
72
- - changed-files:
73
- - any-glob-to-any-file:
74
- - "extensions/tlon/**"
75
- - "docs/channels/tlon.md"
76
- "channel: voice-call":
77
- - changed-files:
78
- - any-glob-to-any-file:
79
- - "extensions/voice-call/**"
80
- "channel: whatsapp-web":
81
- - changed-files:
82
- - any-glob-to-any-file:
83
- - "src/web/**"
84
- - "extensions/whatsapp/**"
85
- - "docs/channels/whatsapp.md"
86
- "channel: zalo":
87
- - changed-files:
88
- - any-glob-to-any-file:
89
- - "extensions/zalo/**"
90
- - "docs/channels/zalo.md"
91
- "channel: zalouser":
92
- - changed-files:
93
- - any-glob-to-any-file:
94
- - "extensions/zalouser/**"
95
- - "docs/channels/zalouser.md"
96
-
97
- "app: android":
98
- - changed-files:
99
- - any-glob-to-any-file:
100
- - "apps/android/**"
101
- - "docs/platforms/android.md"
102
- "app: ios":
103
- - changed-files:
104
- - any-glob-to-any-file:
105
- - "apps/ios/**"
106
- - "docs/platforms/ios.md"
107
- "app: macos":
108
- - changed-files:
109
- - any-glob-to-any-file:
110
- - "apps/macos/**"
111
- - "docs/platforms/macos.md"
112
- - "docs/platforms/mac/**"
113
- "app: web-ui":
114
- - changed-files:
115
- - any-glob-to-any-file:
116
- - "ui/**"
117
- - "src/gateway/control-ui.ts"
118
- - "src/gateway/control-ui-shared.ts"
119
- - "src/gateway/protocol/**"
120
- - "src/gateway/server-methods/chat.ts"
121
- - "src/infra/control-ui-assets.ts"
122
-
123
- "gateway":
124
- - changed-files:
125
- - any-glob-to-any-file:
126
- - "src/gateway/**"
127
- - "src/daemon/**"
128
- - "docs/gateway/**"
129
-
130
- "docs":
131
- - changed-files:
132
- - any-glob-to-any-file:
133
- - "docs/**"
134
- - "docs.acp.md"
135
-
136
- "cli":
137
- - changed-files:
138
- - any-glob-to-any-file:
139
- - "src/cli/**"
140
-
141
- "commands":
142
- - changed-files:
143
- - any-glob-to-any-file:
144
- - "src/commands/**"
145
-
146
- "scripts":
147
- - changed-files:
148
- - any-glob-to-any-file:
149
- - "scripts/**"
150
-
151
- "docker":
152
- - changed-files:
153
- - any-glob-to-any-file:
154
- - "Dockerfile"
155
- - "Dockerfile.*"
156
- - "docker-compose.yml"
157
- - "docker-setup.sh"
158
- - ".dockerignore"
159
- - "scripts/**/*docker*"
160
- - "scripts/**/Dockerfile*"
161
- - "scripts/sandbox-*.sh"
162
- - "src/agents/sandbox*.ts"
163
- - "src/commands/sandbox*.ts"
164
- - "src/cli/sandbox-cli.ts"
165
- - "src/docker-setup.test.ts"
166
- - "src/config/**/*sandbox*"
167
- - "docs/cli/sandbox.md"
168
- - "docs/gateway/sandbox*.md"
169
- - "docs/install/docker.md"
170
- - "docs/multi-agent-sandbox-tools.md"
171
-
172
- "agents":
173
- - changed-files:
174
- - any-glob-to-any-file:
175
- - "src/agents/**"
176
-
177
- "security":
178
- - changed-files:
179
- - any-glob-to-any-file:
180
- - "docs/cli/security.md"
181
- - "docs/gateway/security.md"
182
-
183
- "extensions: copilot-proxy":
184
- - changed-files:
185
- - any-glob-to-any-file:
186
- - "extensions/copilot-proxy/**"
187
- "extensions: diagnostics-otel":
188
- - changed-files:
189
- - any-glob-to-any-file:
190
- - "extensions/diagnostics-otel/**"
191
- "extensions: google-antigravity-auth":
192
- - changed-files:
193
- - any-glob-to-any-file:
194
- - "extensions/google-antigravity-auth/**"
195
- "extensions: google-gemini-cli-auth":
196
- - changed-files:
197
- - any-glob-to-any-file:
198
- - "extensions/google-gemini-cli-auth/**"
199
- "extensions: llm-task":
200
- - changed-files:
201
- - any-glob-to-any-file:
202
- - "extensions/llm-task/**"
203
- "extensions: lobster":
204
- - changed-files:
205
- - any-glob-to-any-file:
206
- - "extensions/lobster/**"
207
- "extensions: memory-core":
208
- - changed-files:
209
- - any-glob-to-any-file:
210
- - "extensions/memory-core/**"
211
- "extensions: memory-lancedb":
212
- - changed-files:
213
- - any-glob-to-any-file:
214
- - "extensions/memory-lancedb/**"
215
- "extensions: open-prose":
216
- - changed-files:
217
- - any-glob-to-any-file:
218
- - "extensions/open-prose/**"
219
- "extensions: qwen-portal-auth":
220
- - changed-files:
221
- - any-glob-to-any-file:
222
- - "extensions/qwen-portal-auth/**"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
.github/workflows/auto-response.yml DELETED
@@ -1,78 +0,0 @@
1
- name: Auto response
2
-
3
- on:
4
- issues:
5
- types: [labeled]
6
- pull_request_target:
7
- types: [labeled]
8
-
9
- permissions:
10
- issues: write
11
- pull-requests: write
12
-
13
- jobs:
14
- auto-response:
15
- runs-on: ubuntu-latest
16
- steps:
17
- - uses: actions/create-github-app-token@v1
18
- id: app-token
19
- with:
20
- app-id: "2729701"
21
- private-key: ${{ secrets.GH_APP_PRIVATE_KEY }}
22
- - name: Handle labeled items
23
- uses: actions/github-script@v7
24
- with:
25
- github-token: ${{ steps.app-token.outputs.token }}
26
- script: |
27
- // Labels prefixed with "r:" are auto-response triggers.
28
- const rules = [
29
- {
30
- label: "r: skill",
31
- close: true,
32
- message:
33
- "Thanks for the contribution! New skills should be published to Clawdhub for everyone to use. We’re keeping the core lean on skills, so I’m closing this out.",
34
- },
35
- {
36
- label: "r: support",
37
- close: true,
38
- message:
39
- "Please use our support server https://molt.bot/discord and ask in #help or #users-helping-users to resolve this, or follow the stuck FAQ at https://docs.molt.bot/help/faq#im-stuck-whats-the-fastest-way-to-get-unstuck.",
40
- },
41
- {
42
- label: "r: third-party-extension",
43
- close: true,
44
- message:
45
- "This would be better made as a third-party extension with our SDK that you maintain yourself. Docs: https://docs.molt.bot/plugin.",
46
- },
47
- ];
48
-
49
- const labelName = context.payload.label?.name;
50
- if (!labelName) {
51
- return;
52
- }
53
-
54
- const rule = rules.find((item) => item.label === labelName);
55
- if (!rule) {
56
- return;
57
- }
58
-
59
- const issueNumber = context.payload.issue?.number ?? context.payload.pull_request?.number;
60
- if (!issueNumber) {
61
- return;
62
- }
63
-
64
- await github.rest.issues.createComment({
65
- owner: context.repo.owner,
66
- repo: context.repo.repo,
67
- issue_number: issueNumber,
68
- body: rule.message,
69
- });
70
-
71
- if (rule.close) {
72
- await github.rest.issues.update({
73
- owner: context.repo.owner,
74
- repo: context.repo.repo,
75
- issue_number: issueNumber,
76
- state: "closed",
77
- });
78
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
.github/workflows/ci.yml DELETED
@@ -1,647 +0,0 @@
1
- name: CI
2
-
3
- on:
4
- push:
5
- pull_request:
6
-
7
- jobs:
8
- install-check:
9
- runs-on: blacksmith-4vcpu-ubuntu-2404
10
- steps:
11
- - name: Checkout
12
- uses: actions/checkout@v4
13
- with:
14
- submodules: false
15
-
16
- - name: Checkout submodules (retry)
17
- run: |
18
- set -euo pipefail
19
- git submodule sync --recursive
20
- for attempt in 1 2 3 4 5; do
21
- if git -c protocol.version=2 submodule update --init --force --depth=1 --recursive; then
22
- exit 0
23
- fi
24
- echo "Submodule update failed (attempt $attempt/5). Retrying…"
25
- sleep $((attempt * 10))
26
- done
27
- exit 1
28
-
29
- - name: Setup Node.js
30
- uses: actions/setup-node@v4
31
- with:
32
- node-version: 22.x
33
- check-latest: true
34
-
35
- - name: Setup pnpm (corepack retry)
36
- run: |
37
- set -euo pipefail
38
- corepack enable
39
- for attempt in 1 2 3; do
40
- if corepack prepare pnpm@10.23.0 --activate; then
41
- pnpm -v
42
- exit 0
43
- fi
44
- echo "corepack prepare failed (attempt $attempt/3). Retrying..."
45
- sleep $((attempt * 10))
46
- done
47
- exit 1
48
-
49
- - name: Runtime versions
50
- run: |
51
- node -v
52
- npm -v
53
- pnpm -v
54
-
55
- - name: Capture node path
56
- run: echo "NODE_BIN=$(dirname \"$(node -p \"process.execPath\")\")" >> "$GITHUB_ENV"
57
-
58
- - name: Install dependencies (frozen)
59
- env:
60
- CI: true
61
- run: |
62
- export PATH="$NODE_BIN:$PATH"
63
- which node
64
- node -v
65
- pnpm -v
66
- pnpm install --frozen-lockfile --ignore-scripts=false --config.engine-strict=false --config.enable-pre-post-scripts=true
67
-
68
- checks:
69
- runs-on: blacksmith-4vcpu-ubuntu-2404
70
- strategy:
71
- fail-fast: false
72
- matrix:
73
- include:
74
- - runtime: node
75
- task: lint
76
- command: pnpm lint
77
- - runtime: node
78
- task: test
79
- command: pnpm canvas:a2ui:bundle && pnpm test
80
- - runtime: node
81
- task: build
82
- command: pnpm build
83
- - runtime: node
84
- task: protocol
85
- command: pnpm protocol:check
86
- - runtime: node
87
- task: format
88
- command: pnpm format
89
- - runtime: bun
90
- task: test
91
- command: pnpm canvas:a2ui:bundle && bunx vitest run
92
- - runtime: bun
93
- task: build
94
- command: bunx tsc -p tsconfig.json
95
- steps:
96
- - name: Checkout
97
- uses: actions/checkout@v4
98
- with:
99
- submodules: false
100
-
101
- - name: Checkout submodules (retry)
102
- run: |
103
- set -euo pipefail
104
- git submodule sync --recursive
105
- for attempt in 1 2 3 4 5; do
106
- if git -c protocol.version=2 submodule update --init --force --depth=1 --recursive; then
107
- exit 0
108
- fi
109
- echo "Submodule update failed (attempt $attempt/5). Retrying…"
110
- sleep $((attempt * 10))
111
- done
112
- exit 1
113
-
114
- - name: Setup Node.js
115
- uses: actions/setup-node@v4
116
- with:
117
- node-version: 22.x
118
- check-latest: true
119
-
120
- - name: Setup pnpm (corepack retry)
121
- run: |
122
- set -euo pipefail
123
- corepack enable
124
- for attempt in 1 2 3; do
125
- if corepack prepare pnpm@10.23.0 --activate; then
126
- pnpm -v
127
- exit 0
128
- fi
129
- echo "corepack prepare failed (attempt $attempt/3). Retrying..."
130
- sleep $((attempt * 10))
131
- done
132
- exit 1
133
-
134
- - name: Setup Bun
135
- uses: oven-sh/setup-bun@v2
136
- with:
137
- bun-version: latest
138
-
139
- - name: Runtime versions
140
- run: |
141
- node -v
142
- npm -v
143
- bun -v
144
- pnpm -v
145
-
146
- - name: Capture node path
147
- run: echo "NODE_BIN=$(dirname \"$(node -p \"process.execPath\")\")" >> "$GITHUB_ENV"
148
-
149
- - name: Install dependencies
150
- env:
151
- CI: true
152
- run: |
153
- export PATH="$NODE_BIN:$PATH"
154
- which node
155
- node -v
156
- pnpm -v
157
- pnpm install --frozen-lockfile --ignore-scripts=false --config.engine-strict=false --config.enable-pre-post-scripts=true || pnpm install --frozen-lockfile --ignore-scripts=false --config.engine-strict=false --config.enable-pre-post-scripts=true
158
-
159
- - name: Run ${{ matrix.task }} (${{ matrix.runtime }})
160
- run: ${{ matrix.command }}
161
-
162
- secrets:
163
- runs-on: blacksmith-4vcpu-ubuntu-2404
164
- steps:
165
- - name: Checkout
166
- uses: actions/checkout@v4
167
- with:
168
- submodules: false
169
-
170
- - name: Setup Python
171
- uses: actions/setup-python@v5
172
- with:
173
- python-version: "3.12"
174
-
175
- - name: Install detect-secrets
176
- run: |
177
- python -m pip install --upgrade pip
178
- python -m pip install detect-secrets==1.5.0
179
-
180
- - name: Detect secrets
181
- run: |
182
- if ! detect-secrets scan --baseline .secrets.baseline; then
183
- echo "::error::Secret scanning failed. See docs/gateway/security.md#secret-scanning-detect-secrets"
184
- exit 1
185
- fi
186
-
187
- checks-windows:
188
- runs-on: blacksmith-4vcpu-windows-2025
189
- env:
190
- NODE_OPTIONS: --max-old-space-size=4096
191
- CLAWDBOT_TEST_WORKERS: 1
192
- defaults:
193
- run:
194
- shell: bash
195
- strategy:
196
- fail-fast: false
197
- matrix:
198
- include:
199
- - runtime: node
200
- task: lint
201
- command: pnpm lint
202
- - runtime: node
203
- task: test
204
- command: pnpm canvas:a2ui:bundle && pnpm test
205
- - runtime: node
206
- task: build
207
- command: pnpm build
208
- - runtime: node
209
- task: protocol
210
- command: pnpm protocol:check
211
- steps:
212
- - name: Checkout
213
- uses: actions/checkout@v4
214
- with:
215
- submodules: false
216
-
217
- - name: Checkout submodules (retry)
218
- run: |
219
- set -euo pipefail
220
- git submodule sync --recursive
221
- for attempt in 1 2 3 4 5; do
222
- if git -c protocol.version=2 submodule update --init --force --depth=1 --recursive; then
223
- exit 0
224
- fi
225
- echo "Submodule update failed (attempt $attempt/5). Retrying…"
226
- sleep $((attempt * 10))
227
- done
228
- exit 1
229
-
230
- - name: Setup Node.js
231
- uses: actions/setup-node@v4
232
- with:
233
- node-version: 22.x
234
- check-latest: true
235
-
236
- - name: Setup pnpm (corepack retry)
237
- run: |
238
- set -euo pipefail
239
- corepack enable
240
- for attempt in 1 2 3; do
241
- if corepack prepare pnpm@10.23.0 --activate; then
242
- pnpm -v
243
- exit 0
244
- fi
245
- echo "corepack prepare failed (attempt $attempt/3). Retrying..."
246
- sleep $((attempt * 10))
247
- done
248
- exit 1
249
-
250
- - name: Setup Bun
251
- uses: oven-sh/setup-bun@v2
252
- with:
253
- bun-version: latest
254
-
255
- - name: Runtime versions
256
- run: |
257
- node -v
258
- npm -v
259
- bun -v
260
- pnpm -v
261
-
262
- - name: Capture node path
263
- run: echo "NODE_BIN=$(dirname \"$(node -p \"process.execPath\")\")" >> "$GITHUB_ENV"
264
-
265
- - name: Install dependencies
266
- env:
267
- CI: true
268
- run: |
269
- export PATH="$NODE_BIN:$PATH"
270
- which node
271
- node -v
272
- pnpm -v
273
- pnpm install --frozen-lockfile --ignore-scripts=false --config.engine-strict=false --config.enable-pre-post-scripts=true || pnpm install --frozen-lockfile --ignore-scripts=false --config.engine-strict=false --config.enable-pre-post-scripts=true
274
-
275
- - name: Run ${{ matrix.task }} (${{ matrix.runtime }})
276
- run: ${{ matrix.command }}
277
-
278
- checks-macos:
279
- if: github.event_name == 'pull_request'
280
- runs-on: macos-latest
281
- strategy:
282
- fail-fast: false
283
- matrix:
284
- include:
285
- - task: test
286
- command: pnpm test
287
- steps:
288
- - name: Checkout
289
- uses: actions/checkout@v4
290
- with:
291
- submodules: false
292
-
293
- - name: Checkout submodules (retry)
294
- run: |
295
- set -euo pipefail
296
- git submodule sync --recursive
297
- for attempt in 1 2 3 4 5; do
298
- if git -c protocol.version=2 submodule update --init --force --depth=1 --recursive; then
299
- exit 0
300
- fi
301
- echo "Submodule update failed (attempt $attempt/5). Retrying…"
302
- sleep $((attempt * 10))
303
- done
304
- exit 1
305
-
306
- - name: Setup Node.js
307
- uses: actions/setup-node@v4
308
- with:
309
- node-version: 22.x
310
- check-latest: true
311
-
312
- - name: Setup pnpm (corepack retry)
313
- run: |
314
- set -euo pipefail
315
- corepack enable
316
- for attempt in 1 2 3; do
317
- if corepack prepare pnpm@10.23.0 --activate; then
318
- pnpm -v
319
- exit 0
320
- fi
321
- echo "corepack prepare failed (attempt $attempt/3). Retrying..."
322
- sleep $((attempt * 10))
323
- done
324
- exit 1
325
-
326
- - name: Runtime versions
327
- run: |
328
- node -v
329
- npm -v
330
- pnpm -v
331
-
332
- - name: Capture node path
333
- run: echo "NODE_BIN=$(dirname \"$(node -p \"process.execPath\")\")" >> "$GITHUB_ENV"
334
-
335
- - name: Install dependencies
336
- env:
337
- CI: true
338
- run: |
339
- export PATH="$NODE_BIN:$PATH"
340
- which node
341
- node -v
342
- pnpm -v
343
- pnpm install --frozen-lockfile --ignore-scripts=false --config.engine-strict=false --config.enable-pre-post-scripts=true || pnpm install --frozen-lockfile --ignore-scripts=false --config.engine-strict=false --config.enable-pre-post-scripts=true
344
-
345
- - name: Run ${{ matrix.task }}
346
- env:
347
- NODE_OPTIONS: --max-old-space-size=4096
348
- run: ${{ matrix.command }}
349
-
350
- macos-app:
351
- if: github.event_name == 'pull_request'
352
- runs-on: macos-latest
353
- strategy:
354
- fail-fast: false
355
- matrix:
356
- include:
357
- - task: lint
358
- command: |
359
- swiftlint --config .swiftlint.yml
360
- swiftformat --lint apps/macos/Sources --config .swiftformat
361
- - task: build
362
- command: |
363
- set -euo pipefail
364
- for attempt in 1 2 3; do
365
- if swift build --package-path apps/macos --configuration release; then
366
- exit 0
367
- fi
368
- echo "swift build failed (attempt $attempt/3). Retrying…"
369
- sleep $((attempt * 20))
370
- done
371
- exit 1
372
- - task: test
373
- command: |
374
- set -euo pipefail
375
- for attempt in 1 2 3; do
376
- if swift test --package-path apps/macos --parallel --enable-code-coverage --show-codecov-path; then
377
- exit 0
378
- fi
379
- echo "swift test failed (attempt $attempt/3). Retrying…"
380
- sleep $((attempt * 20))
381
- done
382
- exit 1
383
- steps:
384
- - name: Checkout
385
- uses: actions/checkout@v4
386
- with:
387
- submodules: false
388
-
389
- - name: Checkout submodules (retry)
390
- run: |
391
- set -euo pipefail
392
- git submodule sync --recursive
393
- for attempt in 1 2 3 4 5; do
394
- if git -c protocol.version=2 submodule update --init --force --depth=1 --recursive; then
395
- exit 0
396
- fi
397
- echo "Submodule update failed (attempt $attempt/5). Retrying…"
398
- sleep $((attempt * 10))
399
- done
400
- exit 1
401
-
402
- - name: Select Xcode 26.1
403
- run: |
404
- sudo xcode-select -s /Applications/Xcode_26.1.app
405
- xcodebuild -version
406
-
407
- - name: Install XcodeGen / SwiftLint / SwiftFormat
408
- run: |
409
- brew install xcodegen swiftlint swiftformat
410
-
411
- - name: Show toolchain
412
- run: |
413
- sw_vers
414
- xcodebuild -version
415
- swift --version
416
-
417
- - name: Run ${{ matrix.task }}
418
- run: ${{ matrix.command }}
419
- ios:
420
- if: false # ignore iOS in CI for now
421
- runs-on: macos-latest
422
- steps:
423
- - name: Checkout
424
- uses: actions/checkout@v4
425
- with:
426
- submodules: false
427
-
428
- - name: Checkout submodules (retry)
429
- run: |
430
- set -euo pipefail
431
- git submodule sync --recursive
432
- for attempt in 1 2 3 4 5; do
433
- if git -c protocol.version=2 submodule update --init --force --depth=1 --recursive; then
434
- exit 0
435
- fi
436
- echo "Submodule update failed (attempt $attempt/5). Retrying…"
437
- sleep $((attempt * 10))
438
- done
439
- exit 1
440
-
441
- - name: Select Xcode 26.1
442
- run: |
443
- sudo xcode-select -s /Applications/Xcode_26.1.app
444
- xcodebuild -version
445
-
446
- - name: Install XcodeGen
447
- run: brew install xcodegen
448
-
449
- - name: Install SwiftLint / SwiftFormat
450
- run: brew install swiftlint swiftformat
451
-
452
- - name: Show toolchain
453
- run: |
454
- sw_vers
455
- xcodebuild -version
456
- swift --version
457
-
458
- - name: Generate iOS project
459
- run: |
460
- cd apps/ios
461
- xcodegen generate
462
-
463
- - name: iOS tests
464
- run: |
465
- set -euo pipefail
466
- RESULT_BUNDLE_PATH="$RUNNER_TEMP/Clawdis-iOS.xcresult"
467
- DEST_ID="$(
468
- python3 - <<'PY'
469
- import json
470
- import subprocess
471
- import sys
472
- import uuid
473
-
474
- def sh(args: list[str]) -> str:
475
- return subprocess.check_output(args, text=True).strip()
476
-
477
- # Prefer an already-created iPhone simulator if it exists.
478
- devices = json.loads(sh(["xcrun", "simctl", "list", "devices", "-j"]))
479
- candidates: list[tuple[str, str]] = []
480
- for runtime, devs in (devices.get("devices") or {}).items():
481
- for dev in devs or []:
482
- if not dev.get("isAvailable"):
483
- continue
484
- name = str(dev.get("name") or "")
485
- udid = str(dev.get("udid") or "")
486
- if not udid or not name.startswith("iPhone"):
487
- continue
488
- candidates.append((name, udid))
489
-
490
- candidates.sort(key=lambda it: (0 if "iPhone 16" in it[0] else 1, it[0]))
491
- if candidates:
492
- print(candidates[0][1])
493
- sys.exit(0)
494
-
495
- # Otherwise, create one from the newest available iOS runtime.
496
- runtimes = json.loads(sh(["xcrun", "simctl", "list", "runtimes", "-j"])).get("runtimes") or []
497
- ios = [rt for rt in runtimes if rt.get("platform") == "iOS" and rt.get("isAvailable")]
498
- if not ios:
499
- print("No available iOS runtimes found.", file=sys.stderr)
500
- sys.exit(1)
501
-
502
- def version_key(rt: dict) -> tuple[int, ...]:
503
- parts: list[int] = []
504
- for p in str(rt.get("version") or "0").split("."):
505
- try:
506
- parts.append(int(p))
507
- except ValueError:
508
- parts.append(0)
509
- return tuple(parts)
510
-
511
- ios.sort(key=version_key, reverse=True)
512
- runtime = ios[0]
513
- runtime_id = str(runtime.get("identifier") or "")
514
- if not runtime_id:
515
- print("Missing iOS runtime identifier.", file=sys.stderr)
516
- sys.exit(1)
517
-
518
- supported = runtime.get("supportedDeviceTypes") or []
519
- iphones = [dt for dt in supported if dt.get("productFamily") == "iPhone"]
520
- if not iphones:
521
- print("No iPhone device types for iOS runtime.", file=sys.stderr)
522
- sys.exit(1)
523
-
524
- iphones.sort(
525
- key=lambda dt: (
526
- 0 if "iPhone 16" in str(dt.get("name") or "") else 1,
527
- str(dt.get("name") or ""),
528
- )
529
- )
530
- device_type_id = str(iphones[0].get("identifier") or "")
531
- if not device_type_id:
532
- print("Missing iPhone device type identifier.", file=sys.stderr)
533
- sys.exit(1)
534
-
535
- sim_name = f"CI iPhone {uuid.uuid4().hex[:8]}"
536
- udid = sh(["xcrun", "simctl", "create", sim_name, device_type_id, runtime_id])
537
- if not udid:
538
- print("Failed to create iPhone simulator.", file=sys.stderr)
539
- sys.exit(1)
540
- print(udid)
541
- PY
542
- )"
543
- echo "Using iOS Simulator id: $DEST_ID"
544
- xcodebuild test \
545
- -project apps/ios/Clawdis.xcodeproj \
546
- -scheme Clawdis \
547
- -destination "platform=iOS Simulator,id=$DEST_ID" \
548
- -resultBundlePath "$RESULT_BUNDLE_PATH" \
549
- -enableCodeCoverage YES
550
-
551
- - name: iOS coverage summary
552
- run: |
553
- set -euo pipefail
554
- RESULT_BUNDLE_PATH="$RUNNER_TEMP/Clawdis-iOS.xcresult"
555
- xcrun xccov view --report --only-targets "$RESULT_BUNDLE_PATH"
556
-
557
- - name: iOS coverage gate (43%)
558
- run: |
559
- set -euo pipefail
560
- RESULT_BUNDLE_PATH="$RUNNER_TEMP/Clawdis-iOS.xcresult"
561
- RESULT_BUNDLE_PATH="$RESULT_BUNDLE_PATH" python3 - <<'PY'
562
- import json
563
- import os
564
- import subprocess
565
- import sys
566
-
567
- target_name = "Clawdis.app"
568
- minimum = 0.43
569
-
570
- report = json.loads(
571
- subprocess.check_output(
572
- ["xcrun", "xccov", "view", "--report", "--json", os.environ["RESULT_BUNDLE_PATH"]],
573
- text=True,
574
- )
575
- )
576
-
577
- target_coverage = None
578
- for target in report.get("targets", []):
579
- if target.get("name") == target_name:
580
- target_coverage = float(target["lineCoverage"])
581
- break
582
-
583
- if target_coverage is None:
584
- print(f"Could not find coverage for target: {target_name}")
585
- sys.exit(1)
586
-
587
- print(f"{target_name} line coverage: {target_coverage * 100:.2f}% (min {minimum * 100:.2f}%)")
588
- if target_coverage + 1e-12 < minimum:
589
- sys.exit(1)
590
- PY
591
-
592
- android:
593
- runs-on: blacksmith-4vcpu-ubuntu-2404
594
- strategy:
595
- fail-fast: false
596
- matrix:
597
- include:
598
- - task: test
599
- command: ./gradlew --no-daemon :app:testDebugUnitTest
600
- - task: build
601
- command: ./gradlew --no-daemon :app:assembleDebug
602
- steps:
603
- - name: Checkout
604
- uses: actions/checkout@v4
605
- with:
606
- submodules: false
607
-
608
- - name: Checkout submodules (retry)
609
- run: |
610
- set -euo pipefail
611
- git submodule sync --recursive
612
- for attempt in 1 2 3 4 5; do
613
- if git -c protocol.version=2 submodule update --init --force --depth=1 --recursive; then
614
- exit 0
615
- fi
616
- echo "Submodule update failed (attempt $attempt/5). Retrying…"
617
- sleep $((attempt * 10))
618
- done
619
- exit 1
620
-
621
- - name: Setup Java
622
- uses: actions/setup-java@v4
623
- with:
624
- distribution: temurin
625
- java-version: 21
626
-
627
- - name: Setup Android SDK
628
- uses: android-actions/setup-android@v3
629
- with:
630
- accept-android-sdk-licenses: false
631
-
632
- - name: Setup Gradle
633
- uses: gradle/actions/setup-gradle@v4
634
- with:
635
- gradle-version: 8.11.1
636
-
637
- - name: Install Android SDK packages
638
- run: |
639
- yes | sdkmanager --licenses >/dev/null
640
- sdkmanager --install \
641
- "platform-tools" \
642
- "platforms;android-36" \
643
- "build-tools;36.0.0"
644
-
645
- - name: Run Android ${{ matrix.task }}
646
- working-directory: apps/android
647
- run: ${{ matrix.command }}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
.github/workflows/docker-release.yml DELETED
@@ -1,143 +0,0 @@
1
- name: Docker Release
2
-
3
- on:
4
- push:
5
- branches:
6
- - main
7
- tags:
8
- - "v*"
9
-
10
- env:
11
- REGISTRY: ghcr.io
12
- IMAGE_NAME: ${{ github.repository }}
13
-
14
- jobs:
15
- # Build amd64 image
16
- build-amd64:
17
- runs-on: ubuntu-latest
18
- permissions:
19
- packages: write
20
- contents: read
21
- outputs:
22
- image-digest: ${{ steps.build.outputs.digest }}
23
- image-metadata: ${{ steps.meta.outputs.json }}
24
- steps:
25
- - name: Checkout
26
- uses: actions/checkout@v4
27
-
28
- - name: Set up Docker Buildx
29
- uses: docker/setup-buildx-action@v3
30
-
31
- - name: Login to GitHub Container Registry
32
- uses: docker/login-action@v3
33
- with:
34
- registry: ${{ env.REGISTRY }}
35
- username: ${{ github.repository_owner }}
36
- password: ${{ secrets.GITHUB_TOKEN }}
37
-
38
- - name: Extract metadata
39
- id: meta
40
- uses: docker/metadata-action@v5
41
- with:
42
- images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
43
- tags: |
44
- type=ref,event=branch
45
- type=semver,pattern={{version}}
46
- type=semver,pattern={{version}},suffix=-amd64
47
- type=semver,pattern={{version}},suffix=-arm64
48
- type=ref,event=branch,suffix=-amd64
49
- type=ref,event=branch,suffix=-arm64
50
-
51
- - name: Build and push amd64 image
52
- id: build
53
- uses: docker/build-push-action@v6
54
- with:
55
- context: .
56
- platforms: linux/amd64
57
- labels: ${{ steps.meta.outputs.labels }}
58
- tags: ${{ steps.meta.outputs.tags }}
59
- cache-from: type=gha
60
- cache-to: type=gha,mode=max
61
- provenance: false
62
- push: true
63
-
64
- # Build arm64 image
65
- build-arm64:
66
- runs-on: ubuntu-24.04-arm
67
- permissions:
68
- packages: write
69
- contents: read
70
- outputs:
71
- image-digest: ${{ steps.build.outputs.digest }}
72
- image-metadata: ${{ steps.meta.outputs.json }}
73
- steps:
74
- - name: Checkout
75
- uses: actions/checkout@v4
76
-
77
- - name: Set up Docker Buildx
78
- uses: docker/setup-buildx-action@v3
79
-
80
- - name: Login to GitHub Container Registry
81
- uses: docker/login-action@v3
82
- with:
83
- registry: ${{ env.REGISTRY }}
84
- username: ${{ github.repository_owner }}
85
- password: ${{ secrets.GITHUB_TOKEN }}
86
-
87
- - name: Extract metadata
88
- id: meta
89
- uses: docker/metadata-action@v5
90
- with:
91
- images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
92
- tags: |
93
- type=ref,event=branch
94
- type=semver,pattern={{version}}
95
- type=semver,pattern={{version}},suffix=-amd64
96
- type=semver,pattern={{version}},suffix=-arm64
97
- type=ref,event=branch,suffix=-amd64
98
- type=ref,event=branch,suffix=-arm64
99
-
100
- - name: Build and push arm64 image
101
- id: build
102
- uses: docker/build-push-action@v6
103
- with:
104
- context: .
105
- platforms: linux/arm64
106
- labels: ${{ steps.meta.outputs.labels }}
107
- tags: ${{ steps.meta.outputs.tags }}
108
- cache-from: type=gha
109
- cache-to: type=gha,mode=max
110
- provenance: false
111
- push: true
112
-
113
- # Create multi-platform manifest
114
- create-manifest:
115
- runs-on: ubuntu-latest
116
- permissions:
117
- packages: write
118
- contents: read
119
- needs: [build-amd64, build-arm64]
120
- steps:
121
- - name: Login to GitHub Container Registry
122
- uses: docker/login-action@v3
123
- with:
124
- registry: ${{ env.REGISTRY }}
125
- username: ${{ github.repository_owner }}
126
- password: ${{ secrets.GITHUB_TOKEN }}
127
-
128
- - name: Extract metadata for manifest
129
- id: meta
130
- uses: docker/metadata-action@v5
131
- with:
132
- images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
133
- tags: |
134
- type=ref,event=branch
135
- type=semver,pattern={{version}}
136
-
137
- - name: Create and push manifest
138
- run: |
139
- docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \
140
- ${{ needs.build-amd64.outputs.image-digest }} \
141
- ${{ needs.build-arm64.outputs.image-digest }}
142
- env:
143
- DOCKER_METADATA_OUTPUT_JSON: ${{ steps.meta.outputs.json }}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
.github/workflows/install-smoke.yml DELETED
@@ -1,41 +0,0 @@
1
- name: Install Smoke
2
-
3
- on:
4
- push:
5
- branches: [main]
6
- pull_request:
7
- workflow_dispatch:
8
-
9
- jobs:
10
- install-smoke:
11
- runs-on: ubuntu-latest
12
- steps:
13
- - name: Checkout CLI
14
- uses: actions/checkout@v4
15
-
16
- - name: Setup pnpm (corepack retry)
17
- run: |
18
- set -euo pipefail
19
- corepack enable
20
- for attempt in 1 2 3; do
21
- if corepack prepare pnpm@10.23.0 --activate; then
22
- pnpm -v
23
- exit 0
24
- fi
25
- echo "corepack prepare failed (attempt $attempt/3). Retrying..."
26
- sleep $((attempt * 10))
27
- done
28
- exit 1
29
-
30
- - name: Install pnpm deps (minimal)
31
- run: pnpm install --ignore-scripts --frozen-lockfile
32
-
33
- - name: Run installer docker tests
34
- env:
35
- CLAWDBOT_INSTALL_URL: https://clawd.bot/install.sh
36
- CLAWDBOT_INSTALL_CLI_URL: https://clawd.bot/install-cli.sh
37
- CLAWDBOT_NO_ONBOARD: "1"
38
- CLAWDBOT_INSTALL_SMOKE_SKIP_CLI: "1"
39
- CLAWDBOT_INSTALL_SMOKE_SKIP_NONROOT: ${{ github.event_name == 'pull_request' && '1' || '0' }}
40
- CLAWDBOT_INSTALL_SMOKE_SKIP_PREVIOUS: "1"
41
- run: pnpm test:install:smoke
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
.github/workflows/labeler.yml DELETED
@@ -1,24 +0,0 @@
1
- name: Labeler
2
-
3
- on:
4
- pull_request_target:
5
- types: [opened, synchronize, reopened]
6
-
7
- permissions:
8
- contents: read
9
- pull-requests: write
10
-
11
- jobs:
12
- label:
13
- runs-on: ubuntu-latest
14
- steps:
15
- - uses: actions/create-github-app-token@v1
16
- id: app-token
17
- with:
18
- app-id: "2729701"
19
- private-key: ${{ secrets.GH_APP_PRIVATE_KEY }}
20
- - uses: actions/labeler@v5
21
- with:
22
- configuration-path: .github/labeler.yml
23
- repo-token: ${{ steps.app-token.outputs.token }}
24
- sync-labels: true
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
.github/workflows/workflow-sanity.yml DELETED
@@ -1,37 +0,0 @@
1
- name: Workflow Sanity
2
-
3
- on:
4
- pull_request:
5
- push:
6
-
7
- jobs:
8
- no-tabs:
9
- runs-on: ubuntu-latest
10
- steps:
11
- - name: Checkout
12
- uses: actions/checkout@v4
13
-
14
- - name: Fail on tabs in workflow files
15
- run: |
16
- python - <<'PY'
17
- from __future__ import annotations
18
-
19
- import pathlib
20
- import sys
21
-
22
- root = pathlib.Path(".github/workflows")
23
- bad: list[str] = []
24
- for path in sorted(root.rglob("*.yml")):
25
- if b"\t" in path.read_bytes():
26
- bad.append(str(path))
27
-
28
- for path in sorted(root.rglob("*.yaml")):
29
- if b"\t" in path.read_bytes():
30
- bad.append(str(path))
31
-
32
- if bad:
33
- print("Tabs found in workflow file(s):")
34
- for path in bad:
35
- print(f"- {path}")
36
- sys.exit(1)
37
- PY
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
.gitignore DELETED
@@ -1,73 +0,0 @@
1
- node_modules
2
- **/node_modules/
3
- .env
4
- docker-compose.extra.yml
5
- dist
6
- *.bun-build
7
- pnpm-lock.yaml
8
- bun.lock
9
- bun.lockb
10
- coverage
11
- .pnpm-store
12
- .worktrees/
13
- .DS_Store
14
- **/.DS_Store
15
- ui/src/ui/__screenshots__/
16
- ui/playwright-report/
17
- ui/test-results/
18
-
19
- # Bun build artifacts
20
- *.bun-build
21
- apps/macos/.build/
22
- apps/shared/MoltbotKit/.build/
23
- **/ModuleCache/
24
- bin/
25
- bin/clawdbot-mac
26
- bin/docs-list
27
- apps/macos/.build-local/
28
- apps/macos/.swiftpm/
29
- apps/shared/MoltbotKit/.swiftpm/
30
- Core/
31
- apps/ios/*.xcodeproj/
32
- apps/ios/*.xcworkspace/
33
- apps/ios/.swiftpm/
34
- vendor/
35
- apps/ios/Clawdbot.xcodeproj/
36
- apps/ios/Clawdbot.xcodeproj/**
37
- apps/macos/.build/**
38
- **/*.bun-build
39
- apps/ios/*.xcfilelist
40
-
41
- # Vendor build artifacts
42
- vendor/a2ui/renderers/lit/dist/
43
- src/canvas-host/a2ui/*.bundle.js
44
- src/canvas-host/a2ui/*.map
45
- .bundle.hash
46
-
47
- # fastlane (iOS)
48
- apps/ios/fastlane/README.md
49
- apps/ios/fastlane/report.xml
50
- apps/ios/fastlane/Preview.html
51
- apps/ios/fastlane/screenshots/
52
- apps/ios/fastlane/test_output/
53
- apps/ios/fastlane/logs/
54
- apps/ios/fastlane/.env
55
- apps/ios/fastlane/report.xml
56
-
57
- # fastlane build artifacts (local)
58
- apps/ios/*.ipa
59
- apps/ios/*.dSYM.zip
60
-
61
- # provisioning profiles (local)
62
- apps/ios/*.mobileprovision
63
- .env
64
-
65
- # Local untracked files
66
- .local/
67
- .vscode/
68
- IDENTITY.md
69
- USER.md
70
- .tgz
71
-
72
- # local tooling
73
- .serena/
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
.hfignore DELETED
@@ -1,4 +0,0 @@
1
- node_modules/
2
- .git/
3
- venv/
4
- ui/node_modules/
 
 
 
 
 
.npmrc DELETED
@@ -1 +0,0 @@
1
- allow-build-scripts=@whiskeysockets/baileys,sharp,esbuild,protobufjs,fs-ext,node-pty,@lydell/node-pty,@matrix-org/matrix-sdk-crypto-nodejs
 
 
.oxfmtrc.jsonc DELETED
@@ -1,5 +0,0 @@
1
- {
2
- "$schema": "./node_modules/oxfmt/configuration_schema.json",
3
- "indentWidth": 2,
4
- "printWidth": 100
5
- }
 
 
 
 
 
 
.oxlintrc.json DELETED
@@ -1,12 +0,0 @@
1
- {
2
- "$schema": "./node_modules/oxlint/configuration_schema.json",
3
- "plugins": [
4
- "unicorn",
5
- "typescript",
6
- "oxc"
7
- ],
8
- "categories": {
9
- "correctness": "error"
10
- },
11
- "ignorePatterns": ["src/canvas-host/a2ui/a2ui.bundle.js"]
12
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
.pre-commit-config.yaml DELETED
@@ -1,105 +0,0 @@
1
- # Pre-commit hooks for clawdbot
2
- # Install: prek install
3
- # Run manually: prek run --all-files
4
- #
5
- # See https://pre-commit.com for more information
6
-
7
- repos:
8
- # Basic file hygiene
9
- - repo: https://github.com/pre-commit/pre-commit-hooks
10
- rev: v6.0.0
11
- hooks:
12
- - id: trailing-whitespace
13
- exclude: '^(docs/|dist/|vendor/|.*\.snap$)'
14
- - id: end-of-file-fixer
15
- exclude: '^(docs/|dist/|vendor/|.*\.snap$)'
16
- - id: check-yaml
17
- args: [--allow-multiple-documents]
18
- - id: check-added-large-files
19
- args: [--maxkb=500]
20
- - id: check-merge-conflict
21
-
22
- # Secret detection (same as CI)
23
- - repo: https://github.com/Yelp/detect-secrets
24
- rev: v1.5.0
25
- hooks:
26
- - id: detect-secrets
27
- args:
28
- - --baseline
29
- - .secrets.baseline
30
- - --exclude-files
31
- - '(^|/)(dist/|vendor/|pnpm-lock\.yaml$|\.detect-secrets\.cfg$)'
32
- - --exclude-lines
33
- - 'key_content\.include\?\("BEGIN PRIVATE KEY"\)'
34
- - --exclude-lines
35
- - 'case \.apiKeyEnv: "API key \(env var\)"'
36
- - --exclude-lines
37
- - 'case apikey = "apiKey"'
38
- - --exclude-lines
39
- - '"gateway\.remote\.password"'
40
- - --exclude-lines
41
- - '"gateway\.auth\.password"'
42
- - --exclude-lines
43
- - '"talk\.apiKey"'
44
- - --exclude-lines
45
- - '=== "string"'
46
- - --exclude-lines
47
- - 'typeof remote\?\.password === "string"'
48
-
49
- # Shell script linting
50
- - repo: https://github.com/koalaman/shellcheck-precommit
51
- rev: v0.11.0
52
- hooks:
53
- - id: shellcheck
54
- args: [--severity=error] # Only fail on errors, not warnings/info
55
- # Exclude vendor and scripts with embedded code or known issues
56
- exclude: '^(vendor/|scripts/e2e/)'
57
-
58
- # GitHub Actions linting
59
- - repo: https://github.com/rhysd/actionlint
60
- rev: v1.7.10
61
- hooks:
62
- - id: actionlint
63
-
64
- # GitHub Actions security audit
65
- - repo: https://github.com/zizmorcore/zizmor-pre-commit
66
- rev: v1.22.0
67
- hooks:
68
- - id: zizmor
69
- args: [--persona=regular, --min-severity=medium, --min-confidence=medium]
70
- exclude: '^(vendor/|Swabble/)'
71
-
72
- # Project checks (same commands as CI)
73
- - repo: local
74
- hooks:
75
- # oxlint --type-aware src test
76
- - id: oxlint
77
- name: oxlint
78
- entry: scripts/pre-commit/run-node-tool.sh oxlint --type-aware src test
79
- language: system
80
- pass_filenames: false
81
- types_or: [javascript, jsx, ts, tsx]
82
-
83
- # oxfmt --check src test
84
- - id: oxfmt
85
- name: oxfmt
86
- entry: scripts/pre-commit/run-node-tool.sh oxfmt --check src test
87
- language: system
88
- pass_filenames: false
89
- types_or: [javascript, jsx, ts, tsx]
90
-
91
- # swiftlint (same as CI)
92
- - id: swiftlint
93
- name: swiftlint
94
- entry: swiftlint --config .swiftlint.yml
95
- language: system
96
- pass_filenames: false
97
- types: [swift]
98
-
99
- # swiftformat --lint (same as CI)
100
- - id: swiftformat
101
- name: swiftformat
102
- entry: swiftformat --lint apps/macos/Sources --config .swiftformat
103
- language: system
104
- pass_filenames: false
105
- types: [swift]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
.prettierignore DELETED
@@ -1 +0,0 @@
1
- src/canvas-host/a2ui/a2ui.bundle.js
 
 
.secrets.baseline DELETED
@@ -1,2191 +0,0 @@
1
- {
2
- "version": "1.5.0",
3
- "plugins_used": [
4
- {
5
- "name": "ArtifactoryDetector"
6
- },
7
- {
8
- "name": "AWSKeyDetector"
9
- },
10
- {
11
- "name": "AzureStorageKeyDetector"
12
- },
13
- {
14
- "name": "Base64HighEntropyString",
15
- "limit": 4.5
16
- },
17
- {
18
- "name": "BasicAuthDetector"
19
- },
20
- {
21
- "name": "CloudantDetector"
22
- },
23
- {
24
- "name": "DiscordBotTokenDetector"
25
- },
26
- {
27
- "name": "GitHubTokenDetector"
28
- },
29
- {
30
- "name": "GitLabTokenDetector"
31
- },
32
- {
33
- "name": "HexHighEntropyString",
34
- "limit": 3.0
35
- },
36
- {
37
- "name": "IbmCloudIamDetector"
38
- },
39
- {
40
- "name": "IbmCosHmacDetector"
41
- },
42
- {
43
- "name": "IPPublicDetector"
44
- },
45
- {
46
- "name": "JwtTokenDetector"
47
- },
48
- {
49
- "name": "KeywordDetector",
50
- "keyword_exclude": ""
51
- },
52
- {
53
- "name": "MailchimpDetector"
54
- },
55
- {
56
- "name": "NpmDetector"
57
- },
58
- {
59
- "name": "OpenAIDetector"
60
- },
61
- {
62
- "name": "PrivateKeyDetector"
63
- },
64
- {
65
- "name": "PypiTokenDetector"
66
- },
67
- {
68
- "name": "SendGridDetector"
69
- },
70
- {
71
- "name": "SlackDetector"
72
- },
73
- {
74
- "name": "SoftlayerDetector"
75
- },
76
- {
77
- "name": "SquareOAuthDetector"
78
- },
79
- {
80
- "name": "StripeDetector"
81
- },
82
- {
83
- "name": "TelegramBotTokenDetector"
84
- },
85
- {
86
- "name": "TwilioKeyDetector"
87
- }
88
- ],
89
- "filters_used": [
90
- {
91
- "path": "detect_secrets.filters.allowlist.is_line_allowlisted"
92
- },
93
- {
94
- "path": "detect_secrets.filters.common.is_baseline_file",
95
- "filename": ".secrets.baseline"
96
- },
97
- {
98
- "path": "detect_secrets.filters.common.is_ignored_due_to_verification_policies",
99
- "min_level": 2
100
- },
101
- {
102
- "path": "detect_secrets.filters.heuristic.is_indirect_reference"
103
- },
104
- {
105
- "path": "detect_secrets.filters.heuristic.is_likely_id_string"
106
- },
107
- {
108
- "path": "detect_secrets.filters.heuristic.is_lock_file"
109
- },
110
- {
111
- "path": "detect_secrets.filters.heuristic.is_not_alphanumeric_string"
112
- },
113
- {
114
- "path": "detect_secrets.filters.heuristic.is_potential_uuid"
115
- },
116
- {
117
- "path": "detect_secrets.filters.heuristic.is_prefixed_with_dollar_sign"
118
- },
119
- {
120
- "path": "detect_secrets.filters.heuristic.is_sequential_string"
121
- },
122
- {
123
- "path": "detect_secrets.filters.heuristic.is_swagger_file"
124
- },
125
- {
126
- "path": "detect_secrets.filters.heuristic.is_templated_secret"
127
- },
128
- {
129
- "path": "detect_secrets.filters.regex.should_exclude_file",
130
- "pattern": [
131
- "(^|/)pnpm-lock\\.yaml$"
132
- ]
133
- },
134
- {
135
- "path": "detect_secrets.filters.regex.should_exclude_line",
136
- "pattern": [
137
- "key_content\\.include\\?\\(\"BEGIN PRIVATE KEY\"\\)",
138
- "case \\.apiKeyEnv: \"API key \\(env var\\)\"",
139
- "case apikey = \"apiKey\"",
140
- "\"gateway\\.remote\\.password\"",
141
- "\"gateway\\.auth\\.password\"",
142
- "\"talk\\.apiKey\"",
143
- "=== \"string\"",
144
- "typeof remote\\?\\.password === \"string\""
145
- ]
146
- }
147
- ],
148
- "results": {
149
- ".env.example": [
150
- {
151
- "type": "Twilio API Key",
152
- "filename": ".env.example",
153
- "hashed_secret": "3c7206eff845bc69cf12d904d0f95f9aec15535e",
154
- "is_verified": false,
155
- "line_number": 2
156
- }
157
- ],
158
- "appcast.xml": [
159
- {
160
- "type": "Base64 High Entropy String",
161
- "filename": "appcast.xml",
162
- "hashed_secret": "4e5f0a148d9ef42afeb73b1c77643e2ef2dee0b9",
163
- "is_verified": false,
164
- "line_number": 90
165
- },
166
- {
167
- "type": "Base64 High Entropy String",
168
- "filename": "appcast.xml",
169
- "hashed_secret": "f1ccdaf78c308ec2cf608818da13f5f1e4809ed1",
170
- "is_verified": false,
171
- "line_number": 138
172
- },
173
- {
174
- "type": "Base64 High Entropy String",
175
- "filename": "appcast.xml",
176
- "hashed_secret": "2691dc9c9ded92ba62a2d8ee589e2d78e2aa0479",
177
- "is_verified": false,
178
- "line_number": 212
179
- }
180
- ],
181
- "apps/macos/Tests/ClawdbotIPCTests/AnthropicAuthResolverTests.swift": [
182
- {
183
- "type": "Secret Keyword",
184
- "filename": "apps/macos/Tests/ClawdbotIPCTests/AnthropicAuthResolverTests.swift",
185
- "hashed_secret": "e761624445731fcb8b15da94343c6b92e507d190",
186
- "is_verified": false,
187
- "line_number": 26
188
- },
189
- {
190
- "type": "Secret Keyword",
191
- "filename": "apps/macos/Tests/ClawdbotIPCTests/AnthropicAuthResolverTests.swift",
192
- "hashed_secret": "a23c8630c8a5fbaa21f095e0269c135c20d21689",
193
- "is_verified": false,
194
- "line_number": 42
195
- }
196
- ],
197
- "apps/macos/Tests/ClawdbotIPCTests/GatewayEndpointStoreTests.swift": [
198
- {
199
- "type": "Secret Keyword",
200
- "filename": "apps/macos/Tests/ClawdbotIPCTests/GatewayEndpointStoreTests.swift",
201
- "hashed_secret": "19dad5cecb110281417d1db56b60e1b006d55bb4",
202
- "is_verified": false,
203
- "line_number": 61
204
- }
205
- ],
206
- "apps/macos/Tests/ClawdbotIPCTests/GatewayLaunchAgentManagerTests.swift": [
207
- {
208
- "type": "Secret Keyword",
209
- "filename": "apps/macos/Tests/ClawdbotIPCTests/GatewayLaunchAgentManagerTests.swift",
210
- "hashed_secret": "1a91d62f7ca67399625a4368a6ab5d4a3baa6073",
211
- "is_verified": false,
212
- "line_number": 13
213
- }
214
- ],
215
- "apps/macos/Tests/ClawdbotIPCTests/TailscaleIntegrationSectionTests.swift": [
216
- {
217
- "type": "Secret Keyword",
218
- "filename": "apps/macos/Tests/ClawdbotIPCTests/TailscaleIntegrationSectionTests.swift",
219
- "hashed_secret": "e5e9fa1ba31ecd1ae84f75caaa474f3a663f05f4",
220
- "is_verified": false,
221
- "line_number": 27
222
- }
223
- ],
224
- "apps/shared/ClawdbotKit/Sources/ClawdbotKit/GatewayChannel.swift": [
225
- {
226
- "type": "Secret Keyword",
227
- "filename": "apps/shared/ClawdbotKit/Sources/ClawdbotKit/GatewayChannel.swift",
228
- "hashed_secret": "5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8",
229
- "is_verified": false,
230
- "line_number": 100
231
- }
232
- ],
233
- "docs/brave-search.md": [
234
- {
235
- "type": "Secret Keyword",
236
- "filename": "docs/brave-search.md",
237
- "hashed_secret": "491d458f895b9213facb2ee9375b1b044eaea3ac",
238
- "is_verified": false,
239
- "line_number": 26
240
- }
241
- ],
242
- "docs/channels/bluebubbles.md": [
243
- {
244
- "type": "Secret Keyword",
245
- "filename": "docs/channels/bluebubbles.md",
246
- "hashed_secret": "555da20df20d4172e00f1b73d7c3943802055270",
247
- "is_verified": false,
248
- "line_number": 32
249
- }
250
- ],
251
- "docs/channels/matrix.md": [
252
- {
253
- "type": "Secret Keyword",
254
- "filename": "docs/channels/matrix.md",
255
- "hashed_secret": "45d676e7c6ab44cf4b8fa366ef2d8fccd3e6d6e6",
256
- "is_verified": false,
257
- "line_number": 58
258
- }
259
- ],
260
- "docs/channels/nextcloud-talk.md": [
261
- {
262
- "type": "Secret Keyword",
263
- "filename": "docs/channels/nextcloud-talk.md",
264
- "hashed_secret": "76ed0a056aa77060de25754586440cff390791d0",
265
- "is_verified": false,
266
- "line_number": 47
267
- }
268
- ],
269
- "docs/channels/nostr.md": [
270
- {
271
- "type": "Secret Keyword",
272
- "filename": "docs/channels/nostr.md",
273
- "hashed_secret": "edeb23e25a619c434d22bb7f1c3ca4841166b4e8",
274
- "is_verified": false,
275
- "line_number": 65
276
- }
277
- ],
278
- "docs/channels/slack.md": [
279
- {
280
- "type": "Secret Keyword",
281
- "filename": "docs/channels/slack.md",
282
- "hashed_secret": "3f4800fb7c1fb79a9a48bfd562d90bc6b2e2b718",
283
- "is_verified": false,
284
- "line_number": 141
285
- }
286
- ],
287
- "docs/concepts/memory.md": [
288
- {
289
- "type": "Secret Keyword",
290
- "filename": "docs/concepts/memory.md",
291
- "hashed_secret": "39d711243bfcee9fec8299b204e1aa9c3430fa12",
292
- "is_verified": false,
293
- "line_number": 108
294
- },
295
- {
296
- "type": "Secret Keyword",
297
- "filename": "docs/concepts/memory.md",
298
- "hashed_secret": "1a8abbf465c52363ab4c9c6ad945b8e857cbea55",
299
- "is_verified": false,
300
- "line_number": 131
301
- },
302
- {
303
- "type": "Secret Keyword",
304
- "filename": "docs/concepts/memory.md",
305
- "hashed_secret": "b9f640d6095b9f6b5a65983f7b76dbbb254e0044",
306
- "is_verified": false,
307
- "line_number": 373
308
- }
309
- ],
310
- "docs/concepts/model-providers.md": [
311
- {
312
- "type": "Secret Keyword",
313
- "filename": "docs/concepts/model-providers.md",
314
- "hashed_secret": "ec3810e10fb78db55ce38b9c18d1c3eb1db739e0",
315
- "is_verified": false,
316
- "line_number": 168
317
- },
318
- {
319
- "type": "Secret Keyword",
320
- "filename": "docs/concepts/model-providers.md",
321
- "hashed_secret": "ef83ad68b9b66e008727b7c417c6a8f618b5177e",
322
- "is_verified": false,
323
- "line_number": 255
324
- }
325
- ],
326
- "docs/environment.md": [
327
- {
328
- "type": "Secret Keyword",
329
- "filename": "docs/environment.md",
330
- "hashed_secret": "a219d7693c25cd2d93313512e200ff3eb374d281",
331
- "is_verified": false,
332
- "line_number": 29
333
- },
334
- {
335
- "type": "Secret Keyword",
336
- "filename": "docs/environment.md",
337
- "hashed_secret": "b6f56e5e92078ed7c078c46fbfeedcbe5719bc25",
338
- "is_verified": false,
339
- "line_number": 31
340
- }
341
- ],
342
- "docs/gateway/configuration-examples.md": [
343
- {
344
- "type": "Secret Keyword",
345
- "filename": "docs/gateway/configuration-examples.md",
346
- "hashed_secret": "a219d7693c25cd2d93313512e200ff3eb374d281",
347
- "is_verified": false,
348
- "line_number": 53
349
- },
350
- {
351
- "type": "Secret Keyword",
352
- "filename": "docs/gateway/configuration-examples.md",
353
- "hashed_secret": "b6f56e5e92078ed7c078c46fbfeedcbe5719bc25",
354
- "is_verified": false,
355
- "line_number": 55
356
- },
357
- {
358
- "type": "Secret Keyword",
359
- "filename": "docs/gateway/configuration-examples.md",
360
- "hashed_secret": "22af290a1a3d5e941193a41a3d3a9e4ca8da5e27",
361
- "is_verified": false,
362
- "line_number": 319
363
- },
364
- {
365
- "type": "Secret Keyword",
366
- "filename": "docs/gateway/configuration-examples.md",
367
- "hashed_secret": "c1e6ee547fd492df1441ac492e8bb294974712bd",
368
- "is_verified": false,
369
- "line_number": 414
370
- },
371
- {
372
- "type": "Secret Keyword",
373
- "filename": "docs/gateway/configuration-examples.md",
374
- "hashed_secret": "16c249e04e2be318050cb883c40137361c0c7209",
375
- "is_verified": false,
376
- "line_number": 548
377
- }
378
- ],
379
- "docs/gateway/configuration.md": [
380
- {
381
- "type": "Secret Keyword",
382
- "filename": "docs/gateway/configuration.md",
383
- "hashed_secret": "a219d7693c25cd2d93313512e200ff3eb374d281",
384
- "is_verified": false,
385
- "line_number": 272
386
- },
387
- {
388
- "type": "Secret Keyword",
389
- "filename": "docs/gateway/configuration.md",
390
- "hashed_secret": "b6f56e5e92078ed7c078c46fbfeedcbe5719bc25",
391
- "is_verified": false,
392
- "line_number": 274
393
- },
394
- {
395
- "type": "Secret Keyword",
396
- "filename": "docs/gateway/configuration.md",
397
- "hashed_secret": "e5e9fa1ba31ecd1ae84f75caaa474f3a663f05f4",
398
- "is_verified": false,
399
- "line_number": 1029
400
- },
401
- {
402
- "type": "Secret Keyword",
403
- "filename": "docs/gateway/configuration.md",
404
- "hashed_secret": "1188d5a8ed7edcff5144a9472af960243eacf12e",
405
- "is_verified": false,
406
- "line_number": 1470
407
- },
408
- {
409
- "type": "Secret Keyword",
410
- "filename": "docs/gateway/configuration.md",
411
- "hashed_secret": "bde4db9b4c3be4049adc3b9a69851d7c35119770",
412
- "is_verified": false,
413
- "line_number": 1486
414
- },
415
- {
416
- "type": "Secret Keyword",
417
- "filename": "docs/gateway/configuration.md",
418
- "hashed_secret": "22af290a1a3d5e941193a41a3d3a9e4ca8da5e27",
419
- "is_verified": false,
420
- "line_number": 2268
421
- },
422
- {
423
- "type": "Secret Keyword",
424
- "filename": "docs/gateway/configuration.md",
425
- "hashed_secret": "ec3810e10fb78db55ce38b9c18d1c3eb1db739e0",
426
- "is_verified": false,
427
- "line_number": 2344
428
- },
429
- {
430
- "type": "Secret Keyword",
431
- "filename": "docs/gateway/configuration.md",
432
- "hashed_secret": "c1e6ee547fd492df1441ac492e8bb294974712bd",
433
- "is_verified": false,
434
- "line_number": 2658
435
- },
436
- {
437
- "type": "Secret Keyword",
438
- "filename": "docs/gateway/configuration.md",
439
- "hashed_secret": "45d676e7c6ab44cf4b8fa366ef2d8fccd3e6d6e6",
440
- "is_verified": false,
441
- "line_number": 2844
442
- }
443
- ],
444
- "docs/gateway/local-models.md": [
445
- {
446
- "type": "Secret Keyword",
447
- "filename": "docs/gateway/local-models.md",
448
- "hashed_secret": "16c249e04e2be318050cb883c40137361c0c7209",
449
- "is_verified": false,
450
- "line_number": 32
451
- },
452
- {
453
- "type": "Secret Keyword",
454
- "filename": "docs/gateway/local-models.md",
455
- "hashed_secret": "49fd535e63175a827aab3eff9ac58a9e82460ac9",
456
- "is_verified": false,
457
- "line_number": 121
458
- }
459
- ],
460
- "docs/gateway/tailscale.md": [
461
- {
462
- "type": "Secret Keyword",
463
- "filename": "docs/gateway/tailscale.md",
464
- "hashed_secret": "9cb0dc5383312aa15b9dc6745645bde18ff5ade9",
465
- "is_verified": false,
466
- "line_number": 75
467
- }
468
- ],
469
- "docs/help/faq.md": [
470
- {
471
- "type": "Secret Keyword",
472
- "filename": "docs/help/faq.md",
473
- "hashed_secret": "491d458f895b9213facb2ee9375b1b044eaea3ac",
474
- "is_verified": false,
475
- "line_number": 925
476
- },
477
- {
478
- "type": "Secret Keyword",
479
- "filename": "docs/help/faq.md",
480
- "hashed_secret": "a219d7693c25cd2d93313512e200ff3eb374d281",
481
- "is_verified": false,
482
- "line_number": 1113
483
- },
484
- {
485
- "type": "Secret Keyword",
486
- "filename": "docs/help/faq.md",
487
- "hashed_secret": "b6f56e5e92078ed7c078c46fbfeedcbe5719bc25",
488
- "is_verified": false,
489
- "line_number": 1114
490
- },
491
- {
492
- "type": "Secret Keyword",
493
- "filename": "docs/help/faq.md",
494
- "hashed_secret": "ec3810e10fb78db55ce38b9c18d1c3eb1db739e0",
495
- "is_verified": false,
496
- "line_number": 1439
497
- },
498
- {
499
- "type": "Secret Keyword",
500
- "filename": "docs/help/faq.md",
501
- "hashed_secret": "45d676e7c6ab44cf4b8fa366ef2d8fccd3e6d6e6",
502
- "is_verified": false,
503
- "line_number": 1715
504
- }
505
- ],
506
- "docs/nodes/talk.md": [
507
- {
508
- "type": "Secret Keyword",
509
- "filename": "docs/nodes/talk.md",
510
- "hashed_secret": "1188d5a8ed7edcff5144a9472af960243eacf12e",
511
- "is_verified": false,
512
- "line_number": 50
513
- }
514
- ],
515
- "docs/perplexity.md": [
516
- {
517
- "type": "Secret Keyword",
518
- "filename": "docs/perplexity.md",
519
- "hashed_secret": "6b26c117c66a0c030e239eef595c1e18865132a8",
520
- "is_verified": false,
521
- "line_number": 35
522
- }
523
- ],
524
- "docs/providers/anthropic.md": [
525
- {
526
- "type": "Secret Keyword",
527
- "filename": "docs/providers/anthropic.md",
528
- "hashed_secret": "c7a8c334eef5d1749fface7d42c66f9ae5e8cf36",
529
- "is_verified": false,
530
- "line_number": 32
531
- }
532
- ],
533
- "docs/providers/glm.md": [
534
- {
535
- "type": "Secret Keyword",
536
- "filename": "docs/providers/glm.md",
537
- "hashed_secret": "ec3810e10fb78db55ce38b9c18d1c3eb1db739e0",
538
- "is_verified": false,
539
- "line_number": 22
540
- }
541
- ],
542
- "docs/providers/minimax.md": [
543
- {
544
- "type": "Secret Keyword",
545
- "filename": "docs/providers/minimax.md",
546
- "hashed_secret": "ec3810e10fb78db55ce38b9c18d1c3eb1db739e0",
547
- "is_verified": false,
548
- "line_number": 49
549
- },
550
- {
551
- "type": "Secret Keyword",
552
- "filename": "docs/providers/minimax.md",
553
- "hashed_secret": "16c249e04e2be318050cb883c40137361c0c7209",
554
- "is_verified": false,
555
- "line_number": 118
556
- }
557
- ],
558
- "docs/providers/moonshot.md": [
559
- {
560
- "type": "Secret Keyword",
561
- "filename": "docs/providers/moonshot.md",
562
- "hashed_secret": "ec3810e10fb78db55ce38b9c18d1c3eb1db739e0",
563
- "is_verified": false,
564
- "line_number": 39
565
- }
566
- ],
567
- "docs/providers/openai.md": [
568
- {
569
- "type": "Secret Keyword",
570
- "filename": "docs/providers/openai.md",
571
- "hashed_secret": "ec3810e10fb78db55ce38b9c18d1c3eb1db739e0",
572
- "is_verified": false,
573
- "line_number": 31
574
- }
575
- ],
576
- "docs/providers/opencode.md": [
577
- {
578
- "type": "Secret Keyword",
579
- "filename": "docs/providers/opencode.md",
580
- "hashed_secret": "ec3810e10fb78db55ce38b9c18d1c3eb1db739e0",
581
- "is_verified": false,
582
- "line_number": 25
583
- }
584
- ],
585
- "docs/providers/openrouter.md": [
586
- {
587
- "type": "Secret Keyword",
588
- "filename": "docs/providers/openrouter.md",
589
- "hashed_secret": "a219d7693c25cd2d93313512e200ff3eb374d281",
590
- "is_verified": false,
591
- "line_number": 22
592
- }
593
- ],
594
- "docs/providers/synthetic.md": [
595
- {
596
- "type": "Secret Keyword",
597
- "filename": "docs/providers/synthetic.md",
598
- "hashed_secret": "ec3810e10fb78db55ce38b9c18d1c3eb1db739e0",
599
- "is_verified": false,
600
- "line_number": 31
601
- }
602
- ],
603
- "docs/providers/zai.md": [
604
- {
605
- "type": "Secret Keyword",
606
- "filename": "docs/providers/zai.md",
607
- "hashed_secret": "ec3810e10fb78db55ce38b9c18d1c3eb1db739e0",
608
- "is_verified": false,
609
- "line_number": 25
610
- }
611
- ],
612
- "docs/tools/browser.md": [
613
- {
614
- "type": "Basic Auth Credentials",
615
- "filename": "docs/tools/browser.md",
616
- "hashed_secret": "9d4e1e23bd5b727046a9e3b4b7db57bd8d6ee684",
617
- "is_verified": false,
618
- "line_number": 163
619
- }
620
- ],
621
- "docs/tools/firecrawl.md": [
622
- {
623
- "type": "Secret Keyword",
624
- "filename": "docs/tools/firecrawl.md",
625
- "hashed_secret": "674397e2c0c2faaa85961c708d2a96a7cc7af217",
626
- "is_verified": false,
627
- "line_number": 28
628
- }
629
- ],
630
- "docs/tools/skills-config.md": [
631
- {
632
- "type": "Secret Keyword",
633
- "filename": "docs/tools/skills-config.md",
634
- "hashed_secret": "c1e6ee547fd492df1441ac492e8bb294974712bd",
635
- "is_verified": false,
636
- "line_number": 30
637
- }
638
- ],
639
- "docs/tools/skills.md": [
640
- {
641
- "type": "Secret Keyword",
642
- "filename": "docs/tools/skills.md",
643
- "hashed_secret": "c1e6ee547fd492df1441ac492e8bb294974712bd",
644
- "is_verified": false,
645
- "line_number": 160
646
- }
647
- ],
648
- "docs/tools/web.md": [
649
- {
650
- "type": "Secret Keyword",
651
- "filename": "docs/tools/web.md",
652
- "hashed_secret": "6b26c117c66a0c030e239eef595c1e18865132a8",
653
- "is_verified": false,
654
- "line_number": 61
655
- },
656
- {
657
- "type": "Secret Keyword",
658
- "filename": "docs/tools/web.md",
659
- "hashed_secret": "96c682c88ed551f22fe76d206c2dfb7df9221ad9",
660
- "is_verified": false,
661
- "line_number": 112
662
- },
663
- {
664
- "type": "Secret Keyword",
665
- "filename": "docs/tools/web.md",
666
- "hashed_secret": "491d458f895b9213facb2ee9375b1b044eaea3ac",
667
- "is_verified": false,
668
- "line_number": 160
669
- },
670
- {
671
- "type": "Secret Keyword",
672
- "filename": "docs/tools/web.md",
673
- "hashed_secret": "674397e2c0c2faaa85961c708d2a96a7cc7af217",
674
- "is_verified": false,
675
- "line_number": 223
676
- }
677
- ],
678
- "docs/tts.md": [
679
- {
680
- "type": "Secret Keyword",
681
- "filename": "docs/tts.md",
682
- "hashed_secret": "bde4db9b4c3be4049adc3b9a69851d7c35119770",
683
- "is_verified": false,
684
- "line_number": 72
685
- },
686
- {
687
- "type": "Secret Keyword",
688
- "filename": "docs/tts.md",
689
- "hashed_secret": "1188d5a8ed7edcff5144a9472af960243eacf12e",
690
- "is_verified": false,
691
- "line_number": 77
692
- }
693
- ],
694
- "extensions/bluebubbles/src/actions.test.ts": [
695
- {
696
- "type": "Secret Keyword",
697
- "filename": "extensions/bluebubbles/src/actions.test.ts",
698
- "hashed_secret": "789cbe0407840b1c2041cb33452ff60f19bf58cc",
699
- "is_verified": false,
700
- "line_number": 73
701
- }
702
- ],
703
- "extensions/bluebubbles/src/attachments.test.ts": [
704
- {
705
- "type": "Secret Keyword",
706
- "filename": "extensions/bluebubbles/src/attachments.test.ts",
707
- "hashed_secret": "789cbe0407840b1c2041cb33452ff60f19bf58cc",
708
- "is_verified": false,
709
- "line_number": 35
710
- },
711
- {
712
- "type": "Secret Keyword",
713
- "filename": "extensions/bluebubbles/src/attachments.test.ts",
714
- "hashed_secret": "db1530e1ea43af094d3d75b8dbaf19a4a182a318",
715
- "is_verified": false,
716
- "line_number": 99
717
- },
718
- {
719
- "type": "Secret Keyword",
720
- "filename": "extensions/bluebubbles/src/attachments.test.ts",
721
- "hashed_secret": "a94a8fe5ccb19ba61c4c0873d391e987982fbbd3",
722
- "is_verified": false,
723
- "line_number": 117
724
- },
725
- {
726
- "type": "Secret Keyword",
727
- "filename": "extensions/bluebubbles/src/attachments.test.ts",
728
- "hashed_secret": "052f076c732648ab32d2fcde9fe255319bfa0c7b",
729
- "is_verified": false,
730
- "line_number": 229
731
- }
732
- ],
733
- "extensions/bluebubbles/src/chat.test.ts": [
734
- {
735
- "type": "Secret Keyword",
736
- "filename": "extensions/bluebubbles/src/chat.test.ts",
737
- "hashed_secret": "a94a8fe5ccb19ba61c4c0873d391e987982fbbd3",
738
- "is_verified": false,
739
- "line_number": 33
740
- },
741
- {
742
- "type": "Secret Keyword",
743
- "filename": "extensions/bluebubbles/src/chat.test.ts",
744
- "hashed_secret": "789cbe0407840b1c2041cb33452ff60f19bf58cc",
745
- "is_verified": false,
746
- "line_number": 68
747
- },
748
- {
749
- "type": "Secret Keyword",
750
- "filename": "extensions/bluebubbles/src/chat.test.ts",
751
- "hashed_secret": "5c5a15a8b0b3e154d77746945e563ba40100681b",
752
- "is_verified": false,
753
- "line_number": 85
754
- },
755
- {
756
- "type": "Secret Keyword",
757
- "filename": "extensions/bluebubbles/src/chat.test.ts",
758
- "hashed_secret": "faacad0ce4ea1c19b46e128fd79679d37d3d331d",
759
- "is_verified": false,
760
- "line_number": 134
761
- },
762
- {
763
- "type": "Secret Keyword",
764
- "filename": "extensions/bluebubbles/src/chat.test.ts",
765
- "hashed_secret": "4dcc26a1d99532846fedf1265df4f40f4e0005b8",
766
- "is_verified": false,
767
- "line_number": 219
768
- },
769
- {
770
- "type": "Secret Keyword",
771
- "filename": "extensions/bluebubbles/src/chat.test.ts",
772
- "hashed_secret": "fd2a721f7be1ee3d691a011affcdb11d0ca365a8",
773
- "is_verified": false,
774
- "line_number": 282
775
- }
776
- ],
777
- "extensions/bluebubbles/src/monitor.test.ts": [
778
- {
779
- "type": "Secret Keyword",
780
- "filename": "extensions/bluebubbles/src/monitor.test.ts",
781
- "hashed_secret": "789cbe0407840b1c2041cb33452ff60f19bf58cc",
782
- "is_verified": false,
783
- "line_number": 187
784
- },
785
- {
786
- "type": "Secret Keyword",
787
- "filename": "extensions/bluebubbles/src/monitor.test.ts",
788
- "hashed_secret": "1ae0af3fe72b3ba394f9fa95a6cffc090d726c23",
789
- "is_verified": false,
790
- "line_number": 394
791
- }
792
- ],
793
- "extensions/bluebubbles/src/reactions.test.ts": [
794
- {
795
- "type": "Secret Keyword",
796
- "filename": "extensions/bluebubbles/src/reactions.test.ts",
797
- "hashed_secret": "a94a8fe5ccb19ba61c4c0873d391e987982fbbd3",
798
- "is_verified": false,
799
- "line_number": 38
800
- },
801
- {
802
- "type": "Secret Keyword",
803
- "filename": "extensions/bluebubbles/src/reactions.test.ts",
804
- "hashed_secret": "789cbe0407840b1c2041cb33452ff60f19bf58cc",
805
- "is_verified": false,
806
- "line_number": 179
807
- },
808
- {
809
- "type": "Secret Keyword",
810
- "filename": "extensions/bluebubbles/src/reactions.test.ts",
811
- "hashed_secret": "a4a05c9a6449eb9d6cdac81dd7edc49230e327e6",
812
- "is_verified": false,
813
- "line_number": 210
814
- },
815
- {
816
- "type": "Secret Keyword",
817
- "filename": "extensions/bluebubbles/src/reactions.test.ts",
818
- "hashed_secret": "a2833da9f0a16f09994754d0a31749cecf8c8c77",
819
- "is_verified": false,
820
- "line_number": 316
821
- }
822
- ],
823
- "extensions/bluebubbles/src/send.test.ts": [
824
- {
825
- "type": "Secret Keyword",
826
- "filename": "extensions/bluebubbles/src/send.test.ts",
827
- "hashed_secret": "a94a8fe5ccb19ba61c4c0873d391e987982fbbd3",
828
- "is_verified": false,
829
- "line_number": 38
830
- },
831
- {
832
- "type": "Secret Keyword",
833
- "filename": "extensions/bluebubbles/src/send.test.ts",
834
- "hashed_secret": "faacad0ce4ea1c19b46e128fd79679d37d3d331d",
835
- "is_verified": false,
836
- "line_number": 675
837
- }
838
- ],
839
- "extensions/bluebubbles/src/targets.test.ts": [
840
- {
841
- "type": "Hex High Entropy String",
842
- "filename": "extensions/bluebubbles/src/targets.test.ts",
843
- "hashed_secret": "a3af2fb0c1e2a30bb038049e1e4b401593af6225",
844
- "is_verified": false,
845
- "line_number": 62
846
- }
847
- ],
848
- "extensions/bluebubbles/src/targets.ts": [
849
- {
850
- "type": "Hex High Entropy String",
851
- "filename": "extensions/bluebubbles/src/targets.ts",
852
- "hashed_secret": "a3af2fb0c1e2a30bb038049e1e4b401593af6225",
853
- "is_verified": false,
854
- "line_number": 214
855
- }
856
- ],
857
- "extensions/copilot-proxy/index.ts": [
858
- {
859
- "type": "Secret Keyword",
860
- "filename": "extensions/copilot-proxy/index.ts",
861
- "hashed_secret": "50f013532a9770a2c2cfdc38b7581dd01df69b70",
862
- "is_verified": false,
863
- "line_number": 4
864
- }
865
- ],
866
- "extensions/google-antigravity-auth/index.ts": [
867
- {
868
- "type": "Base64 High Entropy String",
869
- "filename": "extensions/google-antigravity-auth/index.ts",
870
- "hashed_secret": "709d0f232b6ac4f8d24dec3e4fabfdb14257174f",
871
- "is_verified": false,
872
- "line_number": 9
873
- }
874
- ],
875
- "extensions/matrix/src/matrix/accounts.test.ts": [
876
- {
877
- "type": "Secret Keyword",
878
- "filename": "extensions/matrix/src/matrix/accounts.test.ts",
879
- "hashed_secret": "e5e9fa1ba31ecd1ae84f75caaa474f3a663f05f4",
880
- "is_verified": false,
881
- "line_number": 75
882
- }
883
- ],
884
- "extensions/matrix/src/matrix/client.test.ts": [
885
- {
886
- "type": "Secret Keyword",
887
- "filename": "extensions/matrix/src/matrix/client.test.ts",
888
- "hashed_secret": "fe7fcdaea49ece14677acd32374d2f1225819d5c",
889
- "is_verified": false,
890
- "line_number": 14
891
- },
892
- {
893
- "type": "Secret Keyword",
894
- "filename": "extensions/matrix/src/matrix/client.test.ts",
895
- "hashed_secret": "3dc927d80543dc0f643940b70d066bd4b4c4b78e",
896
- "is_verified": false,
897
- "line_number": 24
898
- }
899
- ],
900
- "extensions/matrix/src/matrix/client/storage.ts": [
901
- {
902
- "type": "Secret Keyword",
903
- "filename": "extensions/matrix/src/matrix/client/storage.ts",
904
- "hashed_secret": "7505d64a54e061b7acd54ccd58b49dc43500b635",
905
- "is_verified": false,
906
- "line_number": 9
907
- }
908
- ],
909
- "extensions/memory-lancedb/config.ts": [
910
- {
911
- "type": "Secret Keyword",
912
- "filename": "extensions/memory-lancedb/config.ts",
913
- "hashed_secret": "ecb252044b5ea0f679ee78ec1a12904739e2904d",
914
- "is_verified": false,
915
- "line_number": 70
916
- }
917
- ],
918
- "extensions/memory-lancedb/index.test.ts": [
919
- {
920
- "type": "Secret Keyword",
921
- "filename": "extensions/memory-lancedb/index.test.ts",
922
- "hashed_secret": "ed65c049bb2f78ee4f703b2158ba9cc6ea31fb7e",
923
- "is_verified": false,
924
- "line_number": 70
925
- }
926
- ],
927
- "extensions/msteams/src/probe.test.ts": [
928
- {
929
- "type": "Secret Keyword",
930
- "filename": "extensions/msteams/src/probe.test.ts",
931
- "hashed_secret": "1a91d62f7ca67399625a4368a6ab5d4a3baa6073",
932
- "is_verified": false,
933
- "line_number": 34
934
- }
935
- ],
936
- "extensions/nextcloud-talk/src/accounts.ts": [
937
- {
938
- "type": "Secret Keyword",
939
- "filename": "extensions/nextcloud-talk/src/accounts.ts",
940
- "hashed_secret": "920f8f5815b381ea692e9e7c2f7119f2b1aa620a",
941
- "is_verified": false,
942
- "line_number": 26
943
- },
944
- {
945
- "type": "Secret Keyword",
946
- "filename": "extensions/nextcloud-talk/src/accounts.ts",
947
- "hashed_secret": "71f8e7976e4cbc4561c9d62fb283e7f788202acb",
948
- "is_verified": false,
949
- "line_number": 139
950
- }
951
- ],
952
- "extensions/nextcloud-talk/src/channel.ts": [
953
- {
954
- "type": "Secret Keyword",
955
- "filename": "extensions/nextcloud-talk/src/channel.ts",
956
- "hashed_secret": "71f8e7976e4cbc4561c9d62fb283e7f788202acb",
957
- "is_verified": false,
958
- "line_number": 390
959
- }
960
- ],
961
- "extensions/nostr/README.md": [
962
- {
963
- "type": "Secret Keyword",
964
- "filename": "extensions/nostr/README.md",
965
- "hashed_secret": "edeb23e25a619c434d22bb7f1c3ca4841166b4e8",
966
- "is_verified": false,
967
- "line_number": 43
968
- }
969
- ],
970
- "extensions/nostr/src/channel.test.ts": [
971
- {
972
- "type": "Hex High Entropy String",
973
- "filename": "extensions/nostr/src/channel.test.ts",
974
- "hashed_secret": "ce4303f6b22257d9c9cf314ef1dee4707c6e1c13",
975
- "is_verified": false,
976
- "line_number": 48
977
- },
978
- {
979
- "type": "Secret Keyword",
980
- "filename": "extensions/nostr/src/channel.test.ts",
981
- "hashed_secret": "ce4303f6b22257d9c9cf314ef1dee4707c6e1c13",
982
- "is_verified": false,
983
- "line_number": 48
984
- }
985
- ],
986
- "extensions/nostr/src/nostr-bus.fuzz.test.ts": [
987
- {
988
- "type": "Hex High Entropy String",
989
- "filename": "extensions/nostr/src/nostr-bus.fuzz.test.ts",
990
- "hashed_secret": "2b4489606a23fb31fcdc849fa7e577ba90f6d39a",
991
- "is_verified": false,
992
- "line_number": 202
993
- },
994
- {
995
- "type": "Hex High Entropy String",
996
- "filename": "extensions/nostr/src/nostr-bus.fuzz.test.ts",
997
- "hashed_secret": "ce4303f6b22257d9c9cf314ef1dee4707c6e1c13",
998
- "is_verified": false,
999
- "line_number": 203
1000
- },
1001
- {
1002
- "type": "Hex High Entropy String",
1003
- "filename": "extensions/nostr/src/nostr-bus.fuzz.test.ts",
1004
- "hashed_secret": "b84cb0c3925d34496e6c8b0e55b8c1664a438035",
1005
- "is_verified": false,
1006
- "line_number": 208
1007
- }
1008
- ],
1009
- "extensions/nostr/src/nostr-bus.test.ts": [
1010
- {
1011
- "type": "Hex High Entropy String",
1012
- "filename": "extensions/nostr/src/nostr-bus.test.ts",
1013
- "hashed_secret": "ce4303f6b22257d9c9cf314ef1dee4707c6e1c13",
1014
- "is_verified": false,
1015
- "line_number": 11
1016
- },
1017
- {
1018
- "type": "Hex High Entropy String",
1019
- "filename": "extensions/nostr/src/nostr-bus.test.ts",
1020
- "hashed_secret": "7258e28563f03fb4c5994e8402e6f610d1f0f110",
1021
- "is_verified": false,
1022
- "line_number": 33
1023
- },
1024
- {
1025
- "type": "Hex High Entropy String",
1026
- "filename": "extensions/nostr/src/nostr-bus.test.ts",
1027
- "hashed_secret": "2b4489606a23fb31fcdc849fa7e577ba90f6d39a",
1028
- "is_verified": false,
1029
- "line_number": 101
1030
- },
1031
- {
1032
- "type": "Hex High Entropy String",
1033
- "filename": "extensions/nostr/src/nostr-bus.test.ts",
1034
- "hashed_secret": "ef717286343f6da3f4e6f68c6de02a5148a801c4",
1035
- "is_verified": false,
1036
- "line_number": 106
1037
- },
1038
- {
1039
- "type": "Hex High Entropy String",
1040
- "filename": "extensions/nostr/src/nostr-bus.test.ts",
1041
- "hashed_secret": "98b35fe4c45011220f509ebb5546d3889b55a891",
1042
- "is_verified": false,
1043
- "line_number": 111
1044
- }
1045
- ],
1046
- "extensions/nostr/src/nostr-profile.fuzz.test.ts": [
1047
- {
1048
- "type": "Hex High Entropy String",
1049
- "filename": "extensions/nostr/src/nostr-profile.fuzz.test.ts",
1050
- "hashed_secret": "ce4303f6b22257d9c9cf314ef1dee4707c6e1c13",
1051
- "is_verified": false,
1052
- "line_number": 12
1053
- }
1054
- ],
1055
- "extensions/nostr/src/nostr-profile.test.ts": [
1056
- {
1057
- "type": "Hex High Entropy String",
1058
- "filename": "extensions/nostr/src/nostr-profile.test.ts",
1059
- "hashed_secret": "ce4303f6b22257d9c9cf314ef1dee4707c6e1c13",
1060
- "is_verified": false,
1061
- "line_number": 14
1062
- }
1063
- ],
1064
- "extensions/nostr/src/types.test.ts": [
1065
- {
1066
- "type": "Hex High Entropy String",
1067
- "filename": "extensions/nostr/src/types.test.ts",
1068
- "hashed_secret": "ce4303f6b22257d9c9cf314ef1dee4707c6e1c13",
1069
- "is_verified": false,
1070
- "line_number": 8
1071
- },
1072
- {
1073
- "type": "Secret Keyword",
1074
- "filename": "extensions/nostr/src/types.test.ts",
1075
- "hashed_secret": "ce4303f6b22257d9c9cf314ef1dee4707c6e1c13",
1076
- "is_verified": false,
1077
- "line_number": 8
1078
- },
1079
- {
1080
- "type": "Secret Keyword",
1081
- "filename": "extensions/nostr/src/types.test.ts",
1082
- "hashed_secret": "3bee216ebc256d692260fc3adc765050508fef5e",
1083
- "is_verified": false,
1084
- "line_number": 127
1085
- }
1086
- ],
1087
- "extensions/open-prose/skills/prose/SKILL.md": [
1088
- {
1089
- "type": "Basic Auth Credentials",
1090
- "filename": "extensions/open-prose/skills/prose/SKILL.md",
1091
- "hashed_secret": "9d4e1e23bd5b727046a9e3b4b7db57bd8d6ee684",
1092
- "is_verified": false,
1093
- "line_number": 200
1094
- }
1095
- ],
1096
- "extensions/open-prose/skills/prose/state/postgres.md": [
1097
- {
1098
- "type": "Secret Keyword",
1099
- "filename": "extensions/open-prose/skills/prose/state/postgres.md",
1100
- "hashed_secret": "fa9beb99e4029ad5a6615399e7bbae21356086b3",
1101
- "is_verified": false,
1102
- "line_number": 75
1103
- },
1104
- {
1105
- "type": "Basic Auth Credentials",
1106
- "filename": "extensions/open-prose/skills/prose/state/postgres.md",
1107
- "hashed_secret": "9d4e1e23bd5b727046a9e3b4b7db57bd8d6ee684",
1108
- "is_verified": false,
1109
- "line_number": 198
1110
- }
1111
- ],
1112
- "extensions/zalo/README.md": [
1113
- {
1114
- "type": "Secret Keyword",
1115
- "filename": "extensions/zalo/README.md",
1116
- "hashed_secret": "f51aaee16a4a756d287f126b99c081b73cba7f15",
1117
- "is_verified": false,
1118
- "line_number": 41
1119
- }
1120
- ],
1121
- "extensions/zalo/src/monitor.webhook.test.ts": [
1122
- {
1123
- "type": "Secret Keyword",
1124
- "filename": "extensions/zalo/src/monitor.webhook.test.ts",
1125
- "hashed_secret": "e5e9fa1ba31ecd1ae84f75caaa474f3a663f05f4",
1126
- "is_verified": false,
1127
- "line_number": 43
1128
- }
1129
- ],
1130
- "skills/1password/references/cli-examples.md": [
1131
- {
1132
- "type": "Secret Keyword",
1133
- "filename": "skills/1password/references/cli-examples.md",
1134
- "hashed_secret": "9dda0987cc3054773a2df97e352d4f64d233ef10",
1135
- "is_verified": false,
1136
- "line_number": 17
1137
- }
1138
- ],
1139
- "skills/local-places/SERVER_README.md": [
1140
- {
1141
- "type": "Secret Keyword",
1142
- "filename": "skills/local-places/SERVER_README.md",
1143
- "hashed_secret": "6d9c68c603e465077bdd49c62347fe54717f83a3",
1144
- "is_verified": false,
1145
- "line_number": 28
1146
- }
1147
- ],
1148
- "skills/openai-whisper-api/SKILL.md": [
1149
- {
1150
- "type": "Secret Keyword",
1151
- "filename": "skills/openai-whisper-api/SKILL.md",
1152
- "hashed_secret": "1077361f94d70e1ddcc7c6dc581a489532a81d03",
1153
- "is_verified": false,
1154
- "line_number": 39
1155
- }
1156
- ],
1157
- "skills/trello/SKILL.md": [
1158
- {
1159
- "type": "Secret Keyword",
1160
- "filename": "skills/trello/SKILL.md",
1161
- "hashed_secret": "11fa7c37d697f30e6aee828b4426a10f83ab2380",
1162
- "is_verified": false,
1163
- "line_number": 18
1164
- }
1165
- ],
1166
- "src/agents/memory-search.test.ts": [
1167
- {
1168
- "type": "Secret Keyword",
1169
- "filename": "src/agents/memory-search.test.ts",
1170
- "hashed_secret": "a1b49d68a91fdf9c9217773f3fac988d77fa0f50",
1171
- "is_verified": false,
1172
- "line_number": 164
1173
- }
1174
- ],
1175
- "src/agents/model-auth.test.ts": [
1176
- {
1177
- "type": "Secret Keyword",
1178
- "filename": "src/agents/model-auth.test.ts",
1179
- "hashed_secret": "07a6b9cec637c806195e8aa7e5c0851ab03dc35e",
1180
- "is_verified": false,
1181
- "line_number": 211
1182
- },
1183
- {
1184
- "type": "Secret Keyword",
1185
- "filename": "src/agents/model-auth.test.ts",
1186
- "hashed_secret": "21f296583ccd80c5ab9b3330a8b0d47e4a409fb9",
1187
- "is_verified": false,
1188
- "line_number": 240
1189
- },
1190
- {
1191
- "type": "Secret Keyword",
1192
- "filename": "src/agents/model-auth.test.ts",
1193
- "hashed_secret": "77e991e9f56e6fa4ed1a908208048421f1214c07",
1194
- "is_verified": false,
1195
- "line_number": 264
1196
- },
1197
- {
1198
- "type": "Secret Keyword",
1199
- "filename": "src/agents/model-auth.test.ts",
1200
- "hashed_secret": "dff6d4ff5dc357cf451d1855ab9cbda562645c9f",
1201
- "is_verified": false,
1202
- "line_number": 295
1203
- }
1204
- ],
1205
- "src/agents/model-auth.ts": [
1206
- {
1207
- "type": "Secret Keyword",
1208
- "filename": "src/agents/model-auth.ts",
1209
- "hashed_secret": "8956265d216d474a080edaa97880d37fc1386f33",
1210
- "is_verified": false,
1211
- "line_number": 22
1212
- }
1213
- ],
1214
- "src/agents/models-config.auto-injects-github-copilot-provider-token-is.test.ts": [
1215
- {
1216
- "type": "Secret Keyword",
1217
- "filename": "src/agents/models-config.auto-injects-github-copilot-provider-token-is.test.ts",
1218
- "hashed_secret": "7cf31e8b6cda49f70c31f1f25af05d46f924142d",
1219
- "is_verified": false,
1220
- "line_number": 16
1221
- }
1222
- ],
1223
- "src/agents/models-config.falls-back-default-baseurl-token-exchange-fails.test.ts": [
1224
- {
1225
- "type": "Secret Keyword",
1226
- "filename": "src/agents/models-config.falls-back-default-baseurl-token-exchange-fails.test.ts",
1227
- "hashed_secret": "7cf31e8b6cda49f70c31f1f25af05d46f924142d",
1228
- "is_verified": false,
1229
- "line_number": 16
1230
- }
1231
- ],
1232
- "src/agents/models-config.fills-missing-provider-apikey-from-env-var.test.ts": [
1233
- {
1234
- "type": "Secret Keyword",
1235
- "filename": "src/agents/models-config.fills-missing-provider-apikey-from-env-var.test.ts",
1236
- "hashed_secret": "7cf31e8b6cda49f70c31f1f25af05d46f924142d",
1237
- "is_verified": false,
1238
- "line_number": 16
1239
- },
1240
- {
1241
- "type": "Secret Keyword",
1242
- "filename": "src/agents/models-config.fills-missing-provider-apikey-from-env-var.test.ts",
1243
- "hashed_secret": "fcdd655b11f33ba4327695084a347b2ba192976c",
1244
- "is_verified": false,
1245
- "line_number": 50
1246
- },
1247
- {
1248
- "type": "Secret Keyword",
1249
- "filename": "src/agents/models-config.fills-missing-provider-apikey-from-env-var.test.ts",
1250
- "hashed_secret": "3a81eb091f80c845232225be5663d270e90dacb7",
1251
- "is_verified": false,
1252
- "line_number": 108
1253
- }
1254
- ],
1255
- "src/agents/models-config.normalizes-gemini-3-ids-preview-google-providers.test.ts": [
1256
- {
1257
- "type": "Secret Keyword",
1258
- "filename": "src/agents/models-config.normalizes-gemini-3-ids-preview-google-providers.test.ts",
1259
- "hashed_secret": "7cf31e8b6cda49f70c31f1f25af05d46f924142d",
1260
- "is_verified": false,
1261
- "line_number": 16
1262
- },
1263
- {
1264
- "type": "Secret Keyword",
1265
- "filename": "src/agents/models-config.normalizes-gemini-3-ids-preview-google-providers.test.ts",
1266
- "hashed_secret": "980d02eb9335ae7c9e9984f6c8ad432352a0d2ac",
1267
- "is_verified": false,
1268
- "line_number": 57
1269
- }
1270
- ],
1271
- "src/agents/models-config.skips-writing-models-json-no-env-token.test.ts": [
1272
- {
1273
- "type": "Secret Keyword",
1274
- "filename": "src/agents/models-config.skips-writing-models-json-no-env-token.test.ts",
1275
- "hashed_secret": "7cf31e8b6cda49f70c31f1f25af05d46f924142d",
1276
- "is_verified": false,
1277
- "line_number": 16
1278
- },
1279
- {
1280
- "type": "Secret Keyword",
1281
- "filename": "src/agents/models-config.skips-writing-models-json-no-env-token.test.ts",
1282
- "hashed_secret": "fcdd655b11f33ba4327695084a347b2ba192976c",
1283
- "is_verified": false,
1284
- "line_number": 112
1285
- },
1286
- {
1287
- "type": "Secret Keyword",
1288
- "filename": "src/agents/models-config.skips-writing-models-json-no-env-token.test.ts",
1289
- "hashed_secret": "94c4be5a1976115e8152960c21e04400a4fccdf6",
1290
- "is_verified": false,
1291
- "line_number": 146
1292
- }
1293
- ],
1294
- "src/agents/models-config.uses-first-github-copilot-profile-env-tokens.test.ts": [
1295
- {
1296
- "type": "Secret Keyword",
1297
- "filename": "src/agents/models-config.uses-first-github-copilot-profile-env-tokens.test.ts",
1298
- "hashed_secret": "7cf31e8b6cda49f70c31f1f25af05d46f924142d",
1299
- "is_verified": false,
1300
- "line_number": 16
1301
- }
1302
- ],
1303
- "src/agents/openai-responses.reasoning-replay.test.ts": [
1304
- {
1305
- "type": "Secret Keyword",
1306
- "filename": "src/agents/openai-responses.reasoning-replay.test.ts",
1307
- "hashed_secret": "a94a8fe5ccb19ba61c4c0873d391e987982fbbd3",
1308
- "is_verified": false,
1309
- "line_number": 124
1310
- }
1311
- ],
1312
- "src/agents/pi-embedded-runner.applygoogleturnorderingfix.test.ts": [
1313
- {
1314
- "type": "Secret Keyword",
1315
- "filename": "src/agents/pi-embedded-runner.applygoogleturnorderingfix.test.ts",
1316
- "hashed_secret": "e9a5f12a8ecbb3eb46eca5096b5c52aa5e7c9fdd",
1317
- "is_verified": false,
1318
- "line_number": 58
1319
- }
1320
- ],
1321
- "src/agents/pi-embedded-runner.buildembeddedsandboxinfo.test.ts": [
1322
- {
1323
- "type": "Secret Keyword",
1324
- "filename": "src/agents/pi-embedded-runner.buildembeddedsandboxinfo.test.ts",
1325
- "hashed_secret": "e9a5f12a8ecbb3eb46eca5096b5c52aa5e7c9fdd",
1326
- "is_verified": false,
1327
- "line_number": 57
1328
- }
1329
- ],
1330
- "src/agents/pi-embedded-runner.createsystempromptoverride.test.ts": [
1331
- {
1332
- "type": "Secret Keyword",
1333
- "filename": "src/agents/pi-embedded-runner.createsystempromptoverride.test.ts",
1334
- "hashed_secret": "e9a5f12a8ecbb3eb46eca5096b5c52aa5e7c9fdd",
1335
- "is_verified": false,
1336
- "line_number": 56
1337
- }
1338
- ],
1339
- "src/agents/pi-embedded-runner.get-dm-history-limit-from-session-key.falls-back-provider-default-per-dm-not.test.ts": [
1340
- {
1341
- "type": "Secret Keyword",
1342
- "filename": "src/agents/pi-embedded-runner.get-dm-history-limit-from-session-key.falls-back-provider-default-per-dm-not.test.ts",
1343
- "hashed_secret": "e9a5f12a8ecbb3eb46eca5096b5c52aa5e7c9fdd",
1344
- "is_verified": false,
1345
- "line_number": 56
1346
- }
1347
- ],
1348
- "src/agents/pi-embedded-runner.get-dm-history-limit-from-session-key.returns-undefined-sessionkey-is-undefined.test.ts": [
1349
- {
1350
- "type": "Secret Keyword",
1351
- "filename": "src/agents/pi-embedded-runner.get-dm-history-limit-from-session-key.returns-undefined-sessionkey-is-undefined.test.ts",
1352
- "hashed_secret": "e9a5f12a8ecbb3eb46eca5096b5c52aa5e7c9fdd",
1353
- "is_verified": false,
1354
- "line_number": 56
1355
- }
1356
- ],
1357
- "src/agents/pi-embedded-runner.limithistoryturns.test.ts": [
1358
- {
1359
- "type": "Secret Keyword",
1360
- "filename": "src/agents/pi-embedded-runner.limithistoryturns.test.ts",
1361
- "hashed_secret": "e9a5f12a8ecbb3eb46eca5096b5c52aa5e7c9fdd",
1362
- "is_verified": false,
1363
- "line_number": 57
1364
- }
1365
- ],
1366
- "src/agents/pi-embedded-runner.resolvesessionagentids.test.ts": [
1367
- {
1368
- "type": "Secret Keyword",
1369
- "filename": "src/agents/pi-embedded-runner.resolvesessionagentids.test.ts",
1370
- "hashed_secret": "e9a5f12a8ecbb3eb46eca5096b5c52aa5e7c9fdd",
1371
- "is_verified": false,
1372
- "line_number": 56
1373
- }
1374
- ],
1375
- "src/agents/pi-embedded-runner.splitsdktools.test.ts": [
1376
- {
1377
- "type": "Secret Keyword",
1378
- "filename": "src/agents/pi-embedded-runner.splitsdktools.test.ts",
1379
- "hashed_secret": "e9a5f12a8ecbb3eb46eca5096b5c52aa5e7c9fdd",
1380
- "is_verified": false,
1381
- "line_number": 57
1382
- }
1383
- ],
1384
- "src/agents/pi-embedded-runner.test.ts": [
1385
- {
1386
- "type": "Secret Keyword",
1387
- "filename": "src/agents/pi-embedded-runner.test.ts",
1388
- "hashed_secret": "e9a5f12a8ecbb3eb46eca5096b5c52aa5e7c9fdd",
1389
- "is_verified": false,
1390
- "line_number": 117
1391
- },
1392
- {
1393
- "type": "Secret Keyword",
1394
- "filename": "src/agents/pi-embedded-runner.test.ts",
1395
- "hashed_secret": "fcdd655b11f33ba4327695084a347b2ba192976c",
1396
- "is_verified": false,
1397
- "line_number": 178
1398
- }
1399
- ],
1400
- "src/agents/skills.applyskillenvoverrides.test.ts": [
1401
- {
1402
- "type": "Secret Keyword",
1403
- "filename": "src/agents/skills.applyskillenvoverrides.test.ts",
1404
- "hashed_secret": "5df3a673d724e8a1eb673a8baf623e183940804d",
1405
- "is_verified": false,
1406
- "line_number": 54
1407
- },
1408
- {
1409
- "type": "Secret Keyword",
1410
- "filename": "src/agents/skills.applyskillenvoverrides.test.ts",
1411
- "hashed_secret": "8921daaa546693e52bc1f9c40bdcf15e816e0448",
1412
- "is_verified": false,
1413
- "line_number": 80
1414
- }
1415
- ],
1416
- "src/agents/skills.build-workspace-skills-prompt.prefers-workspace-skills-managed-skills.test.ts": [
1417
- {
1418
- "type": "Secret Keyword",
1419
- "filename": "src/agents/skills.build-workspace-skills-prompt.prefers-workspace-skills-managed-skills.test.ts",
1420
- "hashed_secret": "7a85f4764bbd6daf1c3545efbbf0f279a6dc0beb",
1421
- "is_verified": false,
1422
- "line_number": 124
1423
- }
1424
- ],
1425
- "src/agents/skills.build-workspace-skills-prompt.syncs-merged-skills-into-target-workspace.test.ts": [
1426
- {
1427
- "type": "Secret Keyword",
1428
- "filename": "src/agents/skills.build-workspace-skills-prompt.syncs-merged-skills-into-target-workspace.test.ts",
1429
- "hashed_secret": "3acfb2c2b433c0ea7ff107e33df91b18e52f960f",
1430
- "is_verified": false,
1431
- "line_number": 102
1432
- }
1433
- ],
1434
- "src/agents/tools/web-fetch.ssrf.test.ts": [
1435
- {
1436
- "type": "Secret Keyword",
1437
- "filename": "src/agents/tools/web-fetch.ssrf.test.ts",
1438
- "hashed_secret": "5ce8e9d54c77266fff990194d2219a708c59b76c",
1439
- "is_verified": false,
1440
- "line_number": 55
1441
- }
1442
- ],
1443
- "src/agents/tools/web-search.ts": [
1444
- {
1445
- "type": "Secret Keyword",
1446
- "filename": "src/agents/tools/web-search.ts",
1447
- "hashed_secret": "dfba7aade0868074c2861c98e2a9a92f3178a51b",
1448
- "is_verified": false,
1449
- "line_number": 85
1450
- },
1451
- {
1452
- "type": "Secret Keyword",
1453
- "filename": "src/agents/tools/web-search.ts",
1454
- "hashed_secret": "71f8e7976e4cbc4561c9d62fb283e7f788202acb",
1455
- "is_verified": false,
1456
- "line_number": 190
1457
- },
1458
- {
1459
- "type": "Secret Keyword",
1460
- "filename": "src/agents/tools/web-search.ts",
1461
- "hashed_secret": "c4865ff9250aca23b0d98eb079dad70ebec1cced",
1462
- "is_verified": false,
1463
- "line_number": 198
1464
- },
1465
- {
1466
- "type": "Secret Keyword",
1467
- "filename": "src/agents/tools/web-search.ts",
1468
- "hashed_secret": "527ee41f36386e85fa932ef09471ca017f3c95c8",
1469
- "is_verified": false,
1470
- "line_number": 199
1471
- }
1472
- ],
1473
- "src/agents/tools/web-tools.enabled-defaults.test.ts": [
1474
- {
1475
- "type": "Secret Keyword",
1476
- "filename": "src/agents/tools/web-tools.enabled-defaults.test.ts",
1477
- "hashed_secret": "47b249a75ca78fdb578d0f28c33685e27ea82684",
1478
- "is_verified": false,
1479
- "line_number": 213
1480
- },
1481
- {
1482
- "type": "Secret Keyword",
1483
- "filename": "src/agents/tools/web-tools.enabled-defaults.test.ts",
1484
- "hashed_secret": "d0ffd81d6d7ad1bc3c365660fe8882480c9a986e",
1485
- "is_verified": false,
1486
- "line_number": 242
1487
- }
1488
- ],
1489
- "src/agents/tools/web-tools.fetch.test.ts": [
1490
- {
1491
- "type": "Secret Keyword",
1492
- "filename": "src/agents/tools/web-tools.fetch.test.ts",
1493
- "hashed_secret": "5ce8e9d54c77266fff990194d2219a708c59b76c",
1494
- "is_verified": false,
1495
- "line_number": 101
1496
- }
1497
- ],
1498
- "src/auto-reply/reply.directive.directive-behavior.prefers-alias-matches-fuzzy-selection-is-ambiguous.e2e.test.ts": [
1499
- {
1500
- "type": "Secret Keyword",
1501
- "filename": "src/auto-reply/reply.directive.directive-behavior.prefers-alias-matches-fuzzy-selection-is-ambiguous.e2e.test.ts",
1502
- "hashed_secret": "e9a5f12a8ecbb3eb46eca5096b5c52aa5e7c9fdd",
1503
- "is_verified": false,
1504
- "line_number": 90
1505
- },
1506
- {
1507
- "type": "Secret Keyword",
1508
- "filename": "src/auto-reply/reply.directive.directive-behavior.prefers-alias-matches-fuzzy-selection-is-ambiguous.e2e.test.ts",
1509
- "hashed_secret": "16c249e04e2be318050cb883c40137361c0c7209",
1510
- "is_verified": false,
1511
- "line_number": 96
1512
- }
1513
- ],
1514
- "src/auto-reply/reply.directive.directive-behavior.supports-fuzzy-model-matches-model-directive.e2e.test.ts": [
1515
- {
1516
- "type": "Secret Keyword",
1517
- "filename": "src/auto-reply/reply.directive.directive-behavior.supports-fuzzy-model-matches-model-directive.e2e.test.ts",
1518
- "hashed_secret": "e9a5f12a8ecbb3eb46eca5096b5c52aa5e7c9fdd",
1519
- "is_verified": false,
1520
- "line_number": 87
1521
- },
1522
- {
1523
- "type": "Secret Keyword",
1524
- "filename": "src/auto-reply/reply.directive.directive-behavior.supports-fuzzy-model-matches-model-directive.e2e.test.ts",
1525
- "hashed_secret": "16c249e04e2be318050cb883c40137361c0c7209",
1526
- "is_verified": false,
1527
- "line_number": 228
1528
- }
1529
- ],
1530
- "src/auto-reply/status.test.ts": [
1531
- {
1532
- "type": "Secret Keyword",
1533
- "filename": "src/auto-reply/status.test.ts",
1534
- "hashed_secret": "3acfb2c2b433c0ea7ff107e33df91b18e52f960f",
1535
- "is_verified": false,
1536
- "line_number": 20
1537
- }
1538
- ],
1539
- "src/browser/cdp.helpers.test.ts": [
1540
- {
1541
- "type": "Basic Auth Credentials",
1542
- "filename": "src/browser/cdp.helpers.test.ts",
1543
- "hashed_secret": "9d4e1e23bd5b727046a9e3b4b7db57bd8d6ee684",
1544
- "is_verified": false,
1545
- "line_number": 22
1546
- }
1547
- ],
1548
- "src/browser/cdp.test.ts": [
1549
- {
1550
- "type": "Basic Auth Credentials",
1551
- "filename": "src/browser/cdp.test.ts",
1552
- "hashed_secret": "9d4e1e23bd5b727046a9e3b4b7db57bd8d6ee684",
1553
- "is_verified": false,
1554
- "line_number": 172
1555
- }
1556
- ],
1557
- "src/browser/target-id.test.ts": [
1558
- {
1559
- "type": "Hex High Entropy String",
1560
- "filename": "src/browser/target-id.test.ts",
1561
- "hashed_secret": "4e126c049580d66ca1549fa534d95a7263f27f46",
1562
- "is_verified": false,
1563
- "line_number": 13
1564
- }
1565
- ],
1566
- "src/cli/update-cli.test.ts": [
1567
- {
1568
- "type": "Hex High Entropy String",
1569
- "filename": "src/cli/update-cli.test.ts",
1570
- "hashed_secret": "e4f91dd323bac5bfc4f60a6e433787671dc2421d",
1571
- "is_verified": false,
1572
- "line_number": 112
1573
- }
1574
- ],
1575
- "src/commands/auth-choice.preferred-provider.ts": [
1576
- {
1577
- "type": "Secret Keyword",
1578
- "filename": "src/commands/auth-choice.preferred-provider.ts",
1579
- "hashed_secret": "c03a8d10174dd7eb2b3288b570a5a74fdd9ae05d",
1580
- "is_verified": false,
1581
- "line_number": 8
1582
- }
1583
- ],
1584
- "src/commands/auth-choice.test.ts": [
1585
- {
1586
- "type": "Secret Keyword",
1587
- "filename": "src/commands/auth-choice.test.ts",
1588
- "hashed_secret": "2480500ff391183070fe22ba8665a8be19350833",
1589
- "is_verified": false,
1590
- "line_number": 289
1591
- },
1592
- {
1593
- "type": "Secret Keyword",
1594
- "filename": "src/commands/auth-choice.test.ts",
1595
- "hashed_secret": "77e991e9f56e6fa4ed1a908208048421f1214c07",
1596
- "is_verified": false,
1597
- "line_number": 350
1598
- },
1599
- {
1600
- "type": "Secret Keyword",
1601
- "filename": "src/commands/auth-choice.test.ts",
1602
- "hashed_secret": "1b4d8423b11d32dd0c466428ac81de84a4a9442b",
1603
- "is_verified": false,
1604
- "line_number": 528
1605
- }
1606
- ],
1607
- "src/commands/configure.gateway-auth.test.ts": [
1608
- {
1609
- "type": "Secret Keyword",
1610
- "filename": "src/commands/configure.gateway-auth.test.ts",
1611
- "hashed_secret": "e5e9fa1ba31ecd1ae84f75caaa474f3a663f05f4",
1612
- "is_verified": false,
1613
- "line_number": 8
1614
- }
1615
- ],
1616
- "src/commands/models/list.status.test.ts": [
1617
- {
1618
- "type": "Base64 High Entropy String",
1619
- "filename": "src/commands/models/list.status.test.ts",
1620
- "hashed_secret": "d6ae2508a78a232d5378ef24b85ce40cbb4d7ff0",
1621
- "is_verified": false,
1622
- "line_number": 11
1623
- },
1624
- {
1625
- "type": "Base64 High Entropy String",
1626
- "filename": "src/commands/models/list.status.test.ts",
1627
- "hashed_secret": "2d8012102440ea97852b3152239218f00579bafa",
1628
- "is_verified": false,
1629
- "line_number": 18
1630
- },
1631
- {
1632
- "type": "Base64 High Entropy String",
1633
- "filename": "src/commands/models/list.status.test.ts",
1634
- "hashed_secret": "51848e2be4b461a549218d3167f19c01be6b98b8",
1635
- "is_verified": false,
1636
- "line_number": 46
1637
- },
1638
- {
1639
- "type": "Secret Keyword",
1640
- "filename": "src/commands/models/list.status.test.ts",
1641
- "hashed_secret": "51848e2be4b461a549218d3167f19c01be6b98b8",
1642
- "is_verified": false,
1643
- "line_number": 46
1644
- },
1645
- {
1646
- "type": "Secret Keyword",
1647
- "filename": "src/commands/models/list.status.test.ts",
1648
- "hashed_secret": "1c1e381bfb72d3b7bfca9437053d9875356680f0",
1649
- "is_verified": false,
1650
- "line_number": 52
1651
- }
1652
- ],
1653
- "src/commands/onboard-auth.config-minimax.ts": [
1654
- {
1655
- "type": "Secret Keyword",
1656
- "filename": "src/commands/onboard-auth.config-minimax.ts",
1657
- "hashed_secret": "16c249e04e2be318050cb883c40137361c0c7209",
1658
- "is_verified": false,
1659
- "line_number": 30
1660
- },
1661
- {
1662
- "type": "Secret Keyword",
1663
- "filename": "src/commands/onboard-auth.config-minimax.ts",
1664
- "hashed_secret": "ddcb713196b974770575a9bea5a4e7d46361f8e9",
1665
- "is_verified": false,
1666
- "line_number": 85
1667
- }
1668
- ],
1669
- "src/commands/onboard-auth.test.ts": [
1670
- {
1671
- "type": "Secret Keyword",
1672
- "filename": "src/commands/onboard-auth.test.ts",
1673
- "hashed_secret": "666c100dab549a6f56da7da546bd848ed5086541",
1674
- "is_verified": false,
1675
- "line_number": 230
1676
- },
1677
- {
1678
- "type": "Secret Keyword",
1679
- "filename": "src/commands/onboard-auth.test.ts",
1680
- "hashed_secret": "e184b402822abc549b37689c84e8e0e33c39a1f1",
1681
- "is_verified": false,
1682
- "line_number": 262
1683
- }
1684
- ],
1685
- "src/commands/onboard-non-interactive.ai-gateway.test.ts": [
1686
- {
1687
- "type": "Secret Keyword",
1688
- "filename": "src/commands/onboard-non-interactive.ai-gateway.test.ts",
1689
- "hashed_secret": "77e991e9f56e6fa4ed1a908208048421f1214c07",
1690
- "is_verified": false,
1691
- "line_number": 50
1692
- }
1693
- ],
1694
- "src/commands/onboard-non-interactive/api-keys.ts": [
1695
- {
1696
- "type": "Secret Keyword",
1697
- "filename": "src/commands/onboard-non-interactive/api-keys.ts",
1698
- "hashed_secret": "112f3a99b283a4e1788dedd8e0e5d35375c33747",
1699
- "is_verified": false,
1700
- "line_number": 10
1701
- }
1702
- ],
1703
- "src/config/config.env-vars.test.ts": [
1704
- {
1705
- "type": "Secret Keyword",
1706
- "filename": "src/config/config.env-vars.test.ts",
1707
- "hashed_secret": "a24ef9c1a27cac44823571ceef2e8262718eee36",
1708
- "is_verified": false,
1709
- "line_number": 15
1710
- },
1711
- {
1712
- "type": "Secret Keyword",
1713
- "filename": "src/config/config.env-vars.test.ts",
1714
- "hashed_secret": "29d5f92e9ee44d4854d6dfaeefc3dc27d779fdf3",
1715
- "is_verified": false,
1716
- "line_number": 47
1717
- },
1718
- {
1719
- "type": "Secret Keyword",
1720
- "filename": "src/config/config.env-vars.test.ts",
1721
- "hashed_secret": "1672b6a1e7956c6a70f45d699aa42a351b1f8b80",
1722
- "is_verified": false,
1723
- "line_number": 63
1724
- }
1725
- ],
1726
- "src/config/config.talk-api-key-fallback.test.ts": [
1727
- {
1728
- "type": "Secret Keyword",
1729
- "filename": "src/config/config.talk-api-key-fallback.test.ts",
1730
- "hashed_secret": "bea2f7b64fab8d1d414d0449530b1e088d36d5b1",
1731
- "is_verified": false,
1732
- "line_number": 42
1733
- }
1734
- ],
1735
- "src/config/config.web-search-provider.test.ts": [
1736
- {
1737
- "type": "Secret Keyword",
1738
- "filename": "src/config/config.web-search-provider.test.ts",
1739
- "hashed_secret": "3acfb2c2b433c0ea7ff107e33df91b18e52f960f",
1740
- "is_verified": false,
1741
- "line_number": 14
1742
- }
1743
- ],
1744
- "src/config/env-substitution.test.ts": [
1745
- {
1746
- "type": "Secret Keyword",
1747
- "filename": "src/config/env-substitution.test.ts",
1748
- "hashed_secret": "f2b14f68eb995facb3a1c35287b778d5bd785511",
1749
- "is_verified": false,
1750
- "line_number": 38
1751
- },
1752
- {
1753
- "type": "Secret Keyword",
1754
- "filename": "src/config/env-substitution.test.ts",
1755
- "hashed_secret": "ec417f567082612f8fd6afafe1abcab831fca840",
1756
- "is_verified": false,
1757
- "line_number": 69
1758
- },
1759
- {
1760
- "type": "Secret Keyword",
1761
- "filename": "src/config/env-substitution.test.ts",
1762
- "hashed_secret": "520bd69c3eb1646d9a78181ecb4c90c51fdf428d",
1763
- "is_verified": false,
1764
- "line_number": 70
1765
- },
1766
- {
1767
- "type": "Secret Keyword",
1768
- "filename": "src/config/env-substitution.test.ts",
1769
- "hashed_secret": "f136444bf9b3d01a9f9b772b80ac6bf7b6a43ef0",
1770
- "is_verified": false,
1771
- "line_number": 228
1772
- }
1773
- ],
1774
- "src/config/schema.ts": [
1775
- {
1776
- "type": "Secret Keyword",
1777
- "filename": "src/config/schema.ts",
1778
- "hashed_secret": "e73c9fcad85cd4eecc74181ec4bdb31064d68439",
1779
- "is_verified": false,
1780
- "line_number": 184
1781
- },
1782
- {
1783
- "type": "Secret Keyword",
1784
- "filename": "src/config/schema.ts",
1785
- "hashed_secret": "2eda7cd978f39eebec3bf03e4410a40e14167fff",
1786
- "is_verified": false,
1787
- "line_number": 220
1788
- },
1789
- {
1790
- "type": "Secret Keyword",
1791
- "filename": "src/config/schema.ts",
1792
- "hashed_secret": "9f4cda226d3868676ac7f86f59e4190eb94bd208",
1793
- "is_verified": false,
1794
- "line_number": 418
1795
- },
1796
- {
1797
- "type": "Secret Keyword",
1798
- "filename": "src/config/schema.ts",
1799
- "hashed_secret": "01822c8bbf6a8b136944b14182cb885100ec2eae",
1800
- "is_verified": false,
1801
- "line_number": 437
1802
- },
1803
- {
1804
- "type": "Secret Keyword",
1805
- "filename": "src/config/schema.ts",
1806
- "hashed_secret": "bb7dfd9746e660e4a4374951ec5938ef0e343255",
1807
- "is_verified": false,
1808
- "line_number": 487
1809
- }
1810
- ],
1811
- "src/config/slack-http-config.test.ts": [
1812
- {
1813
- "type": "Secret Keyword",
1814
- "filename": "src/config/slack-http-config.test.ts",
1815
- "hashed_secret": "e5e9fa1ba31ecd1ae84f75caaa474f3a663f05f4",
1816
- "is_verified": false,
1817
- "line_number": 11
1818
- }
1819
- ],
1820
- "src/gateway/auth.test.ts": [
1821
- {
1822
- "type": "Secret Keyword",
1823
- "filename": "src/gateway/auth.test.ts",
1824
- "hashed_secret": "e5e9fa1ba31ecd1ae84f75caaa474f3a663f05f4",
1825
- "is_verified": false,
1826
- "line_number": 43
1827
- },
1828
- {
1829
- "type": "Secret Keyword",
1830
- "filename": "src/gateway/auth.test.ts",
1831
- "hashed_secret": "a4b48a81cdab1e1a5dd37907d6c85ca1c61ddc7c",
1832
- "is_verified": false,
1833
- "line_number": 51
1834
- }
1835
- ],
1836
- "src/gateway/call.test.ts": [
1837
- {
1838
- "type": "Secret Keyword",
1839
- "filename": "src/gateway/call.test.ts",
1840
- "hashed_secret": "e5e9fa1ba31ecd1ae84f75caaa474f3a663f05f4",
1841
- "is_verified": false,
1842
- "line_number": 285
1843
- },
1844
- {
1845
- "type": "Secret Keyword",
1846
- "filename": "src/gateway/call.test.ts",
1847
- "hashed_secret": "e493f561d90c6638c1f51c5a8a069c3b129b79ed",
1848
- "is_verified": false,
1849
- "line_number": 295
1850
- },
1851
- {
1852
- "type": "Secret Keyword",
1853
- "filename": "src/gateway/call.test.ts",
1854
- "hashed_secret": "2e07956ffc9bc4fd624064c40b7495c85d5f1467",
1855
- "is_verified": false,
1856
- "line_number": 300
1857
- },
1858
- {
1859
- "type": "Secret Keyword",
1860
- "filename": "src/gateway/call.test.ts",
1861
- "hashed_secret": "bddc29032de580fb53b3a9a0357dd409086db800",
1862
- "is_verified": false,
1863
- "line_number": 313
1864
- }
1865
- ],
1866
- "src/gateway/client.test.ts": [
1867
- {
1868
- "type": "Private Key",
1869
- "filename": "src/gateway/client.test.ts",
1870
- "hashed_secret": "1348b145fa1a555461c1b790a2f66614781091e9",
1871
- "is_verified": false,
1872
- "line_number": 83
1873
- }
1874
- ],
1875
- "src/gateway/gateway-cli-backend.live.test.ts": [
1876
- {
1877
- "type": "Hex High Entropy String",
1878
- "filename": "src/gateway/gateway-cli-backend.live.test.ts",
1879
- "hashed_secret": "3e2fd4a90d5afbd27974730c4d6a9592fe300825",
1880
- "is_verified": false,
1881
- "line_number": 38
1882
- }
1883
- ],
1884
- "src/gateway/gateway-models.profiles.live.test.ts": [
1885
- {
1886
- "type": "Hex High Entropy String",
1887
- "filename": "src/gateway/gateway-models.profiles.live.test.ts",
1888
- "hashed_secret": "3e2fd4a90d5afbd27974730c4d6a9592fe300825",
1889
- "is_verified": false,
1890
- "line_number": 219
1891
- }
1892
- ],
1893
- "src/gateway/gateway.e2e.test.ts": [
1894
- {
1895
- "type": "Secret Keyword",
1896
- "filename": "src/gateway/gateway.e2e.test.ts",
1897
- "hashed_secret": "a94a8fe5ccb19ba61c4c0873d391e987982fbbd3",
1898
- "is_verified": false,
1899
- "line_number": 73
1900
- }
1901
- ],
1902
- "src/gateway/server.auth.e2e.test.ts": [
1903
- {
1904
- "type": "Secret Keyword",
1905
- "filename": "src/gateway/server.auth.e2e.test.ts",
1906
- "hashed_secret": "e5e9fa1ba31ecd1ae84f75caaa474f3a663f05f4",
1907
- "is_verified": false,
1908
- "line_number": 179
1909
- },
1910
- {
1911
- "type": "Secret Keyword",
1912
- "filename": "src/gateway/server.auth.e2e.test.ts",
1913
- "hashed_secret": "a4b48a81cdab1e1a5dd37907d6c85ca1c61ddc7c",
1914
- "is_verified": false,
1915
- "line_number": 197
1916
- }
1917
- ],
1918
- "src/gateway/session-utils.test.ts": [
1919
- {
1920
- "type": "Base64 High Entropy String",
1921
- "filename": "src/gateway/session-utils.test.ts",
1922
- "hashed_secret": "bb9a5d9483409d2c60b28268a0efcb93324d4cda",
1923
- "is_verified": false,
1924
- "line_number": 156
1925
- }
1926
- ],
1927
- "src/gateway/tools-invoke-http.test.ts": [
1928
- {
1929
- "type": "Secret Keyword",
1930
- "filename": "src/gateway/tools-invoke-http.test.ts",
1931
- "hashed_secret": "e5e9fa1ba31ecd1ae84f75caaa474f3a663f05f4",
1932
- "is_verified": false,
1933
- "line_number": 56
1934
- }
1935
- ],
1936
- "src/gateway/ws-log.test.ts": [
1937
- {
1938
- "type": "Base64 High Entropy String",
1939
- "filename": "src/gateway/ws-log.test.ts",
1940
- "hashed_secret": "edd2e7ac4f61d0c606e80a0919d727540842a307",
1941
- "is_verified": false,
1942
- "line_number": 22
1943
- }
1944
- ],
1945
- "src/infra/env.test.ts": [
1946
- {
1947
- "type": "Secret Keyword",
1948
- "filename": "src/infra/env.test.ts",
1949
- "hashed_secret": "df98a117ddabf85991b9fe0e268214dc0e1254dc",
1950
- "is_verified": false,
1951
- "line_number": 10
1952
- },
1953
- {
1954
- "type": "Secret Keyword",
1955
- "filename": "src/infra/env.test.ts",
1956
- "hashed_secret": "6d811dc1f59a55ca1a3d38b5042a062b9f79e8ec",
1957
- "is_verified": false,
1958
- "line_number": 25
1959
- }
1960
- ],
1961
- "src/infra/outbound/message-action-runner.test.ts": [
1962
- {
1963
- "type": "Hex High Entropy String",
1964
- "filename": "src/infra/outbound/message-action-runner.test.ts",
1965
- "hashed_secret": "804ec071803318791b835cffd6e509c8d32239db",
1966
- "is_verified": false,
1967
- "line_number": 88
1968
- },
1969
- {
1970
- "type": "Secret Keyword",
1971
- "filename": "src/infra/outbound/message-action-runner.test.ts",
1972
- "hashed_secret": "789cbe0407840b1c2041cb33452ff60f19bf58cc",
1973
- "is_verified": false,
1974
- "line_number": 385
1975
- }
1976
- ],
1977
- "src/infra/outbound/outbound-policy.test.ts": [
1978
- {
1979
- "type": "Hex High Entropy String",
1980
- "filename": "src/infra/outbound/outbound-policy.test.ts",
1981
- "hashed_secret": "804ec071803318791b835cffd6e509c8d32239db",
1982
- "is_verified": false,
1983
- "line_number": 33
1984
- }
1985
- ],
1986
- "src/infra/shell-env.test.ts": [
1987
- {
1988
- "type": "Secret Keyword",
1989
- "filename": "src/infra/shell-env.test.ts",
1990
- "hashed_secret": "65c10dc3549fe07424148a8a4790a3341ecbc253",
1991
- "is_verified": false,
1992
- "line_number": 27
1993
- },
1994
- {
1995
- "type": "Secret Keyword",
1996
- "filename": "src/infra/shell-env.test.ts",
1997
- "hashed_secret": "e013ffda590d2178607c16d11b1ea42f75ceb0e7",
1998
- "is_verified": false,
1999
- "line_number": 59
2000
- },
2001
- {
2002
- "type": "Base64 High Entropy String",
2003
- "filename": "src/infra/shell-env.test.ts",
2004
- "hashed_secret": "be6ee9a6bf9f2dad84a5a67d6c0576a5bacc391e",
2005
- "is_verified": false,
2006
- "line_number": 61
2007
- }
2008
- ],
2009
- "src/logging/redact.test.ts": [
2010
- {
2011
- "type": "Base64 High Entropy String",
2012
- "filename": "src/logging/redact.test.ts",
2013
- "hashed_secret": "dd7754662b89333191ff45e8257a3e6d3fcd3990",
2014
- "is_verified": false,
2015
- "line_number": 9
2016
- },
2017
- {
2018
- "type": "Private Key",
2019
- "filename": "src/logging/redact.test.ts",
2020
- "hashed_secret": "1348b145fa1a555461c1b790a2f66614781091e9",
2021
- "is_verified": false,
2022
- "line_number": 64
2023
- },
2024
- {
2025
- "type": "Hex High Entropy String",
2026
- "filename": "src/logging/redact.test.ts",
2027
- "hashed_secret": "7992945213f7d76889fa83ff0f2be352409c837e",
2028
- "is_verified": false,
2029
- "line_number": 65
2030
- },
2031
- {
2032
- "type": "Base64 High Entropy String",
2033
- "filename": "src/logging/redact.test.ts",
2034
- "hashed_secret": "063995ecb4fa5afe2460397d322925cd867b7d74",
2035
- "is_verified": false,
2036
- "line_number": 79
2037
- }
2038
- ],
2039
- "src/media-understanding/apply.test.ts": [
2040
- {
2041
- "type": "Secret Keyword",
2042
- "filename": "src/media-understanding/apply.test.ts",
2043
- "hashed_secret": "3acfb2c2b433c0ea7ff107e33df91b18e52f960f",
2044
- "is_verified": false,
2045
- "line_number": 14
2046
- }
2047
- ],
2048
- "src/media-understanding/providers/deepgram/audio.test.ts": [
2049
- {
2050
- "type": "Secret Keyword",
2051
- "filename": "src/media-understanding/providers/deepgram/audio.test.ts",
2052
- "hashed_secret": "3acfb2c2b433c0ea7ff107e33df91b18e52f960f",
2053
- "is_verified": false,
2054
- "line_number": 31
2055
- }
2056
- ],
2057
- "src/media-understanding/providers/google/video.test.ts": [
2058
- {
2059
- "type": "Secret Keyword",
2060
- "filename": "src/media-understanding/providers/google/video.test.ts",
2061
- "hashed_secret": "3acfb2c2b433c0ea7ff107e33df91b18e52f960f",
2062
- "is_verified": false,
2063
- "line_number": 28
2064
- }
2065
- ],
2066
- "src/media-understanding/providers/openai/audio.test.ts": [
2067
- {
2068
- "type": "Secret Keyword",
2069
- "filename": "src/media-understanding/providers/openai/audio.test.ts",
2070
- "hashed_secret": "3acfb2c2b433c0ea7ff107e33df91b18e52f960f",
2071
- "is_verified": false,
2072
- "line_number": 26
2073
- }
2074
- ],
2075
- "src/media-understanding/runner.auto-audio.test.ts": [
2076
- {
2077
- "type": "Secret Keyword",
2078
- "filename": "src/media-understanding/runner.auto-audio.test.ts",
2079
- "hashed_secret": "3acfb2c2b433c0ea7ff107e33df91b18e52f960f",
2080
- "is_verified": false,
2081
- "line_number": 42
2082
- }
2083
- ],
2084
- "src/media-understanding/runner.deepgram.test.ts": [
2085
- {
2086
- "type": "Secret Keyword",
2087
- "filename": "src/media-understanding/runner.deepgram.test.ts",
2088
- "hashed_secret": "3acfb2c2b433c0ea7ff107e33df91b18e52f960f",
2089
- "is_verified": false,
2090
- "line_number": 46
2091
- }
2092
- ],
2093
- "src/memory/embeddings.test.ts": [
2094
- {
2095
- "type": "Secret Keyword",
2096
- "filename": "src/memory/embeddings.test.ts",
2097
- "hashed_secret": "a47110e348a3063541fb1f1f640d635d457181a0",
2098
- "is_verified": false,
2099
- "line_number": 32
2100
- },
2101
- {
2102
- "type": "Secret Keyword",
2103
- "filename": "src/memory/embeddings.test.ts",
2104
- "hashed_secret": "c734e47630dda71619c696d88381f06f7511bd78",
2105
- "is_verified": false,
2106
- "line_number": 149
2107
- },
2108
- {
2109
- "type": "Secret Keyword",
2110
- "filename": "src/memory/embeddings.test.ts",
2111
- "hashed_secret": "56e1d57b8db262b08bc73c60ed08d8c92e59503f",
2112
- "is_verified": false,
2113
- "line_number": 179
2114
- }
2115
- ],
2116
- "src/pairing/pairing-store.ts": [
2117
- {
2118
- "type": "Base64 High Entropy String",
2119
- "filename": "src/pairing/pairing-store.ts",
2120
- "hashed_secret": "f8c6f1ff98c5ee78c27d34a3ca68f35ad79847af",
2121
- "is_verified": false,
2122
- "line_number": 12
2123
- }
2124
- ],
2125
- "src/security/audit.test.ts": [
2126
- {
2127
- "type": "Hex High Entropy String",
2128
- "filename": "src/security/audit.test.ts",
2129
- "hashed_secret": "b1775a785f09a6ebaf2dc33d6eaeb98974d9cdb8",
2130
- "is_verified": false,
2131
- "line_number": 180
2132
- },
2133
- {
2134
- "type": "Hex High Entropy String",
2135
- "filename": "src/security/audit.test.ts",
2136
- "hashed_secret": "fa8da98a5bdb77b4902cbb4338e6e94ea825300e",
2137
- "is_verified": false,
2138
- "line_number": 209
2139
- },
2140
- {
2141
- "type": "Secret Keyword",
2142
- "filename": "src/security/audit.test.ts",
2143
- "hashed_secret": "21f688ab56f76a99e5c6ed342291422f4e57e47f",
2144
- "is_verified": false,
2145
- "line_number": 1046
2146
- },
2147
- {
2148
- "type": "Secret Keyword",
2149
- "filename": "src/security/audit.test.ts",
2150
- "hashed_secret": "3dc927d80543dc0f643940b70d066bd4b4c4b78e",
2151
- "is_verified": false,
2152
- "line_number": 1077
2153
- }
2154
- ],
2155
- "src/tts/tts.test.ts": [
2156
- {
2157
- "type": "Secret Keyword",
2158
- "filename": "src/tts/tts.test.ts",
2159
- "hashed_secret": "2e7a7ee14caebf378fc32d6cf6f557f347c96773",
2160
- "is_verified": false,
2161
- "line_number": 33
2162
- },
2163
- {
2164
- "type": "Hex High Entropy String",
2165
- "filename": "src/tts/tts.test.ts",
2166
- "hashed_secret": "b214f706bb602c1cc2adc5c6165e73622305f4bb",
2167
- "is_verified": false,
2168
- "line_number": 68
2169
- }
2170
- ],
2171
- "src/web/qr-image.test.ts": [
2172
- {
2173
- "type": "Hex High Entropy String",
2174
- "filename": "src/web/qr-image.test.ts",
2175
- "hashed_secret": "564666dc1ca6e7318b2d5feeb1ce7b5bf717411e",
2176
- "is_verified": false,
2177
- "line_number": 12
2178
- }
2179
- ],
2180
- "test/provider-timeout.e2e.test.ts": [
2181
- {
2182
- "type": "Secret Keyword",
2183
- "filename": "test/provider-timeout.e2e.test.ts",
2184
- "hashed_secret": "a94a8fe5ccb19ba61c4c0873d391e987982fbbd3",
2185
- "is_verified": false,
2186
- "line_number": 182
2187
- }
2188
- ]
2189
- },
2190
- "generated_at": "2026-01-25T10:55:04Z"
2191
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
.shellcheckrc DELETED
@@ -1,25 +0,0 @@
1
- # ShellCheck configuration
2
- # https://www.shellcheck.net/wiki/
3
-
4
- # Disable common false positives and style suggestions
5
-
6
- # SC2034: Variable appears unused (often exported or used indirectly)
7
- disable=SC2034
8
-
9
- # SC2155: Declare and assign separately (common idiom, rarely causes issues)
10
- disable=SC2155
11
-
12
- # SC2295: Expansions inside ${..} need quoting (info-level, rarely causes issues)
13
- disable=SC2295
14
-
15
- # SC1012: \r is literal (tr -d '\r' works as intended on most systems)
16
- disable=SC1012
17
-
18
- # SC2026: Word outside quotes (info-level, often intentional)
19
- disable=SC2026
20
-
21
- # SC2016: Expressions don't expand in single quotes (often intentional in sed/awk)
22
- disable=SC2016
23
-
24
- # SC2129: Consider using { cmd1; cmd2; } >> file (style preference)
25
- disable=SC2129
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
.swiftformat DELETED
@@ -1,51 +0,0 @@
1
- # SwiftFormat configuration adapted from Peekaboo defaults (Swift 6 friendly)
2
-
3
- --swiftversion 6.2
4
-
5
- # Self handling
6
- --self insert
7
- --selfrequired
8
-
9
- # Imports / extensions
10
- --importgrouping testable-bottom
11
- --extensionacl on-declarations
12
-
13
- # Indentation
14
- --indent 4
15
- --indentcase false
16
- --ifdef no-indent
17
- --xcodeindentation enabled
18
-
19
- # Line breaks
20
- --linebreaks lf
21
- --maxwidth 120
22
-
23
- # Whitespace
24
- --trimwhitespace always
25
- --emptybraces no-space
26
- --nospaceoperators ...,..<
27
- --ranges no-space
28
- --someAny true
29
- --voidtype void
30
-
31
- # Wrapping
32
- --wraparguments before-first
33
- --wrapparameters before-first
34
- --wrapcollections before-first
35
- --closingparen same-line
36
-
37
- # Organization
38
- --organizetypes class,struct,enum,extension
39
- --extensionmark "MARK: - %t + %p"
40
- --marktypes always
41
- --markextensions always
42
- --structthreshold 0
43
- --enumthreshold 0
44
-
45
- # Other
46
- --stripunusedargs closure-only
47
- --header ignore
48
- --allman false
49
-
50
- # Exclusions
51
- --exclude .build,.swiftpm,DerivedData,node_modules,dist,coverage,xcuserdata,Peekaboo,Swabble,apps/android,apps/ios,apps/shared,apps/macos/Sources/MoltbotProtocol
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
.swiftlint.yml DELETED
@@ -1,148 +0,0 @@
1
- # SwiftLint configuration adapted from Peekaboo defaults (Swift 6 friendly)
2
-
3
- included:
4
- - apps/macos/Sources
5
-
6
- excluded:
7
- - .build
8
- - DerivedData
9
- - "**/.build"
10
- - "**/.swiftpm"
11
- - "**/DerivedData"
12
- - "**/Generated"
13
- - "**/Resources"
14
- - "**/Package.swift"
15
- - "**/Tests/Resources"
16
- - node_modules
17
- - dist
18
- - coverage
19
- - "*.playground"
20
- # Generated (protocol-gen-swift.ts)
21
- - apps/macos/Sources/MoltbotProtocol/GatewayModels.swift
22
-
23
- analyzer_rules:
24
- - unused_declaration
25
- - unused_import
26
-
27
- opt_in_rules:
28
- - array_init
29
- - closure_spacing
30
- - contains_over_first_not_nil
31
- - empty_count
32
- - empty_string
33
- - explicit_init
34
- - fallthrough
35
- - fatal_error_message
36
- - first_where
37
- - joined_default_parameter
38
- - last_where
39
- - literal_expression_end_indentation
40
- - multiline_arguments
41
- - multiline_parameters
42
- - operator_usage_whitespace
43
- - overridden_super_call
44
- - pattern_matching_keywords
45
- - private_outlet
46
- - prohibited_super_call
47
- - redundant_nil_coalescing
48
- - sorted_first_last
49
- - switch_case_alignment
50
- - unneeded_parentheses_in_closure_argument
51
- - vertical_parameter_alignment_on_call
52
-
53
- disabled_rules:
54
- # SwiftFormat handles these
55
- - trailing_whitespace
56
- - trailing_newline
57
- - trailing_comma
58
- - vertical_whitespace
59
- - indentation_width
60
-
61
- # Style exclusions
62
- - explicit_self
63
- - identifier_name
64
- - file_header
65
- - explicit_top_level_acl
66
- - explicit_acl
67
- - explicit_type_interface
68
- - missing_docs
69
- - required_deinit
70
- - prefer_nimble
71
- - quick_discouraged_call
72
- - quick_discouraged_focused_test
73
- - quick_discouraged_pending_test
74
- - anonymous_argument_in_multiline_closure
75
- - no_extension_access_modifier
76
- - no_grouping_extension
77
- - switch_case_on_newline
78
- - strict_fileprivate
79
- - extension_access_modifier
80
- - convenience_type
81
- - no_magic_numbers
82
- - one_declaration_per_file
83
- - vertical_whitespace_between_cases
84
- - vertical_whitespace_closing_braces
85
- - superfluous_else
86
- - number_separator
87
- - prefixed_toplevel_constant
88
- - opening_brace
89
- - trailing_closure
90
- - contrasted_opening_brace
91
- - sorted_imports
92
- - redundant_type_annotation
93
- - shorthand_optional_binding
94
- - untyped_error_in_catch
95
- - file_name
96
- - todo
97
-
98
- force_cast: warning
99
- force_try: warning
100
-
101
- type_name:
102
- min_length:
103
- warning: 2
104
- error: 1
105
- max_length:
106
- warning: 60
107
- error: 80
108
-
109
- function_body_length:
110
- warning: 150
111
- error: 300
112
-
113
- function_parameter_count:
114
- warning: 7
115
- error: 10
116
-
117
- file_length:
118
- warning: 1500
119
- error: 2500
120
- ignore_comment_only_lines: true
121
-
122
- type_body_length:
123
- warning: 800
124
- error: 1200
125
-
126
- cyclomatic_complexity:
127
- warning: 20
128
- error: 120
129
-
130
- large_tuple:
131
- warning: 4
132
- error: 5
133
-
134
- nesting:
135
- type_level:
136
- warning: 4
137
- error: 6
138
- function_level:
139
- warning: 5
140
- error: 7
141
-
142
- line_length:
143
- warning: 120
144
- error: 250
145
- ignores_comments: true
146
- ignores_urls: true
147
-
148
- reporter: "xcode"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
AGENTS.md DELETED
@@ -1,163 +0,0 @@
1
- # Repository Guidelines
2
- - Repo: https://github.com/moltbot/moltbot
3
- - GitHub issues/comments/PR comments: use literal multiline strings or `-F - <<'EOF'` (or $'...') for real newlines; never embed "\\n".
4
-
5
- ## Project Structure & Module Organization
6
- - Source code: `src/` (CLI wiring in `src/cli`, commands in `src/commands`, web provider in `src/provider-web.ts`, infra in `src/infra`, media pipeline in `src/media`).
7
- - Tests: colocated `*.test.ts`.
8
- - Docs: `docs/` (images, queue, Pi config). Built output lives in `dist/`.
9
- - Plugins/extensions: live under `extensions/*` (workspace packages). Keep plugin-only deps in the extension `package.json`; do not add them to the root `package.json` unless core uses them.
10
- - Plugins: install runs `npm install --omit=dev` in plugin dir; runtime deps must live in `dependencies`. Avoid `workspace:*` in `dependencies` (npm install breaks); put `moltbot` in `devDependencies` or `peerDependencies` instead (runtime resolves `clawdbot/plugin-sdk` via jiti alias).
11
- - Installers served from `https://molt.bot/*`: live in the sibling repo `../molt.bot` (`public/install.sh`, `public/install-cli.sh`, `public/install.ps1`).
12
- - Messaging channels: always consider **all** built-in + extension channels when refactoring shared logic (routing, allowlists, pairing, command gating, onboarding, docs).
13
- - Core channel docs: `docs/channels/`
14
- - Core channel code: `src/telegram`, `src/discord`, `src/slack`, `src/signal`, `src/imessage`, `src/web` (WhatsApp web), `src/channels`, `src/routing`
15
- - Extensions (channel plugins): `extensions/*` (e.g. `extensions/msteams`, `extensions/matrix`, `extensions/zalo`, `extensions/zalouser`, `extensions/voice-call`)
16
- - When adding channels/extensions/apps/docs, review `.github/labeler.yml` for label coverage.
17
-
18
- ## Docs Linking (Mintlify)
19
- - Docs are hosted on Mintlify (docs.molt.bot).
20
- - Internal doc links in `docs/**/*.md`: root-relative, no `.md`/`.mdx` (example: `[Config](/configuration)`).
21
- - Section cross-references: use anchors on root-relative paths (example: `[Hooks](/configuration#hooks)`).
22
- - Doc headings and anchors: avoid em dashes and apostrophes in headings because they break Mintlify anchor links.
23
- - When Peter asks for links, reply with full `https://docs.molt.bot/...` URLs (not root-relative).
24
- - When you touch docs, end the reply with the `https://docs.molt.bot/...` URLs you referenced.
25
- - README (GitHub): keep absolute docs URLs (`https://docs.molt.bot/...`) so links work on GitHub.
26
- - Docs content must be generic: no personal device names/hostnames/paths; use placeholders like `user@gateway-host` and “gateway host”.
27
-
28
- ## exe.dev VM ops (general)
29
- - Access: stable path is `ssh exe.dev` then `ssh vm-name` (assume SSH key already set).
30
- - SSH flaky: use exe.dev web terminal or Shelley (web agent); keep a tmux session for long ops.
31
- - Update: `sudo npm i -g moltbot@latest` (global install needs root on `/usr/lib/node_modules`).
32
- - Config: use `moltbot config set ...`; ensure `gateway.mode=local` is set.
33
- - Discord: store raw token only (no `DISCORD_BOT_TOKEN=` prefix).
34
- - Restart: stop old gateway and run:
35
- `pkill -9 -f moltbot-gateway || true; nohup moltbot gateway run --bind loopback --port 18789 --force > /tmp/moltbot-gateway.log 2>&1 &`
36
- - Verify: `moltbot channels status --probe`, `ss -ltnp | rg 18789`, `tail -n 120 /tmp/moltbot-gateway.log`.
37
-
38
- ## Build, Test, and Development Commands
39
- - Runtime baseline: Node **22+** (keep Node + Bun paths working).
40
- - Install deps: `pnpm install`
41
- - Pre-commit hooks: `prek install` (runs same checks as CI)
42
- - Also supported: `bun install` (keep `pnpm-lock.yaml` + Bun patching in sync when touching deps/patches).
43
- - Prefer Bun for TypeScript execution (scripts, dev, tests): `bun <file.ts>` / `bunx <tool>`.
44
- - Run CLI in dev: `pnpm moltbot ...` (bun) or `pnpm dev`.
45
- - Node remains supported for running built output (`dist/*`) and production installs.
46
- - Mac packaging (dev): `scripts/package-mac-app.sh` defaults to current arch. Release checklist: `docs/platforms/mac/release.md`.
47
- - Type-check/build: `pnpm build` (tsc)
48
- - Lint/format: `pnpm lint` (oxlint), `pnpm format` (oxfmt)
49
- - Tests: `pnpm test` (vitest); coverage: `pnpm test:coverage`
50
-
51
- ## Coding Style & Naming Conventions
52
- - Language: TypeScript (ESM). Prefer strict typing; avoid `any`.
53
- - Formatting/linting via Oxlint and Oxfmt; run `pnpm lint` before commits.
54
- - Add brief code comments for tricky or non-obvious logic.
55
- - Keep files concise; extract helpers instead of “V2” copies. Use existing patterns for CLI options and dependency injection via `createDefaultDeps`.
56
- - Aim to keep files under ~700 LOC; guideline only (not a hard guardrail). Split/refactor when it improves clarity or testability.
57
- - Naming: use **Moltbot** for product/app/docs headings; use `moltbot` for CLI command, package/binary, paths, and config keys.
58
-
59
- ## Release Channels (Naming)
60
- - stable: tagged releases only (e.g. `vYYYY.M.D`), npm dist-tag `latest`.
61
- - beta: prerelease tags `vYYYY.M.D-beta.N`, npm dist-tag `beta` (may ship without macOS app).
62
- - dev: moving head on `main` (no tag; git checkout main).
63
-
64
- ## Testing Guidelines
65
- - Framework: Vitest with V8 coverage thresholds (70% lines/branches/functions/statements).
66
- - Naming: match source names with `*.test.ts`; e2e in `*.e2e.test.ts`.
67
- - Run `pnpm test` (or `pnpm test:coverage`) before pushing when you touch logic.
68
- - Do not set test workers above 16; tried already.
69
- - Live tests (real keys): `CLAWDBOT_LIVE_TEST=1 pnpm test:live` (Moltbot-only) or `LIVE=1 pnpm test:live` (includes provider live tests). Docker: `pnpm test:docker:live-models`, `pnpm test:docker:live-gateway`. Onboarding Docker E2E: `pnpm test:docker:onboard`.
70
- - Full kit + what’s covered: `docs/testing.md`.
71
- - Pure test additions/fixes generally do **not** need a changelog entry unless they alter user-facing behavior or the user asks for one.
72
- - Mobile: before using a simulator, check for connected real devices (iOS + Android) and prefer them when available.
73
-
74
- ## Commit & Pull Request Guidelines
75
- - Create commits with `scripts/committer "<msg>" <file...>`; avoid manual `git add`/`git commit` so staging stays scoped.
76
- - Follow concise, action-oriented commit messages (e.g., `CLI: add verbose flag to send`).
77
- - Group related changes; avoid bundling unrelated refactors.
78
- - Changelog workflow: keep latest released version at top (no `Unreleased`); after publishing, bump version and start a new top section.
79
- - PRs should summarize scope, note testing performed, and mention any user-facing changes or new flags.
80
- - PR review flow: when given a PR link, review via `gh pr view`/`gh pr diff` and do **not** change branches.
81
- - PR review calls: prefer a single `gh pr view --json ...` to batch metadata/comments; run `gh pr diff` only when needed.
82
- - Before starting a review when a GH Issue/PR is pasted: run `git pull`; if there are local changes or unpushed commits, stop and alert the user before reviewing.
83
- - Goal: merge PRs. Prefer **rebase** when commits are clean; **squash** when history is messy.
84
- - PR merge flow: create a temp branch from `main`, merge the PR branch into it (prefer squash unless commit history is important; use rebase/merge when it is). Always try to merge the PR unless it’s truly difficult, then use another approach. If we squash, add the PR author as a co-contributor. Apply fixes, add changelog entry (include PR # + thanks), run full gate before the final commit, commit, merge back to `main`, delete the temp branch, and end on `main`.
85
- - If you review a PR and later do work on it, land via merge/squash (no direct-main commits) and always add the PR author as a co-contributor.
86
- - When working on a PR: add a changelog entry with the PR number and thank the contributor.
87
- - When working on an issue: reference the issue in the changelog entry.
88
- - When merging a PR: leave a PR comment that explains exactly what we did and include the SHA hashes.
89
- - When merging a PR from a new contributor: add their avatar to the README “Thanks to all clawtributors” thumbnail list.
90
- - After merging a PR: run `bun scripts/update-clawtributors.ts` if the contributor is missing, then commit the regenerated README.
91
-
92
- ## Shorthand Commands
93
- - `sync`: if working tree is dirty, commit all changes (pick a sensible Conventional Commit message), then `git pull --rebase`; if rebase conflicts and cannot resolve, stop; otherwise `git push`.
94
-
95
- ### PR Workflow (Review vs Land)
96
- - **Review mode (PR link only):** read `gh pr view/diff`; **do not** switch branches; **do not** change code.
97
- - **Landing mode:** create an integration branch from `main`, bring in PR commits (**prefer rebase** for linear history; **merge allowed** when complexity/conflicts make it safer), apply fixes, add changelog (+ thanks + PR #), run full gate **locally before committing** (`pnpm lint && pnpm build && pnpm test`), commit, merge back to `main`, then `git switch main` (never stay on a topic branch after landing). Important: contributor needs to be in git graph after this!
98
-
99
- ## Security & Configuration Tips
100
- - Web provider stores creds at `~/.clawdbot/credentials/`; rerun `moltbot login` if logged out.
101
- - Pi sessions live under `~/.clawdbot/sessions/` by default; the base directory is not configurable.
102
- - Environment variables: see `~/.profile`.
103
- - Never commit or publish real phone numbers, videos, or live configuration values. Use obviously fake placeholders in docs, tests, and examples.
104
- - Release flow: always read `docs/reference/RELEASING.md` and `docs/platforms/mac/release.md` before any release work; do not ask routine questions once those docs answer them.
105
-
106
- ## Troubleshooting
107
- - Rebrand/migration issues or legacy config/service warnings: run `moltbot doctor` (see `docs/gateway/doctor.md`).
108
-
109
- ## Agent-Specific Notes
110
- - Vocabulary: "makeup" = "mac app".
111
- - Never edit `node_modules` (global/Homebrew/npm/git installs too). Updates overwrite. Skill notes go in `tools.md` or `AGENTS.md`.
112
- - Signal: "update fly" => `fly ssh console -a flawd-bot -C "bash -lc 'cd /data/clawd/moltbot && git pull --rebase origin main'"` then `fly machines restart e825232f34d058 -a flawd-bot`.
113
- - When working on a GitHub Issue or PR, print the full URL at the end of the task.
114
- - When answering questions, respond with high-confidence answers only: verify in code; do not guess.
115
- - Never update the Carbon dependency.
116
- - Any dependency with `pnpm.patchedDependencies` must use an exact version (no `^`/`~`).
117
- - Patching dependencies (pnpm patches, overrides, or vendored changes) requires explicit approval; do not do this by default.
118
- - CLI progress: use `src/cli/progress.ts` (`osc-progress` + `@clack/prompts` spinner); don’t hand-roll spinners/bars.
119
- - Status output: keep tables + ANSI-safe wrapping (`src/terminal/table.ts`); `status --all` = read-only/pasteable, `status --deep` = probes.
120
- - Gateway currently runs only as the menubar app; there is no separate LaunchAgent/helper label installed. Restart via the Moltbot Mac app or `scripts/restart-mac.sh`; to verify/kill use `launchctl print gui/$UID | grep moltbot` rather than assuming a fixed label. **When debugging on macOS, start/stop the gateway via the app, not ad-hoc tmux sessions; kill any temporary tunnels before handoff.**
121
- - macOS logs: use `./scripts/clawlog.sh` to query unified logs for the Moltbot subsystem; it supports follow/tail/category filters and expects passwordless sudo for `/usr/bin/log`.
122
- - If shared guardrails are available locally, review them; otherwise follow this repo's guidance.
123
- - SwiftUI state management (iOS/macOS): prefer the `Observation` framework (`@Observable`, `@Bindable`) over `ObservableObject`/`@StateObject`; don’t introduce new `ObservableObject` unless required for compatibility, and migrate existing usages when touching related code.
124
- - Connection providers: when adding a new connection, update every UI surface and docs (macOS app, web UI, mobile if applicable, onboarding/overview docs) and add matching status + configuration forms so provider lists and settings stay in sync.
125
- - Version locations: `package.json` (CLI), `apps/android/app/build.gradle.kts` (versionName/versionCode), `apps/ios/Sources/Info.plist` + `apps/ios/Tests/Info.plist` (CFBundleShortVersionString/CFBundleVersion), `apps/macos/Sources/Moltbot/Resources/Info.plist` (CFBundleShortVersionString/CFBundleVersion), `docs/install/updating.md` (pinned npm version), `docs/platforms/mac/release.md` (APP_VERSION/APP_BUILD examples), Peekaboo Xcode projects/Info.plists (MARKETING_VERSION/CURRENT_PROJECT_VERSION).
126
- - **Restart apps:** “restart iOS/Android apps” means rebuild (recompile/install) and relaunch, not just kill/launch.
127
- - **Device checks:** before testing, verify connected real devices (iOS/Android) before reaching for simulators/emulators.
128
- - iOS Team ID lookup: `security find-identity -p codesigning -v` → use Apple Development (…) TEAMID. Fallback: `defaults read com.apple.dt.Xcode IDEProvisioningTeamIdentifiers`.
129
- - A2UI bundle hash: `src/canvas-host/a2ui/.bundle.hash` is auto-generated; ignore unexpected changes, and only regenerate via `pnpm canvas:a2ui:bundle` (or `scripts/bundle-a2ui.sh`) when needed. Commit the hash as a separate commit.
130
- - Release signing/notary keys are managed outside the repo; follow internal release docs.
131
- - Notary auth env vars (`APP_STORE_CONNECT_ISSUER_ID`, `APP_STORE_CONNECT_KEY_ID`, `APP_STORE_CONNECT_API_KEY_P8`) are expected in your environment (per internal release docs).
132
- - **Multi-agent safety:** do **not** create/apply/drop `git stash` entries unless explicitly requested (this includes `git pull --rebase --autostash`). Assume other agents may be working; keep unrelated WIP untouched and avoid cross-cutting state changes.
133
- - **Multi-agent safety:** when the user says "push", you may `git pull --rebase` to integrate latest changes (never discard other agents' work). When the user says "commit", scope to your changes only. When the user says "commit all", commit everything in grouped chunks.
134
- - **Multi-agent safety:** do **not** create/remove/modify `git worktree` checkouts (or edit `.worktrees/*`) unless explicitly requested.
135
- - **Multi-agent safety:** do **not** switch branches / check out a different branch unless explicitly requested.
136
- - **Multi-agent safety:** running multiple agents is OK as long as each agent has its own session.
137
- - **Multi-agent safety:** when you see unrecognized files, keep going; focus on your changes and commit only those.
138
- - Lint/format churn:
139
- - If staged+unstaged diffs are formatting-only, auto-resolve without asking.
140
- - If commit/push already requested, auto-stage and include formatting-only follow-ups in the same commit (or a tiny follow-up commit if needed), no extra confirmation.
141
- - Only ask when changes are semantic (logic/data/behavior).
142
- - Lobster seam: use the shared CLI palette in `src/terminal/palette.ts` (no hardcoded colors); apply palette to onboarding/config prompts and other TTY UI output as needed.
143
- - **Multi-agent safety:** focus reports on your edits; avoid guard-rail disclaimers unless truly blocked; when multiple agents touch the same file, continue if safe; end with a brief “other files present” note only if relevant.
144
- - Bug investigations: read source code of relevant npm dependencies and all related local code before concluding; aim for high-confidence root cause.
145
- - Code style: add brief comments for tricky logic; keep files under ~500 LOC when feasible (split/refactor as needed).
146
- - Tool schema guardrails (google-antigravity): avoid `Type.Union` in tool input schemas; no `anyOf`/`oneOf`/`allOf`. Use `stringEnum`/`optionalStringEnum` (Type.Unsafe enum) for string lists, and `Type.Optional(...)` instead of `... | null`. Keep top-level tool schema as `type: "object"` with `properties`.
147
- - Tool schema guardrails: avoid raw `format` property names in tool schemas; some validators treat `format` as a reserved keyword and reject the schema.
148
- - When asked to open a “session” file, open the Pi session logs under `~/.clawdbot/agents/<agentId>/sessions/*.jsonl` (use the `agent=<id>` value in the Runtime line of the system prompt; newest unless a specific ID is given), not the default `sessions.json`. If logs are needed from another machine, SSH via Tailscale and read the same path there.
149
- - Do not rebuild the macOS app over SSH; rebuilds must be run directly on the Mac.
150
- - Never send streaming/partial replies to external messaging surfaces (WhatsApp, Telegram); only final replies should be delivered there. Streaming/tool events may still go to internal UIs/control channel.
151
- - Voice wake forwarding tips:
152
- - Command template should stay `moltbot-mac agent --message "${text}" --thinking low`; `VoiceWakeForwarder` already shell-escapes `${text}`. Don’t add extra quotes.
153
- - launchd PATH is minimal; ensure the app’s launch agent PATH includes standard system paths plus your pnpm bin (typically `$HOME/Library/pnpm`) so `pnpm`/`moltbot` binaries resolve when invoked via `moltbot-mac`.
154
- - For manual `moltbot message send` messages that include `!`, use the heredoc pattern noted below to avoid the Bash tool’s escaping.
155
- - Release guardrails: do not change version numbers without operator’s explicit consent; always ask permission before running any npm publish/release step.
156
-
157
- ## NPM + 1Password (publish/verify)
158
- - Use the 1password skill; all `op` commands must run inside a fresh tmux session.
159
- - Sign in: `eval "$(op signin --account my.1password.com)"` (app unlocked + integration on).
160
- - OTP: `op read 'op://Private/Npmjs/one-time password?attribute=otp'`.
161
- - Publish: `npm publish --access public --otp="<otp>"` (run from the package dir).
162
- - Verify without local npmrc side effects: `npm view <pkg> version --userconfig "$(mktemp)"`.
163
- - Kill the tmux session after publish.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Agent.md DELETED
@@ -1,189 +0,0 @@
1
- # Agent.md
2
-
3
- ## 1. Deployment Configuration
4
-
5
- ### Target Space
6
- - **Profile:** `Leon4gr45`
7
- - **Space:** `openoperator`
8
- - **Full Identifier:** `Leon4gr45/openoperator`
9
- - **Frontend Port:** `7860` (mandatory for all Hugging Face Spaces)
10
-
11
- ### Deployment Method
12
- Choose the correct SDK based on the app type based on the codebase language:
13
-
14
- - **Gradio SDK** — for Gradio applications
15
- - **Streamlit SDK** — for Streamlit applications
16
- - **Docker SDK** — for all other applications (recommended default for flexibility)
17
-
18
- ### HF Token
19
- - The environment variable **`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` will always be provided at execution time**.
20
- - Never hardcode the token. Always read it from the environment.
21
- - All monitoring and log‑streaming commands rely on `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`.
22
-
23
- ### Required Files
24
- - `Dockerfile` (or `app.py` for Gradio/Streamlit SDKs)
25
- - `README.md` with Hugging Face YAML frontmatter:
26
- ```yaml
27
- ---
28
- title: Moltbot
29
- sdk: docker
30
- app_port: 7860
31
- ---
32
- ```
33
- - `.hfignore` to exclude unnecessary files
34
- - This `Agent.md` file (must be committed before deployment)
35
-
36
- ---
37
-
38
- ## 2. API Exposure and Documentation
39
-
40
- ### Mandatory Endpoints
41
- Every deployment **must** expose:
42
-
43
- - **`/health`**
44
- - Returns HTTP 200 when the app is ready.
45
- - Required for Hugging Face to transition the Space from *starting* → *running*.
46
-
47
- - **`/api-docs`**
48
- - Documents **all** available API endpoints.
49
- - Must be reachable at:
50
- `https://leon4gr45-openoperator.hf.space/api-docs`
51
-
52
- ### Functional Endpoints
53
- Document each endpoint here. For every endpoint, include:
54
-
55
- - **Method:** GET/POST/PUT/DELETE
56
- - **Path:** `/predict`, `/generate`, `/upload`, etc.
57
- - **Purpose:** What the endpoint does
58
- - **Request Example:** JSON or query parameters
59
- - **Response Example:** JSON schema or example payload
60
-
61
- Example format:
62
-
63
- ```
64
- ### /health
65
- - Method: GET
66
- - Purpose: Returns HTTP 200 when the app is ready. Required for Hugging Face to transition the Space from starting → running.
67
- - Request Example: GET /health
68
- - Response Example:
69
- {
70
- "status": "ok"
71
- }
72
-
73
- ### /api-docs
74
- - Method: GET
75
- - Purpose: Documents all available API endpoints.
76
- - Request Example: GET /api-docs
77
- - Response Example: Plain text documentation.
78
- ```
79
-
80
- All endpoints listed here **must** appear in `/api-docs`.
81
-
82
- ---
83
-
84
- ## 3. Deployment Workflow
85
-
86
- ### Standard Deployment Command
87
- After any code change, run:
88
-
89
- ```bash
90
- hf upload Leon4gr45/openoperator . --repo-type=space
91
- ```
92
-
93
- This command must be executed **after updating and committing Agent.md**.
94
-
95
- ### Deployment Steps
96
- 1. Ensure all code changes are committed.
97
- 2. Ensure `Agent.md` is updated and committed.
98
- 3. Run the upload command.
99
- 4. Wait for the Space to build.
100
- 5. Monitor logs (see next section).
101
- 6. When the Space is running, execute all test cases.
102
-
103
- ### Continuous Deployment Rule
104
- After **every** relevant edit (logic, dependencies, API changes):
105
-
106
- - Update `Agent.md`
107
- - Redeploy using the upload command
108
- - Re-run all test cases
109
- - Confirm `/health` and `/api-docs` are functional
110
-
111
- This applies even for long-running projects.
112
-
113
- ---
114
-
115
- ## 4. Monitoring and Logs
116
-
117
- ### Build Logs (SSE)
118
- ```bash
119
- curl -N \
120
- -H "Authorization: Bearer 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" \
121
- "https://huggingface.co/api/spaces/Leon4gr45/openoperator/logs/build"
122
- ```
123
-
124
- ### Run Logs (SSE)
125
- ```bash
126
- curl -N \
127
- -H "Authorization: Bearer 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" \
128
- "https://huggingface.co/api/spaces/Leon4gr45/openoperator/logs/run"
129
- ```
130
-
131
- ### Notes
132
- - If the Space stays in *starting* for too long, `/health` is usually failing.
133
- - If the Space times out after ~30 minutes, check logs immediately.
134
- - Fix issues, commit changes, redeploy.
135
-
136
- ---
137
-
138
- ## 5. Test Run Cases (Mandatory After Every Deployment)
139
-
140
- These tests ensure the agentic system can verify the deployment automatically.
141
-
142
- ### 1. Health Check
143
- ```
144
- GET https://leon4gr45-openoperator.hf.space/health
145
- Expected: HTTP 200, body: {"status": "ok"} or similar
146
- ```
147
-
148
- ### 2. API Docs Check
149
- ```
150
- GET https://leon4gr45-openoperator.hf.space/api-docs
151
- Expected: HTTP 200, valid documentation UI or JSON spec
152
- ```
153
-
154
- ### 3. Functional Endpoint Tests
155
- For each endpoint documented above, define:
156
-
157
- - Example request
158
- - Expected response structure
159
- - Validation criteria (e.g., non-empty output, valid JSON)
160
-
161
- Example:
162
-
163
- ```
164
- GET https://leon4gr45-openoperator.hf.space/health
165
- Expected:
166
- - HTTP 200
167
- - JSON with key "status"
168
- - No error fields
169
- ```
170
-
171
- ### 4. End-to-End Behaviour
172
- - Confirm the UI loads (if applicable)
173
- - Confirm API endpoints respond within reasonable time
174
- - Confirm no errors appear in run logs
175
-
176
- ---
177
-
178
- ## 6. Maintenance Rules
179
-
180
- - `Agent.md` must always reflect the **current** deployment configuration, API surface, and test cases.
181
- - Any change to:
182
- - API routes
183
- - Dockerfile
184
- - Dependencies
185
- - App logic
186
- - Deployment method
187
- requires updating this file.
188
- - This file must be committed **before** every deployment.
189
- - This file is the operational contract for autonomous agents interacting with the project.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
CHANGELOG.md DELETED
The diff for this file is too large to render. See raw diff
 
CLAUDE.md DELETED
@@ -1,163 +0,0 @@
1
- # Repository Guidelines
2
- - Repo: https://github.com/moltbot/moltbot
3
- - GitHub issues/comments/PR comments: use literal multiline strings or `-F - <<'EOF'` (or $'...') for real newlines; never embed "\\n".
4
-
5
- ## Project Structure & Module Organization
6
- - Source code: `src/` (CLI wiring in `src/cli`, commands in `src/commands`, web provider in `src/provider-web.ts`, infra in `src/infra`, media pipeline in `src/media`).
7
- - Tests: colocated `*.test.ts`.
8
- - Docs: `docs/` (images, queue, Pi config). Built output lives in `dist/`.
9
- - Plugins/extensions: live under `extensions/*` (workspace packages). Keep plugin-only deps in the extension `package.json`; do not add them to the root `package.json` unless core uses them.
10
- - Plugins: install runs `npm install --omit=dev` in plugin dir; runtime deps must live in `dependencies`. Avoid `workspace:*` in `dependencies` (npm install breaks); put `moltbot` in `devDependencies` or `peerDependencies` instead (runtime resolves `clawdbot/plugin-sdk` via jiti alias).
11
- - Installers served from `https://molt.bot/*`: live in the sibling repo `../molt.bot` (`public/install.sh`, `public/install-cli.sh`, `public/install.ps1`).
12
- - Messaging channels: always consider **all** built-in + extension channels when refactoring shared logic (routing, allowlists, pairing, command gating, onboarding, docs).
13
- - Core channel docs: `docs/channels/`
14
- - Core channel code: `src/telegram`, `src/discord`, `src/slack`, `src/signal`, `src/imessage`, `src/web` (WhatsApp web), `src/channels`, `src/routing`
15
- - Extensions (channel plugins): `extensions/*` (e.g. `extensions/msteams`, `extensions/matrix`, `extensions/zalo`, `extensions/zalouser`, `extensions/voice-call`)
16
- - When adding channels/extensions/apps/docs, review `.github/labeler.yml` for label coverage.
17
-
18
- ## Docs Linking (Mintlify)
19
- - Docs are hosted on Mintlify (docs.molt.bot).
20
- - Internal doc links in `docs/**/*.md`: root-relative, no `.md`/`.mdx` (example: `[Config](/configuration)`).
21
- - Section cross-references: use anchors on root-relative paths (example: `[Hooks](/configuration#hooks)`).
22
- - Doc headings and anchors: avoid em dashes and apostrophes in headings because they break Mintlify anchor links.
23
- - When Peter asks for links, reply with full `https://docs.molt.bot/...` URLs (not root-relative).
24
- - When you touch docs, end the reply with the `https://docs.molt.bot/...` URLs you referenced.
25
- - README (GitHub): keep absolute docs URLs (`https://docs.molt.bot/...`) so links work on GitHub.
26
- - Docs content must be generic: no personal device names/hostnames/paths; use placeholders like `user@gateway-host` and “gateway host”.
27
-
28
- ## exe.dev VM ops (general)
29
- - Access: stable path is `ssh exe.dev` then `ssh vm-name` (assume SSH key already set).
30
- - SSH flaky: use exe.dev web terminal or Shelley (web agent); keep a tmux session for long ops.
31
- - Update: `sudo npm i -g moltbot@latest` (global install needs root on `/usr/lib/node_modules`).
32
- - Config: use `moltbot config set ...`; ensure `gateway.mode=local` is set.
33
- - Discord: store raw token only (no `DISCORD_BOT_TOKEN=` prefix).
34
- - Restart: stop old gateway and run:
35
- `pkill -9 -f moltbot-gateway || true; nohup moltbot gateway run --bind loopback --port 18789 --force > /tmp/moltbot-gateway.log 2>&1 &`
36
- - Verify: `moltbot channels status --probe`, `ss -ltnp | rg 18789`, `tail -n 120 /tmp/moltbot-gateway.log`.
37
-
38
- ## Build, Test, and Development Commands
39
- - Runtime baseline: Node **22+** (keep Node + Bun paths working).
40
- - Install deps: `pnpm install`
41
- - Pre-commit hooks: `prek install` (runs same checks as CI)
42
- - Also supported: `bun install` (keep `pnpm-lock.yaml` + Bun patching in sync when touching deps/patches).
43
- - Prefer Bun for TypeScript execution (scripts, dev, tests): `bun <file.ts>` / `bunx <tool>`.
44
- - Run CLI in dev: `pnpm moltbot ...` (bun) or `pnpm dev`.
45
- - Node remains supported for running built output (`dist/*`) and production installs.
46
- - Mac packaging (dev): `scripts/package-mac-app.sh` defaults to current arch. Release checklist: `docs/platforms/mac/release.md`.
47
- - Type-check/build: `pnpm build` (tsc)
48
- - Lint/format: `pnpm lint` (oxlint), `pnpm format` (oxfmt)
49
- - Tests: `pnpm test` (vitest); coverage: `pnpm test:coverage`
50
-
51
- ## Coding Style & Naming Conventions
52
- - Language: TypeScript (ESM). Prefer strict typing; avoid `any`.
53
- - Formatting/linting via Oxlint and Oxfmt; run `pnpm lint` before commits.
54
- - Add brief code comments for tricky or non-obvious logic.
55
- - Keep files concise; extract helpers instead of “V2” copies. Use existing patterns for CLI options and dependency injection via `createDefaultDeps`.
56
- - Aim to keep files under ~700 LOC; guideline only (not a hard guardrail). Split/refactor when it improves clarity or testability.
57
- - Naming: use **Moltbot** for product/app/docs headings; use `moltbot` for CLI command, package/binary, paths, and config keys.
58
-
59
- ## Release Channels (Naming)
60
- - stable: tagged releases only (e.g. `vYYYY.M.D`), npm dist-tag `latest`.
61
- - beta: prerelease tags `vYYYY.M.D-beta.N`, npm dist-tag `beta` (may ship without macOS app).
62
- - dev: moving head on `main` (no tag; git checkout main).
63
-
64
- ## Testing Guidelines
65
- - Framework: Vitest with V8 coverage thresholds (70% lines/branches/functions/statements).
66
- - Naming: match source names with `*.test.ts`; e2e in `*.e2e.test.ts`.
67
- - Run `pnpm test` (or `pnpm test:coverage`) before pushing when you touch logic.
68
- - Do not set test workers above 16; tried already.
69
- - Live tests (real keys): `CLAWDBOT_LIVE_TEST=1 pnpm test:live` (Moltbot-only) or `LIVE=1 pnpm test:live` (includes provider live tests). Docker: `pnpm test:docker:live-models`, `pnpm test:docker:live-gateway`. Onboarding Docker E2E: `pnpm test:docker:onboard`.
70
- - Full kit + what’s covered: `docs/testing.md`.
71
- - Pure test additions/fixes generally do **not** need a changelog entry unless they alter user-facing behavior or the user asks for one.
72
- - Mobile: before using a simulator, check for connected real devices (iOS + Android) and prefer them when available.
73
-
74
- ## Commit & Pull Request Guidelines
75
- - Create commits with `scripts/committer "<msg>" <file...>`; avoid manual `git add`/`git commit` so staging stays scoped.
76
- - Follow concise, action-oriented commit messages (e.g., `CLI: add verbose flag to send`).
77
- - Group related changes; avoid bundling unrelated refactors.
78
- - Changelog workflow: keep latest released version at top (no `Unreleased`); after publishing, bump version and start a new top section.
79
- - PRs should summarize scope, note testing performed, and mention any user-facing changes or new flags.
80
- - PR review flow: when given a PR link, review via `gh pr view`/`gh pr diff` and do **not** change branches.
81
- - PR review calls: prefer a single `gh pr view --json ...` to batch metadata/comments; run `gh pr diff` only when needed.
82
- - Before starting a review when a GH Issue/PR is pasted: run `git pull`; if there are local changes or unpushed commits, stop and alert the user before reviewing.
83
- - Goal: merge PRs. Prefer **rebase** when commits are clean; **squash** when history is messy.
84
- - PR merge flow: create a temp branch from `main`, merge the PR branch into it (prefer squash unless commit history is important; use rebase/merge when it is). Always try to merge the PR unless it’s truly difficult, then use another approach. If we squash, add the PR author as a co-contributor. Apply fixes, add changelog entry (include PR # + thanks), run full gate before the final commit, commit, merge back to `main`, delete the temp branch, and end on `main`.
85
- - If you review a PR and later do work on it, land via merge/squash (no direct-main commits) and always add the PR author as a co-contributor.
86
- - When working on a PR: add a changelog entry with the PR number and thank the contributor.
87
- - When working on an issue: reference the issue in the changelog entry.
88
- - When merging a PR: leave a PR comment that explains exactly what we did and include the SHA hashes.
89
- - When merging a PR from a new contributor: add their avatar to the README “Thanks to all clawtributors” thumbnail list.
90
- - After merging a PR: run `bun scripts/update-clawtributors.ts` if the contributor is missing, then commit the regenerated README.
91
-
92
- ## Shorthand Commands
93
- - `sync`: if working tree is dirty, commit all changes (pick a sensible Conventional Commit message), then `git pull --rebase`; if rebase conflicts and cannot resolve, stop; otherwise `git push`.
94
-
95
- ### PR Workflow (Review vs Land)
96
- - **Review mode (PR link only):** read `gh pr view/diff`; **do not** switch branches; **do not** change code.
97
- - **Landing mode:** create an integration branch from `main`, bring in PR commits (**prefer rebase** for linear history; **merge allowed** when complexity/conflicts make it safer), apply fixes, add changelog (+ thanks + PR #), run full gate **locally before committing** (`pnpm lint && pnpm build && pnpm test`), commit, merge back to `main`, then `git switch main` (never stay on a topic branch after landing). Important: contributor needs to be in git graph after this!
98
-
99
- ## Security & Configuration Tips
100
- - Web provider stores creds at `~/.clawdbot/credentials/`; rerun `moltbot login` if logged out.
101
- - Pi sessions live under `~/.clawdbot/sessions/` by default; the base directory is not configurable.
102
- - Environment variables: see `~/.profile`.
103
- - Never commit or publish real phone numbers, videos, or live configuration values. Use obviously fake placeholders in docs, tests, and examples.
104
- - Release flow: always read `docs/reference/RELEASING.md` and `docs/platforms/mac/release.md` before any release work; do not ask routine questions once those docs answer them.
105
-
106
- ## Troubleshooting
107
- - Rebrand/migration issues or legacy config/service warnings: run `moltbot doctor` (see `docs/gateway/doctor.md`).
108
-
109
- ## Agent-Specific Notes
110
- - Vocabulary: "makeup" = "mac app".
111
- - Never edit `node_modules` (global/Homebrew/npm/git installs too). Updates overwrite. Skill notes go in `tools.md` or `AGENTS.md`.
112
- - Signal: "update fly" => `fly ssh console -a flawd-bot -C "bash -lc 'cd /data/clawd/moltbot && git pull --rebase origin main'"` then `fly machines restart e825232f34d058 -a flawd-bot`.
113
- - When working on a GitHub Issue or PR, print the full URL at the end of the task.
114
- - When answering questions, respond with high-confidence answers only: verify in code; do not guess.
115
- - Never update the Carbon dependency.
116
- - Any dependency with `pnpm.patchedDependencies` must use an exact version (no `^`/`~`).
117
- - Patching dependencies (pnpm patches, overrides, or vendored changes) requires explicit approval; do not do this by default.
118
- - CLI progress: use `src/cli/progress.ts` (`osc-progress` + `@clack/prompts` spinner); don’t hand-roll spinners/bars.
119
- - Status output: keep tables + ANSI-safe wrapping (`src/terminal/table.ts`); `status --all` = read-only/pasteable, `status --deep` = probes.
120
- - Gateway currently runs only as the menubar app; there is no separate LaunchAgent/helper label installed. Restart via the Moltbot Mac app or `scripts/restart-mac.sh`; to verify/kill use `launchctl print gui/$UID | grep moltbot` rather than assuming a fixed label. **When debugging on macOS, start/stop the gateway via the app, not ad-hoc tmux sessions; kill any temporary tunnels before handoff.**
121
- - macOS logs: use `./scripts/clawlog.sh` to query unified logs for the Moltbot subsystem; it supports follow/tail/category filters and expects passwordless sudo for `/usr/bin/log`.
122
- - If shared guardrails are available locally, review them; otherwise follow this repo's guidance.
123
- - SwiftUI state management (iOS/macOS): prefer the `Observation` framework (`@Observable`, `@Bindable`) over `ObservableObject`/`@StateObject`; don’t introduce new `ObservableObject` unless required for compatibility, and migrate existing usages when touching related code.
124
- - Connection providers: when adding a new connection, update every UI surface and docs (macOS app, web UI, mobile if applicable, onboarding/overview docs) and add matching status + configuration forms so provider lists and settings stay in sync.
125
- - Version locations: `package.json` (CLI), `apps/android/app/build.gradle.kts` (versionName/versionCode), `apps/ios/Sources/Info.plist` + `apps/ios/Tests/Info.plist` (CFBundleShortVersionString/CFBundleVersion), `apps/macos/Sources/Moltbot/Resources/Info.plist` (CFBundleShortVersionString/CFBundleVersion), `docs/install/updating.md` (pinned npm version), `docs/platforms/mac/release.md` (APP_VERSION/APP_BUILD examples), Peekaboo Xcode projects/Info.plists (MARKETING_VERSION/CURRENT_PROJECT_VERSION).
126
- - **Restart apps:** “restart iOS/Android apps” means rebuild (recompile/install) and relaunch, not just kill/launch.
127
- - **Device checks:** before testing, verify connected real devices (iOS/Android) before reaching for simulators/emulators.
128
- - iOS Team ID lookup: `security find-identity -p codesigning -v` → use Apple Development (…) TEAMID. Fallback: `defaults read com.apple.dt.Xcode IDEProvisioningTeamIdentifiers`.
129
- - A2UI bundle hash: `src/canvas-host/a2ui/.bundle.hash` is auto-generated; ignore unexpected changes, and only regenerate via `pnpm canvas:a2ui:bundle` (or `scripts/bundle-a2ui.sh`) when needed. Commit the hash as a separate commit.
130
- - Release signing/notary keys are managed outside the repo; follow internal release docs.
131
- - Notary auth env vars (`APP_STORE_CONNECT_ISSUER_ID`, `APP_STORE_CONNECT_KEY_ID`, `APP_STORE_CONNECT_API_KEY_P8`) are expected in your environment (per internal release docs).
132
- - **Multi-agent safety:** do **not** create/apply/drop `git stash` entries unless explicitly requested (this includes `git pull --rebase --autostash`). Assume other agents may be working; keep unrelated WIP untouched and avoid cross-cutting state changes.
133
- - **Multi-agent safety:** when the user says "push", you may `git pull --rebase` to integrate latest changes (never discard other agents' work). When the user says "commit", scope to your changes only. When the user says "commit all", commit everything in grouped chunks.
134
- - **Multi-agent safety:** do **not** create/remove/modify `git worktree` checkouts (or edit `.worktrees/*`) unless explicitly requested.
135
- - **Multi-agent safety:** do **not** switch branches / check out a different branch unless explicitly requested.
136
- - **Multi-agent safety:** running multiple agents is OK as long as each agent has its own session.
137
- - **Multi-agent safety:** when you see unrecognized files, keep going; focus on your changes and commit only those.
138
- - Lint/format churn:
139
- - If staged+unstaged diffs are formatting-only, auto-resolve without asking.
140
- - If commit/push already requested, auto-stage and include formatting-only follow-ups in the same commit (or a tiny follow-up commit if needed), no extra confirmation.
141
- - Only ask when changes are semantic (logic/data/behavior).
142
- - Lobster seam: use the shared CLI palette in `src/terminal/palette.ts` (no hardcoded colors); apply palette to onboarding/config prompts and other TTY UI output as needed.
143
- - **Multi-agent safety:** focus reports on your edits; avoid guard-rail disclaimers unless truly blocked; when multiple agents touch the same file, continue if safe; end with a brief “other files present” note only if relevant.
144
- - Bug investigations: read source code of relevant npm dependencies and all related local code before concluding; aim for high-confidence root cause.
145
- - Code style: add brief comments for tricky logic; keep files under ~500 LOC when feasible (split/refactor as needed).
146
- - Tool schema guardrails (google-antigravity): avoid `Type.Union` in tool input schemas; no `anyOf`/`oneOf`/`allOf`. Use `stringEnum`/`optionalStringEnum` (Type.Unsafe enum) for string lists, and `Type.Optional(...)` instead of `... | null`. Keep top-level tool schema as `type: "object"` with `properties`.
147
- - Tool schema guardrails: avoid raw `format` property names in tool schemas; some validators treat `format` as a reserved keyword and reject the schema.
148
- - When asked to open a “session” file, open the Pi session logs under `~/.clawdbot/agents/<agentId>/sessions/*.jsonl` (use the `agent=<id>` value in the Runtime line of the system prompt; newest unless a specific ID is given), not the default `sessions.json`. If logs are needed from another machine, SSH via Tailscale and read the same path there.
149
- - Do not rebuild the macOS app over SSH; rebuilds must be run directly on the Mac.
150
- - Never send streaming/partial replies to external messaging surfaces (WhatsApp, Telegram); only final replies should be delivered there. Streaming/tool events may still go to internal UIs/control channel.
151
- - Voice wake forwarding tips:
152
- - Command template should stay `moltbot-mac agent --message "${text}" --thinking low`; `VoiceWakeForwarder` already shell-escapes `${text}`. Don’t add extra quotes.
153
- - launchd PATH is minimal; ensure the app’s launch agent PATH includes standard system paths plus your pnpm bin (typically `$HOME/Library/pnpm`) so `pnpm`/`moltbot` binaries resolve when invoked via `moltbot-mac`.
154
- - For manual `moltbot message send` messages that include `!`, use the heredoc pattern noted below to avoid the Bash tool’s escaping.
155
- - Release guardrails: do not change version numbers without operator’s explicit consent; always ask permission before running any npm publish/release step.
156
-
157
- ## NPM + 1Password (publish/verify)
158
- - Use the 1password skill; all `op` commands must run inside a fresh tmux session.
159
- - Sign in: `eval "$(op signin --account my.1password.com)"` (app unlocked + integration on).
160
- - OTP: `op read 'op://Private/Npmjs/one-time password?attribute=otp'`.
161
- - Publish: `npm publish --access public --otp="<otp>"` (run from the package dir).
162
- - Verify without local npmrc side effects: `npm view <pkg> version --userconfig "$(mktemp)"`.
163
- - Kill the tmux session after publish.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
CONTRIBUTING.md DELETED
@@ -1,52 +0,0 @@
1
- # Contributing to Moltbot
2
-
3
- Welcome to the lobster tank! 🦞
4
-
5
- ## Quick Links
6
- - **GitHub:** https://github.com/moltbot/moltbot
7
- - **Discord:** https://discord.gg/qkhbAGHRBT
8
- - **X/Twitter:** [@steipete](https://x.com/steipete) / [@moltbot](https://x.com/moltbot)
9
-
10
- ## Maintainers
11
-
12
- - **Peter Steinberger** - Benevolent Dictator
13
- - GitHub: [@steipete](https://github.com/steipete) · X: [@steipete](https://x.com/steipete)
14
-
15
- - **Shadow** - Discord + Slack subsystem
16
- - GitHub: [@thewilloftheshadow](https://github.com/thewilloftheshadow) · X: [@4shad0wed](https://x.com/4shad0wed)
17
-
18
- - **Jos** - Telegram, API, Nix mode
19
- - GitHub: [@joshp123](https://github.com/joshp123) · X: [@jjpcodes](https://x.com/jjpcodes)
20
-
21
- ## How to Contribute
22
- 1. **Bugs & small fixes** → Open a PR!
23
- 2. **New features / architecture** → Start a [GitHub Discussion](https://github.com/moltbot/moltbot/discussions) or ask in Discord first
24
- 3. **Questions** → Discord #setup-help
25
-
26
- ## Before You PR
27
- - Test locally with your Moltbot instance
28
- - Run linter: `npm run lint`
29
- - Keep PRs focused (one thing per PR)
30
- - Describe what & why
31
-
32
- ## AI/Vibe-Coded PRs Welcome! 🤖
33
-
34
- Built with Codex, Claude, or other AI tools? **Awesome - just mark it!**
35
-
36
- Please include in your PR:
37
- - [ ] Mark as AI-assisted in the PR title or description
38
- - [ ] Note the degree of testing (untested / lightly tested / fully tested)
39
- - [ ] Include prompts or session logs if possible (super helpful!)
40
- - [ ] Confirm you understand what the code does
41
-
42
- AI PRs are first-class citizens here. We just want transparency so reviewers know what to look for.
43
-
44
- ## Current Focus & Roadmap 🗺
45
-
46
- We are currently prioritizing:
47
- - **Stability**: Fixing edge cases in channel connections (WhatsApp/Telegram).
48
- - **UX**: Improving the onboarding wizard and error messages.
49
- - **Skills**: Expanding the library of bundled skills and improving the Skill Creation developer experience.
50
- - **Performance**: Optimizing token usage and compaction logic.
51
-
52
- Check the [GitHub Issues](https://github.com/moltbot/moltbot/issues) for "good first issue" labels!
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Dockerfile.sandbox DELETED
@@ -1,16 +0,0 @@
1
- FROM debian:bookworm-slim
2
-
3
- ENV DEBIAN_FRONTEND=noninteractive
4
-
5
- RUN apt-get update \
6
- && apt-get install -y --no-install-recommends \
7
- bash \
8
- ca-certificates \
9
- curl \
10
- git \
11
- jq \
12
- python3 \
13
- ripgrep \
14
- && rm -rf /var/lib/apt/lists/*
15
-
16
- CMD ["sleep", "infinity"]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Dockerfile.sandbox-browser DELETED
@@ -1,28 +0,0 @@
1
- FROM debian:bookworm-slim
2
-
3
- ENV DEBIAN_FRONTEND=noninteractive
4
-
5
- RUN apt-get update \
6
- && apt-get install -y --no-install-recommends \
7
- bash \
8
- ca-certificates \
9
- chromium \
10
- curl \
11
- fonts-liberation \
12
- fonts-noto-color-emoji \
13
- git \
14
- jq \
15
- novnc \
16
- python3 \
17
- socat \
18
- websockify \
19
- x11vnc \
20
- xvfb \
21
- && rm -rf /var/lib/apt/lists/*
22
-
23
- COPY scripts/sandbox-browser-entrypoint.sh /usr/local/bin/moltbot-sandbox-browser
24
- RUN chmod +x /usr/local/bin/moltbot-sandbox-browser
25
-
26
- EXPOSE 9222 5900 6080
27
-
28
- CMD ["moltbot-sandbox-browser"]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
LICENSE DELETED
@@ -1,21 +0,0 @@
1
- MIT License
2
-
3
- Copyright (c) 2025 Peter Steinberger
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.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
PROJECT_README.md DELETED
@@ -1,67 +0,0 @@
1
- # Open Lovable
2
-
3
- Chat with AI to build React apps instantly. An example app made by the [Firecrawl](https://firecrawl.dev/?ref=open-lovable-github) team. For a complete cloud solution, check out [Lovable.dev](https://lovable.dev/) ❤️.
4
-
5
- <img src="https://media1.giphy.com/media/v1.Y2lkPTc5MGI3NjExbmZtaHFleGRsMTNlaWNydGdianI4NGQ4dHhyZjB0d2VkcjRyeXBucCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/ZFVLWMa6dVskQX0qu1/giphy.gif" alt="Open Lovable Demo" width="100%"/>
6
-
7
- ## Setup
8
-
9
- 1. **Clone & Install**
10
- ```bash
11
- git clone https://github.com/firecrawl/open-lovable.git
12
- cd open-lovable
13
- pnpm install # or npm install / yarn install
14
- ```
15
-
16
- 2. **Add `.env.local`**
17
-
18
- ```env
19
- # =================================================================
20
- # REQUIRED
21
- # =================================================================
22
- FIRECRAWL_API_KEY=your_firecrawl_api_key # https://firecrawl.dev
23
-
24
- # =================================================================
25
- # AI PROVIDER - Choose your LLM
26
- # =================================================================
27
- GEMINI_API_KEY=your_gemini_api_key # https://aistudio.google.com/app/apikey
28
- ANTHROPIC_API_KEY=your_anthropic_api_key # https://console.anthropic.com
29
- OPENAI_API_KEY=your_openai_api_key # https://platform.openai.com
30
- GROQ_API_KEY=your_groq_api_key # https://console.groq.com
31
-
32
- # =================================================================
33
- # FAST APPLY (Optional - for faster edits)
34
- # =================================================================
35
- MORPH_API_KEY=your_morphllm_api_key # https://morphllm.com/dashboard
36
-
37
- # =================================================================
38
- # SANDBOX PROVIDER - Choose ONE: Vercel (default) or E2B
39
- # =================================================================
40
- SANDBOX_PROVIDER=vercel # or 'e2b'
41
-
42
- # Option 1: Vercel Sandbox (default)
43
- # Choose one authentication method:
44
-
45
- # Method A: OIDC Token (recommended for development)
46
- # Run `vercel link` then `vercel env pull` to get VERCEL_OIDC_TOKEN automatically
47
- VERCEL_OIDC_TOKEN=auto_generated_by_vercel_env_pull
48
-
49
- # Method B: Personal Access Token (for production or when OIDC unavailable)
50
- # VERCEL_TEAM_ID=team_xxxxxxxxx # Your Vercel team ID
51
- # VERCEL_PROJECT_ID=prj_xxxxxxxxx # Your Vercel project ID
52
- # VERCEL_TOKEN=vercel_xxxxxxxxxxxx # Personal access token from Vercel dashboard
53
-
54
- # Option 2: E2B Sandbox
55
- # E2B_API_KEY=your_e2b_api_key # https://e2b.dev
56
- ```
57
-
58
- 3. **Run**
59
- ```bash
60
- pnpm dev # or npm run dev / yarn dev
61
- ```
62
-
63
- Open [http://localhost:3000](http://localhost:3000)
64
-
65
- ## License
66
-
67
- MIT
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
README-header.png DELETED

Git LFS Details

  • SHA256: 31a53674902787b6665ee3cb9a01e50f66352004db4f023e4e6506b6c07fb80a
  • Pointer size: 132 Bytes
  • Size of remote file: 1.41 MB
SECURITY.md DELETED
@@ -1,61 +0,0 @@
1
- # Security Policy
2
-
3
- If you believe you've found a security issue in Moltbot, please report it privately.
4
-
5
- ## Reporting
6
-
7
- - Email: `steipete@gmail.com`
8
- - What to include: reproduction steps, impact assessment, and (if possible) a minimal PoC.
9
-
10
- ## Operational Guidance
11
-
12
- For threat model + hardening guidance (including `moltbot security audit --deep` and `--fix`), see:
13
-
14
- - `https://docs.molt.bot/gateway/security`
15
-
16
- ### Web Interface Safety
17
-
18
- Moltbot's web interface is intended for local use only. Do **not** bind it to the public internet; it is not hardened for public exposure.
19
-
20
- ## Runtime Requirements
21
-
22
- ### Node.js Version
23
-
24
- Moltbot requires **Node.js 22.12.0 or later** (LTS). This version includes important security patches:
25
-
26
- - CVE-2025-59466: async_hooks DoS vulnerability
27
- - CVE-2026-21636: Permission model bypass vulnerability
28
-
29
- Verify your Node.js version:
30
-
31
- ```bash
32
- node --version # Should be v22.12.0 or later
33
- ```
34
-
35
- ### Docker Security
36
-
37
- When running Moltbot in Docker:
38
-
39
- 1. The official image runs as a non-root user (`node`) for reduced attack surface
40
- 2. Use `--read-only` flag when possible for additional filesystem protection
41
- 3. Limit container capabilities with `--cap-drop=ALL`
42
-
43
- Example secure Docker run:
44
-
45
- ```bash
46
- docker run --read-only --cap-drop=ALL \
47
- -v moltbot-data:/app/data \
48
- moltbot/moltbot:latest
49
- ```
50
-
51
- ## Security Scanning
52
-
53
- This project uses `detect-secrets` for automated secret detection in CI/CD.
54
- See `.detect-secrets.cfg` for configuration and `.secrets.baseline` for the baseline.
55
-
56
- Run locally:
57
-
58
- ```bash
59
- pip install detect-secrets==1.5.0
60
- detect-secrets scan --baseline .secrets.baseline
61
- ```
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Swabble/.github/workflows/ci.yml DELETED
@@ -1,54 +0,0 @@
1
- name: CI
2
-
3
- on:
4
- push:
5
- branches: [main]
6
- pull_request:
7
-
8
- jobs:
9
- build-and-test:
10
- runs-on: macos-latest
11
- defaults:
12
- run:
13
- shell: bash
14
- working-directory: swabble
15
- steps:
16
- - name: Checkout swabble
17
- uses: actions/checkout@v4
18
- with:
19
- path: swabble
20
-
21
- - name: Select Xcode 26.1 (prefer 26.1.1)
22
- run: |
23
- set -euo pipefail
24
- # pick the newest installed 26.1.x, fallback to newest 26.x
25
- CANDIDATE="$(ls -d /Applications/Xcode_26.1*.app 2>/dev/null | sort -V | tail -1 || true)"
26
- if [[ -z "$CANDIDATE" ]]; then
27
- CANDIDATE="$(ls -d /Applications/Xcode_26*.app 2>/dev/null | sort -V | tail -1 || true)"
28
- fi
29
- if [[ -z "$CANDIDATE" ]]; then
30
- echo "No Xcode 26.x found on runner" >&2
31
- exit 1
32
- fi
33
- echo "Selecting $CANDIDATE"
34
- sudo xcode-select -s "$CANDIDATE"
35
- xcodebuild -version
36
-
37
- - name: Show Swift version
38
- run: swift --version
39
-
40
- - name: Install tooling
41
- run: |
42
- brew update
43
- brew install swiftlint swiftformat
44
-
45
- - name: Format check
46
- run: |
47
- ./scripts/format.sh
48
- git diff --exit-code
49
-
50
- - name: Lint
51
- run: ./scripts/lint.sh
52
-
53
- - name: Test
54
- run: swift test --parallel
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Swabble/.gitignore DELETED
@@ -1,33 +0,0 @@
1
- # macOS
2
- .DS_Store
3
-
4
- # SwiftPM / Build
5
- /.build
6
- /.swiftpm
7
- /DerivedData
8
- xcuserdata/
9
- *.xcuserstate
10
-
11
- # Editors
12
- /.vscode
13
- .idea/
14
-
15
- # Xcode artifacts
16
- *.hmap
17
- *.ipa
18
- *.dSYM.zip
19
- *.dSYM
20
-
21
- # Playgrounds
22
- *.xcplayground
23
- playground.xcworkspace
24
- timeline.xctimeline
25
-
26
- # Carthage
27
- Carthage/Build/
28
-
29
- # fastlane
30
- fastlane/report.xml
31
- fastlane/Preview.html
32
- fastlane/screenshots/**/*.png
33
- fastlane/test_output
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Swabble/.swiftformat DELETED
@@ -1,8 +0,0 @@
1
- --swiftversion 6.2
2
- --indent 4
3
- --maxwidth 120
4
- --wraparguments before-first
5
- --wrapcollections before-first
6
- --stripunusedargs closure-only
7
- --self remove
8
- --header ""
 
 
 
 
 
 
 
 
 
Swabble/.swiftlint.yml DELETED
@@ -1,43 +0,0 @@
1
- # SwiftLint for swabble
2
- included:
3
- - Sources
4
- excluded:
5
- - .build
6
- - DerivedData
7
- - "**/.swiftpm"
8
- - "**/.build"
9
- - "**/DerivedData"
10
- - "**/.DS_Store"
11
- opt_in_rules:
12
- - array_init
13
- - closure_spacing
14
- - explicit_init
15
- - fatal_error_message
16
- - first_where
17
- - joined_default_parameter
18
- - last_where
19
- - literal_expression_end_indentation
20
- - multiline_arguments
21
- - multiline_parameters
22
- - operator_usage_whitespace
23
- - redundant_nil_coalescing
24
- - sorted_first_last
25
- - switch_case_alignment
26
- - vertical_parameter_alignment_on_call
27
- - vertical_whitespace_opening_braces
28
- - vertical_whitespace_closing_braces
29
-
30
- disabled_rules:
31
- - trailing_whitespace
32
- - trailing_newline
33
- - indentation_width
34
- - identifier_name
35
- - explicit_self
36
- - file_header
37
- - todo
38
-
39
- line_length:
40
- warning: 140
41
- error: 180
42
-
43
- reporter: "xcode"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Swabble/CHANGELOG.md DELETED
@@ -1,11 +0,0 @@
1
- # Changelog
2
-
3
- ## 0.2.0 — 2025-12-23
4
-
5
- ### Highlights
6
- - Added `SwabbleKit` (multi-platform wake-word gate utilities with segment-aware gap detection).
7
- - Swabble package now supports iOS + macOS consumers; CLI remains macOS 26-only.
8
-
9
- ### Changes
10
- - CLI wake-word matching/stripping routed through `SwabbleKit` helpers.
11
- - Speech pipeline types now explicitly gated to macOS 26 / iOS 26 availability.
 
 
 
 
 
 
 
 
 
 
 
 
Swabble/LICENSE DELETED
@@ -1,21 +0,0 @@
1
- MIT License
2
-
3
- Copyright (c) 2025 Peter Steinberger
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.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Swabble/Package.resolved DELETED
@@ -1,33 +0,0 @@
1
- {
2
- "originHash" : "c0677e232394b5f6b0191b6dbb5bae553d55264f65ae725cd03a8ffdfda9cdd3",
3
- "pins" : [
4
- {
5
- "identity" : "commander",
6
- "kind" : "remoteSourceControl",
7
- "location" : "https://github.com/steipete/Commander.git",
8
- "state" : {
9
- "revision" : "9e349575c8e3c6745e81fe19e5bb5efa01b078ce",
10
- "version" : "0.2.1"
11
- }
12
- },
13
- {
14
- "identity" : "swift-syntax",
15
- "kind" : "remoteSourceControl",
16
- "location" : "https://github.com/swiftlang/swift-syntax.git",
17
- "state" : {
18
- "revision" : "0687f71944021d616d34d922343dcef086855920",
19
- "version" : "600.0.1"
20
- }
21
- },
22
- {
23
- "identity" : "swift-testing",
24
- "kind" : "remoteSourceControl",
25
- "location" : "https://github.com/apple/swift-testing",
26
- "state" : {
27
- "revision" : "399f76dcd91e4c688ca2301fa24a8cc6d9927211",
28
- "version" : "0.99.0"
29
- }
30
- }
31
- ],
32
- "version" : 3
33
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Swabble/Package.swift DELETED
@@ -1,55 +0,0 @@
1
- // swift-tools-version: 6.2
2
- import PackageDescription
3
-
4
- let package = Package(
5
- name: "swabble",
6
- platforms: [
7
- .macOS(.v15),
8
- .iOS(.v17),
9
- ],
10
- products: [
11
- .library(name: "Swabble", targets: ["Swabble"]),
12
- .library(name: "SwabbleKit", targets: ["SwabbleKit"]),
13
- .executable(name: "swabble", targets: ["SwabbleCLI"]),
14
- ],
15
- dependencies: [
16
- .package(url: "https://github.com/steipete/Commander.git", exact: "0.2.1"),
17
- .package(url: "https://github.com/apple/swift-testing", from: "0.99.0"),
18
- ],
19
- targets: [
20
- .target(
21
- name: "Swabble",
22
- path: "Sources/SwabbleCore",
23
- swiftSettings: []),
24
- .target(
25
- name: "SwabbleKit",
26
- path: "Sources/SwabbleKit",
27
- swiftSettings: [
28
- .enableUpcomingFeature("StrictConcurrency"),
29
- ]),
30
- .executableTarget(
31
- name: "SwabbleCLI",
32
- dependencies: [
33
- "Swabble",
34
- "SwabbleKit",
35
- .product(name: "Commander", package: "Commander"),
36
- ],
37
- path: "Sources/swabble"),
38
- .testTarget(
39
- name: "SwabbleKitTests",
40
- dependencies: [
41
- "SwabbleKit",
42
- .product(name: "Testing", package: "swift-testing"),
43
- ],
44
- swiftSettings: [
45
- .enableUpcomingFeature("StrictConcurrency"),
46
- .enableExperimentalFeature("SwiftTesting"),
47
- ]),
48
- .testTarget(
49
- name: "swabbleTests",
50
- dependencies: [
51
- "Swabble",
52
- .product(name: "Testing", package: "swift-testing"),
53
- ]),
54
- ],
55
- swiftLanguageModes: [.v6])
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Swabble/README.md DELETED
@@ -1,111 +0,0 @@
1
- # 🎙️ swabble — Speech.framework wake-word hook daemon (macOS 26)
2
-
3
- swabble is a Swift 6.2 wake-word hook daemon. The CLI targets macOS 26 (SpeechAnalyzer + SpeechTranscriber). The shared `SwabbleKit` target is multi-platform and exposes wake-word gating utilities for iOS/macOS apps.
4
-
5
- - **Local-only**: Speech.framework on-device models; zero network usage.
6
- - **Wake word**: Default `clawd` (aliases `claude`), optional `--no-wake` bypass.
7
- - **SwabbleKit**: Shared wake gate utilities (gap-based gating when you provide speech segments).
8
- - **Hooks**: Run any command with prefix/env, cooldown, min_chars, timeout.
9
- - **Services**: launchd helper stubs for start/stop/install.
10
- - **File transcribe**: TXT or SRT with time ranges (using AttributedString splits).
11
-
12
- ## Quick start
13
- ```bash
14
- # Install deps
15
- brew install swiftformat swiftlint
16
-
17
- # Build
18
- swift build
19
-
20
- # Write default config (~/.config/swabble/config.json)
21
- swift run swabble setup
22
-
23
- # Run foreground daemon
24
- swift run swabble serve
25
-
26
- # Test your hook
27
- swift run swabble test-hook "hello world"
28
-
29
- # Transcribe a file to SRT
30
- swift run swabble transcribe /path/to/audio.m4a --format srt --output out.srt
31
- ```
32
-
33
- ## Use as a library
34
- Add swabble as a SwiftPM dependency and import the `Swabble` or `SwabbleKit` product:
35
-
36
- ```swift
37
- // Package.swift
38
- dependencies: [
39
- .package(url: "https://github.com/steipete/swabble.git", branch: "main"),
40
- ],
41
- targets: [
42
- .target(name: "MyApp", dependencies: [
43
- .product(name: "Swabble", package: "swabble"), // Speech pipeline (macOS 26+ / iOS 26+)
44
- .product(name: "SwabbleKit", package: "swabble"), // Wake-word gate utilities (iOS 17+ / macOS 15+)
45
- ]),
46
- ]
47
- ```
48
-
49
- ## CLI
50
- - `serve` — foreground loop (mic → wake → hook)
51
- - `transcribe <file>` — offline transcription (txt|srt)
52
- - `test-hook "text"` — invoke configured hook
53
- - `mic list|set <index>` — enumerate/select input device
54
- - `setup` — write default config JSON
55
- - `doctor` — check Speech auth & device availability
56
- - `health` — prints `ok`
57
- - `tail-log` — last 10 transcripts
58
- - `status` — show wake state + recent transcripts
59
- - `service install|uninstall|status` — user launchd plist (stub: prints launchctl commands)
60
- - `start|stop|restart` — placeholders until full launchd wiring
61
-
62
- All commands accept Commander runtime flags (`-v/--verbose`, `--json-output`, `--log-level`), plus `--config` where applicable.
63
-
64
- ## Config
65
- `~/.config/swabble/config.json` (auto-created by `setup`):
66
- ```json
67
- {
68
- "audio": {"deviceName": "", "deviceIndex": -1, "sampleRate": 16000, "channels": 1},
69
- "wake": {"enabled": true, "word": "clawd", "aliases": ["claude"]},
70
- "hook": {
71
- "command": "",
72
- "args": [],
73
- "prefix": "Voice swabble from ${hostname}: ",
74
- "cooldownSeconds": 1,
75
- "minCharacters": 24,
76
- "timeoutSeconds": 5,
77
- "env": {}
78
- },
79
- "logging": {"level": "info", "format": "text"},
80
- "transcripts": {"enabled": true, "maxEntries": 50},
81
- "speech": {"localeIdentifier": "en_US", "etiquetteReplacements": false}
82
- }
83
- ```
84
-
85
- - Config path override: `--config /path/to/config.json` on relevant commands.
86
- - Transcripts persist to `~/Library/Application Support/swabble/transcripts.log`.
87
-
88
- ## Hook protocol
89
- When a wake-gated transcript passes min_chars & cooldown, swabble runs:
90
- ```
91
- <command> <args...> "<prefix><text>"
92
- ```
93
- Environment variables:
94
- - `SWABBLE_TEXT` — stripped transcript (wake word removed)
95
- - `SWABBLE_PREFIX` — rendered prefix (hostname substituted)
96
- - plus any `hook.env` key/values
97
-
98
- ## Speech pipeline
99
- - `AVAudioEngine` tap → `BufferConverter` → `AnalyzerInput` → `SpeechAnalyzer` with a `SpeechTranscriber` module.
100
- - Requests volatile + final results; the CLI uses text-only wake gating today.
101
- - Authorization requested at first start; requires macOS 26 + new Speech.framework APIs.
102
-
103
- ## Development
104
- - Format: `./scripts/format.sh` (uses local `.swiftformat`)
105
- - Lint: `./scripts/lint.sh` (uses local `.swiftlint.yml`)
106
- - Tests: `swift test` (uses swift-testing package)
107
-
108
- ## Roadmap
109
- - launchd control (load/bootout, PID + status socket)
110
- - JSON logging + PII redaction toggle
111
- - Stronger wake-word detection and control socket status/health
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Swabble/Sources/SwabbleCore/Config/Config.swift DELETED
@@ -1,77 +0,0 @@
1
- import Foundation
2
-
3
- public struct SwabbleConfig: Codable, Sendable {
4
- public struct Audio: Codable, Sendable {
5
- public var deviceName: String = ""
6
- public var deviceIndex: Int = -1
7
- public var sampleRate: Double = 16000
8
- public var channels: Int = 1
9
- }
10
-
11
- public struct Wake: Codable, Sendable {
12
- public var enabled: Bool = true
13
- public var word: String = "clawd"
14
- public var aliases: [String] = ["claude"]
15
- }
16
-
17
- public struct Hook: Codable, Sendable {
18
- public var command: String = ""
19
- public var args: [String] = []
20
- public var prefix: String = "Voice swabble from ${hostname}: "
21
- public var cooldownSeconds: Double = 1
22
- public var minCharacters: Int = 24
23
- public var timeoutSeconds: Double = 5
24
- public var env: [String: String] = [:]
25
- }
26
-
27
- public struct Logging: Codable, Sendable {
28
- public var level: String = "info"
29
- public var format: String = "text" // text|json placeholder
30
- }
31
-
32
- public struct Transcripts: Codable, Sendable {
33
- public var enabled: Bool = true
34
- public var maxEntries: Int = 50
35
- }
36
-
37
- public struct Speech: Codable, Sendable {
38
- public var localeIdentifier: String = Locale.current.identifier
39
- public var etiquetteReplacements: Bool = false
40
- }
41
-
42
- public var audio = Audio()
43
- public var wake = Wake()
44
- public var hook = Hook()
45
- public var logging = Logging()
46
- public var transcripts = Transcripts()
47
- public var speech = Speech()
48
-
49
- public static let defaultPath = FileManager.default
50
- .homeDirectoryForCurrentUser
51
- .appendingPathComponent(".config/swabble/config.json")
52
-
53
- public init() {}
54
- }
55
-
56
- public enum ConfigError: Error {
57
- case missingConfig
58
- }
59
-
60
- public enum ConfigLoader {
61
- public static func load(at path: URL?) throws -> SwabbleConfig {
62
- let url = path ?? SwabbleConfig.defaultPath
63
- if !FileManager.default.fileExists(atPath: url.path) {
64
- throw ConfigError.missingConfig
65
- }
66
- let data = try Data(contentsOf: url)
67
- return try JSONDecoder().decode(SwabbleConfig.self, from: data)
68
- }
69
-
70
- public static func save(_ config: SwabbleConfig, at path: URL?) throws {
71
- let url = path ?? SwabbleConfig.defaultPath
72
- let dir = url.deletingLastPathComponent()
73
- try FileManager.default.createDirectory(at: dir, withIntermediateDirectories: true)
74
- let data = try JSONEncoder().encode(config)
75
- try data.write(to: url)
76
- }
77
- }