@trikhub/gateway 0.1.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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2024 Muffles
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,97 @@
1
+ import { type TrikManifest, type GatewayResult, type ClarificationQuestion, type ClarificationAnswer, type ResponseTemplate, type ResponseMode, type PassthroughContent, type PassthroughDeliveryReceipt } from '@trikhub/manifest';
2
+ import { type SessionStorage } from './session-storage.js';
3
+ export interface TrikGatewayConfig {
4
+ allowedTriks?: string[];
5
+ onClarificationNeeded?: (trikId: string, questions: ClarificationQuestion[]) => Promise<ClarificationAnswer[]>;
6
+ sessionStorage?: SessionStorage;
7
+ /**
8
+ * Directory containing installed triks (triks) for auto-discovery.
9
+ * Supports scoped directory structure: triksDirectory/@scope/trik-name/
10
+ * Use '~' for home directory (e.g., '~/.trikhub/triks')
11
+ */
12
+ triksDirectory?: string;
13
+ }
14
+ export interface ExecuteTrikOptions {
15
+ sessionId?: string;
16
+ }
17
+ export type GatewayResultWithSession<TAgent = unknown> = GatewayResult<TAgent> & {
18
+ sessionId?: string;
19
+ };
20
+ export interface ToolDefinition {
21
+ name: string;
22
+ description: string;
23
+ inputSchema: import('@trikhub/manifest').JSONSchema;
24
+ responseMode: ResponseMode;
25
+ isGatewayTool?: boolean;
26
+ }
27
+ export interface TrikInfo {
28
+ id: string;
29
+ name: string;
30
+ description: string;
31
+ tools: ToolDefinition[];
32
+ sessionEnabled: boolean;
33
+ }
34
+ export interface GetToolDefinitionsOptions {
35
+ includeReadContent?: boolean;
36
+ }
37
+ export declare class TrikGateway {
38
+ private validator;
39
+ private config;
40
+ private sessionStorage;
41
+ private triks;
42
+ private contentReferences;
43
+ private static CONTENT_REF_TTL_MS;
44
+ constructor(config?: TrikGatewayConfig);
45
+ loadTrik(trikPath: string): Promise<TrikManifest>;
46
+ /**
47
+ * Load all triks from a directory.
48
+ * Supports scoped directory structure: directory/@scope/trik-name/
49
+ *
50
+ * @param directory - Path to the directory containing triks.
51
+ * Use '~' prefix for home directory (e.g., '~/.trikhub/triks')
52
+ * @returns Array of successfully loaded manifests
53
+ */
54
+ loadTriksFromDirectory(directory: string): Promise<TrikManifest[]>;
55
+ /**
56
+ * Load triks from the configured triksDirectory (if set).
57
+ * This is a convenience method for loading the default TrikHub directory.
58
+ */
59
+ loadInstalledTriks(): Promise<TrikManifest[]>;
60
+ getManifest(trikId: string): TrikManifest | undefined;
61
+ getLoadedTriks(): string[];
62
+ isLoaded(trikId: string): boolean;
63
+ getAvailableTriks(): TrikInfo[];
64
+ getToolDefinitions(_options?: GetToolDefinitionsOptions): ToolDefinition[];
65
+ private actionToToolDefinition;
66
+ execute<TAgent = unknown>(trikId: string, actionName: string, input: unknown, options?: ExecuteTrikOptions): Promise<GatewayResultWithSession<TAgent>>;
67
+ private executeWithTimeout;
68
+ private processResult;
69
+ /**
70
+ * Add sessionId to result if session exists
71
+ */
72
+ private addSessionId;
73
+ /**
74
+ * Store passthrough content and return a reference
75
+ */
76
+ private storePassthroughContent;
77
+ /**
78
+ * Clean up expired content references
79
+ */
80
+ private cleanupExpiredContentReferences;
81
+ /**
82
+ * Deliver passthrough content to the user.
83
+ * One-time delivery - the reference is deleted after delivery.
84
+ */
85
+ deliverContent(ref: string): {
86
+ content: PassthroughContent;
87
+ receipt: PassthroughDeliveryReceipt;
88
+ } | null;
89
+ hasContentRef(ref: string): boolean;
90
+ getContentRefInfo(ref: string): {
91
+ contentType: string;
92
+ metadata?: Record<string, unknown>;
93
+ } | null;
94
+ resolveTemplate(template: ResponseTemplate, agentData: Record<string, unknown>): string;
95
+ getActionTemplates(trikId: string, actionName: string): Record<string, ResponseTemplate> | undefined;
96
+ }
97
+ //# sourceMappingURL=gateway.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateway.d.ts","sourceRoot":"","sources":["../src/gateway.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,421 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { readFile, readdir, stat } from 'node:fs/promises';
3
+ import { join, resolve } from 'node:path';
4
+ import { homedir } from 'node:os';
5
+ import { pathToFileURL } from 'node:url';
6
+ import { validateManifest, SchemaValidator, } from '@trikhub/manifest';
7
+ import { InMemorySessionStorage } from './session-storage.js';
8
+ export class TrikGateway {
9
+ validator = new SchemaValidator();
10
+ config;
11
+ sessionStorage;
12
+ // Loaded triks (by trik ID)
13
+ triks = new Map();
14
+ contentReferences = new Map();
15
+ static CONTENT_REF_TTL_MS = 10 * 60 * 1000;
16
+ constructor(config = {}) {
17
+ this.config = config;
18
+ this.sessionStorage = config.sessionStorage ?? new InMemorySessionStorage();
19
+ }
20
+ async loadTrik(trikPath) {
21
+ const manifestPath = join(trikPath, 'manifest.json');
22
+ const manifestContent = await readFile(manifestPath, 'utf-8');
23
+ const manifestData = JSON.parse(manifestContent);
24
+ const validation = validateManifest(manifestData);
25
+ if (!validation.valid) {
26
+ throw new Error(`Invalid manifest at ${manifestPath}: ${validation.errors?.join(', ')}`);
27
+ }
28
+ const manifest = manifestData;
29
+ if (this.config.allowedTriks && !this.config.allowedTriks.includes(manifest.id)) {
30
+ throw new Error(`Trik "${manifest.id}" is not in the allowlist`);
31
+ }
32
+ const modulePath = join(trikPath, manifest.entry.module);
33
+ const moduleUrl = pathToFileURL(modulePath).href;
34
+ const module = await import(moduleUrl);
35
+ const graph = module[manifest.entry.export];
36
+ if (!graph || typeof graph.invoke !== 'function') {
37
+ throw new Error(`Invalid graph at ${modulePath}: export "${manifest.entry.export}" must have an invoke function`);
38
+ }
39
+ this.triks.set(manifest.id, { manifest, graph, path: trikPath });
40
+ return manifest;
41
+ }
42
+ /**
43
+ * Load all triks from a directory.
44
+ * Supports scoped directory structure: directory/@scope/trik-name/
45
+ *
46
+ * @param directory - Path to the directory containing triks.
47
+ * Use '~' prefix for home directory (e.g., '~/.trikhub/triks')
48
+ * @returns Array of successfully loaded manifests
49
+ */
50
+ async loadTriksFromDirectory(directory) {
51
+ // Resolve ~ to home directory
52
+ const resolvedDir = directory.startsWith('~')
53
+ ? join(homedir(), directory.slice(1))
54
+ : resolve(directory);
55
+ const manifests = [];
56
+ const errors = [];
57
+ try {
58
+ const entries = await readdir(resolvedDir, { withFileTypes: true });
59
+ for (const entry of entries) {
60
+ if (!entry.isDirectory())
61
+ continue;
62
+ const entryPath = join(resolvedDir, entry.name);
63
+ // Check if this is a scoped directory (starts with @)
64
+ if (entry.name.startsWith('@')) {
65
+ // Scoped directory: @scope/trik-name structure
66
+ const scopedEntries = await readdir(entryPath, { withFileTypes: true });
67
+ for (const scopedEntry of scopedEntries) {
68
+ if (!scopedEntry.isDirectory())
69
+ continue;
70
+ const trikPath = join(entryPath, scopedEntry.name);
71
+ const manifestPath = join(trikPath, 'manifest.json');
72
+ try {
73
+ const manifestStat = await stat(manifestPath);
74
+ if (manifestStat.isFile()) {
75
+ const manifest = await this.loadTrik(trikPath);
76
+ manifests.push(manifest);
77
+ }
78
+ }
79
+ catch (error) {
80
+ // Trik failed to load, record error but continue
81
+ errors.push({
82
+ path: trikPath,
83
+ error: error instanceof Error ? error.message : 'Unknown error',
84
+ });
85
+ }
86
+ }
87
+ }
88
+ else {
89
+ // Non-scoped directory: direct trik-name structure
90
+ const trikPath = entryPath;
91
+ const manifestPath = join(trikPath, 'manifest.json');
92
+ try {
93
+ const manifestStat = await stat(manifestPath);
94
+ if (manifestStat.isFile()) {
95
+ const manifest = await this.loadTrik(trikPath);
96
+ manifests.push(manifest);
97
+ }
98
+ }
99
+ catch (error) {
100
+ // Trik failed to load, record error but continue
101
+ errors.push({
102
+ path: trikPath,
103
+ error: error instanceof Error ? error.message : 'Unknown error',
104
+ });
105
+ }
106
+ }
107
+ }
108
+ }
109
+ catch (error) {
110
+ // Directory doesn't exist or isn't readable - not necessarily an error
111
+ // (e.g., user hasn't installed any triks yet)
112
+ if (error.code !== 'ENOENT') {
113
+ throw new Error(`Failed to read triks directory "${resolvedDir}": ${error instanceof Error ? error.message : 'Unknown error'}`);
114
+ }
115
+ }
116
+ // Log errors for debugging (triks that failed to load)
117
+ if (errors.length > 0) {
118
+ console.warn(`[TrikGateway] Failed to load ${errors.length} trik(s):`);
119
+ for (const { path, error } of errors) {
120
+ console.warn(` - ${path}: ${error}`);
121
+ }
122
+ }
123
+ return manifests;
124
+ }
125
+ /**
126
+ * Load triks from the configured triksDirectory (if set).
127
+ * This is a convenience method for loading the default TrikHub directory.
128
+ */
129
+ async loadInstalledTriks() {
130
+ if (!this.config.triksDirectory) {
131
+ return [];
132
+ }
133
+ return this.loadTriksFromDirectory(this.config.triksDirectory);
134
+ }
135
+ getManifest(trikId) {
136
+ return this.triks.get(trikId)?.manifest;
137
+ }
138
+ getLoadedTriks() {
139
+ return Array.from(this.triks.keys());
140
+ }
141
+ isLoaded(trikId) {
142
+ return this.triks.has(trikId);
143
+ }
144
+ getAvailableTriks() {
145
+ return Array.from(this.triks.values()).map(({ manifest }) => ({
146
+ id: manifest.id,
147
+ name: manifest.name,
148
+ description: manifest.description,
149
+ sessionEnabled: manifest.capabilities?.session?.enabled ?? false,
150
+ tools: Object.entries(manifest.actions).map(([actionName, action]) => this.actionToToolDefinition(manifest.id, actionName, action)),
151
+ }));
152
+ }
153
+ getToolDefinitions(_options = {}) {
154
+ const tools = [];
155
+ for (const { manifest } of this.triks.values()) {
156
+ for (const [actionName, action] of Object.entries(manifest.actions)) {
157
+ const tool = this.actionToToolDefinition(manifest.id, actionName, action);
158
+ tools.push(tool);
159
+ }
160
+ }
161
+ return tools;
162
+ }
163
+ actionToToolDefinition(trikId, actionName, action) {
164
+ return {
165
+ name: `${trikId}:${actionName}`,
166
+ description: action.description || `Execute ${actionName} on ${trikId}`,
167
+ inputSchema: action.inputSchema,
168
+ responseMode: action.responseMode,
169
+ };
170
+ }
171
+ async execute(trikId, actionName, input, options) {
172
+ const loaded = this.triks.get(trikId);
173
+ if (!loaded) {
174
+ return {
175
+ success: false,
176
+ code: 'TRIK_NOT_FOUND',
177
+ error: `Trik "${trikId}" is not loaded. Call loadTrik() first.`,
178
+ };
179
+ }
180
+ const { manifest, graph } = loaded;
181
+ const action = manifest.actions[actionName];
182
+ if (!action) {
183
+ return {
184
+ success: false,
185
+ code: 'INVALID_INPUT',
186
+ error: `Action "${actionName}" not found. Available: ${Object.keys(manifest.actions).join(', ')}`,
187
+ };
188
+ }
189
+ const inputValidation = this.validator.validate(`${trikId}:${actionName}:input`, action.inputSchema, input);
190
+ if (!inputValidation.valid) {
191
+ return {
192
+ success: false,
193
+ code: 'INVALID_INPUT',
194
+ error: `Invalid input: ${inputValidation.errors?.join(', ')}`,
195
+ };
196
+ }
197
+ let session = null;
198
+ if (manifest.capabilities?.session?.enabled) {
199
+ if (options?.sessionId) {
200
+ session = await this.sessionStorage.get(options.sessionId);
201
+ }
202
+ if (!session) {
203
+ session = await this.sessionStorage.create(trikId, manifest.capabilities.session);
204
+ }
205
+ }
206
+ try {
207
+ const trikInput = {
208
+ action: actionName,
209
+ input,
210
+ session: session
211
+ ? {
212
+ sessionId: session.sessionId,
213
+ history: session.history,
214
+ }
215
+ : undefined,
216
+ };
217
+ const result = await this.executeWithTimeout(graph, trikInput, manifest.limits.maxExecutionTimeMs);
218
+ if (result.needsClarification && result.clarificationQuestions?.length) {
219
+ if (this.config.onClarificationNeeded) {
220
+ await this.config.onClarificationNeeded(trikId, result.clarificationQuestions);
221
+ }
222
+ return {
223
+ success: false,
224
+ code: 'CLARIFICATION_NEEDED',
225
+ sessionId: session?.sessionId ?? '',
226
+ questions: result.clarificationQuestions,
227
+ };
228
+ }
229
+ return this.processResult(trikId, actionName, action, session, result);
230
+ }
231
+ catch (error) {
232
+ if (error instanceof Error && error.message === 'TIMEOUT') {
233
+ return {
234
+ success: false,
235
+ code: 'TIMEOUT',
236
+ error: `Execution timed out after ${manifest.limits.maxExecutionTimeMs}ms`,
237
+ };
238
+ }
239
+ return {
240
+ success: false,
241
+ code: 'EXECUTION_ERROR',
242
+ error: error instanceof Error ? error.message : 'Unknown error',
243
+ };
244
+ }
245
+ }
246
+ async executeWithTimeout(graph, input, timeoutMs) {
247
+ return Promise.race([
248
+ graph.invoke(input),
249
+ new Promise((_, reject) => setTimeout(() => reject(new Error('TIMEOUT')), timeoutMs)),
250
+ ]);
251
+ }
252
+ async processResult(trikId, actionName, action, session, result) {
253
+ const effectiveMode = result.responseMode || action.responseMode;
254
+ if (session) {
255
+ if (result.endSession) {
256
+ await this.sessionStorage.delete(session.sessionId);
257
+ session = null;
258
+ }
259
+ else {
260
+ await this.sessionStorage.addHistory(session.sessionId, {
261
+ action: actionName,
262
+ input: {},
263
+ agentData: result.agentData,
264
+ userContent: result.userContent,
265
+ });
266
+ }
267
+ }
268
+ if (effectiveMode === 'passthrough') {
269
+ if (result.userContent === undefined) {
270
+ return { success: false, code: 'INVALID_OUTPUT', error: 'Passthrough mode requires userContent' };
271
+ }
272
+ if (action.userContentSchema) {
273
+ const userValidation = this.validator.validate(`${trikId}:${actionName}:userContent`, action.userContentSchema, result.userContent);
274
+ if (!userValidation.valid) {
275
+ return {
276
+ success: false,
277
+ code: 'INVALID_OUTPUT',
278
+ error: `Invalid userContent: ${userValidation.errors?.join(', ')}`,
279
+ };
280
+ }
281
+ }
282
+ const userContent = result.userContent;
283
+ const contentRef = this.storePassthroughContent(trikId, actionName, userContent);
284
+ const gatewayResult = {
285
+ success: true,
286
+ responseMode: 'passthrough',
287
+ userContentRef: contentRef,
288
+ contentType: userContent.contentType,
289
+ metadata: userContent.metadata,
290
+ };
291
+ return this.addSessionId(gatewayResult, session);
292
+ }
293
+ if (result.agentData === undefined) {
294
+ return { success: false, code: 'INVALID_OUTPUT', error: 'Template mode requires agentData' };
295
+ }
296
+ if (action.agentDataSchema) {
297
+ const agentValidation = this.validator.validate(`${trikId}:${actionName}:agentData`, action.agentDataSchema, result.agentData);
298
+ if (!agentValidation.valid) {
299
+ return {
300
+ success: false,
301
+ code: 'INVALID_OUTPUT',
302
+ error: `Invalid agentData: ${agentValidation.errors?.join(', ')}`,
303
+ };
304
+ }
305
+ }
306
+ // Get template text if available
307
+ const agentData = result.agentData;
308
+ const templateId = agentData.template;
309
+ const templateText = templateId && action.responseTemplates?.[templateId]?.text;
310
+ const gatewayResult = {
311
+ success: true,
312
+ responseMode: 'template',
313
+ agentData: result.agentData,
314
+ templateText,
315
+ };
316
+ return this.addSessionId(gatewayResult, session);
317
+ }
318
+ /**
319
+ * Add sessionId to result if session exists
320
+ */
321
+ addSessionId(result, session) {
322
+ if (session) {
323
+ return { ...result, sessionId: session.sessionId };
324
+ }
325
+ return result;
326
+ }
327
+ // ============================================
328
+ // Passthrough Content Management
329
+ // ============================================
330
+ /**
331
+ * Store passthrough content and return a reference
332
+ */
333
+ storePassthroughContent(trikId, actionName, content) {
334
+ this.cleanupExpiredContentReferences();
335
+ const ref = randomUUID();
336
+ const now = Date.now();
337
+ this.contentReferences.set(ref, {
338
+ ref,
339
+ trikId,
340
+ actionName,
341
+ content,
342
+ createdAt: now,
343
+ expiresAt: now + TrikGateway.CONTENT_REF_TTL_MS,
344
+ });
345
+ return ref;
346
+ }
347
+ /**
348
+ * Clean up expired content references
349
+ */
350
+ cleanupExpiredContentReferences() {
351
+ const now = Date.now();
352
+ for (const [ref, contentRef] of this.contentReferences) {
353
+ if (contentRef.expiresAt < now) {
354
+ this.contentReferences.delete(ref);
355
+ }
356
+ }
357
+ }
358
+ /**
359
+ * Deliver passthrough content to the user.
360
+ * One-time delivery - the reference is deleted after delivery.
361
+ */
362
+ deliverContent(ref) {
363
+ const contentRef = this.contentReferences.get(ref);
364
+ if (!contentRef) {
365
+ return null;
366
+ }
367
+ if (contentRef.expiresAt < Date.now()) {
368
+ this.contentReferences.delete(ref);
369
+ return null;
370
+ }
371
+ // One-time delivery
372
+ this.contentReferences.delete(ref);
373
+ return {
374
+ content: contentRef.content,
375
+ receipt: {
376
+ delivered: true,
377
+ contentType: contentRef.content.contentType,
378
+ metadata: contentRef.content.metadata,
379
+ },
380
+ };
381
+ }
382
+ hasContentRef(ref) {
383
+ const contentRef = this.contentReferences.get(ref);
384
+ if (!contentRef)
385
+ return false;
386
+ if (contentRef.expiresAt < Date.now()) {
387
+ this.contentReferences.delete(ref);
388
+ return false;
389
+ }
390
+ return true;
391
+ }
392
+ getContentRefInfo(ref) {
393
+ const contentRef = this.contentReferences.get(ref);
394
+ if (!contentRef || contentRef.expiresAt < Date.now()) {
395
+ return null;
396
+ }
397
+ return {
398
+ contentType: contentRef.content.contentType,
399
+ metadata: contentRef.content.metadata,
400
+ };
401
+ }
402
+ resolveTemplate(template, agentData) {
403
+ let text = template.text;
404
+ const placeholderRegex = /\{\{(\w+)\}\}/g;
405
+ text = text.replace(placeholderRegex, (_, fieldName) => {
406
+ const value = agentData[fieldName];
407
+ return value !== undefined ? String(value) : `{{${fieldName}}}`;
408
+ });
409
+ return text;
410
+ }
411
+ getActionTemplates(trikId, actionName) {
412
+ const manifest = this.triks.get(trikId)?.manifest;
413
+ if (!manifest)
414
+ return undefined;
415
+ const action = manifest.actions[actionName];
416
+ if (!action)
417
+ return undefined;
418
+ return action.responseTemplates;
419
+ }
420
+ }
421
+ //# sourceMappingURL=gateway.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateway.js","sourceRoot":"","sources":["../src/gateway.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export { TrikGateway, type TrikGatewayConfig, type ExecuteTrikOptions, type GatewayResultWithSession, type ToolDefinition, type TrikInfo, type GetToolDefinitionsOptions, } from './gateway.js';
2
+ export { type SessionStorage, InMemorySessionStorage } from './session-storage.js';
3
+ export type { TrikManifest, ActionDefinition, ResponseMode, JSONSchema, ResponseTemplate, GatewayResult, GatewaySuccess, GatewaySuccessTemplate, GatewaySuccessPassthrough, GatewayError, GatewayClarification, ClarificationQuestion, ClarificationAnswer, SessionCapabilities, SessionHistoryEntry, TrikSession, SessionContext, PassthroughContent, PassthroughDeliveryReceipt, UserContentReference, } from '@trikhub/manifest';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,WAAW,EACX,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,KAAK,wBAAwB,EAE7B,KAAK,cAAc,EACnB,KAAK,QAAQ,EACb,KAAK,yBAAyB,GAC/B,MAAM,cAAc,CAAC;AAGtB,OAAO,EAAE,KAAK,cAAc,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAGnF,YAAY,EACV,YAAY,EACZ,gBAAgB,EAChB,YAAY,EACZ,UAAU,EACV,gBAAgB,EAChB,aAAa,EACb,cAAc,EACd,sBAAsB,EACtB,yBAAyB,EACzB,YAAY,EACZ,oBAAoB,EACpB,qBAAqB,EACrB,mBAAmB,EAEnB,mBAAmB,EACnB,mBAAmB,EACnB,WAAW,EACX,cAAc,EAEd,kBAAkB,EAClB,0BAA0B,EAC1B,oBAAoB,GACrB,MAAM,mBAAmB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,5 @@
1
+ // Gateway (local filesystem execution)
2
+ export { TrikGateway, } from './gateway.js';
3
+ // Session storage
4
+ export { InMemorySessionStorage } from './session-storage.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,OAAO,EACL,WAAW,GAQZ,MAAM,cAAc,CAAC;AAEtB,kBAAkB;AAClB,OAAO,EAAuB,sBAAsB,EAAE,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,20 @@
1
+ import { type DynamicStructuredTool } from '@langchain/core/tools';
2
+ import type { TrikGateway } from '../gateway.js';
3
+ import type { PassthroughContent } from '@trikhub/manifest';
4
+ export interface LangChainAdapterOptions {
5
+ /** Get session ID for a trik (for multi-turn conversations) */
6
+ getSessionId?: (trikId: string) => string | undefined;
7
+ /** Store session ID for a trik */
8
+ setSessionId?: (trikId: string, sessionId: string) => void;
9
+ /** Callback when passthrough content is delivered */
10
+ onPassthrough?: (content: PassthroughContent) => void;
11
+ /** Enable debug logging */
12
+ debug?: boolean;
13
+ }
14
+ export declare function parseToolName(toolName: string): {
15
+ trikId: string;
16
+ actionName: string;
17
+ };
18
+ export declare function createLangChainTools(gateway: TrikGateway, options?: LangChainAdapterOptions): DynamicStructuredTool[];
19
+ export declare function getToolNameMap(gateway: TrikGateway): Map<string, string>;
20
+ //# sourceMappingURL=adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../src/langchain/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,KAAK,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAEzE,OAAO,KAAK,EAAE,WAAW,EAAkB,MAAM,eAAe,CAAC;AACjE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAG5D,MAAM,WAAW,uBAAuB;IACtC,+DAA+D;IAC/D,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;IACtD,kCAAkC;IAClC,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3D,qDAAqD;IACrD,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,kBAAkB,KAAK,IAAI,CAAC;IACtD,2BAA2B;IAC3B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAeD,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAUtF;AAyFD,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,WAAW,EACpB,OAAO,GAAE,uBAA4B,GACpC,qBAAqB,EAAE,CAYzB;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,WAAW,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAUxE"}
@@ -0,0 +1,102 @@
1
+ import { tool } from '@langchain/core/tools';
2
+ import { jsonSchemaToZod } from './schema-converter.js';
3
+ function fillTemplate(template, data) {
4
+ return template.replace(/\{\{(\w+)\}\}/g, (_, key) => String(data[key] ?? `{{${key}}}`));
5
+ }
6
+ function toToolName(gatewayName) {
7
+ return gatewayName
8
+ .replace(/\//g, '_')
9
+ .replace(/-/g, '_')
10
+ .replace(/:/g, '__');
11
+ }
12
+ export function parseToolName(toolName) {
13
+ const parts = toolName.split('__');
14
+ if (parts.length !== 2) {
15
+ throw new Error(`Invalid tool name format: ${toolName}`);
16
+ }
17
+ return {
18
+ trikId: parts[0],
19
+ actionName: parts[1],
20
+ };
21
+ }
22
+ function createToolFromDefinition(toolDef, gateway, options) {
23
+ const { getSessionId, setSessionId, onPassthrough, debug } = options;
24
+ const langChainName = toToolName(toolDef.name);
25
+ const [trikIdPart, actionName] = toolDef.name.split(':');
26
+ const trikId = trikIdPart;
27
+ const zodSchema = jsonSchemaToZod(toolDef.inputSchema);
28
+ return tool(async (input) => {
29
+ if (debug) {
30
+ console.log(`[Tool] ${toolDef.name}: ${JSON.stringify(input)}`);
31
+ }
32
+ const sessionId = getSessionId?.(trikId);
33
+ const result = await gateway.execute(trikId, actionName, input, { sessionId });
34
+ if (!result.success) {
35
+ return JSON.stringify({
36
+ success: false,
37
+ error: 'error' in result ? result.error : 'Unknown error',
38
+ });
39
+ }
40
+ if ('sessionId' in result && result.sessionId) {
41
+ setSessionId?.(trikId, result.sessionId);
42
+ if (debug) {
43
+ console.log(`[Tool] Session tracked: ${result.sessionId}`);
44
+ }
45
+ }
46
+ if (result.responseMode === 'passthrough') {
47
+ const delivery = gateway.deliverContent(result.userContentRef);
48
+ if (!delivery) {
49
+ return JSON.stringify({
50
+ success: false,
51
+ error: 'Content not found or expired',
52
+ });
53
+ }
54
+ if (debug) {
55
+ console.log(`[Tool] Auto-delivered passthrough content: ${delivery.receipt.contentType}`);
56
+ }
57
+ if (onPassthrough) {
58
+ onPassthrough(delivery.content);
59
+ }
60
+ return JSON.stringify({
61
+ success: true,
62
+ response: 'Content delivered.',
63
+ _directOutput: delivery.content.content,
64
+ });
65
+ }
66
+ const response = result.templateText
67
+ ? fillTemplate(result.templateText, result.agentData)
68
+ : JSON.stringify(result.agentData);
69
+ if (debug) {
70
+ console.log(`[Tool] Auto-filled template response: ${response}`);
71
+ }
72
+ return JSON.stringify({
73
+ success: true,
74
+ response,
75
+ });
76
+ }, {
77
+ name: langChainName,
78
+ description: toolDef.description,
79
+ schema: zodSchema,
80
+ });
81
+ }
82
+ export function createLangChainTools(gateway, options = {}) {
83
+ const { debug } = options;
84
+ const toolDefs = gateway.getToolDefinitions();
85
+ if (debug) {
86
+ console.log(`[LangChainAdapter] Creating ${toolDefs.length} tools from gateway:`);
87
+ for (const def of toolDefs) {
88
+ console.log(` - ${def.name} (${def.responseMode})`);
89
+ }
90
+ }
91
+ return toolDefs.map((def) => createToolFromDefinition(def, gateway, options));
92
+ }
93
+ export function getToolNameMap(gateway) {
94
+ const toolDefs = gateway.getToolDefinitions();
95
+ const map = new Map();
96
+ for (const def of toolDefs) {
97
+ const langChainName = toToolName(def.name);
98
+ map.set(langChainName, def.name);
99
+ }
100
+ return map;
101
+ }
102
+ //# sourceMappingURL=adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../src/langchain/adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { createLangChainTools, parseToolName, getToolNameMap, type LangChainAdapterOptions, } from './adapter.js';
2
+ export { jsonSchemaToZod } from './schema-converter.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/langchain/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,aAAa,EACb,cAAc,EACd,KAAK,uBAAuB,GAC7B,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { createLangChainTools, parseToolName, getToolNameMap, } from './adapter.js';
2
+ export { jsonSchemaToZod } from './schema-converter.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/langchain/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,aAAa,EACb,cAAc,GAEf,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { type ZodTypeAny } from 'zod';
2
+ import type { JSONSchema } from '@trikhub/manifest';
3
+ export declare function jsonSchemaToZod(schema: JSONSchema, path?: string): ZodTypeAny;
4
+ //# sourceMappingURL=schema-converter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-converter.d.ts","sourceRoot":"","sources":["../../src/langchain/schema-converter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAK,KAAK,UAAU,EAAE,MAAM,KAAK,CAAC;AACzC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpD,wBAAgB,eAAe,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,GAAE,MAAe,GAAG,UAAU,CAqFrF"}
@@ -0,0 +1,74 @@
1
+ import { z } from 'zod';
2
+ export function jsonSchemaToZod(schema, path = 'root') {
3
+ if (!schema.type && !schema.$ref) {
4
+ return z.unknown();
5
+ }
6
+ if (schema.type === 'string') {
7
+ let zodSchema = z.string();
8
+ if (schema.description) {
9
+ zodSchema = zodSchema.describe(schema.description);
10
+ }
11
+ if (schema.minLength !== undefined) {
12
+ zodSchema = zodSchema.min(schema.minLength);
13
+ }
14
+ if (schema.maxLength !== undefined) {
15
+ zodSchema = zodSchema.max(schema.maxLength);
16
+ }
17
+ if (schema.pattern !== undefined) {
18
+ zodSchema = zodSchema.regex(new RegExp(schema.pattern));
19
+ }
20
+ if (schema.enum && schema.enum.length > 0) {
21
+ return z.enum(schema.enum).describe(schema.description || '');
22
+ }
23
+ return zodSchema;
24
+ }
25
+ if (schema.type === 'number' || schema.type === 'integer') {
26
+ let zodSchema = schema.type === 'integer' ? z.number().int() : z.number();
27
+ if (schema.description) {
28
+ zodSchema = zodSchema.describe(schema.description);
29
+ }
30
+ if (schema.minimum !== undefined) {
31
+ zodSchema = zodSchema.min(schema.minimum);
32
+ }
33
+ if (schema.maximum !== undefined) {
34
+ zodSchema = zodSchema.max(schema.maximum);
35
+ }
36
+ return zodSchema;
37
+ }
38
+ if (schema.type === 'boolean') {
39
+ let zodSchema = z.boolean();
40
+ if (schema.description) {
41
+ zodSchema = zodSchema.describe(schema.description);
42
+ }
43
+ return zodSchema;
44
+ }
45
+ if (schema.type === 'array') {
46
+ const itemSchema = schema.items ? jsonSchemaToZod(schema.items, `${path}.items`) : z.unknown();
47
+ let zodSchema = z.array(itemSchema);
48
+ if (schema.description) {
49
+ zodSchema = zodSchema.describe(schema.description);
50
+ }
51
+ return zodSchema;
52
+ }
53
+ if (schema.type === 'object') {
54
+ const shape = {};
55
+ if (schema.properties) {
56
+ for (const [key, propSchema] of Object.entries(schema.properties)) {
57
+ const propZod = jsonSchemaToZod(propSchema, `${path}.${key}`);
58
+ if (!schema.required?.includes(key)) {
59
+ shape[key] = propZod.optional();
60
+ }
61
+ else {
62
+ shape[key] = propZod;
63
+ }
64
+ }
65
+ }
66
+ let zodSchema = z.object(shape);
67
+ if (schema.description) {
68
+ zodSchema = zodSchema.describe(schema.description);
69
+ }
70
+ return zodSchema;
71
+ }
72
+ return z.unknown();
73
+ }
74
+ //# sourceMappingURL=schema-converter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-converter.js","sourceRoot":"","sources":["../../src/langchain/schema-converter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ import type { TrikSession, SessionHistoryEntry, SessionCapabilities } from '@trikhub/manifest';
2
+ /**
3
+ * Interface for session storage implementations
4
+ */
5
+ export interface SessionStorage {
6
+ /**
7
+ * Create a new session for a trik
8
+ */
9
+ create(trikId: string, config?: SessionCapabilities): Promise<TrikSession>;
10
+ /**
11
+ * Get an existing session by ID
12
+ * Returns null if session doesn't exist or is expired
13
+ */
14
+ get(sessionId: string): Promise<TrikSession | null>;
15
+ /**
16
+ * Add a history entry to a session
17
+ */
18
+ addHistory(sessionId: string, entry: Omit<SessionHistoryEntry, 'timestamp'>): Promise<void>;
19
+ /**
20
+ * Delete a session
21
+ */
22
+ delete(sessionId: string): Promise<void>;
23
+ /**
24
+ * Clean up expired sessions
25
+ * Returns the number of sessions cleaned up
26
+ */
27
+ cleanup(): Promise<number>;
28
+ }
29
+ /**
30
+ * In-memory session storage implementation.
31
+ * Sessions are lost when the process restarts.
32
+ */
33
+ export declare class InMemorySessionStorage implements SessionStorage {
34
+ private sessions;
35
+ create(trikId: string, config?: SessionCapabilities): Promise<TrikSession>;
36
+ get(sessionId: string): Promise<TrikSession | null>;
37
+ addHistory(sessionId: string, entry: Omit<SessionHistoryEntry, 'timestamp'>): Promise<void>;
38
+ delete(sessionId: string): Promise<void>;
39
+ cleanup(): Promise<number>;
40
+ /**
41
+ * Get the number of active sessions (for debugging/monitoring)
42
+ */
43
+ getActiveSessionCount(): number;
44
+ }
45
+ //# sourceMappingURL=session-storage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-storage.d.ts","sourceRoot":"","sources":["../src/session-storage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,mBAAmB,EACnB,mBAAmB,EACpB,MAAM,mBAAmB,CAAC;AAE3B;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B;;OAEG;IACH,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IAE3E;;;OAGG;IACH,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IAEpD;;OAEG;IACH,UAAU,CACR,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,IAAI,CAAC,mBAAmB,EAAE,WAAW,CAAC,GAC5C,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjB;;OAEG;IACH,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEzC;;;OAGG;IACH,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;CAC5B;AAeD;;;GAGG;AACH,qBAAa,sBAAuB,YAAW,cAAc;IAC3D,OAAO,CAAC,QAAQ,CAAkC;IAE5C,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,WAAW,CAAC;IAiB1E,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAkBnD,UAAU,CACd,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,IAAI,CAAC,mBAAmB,EAAE,WAAW,CAAC,GAC5C,OAAO,CAAC,IAAI,CAAC;IAqBV,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIxC,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;IAchC;;OAEG;IACH,qBAAqB,IAAI,MAAM;CAGhC"}
@@ -0,0 +1,84 @@
1
+ /**
2
+ * Generate a random session ID
3
+ */
4
+ function generateSessionId() {
5
+ return `sess_${Date.now()}_${Math.random().toString(36).substring(2, 11)}`;
6
+ }
7
+ /**
8
+ * Default values for session configuration
9
+ */
10
+ const DEFAULT_MAX_DURATION_MS = 30 * 60 * 1000; // 30 minutes
11
+ const DEFAULT_MAX_HISTORY_ENTRIES = 20;
12
+ /**
13
+ * In-memory session storage implementation.
14
+ * Sessions are lost when the process restarts.
15
+ */
16
+ export class InMemorySessionStorage {
17
+ sessions = new Map();
18
+ async create(trikId, config) {
19
+ const now = Date.now();
20
+ const maxDurationMs = config?.maxDurationMs ?? DEFAULT_MAX_DURATION_MS;
21
+ const session = {
22
+ sessionId: generateSessionId(),
23
+ trikId,
24
+ createdAt: now,
25
+ lastActivityAt: now,
26
+ expiresAt: now + maxDurationMs,
27
+ history: [],
28
+ };
29
+ this.sessions.set(session.sessionId, session);
30
+ return session;
31
+ }
32
+ async get(sessionId) {
33
+ const session = this.sessions.get(sessionId);
34
+ if (!session) {
35
+ return null;
36
+ }
37
+ // Check if session has expired
38
+ if (Date.now() > session.expiresAt) {
39
+ this.sessions.delete(sessionId);
40
+ return null;
41
+ }
42
+ // Update last activity
43
+ session.lastActivityAt = Date.now();
44
+ return session;
45
+ }
46
+ async addHistory(sessionId, entry) {
47
+ const session = await this.get(sessionId);
48
+ if (!session) {
49
+ throw new Error(`Session ${sessionId} not found`);
50
+ }
51
+ // Add the history entry with timestamp
52
+ const historyEntry = {
53
+ ...entry,
54
+ timestamp: Date.now(),
55
+ };
56
+ session.history.push(historyEntry);
57
+ // Trim history if it exceeds the limit
58
+ // We use DEFAULT_MAX_HISTORY_ENTRIES since we don't store the config
59
+ if (session.history.length > DEFAULT_MAX_HISTORY_ENTRIES) {
60
+ session.history = session.history.slice(-DEFAULT_MAX_HISTORY_ENTRIES);
61
+ }
62
+ }
63
+ async delete(sessionId) {
64
+ this.sessions.delete(sessionId);
65
+ }
66
+ async cleanup() {
67
+ const now = Date.now();
68
+ let cleaned = 0;
69
+ for (const [sessionId, session] of this.sessions) {
70
+ if (now > session.expiresAt) {
71
+ this.sessions.delete(sessionId);
72
+ cleaned++;
73
+ }
74
+ }
75
+ return cleaned;
76
+ }
77
+ /**
78
+ * Get the number of active sessions (for debugging/monitoring)
79
+ */
80
+ getActiveSessionCount() {
81
+ return this.sessions.size;
82
+ }
83
+ }
84
+ //# sourceMappingURL=session-storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-storage.js","sourceRoot":"","sources":["../src/session-storage.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,75 @@
1
+ {
2
+ "name": "@trikhub/gateway",
3
+ "version": "0.1.0",
4
+ "description": "Secure trik execution gateway for AI agents with prompt injection protection",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "import": "./dist/index.js",
11
+ "types": "./dist/index.d.ts"
12
+ },
13
+ "./langchain": {
14
+ "import": "./dist/langchain/index.js",
15
+ "types": "./dist/langchain/index.d.ts"
16
+ }
17
+ },
18
+ "files": [
19
+ "dist",
20
+ "README.md",
21
+ "LICENSE"
22
+ ],
23
+ "keywords": [
24
+ "ai",
25
+ "agent",
26
+ "trik",
27
+ "gateway",
28
+ "security",
29
+ "prompt-injection",
30
+ "langchain",
31
+ "typescript",
32
+ "trikhub"
33
+ ],
34
+ "author": "Muffles",
35
+ "license": "MIT",
36
+ "repository": {
37
+ "type": "git",
38
+ "url": "git+https://github.com/Muffles/trikhub.git",
39
+ "directory": "packages/trik-gateway"
40
+ },
41
+ "bugs": {
42
+ "url": "https://github.com/Muffles/trikhub/issues"
43
+ },
44
+ "homepage": "https://github.com/Muffles/trikhub/tree/main/packages/trik-gateway#readme",
45
+ "publishConfig": {
46
+ "access": "public"
47
+ },
48
+ "engines": {
49
+ "node": ">=18.0.0"
50
+ },
51
+ "dependencies": {
52
+ "ajv": "^8.17.1",
53
+ "@trikhub/manifest": "0.1.0"
54
+ },
55
+ "devDependencies": {
56
+ "@langchain/core": "^0.3.0",
57
+ "zod": "^3.0.0"
58
+ },
59
+ "peerDependencies": {
60
+ "@langchain/core": ">=0.3.0",
61
+ "zod": ">=3.0.0"
62
+ },
63
+ "peerDependenciesMeta": {
64
+ "@langchain/core": {
65
+ "optional": true
66
+ },
67
+ "zod": {
68
+ "optional": true
69
+ }
70
+ },
71
+ "scripts": {
72
+ "build": "tsc",
73
+ "clean": "rm -rf dist *.tsbuildinfo"
74
+ }
75
+ }