@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.
Files changed (237) hide show
  1. package/LICENSE +217 -0
  2. package/README.md +481 -0
  3. package/bin/agent-guardrails +133 -0
  4. package/bin/aport-create-passport.sh +444 -0
  5. package/bin/aport-cursor-hook.sh +90 -0
  6. package/bin/aport-guardrail-api.sh +108 -0
  7. package/bin/aport-guardrail-bash.sh +394 -0
  8. package/bin/aport-guardrail-v2.sh +5 -0
  9. package/bin/aport-guardrail.sh +5 -0
  10. package/bin/aport-resolve-paths.sh +71 -0
  11. package/bin/aport-status.sh +276 -0
  12. package/bin/frameworks/crewai.sh +49 -0
  13. package/bin/frameworks/cursor.sh +95 -0
  14. package/bin/frameworks/langchain.sh +48 -0
  15. package/bin/frameworks/n8n.sh +36 -0
  16. package/bin/frameworks/openclaw.sh +19 -0
  17. package/bin/lib/allowlist.sh +18 -0
  18. package/bin/lib/common.sh +28 -0
  19. package/bin/lib/config.sh +46 -0
  20. package/bin/lib/constants.sh +232 -0
  21. package/bin/lib/detect.sh +65 -0
  22. package/bin/lib/error.sh +269 -0
  23. package/bin/lib/passport.sh +19 -0
  24. package/bin/lib/templates/.gitkeep +1 -0
  25. package/bin/lib/templates/config.yaml +6 -0
  26. package/bin/lib/validation.sh +206 -0
  27. package/bin/openclaw +660 -0
  28. package/docs/ADDING_A_FRAMEWORK.md +87 -0
  29. package/docs/AGENTS.md.example +40 -0
  30. package/docs/CODE_REVIEW.md +192 -0
  31. package/docs/DEPLOYMENT_READINESS.md +81 -0
  32. package/docs/FAQ_SECURITY_SCANNERS.md +373 -0
  33. package/docs/FRAMEWORK_ROADMAP.md +41 -0
  34. package/docs/HOSTED_PASSPORT_SETUP.md +362 -0
  35. package/docs/IMPLEMENTING_YOUR_OWN_EVALUATOR.md +433 -0
  36. package/docs/OPENCLAW_COMPATIBILITY.md +73 -0
  37. package/docs/OPENCLAW_LOCAL_INTEGRATION.md +596 -0
  38. package/docs/OPENCLAW_TOOLS_AND_POLICIES.md +54 -0
  39. package/docs/QUICKSTART.md +470 -0
  40. package/docs/QUICKSTART_OPENCLAW_PLUGIN.md +470 -0
  41. package/docs/README.md +28 -0
  42. package/docs/RELEASE.md +87 -0
  43. package/docs/REPO_LAYOUT.md +47 -0
  44. package/docs/SKILLS_ECOSYSTEM_ANALYSIS_FEB17.md +1260 -0
  45. package/docs/TOOL_POLICY_MAPPING.md +46 -0
  46. package/docs/UPGRADE.md +46 -0
  47. package/docs/VERIFICATION_METHODS.md +97 -0
  48. package/docs/assets/README.md +8 -0
  49. package/docs/assets/porter.svg +54 -0
  50. package/docs/development/ERROR_CODES.md +616 -0
  51. package/docs/frameworks/GITHUB_ISSUE_PROPOSALS.md +1105 -0
  52. package/docs/frameworks/crewai.md +114 -0
  53. package/docs/frameworks/cursor.md +159 -0
  54. package/docs/frameworks/langchain.md +72 -0
  55. package/docs/frameworks/n8n.md +40 -0
  56. package/docs/frameworks/openclaw.md +40 -0
  57. package/docs/launch/ADD_APORT_AWESOME_LISTS_INSTRUCTIONS.md +146 -0
  58. package/docs/launch/ANNOUNCEMENT_GUIDE.md +266 -0
  59. package/docs/launch/AWESOME_REPOS.md +53 -0
  60. package/docs/launch/CURSOR_VSCODE_HOOKS_RESEARCH.md +77 -0
  61. package/docs/launch/DEMO_TERMINAL_OUTPUT.txt +48 -0
  62. package/docs/launch/DRY_AND_PLAN_CHECKLIST.md +47 -0
  63. package/docs/launch/EVIDENCE_README.md +61 -0
  64. package/docs/launch/EVIDENCE_TERMINAL_CAPTURE.txt +10 -0
  65. package/docs/launch/FRAMEWORK_SUPPORT_PLAN.md +1640 -0
  66. package/docs/launch/LAUNCH_READINESS_CHECKLIST.md +237 -0
  67. package/docs/launch/LAUNCH_STRATEGY_SUMMARY.md +464 -0
  68. package/docs/launch/OPENCLAW_FEEDBACK_AND_FIXES.md +85 -0
  69. package/docs/launch/POST_1_VALENTINE_IMPROVED.md +233 -0
  70. package/docs/launch/POST_2_GUARDRAIL_IMPROVED.md +369 -0
  71. package/docs/launch/PRE_LAUNCH_FIXES.md +766 -0
  72. package/docs/launch/QUICK_LAUNCH_CHECKLIST.md +400 -0
  73. package/docs/launch/READINESS_SUMMARY.md +262 -0
  74. package/docs/launch/README.md +68 -0
  75. package/docs/launch/USER_STORIES.md +327 -0
  76. package/docs/launch/scripts/add-aport-awesome-pr.sh +69 -0
  77. package/docs/operations/MONITORING.md +588 -0
  78. package/docs/reviews/2026-02-18-staff-review.md +268 -0
  79. package/extensions/openclaw-aport/README.md +415 -0
  80. package/extensions/openclaw-aport/index.js +625 -0
  81. package/extensions/openclaw-aport/openclaw-aport.js +7 -0
  82. package/extensions/openclaw-aport/openclaw.plugin.json +46 -0
  83. package/extensions/openclaw-aport/package.json +36 -0
  84. package/extensions/openclaw-aport/test.js +307 -0
  85. package/external/aport-policies/README.md +363 -0
  86. package/external/aport-policies/agent.session.create.v1/README.md +345 -0
  87. package/external/aport-policies/agent.session.create.v1/policy.json +162 -0
  88. package/external/aport-policies/agent.tool.register.v1/README.md +361 -0
  89. package/external/aport-policies/agent.tool.register.v1/policy.json +172 -0
  90. package/external/aport-policies/code.release.publish.v1/README.md +51 -0
  91. package/external/aport-policies/code.release.publish.v1/policy.json +121 -0
  92. package/external/aport-policies/code.repository.merge.v1/README.md +287 -0
  93. package/external/aport-policies/code.repository.merge.v1/express.example.js +332 -0
  94. package/external/aport-policies/code.repository.merge.v1/fastapi.example.py +370 -0
  95. package/external/aport-policies/code.repository.merge.v1/policy.json +162 -0
  96. package/external/aport-policies/data.export.create.v1/README.md +226 -0
  97. package/external/aport-policies/data.export.create.v1/express.example.js +172 -0
  98. package/external/aport-policies/data.export.create.v1/fastapi.example.py +165 -0
  99. package/external/aport-policies/data.export.create.v1/policy.json +133 -0
  100. package/external/aport-policies/data.report.ingest.v1/README.md +134 -0
  101. package/external/aport-policies/data.report.ingest.v1/express.example.js +105 -0
  102. package/external/aport-policies/data.report.ingest.v1/minimal-example.js +68 -0
  103. package/external/aport-policies/data.report.ingest.v1/policy.json +174 -0
  104. package/external/aport-policies/finance.crypto.trade.v1/README.md +146 -0
  105. package/external/aport-policies/finance.crypto.trade.v1/express.example.js +109 -0
  106. package/external/aport-policies/finance.crypto.trade.v1/minimal-example.js +65 -0
  107. package/external/aport-policies/finance.crypto.trade.v1/policy.json +176 -0
  108. package/external/aport-policies/finance.payment.charge.v1/README.md +326 -0
  109. package/external/aport-policies/finance.payment.charge.v1/express.example.js +250 -0
  110. package/external/aport-policies/finance.payment.charge.v1/fastapi.example.py +227 -0
  111. package/external/aport-policies/finance.payment.charge.v1/minimal-example.js +64 -0
  112. package/external/aport-policies/finance.payment.charge.v1/policy.json +224 -0
  113. package/external/aport-policies/finance.payment.charge.v1/tests/contexts.jsonl +12 -0
  114. package/external/aport-policies/finance.payment.charge.v1/tests/expected.jsonl +12 -0
  115. package/external/aport-policies/finance.payment.charge.v1/tests/passport.instance.json +42 -0
  116. package/external/aport-policies/finance.payment.charge.v1/tests/passport.template.json +40 -0
  117. package/external/aport-policies/finance.payment.charge.v1/tests/payments-charge-policy.test.js +817 -0
  118. package/external/aport-policies/finance.payment.charge.v1/tests/test_payments_charge_policy.py +486 -0
  119. package/external/aport-policies/finance.payment.payout.v1/README.md +78 -0
  120. package/external/aport-policies/finance.payment.payout.v1/policy.json +181 -0
  121. package/external/aport-policies/finance.payment.refund.v1/README.md +275 -0
  122. package/external/aport-policies/finance.payment.refund.v1/express.example.js +167 -0
  123. package/external/aport-policies/finance.payment.refund.v1/fastapi.example.py +136 -0
  124. package/external/aport-policies/finance.payment.refund.v1/minimal-example.js +183 -0
  125. package/external/aport-policies/finance.payment.refund.v1/policy.json +216 -0
  126. package/external/aport-policies/finance.payment.refund.v1/tests/refunds-policy.test.js +924 -0
  127. package/external/aport-policies/finance.payment.refund.v1/tests/test_refunds_policy.py +778 -0
  128. package/external/aport-policies/finance.transaction.execute.v1/README.md +309 -0
  129. package/external/aport-policies/finance.transaction.execute.v1/express.example.js +261 -0
  130. package/external/aport-policies/finance.transaction.execute.v1/fastapi.example.py +231 -0
  131. package/external/aport-policies/finance.transaction.execute.v1/minimal-example.js +78 -0
  132. package/external/aport-policies/finance.transaction.execute.v1/policy.json +189 -0
  133. package/external/aport-policies/finance.transaction.execute.v1/tests/contexts.jsonl +12 -0
  134. package/external/aport-policies/finance.transaction.execute.v1/tests/expected.jsonl +12 -0
  135. package/external/aport-policies/finance.transaction.execute.v1/tests/passport.instance.json +42 -0
  136. package/external/aport-policies/finance.transaction.execute.v1/tests/passport.template.json +42 -0
  137. package/external/aport-policies/finance.transaction.execute.v1/tests/test_transactions_policy.py +214 -0
  138. package/external/aport-policies/finance.transaction.execute.v1/tests/transactions-policy.test.js +306 -0
  139. package/external/aport-policies/governance.data.access.v1/README.md +292 -0
  140. package/external/aport-policies/governance.data.access.v1/express.example.js +321 -0
  141. package/external/aport-policies/governance.data.access.v1/fastapi.example.py +279 -0
  142. package/external/aport-policies/governance.data.access.v1/minimal-example.js +65 -0
  143. package/external/aport-policies/governance.data.access.v1/policy.json +208 -0
  144. package/external/aport-policies/governance.data.access.v1/tests/contexts.jsonl +12 -0
  145. package/external/aport-policies/governance.data.access.v1/tests/data-access-policy.test.js +308 -0
  146. package/external/aport-policies/governance.data.access.v1/tests/expected.jsonl +12 -0
  147. package/external/aport-policies/governance.data.access.v1/tests/passport.instance.json +56 -0
  148. package/external/aport-policies/governance.data.access.v1/tests/passport.template.json +56 -0
  149. package/external/aport-policies/governance.data.access.v1/tests/test_data_access_policy.py +214 -0
  150. package/external/aport-policies/legal.contract.review.v1/README.md +109 -0
  151. package/external/aport-policies/legal.contract.review.v1/policy.json +378 -0
  152. package/external/aport-policies/legal.contract.review.v1/tests/legal-contract-review-policy.test.js +609 -0
  153. package/external/aport-policies/legal.contract.review.v1/tests/passport.template.json +49 -0
  154. package/external/aport-policies/mcp.tool.execute.v1/README.md +301 -0
  155. package/external/aport-policies/mcp.tool.execute.v1/policy.json +141 -0
  156. package/external/aport-policies/messaging.message.send.v1/README.md +230 -0
  157. package/external/aport-policies/messaging.message.send.v1/express.example.js +183 -0
  158. package/external/aport-policies/messaging.message.send.v1/fastapi.example.py +193 -0
  159. package/external/aport-policies/messaging.message.send.v1/policy.json +144 -0
  160. package/external/aport-policies/policy-template.json +107 -0
  161. package/external/aport-policies/system.command.execute.v1/README.md +275 -0
  162. package/external/aport-policies/system.command.execute.v1/policy.json +146 -0
  163. package/external/aport-spec/CONTRIBUTING.md +273 -0
  164. package/external/aport-spec/LICENSE +21 -0
  165. package/external/aport-spec/README.md +168 -0
  166. package/external/aport-spec/conformance/README.md +294 -0
  167. package/external/aport-spec/conformance/cases/data.export.v1/contexts/allow_users.json +6 -0
  168. package/external/aport-spec/conformance/cases/data.export.v1/contexts/deny_pii.json +6 -0
  169. package/external/aport-spec/conformance/cases/data.export.v1/expected/allow_users.decision.json +19 -0
  170. package/external/aport-spec/conformance/cases/data.export.v1/expected/deny_pii.decision.json +19 -0
  171. package/external/aport-spec/conformance/cases/data.export.v1/passports/template.json +29 -0
  172. package/external/aport-spec/conformance/cases/payments.refunds.v1/contexts/allow_50usd.json +9 -0
  173. package/external/aport-spec/conformance/cases/payments.refunds.v1/contexts/deny_150usd.json +9 -0
  174. package/external/aport-spec/conformance/cases/payments.refunds.v1/contexts/deny_currency.json +9 -0
  175. package/external/aport-spec/conformance/cases/payments.refunds.v1/expected/allow_50usd.decision.json +19 -0
  176. package/external/aport-spec/conformance/cases/payments.refunds.v1/expected/deny_150usd.decision.json +19 -0
  177. package/external/aport-spec/conformance/cases/payments.refunds.v1/expected/deny_currency.decision.json +19 -0
  178. package/external/aport-spec/conformance/cases/payments.refunds.v1/passports/template.json +42 -0
  179. package/external/aport-spec/conformance/package.json +44 -0
  180. package/external/aport-spec/conformance/pnpm-lock.yaml +642 -0
  181. package/external/aport-spec/conformance/src/cases.ts +371 -0
  182. package/external/aport-spec/conformance/src/ed25519.ts +167 -0
  183. package/external/aport-spec/conformance/src/jcs.ts +85 -0
  184. package/external/aport-spec/conformance/src/runner.ts +533 -0
  185. package/external/aport-spec/conformance/src/validators.ts +185 -0
  186. package/external/aport-spec/conformance/test-runner.js +315 -0
  187. package/external/aport-spec/conformance/tsconfig.json +21 -0
  188. package/external/aport-spec/error-schema.json +192 -0
  189. package/external/aport-spec/index.json +12 -0
  190. package/external/aport-spec/integrations/clawmoat/README.md +12 -0
  191. package/external/aport-spec/integrations/shield/README.md +245 -0
  192. package/external/aport-spec/integrations/shield/adapters/index.js +116 -0
  193. package/external/aport-spec/integrations/shield/adapters/system-command-execute.js +133 -0
  194. package/external/aport-spec/integrations/shield/test/README.md +58 -0
  195. package/external/aport-spec/integrations/shield/test/shield.md +40 -0
  196. package/external/aport-spec/integrations/shield/test/test-shield-to-verify.js +274 -0
  197. package/external/aport-spec/metrics-schema.json +504 -0
  198. package/external/aport-spec/oap/CHANGELOG.md +54 -0
  199. package/external/aport-spec/oap/VERSION.md +40 -0
  200. package/external/aport-spec/oap/capability-registry.md +229 -0
  201. package/external/aport-spec/oap/conformance.md +257 -0
  202. package/external/aport-spec/oap/decision-schema.json +114 -0
  203. package/external/aport-spec/oap/examples/context.refund.usd.50.json +9 -0
  204. package/external/aport-spec/oap/examples/decision.allow.sample.json +20 -0
  205. package/external/aport-spec/oap/examples/decision.deny.sample.json +23 -0
  206. package/external/aport-spec/oap/examples/passport.instance.v1.json +50 -0
  207. package/external/aport-spec/oap/examples/passport.template.v1.json +71 -0
  208. package/external/aport-spec/oap/oap-spec.md +426 -0
  209. package/external/aport-spec/oap/passport-schema.json +396 -0
  210. package/external/aport-spec/oap/security.md +213 -0
  211. package/external/aport-spec/oap/vc/context-oap-v1.jsonld +137 -0
  212. package/external/aport-spec/oap/vc/examples/oap-decision-vc.json +37 -0
  213. package/external/aport-spec/oap/vc/examples/oap-passport-vc.json +68 -0
  214. package/external/aport-spec/oap/vc/tools/INTEGRATION.md +375 -0
  215. package/external/aport-spec/oap/vc/tools/README.md +278 -0
  216. package/external/aport-spec/oap/vc/tools/examples/decision-to-vc.js +66 -0
  217. package/external/aport-spec/oap/vc/tools/examples/passport-to-vc.js +83 -0
  218. package/external/aport-spec/oap/vc/tools/examples/vc-to-decision.js +77 -0
  219. package/external/aport-spec/oap/vc/tools/examples/vc-to-passport.js +94 -0
  220. package/external/aport-spec/oap/vc/tools/package.json +38 -0
  221. package/external/aport-spec/oap/vc/tools/pnpm-lock.yaml +472 -0
  222. package/external/aport-spec/oap/vc/tools/src/cli.ts +226 -0
  223. package/external/aport-spec/oap/vc/tools/src/crypto-utils.ts +427 -0
  224. package/external/aport-spec/oap/vc/tools/src/index.ts +653 -0
  225. package/external/aport-spec/oap/vc/tools/src/test.ts +148 -0
  226. package/external/aport-spec/oap/vc/tools/src/vp.ts +382 -0
  227. package/external/aport-spec/oap/vc/tools/test-simple.js +214 -0
  228. package/external/aport-spec/oap/vc/tools/tsconfig.json +19 -0
  229. package/external/aport-spec/oap/vc/vc-mapping.md +443 -0
  230. package/external/aport-spec/passport-schema.json +586 -0
  231. package/external/aport-spec/rate-limiting.md +136 -0
  232. package/external/aport-spec/transport-profile.md +325 -0
  233. package/external/aport-spec/webhook-spec.md +314 -0
  234. package/package.json +70 -0
  235. package/skills/aport-agent-guardrail/SKILL.md +314 -0
  236. package/src/evaluator.js +252 -0
  237. 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** | ✅ &lt;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 &lt;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