Spaces:
Running
Running
Upload 43 files
Browse files- .detect-secrets.cfg +30 -0
- .dockerignore +48 -0
- .env.example +5 -0
- .gitattributes +2 -35
- .gitignore +73 -0
- .npmrc +1 -0
- .oxfmtrc.jsonc +20 -0
- .oxlintrc.json +37 -0
- .pre-commit-config.yaml +105 -0
- .secrets.baseline +2191 -0
- .shellcheckrc +25 -0
- .swiftformat +51 -0
- .swiftlint.yml +148 -0
- AGENTS.md +178 -0
- CHANGELOG.md +0 -0
- CLAUDE.md +1 -0
- CONTRIBUTING.md +60 -0
- Dockerfile +39 -0
- Dockerfile.sandbox +16 -0
- Dockerfile.sandbox-browser +28 -0
- LICENSE +21 -0
- README-header.png +3 -0
- README.md +533 -11
- SECURITY.md +72 -0
- appcast.xml +199 -0
- docker-compose.yml +45 -0
- docker-setup.sh +214 -0
- docs.acp.md +197 -0
- fly.private.toml +39 -0
- fly.toml +34 -0
- openclaw.mjs +14 -0
- package.json +295 -0
- pnpm-lock.yaml +0 -0
- pnpm-workspace.yaml +15 -0
- render.yaml +21 -0
- tsconfig.json +27 -0
- vitest.config.ts +104 -0
- vitest.e2e.config.ts +22 -0
- vitest.extensions.config.ts +14 -0
- vitest.gateway.config.ts +14 -0
- vitest.live.config.ts +17 -0
- vitest.unit.config.ts +19 -0
- zizmor.yml +17 -0
.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 |
-
*
|
| 2 |
-
|
| 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
|
README.md
CHANGED
|
@@ -1,11 +1,533 @@
|
|
| 1 |
-
|
| 2 |
-
|
| 3 |
-
|
| 4 |
-
|
| 5 |
-
|
| 6 |
-
|
| 7 |
-
|
| 8 |
-
|
| 9 |
-
|
| 10 |
-
|
| 11 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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 |
+
[](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
|