darkfire514 commited on
Commit
9e61dbf
·
verified ·
1 Parent(s): 22e5a57

Upload 43 files

Browse files
.detect-secrets.cfg ADDED
@@ -0,0 +1,30 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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 ADDED
@@ -0,0 +1,48 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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 ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
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
.gitattributes CHANGED
@@ -1,35 +1,2 @@
1
- *.7z filter=lfs diff=lfs merge=lfs -text
2
- *.arrow filter=lfs diff=lfs merge=lfs -text
3
- *.bin filter=lfs diff=lfs merge=lfs -text
4
- *.bz2 filter=lfs diff=lfs merge=lfs -text
5
- *.ckpt filter=lfs diff=lfs merge=lfs -text
6
- *.ftz filter=lfs diff=lfs merge=lfs -text
7
- *.gz filter=lfs diff=lfs merge=lfs -text
8
- *.h5 filter=lfs diff=lfs merge=lfs -text
9
- *.joblib filter=lfs diff=lfs merge=lfs -text
10
- *.lfs.* filter=lfs diff=lfs merge=lfs -text
11
- *.mlmodel filter=lfs diff=lfs merge=lfs -text
12
- *.model filter=lfs diff=lfs merge=lfs -text
13
- *.msgpack filter=lfs diff=lfs merge=lfs -text
14
- *.npy filter=lfs diff=lfs merge=lfs -text
15
- *.npz filter=lfs diff=lfs merge=lfs -text
16
- *.onnx filter=lfs diff=lfs merge=lfs -text
17
- *.ot filter=lfs diff=lfs merge=lfs -text
18
- *.parquet filter=lfs diff=lfs merge=lfs -text
19
- *.pb filter=lfs diff=lfs merge=lfs -text
20
- *.pickle filter=lfs diff=lfs merge=lfs -text
21
- *.pkl filter=lfs diff=lfs merge=lfs -text
22
- *.pt filter=lfs diff=lfs merge=lfs -text
23
- *.pth filter=lfs diff=lfs merge=lfs -text
24
- *.rar filter=lfs diff=lfs merge=lfs -text
25
- *.safetensors filter=lfs diff=lfs merge=lfs -text
26
- saved_model/**/* filter=lfs diff=lfs merge=lfs -text
27
- *.tar.* filter=lfs diff=lfs merge=lfs -text
28
- *.tar filter=lfs diff=lfs merge=lfs -text
29
- *.tflite filter=lfs diff=lfs merge=lfs -text
30
- *.tgz filter=lfs diff=lfs merge=lfs -text
31
- *.wasm filter=lfs diff=lfs merge=lfs -text
32
- *.xz filter=lfs diff=lfs merge=lfs -text
33
- *.zip filter=lfs diff=lfs merge=lfs -text
34
- *.zst filter=lfs diff=lfs merge=lfs -text
35
- *tfevents* filter=lfs diff=lfs merge=lfs -text
 
