@optimizely-opal/opal-tool-ocp-sdk 0.0.0-dev.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.
- package/README.md +437 -0
- package/dist/decorator/Decorator.d.ts +46 -0
- package/dist/decorator/Decorator.d.ts.map +1 -0
- package/dist/decorator/Decorator.js +31 -0
- package/dist/decorator/Decorator.js.map +1 -0
- package/dist/decorator/Decorator.test.d.ts +2 -0
- package/dist/decorator/Decorator.test.d.ts.map +1 -0
- package/dist/decorator/Decorator.test.js +418 -0
- package/dist/decorator/Decorator.test.js.map +1 -0
- package/dist/function/ToolFunction.d.ts +15 -0
- package/dist/function/ToolFunction.d.ts.map +1 -0
- package/dist/function/ToolFunction.js +25 -0
- package/dist/function/ToolFunction.js.map +1 -0
- package/dist/function/ToolFunction.test.d.ts +2 -0
- package/dist/function/ToolFunction.test.d.ts.map +1 -0
- package/dist/function/ToolFunction.test.js +189 -0
- package/dist/function/ToolFunction.test.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +25 -0
- package/dist/index.js.map +1 -0
- package/dist/service/Service.d.ts +78 -0
- package/dist/service/Service.d.ts.map +1 -0
- package/dist/service/Service.js +204 -0
- package/dist/service/Service.js.map +1 -0
- package/dist/service/Service.test.d.ts +2 -0
- package/dist/service/Service.test.d.ts.map +1 -0
- package/dist/service/Service.test.js +341 -0
- package/dist/service/Service.test.js.map +1 -0
- package/dist/types/Models.d.ts +126 -0
- package/dist/types/Models.d.ts.map +1 -0
- package/dist/types/Models.js +181 -0
- package/dist/types/Models.js.map +1 -0
- package/package.json +58 -0
- package/src/decorator/Decorator.test.ts +523 -0
- package/src/decorator/Decorator.ts +83 -0
- package/src/function/ToolFunction.test.ts +224 -0
- package/src/function/ToolFunction.ts +25 -0
- package/src/index.ts +4 -0
- package/src/service/Service.test.ts +550 -0
- package/src/service/Service.ts +182 -0
- package/src/types/Models.ts +163 -0
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const ToolFunction_1 = require("./ToolFunction");
|
|
4
|
+
const Service_1 = require("../service/Service");
|
|
5
|
+
const app_sdk_1 = require("@zaiusinc/app-sdk");
|
|
6
|
+
// Mock the toolsService
|
|
7
|
+
jest.mock('../service/Service', () => ({
|
|
8
|
+
toolsService: {
|
|
9
|
+
processRequest: jest.fn(),
|
|
10
|
+
extractBearerToken: jest.fn(),
|
|
11
|
+
},
|
|
12
|
+
}));
|
|
13
|
+
// Mock the Request and Response classes and Function base class
|
|
14
|
+
jest.mock('@zaiusinc/app-sdk', () => ({
|
|
15
|
+
Function: class {
|
|
16
|
+
request;
|
|
17
|
+
constructor(_name) {
|
|
18
|
+
// Mock constructor that accepts optional name parameter
|
|
19
|
+
this.request = {};
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
Request: jest.fn().mockImplementation(() => ({})),
|
|
23
|
+
Response: jest.fn().mockImplementation((status, data) => ({
|
|
24
|
+
status,
|
|
25
|
+
data,
|
|
26
|
+
bodyJSON: data,
|
|
27
|
+
bodyAsU8Array: new Uint8Array()
|
|
28
|
+
})),
|
|
29
|
+
}));
|
|
30
|
+
// Create a concrete implementation for testing
|
|
31
|
+
class TestToolFunction extends ToolFunction_1.ToolFunction {
|
|
32
|
+
mockValidateBearerToken;
|
|
33
|
+
constructor(request) {
|
|
34
|
+
super(request || {}); // Pass the request parameter properly
|
|
35
|
+
// Set the request directly without defaulting to empty object
|
|
36
|
+
this.request = request;
|
|
37
|
+
// Create a mock implementation of the abstract method
|
|
38
|
+
this.mockValidateBearerToken = jest.fn().mockReturnValue(true);
|
|
39
|
+
}
|
|
40
|
+
// Implement the abstract method
|
|
41
|
+
validateBearerToken(bearerToken) {
|
|
42
|
+
return this.mockValidateBearerToken(bearerToken);
|
|
43
|
+
}
|
|
44
|
+
// Expose request and validation mock for testing
|
|
45
|
+
getRequest() {
|
|
46
|
+
return this.request;
|
|
47
|
+
}
|
|
48
|
+
getMockValidateBearerToken() {
|
|
49
|
+
return this.mockValidateBearerToken;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
describe('ToolFunction', () => {
|
|
53
|
+
let mockRequest;
|
|
54
|
+
let mockResponse;
|
|
55
|
+
let toolFunction;
|
|
56
|
+
let mockProcessRequest;
|
|
57
|
+
let mockExtractBearerToken;
|
|
58
|
+
beforeEach(() => {
|
|
59
|
+
jest.clearAllMocks();
|
|
60
|
+
// Create mock instances
|
|
61
|
+
mockRequest = {
|
|
62
|
+
headers: new Map(),
|
|
63
|
+
method: 'POST',
|
|
64
|
+
path: '/test'
|
|
65
|
+
};
|
|
66
|
+
mockResponse = {};
|
|
67
|
+
// Setup the mocks
|
|
68
|
+
mockProcessRequest = jest.mocked(Service_1.toolsService.processRequest);
|
|
69
|
+
mockExtractBearerToken = jest.mocked(Service_1.toolsService.extractBearerToken);
|
|
70
|
+
// Create test instance
|
|
71
|
+
toolFunction = new TestToolFunction(mockRequest);
|
|
72
|
+
});
|
|
73
|
+
describe('bearer token validation', () => {
|
|
74
|
+
it('should extract bearer token from headers and validate it', async () => {
|
|
75
|
+
// Arrange
|
|
76
|
+
const bearerToken = 'valid-token-123';
|
|
77
|
+
mockExtractBearerToken.mockReturnValue(bearerToken);
|
|
78
|
+
toolFunction.getMockValidateBearerToken().mockReturnValue(true);
|
|
79
|
+
mockProcessRequest.mockResolvedValue(mockResponse);
|
|
80
|
+
// Act
|
|
81
|
+
const result = await toolFunction.perform();
|
|
82
|
+
// Assert
|
|
83
|
+
expect(mockExtractBearerToken).toHaveBeenCalledWith(mockRequest.headers);
|
|
84
|
+
expect(toolFunction.getMockValidateBearerToken()).toHaveBeenCalledWith(bearerToken);
|
|
85
|
+
expect(mockProcessRequest).toHaveBeenCalledWith(mockRequest);
|
|
86
|
+
expect(result).toBe(mockResponse);
|
|
87
|
+
});
|
|
88
|
+
it('should return 403 Forbidden when bearer token validation fails', async () => {
|
|
89
|
+
// Arrange
|
|
90
|
+
const bearerToken = 'invalid-token-456';
|
|
91
|
+
mockExtractBearerToken.mockReturnValue(bearerToken);
|
|
92
|
+
toolFunction.getMockValidateBearerToken().mockReturnValue(false);
|
|
93
|
+
// Act
|
|
94
|
+
const result = await toolFunction.perform();
|
|
95
|
+
// Assert
|
|
96
|
+
expect(mockExtractBearerToken).toHaveBeenCalledWith(mockRequest.headers);
|
|
97
|
+
expect(toolFunction.getMockValidateBearerToken()).toHaveBeenCalledWith(bearerToken);
|
|
98
|
+
expect(mockProcessRequest).not.toHaveBeenCalled();
|
|
99
|
+
expect(result).toEqual(new app_sdk_1.Response(403, { error: 'Forbidden' }));
|
|
100
|
+
});
|
|
101
|
+
it('should handle complex bearer token validation scenarios', async () => {
|
|
102
|
+
// Arrange - simulate a token that should be valid based on some complex logic
|
|
103
|
+
const complexToken = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9l' +
|
|
104
|
+
'IiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c';
|
|
105
|
+
mockExtractBearerToken.mockReturnValue(complexToken);
|
|
106
|
+
toolFunction.getMockValidateBearerToken().mockReturnValue(true);
|
|
107
|
+
mockProcessRequest.mockResolvedValue(mockResponse);
|
|
108
|
+
// Act
|
|
109
|
+
const result = await toolFunction.perform();
|
|
110
|
+
// Assert
|
|
111
|
+
expect(mockExtractBearerToken).toHaveBeenCalledWith(mockRequest.headers);
|
|
112
|
+
expect(toolFunction.getMockValidateBearerToken()).toHaveBeenCalledWith(complexToken);
|
|
113
|
+
expect(mockProcessRequest).toHaveBeenCalledWith(mockRequest);
|
|
114
|
+
expect(result).toBe(mockResponse);
|
|
115
|
+
});
|
|
116
|
+
it('should handle bearer token validation throwing an error', async () => {
|
|
117
|
+
// Arrange
|
|
118
|
+
const bearerToken = 'malformed-token';
|
|
119
|
+
mockExtractBearerToken.mockReturnValue(bearerToken);
|
|
120
|
+
toolFunction.getMockValidateBearerToken().mockImplementation(() => {
|
|
121
|
+
throw new Error('Token validation error');
|
|
122
|
+
});
|
|
123
|
+
// Act & Assert
|
|
124
|
+
await expect(toolFunction.perform()).rejects.toThrow('Token validation error');
|
|
125
|
+
expect(mockExtractBearerToken).toHaveBeenCalledWith(mockRequest.headers);
|
|
126
|
+
expect(toolFunction.getMockValidateBearerToken()).toHaveBeenCalledWith(bearerToken);
|
|
127
|
+
expect(mockProcessRequest).not.toHaveBeenCalled();
|
|
128
|
+
});
|
|
129
|
+
it('should call validateBearerToken only once per request', async () => {
|
|
130
|
+
// Arrange
|
|
131
|
+
const bearerToken = 'test-token';
|
|
132
|
+
mockExtractBearerToken.mockReturnValue(bearerToken);
|
|
133
|
+
toolFunction.getMockValidateBearerToken().mockReturnValue(true);
|
|
134
|
+
mockProcessRequest.mockResolvedValue(mockResponse);
|
|
135
|
+
// Act
|
|
136
|
+
await toolFunction.perform();
|
|
137
|
+
// Assert
|
|
138
|
+
expect(toolFunction.getMockValidateBearerToken()).toHaveBeenCalledTimes(1);
|
|
139
|
+
expect(toolFunction.getMockValidateBearerToken()).toHaveBeenCalledWith(bearerToken);
|
|
140
|
+
});
|
|
141
|
+
it('should extract bearer token only once per request', async () => {
|
|
142
|
+
// Arrange
|
|
143
|
+
const bearerToken = 'test-token';
|
|
144
|
+
mockExtractBearerToken.mockReturnValue(bearerToken);
|
|
145
|
+
toolFunction.getMockValidateBearerToken().mockReturnValue(true);
|
|
146
|
+
mockProcessRequest.mockResolvedValue(mockResponse);
|
|
147
|
+
// Act
|
|
148
|
+
await toolFunction.perform();
|
|
149
|
+
// Assert
|
|
150
|
+
expect(mockExtractBearerToken).toHaveBeenCalledTimes(1);
|
|
151
|
+
expect(mockExtractBearerToken).toHaveBeenCalledWith(mockRequest.headers);
|
|
152
|
+
});
|
|
153
|
+
it('should skip validation when bearer token is undefined', async () => {
|
|
154
|
+
// Arrange
|
|
155
|
+
mockExtractBearerToken.mockReturnValue(undefined);
|
|
156
|
+
mockProcessRequest.mockResolvedValue(mockResponse);
|
|
157
|
+
// Act
|
|
158
|
+
const result = await toolFunction.perform();
|
|
159
|
+
// Assert
|
|
160
|
+
expect(mockExtractBearerToken).toHaveBeenCalledWith(mockRequest.headers);
|
|
161
|
+
expect(toolFunction.getMockValidateBearerToken()).not.toHaveBeenCalled();
|
|
162
|
+
expect(mockProcessRequest).toHaveBeenCalledWith(mockRequest);
|
|
163
|
+
expect(result).toBe(mockResponse);
|
|
164
|
+
});
|
|
165
|
+
it('should skip validation when bearer token is empty string', async () => {
|
|
166
|
+
// Arrange
|
|
167
|
+
mockExtractBearerToken.mockReturnValue('');
|
|
168
|
+
mockProcessRequest.mockResolvedValue(mockResponse);
|
|
169
|
+
// Act
|
|
170
|
+
const result = await toolFunction.perform();
|
|
171
|
+
// Assert
|
|
172
|
+
expect(mockExtractBearerToken).toHaveBeenCalledWith(mockRequest.headers);
|
|
173
|
+
expect(toolFunction.getMockValidateBearerToken()).not.toHaveBeenCalled();
|
|
174
|
+
expect(mockProcessRequest).toHaveBeenCalledWith(mockRequest);
|
|
175
|
+
expect(result).toBe(mockResponse);
|
|
176
|
+
});
|
|
177
|
+
});
|
|
178
|
+
describe('inheritance', () => {
|
|
179
|
+
it('should be an instance of Function', () => {
|
|
180
|
+
// Assert
|
|
181
|
+
expect(toolFunction).toBeInstanceOf(ToolFunction_1.ToolFunction);
|
|
182
|
+
});
|
|
183
|
+
it('should have access to the request property', () => {
|
|
184
|
+
// Assert
|
|
185
|
+
expect(toolFunction.getRequest()).toBe(mockRequest);
|
|
186
|
+
});
|
|
187
|
+
});
|
|
188
|
+
});
|
|
189
|
+
//# sourceMappingURL=ToolFunction.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ToolFunction.test.js","sourceRoot":"","sources":["../../src/function/ToolFunction.test.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC;AACxC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,uBAAuB,CAAC;AACtC,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.InteractionResult = exports.Interaction = exports.Tool = void 0;
|
|
18
|
+
__exportStar(require("./function/ToolFunction"), exports);
|
|
19
|
+
__exportStar(require("./types/Models"), exports);
|
|
20
|
+
__exportStar(require("./decorator/Decorator"), exports);
|
|
21
|
+
var Service_1 = require("./service/Service");
|
|
22
|
+
Object.defineProperty(exports, "Tool", { enumerable: true, get: function () { return Service_1.Tool; } });
|
|
23
|
+
Object.defineProperty(exports, "Interaction", { enumerable: true, get: function () { return Service_1.Interaction; } });
|
|
24
|
+
Object.defineProperty(exports, "InteractionResult", { enumerable: true, get: function () { return Service_1.InteractionResult; } });
|
|
25
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,0DAAwC;AACxC,iDAA+B;AAC/B,wDAAsC;AACtC,6CAAyE;AAAhE,+FAAA,IAAI,OAAA;AAAE,sGAAA,WAAW,OAAA;AAAE,4GAAA,iBAAiB,OAAA"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { AuthRequirement, Parameter } from '../types/Models';
|
|
2
|
+
import * as App from '@zaiusinc/app-sdk';
|
|
3
|
+
/**
|
|
4
|
+
* Result type for interaction handlers
|
|
5
|
+
*/
|
|
6
|
+
export declare class InteractionResult {
|
|
7
|
+
message: string;
|
|
8
|
+
link?: string | undefined;
|
|
9
|
+
constructor(message: string, link?: string | undefined);
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Interaction definition for an Opal interaction
|
|
13
|
+
*/
|
|
14
|
+
export declare class Interaction<TAuthData> {
|
|
15
|
+
name: string;
|
|
16
|
+
endpoint: string;
|
|
17
|
+
handler: (data: unknown, authData?: TAuthData) => Promise<InteractionResult>;
|
|
18
|
+
constructor(name: string, endpoint: string, handler: (data: unknown, authData?: TAuthData) => Promise<InteractionResult>);
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Tool definition for an Opal tool
|
|
22
|
+
*/
|
|
23
|
+
export declare class Tool<TAuthData> {
|
|
24
|
+
name: string;
|
|
25
|
+
description: string;
|
|
26
|
+
parameters: Parameter[];
|
|
27
|
+
endpoint: string;
|
|
28
|
+
handler: (params: unknown, authData?: TAuthData) => Promise<unknown>;
|
|
29
|
+
authRequirements?: AuthRequirement[] | undefined;
|
|
30
|
+
/**
|
|
31
|
+
* HTTP method for the endpoint (default: POST)
|
|
32
|
+
*/
|
|
33
|
+
httpMethod: string;
|
|
34
|
+
/**
|
|
35
|
+
* Create a new function definition
|
|
36
|
+
* @param name Function name
|
|
37
|
+
* @param description Function description
|
|
38
|
+
* @param parameters Function parameters
|
|
39
|
+
* @param endpoint API endpoint
|
|
40
|
+
* @param handler Function implementing the tool
|
|
41
|
+
* @param authRequirements Authentication requirements (optional)
|
|
42
|
+
*/
|
|
43
|
+
constructor(name: string, description: string, parameters: Parameter[], endpoint: string, handler: (params: unknown, authData?: TAuthData) => Promise<unknown>, authRequirements?: AuthRequirement[] | undefined);
|
|
44
|
+
/**
|
|
45
|
+
* Convert to JSON for the discovery endpoint
|
|
46
|
+
*/
|
|
47
|
+
toJSON(): Record<string, unknown>;
|
|
48
|
+
}
|
|
49
|
+
export declare class ToolsService {
|
|
50
|
+
private functions;
|
|
51
|
+
private interactions;
|
|
52
|
+
/**
|
|
53
|
+
* Extract Bearer token from Authorization header
|
|
54
|
+
* @param headers Request headers (Map-like object or Headers object with get method)
|
|
55
|
+
* @returns Bearer token string or undefined
|
|
56
|
+
*/
|
|
57
|
+
extractBearerToken(headers: App.Headers): string | undefined;
|
|
58
|
+
/**
|
|
59
|
+
* Register a tool function with generic auth data
|
|
60
|
+
* @param name Tool name
|
|
61
|
+
* @param description Tool description
|
|
62
|
+
* @param handler Function implementing the tool
|
|
63
|
+
* @param parameters List of parameters for the tool
|
|
64
|
+
* @param endpoint API endpoint for the tool
|
|
65
|
+
* @param authRequirements Authentication requirements (optional)
|
|
66
|
+
*/
|
|
67
|
+
registerTool<TAuthData>(name: string, description: string, handler: (params: unknown, authData?: TAuthData) => Promise<unknown>, parameters: Parameter[], endpoint: string, authRequirements?: AuthRequirement[]): void;
|
|
68
|
+
/**
|
|
69
|
+
* Register a tool interaction with generic auth data
|
|
70
|
+
* @param name Tool name
|
|
71
|
+
* @param handler Function implementing the tool
|
|
72
|
+
* @param endpoint API endpoint for the tool
|
|
73
|
+
*/
|
|
74
|
+
registerInteraction<TAuthData>(name: string, handler: (data: unknown, authData?: TAuthData) => Promise<InteractionResult>, endpoint: string): void;
|
|
75
|
+
processRequest(req: App.Request): Promise<App.Response>;
|
|
76
|
+
}
|
|
77
|
+
export declare const toolsService: ToolsService;
|
|
78
|
+
//# sourceMappingURL=Service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Service.d.ts","sourceRoot":"","sources":["../../src/service/Service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC7D,OAAO,KAAK,GAAG,MAAM,mBAAmB,CAAC;AAKzC;;GAEG;AACH,qBAAa,iBAAiB;IAEnB,OAAO,EAAE,MAAM;IACf,IAAI,CAAC,EAAE,MAAM;gBADb,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE,MAAM,YAAA;CAEvB;AAED;;GAEG;AACH,qBAAa,WAAW,CAAC,SAAS;IAEvB,IAAI,EAAE,MAAM;IACZ,QAAQ,EAAE,MAAM;IAChB,OAAO,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,SAAS,KAAK,OAAO,CAAC,iBAAiB,CAAC;gBAF5E,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,SAAS,KAAK,OAAO,CAAC,iBAAiB,CAAC;CAEtF;AAED;;GAEG;AACH,qBAAa,IAAI,CAAC,SAAS;IAgBhB,IAAI,EAAE,MAAM;IACZ,WAAW,EAAE,MAAM;IACnB,UAAU,EAAE,SAAS,EAAE;IACvB,QAAQ,EAAE,MAAM;IAChB,OAAO,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,SAAS,KAAK,OAAO,CAAC,OAAO,CAAC;IACpE,gBAAgB,CAAC,EAAE,eAAe,EAAE;IApB7C;;OAEG;IACI,UAAU,EAAE,MAAM,CAAU;IAEnC;;;;;;;;OAQG;gBAEM,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,SAAS,EAAE,EACvB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,SAAS,KAAK,OAAO,CAAC,OAAO,CAAC,EACpE,gBAAgB,CAAC,EAAE,eAAe,EAAE,YAAA;IAG7C;;OAEG;IACI,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAezC;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,SAAS,CAAqC;IACtD,OAAO,CAAC,YAAY,CAA4C;IAEhE;;;;OAIG;IACI,kBAAkB,CAAC,OAAO,EAAE,GAAG,CAAC,OAAO,GAAG,MAAM,GAAG,SAAS;IAUnE;;;;;;;;OAQG;IACI,YAAY,CAAC,SAAS,EAC3B,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,SAAS,KAAK,OAAO,CAAC,OAAO,CAAC,EACpE,UAAU,EAAE,SAAS,EAAE,EACvB,QAAQ,EAAE,MAAM,EAChB,gBAAgB,CAAC,EAAE,eAAe,EAAE,GACnC,IAAI;IAKP;;;;;OAKG;IACI,mBAAmB,CAAC,SAAS,EAClC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,SAAS,KAAK,OAAO,CAAC,iBAAiB,CAAC,EAC5E,QAAQ,EAAE,MAAM,GACf,IAAI;IAKM,cAAc,CAAC,GAAG,EAAE,GAAG,CAAC,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;CAiDrE;AAED,eAAO,MAAM,YAAY,cAAqB,CAAC"}
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.toolsService = exports.ToolsService = exports.Tool = exports.Interaction = exports.InteractionResult = void 0;
|
|
37
|
+
const App = __importStar(require("@zaiusinc/app-sdk"));
|
|
38
|
+
const app_sdk_1 = require("@zaiusinc/app-sdk");
|
|
39
|
+
/**
|
|
40
|
+
* Result type for interaction handlers
|
|
41
|
+
*/
|
|
42
|
+
class InteractionResult {
|
|
43
|
+
message;
|
|
44
|
+
link;
|
|
45
|
+
constructor(message, link) {
|
|
46
|
+
this.message = message;
|
|
47
|
+
this.link = link;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
exports.InteractionResult = InteractionResult;
|
|
51
|
+
/**
|
|
52
|
+
* Interaction definition for an Opal interaction
|
|
53
|
+
*/
|
|
54
|
+
class Interaction {
|
|
55
|
+
name;
|
|
56
|
+
endpoint;
|
|
57
|
+
handler;
|
|
58
|
+
constructor(name, endpoint, handler) {
|
|
59
|
+
this.name = name;
|
|
60
|
+
this.endpoint = endpoint;
|
|
61
|
+
this.handler = handler;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
exports.Interaction = Interaction;
|
|
65
|
+
/**
|
|
66
|
+
* Tool definition for an Opal tool
|
|
67
|
+
*/
|
|
68
|
+
class Tool {
|
|
69
|
+
name;
|
|
70
|
+
description;
|
|
71
|
+
parameters;
|
|
72
|
+
endpoint;
|
|
73
|
+
handler;
|
|
74
|
+
authRequirements;
|
|
75
|
+
/**
|
|
76
|
+
* HTTP method for the endpoint (default: POST)
|
|
77
|
+
*/
|
|
78
|
+
httpMethod = 'POST';
|
|
79
|
+
/**
|
|
80
|
+
* Create a new function definition
|
|
81
|
+
* @param name Function name
|
|
82
|
+
* @param description Function description
|
|
83
|
+
* @param parameters Function parameters
|
|
84
|
+
* @param endpoint API endpoint
|
|
85
|
+
* @param handler Function implementing the tool
|
|
86
|
+
* @param authRequirements Authentication requirements (optional)
|
|
87
|
+
*/
|
|
88
|
+
constructor(name, description, parameters, endpoint, handler, authRequirements) {
|
|
89
|
+
this.name = name;
|
|
90
|
+
this.description = description;
|
|
91
|
+
this.parameters = parameters;
|
|
92
|
+
this.endpoint = endpoint;
|
|
93
|
+
this.handler = handler;
|
|
94
|
+
this.authRequirements = authRequirements;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Convert to JSON for the discovery endpoint
|
|
98
|
+
*/
|
|
99
|
+
toJSON() {
|
|
100
|
+
const result = {
|
|
101
|
+
name: this.name,
|
|
102
|
+
description: this.description,
|
|
103
|
+
parameters: this.parameters.map((p) => p.toJSON()),
|
|
104
|
+
endpoint: this.endpoint,
|
|
105
|
+
http_method: this.httpMethod
|
|
106
|
+
};
|
|
107
|
+
if (this.authRequirements && this.authRequirements.length > 0) {
|
|
108
|
+
result.auth_requirements = this.authRequirements.map((auth) => auth.toJSON());
|
|
109
|
+
}
|
|
110
|
+
return result;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
exports.Tool = Tool;
|
|
114
|
+
class ToolsService {
|
|
115
|
+
functions = new Map();
|
|
116
|
+
interactions = new Map();
|
|
117
|
+
/**
|
|
118
|
+
* Extract Bearer token from Authorization header
|
|
119
|
+
* @param headers Request headers (Map-like object or Headers object with get method)
|
|
120
|
+
* @returns Bearer token string or undefined
|
|
121
|
+
*/
|
|
122
|
+
extractBearerToken(headers) {
|
|
123
|
+
let bearerToken;
|
|
124
|
+
const authHeader = headers ? headers.get('authorization') : undefined;
|
|
125
|
+
if (authHeader && authHeader.startsWith('Bearer ')) {
|
|
126
|
+
bearerToken = authHeader.substring(7).trim();
|
|
127
|
+
}
|
|
128
|
+
return bearerToken;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Register a tool function with generic auth data
|
|
132
|
+
* @param name Tool name
|
|
133
|
+
* @param description Tool description
|
|
134
|
+
* @param handler Function implementing the tool
|
|
135
|
+
* @param parameters List of parameters for the tool
|
|
136
|
+
* @param endpoint API endpoint for the tool
|
|
137
|
+
* @param authRequirements Authentication requirements (optional)
|
|
138
|
+
*/
|
|
139
|
+
registerTool(name, description, handler, parameters, endpoint, authRequirements) {
|
|
140
|
+
const func = new Tool(name, description, parameters, endpoint, handler, authRequirements);
|
|
141
|
+
this.functions.set(endpoint, func);
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Register a tool interaction with generic auth data
|
|
145
|
+
* @param name Tool name
|
|
146
|
+
* @param handler Function implementing the tool
|
|
147
|
+
* @param endpoint API endpoint for the tool
|
|
148
|
+
*/
|
|
149
|
+
registerInteraction(name, handler, endpoint) {
|
|
150
|
+
const func = new Interaction(name, endpoint, handler);
|
|
151
|
+
this.interactions.set(endpoint, func);
|
|
152
|
+
}
|
|
153
|
+
async processRequest(req) {
|
|
154
|
+
if (req.path === '/discovery') {
|
|
155
|
+
return new App.Response(200, { functions: Array.from(this.functions.values()).map((f) => f.toJSON()) });
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
const func = this.functions.get(req.path);
|
|
159
|
+
if (func) {
|
|
160
|
+
try {
|
|
161
|
+
let params;
|
|
162
|
+
if (req.bodyJSON && req.bodyJSON.parameters) {
|
|
163
|
+
params = req.bodyJSON.parameters;
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
params = req.bodyJSON;
|
|
167
|
+
}
|
|
168
|
+
// Extract auth data from body JSON
|
|
169
|
+
const authData = req.bodyJSON ? req.bodyJSON.auth : undefined;
|
|
170
|
+
const result = await func.handler(params, authData);
|
|
171
|
+
return new App.Response(200, result);
|
|
172
|
+
}
|
|
173
|
+
catch (error) {
|
|
174
|
+
app_sdk_1.logger.error(`Error in function ${func.name}:`, error);
|
|
175
|
+
return new App.Response(500, { error: error.message || 'Unknown error' });
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
const interaction = this.interactions.get(req.path);
|
|
179
|
+
if (interaction) {
|
|
180
|
+
try {
|
|
181
|
+
let params;
|
|
182
|
+
if (req.bodyJSON && req.bodyJSON.data) {
|
|
183
|
+
params = req.bodyJSON.data;
|
|
184
|
+
}
|
|
185
|
+
else {
|
|
186
|
+
params = req.bodyJSON;
|
|
187
|
+
}
|
|
188
|
+
// Extract auth data from body JSON
|
|
189
|
+
const authData = req.bodyJSON ? req.bodyJSON.auth : undefined;
|
|
190
|
+
const result = await interaction.handler(params, authData);
|
|
191
|
+
return new App.Response(200, result);
|
|
192
|
+
}
|
|
193
|
+
catch (error) {
|
|
194
|
+
app_sdk_1.logger.error(`Error in function ${interaction.name}:`, error);
|
|
195
|
+
return new App.Response(500, { error: error.message || 'Unknown error' });
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
return new App.Response(404, 'Function not found');
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
exports.ToolsService = ToolsService;
|
|
203
|
+
exports.toolsService = new ToolsService();
|
|
204
|
+
//# sourceMappingURL=Service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Service.js","sourceRoot":"","sources":["../../src/service/Service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Service.test.d.ts","sourceRoot":"","sources":["../../src/service/Service.test.ts"],"names":[],"mappings":""}
|