@optimizely-opal/opal-tool-ocp-sdk 0.0.0-OCP-1487.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.
Files changed (72) hide show
  1. package/README.md +631 -0
  2. package/dist/auth/AuthUtils.d.ts +31 -0
  3. package/dist/auth/AuthUtils.d.ts.map +1 -0
  4. package/dist/auth/AuthUtils.js +64 -0
  5. package/dist/auth/AuthUtils.js.map +1 -0
  6. package/dist/auth/AuthUtils.test.d.ts +2 -0
  7. package/dist/auth/AuthUtils.test.d.ts.map +1 -0
  8. package/dist/auth/AuthUtils.test.js +469 -0
  9. package/dist/auth/AuthUtils.test.js.map +1 -0
  10. package/dist/auth/TokenVerifier.d.ts +31 -0
  11. package/dist/auth/TokenVerifier.d.ts.map +1 -0
  12. package/dist/auth/TokenVerifier.js +127 -0
  13. package/dist/auth/TokenVerifier.js.map +1 -0
  14. package/dist/auth/TokenVerifier.test.d.ts +2 -0
  15. package/dist/auth/TokenVerifier.test.d.ts.map +1 -0
  16. package/dist/auth/TokenVerifier.test.js +125 -0
  17. package/dist/auth/TokenVerifier.test.js.map +1 -0
  18. package/dist/decorator/Decorator.d.ts +48 -0
  19. package/dist/decorator/Decorator.d.ts.map +1 -0
  20. package/dist/decorator/Decorator.js +53 -0
  21. package/dist/decorator/Decorator.js.map +1 -0
  22. package/dist/decorator/Decorator.test.d.ts +2 -0
  23. package/dist/decorator/Decorator.test.d.ts.map +1 -0
  24. package/dist/decorator/Decorator.test.js +528 -0
  25. package/dist/decorator/Decorator.test.js.map +1 -0
  26. package/dist/function/GlobalToolFunction.d.ts +28 -0
  27. package/dist/function/GlobalToolFunction.d.ts.map +1 -0
  28. package/dist/function/GlobalToolFunction.js +56 -0
  29. package/dist/function/GlobalToolFunction.js.map +1 -0
  30. package/dist/function/GlobalToolFunction.test.d.ts +2 -0
  31. package/dist/function/GlobalToolFunction.test.d.ts.map +1 -0
  32. package/dist/function/GlobalToolFunction.test.js +425 -0
  33. package/dist/function/GlobalToolFunction.test.js.map +1 -0
  34. package/dist/function/ToolFunction.d.ts +28 -0
  35. package/dist/function/ToolFunction.d.ts.map +1 -0
  36. package/dist/function/ToolFunction.js +60 -0
  37. package/dist/function/ToolFunction.js.map +1 -0
  38. package/dist/function/ToolFunction.test.d.ts +2 -0
  39. package/dist/function/ToolFunction.test.d.ts.map +1 -0
  40. package/dist/function/ToolFunction.test.js +314 -0
  41. package/dist/function/ToolFunction.test.js.map +1 -0
  42. package/dist/index.d.ts +6 -0
  43. package/dist/index.d.ts.map +1 -0
  44. package/dist/index.js +26 -0
  45. package/dist/index.js.map +1 -0
  46. package/dist/service/Service.d.ts +80 -0
  47. package/dist/service/Service.d.ts.map +1 -0
  48. package/dist/service/Service.js +210 -0
  49. package/dist/service/Service.js.map +1 -0
  50. package/dist/service/Service.test.d.ts +2 -0
  51. package/dist/service/Service.test.d.ts.map +1 -0
  52. package/dist/service/Service.test.js +427 -0
  53. package/dist/service/Service.test.js.map +1 -0
  54. package/dist/types/Models.d.ts +126 -0
  55. package/dist/types/Models.d.ts.map +1 -0
  56. package/dist/types/Models.js +181 -0
  57. package/dist/types/Models.js.map +1 -0
  58. package/package.json +64 -0
  59. package/src/auth/AuthUtils.test.ts +586 -0
  60. package/src/auth/AuthUtils.ts +66 -0
  61. package/src/auth/TokenVerifier.test.ts +165 -0
  62. package/src/auth/TokenVerifier.ts +145 -0
  63. package/src/decorator/Decorator.test.ts +649 -0
  64. package/src/decorator/Decorator.ts +111 -0
  65. package/src/function/GlobalToolFunction.test.ts +505 -0
  66. package/src/function/GlobalToolFunction.ts +61 -0
  67. package/src/function/ToolFunction.test.ts +374 -0
  68. package/src/function/ToolFunction.ts +64 -0
  69. package/src/index.ts +5 -0
  70. package/src/service/Service.test.ts +661 -0
  71. package/src/service/Service.ts +213 -0
  72. package/src/types/Models.ts +163 -0
