agent-passport-system 1.21.8 → 1.24.0

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 (198) hide show
  1. package/README.md +4 -4
  2. package/dist/src/adapters/a2a.d.ts +30 -0
  3. package/dist/src/adapters/a2a.d.ts.map +1 -0
  4. package/dist/src/adapters/a2a.js +53 -0
  5. package/dist/src/adapters/a2a.js.map +1 -0
  6. package/dist/src/adapters/adk.d.ts +26 -0
  7. package/dist/src/adapters/adk.d.ts.map +1 -0
  8. package/dist/src/adapters/adk.js +50 -0
  9. package/dist/src/adapters/adk.js.map +1 -0
  10. package/dist/src/adapters/crewai.d.ts +43 -0
  11. package/dist/src/adapters/crewai.d.ts.map +1 -0
  12. package/dist/src/adapters/crewai.js +52 -0
  13. package/dist/src/adapters/crewai.js.map +1 -0
  14. package/dist/src/adapters/governance-hook.d.ts +94 -0
  15. package/dist/src/adapters/governance-hook.d.ts.map +1 -0
  16. package/dist/src/adapters/governance-hook.js +123 -0
  17. package/dist/src/adapters/governance-hook.js.map +1 -0
  18. package/dist/src/adapters/langchain.d.ts +25 -0
  19. package/dist/src/adapters/langchain.d.ts.map +1 -0
  20. package/dist/src/adapters/langchain.js +66 -0
  21. package/dist/src/adapters/langchain.js.map +1 -0
  22. package/dist/src/conformance/suite.d.ts +35 -0
  23. package/dist/src/conformance/suite.d.ts.map +1 -0
  24. package/dist/src/conformance/suite.js +255 -0
  25. package/dist/src/conformance/suite.js.map +1 -0
  26. package/dist/src/core/agora.d.ts.map +1 -1
  27. package/dist/src/core/agora.js +1 -0
  28. package/dist/src/core/agora.js.map +1 -1
  29. package/dist/src/core/aps-txt.d.ts +120 -0
  30. package/dist/src/core/aps-txt.d.ts.map +1 -0
  31. package/dist/src/core/aps-txt.js +172 -0
  32. package/dist/src/core/aps-txt.js.map +1 -0
  33. package/dist/src/core/attribution.d.ts.map +1 -1
  34. package/dist/src/core/attribution.js +1 -0
  35. package/dist/src/core/attribution.js.map +1 -1
  36. package/dist/src/core/commerce.d.ts.map +1 -1
  37. package/dist/src/core/commerce.js +1 -0
  38. package/dist/src/core/commerce.js.map +1 -1
  39. package/dist/src/core/coordination.d.ts.map +1 -1
  40. package/dist/src/core/coordination.js +1 -0
  41. package/dist/src/core/coordination.js.map +1 -1
  42. package/dist/src/core/data-lifecycle.d.ts.map +1 -1
  43. package/dist/src/core/data-lifecycle.js +1 -0
  44. package/dist/src/core/data-lifecycle.js.map +1 -1
  45. package/dist/src/core/decision-equivalence.d.ts.map +1 -1
  46. package/dist/src/core/decision-equivalence.js +1 -0
  47. package/dist/src/core/decision-equivalence.js.map +1 -1
  48. package/dist/src/core/delegation.d.ts.map +1 -1
  49. package/dist/src/core/delegation.js +1 -0
  50. package/dist/src/core/delegation.js.map +1 -1
  51. package/dist/src/core/did.d.ts.map +1 -1
  52. package/dist/src/core/did.js +1 -0
  53. package/dist/src/core/did.js.map +1 -1
  54. package/dist/src/core/entity-verification.d.ts.map +1 -1
  55. package/dist/src/core/entity-verification.js +1 -0
  56. package/dist/src/core/entity-verification.js.map +1 -1
  57. package/dist/src/core/execution-envelope.d.ts.map +1 -1
  58. package/dist/src/core/execution-envelope.js +1 -0
  59. package/dist/src/core/execution-envelope.js.map +1 -1
  60. package/dist/src/core/gateway.d.ts.map +1 -1
  61. package/dist/src/core/gateway.js +1 -0
  62. package/dist/src/core/gateway.js.map +1 -1
  63. package/dist/src/core/governance-block.d.ts +131 -0
  64. package/dist/src/core/governance-block.d.ts.map +1 -0
  65. package/dist/src/core/governance-block.js +149 -0
  66. package/dist/src/core/governance-block.js.map +1 -0
  67. package/dist/src/core/governance-consumer.d.ts +113 -0
  68. package/dist/src/core/governance-consumer.d.ts.map +1 -0
  69. package/dist/src/core/governance-consumer.js +124 -0
  70. package/dist/src/core/governance-consumer.js.map +1 -0
  71. package/dist/src/core/intent.d.ts.map +1 -1
  72. package/dist/src/core/intent.js +1 -0
  73. package/dist/src/core/intent.js.map +1 -1
  74. package/dist/src/core/passport.d.ts.map +1 -1
  75. package/dist/src/core/passport.js +1 -0
  76. package/dist/src/core/passport.js.map +1 -1
  77. package/dist/src/core/policy.d.ts.map +1 -1
  78. package/dist/src/core/policy.js +1 -0
  79. package/dist/src/core/policy.js.map +1 -1
  80. package/dist/src/core/principal.d.ts.map +1 -1
  81. package/dist/src/core/principal.js +1 -0
  82. package/dist/src/core/principal.js.map +1 -1
  83. package/dist/src/core/values.d.ts.map +1 -1
  84. package/dist/src/core/values.js +1 -0
  85. package/dist/src/core/values.js.map +1 -1
  86. package/dist/src/index.d.ts +18 -0
  87. package/dist/src/index.d.ts.map +1 -1
  88. package/dist/src/index.js +25 -0
  89. package/dist/src/index.js.map +1 -1
  90. package/dist/src/interop/agent-json-bridge.d.ts.map +1 -1
  91. package/dist/src/interop/agent-json-bridge.js +1 -0
  92. package/dist/src/interop/agent-json-bridge.js.map +1 -1
  93. package/dist/src/interop/qntm-bridge.d.ts.map +1 -1
  94. package/dist/src/interop/qntm-bridge.js +1 -0
  95. package/dist/src/interop/qntm-bridge.js.map +1 -1
  96. package/dist/src/types/data-lifecycle.d.ts.map +1 -1
  97. package/dist/src/types/data-lifecycle.js +1 -0
  98. package/dist/src/types/data-lifecycle.js.map +1 -1
  99. package/dist/src/types/decision-equivalence.d.ts.map +1 -1
  100. package/dist/src/types/decision-equivalence.js +1 -0
  101. package/dist/src/types/decision-equivalence.js.map +1 -1
  102. package/dist/src/v2/affected-party.d.ts.map +1 -1
  103. package/dist/src/v2/affected-party.js +1 -0
  104. package/dist/src/v2/affected-party.js.map +1 -1
  105. package/dist/src/v2/amendment.d.ts.map +1 -1
  106. package/dist/src/v2/amendment.js +1 -0
  107. package/dist/src/v2/amendment.js.map +1 -1
  108. package/dist/src/v2/anomaly-v2.d.ts.map +1 -1
  109. package/dist/src/v2/anomaly-v2.js +1 -0
  110. package/dist/src/v2/anomaly-v2.js.map +1 -1
  111. package/dist/src/v2/approval-fatigue.d.ts.map +1 -1
  112. package/dist/src/v2/approval-fatigue.js +1 -0
  113. package/dist/src/v2/approval-fatigue.js.map +1 -1
  114. package/dist/src/v2/attestation-v2.d.ts.map +1 -1
  115. package/dist/src/v2/attestation-v2.js +1 -0
  116. package/dist/src/v2/attestation-v2.js.map +1 -1
  117. package/dist/src/v2/blind-evaluation.d.ts.map +1 -1
  118. package/dist/src/v2/blind-evaluation.js +1 -0
  119. package/dist/src/v2/blind-evaluation.js.map +1 -1
  120. package/dist/src/v2/bridge.d.ts.map +1 -1
  121. package/dist/src/v2/bridge.js +1 -0
  122. package/dist/src/v2/bridge.js.map +1 -1
  123. package/dist/src/v2/cascade-correlation.d.ts.map +1 -1
  124. package/dist/src/v2/cascade-correlation.js +1 -0
  125. package/dist/src/v2/cascade-correlation.js.map +1 -1
  126. package/dist/src/v2/circuit-breakers.d.ts.map +1 -1
  127. package/dist/src/v2/circuit-breakers.js +1 -0
  128. package/dist/src/v2/circuit-breakers.js.map +1 -1
  129. package/dist/src/v2/composite-audit.d.ts.map +1 -1
  130. package/dist/src/v2/composite-audit.js +1 -0
  131. package/dist/src/v2/composite-audit.js.map +1 -1
  132. package/dist/src/v2/cross-chain-audit.d.ts.map +1 -1
  133. package/dist/src/v2/cross-chain-audit.js +1 -0
  134. package/dist/src/v2/cross-chain-audit.js.map +1 -1
  135. package/dist/src/v2/delegation-v2.d.ts.map +1 -1
  136. package/dist/src/v2/delegation-v2.js +1 -0
  137. package/dist/src/v2/delegation-v2.js.map +1 -1
  138. package/dist/src/v2/effect-enforcement.d.ts.map +1 -1
  139. package/dist/src/v2/effect-enforcement.js +1 -0
  140. package/dist/src/v2/effect-enforcement.js.map +1 -1
  141. package/dist/src/v2/effect-sampling.d.ts.map +1 -1
  142. package/dist/src/v2/effect-sampling.js +1 -0
  143. package/dist/src/v2/effect-sampling.js.map +1 -1
  144. package/dist/src/v2/emergence.d.ts.map +1 -1
  145. package/dist/src/v2/emergence.js +1 -0
  146. package/dist/src/v2/emergence.js.map +1 -1
  147. package/dist/src/v2/emergency-v2.d.ts.map +1 -1
  148. package/dist/src/v2/emergency-v2.js +1 -0
  149. package/dist/src/v2/emergency-v2.js.map +1 -1
  150. package/dist/src/v2/epistemic-isolation.d.ts.map +1 -1
  151. package/dist/src/v2/epistemic-isolation.js +1 -0
  152. package/dist/src/v2/epistemic-isolation.js.map +1 -1
  153. package/dist/src/v2/externality.d.ts.map +1 -1
  154. package/dist/src/v2/externality.js +1 -0
  155. package/dist/src/v2/externality.js.map +1 -1
  156. package/dist/src/v2/governance-drift.d.ts.map +1 -1
  157. package/dist/src/v2/governance-drift.js +1 -0
  158. package/dist/src/v2/governance-drift.js.map +1 -1
  159. package/dist/src/v2/inaction-audit.d.ts.map +1 -1
  160. package/dist/src/v2/inaction-audit.js +1 -0
  161. package/dist/src/v2/inaction-audit.js.map +1 -1
  162. package/dist/src/v2/index.d.ts.map +1 -1
  163. package/dist/src/v2/index.js +1 -0
  164. package/dist/src/v2/index.js.map +1 -1
  165. package/dist/src/v2/intent-binding.d.ts.map +1 -1
  166. package/dist/src/v2/intent-binding.js +1 -0
  167. package/dist/src/v2/intent-binding.js.map +1 -1
  168. package/dist/src/v2/migration-v2.d.ts.map +1 -1
  169. package/dist/src/v2/migration-v2.js +1 -0
  170. package/dist/src/v2/migration-v2.js.map +1 -1
  171. package/dist/src/v2/outcome-v2.d.ts.map +1 -1
  172. package/dist/src/v2/outcome-v2.js +1 -0
  173. package/dist/src/v2/outcome-v2.js.map +1 -1
  174. package/dist/src/v2/output-proportionality.d.ts.map +1 -1
  175. package/dist/src/v2/output-proportionality.js +1 -0
  176. package/dist/src/v2/output-proportionality.js.map +1 -1
  177. package/dist/src/v2/policy-profiles.d.ts.map +1 -1
  178. package/dist/src/v2/policy-profiles.js +1 -0
  179. package/dist/src/v2/policy-profiles.js.map +1 -1
  180. package/dist/src/v2/root-transition.d.ts.map +1 -1
  181. package/dist/src/v2/root-transition.js +1 -0
  182. package/dist/src/v2/root-transition.js.map +1 -1
  183. package/dist/src/v2/semantic-drift.d.ts.map +1 -1
  184. package/dist/src/v2/semantic-drift.js +1 -0
  185. package/dist/src/v2/semantic-drift.js.map +1 -1
  186. package/dist/src/v2/semantic-scoping.d.ts.map +1 -1
  187. package/dist/src/v2/semantic-scoping.js +1 -0
  188. package/dist/src/v2/semantic-scoping.js.map +1 -1
  189. package/dist/src/v2/separation-of-powers.d.ts.map +1 -1
  190. package/dist/src/v2/separation-of-powers.js +1 -0
  191. package/dist/src/v2/separation-of-powers.js.map +1 -1
  192. package/dist/src/v2/types.d.ts.map +1 -1
  193. package/dist/src/v2/types.js +1 -0
  194. package/dist/src/v2/types.js.map +1 -1
  195. package/dist/src/v2/values-override.d.ts.map +1 -1
  196. package/dist/src/v2/values-override.js +1 -0
  197. package/dist/src/v2/values-override.js.map +1 -1
  198. package/package.json +2 -2
