agent-passport-system 1.21.8 → 1.22.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.
- package/README.md +4 -4
- package/dist/src/adapters/a2a.d.ts +30 -0
- package/dist/src/adapters/a2a.d.ts.map +1 -0
- package/dist/src/adapters/a2a.js +53 -0
- package/dist/src/adapters/a2a.js.map +1 -0
- package/dist/src/adapters/adk.d.ts +26 -0
- package/dist/src/adapters/adk.d.ts.map +1 -0
- package/dist/src/adapters/adk.js +50 -0
- package/dist/src/adapters/adk.js.map +1 -0
- package/dist/src/adapters/crewai.d.ts +43 -0
- package/dist/src/adapters/crewai.d.ts.map +1 -0
- package/dist/src/adapters/crewai.js +52 -0
- package/dist/src/adapters/crewai.js.map +1 -0
- package/dist/src/adapters/governance-hook.d.ts +94 -0
- package/dist/src/adapters/governance-hook.d.ts.map +1 -0
- package/dist/src/adapters/governance-hook.js +123 -0
- package/dist/src/adapters/governance-hook.js.map +1 -0
- package/dist/src/adapters/langchain.d.ts +25 -0
- package/dist/src/adapters/langchain.d.ts.map +1 -0
- package/dist/src/adapters/langchain.js +66 -0
- package/dist/src/adapters/langchain.js.map +1 -0
- package/dist/src/conformance/suite.d.ts +35 -0
- package/dist/src/conformance/suite.d.ts.map +1 -0
- package/dist/src/conformance/suite.js +255 -0
- package/dist/src/conformance/suite.js.map +1 -0
- package/dist/src/core/agora.d.ts.map +1 -1
- package/dist/src/core/agora.js +1 -0
- package/dist/src/core/agora.js.map +1 -1
- package/dist/src/core/attribution.d.ts.map +1 -1
- package/dist/src/core/attribution.js +1 -0
- package/dist/src/core/attribution.js.map +1 -1
- package/dist/src/core/commerce.d.ts.map +1 -1
- package/dist/src/core/commerce.js +1 -0
- package/dist/src/core/commerce.js.map +1 -1
- package/dist/src/core/coordination.d.ts.map +1 -1
- package/dist/src/core/coordination.js +1 -0
- package/dist/src/core/coordination.js.map +1 -1
- package/dist/src/core/data-lifecycle.d.ts.map +1 -1
- package/dist/src/core/data-lifecycle.js +1 -0
- package/dist/src/core/data-lifecycle.js.map +1 -1
- package/dist/src/core/decision-equivalence.d.ts.map +1 -1
- package/dist/src/core/decision-equivalence.js +1 -0
- package/dist/src/core/decision-equivalence.js.map +1 -1
- package/dist/src/core/delegation.d.ts.map +1 -1
- package/dist/src/core/delegation.js +1 -0
- package/dist/src/core/delegation.js.map +1 -1
- package/dist/src/core/did.d.ts.map +1 -1
- package/dist/src/core/did.js +1 -0
- package/dist/src/core/did.js.map +1 -1
- package/dist/src/core/entity-verification.d.ts.map +1 -1
- package/dist/src/core/entity-verification.js +1 -0
- package/dist/src/core/entity-verification.js.map +1 -1
- package/dist/src/core/execution-envelope.d.ts.map +1 -1
- package/dist/src/core/execution-envelope.js +1 -0
- package/dist/src/core/execution-envelope.js.map +1 -1
- package/dist/src/core/gateway.d.ts.map +1 -1
- package/dist/src/core/gateway.js +1 -0
- package/dist/src/core/gateway.js.map +1 -1
- package/dist/src/core/governance-block.d.ts +131 -0
- package/dist/src/core/governance-block.d.ts.map +1 -0
- package/dist/src/core/governance-block.js +149 -0
- package/dist/src/core/governance-block.js.map +1 -0
- package/dist/src/core/intent.d.ts.map +1 -1
- package/dist/src/core/intent.js +1 -0
- package/dist/src/core/intent.js.map +1 -1
- package/dist/src/core/passport.d.ts.map +1 -1
- package/dist/src/core/passport.js +1 -0
- package/dist/src/core/passport.js.map +1 -1
- package/dist/src/core/policy.d.ts.map +1 -1
- package/dist/src/core/policy.js +1 -0
- package/dist/src/core/policy.js.map +1 -1
- package/dist/src/core/principal.d.ts.map +1 -1
- package/dist/src/core/principal.js +1 -0
- package/dist/src/core/principal.js.map +1 -1
- package/dist/src/core/values.d.ts.map +1 -1
- package/dist/src/core/values.js +1 -0
- package/dist/src/core/values.js.map +1 -1
- package/dist/src/index.d.ts +14 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +17 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/interop/agent-json-bridge.d.ts.map +1 -1
- package/dist/src/interop/agent-json-bridge.js +1 -0
- package/dist/src/interop/agent-json-bridge.js.map +1 -1
- package/dist/src/interop/qntm-bridge.d.ts.map +1 -1
- package/dist/src/interop/qntm-bridge.js +1 -0
- package/dist/src/interop/qntm-bridge.js.map +1 -1
- package/dist/src/types/data-lifecycle.d.ts.map +1 -1
- package/dist/src/types/data-lifecycle.js +1 -0
- package/dist/src/types/data-lifecycle.js.map +1 -1
- package/dist/src/types/decision-equivalence.d.ts.map +1 -1
- package/dist/src/types/decision-equivalence.js +1 -0
- package/dist/src/types/decision-equivalence.js.map +1 -1
- package/dist/src/v2/affected-party.d.ts.map +1 -1
- package/dist/src/v2/affected-party.js +1 -0
- package/dist/src/v2/affected-party.js.map +1 -1
- package/dist/src/v2/amendment.d.ts.map +1 -1
- package/dist/src/v2/amendment.js +1 -0
- package/dist/src/v2/amendment.js.map +1 -1
- package/dist/src/v2/anomaly-v2.d.ts.map +1 -1
- package/dist/src/v2/anomaly-v2.js +1 -0
- package/dist/src/v2/anomaly-v2.js.map +1 -1
- package/dist/src/v2/approval-fatigue.d.ts.map +1 -1
- package/dist/src/v2/approval-fatigue.js +1 -0
- package/dist/src/v2/approval-fatigue.js.map +1 -1
- package/dist/src/v2/attestation-v2.d.ts.map +1 -1
- package/dist/src/v2/attestation-v2.js +1 -0
- package/dist/src/v2/attestation-v2.js.map +1 -1
- package/dist/src/v2/blind-evaluation.d.ts.map +1 -1
- package/dist/src/v2/blind-evaluation.js +1 -0
- package/dist/src/v2/blind-evaluation.js.map +1 -1
- package/dist/src/v2/bridge.d.ts.map +1 -1
- package/dist/src/v2/bridge.js +1 -0
- package/dist/src/v2/bridge.js.map +1 -1
- package/dist/src/v2/cascade-correlation.d.ts.map +1 -1
- package/dist/src/v2/cascade-correlation.js +1 -0
- package/dist/src/v2/cascade-correlation.js.map +1 -1
- package/dist/src/v2/circuit-breakers.d.ts.map +1 -1
- package/dist/src/v2/circuit-breakers.js +1 -0
- package/dist/src/v2/circuit-breakers.js.map +1 -1
- package/dist/src/v2/composite-audit.d.ts.map +1 -1
- package/dist/src/v2/composite-audit.js +1 -0
- package/dist/src/v2/composite-audit.js.map +1 -1
- package/dist/src/v2/cross-chain-audit.d.ts.map +1 -1
- package/dist/src/v2/cross-chain-audit.js +1 -0
- package/dist/src/v2/cross-chain-audit.js.map +1 -1
- package/dist/src/v2/delegation-v2.d.ts.map +1 -1
- package/dist/src/v2/delegation-v2.js +1 -0
- package/dist/src/v2/delegation-v2.js.map +1 -1
- package/dist/src/v2/effect-enforcement.d.ts.map +1 -1
- package/dist/src/v2/effect-enforcement.js +1 -0
- package/dist/src/v2/effect-enforcement.js.map +1 -1
- package/dist/src/v2/effect-sampling.d.ts.map +1 -1
- package/dist/src/v2/effect-sampling.js +1 -0
- package/dist/src/v2/effect-sampling.js.map +1 -1
- package/dist/src/v2/emergence.d.ts.map +1 -1
- package/dist/src/v2/emergence.js +1 -0
- package/dist/src/v2/emergence.js.map +1 -1
- package/dist/src/v2/emergency-v2.d.ts.map +1 -1
- package/dist/src/v2/emergency-v2.js +1 -0
- package/dist/src/v2/emergency-v2.js.map +1 -1
- package/dist/src/v2/epistemic-isolation.d.ts.map +1 -1
- package/dist/src/v2/epistemic-isolation.js +1 -0
- package/dist/src/v2/epistemic-isolation.js.map +1 -1
- package/dist/src/v2/externality.d.ts.map +1 -1
- package/dist/src/v2/externality.js +1 -0
- package/dist/src/v2/externality.js.map +1 -1
- package/dist/src/v2/governance-drift.d.ts.map +1 -1
- package/dist/src/v2/governance-drift.js +1 -0
- package/dist/src/v2/governance-drift.js.map +1 -1
- package/dist/src/v2/inaction-audit.d.ts.map +1 -1
- package/dist/src/v2/inaction-audit.js +1 -0
- package/dist/src/v2/inaction-audit.js.map +1 -1
- package/dist/src/v2/index.d.ts.map +1 -1
- package/dist/src/v2/index.js +1 -0
- package/dist/src/v2/index.js.map +1 -1
- package/dist/src/v2/intent-binding.d.ts.map +1 -1
- package/dist/src/v2/intent-binding.js +1 -0
- package/dist/src/v2/intent-binding.js.map +1 -1
- package/dist/src/v2/migration-v2.d.ts.map +1 -1
- package/dist/src/v2/migration-v2.js +1 -0
- package/dist/src/v2/migration-v2.js.map +1 -1
- package/dist/src/v2/outcome-v2.d.ts.map +1 -1
- package/dist/src/v2/outcome-v2.js +1 -0
- package/dist/src/v2/outcome-v2.js.map +1 -1
- package/dist/src/v2/output-proportionality.d.ts.map +1 -1
- package/dist/src/v2/output-proportionality.js +1 -0
- package/dist/src/v2/output-proportionality.js.map +1 -1
- package/dist/src/v2/policy-profiles.d.ts.map +1 -1
- package/dist/src/v2/policy-profiles.js +1 -0
- package/dist/src/v2/policy-profiles.js.map +1 -1
- package/dist/src/v2/root-transition.d.ts.map +1 -1
- package/dist/src/v2/root-transition.js +1 -0
- package/dist/src/v2/root-transition.js.map +1 -1
- package/dist/src/v2/semantic-drift.d.ts.map +1 -1
- package/dist/src/v2/semantic-drift.js +1 -0
- package/dist/src/v2/semantic-drift.js.map +1 -1
- package/dist/src/v2/semantic-scoping.d.ts.map +1 -1
- package/dist/src/v2/semantic-scoping.js +1 -0
- package/dist/src/v2/semantic-scoping.js.map +1 -1
- package/dist/src/v2/separation-of-powers.d.ts.map +1 -1
- package/dist/src/v2/separation-of-powers.js +1 -0
- package/dist/src/v2/separation-of-powers.js.map +1 -1
- package/dist/src/v2/types.d.ts.map +1 -1
- package/dist/src/v2/types.js +1 -0
- package/dist/src/v2/types.js.map +1 -1
- package/dist/src/v2/values-override.d.ts.map +1 -1
- package/dist/src/v2/values-override.js +1 -0
- package/dist/src/v2/values-override.js.map +1 -1
- 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.
|
|
12
|
+
**42 core modules + 32 v2 constitutional modules. 1421 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
|
-
**
|
|
412
|
+
**102 tools across all 46 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
|
-
#
|
|
434
|
+
# 1421 tests across 58 files, 374 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/
|
|
530
|
+
tests/ 72 test files, 1421 tests (374 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"}
|