openadapt-agent 2.0.1__tar.gz → 2.2.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (108) hide show
  1. openadapt_agent-2.2.0/.github/dependabot.yml +25 -0
  2. openadapt_agent-2.2.0/.github/workflows/ci.yml +102 -0
  3. {openadapt_agent-2.0.1 → openadapt_agent-2.2.0}/.github/workflows/codeql.yml +2 -2
  4. {openadapt_agent-2.0.1 → openadapt_agent-2.2.0}/.github/workflows/release.yml +35 -11
  5. {openadapt_agent-2.0.1 → openadapt_agent-2.2.0}/.gitignore +13 -1
  6. openadapt_agent-2.2.0/.gitleaks.toml +10 -0
  7. openadapt_agent-2.2.0/.mcpbignore +18 -0
  8. openadapt_agent-2.2.0/PKG-INFO +475 -0
  9. openadapt_agent-2.2.0/README.md +438 -0
  10. openadapt_agent-2.2.0/docs/DESIGN.md +548 -0
  11. {openadapt_agent-2.0.1 → openadapt_agent-2.2.0}/docs/DISTRIBUTION.md +100 -50
  12. openadapt_agent-2.2.0/docs/MAILBOX_CLI.md +96 -0
  13. openadapt_agent-2.2.0/docs/REPAIR.md +95 -0
  14. openadapt_agent-2.2.0/docs/examples/sandbox-results.json +262 -0
  15. openadapt_agent-2.2.0/llms.txt +65 -0
  16. openadapt_agent-2.2.0/manifest.json +152 -0
  17. openadapt_agent-2.2.0/pyproject.toml +105 -0
  18. openadapt_agent-2.2.0/scripts/capture_sandbox_examples.py +93 -0
  19. {openadapt_agent-2.0.1 → openadapt_agent-2.2.0}/scripts/check_dist.py +1 -22
  20. openadapt_agent-2.2.0/scripts/check_mcpb.py +128 -0
  21. openadapt_agent-2.2.0/scripts/check_source_boundary.py +258 -0
  22. openadapt_agent-2.2.0/scripts/smoke_client.py +101 -0
  23. {openadapt_agent-2.0.1 → openadapt_agent-2.2.0}/server.json +5 -5
  24. openadapt_agent-2.2.0/skills/openadapt-gui-write/SKILL.md +43 -0
  25. openadapt_agent-2.2.0/source-policy.public.json +434 -0
  26. openadapt_agent-2.2.0/src/openadapt_agent/__init__.py +26 -0
  27. openadapt_agent-2.2.0/src/openadapt_agent/approval.py +124 -0
  28. {openadapt_agent-2.0.1 → openadapt_agent-2.2.0}/src/openadapt_agent/attended.py +53 -2
  29. openadapt_agent-2.2.0/src/openadapt_agent/authoring.py +1689 -0
  30. openadapt_agent-2.2.0/src/openadapt_agent/bridge.py +860 -0
  31. {openadapt_agent-2.0.1 → openadapt_agent-2.2.0}/src/openadapt_agent/bundles.py +53 -3
  32. openadapt_agent-2.2.0/src/openadapt_agent/cards.py +346 -0
  33. openadapt_agent-2.2.0/src/openadapt_agent/cli.py +769 -0
  34. openadapt_agent-2.2.0/src/openadapt_agent/contract.py +926 -0
  35. openadapt_agent-2.2.0/src/openadapt_agent/copy.py +53 -0
  36. openadapt_agent-2.2.0/src/openadapt_agent/mailbox.py +806 -0
  37. openadapt_agent-2.2.0/src/openadapt_agent/mcp.py +411 -0
  38. openadapt_agent-2.2.0/src/openadapt_agent/mcpb_entry.py +66 -0
  39. openadapt_agent-2.2.0/src/openadapt_agent/repair.py +724 -0
  40. openadapt_agent-2.2.0/src/openadapt_agent/runner.py +941 -0
  41. openadapt_agent-2.2.0/src/openadapt_agent/runner_bind.py +185 -0
  42. openadapt_agent-2.2.0/src/openadapt_agent/runs.py +381 -0
  43. openadapt_agent-2.2.0/src/openadapt_agent/sandbox.py +512 -0
  44. openadapt_agent-2.2.0/src/openadapt_agent/seal.py +210 -0
  45. openadapt_agent-2.2.0/src/openadapt_agent/seal_cli.py +276 -0
  46. openadapt_agent-2.2.0/src/openadapt_agent/service.py +556 -0
  47. openadapt_agent-2.2.0/src/openadapt_agent/skill.py +188 -0
  48. openadapt_agent-2.2.0/src/openadapt_agent/tutorial.py +169 -0
  49. {openadapt_agent-2.0.1 → openadapt_agent-2.2.0}/tests/conftest.py +64 -6
  50. openadapt_agent-2.2.0/tests/fixtures/cloud-ts-signed-seal.json +1 -0
  51. openadapt_agent-2.2.0/tests/test_approval.py +353 -0
  52. openadapt_agent-2.2.0/tests/test_approval_flow.py +226 -0
  53. {openadapt_agent-2.0.1 → openadapt_agent-2.2.0}/tests/test_attended_bridge.py +268 -21
  54. openadapt_agent-2.2.0/tests/test_authoring.py +1342 -0
  55. {openadapt_agent-2.0.1 → openadapt_agent-2.2.0}/tests/test_bridge.py +233 -9
  56. openadapt_agent-2.2.0/tests/test_cards.py +159 -0
  57. openadapt_agent-2.2.0/tests/test_cli.py +409 -0
  58. openadapt_agent-2.2.0/tests/test_contract.py +253 -0
  59. openadapt_agent-2.2.0/tests/test_distribution.py +454 -0
  60. openadapt_agent-2.2.0/tests/test_mailbox.py +643 -0
  61. openadapt_agent-2.2.0/tests/test_mcp_server.py +508 -0
  62. openadapt_agent-2.2.0/tests/test_mcpb_entry.py +103 -0
  63. openadapt_agent-2.2.0/tests/test_partner_kit.py +86 -0
  64. openadapt_agent-2.2.0/tests/test_public_lifecycle.py +36 -0
  65. openadapt_agent-2.2.0/tests/test_readme_commands.py +79 -0
  66. openadapt_agent-2.2.0/tests/test_repair.py +398 -0
  67. openadapt_agent-2.2.0/tests/test_repair_e2e.py +201 -0
  68. openadapt_agent-2.2.0/tests/test_repair_hold.py +107 -0
  69. openadapt_agent-2.2.0/tests/test_runner.py +471 -0
  70. openadapt_agent-2.2.0/tests/test_runs.py +156 -0
  71. openadapt_agent-2.2.0/tests/test_sandbox.py +129 -0
  72. openadapt_agent-2.2.0/tests/test_sandbox_flow.py +117 -0
  73. openadapt_agent-2.2.0/tests/test_seal.py +85 -0
  74. openadapt_agent-2.2.0/tests/test_seal_cli.py +144 -0
  75. openadapt_agent-2.2.0/tests/test_seal_e2e.py +173 -0
  76. openadapt_agent-2.2.0/tests/test_service.py +452 -0
  77. openadapt_agent-2.2.0/tests/test_skill.py +164 -0
  78. openadapt_agent-2.2.0/tests/test_tutorial.py +94 -0
  79. openadapt_agent-2.2.0/uv.lock +2643 -0
  80. openadapt_agent-2.0.1/.github/dependabot.yml +0 -17
  81. openadapt_agent-2.0.1/.github/workflows/ci.yml +0 -34
  82. openadapt_agent-2.0.1/PKG-INFO +0 -333
  83. openadapt_agent-2.0.1/README.md +0 -300
  84. openadapt_agent-2.0.1/docs/DESIGN.md +0 -270
  85. openadapt_agent-2.0.1/llms.txt +0 -44
  86. openadapt_agent-2.0.1/pyproject.toml +0 -69
  87. openadapt_agent-2.0.1/scripts/smoke_client.py +0 -70
  88. openadapt_agent-2.0.1/smithery.yaml +0 -87
  89. openadapt_agent-2.0.1/src/openadapt_agent/__init__.py +0 -24
  90. openadapt_agent-2.0.1/src/openadapt_agent/bridge.py +0 -464
  91. openadapt_agent-2.0.1/src/openadapt_agent/cli.py +0 -266
  92. openadapt_agent-2.0.1/src/openadapt_agent/mcp.py +0 -186
  93. openadapt_agent-2.0.1/src/openadapt_agent/runner.py +0 -477
  94. openadapt_agent-2.0.1/src/openadapt_agent/skill.py +0 -113
  95. openadapt_agent-2.0.1/tests/golden/skill_appendix.md +0 -65
  96. openadapt_agent-2.0.1/tests/test_cli.py +0 -58
  97. openadapt_agent-2.0.1/tests/test_distribution.py +0 -151
  98. openadapt_agent-2.0.1/tests/test_mcp_server.py +0 -218
  99. openadapt_agent-2.0.1/tests/test_runner.py +0 -184
  100. openadapt_agent-2.0.1/tests/test_skill.py +0 -47
  101. {openadapt_agent-2.0.1 → openadapt_agent-2.2.0}/.github/CODEOWNERS +0 -0
  102. {openadapt_agent-2.0.1 → openadapt_agent-2.2.0}/.github/workflows/dependency-review.yml +0 -0
  103. {openadapt_agent-2.0.1 → openadapt_agent-2.2.0}/.github/workflows/secret-scan.yml +0 -0
  104. {openadapt_agent-2.0.1 → openadapt_agent-2.2.0}/LICENSE +0 -0
  105. {openadapt_agent-2.0.1 → openadapt_agent-2.2.0}/SECURITY.md +0 -0
  106. {openadapt_agent-2.0.1 → openadapt_agent-2.2.0}/scripts/check_release_artifacts.py +0 -0
  107. {openadapt_agent-2.0.1 → openadapt_agent-2.2.0}/src/openadapt_agent/__main__.py +0 -0
  108. {openadapt_agent-2.0.1 → openadapt_agent-2.2.0}/src/openadapt_agent/flow_service.py +0 -0