@@ -0,0 +1,314 @@
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
+ const TokenVerifier_1 = require("../auth/TokenVerifier");
7
+ // Mock the dependencies
8
+ jest.mock('../service/Service', () => ({
9
+ toolsService: {
10
+ processRequest: jest.fn(),
11
+ },
12
+ }));
13
+ jest.mock('../auth/TokenVerifier', () => ({
14
+ getTokenVerifier: jest.fn(),
15
+ }));
16
+ jest.mock('@zaiusinc/app-sdk', () => ({
17
+ Function: class {
18
+ request;
19
+ constructor(_name) {
20
+ this.request = {};
21
+ }
22
+ },
23
+ Request: jest.fn().mockImplementation(() => ({})),
24
+ Response: jest.fn().mockImplementation((status, data) => ({
25
+ status,
26
+ data,
27
+ bodyJSON: data,
28
+ bodyAsU8Array: new Uint8Array()
29
+ })),
30
+ amendLogContext: jest.fn(),
31
+ getAppContext: jest.fn(),
32
+ logger: {
33
+ info: jest.fn(),
34
+ error: jest.fn(),
35
+ warn: jest.fn(),
36
+ debug: jest.fn(),
37
+ },
38
+ }));
39
+ // Create a concrete implementation for testing
40
+ class TestToolFunction extends ToolFunction_1.ToolFunction {
41
+ mockReady;
42
+ constructor(request) {
43
+ super(request || {});
44
+ this.request = request;
45
+ this.mockReady = jest.fn().mockResolvedValue(true);
46
+ }
47
+ // Override the ready method with mock implementation for testing
48
+ ready() {
49
+ return this.mockReady();
50
+ }
51
+ getRequest() {
52
+ return this.request;
53
+ }
54
+ getMockReady() {
55
+ return this.mockReady;
56
+ }
57
+ }
58
+ describe('ToolFunction', () => {
59
+ let mockRequest;
60
+ let mockResponse;
61
+ let toolFunction;
62
+ let mockProcessRequest;
63
+ let mockGetTokenVerifier;
64
+ let mockGetAppContext;
65
+ let mockTokenVerifier;
66
+ beforeEach(() => {
67
+ jest.clearAllMocks();
68
+ // Create mock token verifier
69
+ mockTokenVerifier = {
70
+ verify: jest.fn(),
71
+ };
72
+ // Setup the mocks
73
+ mockProcessRequest = jest.mocked(Service_1.toolsService.processRequest);
74
+ mockGetTokenVerifier = jest.mocked(TokenVerifier_1.getTokenVerifier);
75
+ mockGetAppContext = jest.mocked(app_sdk_1.getAppContext);
76
+ mockGetTokenVerifier.mockResolvedValue(mockTokenVerifier);
77
+ mockGetAppContext.mockReturnValue({
78
+ account: {
79
+ organizationId: 'app-org-123'
80
+ }
81
+ });
82
+ // Create mock request with bodyJSON structure
83
+ mockRequest = {
84
+ headers: new Map(),
85
+ method: 'POST',
86
+ path: '/test',
87
+ bodyJSON: {
88
+ parameters: {
89
+ task_id: 'task-123',
90
+ content_id: 'content-456'
91
+ },
92
+ auth: {
93
+ provider: 'OptiID',
94
+ credentials: {
95
+ token_type: 'Bearer',
96
+ access_token: 'valid-access-token',
97
+ org_sso_id: 'org-sso-123',
98
+ user_id: 'user-456',
99
+ instance_id: 'instance-789',
100
+ customer_id: 'app-org-123',
101
+ product_sku: 'OPAL'
102
+ }
103
+ },
104
+ environment: {
105
+ execution_mode: 'headless'
106
+ }
107
+ }
108
+ };
109
+ mockResponse = {};
110
+ toolFunction = new TestToolFunction(mockRequest);
111
+ });
112
+ // Helper function to create a ready request with valid auth
113
+ const createReadyRequestWithAuth = () => ({
114
+ headers: new Map(),
115
+ method: 'GET',
116
+ path: '/ready',
117
+ bodyJSON: {
118
+ auth: {
119
+ provider: 'OptiID',
120
+ credentials: {
121
+ access_token: 'valid-token',
122
+ customer_id: 'app-org-123'
123
+ }
124
+ }
125
+ }
126
+ });
127
+ // Helper function to setup authorization mocks to pass
128
+ const setupAuthMocks = () => {
129
+ mockTokenVerifier.verify.mockResolvedValue(true);
130
+ mockGetAppContext.mockReturnValue({
131
+ account: {
132
+ organizationId: 'app-org-123'
133
+ }
134
+ });
135
+ };
136
+ describe('/ready endpoint', () => {
137
+ beforeEach(() => {
138
+ setupAuthMocks();
139
+ });
140
+ it('should return ready: true when ready method returns true', async () => {
141
+ // Arrange
142
+ const readyRequest = createReadyRequestWithAuth();
143
+ toolFunction = new TestToolFunction(readyRequest);
144
+ toolFunction.getMockReady().mockResolvedValue(true);
145
+ // Act
146
+ const result = await toolFunction.perform();
147
+ // Assert
148
+ expect(toolFunction.getMockReady()).toHaveBeenCalledTimes(1);
149
+ expect(result).toEqual(new app_sdk_1.Response(200, { ready: true }));
150
+ expect(mockProcessRequest).not.toHaveBeenCalled(); // Should not call service
151
+ });
152
+ it('should return ready: false when ready method returns false', async () => {
153
+ // Arrange
154
+ const readyRequest = createReadyRequestWithAuth();
155
+ toolFunction = new TestToolFunction(readyRequest);
156
+ toolFunction.getMockReady().mockResolvedValue(false);
157
+ // Act
158
+ const result = await toolFunction.perform();
159
+ // Assert
160
+ expect(toolFunction.getMockReady()).toHaveBeenCalledTimes(1);
161
+ expect(result).toEqual(new app_sdk_1.Response(200, { ready: false }));
162
+ expect(mockProcessRequest).not.toHaveBeenCalled(); // Should not call service
163
+ });
164
+ it('should handle ready method throwing an error', async () => {
165
+ // Arrange
166
+ const readyRequest = createReadyRequestWithAuth();
167
+ toolFunction = new TestToolFunction(readyRequest);
168
+ toolFunction.getMockReady().mockRejectedValue(new Error('Ready check failed'));
169
+ // Act & Assert
170
+ await expect(toolFunction.perform()).rejects.toThrow('Ready check failed');
171
+ expect(toolFunction.getMockReady()).toHaveBeenCalledTimes(1);
172
+ expect(mockProcessRequest).not.toHaveBeenCalled(); // Should not call service
173
+ });
174
+ it('should use default ready implementation when not overridden', async () => {
175
+ // Create a class that doesn't override ready method
176
+ class DefaultReadyToolFunction extends ToolFunction_1.ToolFunction {
177
+ constructor(request) {
178
+ super(request || {});
179
+ this.request = request;
180
+ }
181
+ getRequest() {
182
+ return this.request;
183
+ }
184
+ }
185
+ // Arrange
186
+ const readyRequest = createReadyRequestWithAuth();
187
+ const defaultToolFunction = new DefaultReadyToolFunction(readyRequest);
188
+ // Act
189
+ const result = await defaultToolFunction.perform();
190
+ // Assert - Default implementation should return true
191
+ expect(result).toEqual(new app_sdk_1.Response(200, { ready: true }));
192
+ expect(mockProcessRequest).not.toHaveBeenCalled(); // Should not call service
193
+ });
194
+ });
195
+ describe('perform', () => {
196
+ it('should execute successfully with valid token and matching organization', async () => {
197
+ // Setup mock token verifier to return true for valid token
198
+ mockTokenVerifier.verify.mockResolvedValue(true);
199
+ mockProcessRequest.mockResolvedValue(mockResponse);
200
+ const result = await toolFunction.perform();
201
+ expect(result).toBe(mockResponse);
202
+ expect(mockGetTokenVerifier).toHaveBeenCalled();
203
+ expect(mockTokenVerifier.verify).toHaveBeenCalledWith('valid-access-token');
204
+ expect(mockGetAppContext).toHaveBeenCalled();
205
+ expect(mockProcessRequest).toHaveBeenCalledWith(mockRequest, toolFunction);
206
+ });
207
+ it('should return 403 response with invalid token', async () => {
208
+ // Setup mock token verifier to return false
209
+ mockTokenVerifier.verify.mockResolvedValue(false);
210
+ const result = await toolFunction.perform();
211
+ expect(result).toEqual(new app_sdk_1.Response(403, { error: 'Forbidden' }));
212
+ expect(mockGetTokenVerifier).toHaveBeenCalled();
213
+ expect(mockTokenVerifier.verify).toHaveBeenCalledWith('valid-access-token');
214
+ expect(mockProcessRequest).not.toHaveBeenCalled();
215
+ });
216
+ it('should return 403 response when organization ID does not match', async () => {
217
+ // Update mock request with different customer_id
218
+ const requestWithDifferentOrgId = {
219
+ ...mockRequest,
220
+ bodyJSON: {
221
+ ...mockRequest.bodyJSON,
222
+ auth: {
223
+ ...mockRequest.bodyJSON.auth,
224
+ credentials: {
225
+ ...mockRequest.bodyJSON.auth.credentials,
226
+ customer_id: 'different-org-123'
227
+ }
228
+ }
229
+ }
230
+ };
231
+ const toolFunctionWithDifferentOrgId = new TestToolFunction(requestWithDifferentOrgId);
232
+ const result = await toolFunctionWithDifferentOrgId.perform();
233
+ expect(result).toEqual(new app_sdk_1.Response(403, { error: 'Forbidden' }));
234
+ expect(mockGetAppContext).toHaveBeenCalled();
235
+ expect(mockProcessRequest).not.toHaveBeenCalled();
236
+ });
237
+ it('should return 403 response when access token is missing', async () => {
238
+ // Create request without access token
239
+ const requestWithoutToken = {
240
+ ...mockRequest,
241
+ bodyJSON: {
242
+ ...mockRequest.bodyJSON,
243
+ auth: {
244
+ ...mockRequest.bodyJSON.auth,
245
+ credentials: {
246
+ ...mockRequest.bodyJSON.auth.credentials,
247
+ access_token: undefined
248
+ }
249
+ }
250
+ }
251
+ };
252
+ const toolFunctionWithoutToken = new TestToolFunction(requestWithoutToken);
253
+ const result = await toolFunctionWithoutToken.perform();
254
+ expect(result).toEqual(new app_sdk_1.Response(403, { error: 'Forbidden' }));
255
+ expect(mockGetTokenVerifier).not.toHaveBeenCalled();
256
+ expect(mockProcessRequest).not.toHaveBeenCalled();
257
+ });
258
+ it('should return 403 response when organisation id is missing', async () => {
259
+ // Create request without customer_id
260
+ const requestWithoutCustomerId = {
261
+ ...mockRequest,
262
+ bodyJSON: {
263
+ ...mockRequest.bodyJSON,
264
+ auth: {
265
+ ...mockRequest.bodyJSON.auth,
266
+ credentials: {
267
+ ...mockRequest.bodyJSON.auth.credentials,
268
+ customer_id: undefined
269
+ }
270
+ }
271
+ }
272
+ };
273
+ const toolFunctionWithoutCustomerId = new TestToolFunction(requestWithoutCustomerId);
274
+ const result = await toolFunctionWithoutCustomerId.perform();
275
+ expect(result).toEqual(new app_sdk_1.Response(403, { error: 'Forbidden' }));
276
+ expect(mockGetTokenVerifier).not.toHaveBeenCalled();
277
+ expect(mockProcessRequest).not.toHaveBeenCalled();
278
+ });
279
+ it('should return 403 response when auth structure is missing', async () => {
280
+ // Create request without auth structure
281
+ const requestWithoutAuth = {
282
+ ...mockRequest,
283
+ bodyJSON: {
284
+ parameters: mockRequest.bodyJSON.parameters,
285
+ environment: mockRequest.bodyJSON.environment
286
+ }
287
+ };
288
+ const toolFunctionWithoutAuth = new TestToolFunction(requestWithoutAuth);
289
+ const result = await toolFunctionWithoutAuth.perform();
290
+ expect(result).toEqual(new app_sdk_1.Response(403, { error: 'Forbidden' }));
291
+ expect(mockGetTokenVerifier).not.toHaveBeenCalled();
292
+ expect(mockProcessRequest).not.toHaveBeenCalled();
293
+ });
294
+ it('should return 403 response when token verifier initialization fails', async () => {
295
+ // Setup mock to fail during token verifier initialization
296
+ mockGetTokenVerifier.mockRejectedValue(new Error('Failed to initialize token verifier'));
297
+ const result = await toolFunction.perform();
298
+ expect(result).toEqual(new app_sdk_1.Response(403, { error: 'Forbidden' }));
299
+ expect(mockGetTokenVerifier).toHaveBeenCalled();
300
+ expect(mockProcessRequest).not.toHaveBeenCalled();
301
+ });
302
+ });
303
+ describe('inheritance', () => {
304
+ it('should be an instance of Function', () => {
305
+ // Assert
306
+ expect(toolFunction).toBeInstanceOf(ToolFunction_1.ToolFunction);
307
+ });
308
+ it('should have access to the request property', () => {
309
+ // Assert
310
+ expect(toolFunction.getRequest()).toBe(mockRequest);
311
+ });
312
+ });
313
+ });
314
+ //# 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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"}
@@ -0,0 +1,6 @@
1
+ export * from './function/ToolFunction';
2
+ export * from './types/Models';
3
+ export * from './decorator/Decorator';
4
+ export * from './auth/TokenVerifier';
5
+ export { Tool, Interaction, InteractionResult } from './service/Service';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -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,cAAc,sBAAsB,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,26 @@
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
+ __exportStar(require("./auth/TokenVerifier"), exports);
22
+ var Service_1 = require("./service/Service");
23
+ Object.defineProperty(exports, "Tool", { enumerable: true, get: function () { return Service_1.Tool; } });
24
+ Object.defineProperty(exports, "Interaction", { enumerable: true, get: function () { return Service_1.Interaction; } });
25
+ Object.defineProperty(exports, "InteractionResult", { enumerable: true, get: function () { return Service_1.InteractionResult; } });
26
+ //# 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,uDAAqC;AACrC,6CAAyE;AAAhE,+FAAA,IAAI,OAAA;AAAE,sGAAA,WAAW,OAAA;AAAE,4GAAA,iBAAiB,OAAA"}
@@ -0,0 +1,80 @@
1
+ import { AuthRequirement, Parameter } from '../types/Models';
2
+ import * as App from '@zaiusinc/app-sdk';
3
+ import { ToolFunction } from '../function/ToolFunction';
4
+ import { GlobalToolFunction } from '../function/GlobalToolFunction';
5
+ /**
6
+ * Result type for interaction handlers
7
+ */
8
+ export declare class InteractionResult {
9
+ message: string;
10
+ link?: string | undefined;
11
+ constructor(message: string, link?: string | undefined);
12
+ }
13
+ /**
14
+ * Interaction definition for an Opal interaction
15
+ */
16
+ export declare class Interaction<TAuthData> {
17
+ name: string;
18
+ endpoint: string;
19
+ handler: (functionContext: ToolFunction | GlobalToolFunction, data: unknown, authData?: TAuthData) => Promise<InteractionResult>;
20
+ constructor(name: string, endpoint: string, handler: (functionContext: ToolFunction | GlobalToolFunction, data: unknown, authData?: TAuthData) => Promise<InteractionResult>);
21
+ }
22
+ /**
23
+ * Tool definition for an Opal tool
24
+ */
25
+ export declare class Tool<TAuthData> {
26
+ name: string;
27
+ description: string;
28
+ parameters: Parameter[];
29
+ endpoint: string;
30
+ handler: (functionContext: ToolFunction | GlobalToolFunction, params: unknown, authData?: TAuthData) => Promise<unknown>;
31
+ authRequirements: AuthRequirement[];
32
+ /**
33
+ * HTTP method for the endpoint (default: POST)
34
+ */
35
+ httpMethod: string;
36
+ /**
37
+ * Create a new function definition
38
+ * @param name Function name
39
+ * @param description Function description
40
+ * @param parameters Function parameters
41
+ * @param endpoint API endpoint
42
+ * @param handler Function implementing the tool
43
+ * @param authRequirements Authentication requirements (mandatory - OptiID enforced)
44
+ */
45
+ constructor(name: string, description: string, parameters: Parameter[], endpoint: string, handler: (functionContext: ToolFunction | GlobalToolFunction, params: unknown, authData?: TAuthData) => Promise<unknown>, authRequirements?: AuthRequirement[]);
46
+ /**
47
+ * Convert to JSON for the discovery endpoint
48
+ */
49
+ toJSON(): Record<string, unknown>;
50
+ }
51
+ export declare class ToolsService {
52
+ private functions;
53
+ private interactions;
54
+ /**
55
+ * Enforce OptiID authentication for tools by ensuring OptiID auth requirement is present
56
+ * @param authRequirements Original authentication requirements
57
+ * @returns Enforced authentication requirements with OptiID
58
+ */
59
+ private enforceOptiIdAuth;
60
+ /**
61
+ * Register a tool function with generic auth data
62
+ * @param name Tool name
63
+ * @param description Tool description
64
+ * @param handler Function implementing the tool
65
+ * @param parameters List of parameters for the tool
66
+ * @param endpoint API endpoint for the tool
67
+ * @param authRequirements Authentication requirements (optional)
68
+ */
69
+ registerTool<TAuthData>(name: string, description: string, handler: (functionContext: ToolFunction | GlobalToolFunction, params: unknown, authData?: TAuthData) => Promise<unknown>, parameters: Parameter[], endpoint: string, authRequirements?: AuthRequirement[]): void;
70
+ /**
71
+ * Register a tool interaction with generic auth data
72
+ * @param name Tool name
73
+ * @param handler Function implementing the tool
74
+ * @param endpoint API endpoint for the tool
75
+ */
76
+ registerInteraction<TAuthData>(name: string, handler: (functionContext: ToolFunction | GlobalToolFunction, data: unknown, authData?: TAuthData) => Promise<InteractionResult>, endpoint: string): void;
77
+ processRequest(req: App.Request, functionContext: ToolFunction | GlobalToolFunction): Promise<App.Response>;
78
+ }
79
+ export declare const toolsService: ToolsService;
80
+ //# sourceMappingURL=Service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Service.d.ts","sourceRoot":"","sources":["../../src/service/Service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,210 @@
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
+ /* eslint-disable max-classes-per-file */
38
+ const Models_1 = require("../types/Models");
39
+ const App = __importStar(require("@zaiusinc/app-sdk"));
40
+ const app_sdk_1 = require("@zaiusinc/app-sdk");
41
+ /**
42
+ * Default OptiID authentication requirement that will be enforced for all tools
43
+ */
44
+ const DEFAULT_OPTIID_AUTH = new Models_1.AuthRequirement('OptiID', 'default', true);
45
+ /**
46
+ * Result type for interaction handlers
47
+ */
48
+ class InteractionResult {
49
+ message;
50
+ link;
51
+ constructor(message, link) {
52
+ this.message = message;
53
+ this.link = link;
54
+ }
55
+ }
56
+ exports.InteractionResult = InteractionResult;
57
+ /**
58
+ * Interaction definition for an Opal interaction
59
+ */
60
+ class Interaction {
61
+ name;
62
+ endpoint;
63
+ handler;
64
+ constructor(name, endpoint, handler) {
65
+ this.name = name;
66
+ this.endpoint = endpoint;
67
+ this.handler = handler;
68
+ }
69
+ }
70
+ exports.Interaction = Interaction;
71
+ /**
72
+ * Tool definition for an Opal tool
73
+ */
74
+ class Tool {
75
+ name;
76
+ description;
77
+ parameters;
78
+ endpoint;
79
+ handler;
80
+ authRequirements;
81
+ /**
82
+ * HTTP method for the endpoint (default: POST)
83
+ */
84
+ httpMethod = 'POST';
85
+ /**
86
+ * Create a new function definition
87
+ * @param name Function name
88
+ * @param description Function description
89
+ * @param parameters Function parameters
90
+ * @param endpoint API endpoint
91
+ * @param handler Function implementing the tool
92
+ * @param authRequirements Authentication requirements (mandatory - OptiID enforced)
93
+ */
94
+ constructor(name, description, parameters, endpoint, handler, authRequirements = [DEFAULT_OPTIID_AUTH]) {
95
+ this.name = name;
96
+ this.description = description;
97
+ this.parameters = parameters;
98
+ this.endpoint = endpoint;
99
+ this.handler = handler;
100
+ this.authRequirements = authRequirements;
101
+ }
102
+ /**
103
+ * Convert to JSON for the discovery endpoint
104
+ */
105
+ toJSON() {
106
+ const result = {
107
+ name: this.name,
108
+ description: this.description,
109
+ parameters: this.parameters.map((p) => p.toJSON()),
110
+ endpoint: this.endpoint,
111
+ http_method: this.httpMethod,
112
+ auth_requirements: this.authRequirements.map((auth) => auth.toJSON())
113
+ };
114
+ return result;
115
+ }
116
+ }
117
+ exports.Tool = Tool;
118
+ class ToolsService {
119
+ functions = new Map();
120
+ interactions = new Map();
121
+ /**
122
+ * Enforce OptiID authentication for tools by ensuring OptiID auth requirement is present
123
+ * @param authRequirements Original authentication requirements
124
+ * @returns Enforced authentication requirements with OptiID
125
+ */
126
+ enforceOptiIdAuth(authRequirements) {
127
+ const hasOptiIdProvider = authRequirements
128
+ && authRequirements.some((auth) => auth.provider.toLowerCase() === 'optiid');
129
+ if (hasOptiIdProvider) {
130
+ return authRequirements;
131
+ }
132
+ return [...(authRequirements || []), DEFAULT_OPTIID_AUTH];
133
+ }
134
+ /**
135
+ * Register a tool function with generic auth data
136
+ * @param name Tool name
137
+ * @param description Tool description
138
+ * @param handler Function implementing the tool
139
+ * @param parameters List of parameters for the tool
140
+ * @param endpoint API endpoint for the tool
141
+ * @param authRequirements Authentication requirements (optional)
142
+ */
143
+ registerTool(name, description, handler, parameters, endpoint, authRequirements) {
144
+ // Enforce OptiID authentication for all tools
145
+ const enforcedAuthRequirements = this.enforceOptiIdAuth(authRequirements);
146
+ const func = new Tool(name, description, parameters, endpoint, handler, enforcedAuthRequirements);
147
+ this.functions.set(endpoint, func);
148
+ }
149
+ /**
150
+ * Register a tool interaction with generic auth data
151
+ * @param name Tool name
152
+ * @param handler Function implementing the tool
153
+ * @param endpoint API endpoint for the tool
154
+ */
155
+ registerInteraction(name, handler, endpoint) {
156
+ const func = new Interaction(name, endpoint, handler);
157
+ this.interactions.set(endpoint, func);
158
+ }
159
+ async processRequest(req, functionContext) {
160
+ if (req.path === '/discovery') {
161
+ return new App.Response(200, { functions: Array.from(this.functions.values()).map((f) => f.toJSON()) });
162
+ }
163
+ else {
164
+ const func = this.functions.get(req.path);
165
+ if (func) {
166
+ try {
167
+ let params;
168
+ if (req.bodyJSON && req.bodyJSON.parameters) {
169
+ params = req.bodyJSON.parameters;
170
+ }
171
+ else {
172
+ params = req.bodyJSON;
173
+ }
174
+ // Extract auth data from body JSON
175
+ const authData = req.bodyJSON ? req.bodyJSON.auth : undefined;
176
+ const result = await func.handler(functionContext, params, authData);
177
+ return new App.Response(200, result);
178
+ }
179
+ catch (error) {
180
+ app_sdk_1.logger.error(`Error in function ${func.name}:`, error);
181
+ return new App.Response(500, { error: error.message || 'Unknown error' });
182
+ }
183
+ }
184
+ const interaction = this.interactions.get(req.path);
185
+ if (interaction) {
186
+ try {
187
+ let params;
188
+ if (req.bodyJSON && req.bodyJSON.data) {
189
+ params = req.bodyJSON.data;
190
+ }
191
+ else {
192
+ params = req.bodyJSON;
193
+ }
194
+ // Extract auth data from body JSON
195
+ const authData = req.bodyJSON ? req.bodyJSON.auth : undefined;
196
+ const result = await interaction.handler(functionContext, params, authData);
197
+ return new App.Response(200, result);
198
+ }
199
+ catch (error) {
200
+ app_sdk_1.logger.error(`Error in function ${interaction.name}:`, error);
201
+ return new App.Response(500, { error: error.message || 'Unknown error' });
202
+ }
203
+ }
204
+ return new App.Response(404, 'Function not found');
205
+ }
206
+ }
207
+ }
208
+ exports.ToolsService = ToolsService;
209
+ exports.toolsService = new ToolsService();
210
+ //# sourceMappingURL=Service.js.map