@aporthq/aport-agent-guardrails 1.0.8
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.
- package/LICENSE +217 -0
- package/README.md +481 -0
- package/bin/agent-guardrails +133 -0
- package/bin/aport-create-passport.sh +444 -0
- package/bin/aport-cursor-hook.sh +90 -0
- package/bin/aport-guardrail-api.sh +108 -0
- package/bin/aport-guardrail-bash.sh +394 -0
- package/bin/aport-guardrail-v2.sh +5 -0
- package/bin/aport-guardrail.sh +5 -0
- package/bin/aport-resolve-paths.sh +71 -0
- package/bin/aport-status.sh +276 -0
- package/bin/frameworks/crewai.sh +49 -0
- package/bin/frameworks/cursor.sh +95 -0
- package/bin/frameworks/langchain.sh +48 -0
- package/bin/frameworks/n8n.sh +36 -0
- package/bin/frameworks/openclaw.sh +19 -0
- package/bin/lib/allowlist.sh +18 -0
- package/bin/lib/common.sh +28 -0
- package/bin/lib/config.sh +46 -0
- package/bin/lib/constants.sh +232 -0
- package/bin/lib/detect.sh +65 -0
- package/bin/lib/error.sh +269 -0
- package/bin/lib/passport.sh +19 -0
- package/bin/lib/templates/.gitkeep +1 -0
- package/bin/lib/templates/config.yaml +6 -0
- package/bin/lib/validation.sh +206 -0
- package/bin/openclaw +660 -0
- package/docs/ADDING_A_FRAMEWORK.md +87 -0
- package/docs/AGENTS.md.example +40 -0
- package/docs/CODE_REVIEW.md +192 -0
- package/docs/DEPLOYMENT_READINESS.md +81 -0
- package/docs/FAQ_SECURITY_SCANNERS.md +373 -0
- package/docs/FRAMEWORK_ROADMAP.md +41 -0
- package/docs/HOSTED_PASSPORT_SETUP.md +362 -0
- package/docs/IMPLEMENTING_YOUR_OWN_EVALUATOR.md +433 -0
- package/docs/OPENCLAW_COMPATIBILITY.md +73 -0
- package/docs/OPENCLAW_LOCAL_INTEGRATION.md +596 -0
- package/docs/OPENCLAW_TOOLS_AND_POLICIES.md +54 -0
- package/docs/QUICKSTART.md +470 -0
- package/docs/QUICKSTART_OPENCLAW_PLUGIN.md +470 -0
- package/docs/README.md +28 -0
- package/docs/RELEASE.md +87 -0
- package/docs/REPO_LAYOUT.md +47 -0
- package/docs/SKILLS_ECOSYSTEM_ANALYSIS_FEB17.md +1260 -0
- package/docs/TOOL_POLICY_MAPPING.md +46 -0
- package/docs/UPGRADE.md +46 -0
- package/docs/VERIFICATION_METHODS.md +97 -0
- package/docs/assets/README.md +8 -0
- package/docs/assets/porter.svg +54 -0
- package/docs/development/ERROR_CODES.md +616 -0
- package/docs/frameworks/GITHUB_ISSUE_PROPOSALS.md +1105 -0
- package/docs/frameworks/crewai.md +114 -0
- package/docs/frameworks/cursor.md +159 -0
- package/docs/frameworks/langchain.md +72 -0
- package/docs/frameworks/n8n.md +40 -0
- package/docs/frameworks/openclaw.md +40 -0
- package/docs/launch/ADD_APORT_AWESOME_LISTS_INSTRUCTIONS.md +146 -0
- package/docs/launch/ANNOUNCEMENT_GUIDE.md +266 -0
- package/docs/launch/AWESOME_REPOS.md +53 -0
- package/docs/launch/CURSOR_VSCODE_HOOKS_RESEARCH.md +77 -0
- package/docs/launch/DEMO_TERMINAL_OUTPUT.txt +48 -0
- package/docs/launch/DRY_AND_PLAN_CHECKLIST.md +47 -0
- package/docs/launch/EVIDENCE_README.md +61 -0
- package/docs/launch/EVIDENCE_TERMINAL_CAPTURE.txt +10 -0
- package/docs/launch/FRAMEWORK_SUPPORT_PLAN.md +1640 -0
- package/docs/launch/LAUNCH_READINESS_CHECKLIST.md +237 -0
- package/docs/launch/LAUNCH_STRATEGY_SUMMARY.md +464 -0
- package/docs/launch/OPENCLAW_FEEDBACK_AND_FIXES.md +85 -0
- package/docs/launch/POST_1_VALENTINE_IMPROVED.md +233 -0
- package/docs/launch/POST_2_GUARDRAIL_IMPROVED.md +369 -0
- package/docs/launch/PRE_LAUNCH_FIXES.md +766 -0
- package/docs/launch/QUICK_LAUNCH_CHECKLIST.md +400 -0
- package/docs/launch/READINESS_SUMMARY.md +262 -0
- package/docs/launch/README.md +68 -0
- package/docs/launch/USER_STORIES.md +327 -0
- package/docs/launch/scripts/add-aport-awesome-pr.sh +69 -0
- package/docs/operations/MONITORING.md +588 -0
- package/docs/reviews/2026-02-18-staff-review.md +268 -0
- package/extensions/openclaw-aport/README.md +415 -0
- package/extensions/openclaw-aport/index.js +625 -0
- package/extensions/openclaw-aport/openclaw-aport.js +7 -0
- package/extensions/openclaw-aport/openclaw.plugin.json +46 -0
- package/extensions/openclaw-aport/package.json +36 -0
- package/extensions/openclaw-aport/test.js +307 -0
- package/external/aport-policies/README.md +363 -0
- package/external/aport-policies/agent.session.create.v1/README.md +345 -0
- package/external/aport-policies/agent.session.create.v1/policy.json +162 -0
- package/external/aport-policies/agent.tool.register.v1/README.md +361 -0
- package/external/aport-policies/agent.tool.register.v1/policy.json +172 -0
- package/external/aport-policies/code.release.publish.v1/README.md +51 -0
- package/external/aport-policies/code.release.publish.v1/policy.json +121 -0
- package/external/aport-policies/code.repository.merge.v1/README.md +287 -0
- package/external/aport-policies/code.repository.merge.v1/express.example.js +332 -0
- package/external/aport-policies/code.repository.merge.v1/fastapi.example.py +370 -0
- package/external/aport-policies/code.repository.merge.v1/policy.json +162 -0
- package/external/aport-policies/data.export.create.v1/README.md +226 -0
- package/external/aport-policies/data.export.create.v1/express.example.js +172 -0
- package/external/aport-policies/data.export.create.v1/fastapi.example.py +165 -0
- package/external/aport-policies/data.export.create.v1/policy.json +133 -0
- package/external/aport-policies/data.report.ingest.v1/README.md +134 -0
- package/external/aport-policies/data.report.ingest.v1/express.example.js +105 -0
- package/external/aport-policies/data.report.ingest.v1/minimal-example.js +68 -0
- package/external/aport-policies/data.report.ingest.v1/policy.json +174 -0
- package/external/aport-policies/finance.crypto.trade.v1/README.md +146 -0
- package/external/aport-policies/finance.crypto.trade.v1/express.example.js +109 -0
- package/external/aport-policies/finance.crypto.trade.v1/minimal-example.js +65 -0
- package/external/aport-policies/finance.crypto.trade.v1/policy.json +176 -0
- package/external/aport-policies/finance.payment.charge.v1/README.md +326 -0
- package/external/aport-policies/finance.payment.charge.v1/express.example.js +250 -0
- package/external/aport-policies/finance.payment.charge.v1/fastapi.example.py +227 -0
- package/external/aport-policies/finance.payment.charge.v1/minimal-example.js +64 -0
- package/external/aport-policies/finance.payment.charge.v1/policy.json +224 -0
- package/external/aport-policies/finance.payment.charge.v1/tests/contexts.jsonl +12 -0
- package/external/aport-policies/finance.payment.charge.v1/tests/expected.jsonl +12 -0
- package/external/aport-policies/finance.payment.charge.v1/tests/passport.instance.json +42 -0
- package/external/aport-policies/finance.payment.charge.v1/tests/passport.template.json +40 -0
- package/external/aport-policies/finance.payment.charge.v1/tests/payments-charge-policy.test.js +817 -0
- package/external/aport-policies/finance.payment.charge.v1/tests/test_payments_charge_policy.py +486 -0
- package/external/aport-policies/finance.payment.payout.v1/README.md +78 -0
- package/external/aport-policies/finance.payment.payout.v1/policy.json +181 -0
- package/external/aport-policies/finance.payment.refund.v1/README.md +275 -0
- package/external/aport-policies/finance.payment.refund.v1/express.example.js +167 -0
- package/external/aport-policies/finance.payment.refund.v1/fastapi.example.py +136 -0
- package/external/aport-policies/finance.payment.refund.v1/minimal-example.js +183 -0
- package/external/aport-policies/finance.payment.refund.v1/policy.json +216 -0
- package/external/aport-policies/finance.payment.refund.v1/tests/refunds-policy.test.js +924 -0
- package/external/aport-policies/finance.payment.refund.v1/tests/test_refunds_policy.py +778 -0
- package/external/aport-policies/finance.transaction.execute.v1/README.md +309 -0
- package/external/aport-policies/finance.transaction.execute.v1/express.example.js +261 -0
- package/external/aport-policies/finance.transaction.execute.v1/fastapi.example.py +231 -0
- package/external/aport-policies/finance.transaction.execute.v1/minimal-example.js +78 -0
- package/external/aport-policies/finance.transaction.execute.v1/policy.json +189 -0
- package/external/aport-policies/finance.transaction.execute.v1/tests/contexts.jsonl +12 -0
- package/external/aport-policies/finance.transaction.execute.v1/tests/expected.jsonl +12 -0
- package/external/aport-policies/finance.transaction.execute.v1/tests/passport.instance.json +42 -0
- package/external/aport-policies/finance.transaction.execute.v1/tests/passport.template.json +42 -0
- package/external/aport-policies/finance.transaction.execute.v1/tests/test_transactions_policy.py +214 -0
- package/external/aport-policies/finance.transaction.execute.v1/tests/transactions-policy.test.js +306 -0
- package/external/aport-policies/governance.data.access.v1/README.md +292 -0
- package/external/aport-policies/governance.data.access.v1/express.example.js +321 -0
- package/external/aport-policies/governance.data.access.v1/fastapi.example.py +279 -0
- package/external/aport-policies/governance.data.access.v1/minimal-example.js +65 -0
- package/external/aport-policies/governance.data.access.v1/policy.json +208 -0
- package/external/aport-policies/governance.data.access.v1/tests/contexts.jsonl +12 -0
- package/external/aport-policies/governance.data.access.v1/tests/data-access-policy.test.js +308 -0
- package/external/aport-policies/governance.data.access.v1/tests/expected.jsonl +12 -0
- package/external/aport-policies/governance.data.access.v1/tests/passport.instance.json +56 -0
- package/external/aport-policies/governance.data.access.v1/tests/passport.template.json +56 -0
- package/external/aport-policies/governance.data.access.v1/tests/test_data_access_policy.py +214 -0
- package/external/aport-policies/legal.contract.review.v1/README.md +109 -0
- package/external/aport-policies/legal.contract.review.v1/policy.json +378 -0
- package/external/aport-policies/legal.contract.review.v1/tests/legal-contract-review-policy.test.js +609 -0
- package/external/aport-policies/legal.contract.review.v1/tests/passport.template.json +49 -0
- package/external/aport-policies/mcp.tool.execute.v1/README.md +301 -0
- package/external/aport-policies/mcp.tool.execute.v1/policy.json +141 -0
- package/external/aport-policies/messaging.message.send.v1/README.md +230 -0
- package/external/aport-policies/messaging.message.send.v1/express.example.js +183 -0
- package/external/aport-policies/messaging.message.send.v1/fastapi.example.py +193 -0
- package/external/aport-policies/messaging.message.send.v1/policy.json +144 -0
- package/external/aport-policies/policy-template.json +107 -0
- package/external/aport-policies/system.command.execute.v1/README.md +275 -0
- package/external/aport-policies/system.command.execute.v1/policy.json +146 -0
- package/external/aport-spec/CONTRIBUTING.md +273 -0
- package/external/aport-spec/LICENSE +21 -0
- package/external/aport-spec/README.md +168 -0
- package/external/aport-spec/conformance/README.md +294 -0
- package/external/aport-spec/conformance/cases/data.export.v1/contexts/allow_users.json +6 -0
- package/external/aport-spec/conformance/cases/data.export.v1/contexts/deny_pii.json +6 -0
- package/external/aport-spec/conformance/cases/data.export.v1/expected/allow_users.decision.json +19 -0
- package/external/aport-spec/conformance/cases/data.export.v1/expected/deny_pii.decision.json +19 -0
- package/external/aport-spec/conformance/cases/data.export.v1/passports/template.json +29 -0
- package/external/aport-spec/conformance/cases/payments.refunds.v1/contexts/allow_50usd.json +9 -0
- package/external/aport-spec/conformance/cases/payments.refunds.v1/contexts/deny_150usd.json +9 -0
- package/external/aport-spec/conformance/cases/payments.refunds.v1/contexts/deny_currency.json +9 -0
- package/external/aport-spec/conformance/cases/payments.refunds.v1/expected/allow_50usd.decision.json +19 -0
- package/external/aport-spec/conformance/cases/payments.refunds.v1/expected/deny_150usd.decision.json +19 -0
- package/external/aport-spec/conformance/cases/payments.refunds.v1/expected/deny_currency.decision.json +19 -0
- package/external/aport-spec/conformance/cases/payments.refunds.v1/passports/template.json +42 -0
- package/external/aport-spec/conformance/package.json +44 -0
- package/external/aport-spec/conformance/pnpm-lock.yaml +642 -0
- package/external/aport-spec/conformance/src/cases.ts +371 -0
- package/external/aport-spec/conformance/src/ed25519.ts +167 -0
- package/external/aport-spec/conformance/src/jcs.ts +85 -0
- package/external/aport-spec/conformance/src/runner.ts +533 -0
- package/external/aport-spec/conformance/src/validators.ts +185 -0
- package/external/aport-spec/conformance/test-runner.js +315 -0
- package/external/aport-spec/conformance/tsconfig.json +21 -0
- package/external/aport-spec/error-schema.json +192 -0
- package/external/aport-spec/index.json +12 -0
- package/external/aport-spec/integrations/clawmoat/README.md +12 -0
- package/external/aport-spec/integrations/shield/README.md +245 -0
- package/external/aport-spec/integrations/shield/adapters/index.js +116 -0
- package/external/aport-spec/integrations/shield/adapters/system-command-execute.js +133 -0
- package/external/aport-spec/integrations/shield/test/README.md +58 -0
- package/external/aport-spec/integrations/shield/test/shield.md +40 -0
- package/external/aport-spec/integrations/shield/test/test-shield-to-verify.js +274 -0
- package/external/aport-spec/metrics-schema.json +504 -0
- package/external/aport-spec/oap/CHANGELOG.md +54 -0
- package/external/aport-spec/oap/VERSION.md +40 -0
- package/external/aport-spec/oap/capability-registry.md +229 -0
- package/external/aport-spec/oap/conformance.md +257 -0
- package/external/aport-spec/oap/decision-schema.json +114 -0
- package/external/aport-spec/oap/examples/context.refund.usd.50.json +9 -0
- package/external/aport-spec/oap/examples/decision.allow.sample.json +20 -0
- package/external/aport-spec/oap/examples/decision.deny.sample.json +23 -0
- package/external/aport-spec/oap/examples/passport.instance.v1.json +50 -0
- package/external/aport-spec/oap/examples/passport.template.v1.json +71 -0
- package/external/aport-spec/oap/oap-spec.md +426 -0
- package/external/aport-spec/oap/passport-schema.json +396 -0
- package/external/aport-spec/oap/security.md +213 -0
- package/external/aport-spec/oap/vc/context-oap-v1.jsonld +137 -0
- package/external/aport-spec/oap/vc/examples/oap-decision-vc.json +37 -0
- package/external/aport-spec/oap/vc/examples/oap-passport-vc.json +68 -0
- package/external/aport-spec/oap/vc/tools/INTEGRATION.md +375 -0
- package/external/aport-spec/oap/vc/tools/README.md +278 -0
- package/external/aport-spec/oap/vc/tools/examples/decision-to-vc.js +66 -0
- package/external/aport-spec/oap/vc/tools/examples/passport-to-vc.js +83 -0
- package/external/aport-spec/oap/vc/tools/examples/vc-to-decision.js +77 -0
- package/external/aport-spec/oap/vc/tools/examples/vc-to-passport.js +94 -0
- package/external/aport-spec/oap/vc/tools/package.json +38 -0
- package/external/aport-spec/oap/vc/tools/pnpm-lock.yaml +472 -0
- package/external/aport-spec/oap/vc/tools/src/cli.ts +226 -0
- package/external/aport-spec/oap/vc/tools/src/crypto-utils.ts +427 -0
- package/external/aport-spec/oap/vc/tools/src/index.ts +653 -0
- package/external/aport-spec/oap/vc/tools/src/test.ts +148 -0
- package/external/aport-spec/oap/vc/tools/src/vp.ts +382 -0
- package/external/aport-spec/oap/vc/tools/test-simple.js +214 -0
- package/external/aport-spec/oap/vc/tools/tsconfig.json +19 -0
- package/external/aport-spec/oap/vc/vc-mapping.md +443 -0
- package/external/aport-spec/passport-schema.json +586 -0
- package/external/aport-spec/rate-limiting.md +136 -0
- package/external/aport-spec/transport-profile.md +325 -0
- package/external/aport-spec/webhook-spec.md +314 -0
- package/package.json +70 -0
- package/skills/aport-agent-guardrail/SKILL.md +314 -0
- package/src/evaluator.js +252 -0
- package/src/server/index.js +72 -0
|
@@ -0,0 +1,362 @@
|
|
|
1
|
+
# Using Hosted Passports with OpenClaw
|
|
2
|
+
|
|
3
|
+
**For users who created a passport at [aport.io/builder/create](https://aport.io/builder/create)**
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Overview
|
|
8
|
+
|
|
9
|
+
You have two options when using APort guardrails with OpenClaw:
|
|
10
|
+
|
|
11
|
+
1. **Local Passport** (Default): Create passport with CLI wizard → stored at `~/.openclaw/passport.json`
|
|
12
|
+
2. **Hosted Passport** (This Guide): Create passport at aport.io → Use `agent_id` only, no download needed
|
|
13
|
+
|
|
14
|
+
**Why Hosted?**
|
|
15
|
+
- ✅ **Global Kill Switch**: Suspend passport instantly from dashboard (all agents stop < 15s)
|
|
16
|
+
- ✅ **No JSON Management**: No local file to lose or back up
|
|
17
|
+
- ✅ **Team Sync**: Share policies across team members
|
|
18
|
+
- ✅ **Web Dashboard**: View activity, audit logs, analytics
|
|
19
|
+
- ✅ **Automatic Updates**: Edit limits in dashboard → takes effect immediately
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## Quick Start (Hosted Passport)
|
|
24
|
+
|
|
25
|
+
**Step 1: Create Passport at aport.io**
|
|
26
|
+
|
|
27
|
+
1. Visit [https://aport.io/builder/create](https://aport.io/builder/create)
|
|
28
|
+
2. Select framework: **OpenClaw**
|
|
29
|
+
3. Fill agent name and limits, then click "Create Passport"
|
|
30
|
+
4. On the success page you’ll see an **agent_id** (e.g. `ap_abc123def456...`) and often a ready-to-run command.
|
|
31
|
+
|
|
32
|
+
**Step 2: Install Guardrails**
|
|
33
|
+
|
|
34
|
+
**Option A — One command (if you have your agent_id):**
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
npx @aporthq/aport-agent-guardrails <agent_id>
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
Example: `npx @aporthq/aport-agent-guardrails ap_fa2f6d53bb5b4c98b9af0124285b6e0f`. The CLI skips the passport wizard and configures the plugin to use your hosted passport.
|
|
41
|
+
|
|
42
|
+
**Option B — Interactive:**
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
npx @aporthq/aport-agent-guardrails
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
When prompted for passport, choose "Use hosted passport (agent_id only)" and paste your `agent_id`. Config directory default: `~/.openclaw`. Plugin mode will be API (required for hosted).
|
|
49
|
+
|
|
50
|
+
**Step 3: Start OpenClaw**
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
openclaw gateway start --config ~/.openclaw/config.yaml
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
**Done!** The plugin will fetch your passport from APort API on every tool call.
|
|
57
|
+
|
|
58
|
+
---
|
|
59
|
+
|
|
60
|
+
## How It Works (Hosted Passport)
|
|
61
|
+
|
|
62
|
+
```
|
|
63
|
+
User → OpenClaw: "Create a file"
|
|
64
|
+
↓
|
|
65
|
+
OpenClaw: Tool call → before_tool_call hook
|
|
66
|
+
↓
|
|
67
|
+
APort Plugin: Reads config → sees agent_id (no local passport file)
|
|
68
|
+
↓
|
|
69
|
+
APort Plugin: POST to api.aport.io/api/verify/policy/system.command.execute.v1
|
|
70
|
+
Body: { "context": { "agent_id": "ap_abc123...", "command": "touch test.txt" } }
|
|
71
|
+
↓
|
|
72
|
+
APort API: Fetches passport from registry by agent_id
|
|
73
|
+
↓
|
|
74
|
+
APort API: Evaluates policy → Returns ALLOW/DENY
|
|
75
|
+
↓
|
|
76
|
+
APort Plugin: ✅ ALLOW → Tool runs
|
|
77
|
+
❌ DENY → Tool blocked
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
**Key Point:** Your passport stays in APort's registry. The plugin sends `agent_id` + context, API fetches passport, evaluates policy, returns decision. **No passport file stored locally.**
|
|
81
|
+
|
|
82
|
+
---
|
|
83
|
+
|
|
84
|
+
## Configuration (Hosted Passport)
|
|
85
|
+
|
|
86
|
+
### Option A: During Setup (Automatic)
|
|
87
|
+
|
|
88
|
+
Run `npx @aporthq/aport-agent-guardrails` and follow prompts. The setup script will create `~/.openclaw/config.yaml`:
|
|
89
|
+
|
|
90
|
+
```yaml
|
|
91
|
+
plugins:
|
|
92
|
+
enabled: true
|
|
93
|
+
entries:
|
|
94
|
+
openclaw-aport:
|
|
95
|
+
enabled: true
|
|
96
|
+
config:
|
|
97
|
+
mode: api
|
|
98
|
+
agentId: ap_abc123def456... # Your hosted passport ID
|
|
99
|
+
apiUrl: https://api.aport.io
|
|
100
|
+
failClosed: true
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
**Note:** When `agentId` is set, the plugin uses it instead of reading `passportFile`.
|
|
104
|
+
|
|
105
|
+
### Option B: Manual Configuration
|
|
106
|
+
|
|
107
|
+
If you already have a config, edit `~/.openclaw/config.yaml`:
|
|
108
|
+
|
|
109
|
+
**Add or replace the APort plugin section:**
|
|
110
|
+
|
|
111
|
+
```yaml
|
|
112
|
+
plugins:
|
|
113
|
+
enabled: true
|
|
114
|
+
entries:
|
|
115
|
+
openclaw-aport:
|
|
116
|
+
enabled: true
|
|
117
|
+
config:
|
|
118
|
+
# Use API mode (required for hosted passports)
|
|
119
|
+
mode: api
|
|
120
|
+
|
|
121
|
+
# Hosted passport: provide agent_id instead of passportFile
|
|
122
|
+
agentId: ap_abc123def456... # REPLACE with your agent_id from aport.io
|
|
123
|
+
|
|
124
|
+
# API endpoint
|
|
125
|
+
apiUrl: https://api.aport.io
|
|
126
|
+
|
|
127
|
+
# Optional: API key if your organization requires it
|
|
128
|
+
# (Set APORT_API_KEY in environment; do NOT put in config file)
|
|
129
|
+
|
|
130
|
+
# Fail-closed: block on error (default: true)
|
|
131
|
+
failClosed: true
|
|
132
|
+
|
|
133
|
+
# Allow unmapped tools (custom skills/ClawHub)
|
|
134
|
+
allowUnmappedTools: true
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
**Then restart OpenClaw:**
|
|
138
|
+
|
|
139
|
+
```bash
|
|
140
|
+
openclaw gateway restart
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
---
|
|
144
|
+
|
|
145
|
+
## Testing Your Setup
|
|
146
|
+
|
|
147
|
+
### Test 1: Verify Plugin Loaded
|
|
148
|
+
|
|
149
|
+
```bash
|
|
150
|
+
openclaw plugins list | grep openclaw-aport
|
|
151
|
+
# Should show: openclaw-aport (enabled)
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
### Test 2: Try a Safe Command
|
|
155
|
+
|
|
156
|
+
Ask your OpenClaw agent:
|
|
157
|
+
```
|
|
158
|
+
"Create a directory called test"
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
**Expected:** ✅ Command allowed, directory created
|
|
162
|
+
|
|
163
|
+
### Test 3: Try a Dangerous Command
|
|
164
|
+
|
|
165
|
+
Ask your OpenClaw agent:
|
|
166
|
+
```
|
|
167
|
+
"Run rm -rf /"
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
**Expected:** ❌ Command blocked with reason: "Blocked pattern: rm -rf"
|
|
171
|
+
|
|
172
|
+
### Test 4: Check Dashboard
|
|
173
|
+
|
|
174
|
+
1. Visit [https://aport.io/passports](https://aport.io/passports)
|
|
175
|
+
2. Click your passport
|
|
176
|
+
3. View activity log → Should see recent tool calls (ALLOW/DENY)
|
|
177
|
+
|
|
178
|
+
---
|
|
179
|
+
|
|
180
|
+
## Switching Between Local and Hosted
|
|
181
|
+
|
|
182
|
+
### From Local → Hosted
|
|
183
|
+
|
|
184
|
+
1. Create hosted passport at aport.io/builder/create
|
|
185
|
+
2. Copy `agent_id`
|
|
186
|
+
3. Edit `~/.openclaw/config.yaml`:
|
|
187
|
+
```yaml
|
|
188
|
+
config:
|
|
189
|
+
mode: api
|
|
190
|
+
agentId: ap_your_new_agent_id # ADD THIS
|
|
191
|
+
# passportFile: ~/.openclaw/passport.json # REMOVE OR COMMENT OUT
|
|
192
|
+
apiUrl: https://api.aport.io
|
|
193
|
+
```
|
|
194
|
+
4. Restart: `openclaw gateway restart`
|
|
195
|
+
|
|
196
|
+
### From Hosted → Local
|
|
197
|
+
|
|
198
|
+
1. Download passport JSON from dashboard (if available) OR create new local passport:
|
|
199
|
+
```bash
|
|
200
|
+
./bin/aport-create-passport.sh --output ~/.openclaw/passport.json
|
|
201
|
+
```
|
|
202
|
+
2. Edit `~/.openclaw/config.yaml`:
|
|
203
|
+
```yaml
|
|
204
|
+
config:
|
|
205
|
+
mode: local # OR api (both work with local file)
|
|
206
|
+
passportFile: ~/.openclaw/passport.json # ADD THIS
|
|
207
|
+
# agentId: ap_... # REMOVE OR COMMENT OUT
|
|
208
|
+
guardrailScript: ~/.openclaw/.skills/aport-guardrail-bash.sh
|
|
209
|
+
```
|
|
210
|
+
3. Restart: `openclaw gateway restart`
|
|
211
|
+
|
|
212
|
+
---
|
|
213
|
+
|
|
214
|
+
## Managing Your Hosted Passport
|
|
215
|
+
|
|
216
|
+
### Update Limits
|
|
217
|
+
|
|
218
|
+
1. Visit [https://aport.io/passports](https://aport.io/passports)
|
|
219
|
+
2. Click your passport → "Edit"
|
|
220
|
+
3. Update limits (e.g., change `max_files` from 500 → 1000)
|
|
221
|
+
4. Click "Save"
|
|
222
|
+
5. **Takes effect immediately** (no restart needed)
|
|
223
|
+
|
|
224
|
+
### Suspend Passport (Kill Switch)
|
|
225
|
+
|
|
226
|
+
1. Visit passport dashboard
|
|
227
|
+
2. Click "Suspend"
|
|
228
|
+
3. **All agents using this passport stop within 15 seconds**
|
|
229
|
+
4. To resume: Click "Activate"
|
|
230
|
+
|
|
231
|
+
### View Activity
|
|
232
|
+
|
|
233
|
+
1. Passport dashboard → "Activity" tab
|
|
234
|
+
2. See all tool calls: timestamp, tool name, decision (ALLOW/DENY), reason
|
|
235
|
+
|
|
236
|
+
### Download Passport (Backup)
|
|
237
|
+
|
|
238
|
+
1. Passport dashboard → "Download JSON"
|
|
239
|
+
2. Save to `~/.openclaw/passport.json` (optional local backup)
|
|
240
|
+
|
|
241
|
+
---
|
|
242
|
+
|
|
243
|
+
## Troubleshooting
|
|
244
|
+
|
|
245
|
+
### Error: "Failed to fetch passport from API"
|
|
246
|
+
|
|
247
|
+
**Cause:** Invalid `agent_id` or API unreachable
|
|
248
|
+
|
|
249
|
+
**Fix:**
|
|
250
|
+
1. Verify `agent_id` in config matches dashboard (no typos)
|
|
251
|
+
2. Check API reachable: `curl -sf https://api.aport.io/api/status`
|
|
252
|
+
3. If behind firewall, check network access to `api.aport.io`
|
|
253
|
+
|
|
254
|
+
### Error: "API key required"
|
|
255
|
+
|
|
256
|
+
**Cause:** Your organization requires authentication
|
|
257
|
+
|
|
258
|
+
**Fix:**
|
|
259
|
+
1. Get API key from team admin or dashboard
|
|
260
|
+
2. Set in environment (NOT in config):
|
|
261
|
+
```bash
|
|
262
|
+
export APORT_API_KEY="your-api-key-here"
|
|
263
|
+
openclaw gateway restart
|
|
264
|
+
```
|
|
265
|
+
3. For permanent: Add to `~/.bashrc` or `~/.zshrc`
|
|
266
|
+
|
|
267
|
+
### Plugin Not Checking
|
|
268
|
+
|
|
269
|
+
**Cause:** Plugin not loaded or config incorrect
|
|
270
|
+
|
|
271
|
+
**Fix:**
|
|
272
|
+
1. Check plugin enabled: `openclaw plugins list`
|
|
273
|
+
2. Check config: `cat ~/.openclaw/config.yaml | grep -A 10 openclaw-aport`
|
|
274
|
+
3. Check logs: `openclaw logs | grep APort`
|
|
275
|
+
4. Reinstall plugin:
|
|
276
|
+
```bash
|
|
277
|
+
openclaw plugins uninstall openclaw-aport
|
|
278
|
+
npx @aporthq/aport-agent-guardrails
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
### Passport Suspended But Agent Still Running
|
|
282
|
+
|
|
283
|
+
**Cause:** Kill switch delay (< 15s) or API mode not enabled
|
|
284
|
+
|
|
285
|
+
**Fix:**
|
|
286
|
+
1. Wait 15 seconds (API checks every 10s)
|
|
287
|
+
2. Verify mode is `api` in config (local suspend = set passport `status` to `suspended`; no separate file; same standard as other frameworks)
|
|
288
|
+
3. Force restart: `openclaw gateway restart`
|
|
289
|
+
|
|
290
|
+
---
|
|
291
|
+
|
|
292
|
+
## API Mode vs. Local Mode (With Hosted Passport)
|
|
293
|
+
|
|
294
|
+
| Feature | API Mode (Hosted) | Local Mode |
|
|
295
|
+
|---------|-------------------|------------|
|
|
296
|
+
| **Passport storage** | APort registry | Local file |
|
|
297
|
+
| **agent_id only** | ✅ Yes | ❌ No - needs file |
|
|
298
|
+
| **Global suspend** | ✅ <30s (login, suspend in registry) | Passport `status` only (edit passport; no separate file) |
|
|
299
|
+
| **Network required** | ✅ Yes | ❌ No |
|
|
300
|
+
| **Policy updates** | ✅ Instant | Manual file edit |
|
|
301
|
+
| **Team sync** | ✅ Yes | Manual file sharing |
|
|
302
|
+
| **Audit log** | ✅ Cloud dashboard | Local file only |
|
|
303
|
+
|
|
304
|
+
**Recommendation:** Use **API mode** with hosted passports for global suspend (login once, suspend in registry; all agents using that passport deny within <30s) and team sync.
|
|
305
|
+
|
|
306
|
+
---
|
|
307
|
+
|
|
308
|
+
## Advanced: Self-Hosted API
|
|
309
|
+
|
|
310
|
+
If you're running the APort API yourself (e.g., on-prem or private cloud):
|
|
311
|
+
|
|
312
|
+
**Config:**
|
|
313
|
+
```yaml
|
|
314
|
+
config:
|
|
315
|
+
mode: api
|
|
316
|
+
agentId: ap_your_agent_id
|
|
317
|
+
apiUrl: https://your-aport-api.company.com # YOUR API
|
|
318
|
+
failClosed: true
|
|
319
|
+
```
|
|
320
|
+
|
|
321
|
+
**Deploy APort API:**
|
|
322
|
+
1. See [agent-passport repo](https://github.com/aporthq/agent-passport) functions/api
|
|
323
|
+
2. Deploy to Cloudflare Workers, Vercel, or your infra
|
|
324
|
+
3. Point `apiUrl` to your deployed API
|
|
325
|
+
|
|
326
|
+
---
|
|
327
|
+
|
|
328
|
+
## FAQ
|
|
329
|
+
|
|
330
|
+
**Q: Can I use hosted passport with local mode?**
|
|
331
|
+
A: No. Local mode requires a passport file. Use API mode with hosted passports.
|
|
332
|
+
|
|
333
|
+
**Q: What if API goes down?**
|
|
334
|
+
A: With `failClosed: true` (default), all tool calls are blocked. Set `failClosed: false` to allow on error (NOT RECOMMENDED for security).
|
|
335
|
+
|
|
336
|
+
**Q: Can I create multiple hosted passports?**
|
|
337
|
+
A: Yes! Free tier: 1 passport. Beta/Pro: Unlimited. Each passport has unique `agent_id`.
|
|
338
|
+
|
|
339
|
+
**Q: How do I migrate from CLI-created to hosted?**
|
|
340
|
+
A: Create hosted passport at aport.io → Update config with `agentId` → Restart. Old local file can stay (ignored when `agentId` set).
|
|
341
|
+
|
|
342
|
+
**Q: Can I download my hosted passport?**
|
|
343
|
+
A: Yes, dashboard → "Download JSON". But you don't need to - `agent_id` is enough.
|
|
344
|
+
|
|
345
|
+
---
|
|
346
|
+
|
|
347
|
+
## Next Steps
|
|
348
|
+
|
|
349
|
+
- ✅ **Setup complete?** Test with safe + dangerous commands
|
|
350
|
+
- 📖 **Learn more:** [QUICKSTART_OPENCLAW_PLUGIN.md](QUICKSTART_OPENCLAW_PLUGIN.md)
|
|
351
|
+
- 🛠️ **Customize policies:** Edit passport limits in dashboard
|
|
352
|
+
- 👥 **Team setup:** Invite team members at [aport.io/organizations](https://aport.io/organizations)
|
|
353
|
+
- 📊 **Monitor usage:** View activity logs in dashboard
|
|
354
|
+
|
|
355
|
+
---
|
|
356
|
+
|
|
357
|
+
## See Also
|
|
358
|
+
|
|
359
|
+
- [QUICKSTART_OPENCLAW_PLUGIN.md](QUICKSTART_OPENCLAW_PLUGIN.md) - Plugin setup (local passport)
|
|
360
|
+
- [VERIFICATION_METHODS.md](VERIFICATION_METHODS.md) - API vs. local mode comparison
|
|
361
|
+
- [OPENCLAW_TOOLS_AND_POLICIES.md](OPENCLAW_TOOLS_AND_POLICIES.md) - Tool → policy mapping
|
|
362
|
+
- [test-remote-passport-api.sh](../tests/test-remote-passport-api.sh) - Test script for hosted passports
|