@passport-agent/langchain 0.0.1

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.
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=wrapper.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wrapper.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/wrapper.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,89 @@
1
+ import { describe, it, expect, vi } from 'vitest';
2
+ import { PassportIssuer } from '@passport-agent/core';
3
+ import { withPassport, createPassportToolkit } from '../wrapper.js';
4
+ describe('LangChain Integration', () => {
5
+ function setup() {
6
+ const issuer = new PassportIssuer();
7
+ const passport = issuer.issue({
8
+ principal: 'user:alice@test.com',
9
+ agent: 'agent:langchain-bot',
10
+ permissions: ['tool:search', 'tool:read_file', 'tool:write_file'],
11
+ limits: { maxSpend: 200 },
12
+ });
13
+ return { issuer, passport };
14
+ }
15
+ const searchTool = {
16
+ name: 'search',
17
+ description: 'Search the web',
18
+ execute: async (args) => ({ results: [`result for ${args['query']}`] }),
19
+ };
20
+ const deleteTool = {
21
+ name: 'delete_db',
22
+ description: 'Delete database',
23
+ execute: async () => 'deleted',
24
+ };
25
+ describe('withPassport', () => {
26
+ it('allows permitted tool execution', async () => {
27
+ const { issuer, passport } = setup();
28
+ const wrapped = withPassport(searchTool, passport, { issuer });
29
+ const result = await wrapped.execute({ query: 'test' });
30
+ expect(result).toEqual({ results: ['result for test'] });
31
+ });
32
+ it('blocks unpermitted tools', async () => {
33
+ const { issuer, passport } = setup();
34
+ const wrapped = withPassport(deleteTool, passport, { issuer });
35
+ await expect(wrapped.execute({})).rejects.toThrow('denied');
36
+ });
37
+ it('preserves tool name and description', () => {
38
+ const { issuer, passport } = setup();
39
+ const wrapped = withPassport(searchTool, passport, { issuer });
40
+ expect(wrapped.name).toBe('search');
41
+ expect(wrapped.description).toBe('Search the web');
42
+ });
43
+ it('supports custom permission mapping', async () => {
44
+ const issuer = new PassportIssuer();
45
+ const passport = issuer.issue({
46
+ principal: 'user:bob@test.com',
47
+ agent: 'agent:bot',
48
+ permissions: ['web:search'],
49
+ });
50
+ const wrapped = withPassport(searchTool, passport, {
51
+ issuer,
52
+ permissionMapper: (name) => name === 'search' ? 'web:search' : `tool:${name}`,
53
+ });
54
+ const result = await wrapped.execute({ query: 'hi' });
55
+ expect(result).toEqual({ results: ['result for hi'] });
56
+ });
57
+ it('enforces spend limits via spendMapper', async () => {
58
+ const { issuer, passport } = setup();
59
+ const writeTool = {
60
+ name: 'write_file',
61
+ description: 'Write a file',
62
+ execute: async () => 'written',
63
+ };
64
+ const wrapped = withPassport(writeTool, passport, {
65
+ issuer,
66
+ spendMapper: (_name, args) => args['cost'] ?? 0,
67
+ });
68
+ await wrapped.execute({ cost: 150 });
69
+ await expect(wrapped.execute({ cost: 100 })).rejects.toThrow('denied');
70
+ });
71
+ it('calls onDenied callback', async () => {
72
+ const { issuer, passport } = setup();
73
+ const onDenied = vi.fn();
74
+ const wrapped = withPassport(deleteTool, passport, { issuer, onDenied });
75
+ await expect(wrapped.execute({})).rejects.toThrow();
76
+ expect(onDenied).toHaveBeenCalledWith('delete_db', expect.any(String));
77
+ });
78
+ });
79
+ describe('createPassportToolkit', () => {
80
+ it('wraps all tools with passport checks', async () => {
81
+ const { issuer, passport } = setup();
82
+ const tools = createPassportToolkit([searchTool, deleteTool], passport, { issuer });
83
+ expect(tools).toHaveLength(2);
84
+ await expect(tools[0].execute({ query: 'test' })).resolves.toBeTruthy();
85
+ await expect(tools[1].execute({})).rejects.toThrow('denied');
86
+ });
87
+ });
88
+ });
89
+ //# sourceMappingURL=wrapper.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wrapper.test.js","sourceRoot":"","sources":["../../src/__tests__/wrapper.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,qBAAqB,EAAuB,MAAM,eAAe,CAAC;AAEzF,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,SAAS,KAAK;QACZ,MAAM,MAAM,GAAG,IAAI,cAAc,EAAE,CAAC;QACpC,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC;YAC5B,SAAS,EAAE,qBAAqB;YAChC,KAAK,EAAE,qBAAqB;YAC5B,WAAW,EAAE,CAAC,aAAa,EAAE,gBAAgB,EAAE,iBAAiB,CAAC;YACjE,MAAM,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE;SAC1B,CAAC,CAAC;QACH,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IAC9B,CAAC;IAED,MAAM,UAAU,GAAmB;QACjC,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,gBAAgB;QAC7B,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,cAAc,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC;KACxE,CAAC;IAEF,MAAM,UAAU,GAAmB;QACjC,IAAI,EAAE,WAAW;QACjB,WAAW,EAAE,iBAAiB;QAC9B,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,SAAS;KAC/B,CAAC;IAEF,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;QAC5B,EAAE,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;YAC/C,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,CAAC;YACrC,MAAM,OAAO,GAAG,YAAY,CAAC,UAAU,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;YAC/D,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;YACxD,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC;QAC3D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0BAA0B,EAAE,KAAK,IAAI,EAAE;YACxC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,CAAC;YACrC,MAAM,OAAO,GAAG,YAAY,CAAC,UAAU,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;YAC/D,MAAM,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC9D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;YAC7C,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,CAAC;YACrC,MAAM,OAAO,GAAG,YAAY,CAAC,UAAU,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;YAC/D,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACpC,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QACrD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;YAClD,MAAM,MAAM,GAAG,IAAI,cAAc,EAAE,CAAC;YACpC,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC;gBAC5B,SAAS,EAAE,mBAAmB;gBAC9B,KAAK,EAAE,WAAW;gBAClB,WAAW,EAAE,CAAC,YAAY,CAAC;aAC5B,CAAC,CAAC;YACH,MAAM,OAAO,GAAG,YAAY,CAAC,UAAU,EAAE,QAAQ,EAAE;gBACjD,MAAM;gBACN,gBAAgB,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,IAAI,EAAE;aAC9E,CAAC,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YACtD,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;YACrD,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,CAAC;YACrC,MAAM,SAAS,GAAmB;gBAChC,IAAI,EAAE,YAAY;gBAClB,WAAW,EAAE,cAAc;gBAC3B,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,SAAS;aAC/B,CAAC;YACF,MAAM,OAAO,GAAG,YAAY,CAAC,SAAS,EAAE,QAAQ,EAAE;gBAChD,MAAM;gBACN,WAAW,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAE,IAAI,CAAC,MAAM,CAAY,IAAI,CAAC;aAC5D,CAAC,CAAC;YAEH,MAAM,OAAO,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;YACrC,MAAM,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACzE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yBAAyB,EAAE,KAAK,IAAI,EAAE;YACvC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,CAAC;YACrC,MAAM,QAAQ,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;YACzB,MAAM,OAAO,GAAG,YAAY,CAAC,UAAU,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;YACzE,MAAM,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YACpD,MAAM,CAAC,QAAQ,CAAC,CAAC,oBAAoB,CAAC,WAAW,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;QACzE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;QACrC,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;YACpD,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,CAAC;YACrC,MAAM,KAAK,GAAG,qBAAqB,CACjC,CAAC,UAAU,EAAE,UAAU,CAAC,EACxB,QAAQ,EACR,EAAE,MAAM,EAAE,CACX,CAAC;YACF,MAAM,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAE9B,MAAM,MAAM,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;YACzE,MAAM,MAAM,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAChE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { withPassport, createPassportToolkit } from './wrapper.js';
2
+ export type { PassportToolConfig, ToolDefinition, ToolResult } from './wrapper.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AACnE,YAAY,EAAE,kBAAkB,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,2 @@
1
+ export { withPassport, createPassportToolkit } from './wrapper.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,22 @@
1
+ import type { SignedPassport } from '@passport-agent/core';
2
+ import { PassportIssuer } from '@passport-agent/core';
3
+ export interface ToolDefinition {
4
+ name: string;
5
+ description: string;
6
+ execute: (args: Record<string, unknown>) => unknown | Promise<unknown>;
7
+ }
8
+ export interface ToolResult {
9
+ name: string;
10
+ result?: unknown;
11
+ error?: string;
12
+ authorized: boolean;
13
+ }
14
+ export interface PassportToolConfig {
15
+ issuer: PassportIssuer;
16
+ permissionMapper?: (toolName: string) => string;
17
+ spendMapper?: (toolName: string, args: Record<string, unknown>) => number;
18
+ onDenied?: (toolName: string, reason: string) => void;
19
+ }
20
+ export declare function withPassport(tool: ToolDefinition, passport: SignedPassport, config: PassportToolConfig): ToolDefinition;
21
+ export declare function createPassportToolkit(tools: ToolDefinition[], passport: SignedPassport, config: PassportToolConfig): ToolDefinition[];
22
+ //# sourceMappingURL=wrapper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wrapper.d.ts","sourceRoot":"","sources":["../src/wrapper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAmB,MAAM,sBAAsB,CAAC;AAC5E,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACxE;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,cAAc,CAAC;IACvB,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAM,CAAC;IAChD,WAAW,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,MAAM,CAAC;IAC1E,QAAQ,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CACvD;AAED,wBAAgB,YAAY,CAC1B,IAAI,EAAE,cAAc,EACpB,QAAQ,EAAE,cAAc,EACxB,MAAM,EAAE,kBAAkB,GACzB,cAAc,CAqBhB;AAED,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,cAAc,EAAE,EACvB,QAAQ,EAAE,cAAc,EACxB,MAAM,EAAE,kBAAkB,GACzB,cAAc,EAAE,CAElB"}
@@ -0,0 +1,23 @@
1
+ export function withPassport(tool, passport, config) {
2
+ const mapPermission = config.permissionMapper ?? ((name) => `tool:${name}`);
3
+ const mapSpend = config.spendMapper ?? (() => 0);
4
+ return {
5
+ name: tool.name,
6
+ description: tool.description,
7
+ execute: async (args) => {
8
+ const permission = mapPermission(tool.name);
9
+ const spend = mapSpend(tool.name, args);
10
+ const authResult = config.issuer.authorize(passport, permission, spend);
11
+ if (!authResult.allowed) {
12
+ const msg = `Tool "${tool.name}" denied: ${authResult.reason}`;
13
+ config.onDenied?.(tool.name, authResult.reason ?? 'Unknown');
14
+ throw new Error(msg);
15
+ }
16
+ return tool.execute(args);
17
+ },
18
+ };
19
+ }
20
+ export function createPassportToolkit(tools, passport, config) {
21
+ return tools.map((tool) => withPassport(tool, passport, config));
22
+ }
23
+ //# sourceMappingURL=wrapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wrapper.js","sourceRoot":"","sources":["../src/wrapper.ts"],"names":[],"mappings":"AAuBA,MAAM,UAAU,YAAY,CAC1B,IAAoB,EACpB,QAAwB,EACxB,MAA0B;IAE1B,MAAM,aAAa,GAAG,MAAM,CAAC,gBAAgB,IAAI,CAAC,CAAC,IAAY,EAAE,EAAE,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;IACpF,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;IAEjD,OAAO;QACL,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,OAAO,EAAE,KAAK,EAAE,IAA6B,EAAE,EAAE;YAC/C,MAAM,UAAU,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC5C,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YACxC,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;YAExE,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;gBACxB,MAAM,GAAG,GAAG,SAAS,IAAI,CAAC,IAAI,aAAa,UAAU,CAAC,MAAM,EAAE,CAAC;gBAC/D,MAAM,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,MAAM,IAAI,SAAS,CAAC,CAAC;gBAC7D,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC;YACvB,CAAC;YAED,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,KAAuB,EACvB,QAAwB,EACxB,MAA0B;IAE1B,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;AACnE,CAAC"}
package/package.json ADDED
@@ -0,0 +1,32 @@
1
+ {
2
+ "name": "@passport-agent/langchain",
3
+ "version": "0.0.1",
4
+ "description": "LangChain integration for Agent Passport — wrap tools with passport authorization",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js"
12
+ }
13
+ },
14
+ "scripts": {
15
+ "build": "tsc",
16
+ "test": "vitest run",
17
+ "lint": "tsc --noEmit"
18
+ },
19
+ "files": ["dist"],
20
+ "license": "MIT",
21
+ "repository": {
22
+ "type": "git",
23
+ "url": "https://github.com/priyansh-x/passport-agent",
24
+ "directory": "packages/langchain"
25
+ },
26
+ "dependencies": {
27
+ "@passport-agent/core": "workspace:*"
28
+ },
29
+ "devDependencies": {
30
+ "vitest": "^3.0.0"
31
+ }
32
+ }