1
+ * text=auto eol=lf
2
+ README-header.png filter=lfs diff=lfs merge=lfs -text
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
.gitignore ADDED
@@ -0,0 +1,73 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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/
.npmrc ADDED
@@ -0,0 +1 @@
 
 
1
+ allow-build-scripts=@whiskeysockets/baileys,sharp,esbuild,protobufjs,fs-ext,node-pty,@lydell/node-pty,@matrix-org/matrix-sdk-crypto-nodejs
.oxfmtrc.jsonc ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "$schema": "./node_modules/oxfmt/configuration_schema.json",
3
+ "experimentalSortImports": {
4
+ "newlinesBetween": false,
5
+ },
6
+ "experimentalSortPackageJson": {
7
+ "sortScripts": true,
8
+ },
9
+ "ignorePatterns": [
10
+ "apps/",
11
+ "assets/",
12
+ "dist/",
13
+ "docs/_layouts/",
14
+ "node_modules/",
15
+ "patches/",
16
+ "pnpm-lock.yaml/",
17
+ "Swabble/",
18
+ "vendor/",
19
+ ],
20
+ }
.oxlintrc.json ADDED
@@ -0,0 +1,37 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "$schema": "./node_modules/oxlint/configuration_schema.json",
3
+ "plugins": ["unicorn", "typescript", "oxc"],
4
+ "categories": {
5
+ "correctness": "error",
6
+ "perf": "error",
7
+ "suspicious": "error"
8
+ },
9
+ "rules": {
10
+ "curly": "error",
11
+ "eslint-plugin-unicorn/prefer-array-find": "off",
12
+ "eslint/no-await-in-loop": "off",
13
+ "eslint/no-new": "off",
14
+ "oxc/no-accumulating-spread": "off",
15
+ "oxc/no-async-endpoint-handlers": "off",
16
+ "oxc/no-map-spread": "off",
17
+ "typescript/no-extraneous-class": "off",
18
+ "typescript/no-redundant-type-constituents": "off",
19
+ "typescript/no-unnecessary-template-expression": "off",
20
+ "typescript/no-unsafe-type-assertion": "off",
21
+ "unicorn/consistent-function-scoping": "off",
22
+ "unicorn/require-post-message-target-origin": "off"
23
+ },
24
+ "ignorePatterns": [
25
+ "assets/",
26
+ "dist/",
27
+ "docs/_layouts/",
28
+ "node_modules/",
29
+ "patches/",
30
+ "pnpm-lock.yaml/",
31
+ "skills/",
32
+ "src/canvas-host/a2ui/a2ui.bundle.js",
33
+ "Swabble/",
34
+ "vendor/",
35
+ "ui/"
36
+ ]
37
+ }
.pre-commit-config.yaml ADDED
@@ -0,0 +1,105 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Pre-commit hooks for openclaw
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]
.secrets.baseline ADDED
@@ -0,0 +1,2191 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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 ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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 ADDED
@@ -0,0 +1,51 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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 ADDED
@@ -0,0 +1,148 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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 ADDED
@@ -0,0 +1,178 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Repository Guidelines
2
+
3
+ - Repo: https://github.com/openclaw/openclaw
4
+ - GitHub issues/comments/PR comments: use literal multiline strings or `-F - <<'EOF'` (or $'...') for real newlines; never embed "\\n".
5
+
6
+ ## Project Structure & Module Organization
7
+
8
+ - 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`).
9
+ - Tests: colocated `*.test.ts`.
10
+ - Docs: `docs/` (images, queue, Pi config). Built output lives in `dist/`.
11
+ - 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.
12
+ - Plugins: install runs `npm install --omit=dev` in plugin dir; runtime deps must live in `dependencies`. Avoid `workspace:*` in `dependencies` (npm install breaks); put `openclaw` in `devDependencies` or `peerDependencies` instead (runtime resolves `openclaw/plugin-sdk` via jiti alias).
13
+ - Installers served from `https://openclaw.ai/*`: live in the sibling repo `../openclaw.ai` (`public/install.sh`, `public/install-cli.sh`, `public/install.ps1`).
14
+ - Messaging channels: always consider **all** built-in + extension channels when refactoring shared logic (routing, allowlists, pairing, command gating, onboarding, docs).
15
+ - Core channel docs: `docs/channels/`
16
+ - Core channel code: `src/telegram`, `src/discord`, `src/slack`, `src/signal`, `src/imessage`, `src/web` (WhatsApp web), `src/channels`, `src/routing`
17
+ - Extensions (channel plugins): `extensions/*` (e.g. `extensions/msteams`, `extensions/matrix`, `extensions/zalo`, `extensions/zalouser`, `extensions/voice-call`)
18
+ - When adding channels/extensions/apps/docs, review `.github/labeler.yml` for label coverage.
19
+
20
+ ## Docs Linking (Mintlify)
21
+
22
+ - Docs are hosted on Mintlify (docs.openclaw.ai).
23
+ - Internal doc links in `docs/**/*.md`: root-relative, no `.md`/`.mdx` (example: `[Config](/configuration)`).
24
+ - Section cross-references: use anchors on root-relative paths (example: `[Hooks](/configuration#hooks)`).
25
+ - Doc headings and anchors: avoid em dashes and apostrophes in headings because they break Mintlify anchor links.
26
+ - When Peter asks for links, reply with full `https://docs.openclaw.ai/...` URLs (not root-relative).
27
+ - When you touch docs, end the reply with the `https://docs.openclaw.ai/...` URLs you referenced.
28
+ - README (GitHub): keep absolute docs URLs (`https://docs.openclaw.ai/...`) so links work on GitHub.
29
+ - Docs content must be generic: no personal device names/hostnames/paths; use placeholders like `user@gateway-host` and “gateway host”.
30
+
31
+ ## exe.dev VM ops (general)
32
+
33
+ - Access: stable path is `ssh exe.dev` then `ssh vm-name` (assume SSH key already set).
34
+ - SSH flaky: use exe.dev web terminal or Shelley (web agent); keep a tmux session for long ops.
35
+ - Update: `sudo npm i -g openclaw@latest` (global install needs root on `/usr/lib/node_modules`).
36
+ - Config: use `openclaw config set ...`; ensure `gateway.mode=local` is set.
37
+ - Discord: store raw token only (no `DISCORD_BOT_TOKEN=` prefix).
38
+ - Restart: stop old gateway and run:
39
+ `pkill -9 -f openclaw-gateway || true; nohup openclaw gateway run --bind loopback --port 18789 --force > /tmp/openclaw-gateway.log 2>&1 &`
40
+ - Verify: `openclaw channels status --probe`, `ss -ltnp | rg 18789`, `tail -n 120 /tmp/openclaw-gateway.log`.
41
+
42
+ ## Build, Test, and Development Commands
43
+
44
+ - Runtime baseline: Node **22+** (keep Node + Bun paths working).
45
+ - Install deps: `pnpm install`
46
+ - Pre-commit hooks: `prek install` (runs same checks as CI)
47
+ - Also supported: `bun install` (keep `pnpm-lock.yaml` + Bun patching in sync when touching deps/patches).
48
+ - Prefer Bun for TypeScript execution (scripts, dev, tests): `bun <file.ts>` / `bunx <tool>`.
49
+ - Run CLI in dev: `pnpm openclaw ...` (bun) or `pnpm dev`.
50
+ - Node remains supported for running built output (`dist/*`) and production installs.
51
+ - Mac packaging (dev): `scripts/package-mac-app.sh` defaults to current arch. Release checklist: `docs/platforms/mac/release.md`.
52
+ - Type-check/build: `pnpm build`
53
+ - Lint/format: `pnpm check`
54
+ - Tests: `pnpm test` (vitest); coverage: `pnpm test:coverage`
55
+
56
+ ## Coding Style & Naming Conventions
57
+
58
+ - Language: TypeScript (ESM). Prefer strict typing; avoid `any`.
59
+ - Formatting/linting via Oxlint and Oxfmt; run `pnpm check` before commits.
60
+ - Add brief code comments for tricky or non-obvious logic.
61
+ - Keep files concise; extract helpers instead of “V2” copies. Use existing patterns for CLI options and dependency injection via `createDefaultDeps`.
62
+ - Aim to keep files under ~700 LOC; guideline only (not a hard guardrail). Split/refactor when it improves clarity or testability.
63
+ - Naming: use **OpenClaw** for product/app/docs headings; use `openclaw` for CLI command, package/binary, paths, and config keys.
64
+
65
+ ## Release Channels (Naming)
66
+
67
+ - stable: tagged releases only (e.g. `vYYYY.M.D`), npm dist-tag `latest`.
68
+ - beta: prerelease tags `vYYYY.M.D-beta.N`, npm dist-tag `beta` (may ship without macOS app).
69
+ - dev: moving head on `main` (no tag; git checkout main).
70
+
71
+ ## Testing Guidelines
72
+
73
+ - Framework: Vitest with V8 coverage thresholds (70% lines/branches/functions/statements).
74
+ - Naming: match source names with `*.test.ts`; e2e in `*.e2e.test.ts`.
75
+ - Run `pnpm test` (or `pnpm test:coverage`) before pushing when you touch logic.
76
+ - Do not set test workers above 16; tried already.
77
+ - Live tests (real keys): `CLAWDBOT_LIVE_TEST=1 pnpm test:live` (OpenClaw-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`.
78
+ - Full kit + what’s covered: `docs/testing.md`.
79
+ - Pure test additions/fixes generally do **not** need a changelog entry unless they alter user-facing behavior or the user asks for one.
80
+ - Mobile: before using a simulator, check for connected real devices (iOS + Android) and prefer them when available.
81
+
82
+ ## Commit & Pull Request Guidelines
83
+
84
+ - Create commits with `scripts/committer "<msg>" <file...>`; avoid manual `git add`/`git commit` so staging stays scoped.
85
+ - Follow concise, action-oriented commit messages (e.g., `CLI: add verbose flag to send`).
86
+ - Group related changes; avoid bundling unrelated refactors.
87
+ - Changelog workflow: keep latest released version at top (no `Unreleased`); after publishing, bump version and start a new top section.
88
+ - PRs should summarize scope, note testing performed, and mention any user-facing changes or new flags.
89
+ - PR review flow: when given a PR link, review via `gh pr view`/`gh pr diff` and do **not** change branches.
90
+ - PR review calls: prefer a single `gh pr view --json ...` to batch metadata/comments; run `gh pr diff` only when needed.
91
+ - 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.
92
+ - Goal: merge PRs. Prefer **rebase** when commits are clean; **squash** when history is messy.
93
+ - 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`.
94
+ - 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.
95
+ - When working on a PR: add a changelog entry with the PR number and thank the contributor.
96
+ - When working on an issue: reference the issue in the changelog entry.
97
+ - When merging a PR: leave a PR comment that explains exactly what we did and include the SHA hashes.
98
+ - When merging a PR from a new contributor: add their avatar to the README “Thanks to all clawtributors” thumbnail list.
99
+ - After merging a PR: run `bun scripts/update-clawtributors.ts` if the contributor is missing, then commit the regenerated README.
100
+
101
+ ## Shorthand Commands
102
+
103
+ - `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`.
104
+
105
+ ### PR Workflow (Review vs Land)
106
+
107
+ - **Review mode (PR link only):** read `gh pr view/diff`; **do not** switch branches; **do not** change code.
108
+ - **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 build && pnpm check && 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!
109
+
110
+ ## Security & Configuration Tips
111
+
112
+ - Web provider stores creds at `~/.openclaw/credentials/`; rerun `openclaw login` if logged out.
113
+ - Pi sessions live under `~/.openclaw/sessions/` by default; the base directory is not configurable.
114
+ - Environment variables: see `~/.profile`.
115
+ - Never commit or publish real phone numbers, videos, or live configuration values. Use obviously fake placeholders in docs, tests, and examples.
116
+ - 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.
117
+
118
+ ## Troubleshooting
119
+
120
+ - Rebrand/migration issues or legacy config/service warnings: run `openclaw doctor` (see `docs/gateway/doctor.md`).
121
+
122
+ ## Agent-Specific Notes
123
+
124
+ - Vocabulary: "makeup" = "mac app".
125
+ - Never edit `node_modules` (global/Homebrew/npm/git installs too). Updates overwrite. Skill notes go in `tools.md` or `AGENTS.md`.
126
+ - Signal: "update fly" => `fly ssh console -a flawd-bot -C "bash -lc 'cd /data/clawd/openclaw && git pull --rebase origin main'"` then `fly machines restart e825232f34d058 -a flawd-bot`.
127
+ - When working on a GitHub Issue or PR, print the full URL at the end of the task.
128
+ - When answering questions, respond with high-confidence answers only: verify in code; do not guess.
129
+ - Never update the Carbon dependency.
130
+ - Any dependency with `pnpm.patchedDependencies` must use an exact version (no `^`/`~`).
131
+ - Patching dependencies (pnpm patches, overrides, or vendored changes) requires explicit approval; do not do this by default.
132
+ - CLI progress: use `src/cli/progress.ts` (`osc-progress` + `@clack/prompts` spinner); don’t hand-roll spinners/bars.
133
+ - Status output: keep tables + ANSI-safe wrapping (`src/terminal/table.ts`); `status --all` = read-only/pasteable, `status --deep` = probes.
134
+ - Gateway currently runs only as the menubar app; there is no separate LaunchAgent/helper label installed. Restart via the OpenClaw Mac app or `scripts/restart-mac.sh`; to verify/kill use `launchctl print gui/$UID | grep openclaw` 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.**
135
+ - macOS logs: use `./scripts/clawlog.sh` to query unified logs for the OpenClaw subsystem; it supports follow/tail/category filters and expects passwordless sudo for `/usr/bin/log`.
136
+ - If shared guardrails are available locally, review them; otherwise follow this repo's guidance.
137
+ - 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.
138
+ - 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.
139
+ - 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/OpenClaw/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).
140
+ - **Restart apps:** “restart iOS/Android apps” means rebuild (recompile/install) and relaunch, not just kill/launch.
141
+ - **Device checks:** before testing, verify connected real devices (iOS/Android) before reaching for simulators/emulators.
142
+ - iOS Team ID lookup: `security find-identity -p codesigning -v` → use Apple Development (…) TEAMID. Fallback: `defaults read com.apple.dt.Xcode IDEProvisioningTeamIdentifiers`.
143
+ - 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.
144
+ - Release signing/notary keys are managed outside the repo; follow internal release docs.
145
+ - 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).
146
+ - **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.
147
+ - **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.
148
+ - **Multi-agent safety:** do **not** create/remove/modify `git worktree` checkouts (or edit `.worktrees/*`) unless explicitly requested.
149
+ - **Multi-agent safety:** do **not** switch branches / check out a different branch unless explicitly requested.
150
+ - **Multi-agent safety:** running multiple agents is OK as long as each agent has its own session.
151
+ - **Multi-agent safety:** when you see unrecognized files, keep going; focus on your changes and commit only those.
152
+ - Lint/format churn:
153
+ - If staged+unstaged diffs are formatting-only, auto-resolve without asking.
154
+ - 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.
155
+ - Only ask when changes are semantic (logic/data/behavior).
156
+ - 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.
157
+ - **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.
158
+ - Bug investigations: read source code of relevant npm dependencies and all related local code before concluding; aim for high-confidence root cause.
159
+ - Code style: add brief comments for tricky logic; keep files under ~500 LOC when feasible (split/refactor as needed).
160
+ - 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`.
161
+ - Tool schema guardrails: avoid raw `format` property names in tool schemas; some validators treat `format` as a reserved keyword and reject the schema.
162
+ - When asked to open a “session” file, open the Pi session logs under `~/.openclaw/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.
163
+ - Do not rebuild the macOS app over SSH; rebuilds must be run directly on the Mac.
164
+ - 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.
165
+ - Voice wake forwarding tips:
166
+ - Command template should stay `openclaw-mac agent --message "${text}" --thinking low`; `VoiceWakeForwarder` already shell-escapes `${text}`. Don’t add extra quotes.
167
+ - 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`/`openclaw` binaries resolve when invoked via `openclaw-mac`.
168
+ - For manual `openclaw message send` messages that include `!`, use the heredoc pattern noted below to avoid the Bash tool’s escaping.
169
+ - Release guardrails: do not change version numbers without operator’s explicit consent; always ask permission before running any npm publish/release step.
170
+
171
+ ## NPM + 1Password (publish/verify)
172
+
173
+ - Use the 1password skill; all `op` commands must run inside a fresh tmux session.
174
+ - Sign in: `eval "$(op signin --account my.1password.com)"` (app unlocked + integration on).
175
+ - OTP: `op read 'op://Private/Npmjs/one-time password?attribute=otp'`.
176
+ - Publish: `npm publish --access public --otp="<otp>"` (run from the package dir).
177
+ - Verify without local npmrc side effects: `npm view <pkg> version --userconfig "$(mktemp)"`.
178
+ - Kill the tmux session after publish.
CHANGELOG.md ADDED
The diff for this file is too large to render. See raw diff
 
CLAUDE.md ADDED
@@ -0,0 +1 @@
 
 
1
+ AGENTS.md
CONTRIBUTING.md ADDED
@@ -0,0 +1,60 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Contributing to OpenClaw
2
+
3
+ Welcome to the lobster tank! 🦞
4
+
5
+ ## Quick Links
6
+
7
+ - **GitHub:** https://github.com/openclaw/openclaw
8
+ - **Discord:** https://discord.gg/qkhbAGHRBT
9
+ - **X/Twitter:** [@steipete](https://x.com/steipete) / [@openclaw](https://x.com/openclaw)
10
+
11
+ ## Maintainers
12
+
13
+ - **Peter Steinberger** - Benevolent Dictator
14
+ - GitHub: [@steipete](https://github.com/steipete) · X: [@steipete](https://x.com/steipete)
15
+
16
+ - **Shadow** - Discord + Slack subsystem
17
+ - GitHub: [@thewilloftheshadow](https://github.com/thewilloftheshadow) · X: [@4shad0wed](https://x.com/4shad0wed)
18
+
19
+ - **Jos** - Telegram, API, Nix mode
20
+ - GitHub: [@joshp123](https://github.com/joshp123) · X: [@jjpcodes](https://x.com/jjpcodes)
21
+
22
+ - **Christoph Nakazawa** - JS Infra
23
+ - GitHub: [@cpojer](https://github.com/cpojer) · X: [@cnakazawa](https://x.com/cnakazawa)
24
+
25
+ ## How to Contribute
26
+
27
+ 1. **Bugs & small fixes** → Open a PR!
28
+ 2. **New features / architecture** → Start a [GitHub Discussion](https://github.com/openclaw/openclaw/discussions) or ask in Discord first
29
+ 3. **Questions** → Discord #setup-help
30
+
31
+ ## Before You PR
32
+
33
+ - Test locally with your OpenClaw instance
34
+ - Run tests: `pnpm build && pnpm check && pnpm test`
35
+ - Keep PRs focused (one thing per PR)
36
+ - Describe what & why
37
+
38
+ ## AI/Vibe-Coded PRs Welcome! 🤖
39
+
40
+ Built with Codex, Claude, or other AI tools? **Awesome - just mark it!**
41
+
42
+ Please include in your PR:
43
+
44
+ - [ ] Mark as AI-assisted in the PR title or description
45
+ - [ ] Note the degree of testing (untested / lightly tested / fully tested)
46
+ - [ ] Include prompts or session logs if possible (super helpful!)
47
+ - [ ] Confirm you understand what the code does
48
+
49
+ AI PRs are first-class citizens here. We just want transparency so reviewers know what to look for.
50
+
51
+ ## Current Focus & Roadmap 🗺
52
+
53
+ We are currently prioritizing:
54
+
55
+ - **Stability**: Fixing edge cases in channel connections (WhatsApp/Telegram).
56
+ - **UX**: Improving the onboarding wizard and error messages.
57
+ - **Skills**: Expanding the library of bundled skills and improving the Skill Creation developer experience.
58
+ - **Performance**: Optimizing token usage and compaction logic.
59
+
60
+ Check the [GitHub Issues](https://github.com/openclaw/openclaw/issues) for "good first issue" labels!
Dockerfile ADDED
@@ -0,0 +1,39 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ FROM node:22-bookworm
2
+
3
+ # Install Bun (required for build scripts)
4
+ RUN curl -fsSL https://bun.sh/install | bash
5
+ ENV PATH="/root/.bun/bin:${PATH}"
6
+
7
+ RUN corepack enable
8
+
9
+ WORKDIR /app
10
+
11
+ ARG OPENCLAW_DOCKER_APT_PACKAGES=""
12
+ RUN if [ -n "$OPENCLAW_DOCKER_APT_PACKAGES" ]; then \
13
+ apt-get update && \
14
+ DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends $OPENCLAW_DOCKER_APT_PACKAGES && \
15
+ apt-get clean && \
16
+ rm -rf /var/lib/apt/lists/* /var/cache/apt/archives/*; \
17
+ fi
18
+
19
+ COPY package.json pnpm-lock.yaml pnpm-workspace.yaml .npmrc ./
20
+ COPY ui/package.json ./ui/package.json
21
+ COPY patches ./patches
22
+ COPY scripts ./scripts
23
+
24
+ RUN pnpm install --frozen-lockfile
25
+
26
+ COPY . .
27
+ RUN OPENCLAW_A2UI_SKIP_MISSING=1 pnpm build
28
+ # Force pnpm for UI build (Bun may fail on ARM/Synology architectures)
29
+ ENV OPENCLAW_PREFER_PNPM=1
30
+ RUN pnpm ui:build
31
+
32
+ ENV NODE_ENV=production
33
+
34
+ # Security hardening: Run as non-root user
35
+ # The node:22-bookworm image includes a 'node' user (uid 1000)
36
+ # This reduces the attack surface by preventing container escape via root privileges
37
+ USER node
38
+
39
+ CMD ["node", "dist/index.js"]
Dockerfile.sandbox ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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 ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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/openclaw-sandbox-browser
24
+ RUN chmod +x /usr/local/bin/openclaw-sandbox-browser
25
+
26
+ EXPOSE 9222 5900 6080
27
+
28
+ CMD ["openclaw-sandbox-browser"]
LICENSE ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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.
README-header.png ADDED

Git LFS Details

  • SHA256: 31a53674902787b6665ee3cb9a01e50f66352004db4f023e4e6506b6c07fb80a
  • Pointer size: 132 Bytes
  • Size of remote file: 1.41 MB
README.md CHANGED
@@ -1,11 +1,533 @@
1
- ---
2
- title: OpenClawBot
3
- emoji: 🌖
4
- colorFrom: yellow
5
- colorTo: yellow
6
- sdk: docker
7
- pinned: false
8
- license: mit
9
- ---
10
-
11
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # 🦞 OpenClaw — Personal AI Assistant
2
+
3
+ <p align="center">
4
+ <picture>
5
+ <source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/openclaw/openclaw/main/docs/assets/openclaw-logo-text-dark.png">
6
+ <img src="https://raw.githubusercontent.com/openclaw/openclaw/main/docs/assets/openclaw-logo-text.png" alt="OpenClaw" width="500">
7
+ </picture>
8
+ </p>
9
+
10
+ <p align="center">
11
+ <strong>EXFOLIATE! EXFOLIATE!</strong>
12
+ </p>
13
+
14
+ <p align="center">
15
+ <a href="https://github.com/openclaw/openclaw/actions/workflows/ci.yml?branch=main"><img src="https://img.shields.io/github/actions/workflow/status/openclaw/openclaw/ci.yml?branch=main&style=for-the-badge" alt="CI status"></a>
16
+ <a href="https://github.com/openclaw/openclaw/releases"><img src="https://img.shields.io/github/v/release/openclaw/openclaw?include_prereleases&style=for-the-badge" alt="GitHub release"></a>
17
+ <a href="https://discord.gg/clawd"><img src="https://img.shields.io/discord/1456350064065904867?label=Discord&logo=discord&logoColor=white&color=5865F2&style=for-the-badge" alt="Discord"></a>
18
+ <a href="LICENSE"><img src="https://img.shields.io/badge/License-MIT-blue.svg?style=for-the-badge" alt="MIT License"></a>
19
+ </p>
20
+
21
+ **OpenClaw** is a _personal AI assistant_ you run on your own devices.
22
+ It answers you on the channels you already use (WhatsApp, Telegram, Slack, Discord, Google Chat, Signal, iMessage, Microsoft Teams, WebChat), plus extension channels like BlueBubbles, Matrix, Zalo, and Zalo Personal. It can speak and listen on macOS/iOS/Android, and can render a live Canvas you control. The Gateway is just the control plane — the product is the assistant.
23
+
24
+ If you want a personal, single-user assistant that feels local, fast, and always-on, this is it.
25
+
26
+ [Website](https://openclaw.ai) · [Docs](https://docs.openclaw.ai) · [DeepWiki](https://deepwiki.com/openclaw/openclaw) · [Getting Started](https://docs.openclaw.ai/start/getting-started) · [Updating](https://docs.openclaw.ai/install/updating) · [Showcase](https://docs.openclaw.ai/start/showcase) · [FAQ](https://docs.openclaw.ai/start/faq) · [Wizard](https://docs.openclaw.ai/start/wizard) · [Nix](https://github.com/openclaw/nix-clawdbot) · [Docker](https://docs.openclaw.ai/install/docker) · [Discord](https://discord.gg/clawd)
27
+
28
+ Preferred setup: run the onboarding wizard (`openclaw onboard`). It walks through gateway, workspace, channels, and skills. The CLI wizard is the recommended path and works on **macOS, Linux, and Windows (via WSL2; strongly recommended)**.
29
+ Works with npm, pnpm, or bun.
30
+ New install? Start here: [Getting started](https://docs.openclaw.ai/start/getting-started)
31
+
32
+ **Subscriptions (OAuth):**
33
+
34
+ - **[Anthropic](https://www.anthropic.com/)** (Claude Pro/Max)
35
+ - **[OpenAI](https://openai.com/)** (ChatGPT/Codex)
36
+
37
+ Model note: while any model is supported, I strongly recommend **Anthropic Pro/Max (100/200) + Opus 4.5** for long‑context strength and better prompt‑injection resistance. See [Onboarding](https://docs.openclaw.ai/start/onboarding).
38
+
39
+ ## Models (selection + auth)
40
+
41
+ - Models config + CLI: [Models](https://docs.openclaw.ai/concepts/models)
42
+ - Auth profile rotation (OAuth vs API keys) + fallbacks: [Model failover](https://docs.openclaw.ai/concepts/model-failover)
43
+
44
+ ## Install (recommended)
45
+
46
+ Runtime: **Node ≥22**.
47
+
48
+ ```bash
49
+ npm install -g openclaw@latest
50
+ # or: pnpm add -g openclaw@latest
51
+
52
+ openclaw onboard --install-daemon
53
+ ```
54
+
55
+ The wizard installs the Gateway daemon (launchd/systemd user service) so it stays running.
56
+
57
+ ## Quick start (TL;DR)
58
+
59
+ Runtime: **Node ≥22**.
60
+
61
+ Full beginner guide (auth, pairing, channels): [Getting started](https://docs.openclaw.ai/start/getting-started)
62
+
63
+ ```bash
64
+ openclaw onboard --install-daemon
65
+
66
+ openclaw gateway --port 18789 --verbose
67
+
68
+ # Send a message
69
+ openclaw message send --to +1234567890 --message "Hello from OpenClaw"
70
+
71
+ # Talk to the assistant (optionally deliver back to any connected channel: WhatsApp/Telegram/Slack/Discord/Google Chat/Signal/iMessage/BlueBubbles/Microsoft Teams/Matrix/Zalo/Zalo Personal/WebChat)
72
+ openclaw agent --message "Ship checklist" --thinking high
73
+ ```
74
+
75
+ Upgrading? [Updating guide](https://docs.openclaw.ai/install/updating) (and run `openclaw doctor`).
76
+
77
+ ## Development channels
78
+
79
+ - **stable**: tagged releases (`vYYYY.M.D` or `vYYYY.M.D-<patch>`), npm dist-tag `latest`.
80
+ - **beta**: prerelease tags (`vYYYY.M.D-beta.N`), npm dist-tag `beta` (macOS app may be missing).
81
+ - **dev**: moving head of `main`, npm dist-tag `dev` (when published).
82
+
83
+ Switch channels (git + npm): `openclaw update --channel stable|beta|dev`.
84
+ Details: [Development channels](https://docs.openclaw.ai/install/development-channels).
85
+
86
+ ## From source (development)
87
+
88
+ Prefer `pnpm` for builds from source. Bun is optional for running TypeScript directly.
89
+
90
+ ```bash
91
+ git clone https://github.com/openclaw/openclaw.git
92
+ cd openclaw
93
+
94
+ pnpm install
95
+ pnpm ui:build # auto-installs UI deps on first run
96
+ pnpm build
97
+
98
+ pnpm openclaw onboard --install-daemon
99
+
100
+ # Dev loop (auto-reload on TS changes)
101
+ pnpm gateway:watch
102
+ ```
103
+
104
+ Note: `pnpm openclaw ...` runs TypeScript directly (via `tsx`). `pnpm build` produces `dist/` for running via Node / the packaged `openclaw` binary.
105
+
106
+ ## Security defaults (DM access)
107
+
108
+ OpenClaw connects to real messaging surfaces. Treat inbound DMs as **untrusted input**.
109
+
110
+ Full security guide: [Security](https://docs.openclaw.ai/gateway/security)
111
+
112
+ Default behavior on Telegram/WhatsApp/Signal/iMessage/Microsoft Teams/Discord/Google Chat/Slack:
113
+
114
+ - **DM pairing** (`dmPolicy="pairing"` / `channels.discord.dm.policy="pairing"` / `channels.slack.dm.policy="pairing"`): unknown senders receive a short pairing code and the bot does not process their message.
115
+ - Approve with: `openclaw pairing approve <channel> <code>` (then the sender is added to a local allowlist store).
116
+ - Public inbound DMs require an explicit opt-in: set `dmPolicy="open"` and include `"*"` in the channel allowlist (`allowFrom` / `channels.discord.dm.allowFrom` / `channels.slack.dm.allowFrom`).
117
+
118
+ Run `openclaw doctor` to surface risky/misconfigured DM policies.
119
+
120
+ ## Highlights
121
+
122
+ - **[Local-first Gateway](https://docs.openclaw.ai/gateway)** — single control plane for sessions, channels, tools, and events.
123
+ - **[Multi-channel inbox](https://docs.openclaw.ai/channels)** — WhatsApp, Telegram, Slack, Discord, Google Chat, Signal, iMessage, BlueBubbles, Microsoft Teams, Matrix, Zalo, Zalo Personal, WebChat, macOS, iOS/Android.
124
+ - **[Multi-agent routing](https://docs.openclaw.ai/gateway/configuration)** — route inbound channels/accounts/peers to isolated agents (workspaces + per-agent sessions).
125
+ - **[Voice Wake](https://docs.openclaw.ai/nodes/voicewake) + [Talk Mode](https://docs.openclaw.ai/nodes/talk)** — always-on speech for macOS/iOS/Android with ElevenLabs.
126
+ - **[Live Canvas](https://docs.openclaw.ai/platforms/mac/canvas)** — agent-driven visual workspace with [A2UI](https://docs.openclaw.ai/platforms/mac/canvas#canvas-a2ui).
127
+ - **[First-class tools](https://docs.openclaw.ai/tools)** — browser, canvas, nodes, cron, sessions, and Discord/Slack actions.
128
+ - **[Companion apps](https://docs.openclaw.ai/platforms/macos)** — macOS menu bar app + iOS/Android [nodes](https://docs.openclaw.ai/nodes).
129
+ - **[Onboarding](https://docs.openclaw.ai/start/wizard) + [skills](https://docs.openclaw.ai/tools/skills)** — wizard-driven setup with bundled/managed/workspace skills.
130
+
131
+ ## Star History
132
+
133
+ [![Star History Chart](https://api.star-history.com/svg?repos=openclaw/openclaw&type=date&legend=top-left)](https://www.star-history.com/#openclaw/openclaw&type=date&legend=top-left)
134
+
135
+ ## Everything we built so far
136
+
137
+ ### Core platform
138
+
139
+ - [Gateway WS control plane](https://docs.openclaw.ai/gateway) with sessions, presence, config, cron, webhooks, [Control UI](https://docs.openclaw.ai/web), and [Canvas host](https://docs.openclaw.ai/platforms/mac/canvas#canvas-a2ui).
140
+ - [CLI surface](https://docs.openclaw.ai/tools/agent-send): gateway, agent, send, [wizard](https://docs.openclaw.ai/start/wizard), and [doctor](https://docs.openclaw.ai/gateway/doctor).
141
+ - [Pi agent runtime](https://docs.openclaw.ai/concepts/agent) in RPC mode with tool streaming and block streaming.
142
+ - [Session model](https://docs.openclaw.ai/concepts/session): `main` for direct chats, group isolation, activation modes, queue modes, reply-back. Group rules: [Groups](https://docs.openclaw.ai/concepts/groups).
143
+ - [Media pipeline](https://docs.openclaw.ai/nodes/images): images/audio/video, transcription hooks, size caps, temp file lifecycle. Audio details: [Audio](https://docs.openclaw.ai/nodes/audio).
144
+
145
+ ### Channels
146
+
147
+ - [Channels](https://docs.openclaw.ai/channels): [WhatsApp](https://docs.openclaw.ai/channels/whatsapp) (Baileys), [Telegram](https://docs.openclaw.ai/channels/telegram) (grammY), [Slack](https://docs.openclaw.ai/channels/slack) (Bolt), [Discord](https://docs.openclaw.ai/channels/discord) (discord.js), [Google Chat](https://docs.openclaw.ai/channels/googlechat) (Chat API), [Signal](https://docs.openclaw.ai/channels/signal) (signal-cli), [iMessage](https://docs.openclaw.ai/channels/imessage) (imsg), [BlueBubbles](https://docs.openclaw.ai/channels/bluebubbles) (extension), [Microsoft Teams](https://docs.openclaw.ai/channels/msteams) (extension), [Matrix](https://docs.openclaw.ai/channels/matrix) (extension), [Zalo](https://docs.openclaw.ai/channels/zalo) (extension), [Zalo Personal](https://docs.openclaw.ai/channels/zalouser) (extension), [WebChat](https://docs.openclaw.ai/web/webchat).
148
+ - [Group routing](https://docs.openclaw.ai/concepts/group-messages): mention gating, reply tags, per-channel chunking and routing. Channel rules: [Channels](https://docs.openclaw.ai/channels).
149
+
150
+ ### Apps + nodes
151
+
152
+ - [macOS app](https://docs.openclaw.ai/platforms/macos): menu bar control plane, [Voice Wake](https://docs.openclaw.ai/nodes/voicewake)/PTT, [Talk Mode](https://docs.openclaw.ai/nodes/talk) overlay, [WebChat](https://docs.openclaw.ai/web/webchat), debug tools, [remote gateway](https://docs.openclaw.ai/gateway/remote) control.
153
+ - [iOS node](https://docs.openclaw.ai/platforms/ios): [Canvas](https://docs.openclaw.ai/platforms/mac/canvas), [Voice Wake](https://docs.openclaw.ai/nodes/voicewake), [Talk Mode](https://docs.openclaw.ai/nodes/talk), camera, screen recording, Bonjour pairing.
154
+ - [Android node](https://docs.openclaw.ai/platforms/android): [Canvas](https://docs.openclaw.ai/platforms/mac/canvas), [Talk Mode](https://docs.openclaw.ai/nodes/talk), camera, screen recording, optional SMS.
155
+ - [macOS node mode](https://docs.openclaw.ai/nodes): system.run/notify + canvas/camera exposure.
156
+
157
+ ### Tools + automation
158
+
159
+ - [Browser control](https://docs.openclaw.ai/tools/browser): dedicated openclaw Chrome/Chromium, snapshots, actions, uploads, profiles.
160
+ - [Canvas](https://docs.openclaw.ai/platforms/mac/canvas): [A2UI](https://docs.openclaw.ai/platforms/mac/canvas#canvas-a2ui) push/reset, eval, snapshot.
161
+ - [Nodes](https://docs.openclaw.ai/nodes): camera snap/clip, screen record, [location.get](https://docs.openclaw.ai/nodes/location-command), notifications.
162
+ - [Cron + wakeups](https://docs.openclaw.ai/automation/cron-jobs); [webhooks](https://docs.openclaw.ai/automation/webhook); [Gmail Pub/Sub](https://docs.openclaw.ai/automation/gmail-pubsub).
163
+ - [Skills platform](https://docs.openclaw.ai/tools/skills): bundled, managed, and workspace skills with install gating + UI.
164
+
165
+ ### Runtime + safety
166
+
167
+ - [Channel routing](https://docs.openclaw.ai/concepts/channel-routing), [retry policy](https://docs.openclaw.ai/concepts/retry), and [streaming/chunking](https://docs.openclaw.ai/concepts/streaming).
168
+ - [Presence](https://docs.openclaw.ai/concepts/presence), [typing indicators](https://docs.openclaw.ai/concepts/typing-indicators), and [usage tracking](https://docs.openclaw.ai/concepts/usage-tracking).
169
+ - [Models](https://docs.openclaw.ai/concepts/models), [model failover](https://docs.openclaw.ai/concepts/model-failover), and [session pruning](https://docs.openclaw.ai/concepts/session-pruning).
170
+ - [Security](https://docs.openclaw.ai/gateway/security) and [troubleshooting](https://docs.openclaw.ai/channels/troubleshooting).
171
+
172
+ ### Ops + packaging
173
+
174
+ - [Control UI](https://docs.openclaw.ai/web) + [WebChat](https://docs.openclaw.ai/web/webchat) served directly from the Gateway.
175
+ - [Tailscale Serve/Funnel](https://docs.openclaw.ai/gateway/tailscale) or [SSH tunnels](https://docs.openclaw.ai/gateway/remote) with token/password auth.
176
+ - [Nix mode](https://docs.openclaw.ai/install/nix) for declarative config; [Docker](https://docs.openclaw.ai/install/docker)-based installs.
177
+ - [Doctor](https://docs.openclaw.ai/gateway/doctor) migrations, [logging](https://docs.openclaw.ai/logging).
178
+
179
+ ## How it works (short)
180
+
181
+ ```
182
+ WhatsApp / Telegram / Slack / Discord / Google Chat / Signal / iMessage / BlueBubbles / Microsoft Teams / Matrix / Zalo / Zalo Personal / WebChat
183
+
184
+
185
+ ┌───────────────────────────────┐
186
+ │ Gateway │
187
+ │ (control plane) │
188
+ │ ws://127.0.0.1:18789 │
189
+ └──────────────┬────────────────┘
190
+
191
+ ├─ Pi agent (RPC)
192
+ ├─ CLI (openclaw …)
193
+ ├─ WebChat UI
194
+ ├─ macOS app
195
+ └─ iOS / Android nodes
196
+ ```
197
+
198
+ ## Key subsystems
199
+
200
+ - **[Gateway WebSocket network](https://docs.openclaw.ai/concepts/architecture)** — single WS control plane for clients, tools, and events (plus ops: [Gateway runbook](https://docs.openclaw.ai/gateway)).
201
+ - **[Tailscale exposure](https://docs.openclaw.ai/gateway/tailscale)** — Serve/Funnel for the Gateway dashboard + WS (remote access: [Remote](https://docs.openclaw.ai/gateway/remote)).
202
+ - **[Browser control](https://docs.openclaw.ai/tools/browser)** — openclaw‑managed Chrome/Chromium with CDP control.
203
+ - **[Canvas + A2UI](https://docs.openclaw.ai/platforms/mac/canvas)** — agent‑driven visual workspace (A2UI host: [Canvas/A2UI](https://docs.openclaw.ai/platforms/mac/canvas#canvas-a2ui)).
204
+ - **[Voice Wake](https://docs.openclaw.ai/nodes/voicewake) + [Talk Mode](https://docs.openclaw.ai/nodes/talk)** — always‑on speech and continuous conversation.
205
+ - **[Nodes](https://docs.openclaw.ai/nodes)** — Canvas, camera snap/clip, screen record, `location.get`, notifications, plus macOS‑only `system.run`/`system.notify`.
206
+
207
+ ## Tailscale access (Gateway dashboard)
208
+
209
+ OpenClaw can auto-configure Tailscale **Serve** (tailnet-only) or **Funnel** (public) while the Gateway stays bound to loopback. Configure `gateway.tailscale.mode`:
210
+
211
+ - `off`: no Tailscale automation (default).
212
+ - `serve`: tailnet-only HTTPS via `tailscale serve` (uses Tailscale identity headers by default).
213
+ - `funnel`: public HTTPS via `tailscale funnel` (requires shared password auth).
214
+
215
+ Notes:
216
+
217
+ - `gateway.bind` must stay `loopback` when Serve/Funnel is enabled (OpenClaw enforces this).
218
+ - Serve can be forced to require a password by setting `gateway.auth.mode: "password"` or `gateway.auth.allowTailscale: false`.
219
+ - Funnel refuses to start unless `gateway.auth.mode: "password"` is set.
220
+ - Optional: `gateway.tailscale.resetOnExit` to undo Serve/Funnel on shutdown.
221
+
222
+ Details: [Tailscale guide](https://docs.openclaw.ai/gateway/tailscale) · [Web surfaces](https://docs.openclaw.ai/web)
223
+
224
+ ## Remote Gateway (Linux is great)
225
+
226
+ It’s perfectly fine to run the Gateway on a small Linux instance. Clients (macOS app, CLI, WebChat) can connect over **Tailscale Serve/Funnel** or **SSH tunnels**, and you can still pair device nodes (macOS/iOS/Android) to execute device‑local actions when needed.
227
+
228
+ - **Gateway host** runs the exec tool and channel connections by default.
229
+ - **Device nodes** run device‑local actions (`system.run`, camera, screen recording, notifications) via `node.invoke`.
230
+ In short: exec runs where the Gateway lives; device actions run where the device lives.
231
+
232
+ Details: [Remote access](https://docs.openclaw.ai/gateway/remote) · [Nodes](https://docs.openclaw.ai/nodes) · [Security](https://docs.openclaw.ai/gateway/security)
233
+
234
+ ## macOS permissions via the Gateway protocol
235
+
236
+ The macOS app can run in **node mode** and advertises its capabilities + permission map over the Gateway WebSocket (`node.list` / `node.describe`). Clients can then execute local actions via `node.invoke`:
237
+
238
+ - `system.run` runs a local command and returns stdout/stderr/exit code; set `needsScreenRecording: true` to require screen-recording permission (otherwise you’ll get `PERMISSION_MISSING`).
239
+ - `system.notify` posts a user notification and fails if notifications are denied.
240
+ - `canvas.*`, `camera.*`, `screen.record`, and `location.get` are also routed via `node.invoke` and follow TCC permission status.
241
+
242
+ Elevated bash (host permissions) is separate from macOS TCC:
243
+
244
+ - Use `/elevated on|off` to toggle per‑session elevated access when enabled + allowlisted.
245
+ - Gateway persists the per‑session toggle via `sessions.patch` (WS method) alongside `thinkingLevel`, `verboseLevel`, `model`, `sendPolicy`, and `groupActivation`.
246
+
247
+ Details: [Nodes](https://docs.openclaw.ai/nodes) · [macOS app](https://docs.openclaw.ai/platforms/macos) · [Gateway protocol](https://docs.openclaw.ai/concepts/architecture)
248
+
249
+ ## Agent to Agent (sessions\_\* tools)
250
+
251
+ - Use these to coordinate work across sessions without jumping between chat surfaces.
252
+ - `sessions_list` — discover active sessions (agents) and their metadata.
253
+ - `sessions_history` — fetch transcript logs for a session.
254
+ - `sessions_send` — message another session; optional reply‑back ping‑pong + announce step (`REPLY_SKIP`, `ANNOUNCE_SKIP`).
255
+
256
+ Details: [Session tools](https://docs.openclaw.ai/concepts/session-tool)
257
+
258
+ ## Skills registry (ClawHub)
259
+
260
+ ClawHub is a minimal skill registry. With ClawHub enabled, the agent can search for skills automatically and pull in new ones as needed.
261
+
262
+ [ClawHub](https://clawhub.com)
263
+
264
+ ## Chat commands
265
+
266
+ Send these in WhatsApp/Telegram/Slack/Google Chat/Microsoft Teams/WebChat (group commands are owner-only):
267
+
268
+ - `/status` — compact session status (model + tokens, cost when available)
269
+ - `/new` or `/reset` — reset the session
270
+ - `/compact` — compact session context (summary)
271
+ - `/think <level>` — off|minimal|low|medium|high|xhigh (GPT-5.2 + Codex models only)
272
+ - `/verbose on|off`
273
+ - `/usage off|tokens|full` — per-response usage footer
274
+ - `/restart` — restart the gateway (owner-only in groups)
275
+ - `/activation mention|always` — group activation toggle (groups only)
276
+
277
+ ## Apps (optional)
278
+
279
+ The Gateway alone delivers a great experience. All apps are optional and add extra features.
280
+
281
+ If you plan to build/run companion apps, follow the platform runbooks below.
282
+
283
+ ### macOS (OpenClaw.app) (optional)
284
+
285
+ - Menu bar control for the Gateway and health.
286
+ - Voice Wake + push-to-talk overlay.
287
+ - WebChat + debug tools.
288
+ - Remote gateway control over SSH.
289
+
290
+ Note: signed builds required for macOS permissions to stick across rebuilds (see `docs/mac/permissions.md`).
291
+
292
+ ### iOS node (optional)
293
+
294
+ - Pairs as a node via the Bridge.
295
+ - Voice trigger forwarding + Canvas surface.
296
+ - Controlled via `openclaw nodes …`.
297
+
298
+ Runbook: [iOS connect](https://docs.openclaw.ai/platforms/ios).
299
+
300
+ ### Android node (optional)
301
+
302
+ - Pairs via the same Bridge + pairing flow as iOS.
303
+ - Exposes Canvas, Camera, and Screen capture commands.
304
+ - Runbook: [Android connect](https://docs.openclaw.ai/platforms/android).
305
+
306
+ ## Agent workspace + skills
307
+
308
+ - Workspace root: `~/.openclaw/workspace` (configurable via `agents.defaults.workspace`).
309
+ - Injected prompt files: `AGENTS.md`, `SOUL.md`, `TOOLS.md`.
310
+ - Skills: `~/.openclaw/workspace/skills/<skill>/SKILL.md`.
311
+
312
+ ## Configuration
313
+
314
+ Minimal `~/.openclaw/openclaw.json` (model + defaults):
315
+
316
+ ```json5
317
+ {
318
+ agent: {
319
+ model: "anthropic/claude-opus-4-5",
320
+ },
321
+ }
322
+ ```
323
+
324
+ [Full configuration reference (all keys + examples).](https://docs.openclaw.ai/gateway/configuration)
325
+
326
+ ## Security model (important)
327
+
328
+ - **Default:** tools run on the host for the **main** session, so the agent has full access when it’s just you.
329
+ - **Group/channel safety:** set `agents.defaults.sandbox.mode: "non-main"` to run **non‑main sessions** (groups/channels) inside per‑session Docker sandboxes; bash then runs in Docker for those sessions.
330
+ - **Sandbox defaults:** allowlist `bash`, `process`, `read`, `write`, `edit`, `sessions_list`, `sessions_history`, `sessions_send`, `sessions_spawn`; denylist `browser`, `canvas`, `nodes`, `cron`, `discord`, `gateway`.
331
+
332
+ Details: [Security guide](https://docs.openclaw.ai/gateway/security) · [Docker + sandboxing](https://docs.openclaw.ai/install/docker) · [Sandbox config](https://docs.openclaw.ai/gateway/configuration)
333
+
334
+ ### [WhatsApp](https://docs.openclaw.ai/channels/whatsapp)
335
+
336
+ - Link the device: `pnpm openclaw channels login` (stores creds in `~/.openclaw/credentials`).
337
+ - Allowlist who can talk to the assistant via `channels.whatsapp.allowFrom`.
338
+ - If `channels.whatsapp.groups` is set, it becomes a group allowlist; include `"*"` to allow all.
339
+
340
+ ### [Telegram](https://docs.openclaw.ai/channels/telegram)
341
+
342
+ - Set `TELEGRAM_BOT_TOKEN` or `channels.telegram.botToken` (env wins).
343
+ - Optional: set `channels.telegram.groups` (with `channels.telegram.groups."*".requireMention`); when set, it is a group allowlist (include `"*"` to allow all). Also `channels.telegram.allowFrom` or `channels.telegram.webhookUrl` + `channels.telegram.webhookSecret` as needed.
344
+
345
+ ```json5
346
+ {
347
+ channels: {
348
+ telegram: {
349
+ botToken: "123456:ABCDEF",
350
+ },
351
+ },
352
+ }
353
+ ```
354
+
355
+ ### [Slack](https://docs.openclaw.ai/channels/slack)
356
+
357
+ - Set `SLACK_BOT_TOKEN` + `SLACK_APP_TOKEN` (or `channels.slack.botToken` + `channels.slack.appToken`).
358
+
359
+ ### [Discord](https://docs.openclaw.ai/channels/discord)
360
+
361
+ - Set `DISCORD_BOT_TOKEN` or `channels.discord.token` (env wins).
362
+ - Optional: set `commands.native`, `commands.text`, or `commands.useAccessGroups`, plus `channels.discord.dm.allowFrom`, `channels.discord.guilds`, or `channels.discord.mediaMaxMb` as needed.
363
+
364
+ ```json5
365
+ {
366
+ channels: {
367
+ discord: {
368
+ token: "1234abcd",
369
+ },
370
+ },
371
+ }
372
+ ```
373
+
374
+ ### [Signal](https://docs.openclaw.ai/channels/signal)
375
+
376
+ - Requires `signal-cli` and a `channels.signal` config section.
377
+
378
+ ### [iMessage](https://docs.openclaw.ai/channels/imessage)
379
+
380
+ - macOS only; Messages must be signed in.
381
+ - If `channels.imessage.groups` is set, it becomes a group allowlist; include `"*"` to allow all.
382
+
383
+ ### [Microsoft Teams](https://docs.openclaw.ai/channels/msteams)
384
+
385
+ - Configure a Teams app + Bot Framework, then add a `msteams` config section.
386
+ - Allowlist who can talk via `msteams.allowFrom`; group access via `msteams.groupAllowFrom` or `msteams.groupPolicy: "open"`.
387
+
388
+ ### [WebChat](https://docs.openclaw.ai/web/webchat)
389
+
390
+ - Uses the Gateway WebSocket; no separate WebChat port/config.
391
+
392
+ Browser control (optional):
393
+
394
+ ```json5
395
+ {
396
+ browser: {
397
+ enabled: true,
398
+ color: "#FF4500",
399
+ },
400
+ }
401
+ ```
402
+
403
+ ## Docs
404
+
405
+ Use these when you’re past the onboarding flow and want the deeper reference.
406
+
407
+ - [Start with the docs index for navigation and “what’s where.”](https://docs.openclaw.ai)
408
+ - [Read the architecture overview for the gateway + protocol model.](https://docs.openclaw.ai/concepts/architecture)
409
+ - [Use the full configuration reference when you need every key and example.](https://docs.openclaw.ai/gateway/configuration)
410
+ - [Run the Gateway by the book with the operational runbook.](https://docs.openclaw.ai/gateway)
411
+ - [Learn how the Control UI/Web surfaces work and how to expose them safely.](https://docs.openclaw.ai/web)
412
+ - [Understand remote access over SSH tunnels or tailnets.](https://docs.openclaw.ai/gateway/remote)
413
+ - [Follow the onboarding wizard flow for a guided setup.](https://docs.openclaw.ai/start/wizard)
414
+ - [Wire external triggers via the webhook surface.](https://docs.openclaw.ai/automation/webhook)
415
+ - [Set up Gmail Pub/Sub triggers.](https://docs.openclaw.ai/automation/gmail-pubsub)
416
+ - [Learn the macOS menu bar companion details.](https://docs.openclaw.ai/platforms/mac/menu-bar)
417
+ - [Platform guides: Windows (WSL2)](https://docs.openclaw.ai/platforms/windows), [Linux](https://docs.openclaw.ai/platforms/linux), [macOS](https://docs.openclaw.ai/platforms/macos), [iOS](https://docs.openclaw.ai/platforms/ios), [Android](https://docs.openclaw.ai/platforms/android)
418
+ - [Debug common failures with the troubleshooting guide.](https://docs.openclaw.ai/channels/troubleshooting)
419
+ - [Review security guidance before exposing anything.](https://docs.openclaw.ai/gateway/security)
420
+
421
+ ## Advanced docs (discovery + control)
422
+
423
+ - [Discovery + transports](https://docs.openclaw.ai/gateway/discovery)
424
+ - [Bonjour/mDNS](https://docs.openclaw.ai/gateway/bonjour)
425
+ - [Gateway pairing](https://docs.openclaw.ai/gateway/pairing)
426
+ - [Remote gateway README](https://docs.openclaw.ai/gateway/remote-gateway-readme)
427
+ - [Control UI](https://docs.openclaw.ai/web/control-ui)
428
+ - [Dashboard](https://docs.openclaw.ai/web/dashboard)
429
+
430
+ ## Operations & troubleshooting
431
+
432
+ - [Health checks](https://docs.openclaw.ai/gateway/health)
433
+ - [Gateway lock](https://docs.openclaw.ai/gateway/gateway-lock)
434
+ - [Background process](https://docs.openclaw.ai/gateway/background-process)
435
+ - [Browser troubleshooting (Linux)](https://docs.openclaw.ai/tools/browser-linux-troubleshooting)
436
+ - [Logging](https://docs.openclaw.ai/logging)
437
+
438
+ ## Deep dives
439
+
440
+ - [Agent loop](https://docs.openclaw.ai/concepts/agent-loop)
441
+ - [Presence](https://docs.openclaw.ai/concepts/presence)
442
+ - [TypeBox schemas](https://docs.openclaw.ai/concepts/typebox)
443
+ - [RPC adapters](https://docs.openclaw.ai/reference/rpc)
444
+ - [Queue](https://docs.openclaw.ai/concepts/queue)
445
+
446
+ ## Workspace & skills
447
+
448
+ - [Skills config](https://docs.openclaw.ai/tools/skills-config)
449
+ - [Default AGENTS](https://docs.openclaw.ai/reference/AGENTS.default)
450
+ - [Templates: AGENTS](https://docs.openclaw.ai/reference/templates/AGENTS)
451
+ - [Templates: BOOTSTRAP](https://docs.openclaw.ai/reference/templates/BOOTSTRAP)
452
+ - [Templates: IDENTITY](https://docs.openclaw.ai/reference/templates/IDENTITY)
453
+ - [Templates: SOUL](https://docs.openclaw.ai/reference/templates/SOUL)
454
+ - [Templates: TOOLS](https://docs.openclaw.ai/reference/templates/TOOLS)
455
+ - [Templates: USER](https://docs.openclaw.ai/reference/templates/USER)
456
+
457
+ ## Platform internals
458
+
459
+ - [macOS dev setup](https://docs.openclaw.ai/platforms/mac/dev-setup)
460
+ - [macOS menu bar](https://docs.openclaw.ai/platforms/mac/menu-bar)
461
+ - [macOS voice wake](https://docs.openclaw.ai/platforms/mac/voicewake)
462
+ - [iOS node](https://docs.openclaw.ai/platforms/ios)
463
+ - [Android node](https://docs.openclaw.ai/platforms/android)
464
+ - [Windows (WSL2)](https://docs.openclaw.ai/platforms/windows)
465
+ - [Linux app](https://docs.openclaw.ai/platforms/linux)
466
+
467
+ ## Email hooks (Gmail)
468
+
469
+ - [docs.openclaw.ai/gmail-pubsub](https://docs.openclaw.ai/automation/gmail-pubsub)
470
+
471
+ ## Molty
472
+
473
+ OpenClaw was built for **Molty**, a space lobster AI assistant. 🦞
474
+ by Peter Steinberger and the community.
475
+
476
+ - [openclaw.ai](https://openclaw.ai)
477
+ - [soul.md](https://soul.md)
478
+ - [steipete.me](https://steipete.me)
479
+ - [@openclaw](https://x.com/openclaw)
480
+
481
+ ## Community
482
+
483
+ See [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines, maintainers, and how to submit PRs.
484
+ AI/vibe-coded PRs welcome! 🤖
485
+
486
+ Special thanks to [Mario Zechner](https://mariozechner.at/) for his support and for
487
+ [pi-mono](https://github.com/badlogic/pi-mono).
488
+ Special thanks to Adam Doppelt for lobster.bot.
489
+
490
+ Thanks to all clawtributors:
491
+
492
+ <p align="left">
493
+ <a href="https://github.com/steipete"><img src="https://avatars.githubusercontent.com/u/58493?v=4&s=48" width="48" height="48" alt="steipete" title="steipete"/></a> <a href="https://github.com/cpojer"><img src="https://avatars.githubusercontent.com/u/13352?v=4&s=48" width="48" height="48" alt="cpojer" title="cpojer"/></a> <a href="https://github.com/plum-dawg"><img src="https://avatars.githubusercontent.com/u/5909950?v=4&s=48" width="48" height="48" alt="plum-dawg" title="plum-dawg"/></a> <a href="https://github.com/bohdanpodvirnyi"><img src="https://avatars.githubusercontent.com/u/31819391?v=4&s=48" width="48" height="48" alt="bohdanpodvirnyi" title="bohdanpodvirnyi"/></a> <a href="https://github.com/iHildy"><img src="https://avatars.githubusercontent.com/u/25069719?v=4&s=48" width="48" height="48" alt="iHildy" title="iHildy"/></a> <a href="https://github.com/jaydenfyi"><img src="https://avatars.githubusercontent.com/u/213395523?v=4&s=48" width="48" height="48" alt="jaydenfyi" title="jaydenfyi"/></a> <a href="https://github.com/joshp123"><img src="https://avatars.githubusercontent.com/u/1497361?v=4&s=48" width="48" height="48" alt="joshp123" title="joshp123"/></a> <a href="https://github.com/joaohlisboa"><img src="https://avatars.githubusercontent.com/u/8200873?v=4&s=48" width="48" height="48" alt="joaohlisboa" title="joaohlisboa"/></a> <a href="https://github.com/mneves75"><img src="https://avatars.githubusercontent.com/u/2423436?v=4&s=48" width="48" height="48" alt="mneves75" title="mneves75"/></a> <a href="https://github.com/MatthieuBizien"><img src="https://avatars.githubusercontent.com/u/173090?v=4&s=48" width="48" height="48" alt="MatthieuBizien" title="MatthieuBizien"/></a>
494
+ <a href="https://github.com/MaudeBot"><img src="https://avatars.githubusercontent.com/u/255777700?v=4&s=48" width="48" height="48" alt="MaudeBot" title="MaudeBot"/></a> <a href="https://github.com/Glucksberg"><img src="https://avatars.githubusercontent.com/u/80581902?v=4&s=48" width="48" height="48" alt="Glucksberg" title="Glucksberg"/></a> <a href="https://github.com/rahthakor"><img src="https://avatars.githubusercontent.com/u/8470553?v=4&s=48" width="48" height="48" alt="rahthakor" title="rahthakor"/></a> <a href="https://github.com/vrknetha"><img src="https://avatars.githubusercontent.com/u/20596261?v=4&s=48" width="48" height="48" alt="vrknetha" title="vrknetha"/></a> <a href="https://github.com/radek-paclt"><img src="https://avatars.githubusercontent.com/u/50451445?v=4&s=48" width="48" height="48" alt="radek-paclt" title="radek-paclt"/></a> <a href="https://github.com/vignesh07"><img src="https://avatars.githubusercontent.com/u/1436853?v=4&s=48" width="48" height="48" alt="vignesh07" title="vignesh07"/></a> <a href="https://github.com/tobiasbischoff"><img src="https://avatars.githubusercontent.com/u/711564?v=4&s=48" width="48" height="48" alt="Tobias Bischoff" title="Tobias Bischoff"/></a> <a href="https://github.com/sebslight"><img src="https://avatars.githubusercontent.com/u/19554889?v=4&s=48" width="48" height="48" alt="sebslight" title="sebslight"/></a> <a href="https://github.com/czekaj"><img src="https://avatars.githubusercontent.com/u/1464539?v=4&s=48" width="48" height="48" alt="czekaj" title="czekaj"/></a> <a href="https://github.com/mukhtharcm"><img src="https://avatars.githubusercontent.com/u/56378562?v=4&s=48" width="48" height="48" alt="mukhtharcm" title="mukhtharcm"/></a>
495
+ <a href="https://github.com/maxsumrall"><img src="https://avatars.githubusercontent.com/u/628843?v=4&s=48" width="48" height="48" alt="maxsumrall" title="maxsumrall"/></a> <a href="https://github.com/xadenryan"><img src="https://avatars.githubusercontent.com/u/165437834?v=4&s=48" width="48" height="48" alt="xadenryan" title="xadenryan"/></a> <a href="https://github.com/VACInc"><img src="https://avatars.githubusercontent.com/u/3279061?v=4&s=48" width="48" height="48" alt="VACInc" title="VACInc"/></a> <a href="https://github.com/mbelinky"><img src="https://avatars.githubusercontent.com/u/132747814?v=4&s=48" width="48" height="48" alt="Mariano Belinky" title="Mariano Belinky"/></a> <a href="https://github.com/rodrigouroz"><img src="https://avatars.githubusercontent.com/u/384037?v=4&s=48" width="48" height="48" alt="rodrigouroz" title="rodrigouroz"/></a> <a href="https://github.com/tyler6204"><img src="https://avatars.githubusercontent.com/u/64381258?v=4&s=48" width="48" height="48" alt="tyler6204" title="tyler6204"/></a> <a href="https://github.com/juanpablodlc"><img src="https://avatars.githubusercontent.com/u/92012363?v=4&s=48" width="48" height="48" alt="juanpablodlc" title="juanpablodlc"/></a> <a href="https://github.com/conroywhitney"><img src="https://avatars.githubusercontent.com/u/249891?v=4&s=48" width="48" height="48" alt="conroywhitney" title="conroywhitney"/></a> <a href="https://github.com/hsrvc"><img src="https://avatars.githubusercontent.com/u/129702169?v=4&s=48" width="48" height="48" alt="hsrvc" title="hsrvc"/></a> <a href="https://github.com/magimetal"><img src="https://avatars.githubusercontent.com/u/36491250?v=4&s=48" width="48" height="48" alt="magimetal" title="magimetal"/></a>
496
+ <a href="https://github.com/zerone0x"><img src="https://avatars.githubusercontent.com/u/39543393?v=4&s=48" width="48" height="48" alt="zerone0x" title="zerone0x"/></a> <a href="https://github.com/meaningfool"><img src="https://avatars.githubusercontent.com/u/2862331?v=4&s=48" width="48" height="48" alt="meaningfool" title="meaningfool"/></a> <a href="https://github.com/patelhiren"><img src="https://avatars.githubusercontent.com/u/172098?v=4&s=48" width="48" height="48" alt="patelhiren" title="patelhiren"/></a> <a href="https://github.com/NicholasSpisak"><img src="https://avatars.githubusercontent.com/u/129075147?v=4&s=48" width="48" height="48" alt="NicholasSpisak" title="NicholasSpisak"/></a> <a href="https://github.com/jonisjongithub"><img src="https://avatars.githubusercontent.com/u/86072337?v=4&s=48" width="48" height="48" alt="jonisjongithub" title="jonisjongithub"/></a> <a href="https://github.com/AbhisekBasu1"><img src="https://avatars.githubusercontent.com/u/40645221?v=4&s=48" width="48" height="48" alt="abhisekbasu1" title="abhisekbasu1"/></a> <a href="https://github.com/jamesgroat"><img src="https://avatars.githubusercontent.com/u/2634024?v=4&s=48" width="48" height="48" alt="jamesgroat" title="jamesgroat"/></a> <a href="https://github.com/claude"><img src="https://avatars.githubusercontent.com/u/81847?v=4&s=48" width="48" height="48" alt="claude" title="claude"/></a> <a href="https://github.com/JustYannicc"><img src="https://avatars.githubusercontent.com/u/52761674?v=4&s=48" width="48" height="48" alt="JustYannicc" title="JustYannicc"/></a> <a href="https://github.com/Hyaxia"><img src="https://avatars.githubusercontent.com/u/36747317?v=4&s=48" width="48" height="48" alt="Hyaxia" title="Hyaxia"/></a>
497
+ <a href="https://github.com/dantelex"><img src="https://avatars.githubusercontent.com/u/631543?v=4&s=48" width="48" height="48" alt="dantelex" title="dantelex"/></a> <a href="https://github.com/SocialNerd42069"><img src="https://avatars.githubusercontent.com/u/118244303?v=4&s=48" width="48" height="48" alt="SocialNerd42069" title="SocialNerd42069"/></a> <a href="https://github.com/daveonkels"><img src="https://avatars.githubusercontent.com/u/533642?v=4&s=48" width="48" height="48" alt="daveonkels" title="daveonkels"/></a> <a href="https://github.com/apps/google-labs-jules"><img src="https://avatars.githubusercontent.com/in/842251?v=4&s=48" width="48" height="48" alt="google-labs-jules[bot]" title="google-labs-jules[bot]"/></a> <a href="https://github.com/lc0rp"><img src="https://avatars.githubusercontent.com/u/2609441?v=4&s=48" width="48" height="48" alt="lc0rp" title="lc0rp"/></a> <a href="https://github.com/mousberg"><img src="https://avatars.githubusercontent.com/u/57605064?v=4&s=48" width="48" height="48" alt="mousberg" title="mousberg"/></a> <a href="https://github.com/adam91holt"><img src="https://avatars.githubusercontent.com/u/9592417?v=4&s=48" width="48" height="48" alt="adam91holt" title="adam91holt"/></a> <a href="https://github.com/hougangdev"><img src="https://avatars.githubusercontent.com/u/105773686?v=4&s=48" width="48" height="48" alt="hougangdev" title="hougangdev"/></a> <a href="https://github.com/gumadeiras"><img src="https://avatars.githubusercontent.com/u/5599352?v=4&s=48" width="48" height="48" alt="gumadeiras" title="gumadeiras"/></a> <a href="https://github.com/shakkernerd"><img src="https://avatars.githubusercontent.com/u/165377636?v=4&s=48" width="48" height="48" alt="shakkernerd" title="shakkernerd"/></a>
498
+ <a href="https://github.com/mteam88"><img src="https://avatars.githubusercontent.com/u/84196639?v=4&s=48" width="48" height="48" alt="mteam88" title="mteam88"/></a> <a href="https://github.com/hirefrank"><img src="https://avatars.githubusercontent.com/u/183158?v=4&s=48" width="48" height="48" alt="hirefrank" title="hirefrank"/></a> <a href="https://github.com/joeynyc"><img src="https://avatars.githubusercontent.com/u/17919866?v=4&s=48" width="48" height="48" alt="joeynyc" title="joeynyc"/></a> <a href="https://github.com/orlyjamie"><img src="https://avatars.githubusercontent.com/u/6668807?v=4&s=48" width="48" height="48" alt="orlyjamie" title="orlyjamie"/></a> <a href="https://github.com/dbhurley"><img src="https://avatars.githubusercontent.com/u/5251425?v=4&s=48" width="48" height="48" alt="dbhurley" title="dbhurley"/></a> <a href="https://github.com/omniwired"><img src="https://avatars.githubusercontent.com/u/322761?v=4&s=48" width="48" height="48" alt="Eng. Juan Combetto" title="Eng. Juan Combetto"/></a> <a href="https://github.com/TSavo"><img src="https://avatars.githubusercontent.com/u/877990?v=4&s=48" width="48" height="48" alt="TSavo" title="TSavo"/></a> <a href="https://github.com/aerolalit"><img src="https://avatars.githubusercontent.com/u/17166039?v=4&s=48" width="48" height="48" alt="aerolalit" title="aerolalit"/></a> <a href="https://github.com/julianengel"><img src="https://avatars.githubusercontent.com/u/10634231?v=4&s=48" width="48" height="48" alt="julianengel" title="julianengel"/></a> <a href="https://github.com/bradleypriest"><img src="https://avatars.githubusercontent.com/u/167215?v=4&s=48" width="48" height="48" alt="bradleypriest" title="bradleypriest"/></a>
499
+ <a href="https://github.com/benithors"><img src="https://avatars.githubusercontent.com/u/20652882?v=4&s=48" width="48" height="48" alt="benithors" title="benithors"/></a> <a href="https://github.com/rohannagpal"><img src="https://avatars.githubusercontent.com/u/4009239?v=4&s=48" width="48" height="48" alt="rohannagpal" title="rohannagpal"/></a> <a href="https://github.com/timolins"><img src="https://avatars.githubusercontent.com/u/1440854?v=4&s=48" width="48" height="48" alt="timolins" title="timolins"/></a> <a href="https://github.com/f-trycua"><img src="https://avatars.githubusercontent.com/u/195596869?v=4&s=48" width="48" height="48" alt="f-trycua" title="f-trycua"/></a> <a href="https://github.com/benostein"><img src="https://avatars.githubusercontent.com/u/31802821?v=4&s=48" width="48" height="48" alt="benostein" title="benostein"/></a> <a href="https://github.com/elliotsecops"><img src="https://avatars.githubusercontent.com/u/141947839?v=4&s=48" width="48" height="48" alt="elliotsecops" title="elliotsecops"/></a> <a href="https://github.com/christianklotz"><img src="https://avatars.githubusercontent.com/u/69443?v=4&s=48" width="48" height="48" alt="christianklotz" title="christianklotz"/></a> <a href="https://github.com/Nachx639"><img src="https://avatars.githubusercontent.com/u/71144023?v=4&s=48" width="48" height="48" alt="nachx639" title="nachx639"/></a> <a href="https://github.com/pvoo"><img src="https://avatars.githubusercontent.com/u/20116814?v=4&s=48" width="48" height="48" alt="pvoo" title="pvoo"/></a> <a href="https://github.com/sreekaransrinath"><img src="https://avatars.githubusercontent.com/u/50989977?v=4&s=48" width="48" height="48" alt="sreekaransrinath" title="sreekaransrinath"/></a>
500
+ <a href="https://github.com/gupsammy"><img src="https://avatars.githubusercontent.com/u/20296019?v=4&s=48" width="48" height="48" alt="gupsammy" title="gupsammy"/></a> <a href="https://github.com/cristip73"><img src="https://avatars.githubusercontent.com/u/24499421?v=4&s=48" width="48" height="48" alt="cristip73" title="cristip73"/></a> <a href="https://github.com/stefangalescu"><img src="https://avatars.githubusercontent.com/u/52995748?v=4&s=48" width="48" height="48" alt="stefangalescu" title="stefangalescu"/></a> <a href="https://github.com/nachoiacovino"><img src="https://avatars.githubusercontent.com/u/50103937?v=4&s=48" width="48" height="48" alt="nachoiacovino" title="nachoiacovino"/></a> <a href="https://github.com/vsabavat"><img src="https://avatars.githubusercontent.com/u/50385532?v=4&s=48" width="48" height="48" alt="Vasanth Rao Naik Sabavat" title="Vasanth Rao Naik Sabavat"/></a> <a href="https://github.com/petter-b"><img src="https://avatars.githubusercontent.com/u/62076402?v=4&s=48" width="48" height="48" alt="petter-b" title="petter-b"/></a> <a href="https://github.com/thewilloftheshadow"><img src="https://avatars.githubusercontent.com/u/35580099?v=4&s=48" width="48" height="48" alt="thewilloftheshadow" title="thewilloftheshadow"/></a> <a href="https://github.com/leszekszpunar"><img src="https://avatars.githubusercontent.com/u/13106764?v=4&s=48" width="48" height="48" alt="leszekszpunar" title="leszekszpunar"/></a> <a href="https://github.com/scald"><img src="https://avatars.githubusercontent.com/u/1215913?v=4&s=48" width="48" height="48" alt="scald" title="scald"/></a> <a href="https://github.com/andranik-sahakyan"><img src="https://avatars.githubusercontent.com/u/8908029?v=4&s=48" width="48" height="48" alt="andranik-sahakyan" title="andranik-sahakyan"/></a>
501
+ <a href="https://github.com/davidguttman"><img src="https://avatars.githubusercontent.com/u/431696?v=4&s=48" width="48" height="48" alt="davidguttman" title="davidguttman"/></a> <a href="https://github.com/sleontenko"><img src="https://avatars.githubusercontent.com/u/7135949?v=4&s=48" width="48" height="48" alt="sleontenko" title="sleontenko"/></a> <a href="https://github.com/denysvitali"><img src="https://avatars.githubusercontent.com/u/4939519?v=4&s=48" width="48" height="48" alt="denysvitali" title="denysvitali"/></a> <a href="https://github.com/sircrumpet"><img src="https://avatars.githubusercontent.com/u/4436535?v=4&s=48" width="48" height="48" alt="sircrumpet" title="sircrumpet"/></a> <a href="https://github.com/peschee"><img src="https://avatars.githubusercontent.com/u/63866?v=4&s=48" width="48" height="48" alt="peschee" title="peschee"/></a> <a href="https://github.com/nonggialiang"><img src="https://avatars.githubusercontent.com/u/14367839?v=4&s=48" width="48" height="48" alt="nonggialiang" title="nonggialiang"/></a> <a href="https://github.com/rafaelreis-r"><img src="https://avatars.githubusercontent.com/u/57492577?v=4&s=48" width="48" height="48" alt="rafaelreis-r" title="rafaelreis-r"/></a> <a href="https://github.com/dominicnunez"><img src="https://avatars.githubusercontent.com/u/43616264?v=4&s=48" width="48" height="48" alt="dominicnunez" title="dominicnunez"/></a> <a href="https://github.com/lploc94"><img src="https://avatars.githubusercontent.com/u/28453843?v=4&s=48" width="48" height="48" alt="lploc94" title="lploc94"/></a> <a href="https://github.com/ratulsarna"><img src="https://avatars.githubusercontent.com/u/105903728?v=4&s=48" width="48" height="48" alt="ratulsarna" title="ratulsarna"/></a>
502
+ <a href="https://github.com/sfo2001"><img src="https://avatars.githubusercontent.com/u/103369858?v=4&s=48" width="48" height="48" alt="sfo2001" title="sfo2001"/></a> <a href="https://github.com/lutr0"><img src="https://avatars.githubusercontent.com/u/76906369?v=4&s=48" width="48" height="48" alt="lutr0" title="lutr0"/></a> <a href="https://github.com/kiranjd"><img src="https://avatars.githubusercontent.com/u/25822851?v=4&s=48" width="48" height="48" alt="kiranjd" title="kiranjd"/></a> <a href="https://github.com/danielz1z"><img src="https://avatars.githubusercontent.com/u/235270390?v=4&s=48" width="48" height="48" alt="danielz1z" title="danielz1z"/></a> <a href="https://github.com/AdeboyeDN"><img src="https://avatars.githubusercontent.com/u/65312338?v=4&s=48" width="48" height="48" alt="AdeboyeDN" title="AdeboyeDN"/></a> <a href="https://github.com/Alg0rix"><img src="https://avatars.githubusercontent.com/u/53804949?v=4&s=48" width="48" height="48" alt="Alg0rix" title="Alg0rix"/></a> <a href="https://github.com/Takhoffman"><img src="https://avatars.githubusercontent.com/u/781889?v=4&s=48" width="48" height="48" alt="Takhoffman" title="Takhoffman"/></a> <a href="https://github.com/papago2355"><img src="https://avatars.githubusercontent.com/u/68721273?v=4&s=48" width="48" height="48" alt="papago2355" title="papago2355"/></a> <a href="https://github.com/apps/clawdinator"><img src="https://avatars.githubusercontent.com/in/2607181?v=4&s=48" width="48" height="48" alt="clawdinator[bot]" title="clawdinator[bot]"/></a> <a href="https://github.com/emanuelst"><img src="https://avatars.githubusercontent.com/u/9994339?v=4&s=48" width="48" height="48" alt="emanuelst" title="emanuelst"/></a>
503
+ <a href="https://github.com/evanotero"><img src="https://avatars.githubusercontent.com/u/13204105?v=4&s=48" width="48" height="48" alt="evanotero" title="evanotero"/></a> <a href="https://github.com/KristijanJovanovski"><img src="https://avatars.githubusercontent.com/u/8942284?v=4&s=48" width="48" height="48" alt="KristijanJovanovski" title="KristijanJovanovski"/></a> <a href="https://github.com/jlowin"><img src="https://avatars.githubusercontent.com/u/153965?v=4&s=48" width="48" height="48" alt="jlowin" title="jlowin"/></a> <a href="https://github.com/rdev"><img src="https://avatars.githubusercontent.com/u/8418866?v=4&s=48" width="48" height="48" alt="rdev" title="rdev"/></a> <a href="https://github.com/rhuanssauro"><img src="https://avatars.githubusercontent.com/u/164682191?v=4&s=48" width="48" height="48" alt="rhuanssauro" title="rhuanssauro"/></a> <a href="https://github.com/joshrad-dev"><img src="https://avatars.githubusercontent.com/u/62785552?v=4&s=48" width="48" height="48" alt="joshrad-dev" title="joshrad-dev"/></a> <a href="https://github.com/obviyus"><img src="https://avatars.githubusercontent.com/u/22031114?v=4&s=48" width="48" height="48" alt="obviyus" title="obviyus"/></a> <a href="https://github.com/osolmaz"><img src="https://avatars.githubusercontent.com/u/2453968?v=4&s=48" width="48" height="48" alt="osolmaz" title="osolmaz"/></a> <a href="https://github.com/adityashaw2"><img src="https://avatars.githubusercontent.com/u/41204444?v=4&s=48" width="48" height="48" alt="adityashaw2" title="adityashaw2"/></a> <a href="https://github.com/CashWilliams"><img src="https://avatars.githubusercontent.com/u/613573?v=4&s=48" width="48" height="48" alt="CashWilliams" title="CashWilliams"/></a>
504
+ <a href="https://github.com/search?q=sheeek"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="sheeek" title="sheeek"/></a> <a href="https://github.com/ryancontent"><img src="https://avatars.githubusercontent.com/u/39743613?v=4&s=48" width="48" height="48" alt="ryancontent" title="ryancontent"/></a> <a href="https://github.com/jasonsschin"><img src="https://avatars.githubusercontent.com/u/1456889?v=4&s=48" width="48" height="48" alt="jasonsschin" title="jasonsschin"/></a> <a href="https://github.com/artuskg"><img src="https://avatars.githubusercontent.com/u/11966157?v=4&s=48" width="48" height="48" alt="artuskg" title="artuskg"/></a> <a href="https://github.com/onutc"><img src="https://avatars.githubusercontent.com/u/152018508?v=4&s=48" width="48" height="48" alt="onutc" title="onutc"/></a> <a href="https://github.com/pauloportella"><img src="https://avatars.githubusercontent.com/u/22947229?v=4&s=48" width="48" height="48" alt="pauloportella" title="pauloportella"/></a> <a href="https://github.com/HirokiKobayashi-R"><img src="https://avatars.githubusercontent.com/u/37167840?v=4&s=48" width="48" height="48" alt="HirokiKobayashi-R" title="HirokiKobayashi-R"/></a> <a href="https://github.com/ThanhNguyxn"><img src="https://avatars.githubusercontent.com/u/74597207?v=4&s=48" width="48" height="48" alt="ThanhNguyxn" title="ThanhNguyxn"/></a> <a href="https://github.com/kimitaka"><img src="https://avatars.githubusercontent.com/u/167225?v=4&s=48" width="48" height="48" alt="kimitaka" title="kimitaka"/></a> <a href="https://github.com/yuting0624"><img src="https://avatars.githubusercontent.com/u/32728916?v=4&s=48" width="48" height="48" alt="yuting0624" title="yuting0624"/></a>
505
+ <a href="https://github.com/neooriginal"><img src="https://avatars.githubusercontent.com/u/54811660?v=4&s=48" width="48" height="48" alt="neooriginal" title="neooriginal"/></a> <a href="https://github.com/ManuelHettich"><img src="https://avatars.githubusercontent.com/u/17690367?v=4&s=48" width="48" height="48" alt="manuelhettich" title="manuelhettich"/></a> <a href="https://github.com/minghinmatthewlam"><img src="https://avatars.githubusercontent.com/u/14224566?v=4&s=48" width="48" height="48" alt="minghinmatthewlam" title="minghinmatthewlam"/></a> <a href="https://github.com/baccula"><img src="https://avatars.githubusercontent.com/u/22080883?v=4&s=48" width="48" height="48" alt="baccula" title="baccula"/></a> <a href="https://github.com/manikv12"><img src="https://avatars.githubusercontent.com/u/49544491?v=4&s=48" width="48" height="48" alt="manikv12" title="manikv12"/></a> <a href="https://github.com/myfunc"><img src="https://avatars.githubusercontent.com/u/19294627?v=4&s=48" width="48" height="48" alt="myfunc" title="myfunc"/></a> <a href="https://github.com/travisirby"><img src="https://avatars.githubusercontent.com/u/5958376?v=4&s=48" width="48" height="48" alt="travisirby" title="travisirby"/></a> <a href="https://github.com/buddyh"><img src="https://avatars.githubusercontent.com/u/31752869?v=4&s=48" width="48" height="48" alt="buddyh" title="buddyh"/></a> <a href="https://github.com/connorshea"><img src="https://avatars.githubusercontent.com/u/2977353?v=4&s=48" width="48" height="48" alt="connorshea" title="connorshea"/></a> <a href="https://github.com/kyleok"><img src="https://avatars.githubusercontent.com/u/58307870?v=4&s=48" width="48" height="48" alt="kyleok" title="kyleok"/></a>
506
+ <a href="https://github.com/mcinteerj"><img src="https://avatars.githubusercontent.com/u/3613653?v=4&s=48" width="48" height="48" alt="mcinteerj" title="mcinteerj"/></a> <a href="https://github.com/apps/dependabot"><img src="https://avatars.githubusercontent.com/in/29110?v=4&s=48" width="48" height="48" alt="dependabot[bot]" title="dependabot[bot]"/></a> <a href="https://github.com/amitbiswal007"><img src="https://avatars.githubusercontent.com/u/108086198?v=4&s=48" width="48" height="48" alt="amitbiswal007" title="amitbiswal007"/></a> <a href="https://github.com/John-Rood"><img src="https://avatars.githubusercontent.com/u/62669593?v=4&s=48" width="48" height="48" alt="John-Rood" title="John-Rood"/></a> <a href="https://github.com/timkrase"><img src="https://avatars.githubusercontent.com/u/38947626?v=4&s=48" width="48" height="48" alt="timkrase" title="timkrase"/></a> <a href="https://github.com/uos-status"><img src="https://avatars.githubusercontent.com/u/255712580?v=4&s=48" width="48" height="48" alt="uos-status" title="uos-status"/></a> <a href="https://github.com/gerardward2007"><img src="https://avatars.githubusercontent.com/u/3002155?v=4&s=48" width="48" height="48" alt="gerardward2007" title="gerardward2007"/></a> <a href="https://github.com/roshanasingh4"><img src="https://avatars.githubusercontent.com/u/88576930?v=4&s=48" width="48" height="48" alt="roshanasingh4" title="roshanasingh4"/></a> <a href="https://github.com/tosh-hamburg"><img src="https://avatars.githubusercontent.com/u/58424326?v=4&s=48" width="48" height="48" alt="tosh-hamburg" title="tosh-hamburg"/></a> <a href="https://github.com/azade-c"><img src="https://avatars.githubusercontent.com/u/252790079?v=4&s=48" width="48" height="48" alt="azade-c" title="azade-c"/></a>
507
+ <a href="https://github.com/badlogic"><img src="https://avatars.githubusercontent.com/u/514052?v=4&s=48" width="48" height="48" alt="badlogic" title="badlogic"/></a> <a href="https://github.com/dlauer"><img src="https://avatars.githubusercontent.com/u/757041?v=4&s=48" width="48" height="48" alt="dlauer" title="dlauer"/></a> <a href="https://github.com/JonUleis"><img src="https://avatars.githubusercontent.com/u/7644941?v=4&s=48" width="48" height="48" alt="JonUleis" title="JonUleis"/></a> <a href="https://github.com/shivamraut101"><img src="https://avatars.githubusercontent.com/u/110457469?v=4&s=48" width="48" height="48" alt="shivamraut101" title="shivamraut101"/></a> <a href="https://github.com/bjesuiter"><img src="https://avatars.githubusercontent.com/u/2365676?v=4&s=48" width="48" height="48" alt="bjesuiter" title="bjesuiter"/></a> <a href="https://github.com/cheeeee"><img src="https://avatars.githubusercontent.com/u/21245729?v=4&s=48" width="48" height="48" alt="cheeeee" title="cheeeee"/></a> <a href="https://github.com/robbyczgw-cla"><img src="https://avatars.githubusercontent.com/u/239660374?v=4&s=48" width="48" height="48" alt="robbyczgw-cla" title="robbyczgw-cla"/></a> <a href="https://github.com/YuriNachos"><img src="https://avatars.githubusercontent.com/u/19365375?v=4&s=48" width="48" height="48" alt="YuriNachos" title="YuriNachos"/></a> <a href="https://github.com/j1philli"><img src="https://avatars.githubusercontent.com/u/3744255?v=4&s=48" width="48" height="48" alt="Josh Phillips" title="Josh Phillips"/></a> <a href="https://github.com/pookNast"><img src="https://avatars.githubusercontent.com/u/14242552?v=4&s=48" width="48" height="48" alt="pookNast" title="pookNast"/></a>
508
+ <a href="https://github.com/Whoaa512"><img src="https://avatars.githubusercontent.com/u/1581943?v=4&s=48" width="48" height="48" alt="Whoaa512" title="Whoaa512"/></a> <a href="https://github.com/chriseidhof"><img src="https://avatars.githubusercontent.com/u/5382?v=4&s=48" width="48" height="48" alt="chriseidhof" title="chriseidhof"/></a> <a href="https://github.com/ngutman"><img src="https://avatars.githubusercontent.com/u/1540134?v=4&s=48" width="48" height="48" alt="ngutman" title="ngutman"/></a> <a href="https://github.com/ysqander"><img src="https://avatars.githubusercontent.com/u/80843820?v=4&s=48" width="48" height="48" alt="ysqander" title="ysqander"/></a> <a href="https://github.com/search?q=Yurii%20Chukhlib"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Yurii Chukhlib" title="Yurii Chukhlib"/></a> <a href="https://github.com/aj47"><img src="https://avatars.githubusercontent.com/u/8023513?v=4&s=48" width="48" height="48" alt="aj47" title="aj47"/></a> <a href="https://github.com/kennyklee"><img src="https://avatars.githubusercontent.com/u/1432489?v=4&s=48" width="48" height="48" alt="kennyklee" title="kennyklee"/></a> <a href="https://github.com/superman32432432"><img src="https://avatars.githubusercontent.com/u/7228420?v=4&s=48" width="48" height="48" alt="superman32432432" title="superman32432432"/></a> <a href="https://github.com/grp06"><img src="https://avatars.githubusercontent.com/u/1573959?v=4&s=48" width="48" height="48" alt="grp06" title="grp06"/></a> <a href="https://github.com/Hisleren"><img src="https://avatars.githubusercontent.com/u/83217244?v=4&s=48" width="48" height="48" alt="Hisleren" title="Hisleren"/></a>
509
+ <a href="https://github.com/shatner"><img src="https://avatars.githubusercontent.com/u/17735435?v=4&s=48" width="48" height="48" alt="shatner" title="shatner"/></a> <a href="https://github.com/antons"><img src="https://avatars.githubusercontent.com/u/129705?v=4&s=48" width="48" height="48" alt="antons" title="antons"/></a> <a href="https://github.com/austinm911"><img src="https://avatars.githubusercontent.com/u/31991302?v=4&s=48" width="48" height="48" alt="austinm911" title="austinm911"/></a> <a href="https://github.com/apps/blacksmith-sh"><img src="https://avatars.githubusercontent.com/in/807020?v=4&s=48" width="48" height="48" alt="blacksmith-sh[bot]" title="blacksmith-sh[bot]"/></a> <a href="https://github.com/damoahdominic"><img src="https://avatars.githubusercontent.com/u/4623434?v=4&s=48" width="48" height="48" alt="damoahdominic" title="damoahdominic"/></a> <a href="https://github.com/dan-dr"><img src="https://avatars.githubusercontent.com/u/6669808?v=4&s=48" width="48" height="48" alt="dan-dr" title="dan-dr"/></a> <a href="https://github.com/GHesericsu"><img src="https://avatars.githubusercontent.com/u/60202455?v=4&s=48" width="48" height="48" alt="GHesericsu" title="GHesericsu"/></a> <a href="https://github.com/HeimdallStrategy"><img src="https://avatars.githubusercontent.com/u/223014405?v=4&s=48" width="48" height="48" alt="HeimdallStrategy" title="HeimdallStrategy"/></a> <a href="https://github.com/imfing"><img src="https://avatars.githubusercontent.com/u/5097752?v=4&s=48" width="48" height="48" alt="imfing" title="imfing"/></a> <a href="https://github.com/jalehman"><img src="https://avatars.githubusercontent.com/u/550978?v=4&s=48" width="48" height="48" alt="jalehman" title="jalehman"/></a>
510
+ <a href="https://github.com/jarvis-medmatic"><img src="https://avatars.githubusercontent.com/u/252428873?v=4&s=48" width="48" height="48" alt="jarvis-medmatic" title="jarvis-medmatic"/></a> <a href="https://github.com/kkarimi"><img src="https://avatars.githubusercontent.com/u/875218?v=4&s=48" width="48" height="48" alt="kkarimi" title="kkarimi"/></a> <a href="https://github.com/mahmoudashraf93"><img src="https://avatars.githubusercontent.com/u/9130129?v=4&s=48" width="48" height="48" alt="mahmoudashraf93" title="mahmoudashraf93"/></a> <a href="https://github.com/pkrmf"><img src="https://avatars.githubusercontent.com/u/1714267?v=4&s=48" width="48" height="48" alt="pkrmf" title="pkrmf"/></a> <a href="https://github.com/RandyVentures"><img src="https://avatars.githubusercontent.com/u/149904821?v=4&s=48" width="48" height="48" alt="RandyVentures" title="RandyVentures"/></a> <a href="https://github.com/robhparker"><img src="https://avatars.githubusercontent.com/u/7404740?v=4&s=48" width="48" height="48" alt="robhparker" title="robhparker"/></a> <a href="https://github.com/search?q=Ryan%20Lisse"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Ryan Lisse" title="Ryan Lisse"/></a> <a href="https://github.com/dougvk"><img src="https://avatars.githubusercontent.com/u/401660?v=4&s=48" width="48" height="48" alt="dougvk" title="dougvk"/></a> <a href="https://github.com/erikpr1994"><img src="https://avatars.githubusercontent.com/u/6299331?v=4&s=48" width="48" height="48" alt="erikpr1994" title="erikpr1994"/></a> <a href="https://github.com/fal3"><img src="https://avatars.githubusercontent.com/u/6484295?v=4&s=48" width="48" height="48" alt="fal3" title="fal3"/></a>
511
+ <a href="https://github.com/search?q=Ghost"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Ghost" title="Ghost"/></a> <a href="https://github.com/jonasjancarik"><img src="https://avatars.githubusercontent.com/u/2459191?v=4&s=48" width="48" height="48" alt="jonasjancarik" title="jonasjancarik"/></a> <a href="https://github.com/search?q=Keith%20the%20Silly%20Goose"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Keith the Silly Goose" title="Keith the Silly Goose"/></a> <a href="https://github.com/search?q=L36%20Server"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="L36 Server" title="L36 Server"/></a> <a href="https://github.com/search?q=Marc"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Marc" title="Marc"/></a> <a href="https://github.com/mitschabaude-bot"><img src="https://avatars.githubusercontent.com/u/247582884?v=4&s=48" width="48" height="48" alt="mitschabaude-bot" title="mitschabaude-bot"/></a> <a href="https://github.com/mkbehr"><img src="https://avatars.githubusercontent.com/u/1285?v=4&s=48" width="48" height="48" alt="mkbehr" title="mkbehr"/></a> <a href="https://github.com/neist"><img src="https://avatars.githubusercontent.com/u/1029724?v=4&s=48" width="48" height="48" alt="neist" title="neist"/></a> <a href="https://github.com/sibbl"><img src="https://avatars.githubusercontent.com/u/866535?v=4&s=48" width="48" height="48" alt="sibbl" title="sibbl"/></a> <a href="https://github.com/abhijeet117"><img src="https://avatars.githubusercontent.com/u/192859219?v=4&s=48" width="48" height="48" alt="abhijeet117" title="abhijeet117"/></a>
512
+ <a href="https://github.com/chrisrodz"><img src="https://avatars.githubusercontent.com/u/2967620?v=4&s=48" width="48" height="48" alt="chrisrodz" title="chrisrodz"/></a> <a href="https://github.com/search?q=Friederike%20Seiler"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Friederike Seiler" title="Friederike Seiler"/></a> <a href="https://github.com/gabriel-trigo"><img src="https://avatars.githubusercontent.com/u/38991125?v=4&s=48" width="48" height="48" alt="gabriel-trigo" title="gabriel-trigo"/></a> <a href="https://github.com/Iamadig"><img src="https://avatars.githubusercontent.com/u/102129234?v=4&s=48" width="48" height="48" alt="iamadig" title="iamadig"/></a> <a href="https://github.com/itsjling"><img src="https://avatars.githubusercontent.com/u/2521993?v=4&s=48" width="48" height="48" alt="itsjling" title="itsjling"/></a> <a href="https://github.com/jdrhyne"><img src="https://avatars.githubusercontent.com/u/7828464?v=4&s=48" width="48" height="48" alt="Jonathan D. Rhyne (DJ-D)" title="Jonathan D. Rhyne (DJ-D)"/></a> <a href="https://github.com/search?q=Joshua%20Mitchell"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Joshua Mitchell" title="Joshua Mitchell"/></a> <a href="https://github.com/search?q=Kit"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Kit" title="Kit"/></a> <a href="https://github.com/koala73"><img src="https://avatars.githubusercontent.com/u/996596?v=4&s=48" width="48" height="48" alt="koala73" title="koala73"/></a> <a href="https://github.com/manmal"><img src="https://avatars.githubusercontent.com/u/142797?v=4&s=48" width="48" height="48" alt="manmal" title="manmal"/></a>
513
+ <a href="https://github.com/ogulcancelik"><img src="https://avatars.githubusercontent.com/u/7064011?v=4&s=48" width="48" height="48" alt="ogulcancelik" title="ogulcancelik"/></a> <a href="https://github.com/pasogott"><img src="https://avatars.githubusercontent.com/u/23458152?v=4&s=48" width="48" height="48" alt="pasogott" title="pasogott"/></a> <a href="https://github.com/petradonka"><img src="https://avatars.githubusercontent.com/u/7353770?v=4&s=48" width="48" height="48" alt="petradonka" title="petradonka"/></a> <a href="https://github.com/rubyrunsstuff"><img src="https://avatars.githubusercontent.com/u/246602379?v=4&s=48" width="48" height="48" alt="rubyrunsstuff" title="rubyrunsstuff"/></a> <a href="https://github.com/siddhantjain"><img src="https://avatars.githubusercontent.com/u/4835232?v=4&s=48" width="48" height="48" alt="siddhantjain" title="siddhantjain"/></a> <a href="https://github.com/spiceoogway"><img src="https://avatars.githubusercontent.com/u/105812383?v=4&s=48" width="48" height="48" alt="spiceoogway" title="spiceoogway"/></a> <a href="https://github.com/suminhthanh"><img src="https://avatars.githubusercontent.com/u/2907636?v=4&s=48" width="48" height="48" alt="suminhthanh" title="suminhthanh"/></a> <a href="https://github.com/svkozak"><img src="https://avatars.githubusercontent.com/u/31941359?v=4&s=48" width="48" height="48" alt="svkozak" title="svkozak"/></a> <a href="https://github.com/wes-davis"><img src="https://avatars.githubusercontent.com/u/16506720?v=4&s=48" width="48" height="48" alt="wes-davis" title="wes-davis"/></a> <a href="https://github.com/zats"><img src="https://avatars.githubusercontent.com/u/2688806?v=4&s=48" width="48" height="48" alt="zats" title="zats"/></a>
514
+ <a href="https://github.com/24601"><img src="https://avatars.githubusercontent.com/u/1157207?v=4&s=48" width="48" height="48" alt="24601" title="24601"/></a> <a href="https://github.com/ameno-"><img src="https://avatars.githubusercontent.com/u/2416135?v=4&s=48" width="48" height="48" alt="ameno-" title="ameno-"/></a> <a href="https://github.com/bonald"><img src="https://avatars.githubusercontent.com/u/12394874?v=4&s=48" width="48" height="48" alt="bonald" title="bonald"/></a> <a href="https://github.com/bravostation"><img src="https://avatars.githubusercontent.com/u/257991910?v=4&s=48" width="48" height="48" alt="bravostation" title="bravostation"/></a> <a href="https://github.com/search?q=Chris%20Taylor"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Chris Taylor" title="Chris Taylor"/></a> <a href="https://github.com/dguido"><img src="https://avatars.githubusercontent.com/u/294844?v=4&s=48" width="48" height="48" alt="dguido" title="dguido"/></a> <a href="https://github.com/djangonavarro220"><img src="https://avatars.githubusercontent.com/u/251162586?v=4&s=48" width="48" height="48" alt="Django Navarro" title="Django Navarro"/></a> <a href="https://github.com/evalexpr"><img src="https://avatars.githubusercontent.com/u/23485511?v=4&s=48" width="48" height="48" alt="evalexpr" title="evalexpr"/></a> <a href="https://github.com/henrino3"><img src="https://avatars.githubusercontent.com/u/4260288?v=4&s=48" width="48" height="48" alt="henrino3" title="henrino3"/></a> <a href="https://github.com/humanwritten"><img src="https://avatars.githubusercontent.com/u/206531610?v=4&s=48" width="48" height="48" alt="humanwritten" title="humanwritten"/></a>
515
+ <a href="https://github.com/larlyssa"><img src="https://avatars.githubusercontent.com/u/13128869?v=4&s=48" width="48" height="48" alt="larlyssa" title="larlyssa"/></a> <a href="https://github.com/Lukavyi"><img src="https://avatars.githubusercontent.com/u/1013690?v=4&s=48" width="48" height="48" alt="Lukavyi" title="Lukavyi"/></a> <a href="https://github.com/mitsuhiko"><img src="https://avatars.githubusercontent.com/u/7396?v=4&s=48" width="48" height="48" alt="mitsuhiko" title="mitsuhiko"/></a> <a href="https://github.com/odysseus0"><img src="https://avatars.githubusercontent.com/u/8635094?v=4&s=48" width="48" height="48" alt="odysseus0" title="odysseus0"/></a> <a href="https://github.com/oswalpalash"><img src="https://avatars.githubusercontent.com/u/6431196?v=4&s=48" width="48" height="48" alt="oswalpalash" title="oswalpalash"/></a> <a href="https://github.com/pcty-nextgen-service-account"><img src="https://avatars.githubusercontent.com/u/112553441?v=4&s=48" width="48" height="48" alt="pcty-nextgen-service-account" title="pcty-nextgen-service-account"/></a> <a href="https://github.com/pi0"><img src="https://avatars.githubusercontent.com/u/5158436?v=4&s=48" width="48" height="48" alt="pi0" title="pi0"/></a> <a href="https://github.com/rmorse"><img src="https://avatars.githubusercontent.com/u/853547?v=4&s=48" width="48" height="48" alt="rmorse" title="rmorse"/></a> <a href="https://github.com/search?q=Roopak%20Nijhara"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Roopak Nijhara" title="Roopak Nijhara"/></a> <a href="https://github.com/Syhids"><img src="https://avatars.githubusercontent.com/u/671202?v=4&s=48" width="48" height="48" alt="Syhids" title="Syhids"/></a>
516
+ <a href="https://github.com/search?q=Ubuntu"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Ubuntu" title="Ubuntu"/></a> <a href="https://github.com/search?q=xiaose"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="xiaose" title="xiaose"/></a> <a href="https://github.com/search?q=Aaron%20Konyer"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Aaron Konyer" title="Aaron Konyer"/></a> <a href="https://github.com/aaronveklabs"><img src="https://avatars.githubusercontent.com/u/225997828?v=4&s=48" width="48" height="48" alt="aaronveklabs" title="aaronveklabs"/></a> <a href="https://github.com/andreabadesso"><img src="https://avatars.githubusercontent.com/u/3586068?v=4&s=48" width="48" height="48" alt="andreabadesso" title="andreabadesso"/></a> <a href="https://github.com/search?q=Andrii"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Andrii" title="Andrii"/></a> <a href="https://github.com/cash-echo-bot"><img src="https://avatars.githubusercontent.com/u/252747386?v=4&s=48" width="48" height="48" alt="cash-echo-bot" title="cash-echo-bot"/></a> <a href="https://github.com/search?q=Clawd"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Clawd" title="Clawd"/></a> <a href="https://github.com/search?q=ClawdFx"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="ClawdFx" title="ClawdFx"/></a> <a href="https://github.com/danballance"><img src="https://avatars.githubusercontent.com/u/13839912?v=4&s=48" width="48" height="48" alt="danballance" title="danballance"/></a>
517
+ <a href="https://github.com/EnzeD"><img src="https://avatars.githubusercontent.com/u/9866900?v=4&s=48" width="48" height="48" alt="EnzeD" title="EnzeD"/></a> <a href="https://github.com/erik-agens"><img src="https://avatars.githubusercontent.com/u/80908960?v=4&s=48" width="48" height="48" alt="erik-agens" title="erik-agens"/></a> <a href="https://github.com/Evizero"><img src="https://avatars.githubusercontent.com/u/10854026?v=4&s=48" width="48" height="48" alt="Evizero" title="Evizero"/></a> <a href="https://github.com/fcatuhe"><img src="https://avatars.githubusercontent.com/u/17382215?v=4&s=48" width="48" height="48" alt="fcatuhe" title="fcatuhe"/></a> <a href="https://github.com/itsjaydesu"><img src="https://avatars.githubusercontent.com/u/220390?v=4&s=48" width="48" height="48" alt="itsjaydesu" title="itsjaydesu"/></a> <a href="https://github.com/ivancasco"><img src="https://avatars.githubusercontent.com/u/2452858?v=4&s=48" width="48" height="48" alt="ivancasco" title="ivancasco"/></a> <a href="https://github.com/ivanrvpereira"><img src="https://avatars.githubusercontent.com/u/183991?v=4&s=48" width="48" height="48" alt="ivanrvpereira" title="ivanrvpereira"/></a> <a href="https://github.com/search?q=Jarvis"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Jarvis" title="Jarvis"/></a> <a href="https://github.com/jayhickey"><img src="https://avatars.githubusercontent.com/u/1676460?v=4&s=48" width="48" height="48" alt="jayhickey" title="jayhickey"/></a> <a href="https://github.com/jeffersonwarrior"><img src="https://avatars.githubusercontent.com/u/89030989?v=4&s=48" width="48" height="48" alt="jeffersonwarrior" title="jeffersonwarrior"/></a>
518
+ <a href="https://github.com/search?q=jeffersonwarrior"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="jeffersonwarrior" title="jeffersonwarrior"/></a> <a href="https://github.com/jverdi"><img src="https://avatars.githubusercontent.com/u/345050?v=4&s=48" width="48" height="48" alt="jverdi" title="jverdi"/></a> <a href="https://github.com/longmaba"><img src="https://avatars.githubusercontent.com/u/9361500?v=4&s=48" width="48" height="48" alt="longmaba" title="longmaba"/></a> <a href="https://github.com/MarvinCui"><img src="https://avatars.githubusercontent.com/u/130876763?v=4&s=48" width="48" height="48" alt="MarvinCui" title="MarvinCui"/></a> <a href="https://github.com/mjrussell"><img src="https://avatars.githubusercontent.com/u/1641895?v=4&s=48" width="48" height="48" alt="mjrussell" title="mjrussell"/></a> <a href="https://github.com/odnxe"><img src="https://avatars.githubusercontent.com/u/403141?v=4&s=48" width="48" height="48" alt="odnxe" title="odnxe"/></a> <a href="https://github.com/optimikelabs"><img src="https://avatars.githubusercontent.com/u/31423109?v=4&s=48" width="48" height="48" alt="optimikelabs" title="optimikelabs"/></a> <a href="https://github.com/p6l-richard"><img src="https://avatars.githubusercontent.com/u/18185649?v=4&s=48" width="48" height="48" alt="p6l-richard" title="p6l-richard"/></a> <a href="https://github.com/philipp-spiess"><img src="https://avatars.githubusercontent.com/u/458591?v=4&s=48" width="48" height="48" alt="philipp-spiess" title="philipp-spiess"/></a> <a href="https://github.com/search?q=Pocket%20Clawd"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Pocket Clawd" title="Pocket Clawd"/></a>
519
+ <a href="https://github.com/robaxelsen"><img src="https://avatars.githubusercontent.com/u/13132899?v=4&s=48" width="48" height="48" alt="robaxelsen" title="robaxelsen"/></a> <a href="https://github.com/search?q=Sash%20Catanzarite"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Sash Catanzarite" title="Sash Catanzarite"/></a> <a href="https://github.com/Suksham-sharma"><img src="https://avatars.githubusercontent.com/u/94667656?v=4&s=48" width="48" height="48" alt="Suksham-sharma" title="Suksham-sharma"/></a> <a href="https://github.com/T5-AndyML"><img src="https://avatars.githubusercontent.com/u/22801233?v=4&s=48" width="48" height="48" alt="T5-AndyML" title="T5-AndyML"/></a> <a href="https://github.com/tewatia"><img src="https://avatars.githubusercontent.com/u/22875334?v=4&s=48" width="48" height="48" alt="tewatia" title="tewatia"/></a> <a href="https://github.com/thejhinvirtuoso"><img src="https://avatars.githubusercontent.com/u/258521837?v=4&s=48" width="48" height="48" alt="thejhinvirtuoso" title="thejhinvirtuoso"/></a> <a href="https://github.com/travisp"><img src="https://avatars.githubusercontent.com/u/165698?v=4&s=48" width="48" height="48" alt="travisp" title="travisp"/></a> <a href="https://github.com/search?q=VAC"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="VAC" title="VAC"/></a> <a href="https://github.com/search?q=william%20arzt"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="william arzt" title="william arzt"/></a> <a href="https://github.com/zknicker"><img src="https://avatars.githubusercontent.com/u/1164085?v=4&s=48" width="48" height="48" alt="zknicker" title="zknicker"/></a>
520
+ <a href="https://github.com/0oAstro"><img src="https://avatars.githubusercontent.com/u/79555780?v=4&s=48" width="48" height="48" alt="0oAstro" title="0oAstro"/></a> <a href="https://github.com/abhaymundhara"><img src="https://avatars.githubusercontent.com/u/62872231?v=4&s=48" width="48" height="48" alt="abhaymundhara" title="abhaymundhara"/></a> <a href="https://github.com/aduk059"><img src="https://avatars.githubusercontent.com/u/257603478?v=4&s=48" width="48" height="48" alt="aduk059" title="aduk059"/></a> <a href="https://github.com/aldoeliacim"><img src="https://avatars.githubusercontent.com/u/17973757?v=4&s=48" width="48" height="48" alt="aldoeliacim" title="aldoeliacim"/></a> <a href="https://github.com/search?q=alejandro%20maza"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="alejandro maza" title="alejandro maza"/></a> <a href="https://github.com/Alex-Alaniz"><img src="https://avatars.githubusercontent.com/u/88956822?v=4&s=48" width="48" height="48" alt="Alex-Alaniz" title="Alex-Alaniz"/></a> <a href="https://github.com/alexanderatallah"><img src="https://avatars.githubusercontent.com/u/1011391?v=4&s=48" width="48" height="48" alt="alexanderatallah" title="alexanderatallah"/></a> <a href="https://github.com/alexstyl"><img src="https://avatars.githubusercontent.com/u/1665273?v=4&s=48" width="48" height="48" alt="alexstyl" title="alexstyl"/></a> <a href="https://github.com/andrewting19"><img src="https://avatars.githubusercontent.com/u/10536704?v=4&s=48" width="48" height="48" alt="andrewting19" title="andrewting19"/></a> <a href="https://github.com/anpoirier"><img src="https://avatars.githubusercontent.com/u/1245729?v=4&s=48" width="48" height="48" alt="anpoirier" title="anpoirier"/></a>
521
+ <a href="https://github.com/araa47"><img src="https://avatars.githubusercontent.com/u/22760261?v=4&s=48" width="48" height="48" alt="araa47" title="araa47"/></a> <a href="https://github.com/arthyn"><img src="https://avatars.githubusercontent.com/u/5466421?v=4&s=48" width="48" height="48" alt="arthyn" title="arthyn"/></a> <a href="https://github.com/Asleep123"><img src="https://avatars.githubusercontent.com/u/122379135?v=4&s=48" width="48" height="48" alt="Asleep123" title="Asleep123"/></a> <a href="https://github.com/search?q=Ayush%20Ojha"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Ayush Ojha" title="Ayush Ojha"/></a> <a href="https://github.com/Ayush10"><img src="https://avatars.githubusercontent.com/u/7945279?v=4&s=48" width="48" height="48" alt="Ayush10" title="Ayush10"/></a> <a href="https://github.com/bguidolim"><img src="https://avatars.githubusercontent.com/u/987360?v=4&s=48" width="48" height="48" alt="bguidolim" title="bguidolim"/></a> <a href="https://github.com/bolismauro"><img src="https://avatars.githubusercontent.com/u/771999?v=4&s=48" width="48" height="48" alt="bolismauro" title="bolismauro"/></a> <a href="https://github.com/championswimmer"><img src="https://avatars.githubusercontent.com/u/1327050?v=4&s=48" width="48" height="48" alt="championswimmer" title="championswimmer"/></a> <a href="https://github.com/chenyuan99"><img src="https://avatars.githubusercontent.com/u/25518100?v=4&s=48" width="48" height="48" alt="chenyuan99" title="chenyuan99"/></a> <a href="https://github.com/Chloe-VP"><img src="https://avatars.githubusercontent.com/u/257371598?v=4&s=48" width="48" height="48" alt="Chloe-VP" title="Chloe-VP"/></a>
522
+ <a href="https://github.com/search?q=Clawdbot%20Maintainers"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Clawdbot Maintainers" title="Clawdbot Maintainers"/></a> <a href="https://github.com/conhecendoia"><img src="https://avatars.githubusercontent.com/u/82890727?v=4&s=48" width="48" height="48" alt="conhecendoia" title="conhecendoia"/></a> <a href="https://github.com/dasilva333"><img src="https://avatars.githubusercontent.com/u/947827?v=4&s=48" width="48" height="48" alt="dasilva333" title="dasilva333"/></a> <a href="https://github.com/David-Marsh-Photo"><img src="https://avatars.githubusercontent.com/u/228404527?v=4&s=48" width="48" height="48" alt="David-Marsh-Photo" title="David-Marsh-Photo"/></a> <a href="https://github.com/search?q=Developer"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Developer" title="Developer"/></a> <a href="https://github.com/search?q=Dimitrios%20Ploutarchos"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Dimitrios Ploutarchos" title="Dimitrios Ploutarchos"/></a> <a href="https://github.com/search?q=Drake%20Thomsen"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Drake Thomsen" title="Drake Thomsen"/></a> <a href="https://github.com/dylanneve1"><img src="https://avatars.githubusercontent.com/u/31746704?v=4&s=48" width="48" height="48" alt="dylanneve1" title="dylanneve1"/></a> <a href="https://github.com/search?q=Felix%20Krause"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Felix Krause" title="Felix Krause"/></a> <a href="https://github.com/foeken"><img src="https://avatars.githubusercontent.com/u/13864?v=4&s=48" width="48" height="48" alt="foeken" title="foeken"/></a>
523
+ <a href="https://github.com/frankekn"><img src="https://avatars.githubusercontent.com/u/4488090?v=4&s=48" width="48" height="48" alt="frankekn" title="frankekn"/></a> <a href="https://github.com/fredheir"><img src="https://avatars.githubusercontent.com/u/3304869?v=4&s=48" width="48" height="48" alt="fredheir" title="fredheir"/></a> <a href="https://github.com/search?q=ganghyun%20kim"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="ganghyun kim" title="ganghyun kim"/></a> <a href="https://github.com/grrowl"><img src="https://avatars.githubusercontent.com/u/907140?v=4&s=48" width="48" height="48" alt="grrowl" title="grrowl"/></a> <a href="https://github.com/gtsifrikas"><img src="https://avatars.githubusercontent.com/u/8904378?v=4&s=48" width="48" height="48" alt="gtsifrikas" title="gtsifrikas"/></a> <a href="https://github.com/HassanFleyah"><img src="https://avatars.githubusercontent.com/u/228002017?v=4&s=48" width="48" height="48" alt="HassanFleyah" title="HassanFleyah"/></a> <a href="https://github.com/HazAT"><img src="https://avatars.githubusercontent.com/u/363802?v=4&s=48" width="48" height="48" alt="HazAT" title="HazAT"/></a> <a href="https://github.com/hclsys"><img src="https://avatars.githubusercontent.com/u/7755017?v=4&s=48" width="48" height="48" alt="hclsys" title="hclsys"/></a> <a href="https://github.com/hrdwdmrbl"><img src="https://avatars.githubusercontent.com/u/554881?v=4&s=48" width="48" height="48" alt="hrdwdmrbl" title="hrdwdmrbl"/></a> <a href="https://github.com/hugobarauna"><img src="https://avatars.githubusercontent.com/u/2719?v=4&s=48" width="48" height="48" alt="hugobarauna" title="hugobarauna"/></a>
524
+ <a href="https://github.com/iamEvanYT"><img src="https://avatars.githubusercontent.com/u/47493765?v=4&s=48" width="48" height="48" alt="iamEvanYT" title="iamEvanYT"/></a> <a href="https://github.com/search?q=Jamie%20Openshaw"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Jamie Openshaw" title="Jamie Openshaw"/></a> <a href="https://github.com/search?q=Jane"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Jane" title="Jane"/></a> <a href="https://github.com/search?q=Jarvis%20Deploy"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Jarvis Deploy" title="Jarvis Deploy"/></a> <a href="https://github.com/search?q=Jefferson%20Nunn"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Jefferson Nunn" title="Jefferson Nunn"/></a> <a href="https://github.com/jogi47"><img src="https://avatars.githubusercontent.com/u/1710139?v=4&s=48" width="48" height="48" alt="jogi47" title="jogi47"/></a> <a href="https://github.com/kentaro"><img src="https://avatars.githubusercontent.com/u/3458?v=4&s=48" width="48" height="48" alt="kentaro" title="kentaro"/></a> <a href="https://github.com/search?q=Kevin%20Lin"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Kevin Lin" title="Kevin Lin"/></a> <a href="https://github.com/kira-ariaki"><img src="https://avatars.githubusercontent.com/u/257352493?v=4&s=48" width="48" height="48" alt="kira-ariaki" title="kira-ariaki"/></a> <a href="https://github.com/kitze"><img src="https://avatars.githubusercontent.com/u/1160594?v=4&s=48" width="48" height="48" alt="kitze" title="kitze"/></a>
525
+ <a href="https://github.com/Kiwitwitter"><img src="https://avatars.githubusercontent.com/u/25277769?v=4&s=48" width="48" height="48" alt="Kiwitwitter" title="Kiwitwitter"/></a> <a href="https://github.com/levifig"><img src="https://avatars.githubusercontent.com/u/1605?v=4&s=48" width="48" height="48" alt="levifig" title="levifig"/></a> <a href="https://github.com/search?q=Lloyd"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Lloyd" title="Lloyd"/></a> <a href="https://github.com/loganaden"><img src="https://avatars.githubusercontent.com/u/1688420?v=4&s=48" width="48" height="48" alt="loganaden" title="loganaden"/></a> <a href="https://github.com/longjos"><img src="https://avatars.githubusercontent.com/u/740160?v=4&s=48" width="48" height="48" alt="longjos" title="longjos"/></a> <a href="https://github.com/loukotal"><img src="https://avatars.githubusercontent.com/u/18210858?v=4&s=48" width="48" height="48" alt="loukotal" title="loukotal"/></a> <a href="https://github.com/louzhixian"><img src="https://avatars.githubusercontent.com/u/7994361?v=4&s=48" width="48" height="48" alt="louzhixian" title="louzhixian"/></a> <a href="https://github.com/martinpucik"><img src="https://avatars.githubusercontent.com/u/5503097?v=4&s=48" width="48" height="48" alt="martinpucik" title="martinpucik"/></a> <a href="https://github.com/search?q=Matt%20mini"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Matt mini" title="Matt mini"/></a> <a href="https://github.com/mertcicekci0"><img src="https://avatars.githubusercontent.com/u/179321902?v=4&s=48" width="48" height="48" alt="mertcicekci0" title="mertcicekci0"/></a>
526
+ <a href="https://github.com/search?q=Miles"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Miles" title="Miles"/></a> <a href="https://github.com/mrdbstn"><img src="https://avatars.githubusercontent.com/u/58957632?v=4&s=48" width="48" height="48" alt="mrdbstn" title="mrdbstn"/></a> <a href="https://github.com/MSch"><img src="https://avatars.githubusercontent.com/u/7475?v=4&s=48" width="48" height="48" alt="MSch" title="MSch"/></a> <a href="https://github.com/search?q=Mustafa%20Tag%20Eldeen"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Mustafa Tag Eldeen" title="Mustafa Tag Eldeen"/></a> <a href="https://github.com/mylukin"><img src="https://avatars.githubusercontent.com/u/1021019?v=4&s=48" width="48" height="48" alt="mylukin" title="mylukin"/></a> <a href="https://github.com/nathanbosse"><img src="https://avatars.githubusercontent.com/u/4040669?v=4&s=48" width="48" height="48" alt="nathanbosse" title="nathanbosse"/></a> <a href="https://github.com/ndraiman"><img src="https://avatars.githubusercontent.com/u/12609607?v=4&s=48" width="48" height="48" alt="ndraiman" title="ndraiman"/></a> <a href="https://github.com/nexty5870"><img src="https://avatars.githubusercontent.com/u/3869659?v=4&s=48" width="48" height="48" alt="nexty5870" title="nexty5870"/></a> <a href="https://github.com/Noctivoro"><img src="https://avatars.githubusercontent.com/u/183974570?v=4&s=48" width="48" height="48" alt="Noctivoro" title="Noctivoro"/></a> <a href="https://github.com/ozgur-polat"><img src="https://avatars.githubusercontent.com/u/26483942?v=4&s=48" width="48" height="48" alt="ozgur-polat" title="ozgur-polat"/></a>
527
+ <a href="https://github.com/ppamment"><img src="https://avatars.githubusercontent.com/u/2122919?v=4&s=48" width="48" height="48" alt="ppamment" title="ppamment"/></a> <a href="https://github.com/prathamdby"><img src="https://avatars.githubusercontent.com/u/134331217?v=4&s=48" width="48" height="48" alt="prathamdby" title="prathamdby"/></a> <a href="https://github.com/ptn1411"><img src="https://avatars.githubusercontent.com/u/57529765?v=4&s=48" width="48" height="48" alt="ptn1411" title="ptn1411"/></a> <a href="https://github.com/reeltimeapps"><img src="https://avatars.githubusercontent.com/u/637338?v=4&s=48" width="48" height="48" alt="reeltimeapps" title="reeltimeapps"/></a> <a href="https://github.com/RLTCmpe"><img src="https://avatars.githubusercontent.com/u/10762242?v=4&s=48" width="48" height="48" alt="RLTCmpe" title="RLTCmpe"/></a> <a href="https://github.com/search?q=Rony%20Kelner"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Rony Kelner" title="Rony Kelner"/></a> <a href="https://github.com/ryancnelson"><img src="https://avatars.githubusercontent.com/u/347171?v=4&s=48" width="48" height="48" alt="ryancnelson" title="ryancnelson"/></a> <a href="https://github.com/search?q=Samrat%20Jha"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Samrat Jha" title="Samrat Jha"/></a> <a href="https://github.com/senoldogann"><img src="https://avatars.githubusercontent.com/u/45736551?v=4&s=48" width="48" height="48" alt="senoldogann" title="senoldogann"/></a> <a href="https://github.com/Seredeep"><img src="https://avatars.githubusercontent.com/u/22802816?v=4&s=48" width="48" height="48" alt="Seredeep" title="Seredeep"/></a>
528
+ <a href="https://github.com/sergical"><img src="https://avatars.githubusercontent.com/u/3760543?v=4&s=48" width="48" height="48" alt="sergical" title="sergical"/></a> <a href="https://github.com/shiv19"><img src="https://avatars.githubusercontent.com/u/9407019?v=4&s=48" width="48" height="48" alt="shiv19" title="shiv19"/></a> <a href="https://github.com/shiyuanhai"><img src="https://avatars.githubusercontent.com/u/1187370?v=4&s=48" width="48" height="48" alt="shiyuanhai" title="shiyuanhai"/></a> <a href="https://github.com/siraht"><img src="https://avatars.githubusercontent.com/u/73152895?v=4&s=48" width="48" height="48" alt="siraht" title="siraht"/></a> <a href="https://github.com/snopoke"><img src="https://avatars.githubusercontent.com/u/249606?v=4&s=48" width="48" height="48" alt="snopoke" title="snopoke"/></a> <a href="https://github.com/search?q=techboss"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="techboss" title="techboss"/></a> <a href="https://github.com/testingabc321"><img src="https://avatars.githubusercontent.com/u/8577388?v=4&s=48" width="48" height="48" alt="testingabc321" title="testingabc321"/></a> <a href="https://github.com/search?q=The%20Admiral"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="The Admiral" title="The Admiral"/></a> <a href="https://github.com/thesash"><img src="https://avatars.githubusercontent.com/u/1166151?v=4&s=48" width="48" height="48" alt="thesash" title="thesash"/></a> <a href="https://github.com/search?q=Vibe%20Kanban"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Vibe Kanban" title="Vibe Kanban"/></a>
529
+ <a href="https://github.com/voidserf"><img src="https://avatars.githubusercontent.com/u/477673?v=4&s=48" width="48" height="48" alt="voidserf" title="voidserf"/></a> <a href="https://github.com/search?q=Vultr-Clawd%20Admin"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Vultr-Clawd Admin" title="Vultr-Clawd Admin"/></a> <a href="https://github.com/search?q=Wimmie"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Wimmie" title="Wimmie"/></a> <a href="https://github.com/search?q=wolfred"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="wolfred" title="wolfred"/></a> <a href="https://github.com/wstock"><img src="https://avatars.githubusercontent.com/u/1394687?v=4&s=48" width="48" height="48" alt="wstock" title="wstock"/></a> <a href="https://github.com/YangHuang2280"><img src="https://avatars.githubusercontent.com/u/201681634?v=4&s=48" width="48" height="48" alt="YangHuang2280" title="YangHuang2280"/></a> <a href="https://github.com/yazinsai"><img src="https://avatars.githubusercontent.com/u/1846034?v=4&s=48" width="48" height="48" alt="yazinsai" title="yazinsai"/></a> <a href="https://github.com/yevhen"><img src="https://avatars.githubusercontent.com/u/107726?v=4&s=48" width="48" height="48" alt="yevhen" title="yevhen"/></a> <a href="https://github.com/YiWang24"><img src="https://avatars.githubusercontent.com/u/176262341?v=4&s=48" width="48" height="48" alt="YiWang24" title="YiWang24"/></a> <a href="https://github.com/search?q=ymat19"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="ymat19" title="ymat19"/></a>
530
+ <a href="https://github.com/search?q=Zach%20Knickerbocker"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Zach Knickerbocker" title="Zach Knickerbocker"/></a> <a href="https://github.com/zackerthescar"><img src="https://avatars.githubusercontent.com/u/38077284?v=4&s=48" width="48" height="48" alt="zackerthescar" title="zackerthescar"/></a> <a href="https://github.com/0xJonHoldsCrypto"><img src="https://avatars.githubusercontent.com/u/81202085?v=4&s=48" width="48" height="48" alt="0xJonHoldsCrypto" title="0xJonHoldsCrypto"/></a> <a href="https://github.com/aaronn"><img src="https://avatars.githubusercontent.com/u/1653630?v=4&s=48" width="48" height="48" alt="aaronn" title="aaronn"/></a> <a href="https://github.com/Alphonse-arianee"><img src="https://avatars.githubusercontent.com/u/254457365?v=4&s=48" width="48" height="48" alt="Alphonse-arianee" title="Alphonse-arianee"/></a> <a href="https://github.com/atalovesyou"><img src="https://avatars.githubusercontent.com/u/3534502?v=4&s=48" width="48" height="48" alt="atalovesyou" title="atalovesyou"/></a> <a href="https://github.com/search?q=Azade"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Azade" title="Azade"/></a> <a href="https://github.com/carlulsoe"><img src="https://avatars.githubusercontent.com/u/34673973?v=4&s=48" width="48" height="48" alt="carlulsoe" title="carlulsoe"/></a> <a href="https://github.com/search?q=ddyo"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="ddyo" title="ddyo"/></a> <a href="https://github.com/search?q=Erik"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Erik" title="Erik"/></a>
531
+ <a href="https://github.com/latitudeki5223"><img src="https://avatars.githubusercontent.com/u/119656367?v=4&s=48" width="48" height="48" alt="latitudeki5223" title="latitudeki5223"/></a> <a href="https://github.com/search?q=Manuel%20Maly"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Manuel Maly" title="Manuel Maly"/></a> <a href="https://github.com/search?q=Mourad%20Boustani"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Mourad Boustani" title="Mourad Boustani"/></a> <a href="https://github.com/odrobnik"><img src="https://avatars.githubusercontent.com/u/333270?v=4&s=48" width="48" height="48" alt="odrobnik" title="odrobnik"/></a> <a href="https://github.com/pcty-nextgen-ios-builder"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="pcty-nextgen-ios-builder" title="pcty-nextgen-ios-builder"/></a> <a href="https://github.com/search?q=Quentin"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Quentin" title="Quentin"/></a> <a href="https://github.com/search?q=Randy%20Torres"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Randy Torres" title="Randy Torres"/></a> <a href="https://github.com/rhjoh"><img src="https://avatars.githubusercontent.com/u/105699450?v=4&s=48" width="48" height="48" alt="rhjoh" title="rhjoh"/></a> <a href="https://github.com/search?q=Rolf%20Fredheim"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Rolf Fredheim" title="Rolf Fredheim"/></a> <a href="https://github.com/ronak-guliani"><img src="https://avatars.githubusercontent.com/u/23518228?v=4&s=48" width="48" height="48" alt="ronak-guliani" title="ronak-guliani"/></a>
532
+ <a href="https://github.com/search?q=William%20Stock"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="William Stock" title="William Stock"/></a>
533
+ </p>
SECURITY.md ADDED
@@ -0,0 +1,72 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Security Policy
2
+
3
+ If you believe you've found a security issue in OpenClaw, 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
+ ## Bug Bounties
11
+
12
+ OpenClaw is a labor of love. There is no bug bounty program and no budget for paid reports. Please still disclose responsibly so we can fix issues quickly.
13
+ The best way to help the project right now is by sending PRs.
14
+
15
+ ## Out of Scope
16
+
17
+ - Public Internet Exposure
18
+ - Using OpenClaw in ways that the docs recommend not to
19
+ - Prompt injection attacks
20
+
21
+ ## Operational Guidance
22
+
23
+ For threat model + hardening guidance (including `openclaw security audit --deep` and `--fix`), see:
24
+
25
+ - `https://docs.openclaw.ai/gateway/security`
26
+
27
+ ### Web Interface Safety
28
+
29
+ OpenClaw's web interface is intended for local use only. Do **not** bind it to the public internet; it is not hardened for public exposure.
30
+
31
+ ## Runtime Requirements
32
+
33
+ ### Node.js Version
34
+
35
+ OpenClaw requires **Node.js 22.12.0 or later** (LTS). This version includes important security patches:
36
+
37
+ - CVE-2025-59466: async_hooks DoS vulnerability
38
+ - CVE-2026-21636: Permission model bypass vulnerability
39
+
40
+ Verify your Node.js version:
41
+
42
+ ```bash
43
+ node --version # Should be v22.12.0 or later
44
+ ```
45
+
46
+ ### Docker Security
47
+
48
+ When running OpenClaw in Docker:
49
+
50
+ 1. The official image runs as a non-root user (`node`) for reduced attack surface
51
+ 2. Use `--read-only` flag when possible for additional filesystem protection
52
+ 3. Limit container capabilities with `--cap-drop=ALL`
53
+
54
+ Example secure Docker run:
55
+
56
+ ```bash
57
+ docker run --read-only --cap-drop=ALL \
58
+ -v openclaw-data:/app/data \
59
+ openclaw/openclaw:latest
60
+ ```
61
+
62
+ ## Security Scanning
63
+
64
+ This project uses `detect-secrets` for automated secret detection in CI/CD.
65
+ See `.detect-secrets.cfg` for configuration and `.secrets.baseline` for the baseline.
66
+
67
+ Run locally:
68
+
69
+ ```bash
70
+ pip install detect-secrets==1.5.0
71
+ detect-secrets scan --baseline .secrets.baseline
72
+ ```
appcast.xml ADDED
@@ -0,0 +1,199 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" standalone="yes"?>
2
+ <rss xmlns:sparkle="http://www.andymatuschak.org/xml-namespaces/sparkle" version="2.0">
3
+ <channel>
4
+ <title>OpenClaw</title>
5
+ <item>
6
+ <title>2026.1.30</title>
7
+ <pubDate>Sat, 31 Jan 2026 14:29:57 +0100</pubDate>
8
+ <link>https://raw.githubusercontent.com/openclaw/openclaw/main/appcast.xml</link>
9
+ <sparkle:version>8469</sparkle:version>
10
+ <sparkle:shortVersionString>2026.1.30</sparkle:shortVersionString>
11
+ <sparkle:minimumSystemVersion>15.0</sparkle:minimumSystemVersion>
12
+ <description><![CDATA[<h2>OpenClaw 2026.1.30</h2>
13
+ <h3>Changes</h3>
14
+ <ul>
15
+ <li>CLI: add <code>completion</code> command (Zsh/Bash/PowerShell/Fish) and auto-setup during postinstall/onboarding.</li>
16
+ <li>CLI: add per-agent <code>models status</code> (<code>--agent</code> filter). (#4780) Thanks @jlowin.</li>
17
+ <li>Agents: add Kimi K2.5 to the synthetic model catalog. (#4407) Thanks @manikv12.</li>
18
+ <li>Auth: switch Kimi Coding to built-in provider; normalize OAuth profile email.</li>
19
+ <li>Auth: add MiniMax OAuth plugin + onboarding option. (#4521) Thanks @Maosghoul.</li>
20
+ <li>Agents: update pi SDK/API usage and dependencies.</li>
21
+ <li>Web UI: refresh sessions after chat commands and improve session display names.</li>
22
+ <li>Build: move TypeScript builds to <code>tsdown</code> + <code>tsgo</code> (faster builds, CI typechecks), update tsconfig target, and clean up lint rules.</li>
23
+ <li>Build: align npm tar override and bin metadata so the <code>openclaw</code> CLI entrypoint is preserved in npm publishes.</li>
24
+ <li>Docs: add pi/pi-dev docs and update OpenClaw branding + install links.</li>
25
+ </ul>
26
+ <h3>Fixes</h3>
27
+ <ul>
28
+ <li>Security: restrict local path extraction in media parser to prevent LFI. (#4880)</li>
29
+ <li>Gateway: prevent token defaults from becoming the literal "undefined". (#4873) Thanks @Hisleren.</li>
30
+ <li>Control UI: fix assets resolution for npm global installs. (#4909) Thanks @YuriNachos.</li>
31
+ <li>macOS: avoid stderr pipe backpressure in gateway discovery. (#3304) Thanks @abhijeet117.</li>
32
+ <li>Telegram: normalize account token lookup for non-normalized IDs. (#5055) Thanks @jasonsschin.</li>
33
+ <li>Telegram: preserve delivery thread fallback and fix threadId handling in delivery context.</li>
34
+ <li>Telegram: fix HTML nesting for overlapping styles/links. (#4578) Thanks @ThanhNguyxn.</li>
35
+ <li>Telegram: accept numeric messageId/chatId in react actions. (#4533) Thanks @Ayush10.</li>
36
+ <li>Telegram: honor per-account proxy dispatcher via undici fetch. (#4456) Thanks @spiceoogway.</li>
37
+ <li>Telegram: scope skill commands to bound agent per bot. (#4360) Thanks @robhparker.</li>
38
+ <li>BlueBubbles: debounce by messageId to preserve attachments in text+image messages. (#4984)</li>
39
+ <li>Routing: prefer requesterOrigin over stale session entries for sub-agent announce delivery. (#4957)</li>
40
+ <li>Extensions: restore embedded extension discovery typings.</li>
41
+ <li>CLI: fix <code>tui:dev</code> port resolution.</li>
42
+ <li>LINE: fix status command TypeError. (#4651)</li>
43
+ <li>OAuth: skip expired-token warnings when refresh tokens are still valid. (#4593)</li>
44
+ <li>Build: skip redundant UI install step in Dockerfile. (#4584) Thanks @obviyus.</li>
45
+ </ul>
46
+ <p><a href="https://github.com/openclaw/openclaw/blob/main/CHANGELOG.md">View full changelog</a></p>
47
+ ]]></description>
48
+ <enclosure url="https://github.com/openclaw/openclaw/releases/download/v2026.1.30/OpenClaw-2026.1.30.zip" length="22458594" type="application/octet-stream" sparkle:edSignature="77/GuEcruKGgu2CJyMq+OVwzaJ2v1VzRQC9NmOirKO3uH5Nn5HaoouwrOHnOanrzlD4OvPW0FS5GH2E4Ntu4CQ=="/>
49
+ </item>
50
+ <item>
51
+ <title>2026.1.29</title>
52
+ <pubDate>Fri, 30 Jan 2026 06:24:15 +0100</pubDate>
53
+ <link>https://raw.githubusercontent.com/openclaw/openclaw/main/appcast.xml</link>
54
+ <sparkle:version>8345</sparkle:version>
55
+ <sparkle:shortVersionString>2026.1.29</sparkle:shortVersionString>
56
+ <sparkle:minimumSystemVersion>15.0</sparkle:minimumSystemVersion>
57
+ <description><![CDATA[<h2>OpenClaw 2026.1.29</h2>
58
+ Status: stable.
59
+ <h3>Changes</h3>
60
+ <ul>
61
+ <li>Rebrand: rename the npm package/CLI to <code>openclaw</code>, add a <code>openclaw</code> compatibility shim, and move extensions to the <code>@openclaw/*</code> scope.</li>
62
+ <li>Onboarding: strengthen security warning copy for beta + access control expectations.</li>
63
+ <li>Onboarding: add Venice API key to non-interactive flow. (#1893) Thanks @jonisjongithub.</li>
64
+ <li>Config: auto-migrate legacy state/config paths and keep config resolution consistent across legacy filenames.</li>
65
+ <li>Gateway: warn on hook tokens via query params; document header auth preference. (#2200) Thanks @YuriNachos.</li>
66
+ <li>Gateway: add dangerous Control UI device auth bypass flag + audit warnings. (#2248)</li>
67
+ <li>Doctor: warn on gateway exposure without auth. (#2016) Thanks @Alex-Alaniz.</li>
68
+ <li>Web UI: keep sub-agent announce replies visible in WebChat. (#1977) Thanks @andrescardonas7.</li>
69
+ <li>Browser: route browser control via gateway/node; remove standalone browser control command and control URL config.</li>
70
+ <li>Browser: route <code>browser.request</code> via node proxies when available; honor proxy timeouts; derive browser ports from <code>gateway.port</code>.</li>
71
+ <li>Browser: fall back to URL matching for extension relay target resolution. (#1999) Thanks @jonit-dev.</li>
72
+ <li>Telegram: allow caption param for media sends. (#1888) Thanks @mguellsegarra.</li>
73
+ <li>Telegram: support plugin sendPayload channelData (media/buttons) and validate plugin commands. (#1917) Thanks @JoshuaLelon.</li>
74
+ <li>Telegram: avoid block replies when streaming is disabled. (#1885) Thanks @ivancasco.</li>
75
+ <li>Telegram: add optional silent send flag (disable notifications). (#2382) Thanks @Suksham-sharma.</li>
76
+ <li>Telegram: support editing sent messages via message(action="edit"). (#2394) Thanks @marcelomar21.</li>
77
+ <li>Telegram: support quote replies for message tool and inbound context. (#2900) Thanks @aduk059.</li>
78
+ <li>Telegram: add sticker receive/send with vision caching. (#2629) Thanks @longjos.</li>
79
+ <li>Telegram: send sticker pixels to vision models. (#2650)</li>
80
+ <li>Telegram: keep topic IDs in restart sentinel notifications. (#1807) Thanks @hsrvc.</li>
81
+ <li>Discord: add configurable privileged gateway intents for presences/members. (#2266) Thanks @kentaro.</li>
82
+ <li>Slack: clear ack reaction after streamed replies. (#2044) Thanks @fancyboi999.</li>
83
+ <li>Matrix: switch plugin SDK to @vector-im/matrix-bot-sdk.</li>
84
+ <li>Tlon: format thread reply IDs as @ud. (#1837) Thanks @wca4a.</li>
85
+ <li>Tools: add per-sender group tool policies and fix precedence. (#1757) Thanks @adam91holt.</li>
86
+ <li>Agents: summarize dropped messages during compaction safeguard pruning. (#2509) Thanks @jogi47.</li>
87
+ <li>Agents: expand cron tool description with full schema docs. (#1988) Thanks @tomascupr.</li>
88
+ <li>Agents: honor tools.exec.safeBins in exec allowlist checks. (#2281)</li>
89
+ <li>Memory Search: allow extra paths for memory indexing (ignores symlinks). (#3600) Thanks @kira-ariaki.</li>
90
+ <li>Skills: add multi-image input support to Nano Banana Pro skill. (#1958) Thanks @tyler6204.</li>
91
+ <li>Skills: add missing dependency metadata for GitHub, Notion, Slack, Discord. (#1995) Thanks @jackheuberger.</li>
92
+ <li>Commands: group /help and /commands output with Telegram paging. (#2504) Thanks @hougangdev.</li>
93
+ <li>Routing: add per-account DM session scope and document multi-account isolation. (#3095) Thanks @jarvis-sam.</li>
94
+ <li>Routing: precompile session key regexes. (#1697) Thanks @Ray0907.</li>
95
+ <li>CLI: use Node's module compile cache for faster startup. (#2808) Thanks @pi0.</li>
96
+ <li>Auth: show copyable Google auth URL after ASCII prompt. (#1787) Thanks @robbyczgw-cla.</li>
97
+ <li>TUI: avoid width overflow when rendering selection lists. (#1686) Thanks @mossein.</li>
98
+ <li>macOS: finish OpenClaw app rename for macOS sources, bundle identifiers, and shared kit paths. (#2844) Thanks @fal3.</li>
99
+ <li>Branding: update launchd labels, mobile bundle IDs, and logging subsystems to bot.molt (legacy bundle ID migrations). Thanks @thewilloftheshadow.</li>
100
+ <li>macOS: limit project-local <code>node_modules/.bin</code> PATH preference to debug builds (reduce PATH hijacking risk).</li>
101
+ <li>macOS: keep custom SSH usernames in remote target. (#2046) Thanks @algal.</li>
102
+ <li>macOS: avoid crash when rendering code blocks by bumping Textual to 0.3.1. (#2033) Thanks @garricn.</li>
103
+ <li>Update: ignore dist/control-ui for dirty checks and restore after ui builds. (#1976) Thanks @Glucksberg.</li>
104
+ <li>Build: bundle A2UI assets during build and stop tracking generated bundles. (#2455) Thanks @0oAstro.</li>
105
+ <li>CI: increase Node heap size for macOS checks. (#1890) Thanks @realZachi.</li>
106
+ <li>Config: apply config.env before ${VAR} substitution. (#1813) Thanks @spanishflu-est1918.</li>
107
+ <li>Gateway: prefer newest session metadata when combining stores. (#1823) Thanks @emanuelst.</li>
108
+ <li>Docs: tighten Fly private deployment steps. (#2289) Thanks @dguido.</li>
109
+ <li>Docs: add migration guide for moving to a new machine. (#2381)</li>
110
+ <li>Docs: add Northflank one-click deployment guide. (#2167) Thanks @AdeboyeDN.</li>
111
+ <li>Docs: add Vercel AI Gateway to providers sidebar. (#1901) Thanks @jerilynzheng.</li>
112
+ <li>Docs: add Render deployment guide. (#1975) Thanks @anurag.</li>
113
+ <li>Docs: add Claude Max API Proxy guide. (#1875) Thanks @atalovesyou.</li>
114
+ <li>Docs: add DigitalOcean deployment guide. (#1870) Thanks @0xJonHoldsCrypto.</li>
115
+ <li>Docs: add Oracle Cloud (OCI) platform guide + cross-links. (#2333) Thanks @hirefrank.</li>
116
+ <li>Docs: add Raspberry Pi install guide. (#1871) Thanks @0xJonHoldsCrypto.</li>
117
+ <li>Docs: add GCP Compute Engine deployment guide. (#1848) Thanks @hougangdev.</li>
118
+ <li>Docs: add LINE channel guide. Thanks @thewilloftheshadow.</li>
119
+ <li>Docs: credit both contributors for Control UI refresh. (#1852) Thanks @EnzeD.</li>
120
+ <li>Docs: keep docs header sticky so navbar stays visible while scrolling. (#2445) Thanks @chenyuan99.</li>
121
+ <li>Docs: update exe.dev install instructions. (#https://github.com/openclaw/openclaw/pull/3047) Thanks @zackerthescar.</li>
122
+ </ul>
123
+ <h3>Breaking</h3>
124
+ <ul>
125
+ <li><strong>BREAKING:</strong> Gateway auth mode "none" is removed; gateway now requires token/password (Tailscale Serve identity still allowed).</li>
126
+ </ul>
127
+ <h3>Fixes</h3>
128
+ <ul>
129
+ <li>Telegram: avoid silent empty replies by tracking normalization skips before fallback. (#3796)</li>
130
+ <li>Mentions: honor mentionPatterns even when explicit mentions are present. (#3303) Thanks @HirokiKobayashi-R.</li>
131
+ <li>Discord: restore username directory lookup in target resolution. (#3131) Thanks @bonald.</li>
132
+ <li>Agents: align MiniMax base URL test expectation with default provider config. (#3131) Thanks @bonald.</li>
133
+ <li>Agents: prevent retries on oversized image errors and surface size limits. (#2871) Thanks @Suksham-sharma.</li>
134
+ <li>Agents: inherit provider baseUrl/api for inline models. (#2740) Thanks @lploc94.</li>
135
+ <li>Memory Search: keep auto provider model defaults and only include remote when configured. (#2576) Thanks @papago2355.</li>
136
+ <li>Telegram: include AccountId in native command context for multi-agent routing. (#2942) Thanks @Chloe-VP.</li>
137
+ <li>Telegram: handle video note attachments in media extraction. (#2905) Thanks @mylukin.</li>
138
+ <li>TTS: read OPENAI_TTS_BASE_URL at runtime instead of module load to honor config.env. (#3341) Thanks @hclsys.</li>
139
+ <li>macOS: auto-scroll to bottom when sending a new message while scrolled up. (#2471) Thanks @kennyklee.</li>
140
+ <li>Web UI: auto-expand the chat compose textarea while typing (with sensible max height). (#2950) Thanks @shivamraut101.</li>
141
+ <li>Gateway: prevent crashes on transient network errors (fetch failures, timeouts, DNS). Added fatal error detection to only exit on truly critical errors. Fixes #2895, #2879, #2873. (#2980) Thanks @elliotsecops.</li>
142
+ <li>Agents: guard channel tool listActions to avoid plugin crashes. (#2859) Thanks @mbelinky.</li>
143
+ <li>Discord: stop resolveDiscordTarget from passing directory params into messaging target parsers. Fixes #3167. Thanks @thewilloftheshadow.</li>
144
+ <li>Discord: avoid resolving bare channel names to user DMs when a username matches. Thanks @thewilloftheshadow.</li>
145
+ <li>Discord: fix directory config type import for target resolution. Thanks @thewilloftheshadow.</li>
146
+ <li>Providers: update MiniMax API endpoint and compatibility mode. (#3064) Thanks @hlbbbbbbb.</li>
147
+ <li>Telegram: treat more network errors as recoverable in polling. (#3013) Thanks @ryancontent.</li>
148
+ <li>Discord: resolve usernames to user IDs for outbound messages. (#2649) Thanks @nonggialiang.</li>
149
+ <li>Providers: update Moonshot Kimi model references to kimi-k2.5. (#2762) Thanks @MarvinCui.</li>
150
+ <li>Gateway: suppress AbortError and transient network errors in unhandled rejections. (#2451) Thanks @Glucksberg.</li>
151
+ <li>TTS: keep /tts status replies on text-only commands and avoid duplicate block-stream audio. (#2451) Thanks @Glucksberg.</li>
152
+ <li>Security: pin npm overrides to keep tar@7.5.4 for install toolchains.</li>
153
+ <li>Security: properly test Windows ACL audit for config includes. (#2403) Thanks @dominicnunez.</li>
154
+ <li>CLI: recognize versioned Node executables when parsing argv. (#2490) Thanks @David-Marsh-Photo.</li>
155
+ <li>CLI: avoid prompting for gateway runtime under the spinner. (#2874)</li>
156
+ <li>BlueBubbles: coalesce inbound URL link preview messages. (#1981) Thanks @tyler6204.</li>
157
+ <li>Cron: allow payloads containing "heartbeat" in event filter. (#2219) Thanks @dwfinkelstein.</li>
158
+ <li>CLI: avoid loading config for global help/version while registering plugin commands. (#2212) Thanks @dial481.</li>
159
+ <li>Agents: include memory.md when bootstrapping memory context. (#2318) Thanks @czekaj.</li>
160
+ <li>Agents: release session locks on process termination and cover more signals. (#2483) Thanks @janeexai.</li>
161
+ <li>Agents: skip cooldowned providers during model failover. (#2143) Thanks @YiWang24.</li>
162
+ <li>Telegram: harden polling + retry behavior for transient network errors and Node 22 transport issues. (#2420) Thanks @techboss.</li>
163
+ <li>Telegram: ignore non-forum group message_thread_id while preserving DM thread sessions. (#2731) Thanks @dylanneve1.</li>
164
+ <li>Telegram: wrap reasoning italics per line to avoid raw underscores. (#2181) Thanks @YuriNachos.</li>
165
+ <li>Telegram: centralize API error logging for delivery and bot calls. (#2492) Thanks @altryne.</li>
166
+ <li>Voice Call: enforce Twilio webhook signature verification for ngrok URLs; disable ngrok free tier bypass by default.</li>
167
+ <li>Security: harden Tailscale Serve auth by validating identity via local tailscaled before trusting headers.</li>
168
+ <li>Media: fix text attachment MIME misclassification with CSV/TSV inference and UTF-16 detection; add XML attribute escaping for file output. (#3628) Thanks @frankekn.</li>
169
+ <li>Build: align memory-core peer dependency with lockfile.</li>
170
+ <li>Security: add mDNS discovery mode with minimal default to reduce information disclosure. (#1882) Thanks @orlyjamie.</li>
171
+ <li>Security: harden URL fetches with DNS pinning to reduce rebinding risk. Thanks Chris Zheng.</li>
172
+ <li>Web UI: improve WebChat image paste previews and allow image-only sends. (#1925) Thanks @smartprogrammer93.</li>
173
+ <li>Security: wrap external hook content by default with a per-hook opt-out. (#1827) Thanks @mertcicekci0.</li>
174
+ <li>Gateway: default auth now fail-closed (token/password required; Tailscale Serve identity remains allowed).</li>
175
+ <li>Gateway: treat loopback + non-local Host connections as remote unless trusted proxy headers are present.</li>
176
+ <li>Onboarding: remove unsupported gateway auth "off" choice from onboarding/configure flows and CLI flags.</li>
177
+ </ul>
178
+ <p><a href="https://github.com/openclaw/openclaw/blob/main/CHANGELOG.md">View full changelog</a></p>
179
+ ]]></description>
180
+ <enclosure url="https://github.com/openclaw/openclaw/releases/download/v2026.1.29/OpenClaw-2026.1.29.zip" length="22458204" type="application/octet-stream" sparkle:edSignature="HqHwZHQyG/CEfBuQnQ/RffJQPKpSbCVrho9C6rgt93S5ek4AH6hUhB3BBKY8sbX1IVFATKK5QZZNE0YPAf7eBw=="/>
181
+ </item>
182
+ <item>
183
+ <title>2026.1.24-1</title>
184
+ <pubDate>Sun, 25 Jan 2026 14:05:25 +0000</pubDate>
185
+ <link>https://raw.githubusercontent.com/openclaw/openclaw/main/appcast.xml</link>
186
+ <sparkle:version>7952</sparkle:version>
187
+ <sparkle:shortVersionString>2026.1.24-1</sparkle:shortVersionString>
188
+ <sparkle:minimumSystemVersion>15.0</sparkle:minimumSystemVersion>
189
+ <description><![CDATA[<h2>OpenClaw 2026.1.24-1</h2>
190
+ <h3>Fixes</h3>
191
+ <ul>
192
+ <li>Packaging: include dist/shared output in npm tarball (fixes missing reasoning-tags import on install).</li>
193
+ </ul>
194
+ <p><a href="https://github.com/openclaw/openclaw/blob/main/CHANGELOG.md">View full changelog</a></p>
195
+ ]]></description>
196
+ <enclosure url="https://github.com/openclaw/openclaw/releases/download/v2026.1.24-1/OpenClaw-2026.1.24-1.zip" length="12396699" type="application/octet-stream" sparkle:edSignature="VaEdWIgEJBrZLIp2UmigoQ6vaq4P/jNFXpHYXvXHD5MsATS0CqBl6ugyyxRq+/GbpUqmdgdlht4dTUVbLRw6BA=="/>
197
+ </item>
198
+ </channel>
199
+ </rss>
docker-compose.yml ADDED
@@ -0,0 +1,45 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ services:
2
+ openclaw-gateway:
3
+ image: ${OPENCLAW_IMAGE:-openclaw:local}
4
+ environment:
5
+ HOME: /home/node
6
+ TERM: xterm-256color
7
+ OPENCLAW_GATEWAY_TOKEN: ${OPENCLAW_GATEWAY_TOKEN}
8
+ CLAUDE_AI_SESSION_KEY: ${CLAUDE_AI_SESSION_KEY}
9
+ CLAUDE_WEB_SESSION_KEY: ${CLAUDE_WEB_SESSION_KEY}
10
+ CLAUDE_WEB_COOKIE: ${CLAUDE_WEB_COOKIE}
11
+ volumes:
12
+ - ${OPENCLAW_CONFIG_DIR}:/home/node/.openclaw
13
+ - ${OPENCLAW_WORKSPACE_DIR}:/home/node/.openclaw/workspace
14
+ ports:
15
+ - "${OPENCLAW_GATEWAY_PORT:-18789}:18789"
16
+ - "${OPENCLAW_BRIDGE_PORT:-18790}:18790"
17
+ init: true
18
+ restart: unless-stopped
19
+ command:
20
+ [
21
+ "node",
22
+ "dist/index.js",
23
+ "gateway",
24
+ "--bind",
25
+ "${OPENCLAW_GATEWAY_BIND:-lan}",
26
+ "--port",
27
+ "18789",
28
+ ]
29
+
30
+ openclaw-cli:
31
+ image: ${OPENCLAW_IMAGE:-openclaw:local}
32
+ environment:
33
+ HOME: /home/node
34
+ TERM: xterm-256color
35
+ BROWSER: echo
36
+ CLAUDE_AI_SESSION_KEY: ${CLAUDE_AI_SESSION_KEY}
37
+ CLAUDE_WEB_SESSION_KEY: ${CLAUDE_WEB_SESSION_KEY}
38
+ CLAUDE_WEB_COOKIE: ${CLAUDE_WEB_COOKIE}
39
+ volumes:
40
+ - ${OPENCLAW_CONFIG_DIR}:/home/node/.openclaw
41
+ - ${OPENCLAW_WORKSPACE_DIR}:/home/node/.openclaw/workspace
42
+ stdin_open: true
43
+ tty: true
44
+ init: true
45
+ entrypoint: ["node", "dist/index.js"]
docker-setup.sh ADDED
@@ -0,0 +1,214 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
5
+ COMPOSE_FILE="$ROOT_DIR/docker-compose.yml"
6
+ EXTRA_COMPOSE_FILE="$ROOT_DIR/docker-compose.extra.yml"
7
+ IMAGE_NAME="${OPENCLAW_IMAGE:-openclaw:local}"
8
+ EXTRA_MOUNTS="${OPENCLAW_EXTRA_MOUNTS:-}"
9
+ HOME_VOLUME_NAME="${OPENCLAW_HOME_VOLUME:-}"
10
+
11
+ require_cmd() {
12
+ if ! command -v "$1" >/dev/null 2>&1; then
13
+ echo "Missing dependency: $1" >&2
14
+ exit 1
15
+ fi
16
+ }
17
+
18
+ require_cmd docker
19
+ if ! docker compose version >/dev/null 2>&1; then
20
+ echo "Docker Compose not available (try: docker compose version)" >&2
21
+ exit 1
22
+ fi
23
+
24
+ OPENCLAW_CONFIG_DIR="${OPENCLAW_CONFIG_DIR:-$HOME/.openclaw}"
25
+ OPENCLAW_WORKSPACE_DIR="${OPENCLAW_WORKSPACE_DIR:-$HOME/.openclaw/workspace}"
26
+
27
+ mkdir -p "$OPENCLAW_CONFIG_DIR"
28
+ mkdir -p "$OPENCLAW_WORKSPACE_DIR"
29
+
30
+ export OPENCLAW_CONFIG_DIR
31
+ export OPENCLAW_WORKSPACE_DIR
32
+ export OPENCLAW_GATEWAY_PORT="${OPENCLAW_GATEWAY_PORT:-18789}"
33
+ export OPENCLAW_BRIDGE_PORT="${OPENCLAW_BRIDGE_PORT:-18790}"
34
+ export OPENCLAW_GATEWAY_BIND="${OPENCLAW_GATEWAY_BIND:-lan}"
35
+ export OPENCLAW_IMAGE="$IMAGE_NAME"
36
+ export OPENCLAW_DOCKER_APT_PACKAGES="${OPENCLAW_DOCKER_APT_PACKAGES:-}"
37
+ export OPENCLAW_EXTRA_MOUNTS="$EXTRA_MOUNTS"
38
+ export OPENCLAW_HOME_VOLUME="$HOME_VOLUME_NAME"
39
+
40
+ if [[ -z "${OPENCLAW_GATEWAY_TOKEN:-}" ]]; then
41
+ if command -v openssl >/dev/null 2>&1; then
42
+ OPENCLAW_GATEWAY_TOKEN="$(openssl rand -hex 32)"
43
+ else
44
+ OPENCLAW_GATEWAY_TOKEN="$(python3 - <<'PY'
45
+ import secrets
46
+ print(secrets.token_hex(32))
47
+ PY
48
+ )"
49
+ fi
50
+ fi
51
+ export OPENCLAW_GATEWAY_TOKEN
52
+
53
+ COMPOSE_FILES=("$COMPOSE_FILE")
54
+ COMPOSE_ARGS=()
55
+
56
+ write_extra_compose() {
57
+ local home_volume="$1"
58
+ shift
59
+ local -a mounts=("$@")
60
+ local mount
61
+
62
+ cat >"$EXTRA_COMPOSE_FILE" <<'YAML'
63
+ services:
64
+ openclaw-gateway:
65
+ volumes:
66
+ YAML
67
+
68
+ if [[ -n "$home_volume" ]]; then
69
+ printf ' - %s:/home/node\n' "$home_volume" >>"$EXTRA_COMPOSE_FILE"
70
+ printf ' - %s:/home/node/.openclaw\n' "$OPENCLAW_CONFIG_DIR" >>"$EXTRA_COMPOSE_FILE"
71
+ printf ' - %s:/home/node/.openclaw/workspace\n' "$OPENCLAW_WORKSPACE_DIR" >>"$EXTRA_COMPOSE_FILE"
72
+ fi
73
+
74
+ for mount in "${mounts[@]}"; do
75
+ printf ' - %s\n' "$mount" >>"$EXTRA_COMPOSE_FILE"
76
+ done
77
+
78
+ cat >>"$EXTRA_COMPOSE_FILE" <<'YAML'
79
+ openclaw-cli:
80
+ volumes:
81
+ YAML
82
+
83
+ if [[ -n "$home_volume" ]]; then
84
+ printf ' - %s:/home/node\n' "$home_volume" >>"$EXTRA_COMPOSE_FILE"
85
+ printf ' - %s:/home/node/.openclaw\n' "$OPENCLAW_CONFIG_DIR" >>"$EXTRA_COMPOSE_FILE"
86
+ printf ' - %s:/home/node/.openclaw/workspace\n' "$OPENCLAW_WORKSPACE_DIR" >>"$EXTRA_COMPOSE_FILE"
87
+ fi
88
+
89
+ for mount in "${mounts[@]}"; do
90
+ printf ' - %s\n' "$mount" >>"$EXTRA_COMPOSE_FILE"
91
+ done
92
+
93
+ if [[ -n "$home_volume" && "$home_volume" != *"/"* ]]; then
94
+ cat >>"$EXTRA_COMPOSE_FILE" <<YAML
95
+ volumes:
96
+ ${home_volume}:
97
+ YAML
98
+ fi
99
+ }
100
+
101
+ VALID_MOUNTS=()
102
+ if [[ -n "$EXTRA_MOUNTS" ]]; then
103
+ IFS=',' read -r -a mounts <<<"$EXTRA_MOUNTS"
104
+ for mount in "${mounts[@]}"; do
105
+ mount="${mount#"${mount%%[![:space:]]*}"}"
106
+ mount="${mount%"${mount##*[![:space:]]}"}"
107
+ if [[ -n "$mount" ]]; then
108
+ VALID_MOUNTS+=("$mount")
109
+ fi
110
+ done
111
+ fi
112
+
113
+ if [[ -n "$HOME_VOLUME_NAME" || ${#VALID_MOUNTS[@]} -gt 0 ]]; then
114
+ write_extra_compose "$HOME_VOLUME_NAME" "${VALID_MOUNTS[@]}"
115
+ COMPOSE_FILES+=("$EXTRA_COMPOSE_FILE")
116
+ fi
117
+ for compose_file in "${COMPOSE_FILES[@]}"; do
118
+ COMPOSE_ARGS+=("-f" "$compose_file")
119
+ done
120
+ COMPOSE_HINT="docker compose"
121
+ for compose_file in "${COMPOSE_FILES[@]}"; do
122
+ COMPOSE_HINT+=" -f ${compose_file}"
123
+ done
124
+
125
+ ENV_FILE="$ROOT_DIR/.env"
126
+ upsert_env() {
127
+ local file="$1"
128
+ shift
129
+ local -a keys=("$@")
130
+ local tmp
131
+ tmp="$(mktemp)"
132
+ declare -A seen=()
133
+
134
+ if [[ -f "$file" ]]; then
135
+ while IFS= read -r line || [[ -n "$line" ]]; do
136
+ local key="${line%%=*}"
137
+ local replaced=false
138
+ for k in "${keys[@]}"; do
139
+ if [[ "$key" == "$k" ]]; then
140
+ printf '%s=%s\n' "$k" "${!k-}" >>"$tmp"
141
+ seen["$k"]=1
142
+ replaced=true
143
+ break
144
+ fi
145
+ done
146
+ if [[ "$replaced" == false ]]; then
147
+ printf '%s\n' "$line" >>"$tmp"
148
+ fi
149
+ done <"$file"
150
+ fi
151
+
152
+ for k in "${keys[@]}"; do
153
+ if [[ -z "${seen[$k]:-}" ]]; then
154
+ printf '%s=%s\n' "$k" "${!k-}" >>"$tmp"
155
+ fi
156
+ done
157
+
158
+ mv "$tmp" "$file"
159
+ }
160
+
161
+ upsert_env "$ENV_FILE" \
162
+ OPENCLAW_CONFIG_DIR \
163
+ OPENCLAW_WORKSPACE_DIR \
164
+ OPENCLAW_GATEWAY_PORT \
165
+ OPENCLAW_BRIDGE_PORT \
166
+ OPENCLAW_GATEWAY_BIND \
167
+ OPENCLAW_GATEWAY_TOKEN \
168
+ OPENCLAW_IMAGE \
169
+ OPENCLAW_EXTRA_MOUNTS \
170
+ OPENCLAW_HOME_VOLUME \
171
+ OPENCLAW_DOCKER_APT_PACKAGES
172
+
173
+ echo "==> Building Docker image: $IMAGE_NAME"
174
+ docker build \
175
+ --build-arg "OPENCLAW_DOCKER_APT_PACKAGES=${OPENCLAW_DOCKER_APT_PACKAGES}" \
176
+ -t "$IMAGE_NAME" \
177
+ -f "$ROOT_DIR/Dockerfile" \
178
+ "$ROOT_DIR"
179
+
180
+ echo ""
181
+ echo "==> Onboarding (interactive)"
182
+ echo "When prompted:"
183
+ echo " - Gateway bind: lan"
184
+ echo " - Gateway auth: token"
185
+ echo " - Gateway token: $OPENCLAW_GATEWAY_TOKEN"
186
+ echo " - Tailscale exposure: Off"
187
+ echo " - Install Gateway daemon: No"
188
+ echo ""
189
+ docker compose "${COMPOSE_ARGS[@]}" run --rm openclaw-cli onboard --no-install-daemon
190
+
191
+ echo ""
192
+ echo "==> Provider setup (optional)"
193
+ echo "WhatsApp (QR):"
194
+ echo " ${COMPOSE_HINT} run --rm openclaw-cli providers login"
195
+ echo "Telegram (bot token):"
196
+ echo " ${COMPOSE_HINT} run --rm openclaw-cli providers add --provider telegram --token <token>"
197
+ echo "Discord (bot token):"
198
+ echo " ${COMPOSE_HINT} run --rm openclaw-cli providers add --provider discord --token <token>"
199
+ echo "Docs: https://docs.openclaw.ai/providers"
200
+
201
+ echo ""
202
+ echo "==> Starting gateway"
203
+ docker compose "${COMPOSE_ARGS[@]}" up -d openclaw-gateway
204
+
205
+ echo ""
206
+ echo "Gateway running with host port mapping."
207
+ echo "Access from tailnet devices via the host's tailnet IP."
208
+ echo "Config: $OPENCLAW_CONFIG_DIR"
209
+ echo "Workspace: $OPENCLAW_WORKSPACE_DIR"
210
+ echo "Token: $OPENCLAW_GATEWAY_TOKEN"
211
+ echo ""
212
+ echo "Commands:"
213
+ echo " ${COMPOSE_HINT} logs -f openclaw-gateway"
214
+ echo " ${COMPOSE_HINT} exec openclaw-gateway node dist/index.js health --token \"$OPENCLAW_GATEWAY_TOKEN\""
docs.acp.md ADDED
@@ -0,0 +1,197 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # OpenClaw ACP Bridge
2
+
3
+ This document describes how the OpenClaw ACP (Agent Client Protocol) bridge works,
4
+ how it maps ACP sessions to Gateway sessions, and how IDEs should invoke it.
5
+
6
+ ## Overview
7
+
8
+ `openclaw acp` exposes an ACP agent over stdio and forwards prompts to a running
9
+ OpenClaw Gateway over WebSocket. It keeps ACP session ids mapped to Gateway
10
+ session keys so IDEs can reconnect to the same agent transcript or reset it on
11
+ request.
12
+
13
+ Key goals:
14
+
15
+ - Minimal ACP surface area (stdio, NDJSON).
16
+ - Stable session mapping across reconnects.
17
+ - Works with existing Gateway session store (list/resolve/reset).
18
+ - Safe defaults (isolated ACP session keys by default).
19
+
20
+ ## How can I use this
21
+
22
+ Use ACP when an IDE or tooling speaks Agent Client Protocol and you want it to
23
+ drive a OpenClaw Gateway session.
24
+
25
+ Quick steps:
26
+
27
+ 1. Run a Gateway (local or remote).
28
+ 2. Configure the Gateway target (`gateway.remote.url` + auth) or pass flags.
29
+ 3. Point the IDE to run `openclaw acp` over stdio.
30
+
31
+ Example config:
32
+
33
+ ```bash
34
+ openclaw config set gateway.remote.url wss://gateway-host:18789
35
+ openclaw config set gateway.remote.token <token>
36
+ ```
37
+
38
+ Example run:
39
+
40
+ ```bash
41
+ openclaw acp --url wss://gateway-host:18789 --token <token>
42
+ ```
43
+
44
+ ## Selecting agents
45
+
46
+ ACP does not pick agents directly. It routes by the Gateway session key.
47
+
48
+ Use agent-scoped session keys to target a specific agent:
49
+
50
+ ```bash
51
+ openclaw acp --session agent:main:main
52
+ openclaw acp --session agent:design:main
53
+ openclaw acp --session agent:qa:bug-123
54
+ ```
55
+
56
+ Each ACP session maps to a single Gateway session key. One agent can have many
57
+ sessions; ACP defaults to an isolated `acp:<uuid>` session unless you override
58
+ the key or label.
59
+
60
+ ## Zed editor setup
61
+
62
+ Add a custom ACP agent in `~/.config/zed/settings.json`:
63
+
64
+ ```json
65
+ {
66
+ "agent_servers": {
67
+ "OpenClaw ACP": {
68
+ "type": "custom",
69
+ "command": "openclaw",
70
+ "args": ["acp"],
71
+ "env": {}
72
+ }
73
+ }
74
+ }
75
+ ```
76
+
77
+ To target a specific Gateway or agent:
78
+
79
+ ```json
80
+ {
81
+ "agent_servers": {
82
+ "OpenClaw ACP": {
83
+ "type": "custom",
84
+ "command": "openclaw",
85
+ "args": [
86
+ "acp",
87
+ "--url",
88
+ "wss://gateway-host:18789",
89
+ "--token",
90
+ "<token>",
91
+ "--session",
92
+ "agent:design:main"
93
+ ],
94
+ "env": {}
95
+ }
96
+ }
97
+ }
98
+ ```
99
+
100
+ In Zed, open the Agent panel and select “OpenClaw ACP” to start a thread.
101
+
102
+ ## Execution Model
103
+
104
+ - ACP client spawns `openclaw acp` and speaks ACP messages over stdio.
105
+ - The bridge connects to the Gateway using existing auth config (or CLI flags).
106
+ - ACP `prompt` translates to Gateway `chat.send`.
107
+ - Gateway streaming events are translated back into ACP streaming events.
108
+ - ACP `cancel` maps to Gateway `chat.abort` for the active run.
109
+
110
+ ## Session Mapping
111
+
112
+ By default each ACP session is mapped to a dedicated Gateway session key:
113
+
114
+ - `acp:<uuid>` unless overridden.
115
+
116
+ You can override or reuse sessions in two ways:
117
+
118
+ 1. CLI defaults
119
+
120
+ ```bash
121
+ openclaw acp --session agent:main:main
122
+ openclaw acp --session-label "support inbox"
123
+ openclaw acp --reset-session
124
+ ```
125
+
126
+ 2. ACP metadata per session
127
+
128
+ ```json
129
+ {
130
+ "_meta": {
131
+ "sessionKey": "agent:main:main",
132
+ "sessionLabel": "support inbox",
133
+ "resetSession": true,
134
+ "requireExisting": false
135
+ }
136
+ }
137
+ ```
138
+
139
+ Rules:
140
+
141
+ - `sessionKey`: direct Gateway session key.
142
+ - `sessionLabel`: resolve an existing session by label.
143
+ - `resetSession`: mint a new transcript for the key before first use.
144
+ - `requireExisting`: fail if the key/label does not exist.
145
+
146
+ ### Session Listing
147
+
148
+ ACP `listSessions` maps to Gateway `sessions.list` and returns a filtered
149
+ summary suitable for IDE session pickers. `_meta.limit` can cap the number of
150
+ sessions returned.
151
+
152
+ ## Prompt Translation
153
+
154
+ ACP prompt inputs are converted into a Gateway `chat.send`:
155
+
156
+ - `text` and `resource` blocks become prompt text.
157
+ - `resource_link` with image mime types become attachments.
158
+ - The working directory can be prefixed into the prompt (default on, can be
159
+ disabled with `--no-prefix-cwd`).
160
+
161
+ Gateway streaming events are translated into ACP `message` and `tool_call`
162
+ updates. Terminal Gateway states map to ACP `done` with stop reasons:
163
+
164
+ - `complete` -> `stop`
165
+ - `aborted` -> `cancel`
166
+ - `error` -> `error`
167
+
168
+ ## Auth + Gateway Discovery
169
+
170
+ `openclaw acp` resolves the Gateway URL and auth from CLI flags or config:
171
+
172
+ - `--url` / `--token` / `--password` take precedence.
173
+ - Otherwise use configured `gateway.remote.*` settings.
174
+
175
+ ## Operational Notes
176
+
177
+ - ACP sessions are stored in memory for the bridge process lifetime.
178
+ - Gateway session state is persisted by the Gateway itself.
179
+ - `--verbose` logs ACP/Gateway bridge events to stderr (never stdout).
180
+ - ACP runs can be canceled and the active run id is tracked per session.
181
+
182
+ ## Compatibility
183
+
184
+ - ACP bridge uses `@agentclientprotocol/sdk` (currently 0.13.x).
185
+ - Works with ACP clients that implement `initialize`, `newSession`,
186
+ `loadSession`, `prompt`, `cancel`, and `listSessions`.
187
+
188
+ ## Testing
189
+
190
+ - Unit: `src/acp/session.test.ts` covers run id lifecycle.
191
+ - Full gate: `pnpm build && pnpm check && pnpm test && pnpm docs:build`.
192
+
193
+ ## Related Docs
194
+
195
+ - CLI usage: `docs/cli/acp.md`
196
+ - Session model: `docs/concepts/session.md`
197
+ - Session management internals: `docs/reference/session-management-compaction.md`
fly.private.toml ADDED
@@ -0,0 +1,39 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # OpenClaw Fly.io PRIVATE deployment configuration
2
+ # Use this template for hardened deployments with no public IP exposure.
3
+ #
4
+ # This config is suitable when:
5
+ # - You only make outbound calls (no inbound webhooks needed)
6
+ # - You use ngrok/Tailscale tunnels for any webhook callbacks
7
+ # - You access the gateway via `fly proxy` or WireGuard, not public URL
8
+ # - You want the deployment hidden from internet scanners (Shodan, etc.)
9
+ #
10
+ # See https://fly.io/docs/reference/configuration/
11
+
12
+ app = "my-openclaw" # change to your app name
13
+ primary_region = "iad" # change to your closest region
14
+
15
+ [build]
16
+ dockerfile = "Dockerfile"
17
+
18
+ [env]
19
+ NODE_ENV = "production"
20
+ OPENCLAW_PREFER_PNPM = "1"
21
+ OPENCLAW_STATE_DIR = "/data"
22
+ NODE_OPTIONS = "--max-old-space-size=1536"
23
+
24
+ [processes]
25
+ app = "node dist/index.js gateway --allow-unconfigured --port 3000 --bind lan"
26
+
27
+ # NOTE: No [http_service] block = no public ingress allocated.
28
+ # The gateway will only be accessible via:
29
+ # - fly proxy 3000:3000 -a <app-name>
30
+ # - fly wireguard (then access via internal IPv6)
31
+ # - fly ssh console
32
+
33
+ [[vm]]
34
+ size = "shared-cpu-2x"
35
+ memory = "2048mb"
36
+
37
+ [mounts]
38
+ source = "openclaw_data"
39
+ destination = "/data"
fly.toml ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # OpenClaw Fly.io deployment configuration
2
+ # See https://fly.io/docs/reference/configuration/
3
+
4
+ app = "openclaw"
5
+ primary_region = "iad" # change to your closest region
6
+
7
+ [build]
8
+ dockerfile = "Dockerfile"
9
+
10
+ [env]
11
+ NODE_ENV = "production"
12
+ # Fly uses x86, but keep this for consistency
13
+ OPENCLAW_PREFER_PNPM = "1"
14
+ OPENCLAW_STATE_DIR = "/data"
15
+ NODE_OPTIONS = "--max-old-space-size=1536"
16
+
17
+ [processes]
18
+ app = "node dist/index.js gateway --allow-unconfigured --port 3000 --bind lan"
19
+
20
+ [http_service]
21
+ internal_port = 3000
22
+ force_https = true
23
+ auto_stop_machines = false # Keep running for persistent connections
24
+ auto_start_machines = true
25
+ min_machines_running = 1
26
+ processes = ["app"]
27
+
28
+ [[vm]]
29
+ size = "shared-cpu-2x"
30
+ memory = "2048mb"
31
+
32
+ [mounts]
33
+ source = "openclaw_data"
34
+ destination = "/data"
openclaw.mjs ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env node
2
+
3
+ import module from "node:module";
4
+
5
+ // https://nodejs.org/api/module.html#module-compile-cache
6
+ if (module.enableCompileCache && !process.env.NODE_DISABLE_COMPILE_CACHE) {
7
+ try {
8
+ module.enableCompileCache();
9
+ } catch {
10
+ // Ignore errors
11
+ }
12
+ }
13
+
14
+ await import("./dist/entry.js");
package.json ADDED
@@ -0,0 +1,295 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "openclaw",
3
+ "version": "2026.1.30",
4
+ "description": "WhatsApp gateway CLI (Baileys web) with Pi RPC agent",
5
+ "keywords": [],
6
+ "license": "MIT",
7
+ "author": "",
8
+ "bin": {
9
+ "openclaw": "openclaw.mjs"
10
+ },
11
+ "files": [
12
+ "CHANGELOG.md",
13
+ "LICENSE",
14
+ "openclaw.mjs",
15
+ "README-header.png",
16
+ "README.md",
17
+ "assets/**",
18
+ "dist/*.js",
19
+ "dist/*.json",
20
+ "docs/**",
21
+ "extensions/**",
22
+ "git-hooks/**",
23
+ "patches/**",
24
+ "scripts/format-staged.js",
25
+ "scripts/postinstall.js",
26
+ "scripts/setup-git-hooks.js",
27
+ "skills/**",
28
+ "dist/acp/**",
29
+ "dist/agents/**",
30
+ "dist/auto-reply/**",
31
+ "dist/browser/**",
32
+ "dist/canvas-host/**",
33
+ "dist/channels/**",
34
+ "dist/cli/**",
35
+ "dist/commands/**",
36
+ "dist/compat/**",
37
+ "dist/config/**",
38
+ "dist/control-ui/**",
39
+ "dist/cron/**",
40
+ "dist/daemon/**",
41
+ "dist/discord/**",
42
+ "dist/gateway/**",
43
+ "dist/hooks/**",
44
+ "dist/imessage/**",
45
+ "dist/infra/**",
46
+ "dist/line/**",
47
+ "dist/link-understanding/**",
48
+ "dist/logging/**",
49
+ "dist/macos/**",
50
+ "dist/markdown/**",
51
+ "dist/media-understanding/**",
52
+ "dist/media/**",
53
+ "dist/memory/**",
54
+ "dist/node-host/**",
55
+ "dist/pairing/**",
56
+ "dist/plugin-sdk/**",
57
+ "dist/plugins/**",
58
+ "dist/process/**",
59
+ "dist/providers/**",
60
+ "dist/routing/**",
61
+ "dist/security/**",
62
+ "dist/sessions/**",
63
+ "dist/shared/**",
64
+ "dist/signal/**",
65
+ "dist/slack/**",
66
+ "dist/telegram/**",
67
+ "dist/terminal/**",
68
+ "dist/tts/**",
69
+ "dist/tui/**",
70
+ "dist/utils/**",
71
+ "dist/web/**",
72
+ "dist/whatsapp/**",
73
+ "dist/wizard/**"
74
+ ],
75
+ "type": "module",
76
+ "main": "dist/index.js",
77
+ "exports": {
78
+ ".": "./dist/index.js",
79
+ "./plugin-sdk": "./dist/plugin-sdk/index.js",
80
+ "./plugin-sdk/*": "./dist/plugin-sdk/*",
81
+ "./cli-entry": "./openclaw.mjs"
82
+ },
83
+ "scripts": {
84
+ "android:assemble": "cd apps/android && ./gradlew :app:assembleDebug",
85
+ "android:install": "cd apps/android && ./gradlew :app:installDebug",
86
+ "android:run": "cd apps/android && ./gradlew :app:installDebug && adb shell am start -n ai.openclaw.android/.MainActivity",
87
+ "android:test": "cd apps/android && ./gradlew :app:testDebugUnitTest",
88
+ "build": "pnpm canvas:a2ui:bundle && tsc -p tsconfig.json --noEmit false && node --import tsx scripts/canvas-a2ui-copy.ts && node --import tsx scripts/copy-hook-metadata.ts && node --import tsx scripts/write-build-info.ts",
89
+ "canvas:a2ui:bundle": "bash scripts/bundle-a2ui.sh",
90
+ "check": "pnpm tsgo && pnpm lint && pnpm format",
91
+ "check:loc": "node --import tsx scripts/check-ts-max-loc.ts --max 500",
92
+ "dev": "node scripts/run-node.mjs",
93
+ "docs:bin": "node scripts/build-docs-list.mjs",
94
+ "docs:build": "cd docs && pnpm dlx --reporter append-only mint broken-links",
95
+ "docs:dev": "cd docs && mint dev",
96
+ "docs:list": "node scripts/docs-list.js",
97
+ "format": "oxfmt --check",
98
+ "format:all": "pnpm format && pnpm format:swift",
99
+ "format:fix": "oxfmt --write",
100
+ "format:swift": "swiftformat --lint --config .swiftformat apps/macos/Sources apps/ios/Sources apps/shared/OpenClawKit/Sources",
101
+ "gateway:dev": "OPENCLAW_SKIP_CHANNELS=1 CLAWDBOT_SKIP_CHANNELS=1 node scripts/run-node.mjs --dev gateway",
102
+ "gateway:dev:reset": "OPENCLAW_SKIP_CHANNELS=1 CLAWDBOT_SKIP_CHANNELS=1 node scripts/run-node.mjs --dev gateway --reset",
103
+ "gateway:watch": "node scripts/watch-node.mjs gateway --force",
104
+ "ios:build": "bash -lc 'cd apps/ios && xcodegen generate && xcodebuild -project OpenClaw.xcodeproj -scheme OpenClaw -destination \"${IOS_DEST:-platform=iOS Simulator,name=iPhone 17}\" -configuration Debug build'",
105
+ "ios:gen": "cd apps/ios && xcodegen generate",
106
+ "ios:open": "cd apps/ios && xcodegen generate && open OpenClaw.xcodeproj",
107
+ "ios:run": "bash -lc 'cd apps/ios && xcodegen generate && xcodebuild -project OpenClaw.xcodeproj -scheme OpenClaw -destination \"${IOS_DEST:-platform=iOS Simulator,name=iPhone 17}\" -configuration Debug build && xcrun simctl boot \"${IOS_SIM:-iPhone 17}\" || true && xcrun simctl launch booted ai.openclaw.ios'",
108
+ "lint": "oxlint --type-aware",
109
+ "lint:all": "pnpm lint && pnpm lint:swift",
110
+ "lint:fix": "oxlint --type-aware --fix && pnpm format:fix",
111
+ "lint:swift": "swiftlint lint --config .swiftlint.yml && (cd apps/ios && swiftlint lint --config .swiftlint.yml)",
112
+ "mac:open": "open dist/OpenClaw.app",
113
+ "mac:package": "bash scripts/package-mac-app.sh",
114
+ "mac:restart": "bash scripts/restart-mac.sh",
115
+ "moltbot:rpc": "node scripts/run-node.mjs agent --mode rpc --json",
116
+ "openclaw": "node scripts/run-node.mjs",
117
+ "openclaw:rpc": "node scripts/run-node.mjs agent --mode rpc --json",
118
+ "plugins:sync": "node --import tsx scripts/sync-plugin-versions.ts",
119
+ "postinstall": "node scripts/postinstall.js",
120
+ "prepack": "pnpm build && pnpm ui:build",
121
+ "protocol:check": "pnpm protocol:gen && pnpm protocol:gen:swift && git diff --exit-code -- dist/protocol.schema.json apps/macos/Sources/OpenClawProtocol/GatewayModels.swift",
122
+ "protocol:gen": "node --import tsx scripts/protocol-gen.ts",
123
+ "protocol:gen:swift": "node --import tsx scripts/protocol-gen-swift.ts",
124
+ "release:check": "node --import tsx scripts/release-check.ts",
125
+ "start": "node scripts/run-node.mjs",
126
+ "test": "node scripts/test-parallel.mjs",
127
+ "test:all": "pnpm lint && pnpm build && pnpm test && pnpm test:e2e && pnpm test:live && pnpm test:docker:all",
128
+ "test:coverage": "vitest run --coverage",
129
+ "test:docker:all": "pnpm test:docker:live-models && pnpm test:docker:live-gateway && pnpm test:docker:onboard && pnpm test:docker:gateway-network && pnpm test:docker:qr && pnpm test:docker:doctor-switch && pnpm test:docker:plugins && pnpm test:docker:cleanup",
130
+ "test:docker:cleanup": "bash scripts/test-cleanup-docker.sh",
131
+ "test:docker:doctor-switch": "bash scripts/e2e/doctor-install-switch-docker.sh",
132
+ "test:docker:gateway-network": "bash scripts/e2e/gateway-network-docker.sh",
133
+ "test:docker:live-gateway": "bash scripts/test-live-gateway-models-docker.sh",
134
+ "test:docker:live-models": "bash scripts/test-live-models-docker.sh",
135
+ "test:docker:onboard": "bash scripts/e2e/onboard-docker.sh",
136
+ "test:docker:plugins": "bash scripts/e2e/plugins-docker.sh",
137
+ "test:docker:qr": "bash scripts/e2e/qr-import-docker.sh",
138
+ "test:e2e": "vitest run --config vitest.e2e.config.ts",
139
+ "test:force": "node --import tsx scripts/test-force.ts",
140
+ "test:install:e2e": "bash scripts/test-install-sh-e2e-docker.sh",
141
+ "test:install:e2e:anthropic": "OPENCLAW_E2E_MODELS=anthropic CLAWDBOT_E2E_MODELS=anthropic bash scripts/test-install-sh-e2e-docker.sh",
142
+ "test:install:e2e:openai": "OPENCLAW_E2E_MODELS=openai CLAWDBOT_E2E_MODELS=openai bash scripts/test-install-sh-e2e-docker.sh",
143
+ "test:install:smoke": "bash scripts/test-install-sh-docker.sh",
144
+ "test:live": "OPENCLAW_LIVE_TEST=1 CLAWDBOT_LIVE_TEST=1 vitest run --config vitest.live.config.ts",
145
+ "test:ui": "pnpm --dir ui test",
146
+ "test:watch": "vitest",
147
+ "tui": "node scripts/run-node.mjs tui",
148
+ "tui:dev": "OPENCLAW_PROFILE=dev CLAWDBOT_PROFILE=dev node scripts/run-node.mjs --dev tui",
149
+ "ui:build": "node scripts/ui.js build",
150
+ "ui:dev": "node scripts/ui.js dev",
151
+ "ui:install": "node scripts/ui.js install"
152
+ },
153
+ "dependencies": {
154
+ "@agentclientprotocol/sdk": "0.13.1",
155
+ "@aws-sdk/client-bedrock": "^3.980.0",
156
+ "@buape/carbon": "0.14.0",
157
+ "@clack/prompts": "^1.0.0",
158
+ "@grammyjs/runner": "^2.0.3",
159
+ "@grammyjs/transformer-throttler": "^1.2.1",
160
+ "@homebridge/ciao": "^1.3.4",
161
+ "@line/bot-sdk": "^10.6.0",
162
+ "@lydell/node-pty": "1.2.0-beta.3",
163
+ "@mariozechner/pi-agent-core": "0.51.0",
164
+ "@mariozechner/pi-ai": "0.51.0",
165
+ "@mariozechner/pi-coding-agent": "0.51.0",
166
+ "@mariozechner/pi-tui": "0.51.0",
167
+ "@mozilla/readability": "^0.6.0",
168
+ "@sinclair/typebox": "0.34.48",
169
+ "@slack/bolt": "^4.6.0",
170
+ "@slack/web-api": "^7.13.0",
171
+ "@whiskeysockets/baileys": "7.0.0-rc.9",
172
+ "ajv": "^8.17.1",
173
+ "chalk": "^5.6.2",
174
+ "chokidar": "^5.0.0",
175
+ "cli-highlight": "^2.1.11",
176
+ "commander": "^14.0.3",
177
+ "croner": "^10.0.1",
178
+ "discord-api-types": "^0.38.38",
179
+ "dotenv": "^17.2.3",
180
+ "express": "^5.2.1",
181
+ "file-type": "^21.3.0",
182
+ "grammy": "^1.39.3",
183
+ "hono": "4.11.7",
184
+ "jiti": "^2.6.1",
185
+ "json5": "^2.2.3",
186
+ "jszip": "^3.10.1",
187
+ "linkedom": "^0.18.12",
188
+ "long": "^5.3.2",
189
+ "markdown-it": "^14.1.0",
190
+ "node-edge-tts": "^1.2.9",
191
+ "osc-progress": "^0.3.0",
192
+ "pdfjs-dist": "^5.4.624",
193
+ "playwright-core": "1.58.1",
194
+ "proper-lockfile": "^4.1.2",
195
+ "qrcode-terminal": "^0.12.0",
196
+ "sharp": "^0.34.5",
197
+ "signal-utils": "^0.21.1",
198
+ "sqlite-vec": "0.1.7-alpha.2",
199
+ "tar": "7.5.7",
200
+ "tslog": "^4.10.2",
201
+ "undici": "^7.20.0",
202
+ "ws": "^8.19.0",
203
+ "yaml": "^2.8.2",
204
+ "zod": "^4.3.6"
205
+ },
206
+ "devDependencies": {
207
+ "@grammyjs/types": "^3.23.0",
208
+ "@lit-labs/signals": "^0.2.0",
209
+ "@lit/context": "^1.1.6",
210
+ "@types/express": "^5.0.6",
211
+ "@types/markdown-it": "^14.1.2",
212
+ "@types/node": "^25.2.0",
213
+ "@types/proper-lockfile": "^4.1.4",
214
+ "@types/qrcode-terminal": "^0.12.2",
215
+ "@types/ws": "^8.18.1",
216
+ "@typescript/native-preview": "7.0.0-dev.20260201.1",
217
+ "@vitest/coverage-v8": "^4.0.18",
218
+ "lit": "^3.3.2",
219
+ "ollama": "^0.6.3",
220
+ "oxfmt": "0.27.0",
221
+ "oxlint": "^1.42.0",
222
+ "oxlint-tsgolint": "^0.11.4",
223
+ "rolldown": "1.0.0-rc.2",
224
+ "tsx": "^4.21.0",
225
+ "typescript": "^5.9.3",
226
+ "vitest": "^4.0.18"
227
+ },
228
+ "peerDependencies": {
229
+ "@napi-rs/canvas": "^0.1.89",
230
+ "node-llama-cpp": "3.15.1"
231
+ },
232
+ "overrides": {
233
+ "tar": "7.5.7"
234
+ },
235
+ "engines": {
236
+ "node": ">=22.12.0"
237
+ },
238
+ "packageManager": "pnpm@10.23.0",
239
+ "pnpm": {
240
+ "minimumReleaseAge": 2880,
241
+ "overrides": {
242
+ "fast-xml-parser": "5.3.4",
243
+ "form-data": "2.5.4",
244
+ "@hono/node-server>hono": "4.11.7",
245
+ "hono": "4.11.7",
246
+ "qs": "6.14.1",
247
+ "@sinclair/typebox": "0.34.47",
248
+ "tar": "7.5.7",
249
+ "tough-cookie": "4.1.3"
250
+ },
251
+ "onlyBuiltDependencies": [
252
+ "@lydell/node-pty",
253
+ "@matrix-org/matrix-sdk-crypto-nodejs",
254
+ "@napi-rs/canvas",
255
+ "@whiskeysockets/baileys",
256
+ "authenticate-pam",
257
+ "esbuild",
258
+ "node-llama-cpp",
259
+ "protobufjs",
260
+ "sharp"
261
+ ]
262
+ },
263
+ "vitest": {
264
+ "coverage": {
265
+ "provider": "v8",
266
+ "reporter": [
267
+ "text",
268
+ "lcov"
269
+ ],
270
+ "thresholds": {
271
+ "lines": 70,
272
+ "functions": 70,
273
+ "branches": 70,
274
+ "statements": 70
275
+ },
276
+ "include": [
277
+ "src/**/*.ts"
278
+ ],
279
+ "exclude": [
280
+ "src/**/*.test.ts"
281
+ ]
282
+ },
283
+ "include": [
284
+ "src/**/*.test.ts"
285
+ ],
286
+ "exclude": [
287
+ "dist/**",
288
+ "apps/macos/**",
289
+ "apps/macos/.build/**",
290
+ "**/vendor/**",
291
+ "apps/macos/.build/**",
292
+ "dist/OpenClaw.app/**"
293
+ ]
294
+ }
295
+ }
pnpm-lock.yaml ADDED
The diff for this file is too large to render. See raw diff
 
pnpm-workspace.yaml ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ packages:
2
+ - .
3
+ - ui
4
+ - packages/*
5
+ - extensions/*
6
+
7
+ onlyBuiltDependencies:
8
+ - "@whiskeysockets/baileys"
9
+ - "@lydell/node-pty"
10
+ - "@matrix-org/matrix-sdk-crypto-nodejs"
11
+ - authenticate-pam
12
+ - esbuild
13
+ - protobufjs
14
+ - sharp
15
+ - "@napi-rs/canvas"
render.yaml ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ services:
2
+ - type: web
3
+ name: openclaw
4
+ runtime: docker
5
+ plan: starter
6
+ healthCheckPath: /health
7
+ envVars:
8
+ - key: PORT
9
+ value: "8080"
10
+ - key: SETUP_PASSWORD
11
+ sync: false
12
+ - key: OPENCLAW_STATE_DIR
13
+ value: /data/.openclaw
14
+ - key: OPENCLAW_WORKSPACE_DIR
15
+ value: /data/workspace
16
+ - key: OPENCLAW_GATEWAY_TOKEN
17
+ generateValue: true
18
+ disk:
19
+ name: openclaw-data
20
+ mountPath: /data
21
+ sizeGB: 1
tsconfig.json ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "compilerOptions": {
3
+ "allowSyntheticDefaultImports": true,
4
+ "esModuleInterop": true,
5
+ "forceConsistentCasingInFileNames": true,
6
+ "module": "NodeNext",
7
+ "moduleResolution": "NodeNext",
8
+ "lib": ["DOM", "DOM.Iterable", "ES2023", "ScriptHost"],
9
+ "noEmit": true,
10
+ "declaration": true,
11
+ "noEmitOnError": true,
12
+ "outDir": "dist",
13
+ "resolveJsonModule": true,
14
+ "rootDir": "src",
15
+ "skipLibCheck": true,
16
+ "strict": true,
17
+ "target": "es2023"
18
+ },
19
+ "include": ["src/**/*"],
20
+ "exclude": [
21
+ "node_modules",
22
+ "dist",
23
+ "src/**/*.test.ts",
24
+ "src/**/*.test.tsx",
25
+ "src/**/test-helpers.ts"
26
+ ]
27
+ }
vitest.config.ts ADDED
@@ -0,0 +1,104 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os from "node:os";
2
+ import path from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ import { defineConfig } from "vitest/config";
5
+
6
+ const repoRoot = path.dirname(fileURLToPath(import.meta.url));
7
+ const isCI = process.env.CI === "true" || process.env.GITHUB_ACTIONS === "true";
8
+ const isWindows = process.platform === "win32";
9
+ const localWorkers = Math.max(4, Math.min(16, os.cpus().length));
10
+ const ciWorkers = isWindows ? 2 : 3;
11
+
12
+ export default defineConfig({
13
+ resolve: {
14
+ alias: {
15
+ "openclaw/plugin-sdk": path.join(repoRoot, "src", "plugin-sdk", "index.ts"),
16
+ },
17
+ },
18
+ test: {
19
+ testTimeout: 120_000,
20
+ hookTimeout: isWindows ? 180_000 : 120_000,
21
+ pool: "forks",
22
+ maxWorkers: isCI ? ciWorkers : localWorkers,
23
+ include: ["src/**/*.test.ts", "extensions/**/*.test.ts", "test/format-error.test.ts"],
24
+ setupFiles: ["test/setup.ts"],
25
+ exclude: [
26
+ "dist/**",
27
+ "apps/macos/**",
28
+ "apps/macos/.build/**",
29
+ "**/node_modules/**",
30
+ "**/vendor/**",
31
+ "dist/OpenClaw.app/**",
32
+ "**/*.live.test.ts",
33
+ "**/*.e2e.test.ts",
34
+ ],
35
+ coverage: {
36
+ provider: "v8",
37
+ reporter: ["text", "lcov"],
38
+ thresholds: {
39
+ lines: 70,
40
+ functions: 70,
41
+ branches: 55,
42
+ statements: 70,
43
+ },
44
+ include: ["src/**/*.ts"],
45
+ exclude: [
46
+ "src/**/*.test.ts",
47
+ // Entrypoints and wiring (covered by CI smoke + manual/e2e flows).
48
+ "src/entry.ts",
49
+ "src/index.ts",
50
+ "src/runtime.ts",
51
+ "src/cli/**",
52
+ "src/commands/**",
53
+ "src/daemon/**",
54
+ "src/hooks/**",
55
+ "src/macos/**",
56
+
57
+ // Some agent integrations are intentionally validated via manual/e2e runs.
58
+ "src/agents/model-scan.ts",
59
+ "src/agents/pi-embedded-runner.ts",
60
+ "src/agents/sandbox-paths.ts",
61
+ "src/agents/sandbox.ts",
62
+ "src/agents/skills-install.ts",
63
+ "src/agents/pi-tool-definition-adapter.ts",
64
+ "src/agents/tools/discord-actions*.ts",
65
+ "src/agents/tools/slack-actions.ts",
66
+
67
+ // Gateway server integration surfaces are intentionally validated via manual/e2e runs.
68
+ "src/gateway/control-ui.ts",
69
+ "src/gateway/server-bridge.ts",
70
+ "src/gateway/server-channels.ts",
71
+ "src/gateway/server-methods/config.ts",
72
+ "src/gateway/server-methods/send.ts",
73
+ "src/gateway/server-methods/skills.ts",
74
+ "src/gateway/server-methods/talk.ts",
75
+ "src/gateway/server-methods/web.ts",
76
+ "src/gateway/server-methods/wizard.ts",
77
+
78
+ // Process bridges are hard to unit-test in isolation.
79
+ "src/gateway/call.ts",
80
+ "src/process/tau-rpc.ts",
81
+ "src/process/exec.ts",
82
+ // Interactive UIs/flows are intentionally validated via manual/e2e runs.
83
+ "src/tui/**",
84
+ "src/wizard/**",
85
+ // Channel surfaces are largely integration-tested (or manually validated).
86
+ "src/discord/**",
87
+ "src/imessage/**",
88
+ "src/signal/**",
89
+ "src/slack/**",
90
+ "src/browser/**",
91
+ "src/channels/web/**",
92
+ "src/telegram/index.ts",
93
+ "src/telegram/proxy.ts",
94
+ "src/telegram/webhook-set.ts",
95
+ "src/telegram/**",
96
+ "src/webchat/**",
97
+ "src/gateway/server.ts",
98
+ "src/gateway/client.ts",
99
+ "src/gateway/protocol/**",
100
+ "src/infra/tailscale.ts",
101
+ ],
102
+ },
103
+ },
104
+ });
vitest.e2e.config.ts ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os from "node:os";
2
+ import { defineConfig } from "vitest/config";
3
+
4
+ const isCI = process.env.CI === "true" || process.env.GITHUB_ACTIONS === "true";
5
+ const cpuCount = os.cpus().length;
6
+ const e2eWorkers = isCI ? 2 : Math.min(4, Math.max(1, Math.floor(cpuCount * 0.25)));
7
+
8
+ export default defineConfig({
9
+ test: {
10
+ pool: "forks",
11
+ maxWorkers: e2eWorkers,
12
+ include: ["test/**/*.e2e.test.ts", "src/**/*.e2e.test.ts"],
13
+ setupFiles: ["test/setup.ts"],
14
+ exclude: [
15
+ "dist/**",
16
+ "apps/macos/**",
17
+ "apps/macos/.build/**",
18
+ "**/vendor/**",
19
+ "dist/OpenClaw.app/**",
20
+ ],
21
+ },
22
+ });
vitest.extensions.config.ts ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { defineConfig } from "vitest/config";
2
+ import baseConfig from "./vitest.config.ts";
3
+
4
+ const baseTest = (baseConfig as { test?: { exclude?: string[] } }).test ?? {};
5
+ const exclude = baseTest.exclude ?? [];
6
+
7
+ export default defineConfig({
8
+ ...baseConfig,
9
+ test: {
10
+ ...baseTest,
11
+ include: ["extensions/**/*.test.ts"],
12
+ exclude,
13
+ },
14
+ });
vitest.gateway.config.ts ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { defineConfig } from "vitest/config";
2
+ import baseConfig from "./vitest.config.ts";
3
+
4
+ const baseTest = (baseConfig as { test?: { exclude?: string[] } }).test ?? {};
5
+ const exclude = baseTest.exclude ?? [];
6
+
7
+ export default defineConfig({
8
+ ...baseConfig,
9
+ test: {
10
+ ...baseTest,
11
+ include: ["src/gateway/**/*.test.ts"],
12
+ exclude,
13
+ },
14
+ });
vitest.live.config.ts ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { defineConfig } from "vitest/config";
2
+
3
+ export default defineConfig({
4
+ test: {
5
+ pool: "forks",
6
+ maxWorkers: 1,
7
+ include: ["src/**/*.live.test.ts"],
8
+ setupFiles: ["test/setup.ts"],
9
+ exclude: [
10
+ "dist/**",
11
+ "apps/macos/**",
12
+ "apps/macos/.build/**",
13
+ "**/vendor/**",
14
+ "dist/OpenClaw.app/**",
15
+ ],
16
+ },
17
+ });
vitest.unit.config.ts ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { defineConfig } from "vitest/config";
2
+ import baseConfig from "./vitest.config.ts";
3
+
4
+ const baseTest = (baseConfig as { test?: { include?: string[]; exclude?: string[] } }).test ?? {};
5
+ const include = baseTest.include ?? [
6
+ "src/**/*.test.ts",
7
+ "extensions/**/*.test.ts",
8
+ "test/format-error.test.ts",
9
+ ];
10
+ const exclude = baseTest.exclude ?? [];
11
+
12
+ export default defineConfig({
13
+ ...baseConfig,
14
+ test: {
15
+ ...baseTest,
16
+ include,
17
+ exclude: [...exclude, "src/gateway/**", "extensions/**"],
18
+ },
19
+ });
zizmor.yml ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # zizmor configuration
2
+ # https://docs.zizmor.sh/configuration/
3
+
4
+ rules:
5
+ # Disable unpinned-uses - pinning to SHA hashes is a significant change
6
+ # that should be done deliberately, not enforced by pre-commit
7
+ unpinned-uses:
8
+ disable: true
9
+
10
+ # Disable excessive-permissions for now - adding explicit permissions
11
+ # blocks requires careful review of each workflow's needs
12
+ excessive-permissions:
13
+ disable: true
14
+
15
+ # Disable artipacked (persist-credentials) - low confidence finding
16
+ artipacked:
17
+ disable: true