package/README.md CHANGED
@@ -9,7 +9,7 @@
9
9
 
10
10
  Cryptographic identity, ethical governance, economic attribution, data source registration, protocol-native communication, intent architecture, cascade revocation, coordination primitives, and agentic commerce for autonomous AI agents.
11
11
 
12
- **42 core modules + 32 v2 constitutional modules. 1358 tests. Zero heavy dependencies. Running code. MCP server included.**
12
+ **42 core modules + 32 v2 constitutional modules. 1445 tests. Zero heavy dependencies. Running code. MCP server included.**
13
13
 
14
14
  > *As AI agents from different creators, running different models, serving different humans begin to collaborate — who is responsible, under what authority, according to what values, and who benefits?*
15
15
 
@@ -409,7 +409,7 @@ Or zero-install remote mode:
409
409
  npx agent-passport-system-mcp setup --remote
410
410
  ```
411
411
 
412
- **98 tools across all 44 modules, role-scoped access control.** Identity, delegation, agora, values/policy, coordination, and commerce — all accessible via MCP. Every operation Ed25519 signed. Auto-configures Claude Desktop and Cursor.
412
+ **108 tools across all 48 modules, role-scoped access control.** Identity, delegation, agora, values/policy, coordination, and commerce — all accessible via MCP. Every operation Ed25519 signed. Auto-configures Claude Desktop and Cursor.
413
413
 
414
414
  Every operation is Ed25519 signed. Role is auto-detected from task assignments. Role-specific prompts served via MCP prompts API. File-backed task persistence at `~/.agent-passport-tasks.json`.
415
415
 
@@ -431,7 +431,7 @@ PyPI: [agent-passport-system](https://pypi.org/project/agent-passport-system/)
431
431
 
432
432
  ```bash