@@ -0,0 +1,25 @@
1
+ # SOC 2: automated dependency updates (OA-C-23).
2
+ version: 2
3
+ updates:
4
+ - package-ecosystem: "pip"
5
+ directory: "/"
6
+ schedule:
7
+ interval: "weekly"
8
+ open-pull-requests-limit: 5
9
+ labels:
10
+ - "dependencies"
11
+ - package-ecosystem: "github-actions"
12
+ directory: "/"
13
+ schedule:
14
+ interval: "weekly"
15
+ open-pull-requests-limit: 5
16
+ labels:
17
+ - "dependencies"
18
+ # github/codeql-action/init and .../analyze must run at the SAME version;
19
+ # a run with mismatched versions aborts with "Loaded a configuration file
20
+ # for version X, but running version Y". Ungrouped, Dependabot opens one
21
+ # PR per sub-action, so each one is red on its own and neither can merge.
22
+ groups:
23
+ codeql-action:
24
+ patterns:
25
+ - "github/codeql-action*"
@@ -0,0 +1,102 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+
8
+ jobs:
9
+ test:
10
+ runs-on: ubuntu-latest
11
+ strategy:
12
+ fail-fast: false
13
+ matrix:
14
+ include:
15
+ # Cover SDK 1, SDK 2's floor, and current dependencies in three jobs.
16
+ - python-version: "3.10"
17
+ dependency-set: floor
18
+ - python-version: "3.11"
19
+ dependency-set: mcp2-floor
20
+ - python-version: "3.12"
21
+ dependency-set: current
22
+ steps:
23
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
24
+ - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
25
+ with:
26
+ python-version: ${{ matrix.python-version }}
27
+ cache: pip
28
+ - uses: astral-sh/setup-uv@1c37ad07a6a961277cf70c0d37d6f313000f5884 # v10.3.0
29
+ if: matrix.dependency-set == 'floor'
30
+ - name: Verify lock consistency
31
+ if: matrix.dependency-set == 'floor'
32
+ run: uv lock --locked
33
+ - name: Install dependency floors
34
+ if: matrix.dependency-set == 'floor'
35
+ run: >-
36
+ pip install -e ".[dev]"
37
+ "openadapt-flow==2.1.0"
38
+ "mcp==1.28.0"
39
+ - name: Install MCP 2 floor
40
+ if: matrix.dependency-set == 'mcp2-floor'
41
+ run: pip install -e ".[dev]" "mcp==2.0.0"
42
+ - name: Install current allowed dependencies
43
+ if: matrix.dependency-set == 'current'
44
+ run: pip install -e ".[dev]"
45
+ - name: Lint
46
+ run: ruff check src tests scripts
47
+ - name: Test
48
+ run: pytest -q
49
+ - name: Build release artifacts
50
+ if: matrix.python-version == '3.12'
51
+ run: python -m build
52
+ - name: Verify MIT package boundary
53
+ if: matrix.python-version == '3.12'
54
+ run: |
55
+ python scripts/check_release_artifacts.py dist
56
+ python scripts/check_dist.py dist/*
57
+ python scripts/check_source_boundary.py --require-dist
58
+
59
+ sandbox-e2e:
60
+ # The zero-flag sandbox with real openadapt-flow, a real browser, and the
61
+ # synthetic MockMed app: no fakes. Unit jobs above stub Flow's CLI.
62
+ runs-on: ubuntu-latest
63
+ steps:
64
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
65
+ - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
66
+ with:
67
+ python-version: "3.12"
68
+ cache: pip
69
+ - name: Install with the browser extra
70
+ run: pip install -e ".[dev,tutorial]"
71
+ - name: Install Chromium
72
+ run: python -m playwright install --with-deps chromium
73
+ # test_approval_flow.py skips until the installed openadapt-flow has
74
+ # approval modes.
75
+ - name: Run every sandbox case through openadapt-flow
76
+ env:
77
+ OPENADAPT_AGENT_E2E: "1"
78
+ DO_NOT_TRACK: "1"
79
+ OPENADAPT_TELEMETRY: "0"
80
+ run: pytest -q tests/test_sandbox_flow.py tests/test_approval_flow.py
81
+
82
+ repair-e2e:
83
+ # halt -> needs_repair -> teach_repair -> approval -> replay, on Flow's
84
+ # rendered dialog fixture with its real replayer, OCR, and campaigns.
85
+ runs-on: ubuntu-latest
86
+ steps:
87
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
88
+ - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
89
+ with:
90
+ python-version: "3.12"
91
+ cache: pip
92
+ - name: Install with the released Flow (ships openadapt_flow.repair.dialog_fixture)
93
+ run: |
94
+ pip install -e ".[dev]" "openadapt-flow>=2.1.0,<3"
95
+ pip install opencv-python-headless rapidocr-onnxruntime
96
+ - name: Run the repair end-to-end test
97
+ env:
98
+ DO_NOT_TRACK: "1"
99
+ OPENADAPT_TELEMETRY: "0"
100
+ run: |
101
+ python -c "import openadapt_flow.repair.dialog_fixture"
102
+ pytest -q -rs tests/test_repair_e2e.py tests/test_repair_hold.py
@@ -28,10 +28,10 @@ jobs:
28
28
  - name: Checkout
29
29
  uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
30
30
  - name: Initialize CodeQL
31
- uses: github/codeql-action/init@7188fc363630916deb702c7fdcf4e481b751f97a # v4.37.1
31
+ uses: github/codeql-action/init@1c5b675653bb5c22dbe9b12b556ec555138e09fd # v4.38.1
32
32
  with:
33
33
  languages: ${{ matrix.language }}
34
34
  - name: Perform CodeQL Analysis
35
- uses: github/codeql-action/analyze@7188fc363630916deb702c7fdcf4e481b751f97a # v4.37.1
35
+ uses: github/codeql-action/analyze@1c5b675653bb5c22dbe9b12b556ec555138e09fd # v4.38.1
36
36
  with:
37
37
  category: "/language:${{ matrix.language }}"
@@ -22,9 +22,14 @@ on:
22
22
  paths:
23
23
  - "pyproject.toml"
24
24
  - "server.json"
25
- - "smithery.yaml"
25
+ - "manifest.json"
26
+ - ".mcpbignore"
27
+ - "src/openadapt_agent/mcpb_entry.py"
28
+ - "scripts/check_mcpb.py"
26
29
  - "scripts/check_release_artifacts.py"
27
30
  - "scripts/check_dist.py"
31
+ - "scripts/check_source_boundary.py"
32
+ - "source-policy.public.json"
28
33
  - ".github/workflows/release.yml"
29
34
 
30
35
  concurrency:
@@ -39,25 +44,38 @@ jobs:
39
44
  name: Build + validate (dry run, no publish)
40
45
  runs-on: ubuntu-latest
41
46
  steps:
42
- - uses: actions/checkout@v5
43
- - uses: actions/setup-python@v6
47
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
48
+ - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
44
49
  with:
45
50
  python-version: "3.12"
51
+ - uses: actions/setup-node@949feb2413d6458794dcd2491c4babbbce0c15c1 # v7.1.0
52
+ with:
53
+ node-version: "20"
46
54
  - name: Install tooling
47
55
  run: |
48
56
  python -m pip install --upgrade pip
49
57
  python -m pip install --upgrade build "twine>=6.1" "packaging>=24.2" jsonschema
50
58
  python -m pip install -e ".[dev]"
51
- - name: Version-consistency guard (server.json / pyproject / __version__)
59
+ - name: Version-consistency guard (registry / MCPB / package / runtime)
52
60
  run: python -m pytest tests/test_distribution.py -q
53
61
  - name: Build sdist + wheel
54
62
  run: python -m build
55
- - name: License / package-boundary check on built archives
63
+ - name: License and source-policy checks on built archives
56
64
  run: |
57
65
  python scripts/check_release_artifacts.py dist
58
66
  python scripts/check_dist.py dist/*
67
+ python scripts/check_source_boundary.py --require-dist
59
68
  - name: twine check
60
69
  run: twine check dist/*
70
+ - name: Validate and pack the local MCPB
71
+ shell: bash
72
+ run: |
73
+ set -euo pipefail
74
+ version="$(grep -m1 -E '^version = ' pyproject.toml | sed -E 's/version = "(.*)"/\1/')"
75
+ mkdir -p mcpb-dist
76
+ npx -y @anthropic-ai/mcpb@2.1.2 validate manifest.json
77
+ npx -y @anthropic-ai/mcpb@2.1.2 pack . "mcpb-dist/openadapt-agent-${version}.mcpb"
78
+ python scripts/check_mcpb.py mcpb-dist/*.mcpb
61
79
  - name: Validate server.json against the MCP registry schema
62
80
  run: |
63
81
  python - <<'PY'
@@ -76,11 +94,17 @@ jobs:
76
94
  sys.exit(1 if errors else 0)
77
95
  PY
78
96
  - name: Upload built distributions
79
- uses: actions/upload-artifact@v4
97
+ uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
80
98
  with:
81
99
  name: dist
82
100
  path: dist/
83
101
  if-no-files-found: error
102
+ - name: Upload local MCPB
103
+ uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
104
+ with:
105
+ name: mcpb
106
+ path: mcpb-dist/
107
+ if-no-files-found: error
84
108
 
85
109
  pypi-publish:
86
110
  name: Publish to PyPI
@@ -92,7 +116,7 @@ jobs:
92
116
  id-token: write # OIDC for PyPI Trusted Publishing
93
117
  contents: read
94
118
  steps:
95
- - uses: actions/checkout@v5
119
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
96
120
  - name: Resolve release version + assert it matches the package
97
121
  id: ver
98
122
  shell: bash
@@ -113,7 +137,7 @@ jobs:
113
137
  exit 1
114
138
  fi
115
139
  - name: Download built distributions
116
- uses: actions/download-artifact@v5
140
+ uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
117
141
  with:
118
142
  name: dist
119
143
  path: dist/
@@ -130,13 +154,13 @@ jobs:
130
154
  fi
131
155
  - name: Publish to PyPI (OIDC Trusted Publishing)
132
156
  if: ${{ vars.PYPI_PUBLISH_METHOD != 'token' }}
133
- uses: pypa/gh-action-pypi-publish@release/v1
157
+ uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # v1.14.2
134
158
  with:
135
159
  # No password -> the action uses OIDC Trusted Publishing.
136
160
  print-hash: true
137
161
  - name: Publish to PyPI (API token fallback)
138
162
  if: ${{ vars.PYPI_PUBLISH_METHOD == 'token' }}
139
- uses: pypa/gh-action-pypi-publish@release/v1
163
+ uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # v1.14.2
140
164
  with:
141
165
  password: ${{ secrets.PYPI_API_TOKEN }}
142
166
  print-hash: true
@@ -150,7 +174,7 @@ jobs:
150
174
  id-token: write # OIDC for `mcp-publisher login github-oidc`
151
175
  contents: read
152
176
  steps:
153
- - uses: actions/checkout@v5
177
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
154
178
  - name: Resolve release version
155
179
  id: ver
156
180
  shell: bash
@@ -11,6 +11,7 @@ __pycache__/
11
11
  build/
12
12
  develop-eggs/
13
13
  dist/
14
+ mcpb-dist/
14
15
  downloads/
15
16
  eggs/
16
17
  .eggs/
@@ -121,7 +122,9 @@ dmypy.json
121
122
  .ruff_cache/
122
123
 
123
124
  # uv
124
- uv.lock
125
+ # The MCPB is a local application bundle, so keep its dependency lock for a
126
+ # repeatable one-click install.
127
+ !uv.lock
125
128
 
126
129
  # IDE
127
130
  .idea/
@@ -137,3 +140,12 @@ Thumbs.db
137
140
  # Project specific
138
141
  *.session.json
139
142
  sessions/
143
+
144
+ # Never-publish workspace material (strategy, prospect research, counsel packs,
145
+ # personal contact details). Created ad hoc; must never reach a remote.
146
+ .private/
147
+
148
+ # Cover every .env variant, not one at a time. Negate the committed
149
+ # template so it stays tracked.
150
+ .env.*
151
+ !.env.example
@@ -0,0 +1,10 @@
1
+ # Extends the default gitleaks rules. Each allowlist entry names one
2
+ # synthetic test value, so a real key in the same file is still caught.
3
+ [extend]
4
+ useDefault = true
5
+
6
+ [[allowlists]]
7
+ description = "Synthetic bundle key in the approval end-to-end test, not a credential"
8
+ paths = ['''^tests/test_approval_flow\.py$''']
9
+ regexes = ['''approval-e2e-synthetic-key''']
10
+ condition = "AND"
@@ -0,0 +1,18 @@
1
+ .github/
2
+ .pytest_cache/
3
+ .ruff_cache/
4
+ .venv/
5
+ build/
6
+ dist/
7
+ docs/
8
+ scripts/
9
+ tests/
10
+ *.egg-info/
11
+ **/__pycache__/
12
+ *.pyc
13
+ CLAUDE.md
14
+ SECURITY.md
15
+ llms.txt
16
+ server.json
17
+ source-policy.public.json
18
+ .gitleaks.toml