@lobu/core 2.8.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.
Files changed (137) hide show
  1. package/dist/__tests__/encryption.test.d.ts +2 -0
  2. package/dist/__tests__/encryption.test.d.ts.map +1 -0
  3. package/dist/__tests__/encryption.test.js +88 -0
  4. package/dist/__tests__/encryption.test.js.map +1 -0
  5. package/dist/__tests__/fixtures/factories.d.ts +30 -0
  6. package/dist/__tests__/fixtures/factories.d.ts.map +1 -0
  7. package/dist/__tests__/fixtures/factories.js +53 -0
  8. package/dist/__tests__/fixtures/factories.js.map +1 -0
  9. package/dist/__tests__/fixtures/index.d.ts +5 -0
  10. package/dist/__tests__/fixtures/index.d.ts.map +1 -0
  11. package/dist/__tests__/fixtures/index.js +14 -0
  12. package/dist/__tests__/fixtures/index.js.map +1 -0
  13. package/dist/__tests__/fixtures/mock-fetch.d.ts +13 -0
  14. package/dist/__tests__/fixtures/mock-fetch.d.ts.map +1 -0
  15. package/dist/__tests__/fixtures/mock-fetch.js +29 -0
  16. package/dist/__tests__/fixtures/mock-fetch.js.map +1 -0
  17. package/dist/__tests__/fixtures/mock-queue.d.ts +19 -0
  18. package/dist/__tests__/fixtures/mock-queue.d.ts.map +1 -0
  19. package/dist/__tests__/fixtures/mock-queue.js +45 -0
  20. package/dist/__tests__/fixtures/mock-queue.js.map +1 -0
  21. package/dist/__tests__/fixtures/mock-redis.d.ts +54 -0
  22. package/dist/__tests__/fixtures/mock-redis.d.ts.map +1 -0
  23. package/dist/__tests__/fixtures/mock-redis.js +267 -0
  24. package/dist/__tests__/fixtures/mock-redis.js.map +1 -0
  25. package/dist/__tests__/retry.test.d.ts +2 -0
  26. package/dist/__tests__/retry.test.d.ts.map +1 -0
  27. package/dist/__tests__/retry.test.js +114 -0
  28. package/dist/__tests__/retry.test.js.map +1 -0
  29. package/dist/__tests__/sanitize.test.d.ts +2 -0
  30. package/dist/__tests__/sanitize.test.d.ts.map +1 -0
  31. package/dist/__tests__/sanitize.test.js +129 -0
  32. package/dist/__tests__/sanitize.test.js.map +1 -0
  33. package/dist/agent-policy.d.ts +21 -0
  34. package/dist/agent-policy.d.ts.map +1 -0
  35. package/dist/agent-policy.js +181 -0
  36. package/dist/agent-policy.js.map +1 -0
  37. package/dist/agent-store.d.ts +140 -0
  38. package/dist/agent-store.d.ts.map +1 -0
  39. package/dist/agent-store.js +27 -0
  40. package/dist/agent-store.js.map +1 -0
  41. package/dist/api-types.d.ts +213 -0
  42. package/dist/api-types.d.ts.map +1 -0
  43. package/dist/api-types.js +7 -0
  44. package/dist/api-types.js.map +1 -0
  45. package/dist/command-registry.d.ts +41 -0
  46. package/dist/command-registry.d.ts.map +1 -0
  47. package/dist/command-registry.js +43 -0
  48. package/dist/command-registry.js.map +1 -0
  49. package/dist/constants.d.ts +54 -0
  50. package/dist/constants.d.ts.map +1 -0
  51. package/dist/constants.js +60 -0
  52. package/dist/constants.js.map +1 -0
  53. package/dist/errors.d.ts +97 -0
  54. package/dist/errors.d.ts.map +1 -0
  55. package/dist/errors.js +182 -0
  56. package/dist/errors.js.map +1 -0
  57. package/dist/index.d.ts +31 -0
  58. package/dist/index.d.ts.map +1 -0
  59. package/dist/index.js +64 -0
  60. package/dist/index.js.map +1 -0
  61. package/dist/integration-types.d.ts +22 -0
  62. package/dist/integration-types.d.ts.map +1 -0
  63. package/dist/integration-types.js +9 -0
  64. package/dist/integration-types.js.map +1 -0
  65. package/dist/logger.d.ts +15 -0
  66. package/dist/logger.d.ts.map +1 -0
  67. package/dist/logger.js +223 -0
  68. package/dist/logger.js.map +1 -0
  69. package/dist/modules.d.ts +96 -0
  70. package/dist/modules.d.ts.map +1 -0
  71. package/dist/modules.js +140 -0
  72. package/dist/modules.js.map +1 -0
  73. package/dist/otel.d.ts +107 -0
  74. package/dist/otel.d.ts.map +1 -0
  75. package/dist/otel.js +251 -0
  76. package/dist/otel.js.map +1 -0
  77. package/dist/plugin-types.d.ts +42 -0
  78. package/dist/plugin-types.d.ts.map +1 -0
  79. package/dist/plugin-types.js +8 -0
  80. package/dist/plugin-types.js.map +1 -0
  81. package/dist/provider-config-types.d.ts +53 -0
  82. package/dist/provider-config-types.d.ts.map +1 -0
  83. package/dist/provider-config-types.js +7 -0
  84. package/dist/provider-config-types.js.map +1 -0
  85. package/dist/redis/base-store.d.ts +73 -0
  86. package/dist/redis/base-store.d.ts.map +1 -0
  87. package/dist/redis/base-store.js +174 -0
  88. package/dist/redis/base-store.js.map +1 -0
  89. package/dist/sentry.d.ts +12 -0
  90. package/dist/sentry.d.ts.map +1 -0
  91. package/dist/sentry.js +82 -0
  92. package/dist/sentry.js.map +1 -0
  93. package/dist/trace.d.ts +25 -0
  94. package/dist/trace.d.ts.map +1 -0
  95. package/dist/trace.js +32 -0
  96. package/dist/trace.js.map +1 -0
  97. package/dist/types.d.ts +373 -0
  98. package/dist/types.d.ts.map +1 -0
  99. package/dist/types.js +6 -0
  100. package/dist/types.js.map +1 -0
  101. package/dist/utils/encryption.d.ts +9 -0
  102. package/dist/utils/encryption.d.ts.map +1 -0
  103. package/dist/utils/encryption.js +107 -0
  104. package/dist/utils/encryption.js.map +1 -0
  105. package/dist/utils/env.d.ts +20 -0
  106. package/dist/utils/env.d.ts.map +1 -0
  107. package/dist/utils/env.js +50 -0
  108. package/dist/utils/env.js.map +1 -0
  109. package/dist/utils/json.d.ts +11 -0
  110. package/dist/utils/json.d.ts.map +1 -0
  111. package/dist/utils/json.js +38 -0
  112. package/dist/utils/json.js.map +1 -0
  113. package/dist/utils/lock.d.ts +34 -0
  114. package/dist/utils/lock.d.ts.map +1 -0
  115. package/dist/utils/lock.js +66 -0
  116. package/dist/utils/lock.js.map +1 -0
  117. package/dist/utils/mcp-tool-instructions.d.ts +6 -0
  118. package/dist/utils/mcp-tool-instructions.d.ts.map +1 -0
  119. package/dist/utils/mcp-tool-instructions.js +3 -0
  120. package/dist/utils/mcp-tool-instructions.js.map +1 -0
  121. package/dist/utils/retry.d.ts +40 -0
  122. package/dist/utils/retry.d.ts.map +1 -0
  123. package/dist/utils/retry.js +67 -0
  124. package/dist/utils/retry.js.map +1 -0
  125. package/dist/utils/sanitize.d.ts +55 -0
  126. package/dist/utils/sanitize.d.ts.map +1 -0
  127. package/dist/utils/sanitize.js +111 -0
  128. package/dist/utils/sanitize.js.map +1 -0
  129. package/dist/worker/auth.d.ts +34 -0
  130. package/dist/worker/auth.d.ts.map +1 -0
  131. package/dist/worker/auth.js +63 -0
  132. package/dist/worker/auth.js.map +1 -0
  133. package/dist/worker/transport.d.ts +86 -0
  134. package/dist/worker/transport.d.ts.map +1 -0
  135. package/dist/worker/transport.js +13 -0
  136. package/dist/worker/transport.js.map +1 -0
  137. package/package.json +40 -0
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generateWorkerToken = generateWorkerToken;
4
+ exports.verifyWorkerToken = verifyWorkerToken;
5
+ const logger_1 = require("../logger");
6
+ const encryption_1 = require("../utils/encryption");
7
+ const logger = (0, logger_1.createLogger)("worker-auth");
8
+ /**
9
+ * Generate a worker authentication token by encrypting thread metadata
10
+ */
11
+ function generateWorkerToken(userId, conversationId, deploymentName, options) {
12
+ // Validate required fields
13
+ if (!options.channelId) {
14
+ throw new Error("channelId is required for worker token generation");
15
+ }
16
+ const timestamp = Date.now();
17
+ const payload = {
18
+ userId,
19
+ conversationId,
20
+ channelId: options.channelId,
21
+ teamId: options.teamId, // Can be undefined - that's ok
22
+ agentId: options.agentId, // Space ID for multi-tenant credential lookup
23
+ connectionId: options.connectionId,
24
+ deploymentName,
25
+ timestamp,
26
+ platform: options.platform,
27
+ sessionKey: options.sessionKey,
28
+ traceId: options.traceId, // Trace ID for observability
29
+ };
30
+ // Encrypt the payload
31
+ const encrypted = (0, encryption_1.encrypt)(JSON.stringify(payload));
32
+ return encrypted;
33
+ }
34
+ /**
35
+ * Verify and decrypt a worker authentication token
36
+ */
37
+ function verifyWorkerToken(token) {
38
+ try {
39
+ // Decrypt the token
40
+ const decrypted = (0, encryption_1.decrypt)(token);
41
+ const data = JSON.parse(decrypted);
42
+ if (!data.conversationId ||
43
+ !data.userId ||
44
+ !data.deploymentName ||
45
+ !data.timestamp) {
46
+ logger.error("Worker token rejected: missing required fields");
47
+ return null;
48
+ }
49
+ // Check token expiration (default 24h)
50
+ const parsedTtl = parseInt(process.env.WORKER_TOKEN_TTL_MS ?? "", 10);
51
+ const ttl = !Number.isNaN(parsedTtl) && parsedTtl > 0 ? parsedTtl : 86400000;
52
+ if (Date.now() - data.timestamp > ttl) {
53
+ logger.error("Worker token rejected: expired");
54
+ return null;
55
+ }
56
+ return data;
57
+ }
58
+ catch (error) {
59
+ logger.error("Error verifying token:", error);
60
+ return null;
61
+ }
62
+ }
63
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/worker/auth.ts"],"names":[],"mappings":";;AA2BA,kDAqCC;AAKD,8CA8BC;AAnGD,sCAAyC;AACzC,oDAAuD;AAEvD,MAAM,MAAM,GAAG,IAAA,qBAAY,EAAC,aAAa,CAAC,CAAC;AAqB3C;;GAEG;AACH,SAAgB,mBAAmB,CACjC,MAAc,EACd,cAAsB,EACtB,cAAsB,EACtB,OAQC;IAED,2BAA2B;IAC3B,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;IACvE,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,MAAM,OAAO,GAAoB;QAC/B,MAAM;QACN,cAAc;QACd,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,+BAA+B;QACvD,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,8CAA8C;QACxE,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,cAAc;QACd,SAAS;QACT,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,6BAA6B;KACxD,CAAC;IAEF,sBAAsB;IACtB,MAAM,SAAS,GAAG,IAAA,oBAAO,EAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;IACnD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;GAEG;AACH,SAAgB,iBAAiB,CAAC,KAAa;IAC7C,IAAI,CAAC;QACH,oBAAoB;QACpB,MAAM,SAAS,GAAG,IAAA,oBAAO,EAAC,KAAK,CAAC,CAAC;QACjC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAoB,CAAC;QAEtD,IACE,CAAC,IAAI,CAAC,cAAc;YACpB,CAAC,IAAI,CAAC,MAAM;YACZ,CAAC,IAAI,CAAC,cAAc;YACpB,CAAC,IAAI,CAAC,SAAS,EACf,CAAC;YACD,MAAM,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAAC;YAC/D,OAAO,IAAI,CAAC;QACd,CAAC;QAED,uCAAuC;QACvC,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QACtE,MAAM,GAAG,GACP,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC;QACnE,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,GAAG,GAAG,EAAE,CAAC;YACtC,MAAM,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;YAC/C,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,wBAAwB,EAAE,KAAK,CAAC,CAAC;QAC9C,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -0,0 +1,86 @@
1
+ /**
2
+ * Worker Transport Interface
3
+ * Defines how workers communicate with the gateway (platform-agnostic)
4
+ *
5
+ * This abstraction allows different transport implementations:
6
+ * - HTTP (current implementation)
7
+ * - WebSocket (for real-time bidirectional communication)
8
+ * - gRPC (for high-performance scenarios)
9
+ * - Message Queue (for asynchronous processing)
10
+ */
11
+ /**
12
+ * Transport interface for worker-to-gateway communication
13
+ */
14
+ export interface WorkerTransport {
15
+ /**
16
+ * Set the job ID for this worker session
17
+ * Used to correlate responses with the originating request
18
+ */
19
+ setJobId(jobId: string): void;
20
+ /**
21
+ * Set module-specific data to be included in responses
22
+ * Allows modules to attach metadata to worker responses
23
+ */
24
+ setModuleData(moduleData: Record<string, unknown>): void;
25
+ /**
26
+ * Send a streaming delta to the gateway
27
+ *
28
+ * @param delta - The content delta to send
29
+ * @param isFullReplacement - If true, replaces entire content; if false, appends
30
+ * @param isFinal - If true, indicates this is the final delta
31
+ */
32
+ sendStreamDelta(delta: string, isFullReplacement?: boolean, isFinal?: boolean): Promise<void>;
33
+ /**
34
+ * Signal that the worker has completed processing
35
+ * Optionally includes a final delta
36
+ *
37
+ * @param finalDelta - Optional final content delta
38
+ */
39
+ signalDone(finalDelta?: string): Promise<void>;
40
+ /**
41
+ * Signal successful completion without additional content
42
+ */
43
+ signalCompletion(): Promise<void>;
44
+ /**
45
+ * Signal that an error occurred during processing
46
+ *
47
+ * @param error - The error that occurred
48
+ */
49
+ signalError(error: Error, errorCode?: string): Promise<void>;
50
+ /**
51
+ * Send a status update to the gateway
52
+ * Used for long-running operations to show progress
53
+ *
54
+ * @param elapsedSeconds - Time elapsed since operation started
55
+ * @param state - Current state description (e.g., "processing", "waiting for API")
56
+ */
57
+ sendStatusUpdate(elapsedSeconds: number, state: string): Promise<void>;
58
+ }
59
+ /**
60
+ * Configuration for creating a worker transport
61
+ */
62
+ export interface WorkerTransportConfig {
63
+ /** Gateway URL for sending responses */
64
+ gatewayUrl: string;
65
+ /** Authentication token for worker */
66
+ workerToken: string;
67
+ /** User ID who initiated the request */
68
+ userId: string;
69
+ /** Channel/conversation ID */
70
+ channelId: string;
71
+ /** Conversation ID for organizing messages */
72
+ conversationId: string;
73
+ /** Original message timestamp/ID */
74
+ originalMessageTs: string;
75
+ /** Bot's response message timestamp/ID (if exists) */
76
+ botResponseTs?: string;
77
+ /** Team/workspace ID (required for all platforms) */
78
+ teamId: string;
79
+ /** Platform identifier (slack, whatsapp, api, etc.) */
80
+ platform?: string;
81
+ /** Platform-specific metadata needed for response routing */
82
+ platformMetadata?: Record<string, unknown>;
83
+ /** IDs of messages already processed (for deduplication) */
84
+ processedMessageIds?: string[];
85
+ }
86
+ //# sourceMappingURL=transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../src/worker/transport.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B;;;OAGG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAE9B;;;OAGG;IACH,aAAa,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAEzD;;;;;;OAMG;IACH,eAAe,CACb,KAAK,EAAE,MAAM,EACb,iBAAiB,CAAC,EAAE,OAAO,EAC3B,OAAO,CAAC,EAAE,OAAO,GAChB,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjB;;;;;OAKG;IACH,UAAU,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE/C;;OAEG;IACH,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAElC;;;;OAIG;IACH,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE7D;;;;;;OAMG;IACH,gBAAgB,CAAC,cAAc,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACxE;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,wCAAwC;IACxC,UAAU,EAAE,MAAM,CAAC;IAEnB,sCAAsC;IACtC,WAAW,EAAE,MAAM,CAAC;IAEpB,wCAAwC;IACxC,MAAM,EAAE,MAAM,CAAC;IAEf,8BAA8B;IAC9B,SAAS,EAAE,MAAM,CAAC;IAElB,8CAA8C;IAC9C,cAAc,EAAE,MAAM,CAAC;IAEvB,oCAAoC;IACpC,iBAAiB,EAAE,MAAM,CAAC;IAE1B,sDAAsD;IACtD,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,qDAAqD;IACrD,MAAM,EAAE,MAAM,CAAC;IAEf,uDAAuD;IACvD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,6DAA6D;IAC7D,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAE3C,4DAA4D;IAC5D,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;CAChC"}
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ /**
3
+ * Worker Transport Interface
4
+ * Defines how workers communicate with the gateway (platform-agnostic)
5
+ *
6
+ * This abstraction allows different transport implementations:
7
+ * - HTTP (current implementation)
8
+ * - WebSocket (for real-time bidirectional communication)
9
+ * - gRPC (for high-performance scenarios)
10
+ * - Message Queue (for asynchronous processing)
11
+ */
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ //# sourceMappingURL=transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.js","sourceRoot":"","sources":["../../src/worker/transport.ts"],"names":[],"mappings":";AAAA;;;;;;;;;GASG"}
package/package.json ADDED
@@ -0,0 +1,40 @@
1
+ {
2
+ "name": "@lobu/core",
3
+ "version": "2.8.0",
4
+ "license": "Apache-2.0",
5
+ "description": "Core types and utilities for Lobu agent platform",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "bun": "./dist/index.js",
12
+ "import": "./dist/index.js",
13
+ "require": "./dist/index.js"
14
+ },
15
+ "./testing": {
16
+ "bun": "./dist/__tests__/fixtures/index.js"
17
+ }
18
+ },
19
+ "scripts": {
20
+ "build": "tsc",
21
+ "dev": "tsc --watch",
22
+ "test": "bun test",
23
+ "typecheck": "tsc --noEmit"
24
+ },
25
+ "dependencies": {
26
+ "@opentelemetry/api": "^1.9.0",
27
+ "@opentelemetry/sdk-trace-node": "^1.30.0",
28
+ "@opentelemetry/exporter-trace-otlp-http": "^0.57.0",
29
+ "@opentelemetry/resources": "^1.30.0",
30
+ "@opentelemetry/semantic-conventions": "^1.28.0",
31
+ "@sentry/node": "^10.23.0",
32
+ "ioredis": "^5.4.1",
33
+ "winston": "^3.17.0"
34
+ },
35
+ "devDependencies": {
36
+ "@types/bun": "1.2.11",
37
+ "@types/node": "^20.0.0",
38
+ "typescript": "^5.8.3"
39
+ }
40
+ }