433
433
  npm test
434
- # 1358 tests across 58 files, 361 suites, 0 failures
434
+ # 1445 tests across 58 files, 380 suites, 0 failures
435
435
  ```
436
436
 
437
437
  Includes 50 adversarial tests across 4 test files: Merkle tree tampering, attribution gaming resistance, compliance violations, floor negotiation attacks, wrong-key attestations, cross-chain confused deputy, taint laundering, permit bypass, causal chain manipulation.
@@ -527,7 +527,7 @@ src/ 32 source files
527
527
  reputation-authority.ts — Reputation/tier types
528
528
  cross-chain.ts — Cross-chain taint/SAO types
529
529
  data-source.ts — Data source/access receipt types
530
- tests/ 68 test files, 1358 tests (361 suites)
530
+ tests/ 74 test files, 1445 tests (380 suites)
531
531
  adversarial.ts — 50 adversarial cases
532
532
  adversarial-paper.test.ts — 22 paper-linked attack scenarios
533
533
  adversarial-causal-chain.test.ts — 18 causal chain attacks
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Google A2A Adapter — maps A2A Agent Cards to APS passports
3
+ * and A2A Tasks to APS coordination.
4
+ *
5
+ * A2A pattern: Agent Card (discovery) → Task (work) → Artifact (output)
6
+ * APS pattern: Passport (identity) → Intent/Decision (governance) → Receipt (proof)
7
+ */
8
+ import { GovernanceHook } from './governance-hook.js';
9
+ import type { GovernanceHookConfig, GovernanceReceipt, GovernanceResult } from './governance-hook.js';
10
+ import type { A2AAgentCard } from '../types/a2a.js';
11
+ export interface A2AGovernance {
12
+ /** Map an A2A Agent Card to APS-compatible scopes */
13
+ deriveScopes: (card: A2AAgentCard) => string[];
14
+ /** Govern an A2A task send */
15
+ governTaskSend: (targetCard: A2AAgentCard, taskDescription: string, execute: () => Promise<unknown>) => Promise<{
16
+ result: unknown;
17
+ receipt: GovernanceReceipt;
18
+ governance: GovernanceResult;
19
+ }>;
20
+ /** Govern receiving a task */
21
+ governTaskReceive: (senderUrl: string, taskDescription: string, execute: () => Promise<unknown>) => Promise<{
22
+ result: unknown;
23
+ receipt: GovernanceReceipt;
24
+ governance: GovernanceResult;
25
+ }>;
26
+ get_audit_trail: () => GovernanceReceipt[];
27
+ hook: GovernanceHook;
28
+ }
29
+ export declare function createA2AGovernance(config: GovernanceHookConfig): A2AGovernance;
30
+ //# sourceMappingURL=a2a.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"a2a.d.ts","sourceRoot":"","sources":["../../../src/adapters/a2a.ts"],"names":[],"mappings":"AACA;;;;;;GAMG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,KAAK,EAAE,oBAAoB,EAAoB,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AACvH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAEnD,MAAM,WAAW,aAAa;IAC5B,qDAAqD;IACrD,YAAY,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,MAAM,EAAE,CAAA;IAC9C,8BAA8B;IAC9B,cAAc,EAAE,CACd,UAAU,EAAE,YAAY,EACxB,eAAe,EAAE,MAAM,EACvB,OAAO,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,KAC5B,OAAO,CAAC;QAAE,MAAM,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,iBAAiB,CAAC;QAAC,UAAU,EAAE,gBAAgB,CAAA;KAAE,CAAC,CAAA;IAC3F,8BAA8B;IAC9B,iBAAiB,EAAE,CACjB,SAAS,EAAE,MAAM,EACjB,eAAe,EAAE,MAAM,EACvB,OAAO,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,KAC5B,OAAO,CAAC;QAAE,MAAM,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,iBAAiB,CAAC;QAAC,UAAU,EAAE,gBAAgB,CAAA;KAAE,CAAC,CAAA;IAC3F,eAAe,EAAE,MAAM,iBAAiB,EAAE,CAAA;IAC1C,IAAI,EAAE,cAAc,CAAA;CACrB;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,oBAAoB,GAAG,aAAa,CAmD/E"}
@@ -0,0 +1,53 @@
1
+ // Copyright 2024-2026 Tymofii Pidlisnyi. Apache-2.0 license. See LICENSE.
2
+ /**
3
+ * Google A2A Adapter — maps A2A Agent Cards to APS passports
4
+ * and A2A Tasks to APS coordination.
5
+ *
6
+ * A2A pattern: Agent Card (discovery) → Task (work) → Artifact (output)
7
+ * APS pattern: Passport (identity) → Intent/Decision (governance) → Receipt (proof)
8
+ */
9
+ import { GovernanceHook } from './governance-hook.js';
10
+ export function createA2AGovernance(config) {
11
+ const hook = new GovernanceHook(config);
12
+ const deriveScopes = (card) => {
13
+ const scopes = [];
14
+ if (card.skills) {
15
+ for (const skill of card.skills) {
16
+ scopes.push(`a2a:skill:${skill.id}`);
17
+ }
18
+ }
19
+ if (card.capabilities?.streaming)
20
+ scopes.push('a2a:streaming');
21
+ if (card.capabilities?.pushNotifications)
22
+ scopes.push('a2a:push');
23
+ if (scopes.length === 0)
24
+ scopes.push('a2a:task:execute');
25
+ return scopes;
26
+ };
27
+ const governTaskSend = async (targetCard, taskDescription, execute) => {
28
+ const action = {
29
+ type: 'a2a:task:send',
30
+ target: targetCard.url,
31
+ scopeRequired: 'a2a:task:execute',
32
+ metadata: { targetName: targetCard.name, task: taskDescription.slice(0, 200) },
33
+ };
34
+ return hook.wrap(action, execute);
35
+ };
36
+ const governTaskReceive = async (senderUrl, taskDescription, execute) => {
37
+ const action = {
38
+ type: 'a2a:task:receive',
39
+ target: senderUrl,
40
+ scopeRequired: 'a2a:task:execute',
41
+ metadata: { sender: senderUrl, task: taskDescription.slice(0, 200) },
42
+ };
43
+ return hook.wrap(action, execute);
44
+ };
45
+ return {
46
+ deriveScopes,
47
+ governTaskSend,
48
+ governTaskReceive,
49
+ get_audit_trail: () => hook.getReceipts(),
50
+ hook,
51
+ };
52
+ }
53
+ //# sourceMappingURL=a2a.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"a2a.js","sourceRoot":"","sources":["../../../src/adapters/a2a.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E;;;;;;GAMG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAuBrD,MAAM,UAAU,mBAAmB,CAAC,MAA4B;IAC9D,MAAM,IAAI,GAAG,IAAI,cAAc,CAAC,MAAM,CAAC,CAAA;IAEvC,MAAM,YAAY,GAAG,CAAC,IAAkB,EAAY,EAAE;QACpD,MAAM,MAAM,GAAa,EAAE,CAAA;QAC3B,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBAChC,MAAM,CAAC,IAAI,CAAC,aAAa,KAAK,CAAC,EAAE,EAAE,CAAC,CAAA;YACtC,CAAC;QACH,CAAC;QACD,IAAI,IAAI,CAAC,YAAY,EAAE,SAAS;YAAE,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;QAC9D,IAAI,IAAI,CAAC,YAAY,EAAE,iBAAiB;YAAE,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;QACjE,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAA;QACxD,OAAO,MAAM,CAAA;IACf,CAAC,CAAA;IAED,MAAM,cAAc,GAAG,KAAK,EAC1B,UAAwB,EACxB,eAAuB,EACvB,OAA+B,EAC/B,EAAE;QACF,MAAM,MAAM,GAAqB;YAC/B,IAAI,EAAE,eAAe;YACrB,MAAM,EAAE,UAAU,CAAC,GAAG;YACtB,aAAa,EAAE,kBAAkB;YACjC,QAAQ,EAAE,EAAE,UAAU,EAAE,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,eAAe,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE;SAC/E,CAAA;QACD,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACnC,CAAC,CAAA;IAED,MAAM,iBAAiB,GAAG,KAAK,EAC7B,SAAiB,EACjB,eAAuB,EACvB,OAA+B,EAC/B,EAAE;QACF,MAAM,MAAM,GAAqB;YAC/B,IAAI,EAAE,kBAAkB;YACxB,MAAM,EAAE,SAAS;YACjB,aAAa,EAAE,kBAAkB;YACjC,QAAQ,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,eAAe,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE;SACrE,CAAA;QACD,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACnC,CAAC,CAAA;IAED,OAAO;QACL,YAAY;QACZ,cAAc;QACd,iBAAiB;QACjB,eAAe,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE;QACzC,IAAI;KACL,CAAA;AACH,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Google ADK Adapter — maps ADK's GovernancePlugin pattern to APS governance.
3
+ *
4
+ * ADK pattern: before_action(context) → action → after_action(context, result)
5
+ * APS pattern: beforeAction(descriptor) → execute → afterAction(result) → receipt
6
+ */
7
+ import { GovernanceHook } from './governance-hook.js';
8
+ import type { GovernanceHookConfig, GovernanceReceipt } from './governance-hook.js';
9
+ export interface ADKActionContext {
10
+ tool_name: string;
11
+ tool_input: Record<string, unknown>;
12
+ agent_name: string;
13
+ session_id?: string;
14
+ }
15
+ export interface ADKGovernancePlugin {
16
+ before_action: (ctx: ADKActionContext) => {
17
+ allowed: boolean;
18
+ reason: string;
19
+ intentId: string;
20
+ };
21
+ after_action: (ctx: ADKActionContext, result: unknown) => GovernanceReceipt;
22
+ get_audit_trail: () => GovernanceReceipt[];
23
+ hook: GovernanceHook;
24
+ }
25
+ export declare function createADKGovernancePlugin(config: GovernanceHookConfig): ADKGovernancePlugin;
26
+ //# sourceMappingURL=adk.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adk.d.ts","sourceRoot":"","sources":["../../../src/adapters/adk.ts"],"names":[],"mappings":"AACA;;;;;GAKG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,KAAK,EAAE,oBAAoB,EAAsC,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AAEvH,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACnC,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,mBAAmB;IAClC,aAAa,EAAE,CAAC,GAAG,EAAE,gBAAgB,KAAK;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAA;IAChG,YAAY,EAAE,CAAC,GAAG,EAAE,gBAAgB,EAAE,MAAM,EAAE,OAAO,KAAK,iBAAiB,CAAA;IAC3E,eAAe,EAAE,MAAM,iBAAiB,EAAE,CAAA;IAC1C,IAAI,EAAE,cAAc,CAAA;CACrB;AAED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,oBAAoB,GAAG,mBAAmB,CA6C3F"}
@@ -0,0 +1,50 @@
1
+ // Copyright 2024-2026 Tymofii Pidlisnyi. Apache-2.0 license. See LICENSE.
2
+ /**
3
+ * Google ADK Adapter — maps ADK's GovernancePlugin pattern to APS governance.
4
+ *
5
+ * ADK pattern: before_action(context) → action → after_action(context, result)
6
+ * APS pattern: beforeAction(descriptor) → execute → afterAction(result) → receipt
7
+ */
8
+ import { GovernanceHook } from './governance-hook.js';
9
+ export function createADKGovernancePlugin(config) {
10
+ const hook = new GovernanceHook(config);
11
+ const pendingIntents = new Map();
12
+ const before_action = (ctx) => {
13
+ const action = {
14
+ type: `adk:tool:${ctx.tool_name}`,
15
+ target: ctx.tool_name,
16
+ scopeRequired: `tool:${ctx.tool_name}`,
17
+ metadata: { agent: ctx.agent_name, session: ctx.session_id, ...ctx.tool_input },
18
+ };
19
+ const governance = hook.beforeAction(action);
20
+ if (governance.verdict !== 'deny') {
21
+ pendingIntents.set(governance.intentId, { governance, action, startedAt: new Date().toISOString() });
22
+ }
23
+ return { allowed: governance.verdict !== 'deny', reason: governance.reason, intentId: governance.intentId };
24
+ };
25
+ const after_action = (ctx, _result) => {
26
+ // Find the pending intent from before_action
27
+ let pending = [...pendingIntents.entries()].find(([_, v]) => v.action.target === ctx.tool_name);
28
+ if (!pending) {
29
+ // No matching intent — create a standalone receipt
30
+ const action = {
31
+ type: `adk:tool:${ctx.tool_name}`,
32
+ target: ctx.tool_name,
33
+ scopeRequired: `tool:${ctx.tool_name}`,
34
+ metadata: { agent: ctx.agent_name },
35
+ };
36
+ const gov = hook.beforeAction(action);
37
+ return hook.afterAction(gov, action, 'success', new Date().toISOString());
38
+ }
39
+ const [intentId, { governance, action, startedAt }] = pending;
40
+ pendingIntents.delete(intentId);
41
+ return hook.afterAction(governance, action, 'success', startedAt);
42
+ };
43
+ return {
44
+ before_action,
45
+ after_action,
46
+ get_audit_trail: () => hook.getReceipts(),
47
+ hook,
48
+ };
49
+ }
50
+ //# sourceMappingURL=adk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adk.js","sourceRoot":"","sources":["../../../src/adapters/adk.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E;;;;;GAKG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAiBrD,MAAM,UAAU,yBAAyB,CAAC,MAA4B;IACpE,MAAM,IAAI,GAAG,IAAI,cAAc,CAAC,MAAM,CAAC,CAAA;IACvC,MAAM,cAAc,GAAG,IAAI,GAAG,EAAyF,CAAA;IAEvH,MAAM,aAAa,GAAG,CAAC,GAAqB,EAAE,EAAE;QAC9C,MAAM,MAAM,GAAqB;YAC/B,IAAI,EAAE,YAAY,GAAG,CAAC,SAAS,EAAE;YACjC,MAAM,EAAE,GAAG,CAAC,SAAS;YACrB,aAAa,EAAE,QAAQ,GAAG,CAAC,SAAS,EAAE;YACtC,QAAQ,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,UAAU,EAAE,OAAO,EAAE,GAAG,CAAC,UAAU,EAAE,GAAG,GAAG,CAAC,UAAU,EAAE;SAChF,CAAA;QACD,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAA;QAC5C,IAAI,UAAU,CAAC,OAAO,KAAK,MAAM,EAAE,CAAC;YAClC,cAAc,CAAC,GAAG,CAAC,UAAU,CAAC,QAAQ,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAA;QACtG,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,UAAU,CAAC,OAAO,KAAK,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,QAAQ,EAAE,UAAU,CAAC,QAAQ,EAAE,CAAA;IAC7G,CAAC,CAAA;IAGD,MAAM,YAAY,GAAG,CAAC,GAAqB,EAAE,OAAgB,EAAqB,EAAE;QAClF,6CAA6C;QAC7C,IAAI,OAAO,GAAG,CAAC,GAAG,cAAc,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,SAAS,CAAC,CAAA;QAC/F,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,mDAAmD;YACnD,MAAM,MAAM,GAAqB;gBAC/B,IAAI,EAAE,YAAY,GAAG,CAAC,SAAS,EAAE;gBACjC,MAAM,EAAE,GAAG,CAAC,SAAS;gBACrB,aAAa,EAAE,QAAQ,GAAG,CAAC,SAAS,EAAE;gBACtC,QAAQ,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,UAAU,EAAE;aACpC,CAAA;YACD,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAA;YACrC,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAA;QAC3E,CAAC;QAED,MAAM,CAAC,QAAQ,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,GAAG,OAAO,CAAA;QAC7D,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;QAC/B,OAAO,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,CAAC,CAAA;IACnE,CAAC,CAAA;IAED,OAAO;QACL,aAAa;QACb,YAAY;QACZ,eAAe,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE;QACzC,IAAI;KACL,CAAA;AACH,CAAC"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * CrewAI Adapter — wraps APS GovernanceHook for CrewAI's callback lifecycle.
3
+ *
4
+ * Usage:
5
+ * import { createCrewAIGovernance } from 'agent-passport-system'
6
+ * const gov = createCrewAIGovernance({ agentId, ...keys, delegationId, allowedScopes })
7
+ *
8
+ * // In CrewAI task config:
9
+ * task = Task(
10
+ * description="...",
11
+ * callback=gov.taskCallback
12
+ * )
13
+ *
14
+ * // Or wrap any tool call:
15
+ * const result = await gov.governedToolCall('search', { query: '...' }, searchTool)
16
+ */
17
+ import { GovernanceHook } from './governance-hook.js';
18
+ import type { GovernanceHookConfig, GovernanceReceipt, GovernanceResult } from './governance-hook.js';
19
+ export interface CrewAITaskOutput {
20
+ description: string;
21
+ result: string;
22
+ agent: string;
23
+ }
24
+ export interface CrewAIGovernance {
25
+ /** Use as CrewAI task callback */
26
+ taskCallback: (output: CrewAITaskOutput) => GovernanceReceipt;
27
+ /** Wrap a tool call with governance */
28
+ governedToolCall: <T>(toolName: string, params: Record<string, unknown>, execute: () => Promise<T>, estimatedCost?: number) => Promise<{
29
+ result: T | null;
30
+ receipt: GovernanceReceipt;
31
+ governance: GovernanceResult;
32
+ }>;
33
+ /** Get all receipts */
34
+ getReceipts: () => GovernanceReceipt[];
35
+ /** Get the underlying hook */
36
+ hook: GovernanceHook;
37
+ }
38
+ /**
39
+ * Create a CrewAI governance adapter.
40
+ * Maps CrewAI's task/tool lifecycle to APS governance.
41
+ */
42
+ export declare function createCrewAIGovernance(config: GovernanceHookConfig): CrewAIGovernance;
43
+ //# sourceMappingURL=crewai.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crewai.d.ts","sourceRoot":"","sources":["../../../src/adapters/crewai.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,KAAK,EAAE,oBAAoB,EAAoB,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AAEvH,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,gBAAgB;IAC/B,kCAAkC;IAClC,YAAY,EAAE,CAAC,MAAM,EAAE,gBAAgB,KAAK,iBAAiB,CAAA;IAC7D,uCAAuC;IACvC,gBAAgB,EAAE,CAAC,CAAC,EAClB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,OAAO,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACzB,aAAa,CAAC,EAAE,MAAM,KACnB,OAAO,CAAC;QAAE,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC;QAAC,OAAO,EAAE,iBAAiB,CAAC;QAAC,UAAU,EAAE,gBAAgB,CAAA;KAAE,CAAC,CAAA;IAC5F,uBAAuB;IACvB,WAAW,EAAE,MAAM,iBAAiB,EAAE,CAAA;IACtC,8BAA8B;IAC9B,IAAI,EAAE,cAAc,CAAA;CACrB;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,oBAAoB,GAAG,gBAAgB,CAoCrF"}
@@ -0,0 +1,52 @@
1
+ // Copyright 2024-2026 Tymofii Pidlisnyi. Apache-2.0 license. See LICENSE.
2
+ /**
3
+ * CrewAI Adapter — wraps APS GovernanceHook for CrewAI's callback lifecycle.
4
+ *
5
+ * Usage:
6
+ * import { createCrewAIGovernance } from 'agent-passport-system'
7
+ * const gov = createCrewAIGovernance({ agentId, ...keys, delegationId, allowedScopes })
8
+ *
9
+ * // In CrewAI task config:
10
+ * task = Task(
11
+ * description="...",
12
+ * callback=gov.taskCallback
13
+ * )
14
+ *
15
+ * // Or wrap any tool call:
16
+ * const result = await gov.governedToolCall('search', { query: '...' }, searchTool)
17
+ */
18
+ import { GovernanceHook } from './governance-hook.js';
19
+ /**
20
+ * Create a CrewAI governance adapter.
21
+ * Maps CrewAI's task/tool lifecycle to APS governance.
22
+ */
23
+ export function createCrewAIGovernance(config) {
24
+ const hook = new GovernanceHook(config);
25
+ const taskCallback = (output) => {
26
+ const action = {
27
+ type: 'crewai:task_complete',
28
+ target: output.description.slice(0, 100),
29
+ scopeRequired: 'task:execute',
30
+ metadata: { agent: output.agent, resultLength: output.result.length },
31
+ };
32
+ const governance = hook.beforeAction(action);
33
+ return hook.afterAction(governance, action, 'success', new Date().toISOString());
34
+ };
35
+ const governedToolCall = async (toolName, params, execute, estimatedCost) => {
36
+ const action = {
37
+ type: `crewai:tool:${toolName}`,
38
+ target: toolName,
39
+ scopeRequired: `tool:${toolName}`,
40
+ metadata: params,
41
+ estimatedCost,
42
+ };
43
+ return hook.wrap(action, execute);
44
+ };
45
+ return {
46
+ taskCallback,
47
+ governedToolCall,
48
+ getReceipts: () => hook.getReceipts(),
49
+ hook,
50
+ };
51
+ }
52
+ //# sourceMappingURL=crewai.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crewai.js","sourceRoot":"","sources":["../../../src/adapters/crewai.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAyBrD;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CAAC,MAA4B;IACjE,MAAM,IAAI,GAAG,IAAI,cAAc,CAAC,MAAM,CAAC,CAAA;IAEvC,MAAM,YAAY,GAAG,CAAC,MAAwB,EAAqB,EAAE;QACnE,MAAM,MAAM,GAAqB;YAC/B,IAAI,EAAE,sBAAsB;YAC5B,MAAM,EAAE,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;YACxC,aAAa,EAAE,cAAc;YAC7B,QAAQ,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,YAAY,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE;SACtE,CAAA;QACD,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAA;QAC5C,OAAO,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAA;IAClF,CAAC,CAAA;IAED,MAAM,gBAAgB,GAAG,KAAK,EAC5B,QAAgB,EAChB,MAA+B,EAC/B,OAAyB,EACzB,aAAsB,EACtB,EAAE;QACF,MAAM,MAAM,GAAqB;YAC/B,IAAI,EAAE,eAAe,QAAQ,EAAE;YAC/B,MAAM,EAAE,QAAQ;YAChB,aAAa,EAAE,QAAQ,QAAQ,EAAE;YACjC,QAAQ,EAAE,MAAM;YAChB,aAAa;SACd,CAAA;QACD,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACnC,CAAC,CAAA;IAED,OAAO;QACL,YAAY;QACZ,gBAAgB;QAChB,WAAW,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE;QACrC,IAAI;KACL,CAAA;AACH,CAAC"}
@@ -0,0 +1,94 @@
1
+ /**
2
+ * Generic Governance Hook — framework-agnostic adapter interface.
3
+ *
4
+ * Any agent framework (CrewAI, ADK, LangChain, AutoGen, A2A) implements
5
+ * this interface to get APS governance for free.
6
+ *
7
+ * The hook wraps the framework's action lifecycle:
8
+ * beforeAction → policy evaluation → action execution → afterAction → receipt
9
+ */
10
+ export interface GovernanceHookConfig {
11
+ agentId: string;
12
+ agentPublicKey: string;
13
+ agentPrivateKey: string;
14
+ delegationId: string;
15
+ /** Scopes this agent is authorized for */
16
+ allowedScopes: string[];
17
+ /** Values floor principles to enforce (default: all 8) */
18
+ enforcedPrinciples?: string[];
19
+ /** Maximum spend per action (for commerce) */
20
+ spendLimitPerAction?: number;
21
+ /** Whether to generate receipts for read-only actions */
22
+ receiptForReads?: boolean;
23
+ }
24
+ export interface ActionDescriptor {
25
+ /** What the agent wants to do */
26
+ type: string;
27
+ /** What it's acting on */
28
+ target: string;
29
+ /** Required scope */
30
+ scopeRequired: string;
31
+ /** Framework-specific metadata */
32
+ metadata?: Record<string, unknown>;
33
+ /** Estimated cost (for commerce actions) */
34
+ estimatedCost?: number;
35
+ }
36
+ export type GovernanceVerdict = 'permit' | 'deny' | 'narrow' | 'audit';
37
+ export interface GovernanceResult {
38
+ verdict: GovernanceVerdict;
39
+ intentId: string;
40
+ decisionId: string;
41
+ reason: string;
42
+ /** Narrowed scope if verdict is 'narrow' */
43
+ narrowedScope?: string[];
44
+ /** Policy violations if verdict is 'deny' */
45
+ violations?: string[];
46
+ }
47
+ export interface GovernanceReceipt {
48
+ receiptId: string;
49
+ intentId: string;
50
+ decisionId: string;
51
+ agentId: string;
52
+ action: ActionDescriptor;
53
+ verdict: GovernanceVerdict;
54
+ executionResult: 'success' | 'failure' | 'partial';
55
+ startedAt: string;
56
+ completedAt: string;
57
+ durationMs: number;
58
+ signature: string;
59
+ }
60
+ export declare class GovernanceHook {
61
+ private config;
62
+ private actionLog;
63
+ private totalSpend;
64
+ constructor(config: GovernanceHookConfig);
65
+ /**
66
+ * STEP 1: Before action — evaluate policy.
67
+ * Call this before the agent executes anything.
68
+ * Returns permit/deny/narrow/audit.
69
+ */
70
+ beforeAction(action: ActionDescriptor): GovernanceResult;
71
+ /**
72
+ * STEP 2: After action — generate signed receipt.
73
+ * Call this after the action completes (success or failure).
74
+ */
75
+ afterAction(result: GovernanceResult, action: ActionDescriptor, executionResult: 'success' | 'failure' | 'partial', startedAt: string): GovernanceReceipt;
76
+ /**
77
+ * CONVENIENCE: Wrap an async action with full governance lifecycle.
78
+ * beforeAction → execute → afterAction → receipt
79
+ */
80
+ wrap<T>(action: ActionDescriptor, execute: () => Promise<T>): Promise<{
81
+ result: T | null;
82
+ receipt: GovernanceReceipt;
83
+ governance: GovernanceResult;
84
+ }>;
85
+ /** Get all receipts from this session */
86
+ getReceipts(): GovernanceReceipt[];
87
+ /** Get total spend this session */
88
+ getTotalSpend(): number;
89
+ /** Verify a receipt signature */
90
+ verifyReceipt(receipt: GovernanceReceipt): boolean;
91
+ /** Get the agent's governance config (for framework registration) */
92
+ getConfig(): GovernanceHookConfig;
93
+ }
94
+ //# sourceMappingURL=governance-hook.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"governance-hook.d.ts","sourceRoot":"","sources":["../../../src/adapters/governance-hook.ts"],"names":[],"mappings":"AACA;;;;;;;;GAQG;AAYH,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAA;IACf,cAAc,EAAE,MAAM,CAAA;IACtB,eAAe,EAAE,MAAM,CAAA;IACvB,YAAY,EAAE,MAAM,CAAA;IACpB,0CAA0C;IAC1C,aAAa,EAAE,MAAM,EAAE,CAAA;IACvB,0DAA0D;IAC1D,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC7B,8CAA8C;IAC9C,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,yDAAyD;IACzD,eAAe,CAAC,EAAE,OAAO,CAAA;CAC1B;AAED,MAAM,WAAW,gBAAgB;IAC/B,iCAAiC;IACjC,IAAI,EAAE,MAAM,CAAA;IACZ,0BAA0B;IAC1B,MAAM,EAAE,MAAM,CAAA;IACd,qBAAqB;IACrB,aAAa,EAAE,MAAM,CAAA;IACrB,kCAAkC;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAClC,4CAA4C;IAC5C,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB;AAED,MAAM,MAAM,iBAAiB,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAA;AAEtE,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,iBAAiB,CAAA;IAC1B,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;IAClB,MAAM,EAAE,MAAM,CAAA;IACd,4CAA4C;IAC5C,aAAa,CAAC,EAAE,MAAM,EAAE,CAAA;IACxB,6CAA6C;IAC7C,UAAU,CAAC,EAAE,MAAM,EAAE,CAAA;CACtB;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,gBAAgB,CAAA;IACxB,OAAO,EAAE,iBAAiB,CAAA;IAC1B,eAAe,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,CAAA;IAClD,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;CAClB;AAMD,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,SAAS,CAA0B;IAC3C,OAAO,CAAC,UAAU,CAAI;gBAEV,MAAM,EAAE,oBAAoB;IAIxC;;;;OAIG;IACH,YAAY,CAAC,MAAM,EAAE,gBAAgB,GAAG,gBAAgB;IAuCxD;;;OAGG;IACH,WAAW,CACT,MAAM,EAAE,gBAAgB,EACxB,MAAM,EAAE,gBAAgB,EACxB,eAAe,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,EAClD,SAAS,EAAE,MAAM,GAChB,iBAAiB;IA4BpB;;;OAGG;IACG,IAAI,CAAC,CAAC,EACV,MAAM,EAAE,gBAAgB,EACxB,OAAO,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GACxB,OAAO,CAAC;QAAE,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC;QAAC,OAAO,EAAE,iBAAiB,CAAC;QAAC,UAAU,EAAE,gBAAgB,CAAA;KAAE,CAAC;IAuB1F,yCAAyC;IACzC,WAAW,IAAI,iBAAiB,EAAE;IAElC,mCAAmC;IACnC,aAAa,IAAI,MAAM;IAEvB,iCAAiC;IACjC,aAAa,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO;IAKlD,qEAAqE;IACrE,SAAS,IAAI,oBAAoB;CAClC"}
@@ -0,0 +1,123 @@
1
+ // Copyright 2024-2026 Tymofii Pidlisnyi. Apache-2.0 license. See LICENSE.
2
+ /**
3
+ * Generic Governance Hook — framework-agnostic adapter interface.
4
+ *
5
+ * Any agent framework (CrewAI, ADK, LangChain, AutoGen, A2A) implements
6
+ * this interface to get APS governance for free.
7
+ *
8
+ * The hook wraps the framework's action lifecycle:
9
+ * beforeAction → policy evaluation → action execution → afterAction → receipt
10
+ */
11
+ import { randomBytes } from 'node:crypto';
12
+ import { sign, verify } from '../crypto/keys.js';
13
+ import { canonicalize } from '../core/canonical.js';
14
+ // ═══════════════════════════════════════
15
+ // GovernanceHook — the core adapter class
16
+ // ═══════════════════════════════════════
17
+ export class GovernanceHook {
18
+ config;
19
+ actionLog = [];
20
+ totalSpend = 0;
21
+ constructor(config) {
22
+ this.config = config;
23
+ }
24
+ /**
25
+ * STEP 1: Before action — evaluate policy.
26
+ * Call this before the agent executes anything.
27
+ * Returns permit/deny/narrow/audit.
28
+ */
29
+ beforeAction(action) {
30
+ const intentId = 'intent_' + randomBytes(8).toString('hex');
31
+ const decisionId = 'dec_' + randomBytes(8).toString('hex');
32
+ const violations = [];
33
+ // Check 1: Scope authorization
34
+ const scopeMatch = this.config.allowedScopes.some(s => s === action.scopeRequired || s === '*' ||
35
+ (s.endsWith(':*') && action.scopeRequired.startsWith(s.slice(0, -1))));
36
+ if (!scopeMatch) {
37
+ violations.push(`Scope "${action.scopeRequired}" not in allowed: [${this.config.allowedScopes.join(', ')}]`);
38
+ }
39
+ // Check 2: Spend limit
40
+ if (action.estimatedCost && this.config.spendLimitPerAction) {
41
+ if (action.estimatedCost > this.config.spendLimitPerAction) {
42
+ violations.push(`Cost $${action.estimatedCost} exceeds limit $${this.config.spendLimitPerAction}`);
43
+ }
44
+ }
45
+ // Check 3: Delegation active (placeholder for revocation check)
46
+ if (!this.config.delegationId) {
47
+ violations.push('No active delegation');
48
+ }
49
+ const verdict = violations.length > 0 ? 'deny' : 'permit';
50
+ return {
51
+ verdict,
52
+ intentId,
53
+ decisionId,
54
+ reason: violations.length > 0
55
+ ? `Denied: ${violations.join('; ')}`
56
+ : `Permitted: scope "${action.scopeRequired}" authorized`,
57
+ violations: violations.length > 0 ? violations : undefined,
58
+ };
59
+ }
60
+ /**
61
+ * STEP 2: After action — generate signed receipt.
62
+ * Call this after the action completes (success or failure).
63
+ */
64
+ afterAction(result, action, executionResult, startedAt) {
65
+ const completedAt = new Date().toISOString();
66
+ const startMs = new Date(startedAt).getTime();
67
+ const endMs = new Date(completedAt).getTime();
68
+ const receiptPayload = {
69
+ receiptId: 'rcpt_' + randomBytes(8).toString('hex'),
70
+ intentId: result.intentId,
71
+ decisionId: result.decisionId,
72
+ agentId: this.config.agentId,
73
+ action,
74
+ verdict: result.verdict,
75
+ executionResult,
76
+ startedAt,
77
+ completedAt,
78
+ durationMs: endMs - startMs,
79
+ };
80
+ const sig = sign(canonicalize(receiptPayload), this.config.agentPrivateKey);
81
+ const receipt = { ...receiptPayload, signature: sig };
82
+ if (action.estimatedCost && executionResult === 'success') {
83
+ this.totalSpend += action.estimatedCost;
84
+ }
85
+ this.actionLog.push(receipt);
86
+ return receipt;
87
+ }
88
+ /**
89
+ * CONVENIENCE: Wrap an async action with full governance lifecycle.
90
+ * beforeAction → execute → afterAction → receipt
91
+ */
92
+ async wrap(action, execute) {
93
+ const governance = this.beforeAction(action);
94
+ if (governance.verdict === 'deny') {
95
+ const receipt = this.afterAction(governance, action, 'failure', new Date().toISOString());
96
+ return { result: null, receipt, governance };
97
+ }
98
+ const startedAt = new Date().toISOString();
99
+ let executionResult = 'failure';
100
+ let result = null;
101
+ try {
102
+ result = await execute();
103
+ executionResult = 'success';
104
+ }
105
+ catch {
106
+ executionResult = 'failure';
107
+ }
108
+ const receipt = this.afterAction(governance, action, executionResult, startedAt);
109
+ return { result, receipt, governance };
110
+ }
111
+ /** Get all receipts from this session */
112
+ getReceipts() { return [...this.actionLog]; }
113
+ /** Get total spend this session */
114
+ getTotalSpend() { return this.totalSpend; }
115
+ /** Verify a receipt signature */
116
+ verifyReceipt(receipt) {
117
+ const { signature, ...payload } = receipt;
118
+ return verify(canonicalize(payload), signature, this.config.agentPublicKey);
119
+ }
120
+ /** Get the agent's governance config (for framework registration) */
121
+ getConfig() { return { ...this.config }; }
122
+ }
123
+ //# sourceMappingURL=governance-hook.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"governance-hook.js","sourceRoot":"","sources":["../../../src/adapters/governance-hook.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * LangChain Adapter — maps LangChain's callback handler lifecycle to APS governance.
3
+ *
4
+ * LangChain pattern: on_tool_start → tool runs → on_tool_end / on_tool_error
5
+ * APS pattern: beforeAction → execute → afterAction → receipt
6
+ */
7
+ import { GovernanceHook } from './governance-hook.js';
8
+ import type { GovernanceHookConfig, GovernanceReceipt } from './governance-hook.js';
9
+ export interface LangChainGovernanceHandler {
10
+ on_tool_start: (toolName: string, input: string, runId: string) => {
11
+ allowed: boolean;
12
+ intentId: string;
13
+ };
14
+ on_tool_end: (output: string, runId: string) => GovernanceReceipt | null;
15
+ on_tool_error: (error: string, runId: string) => GovernanceReceipt | null;
16
+ on_chain_start: (chainType: string, inputs: Record<string, unknown>, runId: string) => {
17
+ allowed: boolean;
18
+ intentId: string;
19
+ };
20
+ on_chain_end: (outputs: Record<string, unknown>, runId: string) => GovernanceReceipt | null;
21
+ get_audit_trail: () => GovernanceReceipt[];
22
+ hook: GovernanceHook;
23
+ }
24
+ export declare function createLangChainGovernanceHandler(config: GovernanceHookConfig): LangChainGovernanceHandler;
25
+ //# sourceMappingURL=langchain.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"langchain.d.ts","sourceRoot":"","sources":["../../../src/adapters/langchain.ts"],"names":[],"mappings":"AACA;;;;;GAKG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,KAAK,EAAE,oBAAoB,EAAsC,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AAEvH,MAAM,WAAW,0BAA0B;IACzC,aAAa,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAA;IACzG,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,iBAAiB,GAAG,IAAI,CAAA;IACxE,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,iBAAiB,GAAG,IAAI,CAAA;IACzE,cAAc,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAA;IAC7H,YAAY,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,iBAAiB,GAAG,IAAI,CAAA;IAC3F,eAAe,EAAE,MAAM,iBAAiB,EAAE,CAAA;IAC1C,IAAI,EAAE,cAAc,CAAA;CACrB;AAED,wBAAgB,gCAAgC,CAAC,MAAM,EAAE,oBAAoB,GAAG,0BAA0B,CA2DzG"}