@intella/sdk 0.0.4 → 0.0.6

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 (60) hide show
  1. package/dist/agents/base-agent.d.ts.map +1 -1
  2. package/dist/agents/base-agent.js +9 -3
  3. package/dist/agents/base-agent.js.map +1 -1
  4. package/dist/agents/claude-agent.js +1 -1
  5. package/dist/index.d.ts +11 -2
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +13 -1
  8. package/dist/index.js.map +1 -1
  9. package/dist/sandbox/agent-installers.d.ts +33 -0
  10. package/dist/sandbox/agent-installers.d.ts.map +1 -0
  11. package/dist/sandbox/agent-installers.js +277 -0
  12. package/dist/sandbox/agent-installers.js.map +1 -0
  13. package/dist/sandbox/agent-setup.d.ts +29 -0
  14. package/dist/sandbox/agent-setup.d.ts.map +1 -0
  15. package/dist/sandbox/agent-setup.js +63 -0
  16. package/dist/sandbox/agent-setup.js.map +1 -0
  17. package/dist/sandbox/config.d.ts +33 -0
  18. package/dist/sandbox/config.d.ts.map +1 -0
  19. package/dist/sandbox/config.js +113 -0
  20. package/dist/sandbox/config.js.map +1 -0
  21. package/dist/sandbox/daytona-provider.d.ts.map +1 -1
  22. package/dist/sandbox/daytona-provider.js +2 -1
  23. package/dist/sandbox/daytona-provider.js.map +1 -1
  24. package/dist/sandbox/e2b-provider.js +2 -1
  25. package/dist/sandbox/e2b-provider.js.map +1 -1
  26. package/dist/sandbox/local-provider.d.ts +52 -0
  27. package/dist/sandbox/local-provider.d.ts.map +1 -0
  28. package/dist/sandbox/local-provider.js +305 -0
  29. package/dist/sandbox/local-provider.js.map +1 -0
  30. package/dist/sandbox/modal-provider.js +2 -1
  31. package/dist/sandbox/modal-provider.js.map +1 -1
  32. package/dist/sandbox/vercel-provider.d.ts +92 -0
  33. package/dist/sandbox/vercel-provider.d.ts.map +1 -0
  34. package/dist/sandbox/vercel-provider.js +491 -0
  35. package/dist/sandbox/vercel-provider.js.map +1 -0
  36. package/dist/sandbox-manager.d.ts +2 -1
  37. package/dist/sandbox-manager.d.ts.map +1 -1
  38. package/dist/sandbox-manager.js +8 -3
  39. package/dist/sandbox-manager.js.map +1 -1
  40. package/dist/sdk.d.ts +18 -6
  41. package/dist/sdk.d.ts.map +1 -1
  42. package/dist/sdk.js +40 -0
  43. package/dist/sdk.js.map +1 -1
  44. package/dist/types.d.ts +52 -5
  45. package/dist/types.d.ts.map +1 -1
  46. package/dist/types.js +11 -1
  47. package/dist/types.js.map +1 -1
  48. package/dist/utils/cli-daemon.d.ts +25 -0
  49. package/dist/utils/cli-daemon.d.ts.map +1 -0
  50. package/dist/utils/cli-daemon.js +82 -0
  51. package/dist/utils/cli-daemon.js.map +1 -0
  52. package/dist/utils/id.util.d.ts +53 -0
  53. package/dist/utils/id.util.d.ts.map +1 -0
  54. package/dist/utils/id.util.js +71 -0
  55. package/dist/utils/id.util.js.map +1 -0
  56. package/dist/utils/redis-stream.d.ts +161 -0
  57. package/dist/utils/redis-stream.d.ts.map +1 -0
  58. package/dist/utils/redis-stream.js +462 -0
  59. package/dist/utils/redis-stream.js.map +1 -0
  60. package/package.json +8 -2
@@ -0,0 +1,71 @@
1
+ // utils/id.util.ts
2
+ import { monotonicFactory, decodeTime } from 'ulid';
3
+ import { UUIDtoULID, ULIDtoUUID } from "ulid-uuid-converter";
4
+ export class IdGenerator {
5
+ static ulid = monotonicFactory();
6
+ /**
7
+ * Generate a ULID and convert it to UUID format.
8
+ * This method creates a new ULID and its corresponding UUID.
9
+ *
10
+ * @returns {[string, string]} A tuple containing the generated ULID and UUID.
11
+ *
12
+ * @example
13
+ * const [ulid, uuid] = IdGenerator.generateIds();
14
+ * console.log(ulid); // Example output: "01F8MECHZX3TBZ7C8F8M8F8M8F"
15
+ * console.log(uuid); // Example output: "550e8400-e29b-41d4-a716-446655440000"
16
+ */
17
+ static generateIds() {
18
+ const ulid = this.ulid();
19
+ const uuid = this.ulidToUuid(ulid);
20
+ return [ulid, uuid];
21
+ }
22
+ static generatePrefixUlid(prefix) {
23
+ const ulid = this.ulid();
24
+ return `${prefix}_${ulid}`;
25
+ }
26
+ /**
27
+ * Convert a ULID to UUID format.
28
+ * This method takes a ULID string and converts it into its corresponding UUID representation.
29
+ *
30
+ * @param ulid - The ULID string to be converted.
31
+ * @returns {string} The UUID string corresponding to the provided ULID.
32
+ *
33
+ * @example
34
+ * const uuid = IdGenerator.ulidToUuid("01F8MECHZX3TBZ7C8F8M8F8M8F");
35
+ * console.log(uuid); // Example output: "550e8400-e29b-41d4-a716-446655440000"
36
+ */
37
+ static ulidToUuid(ulid) {
38
+ const uuid = ULIDtoUUID(ulid);
39
+ return uuid;
40
+ }
41
+ /**
42
+ * Convert a UUID to ULID format.
43
+ * This method takes a UUID string and converts it into its corresponding ULID representation.
44
+ *
45
+ * @param uuid - The UUID string to be converted.
46
+ * @returns {string} The ULID string corresponding to the provided UUID.
47
+ *
48
+ * @example
49
+ * const ulid = IdGenerator.uuidToUlid("550e8400-e29b-41d4-a716-446655440000");
50
+ * console.log(ulid); // Example output: "01F8MECHZX3TBZ7C8F8M8F8M8F"
51
+ */
52
+ static uuidToUlid(uuid) {
53
+ const ulid = UUIDtoULID(uuid);
54
+ return ulid;
55
+ }
56
+ /**
57
+ * Get timestamp from ULID.
58
+ * This method extracts the timestamp from a given ULID string, returning the time in milliseconds since the Unix epoch.
59
+ *
60
+ * @param ulid - The ULID string from which to extract the timestamp.
61
+ * @returns {number} The timestamp in milliseconds.
62
+ *
63
+ * @example
64
+ * const timestamp = IdGenerator.getTimestampFromUlid("01F8MECHZX3TBZ7C8F8M8F8M8F");
65
+ * console.log(timestamp); // Example output: 1622547800000
66
+ */
67
+ static getTimestampFromUlid(ulid) {
68
+ return decodeTime(ulid);
69
+ }
70
+ }
71
+ //# sourceMappingURL=id.util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"id.util.js","sourceRoot":"","sources":["../../src/utils/id.util.ts"],"names":[],"mappings":"AAAA,mBAAmB;AACnB,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAE7D,MAAM,OAAO,WAAW;IACd,MAAM,CAAC,IAAI,GAAG,gBAAgB,EAAE,CAAC;IAEzC;;;;;;;;;;OAUG;IACH,MAAM,CAAC,WAAW;QAChB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACnC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACtB,CAAC;IAED,MAAM,CAAC,kBAAkB,CAAC,MAAc;QACtC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QACzB,OAAO,GAAG,MAAM,IAAI,IAAI,EAAE,CAAA;IAC5B,CAAC;IAED;;;;;;;;;;OAUG;IACH,MAAM,CAAC,UAAU,CAAC,IAAY;QAC5B,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;QAC9B,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;;;;;;OAUG;IACH,MAAM,CAAC,UAAU,CAAC,IAAY;QAC5B,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;QAC9B,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;;;;;;OAUG;IACH,MAAM,CAAC,oBAAoB,CAAC,IAAY;QACtC,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC"}
@@ -0,0 +1,161 @@
1
+ /**
2
+ * Redis Stream utilities for sandbox command execution
3
+ * Provides reusable methods for publishing commands, chunks, and waiting for results
4
+ */
5
+ import { type RedisClientType } from 'redis';
6
+ import type { TaskRequest, AgentType } from '../types.js';
7
+ export declare let client: RedisClientType | null;
8
+ /**
9
+ * Get Redis client from URL
10
+ */
11
+ export declare function getRedisClient(redisUrl?: string): Promise<RedisClientType>;
12
+ /**
13
+ * Command to publish to sandbox stream
14
+ */
15
+ export interface SandboxCommand {
16
+ id?: string;
17
+ type: 'session:init' | 'session:end' | 'agent:execute' | 'ping';
18
+ sessionId?: string;
19
+ agentType?: AgentType | string;
20
+ prompt?: string;
21
+ taskRequest?: TaskRequest;
22
+ history?: unknown[];
23
+ model?: string;
24
+ streamAgentResult?: boolean;
25
+ apiKeys?: Record<string, string>;
26
+ metadata?: Record<string, unknown>;
27
+ [key: string]: unknown;
28
+ }
29
+ /**
30
+ * Result from sandbox stream
31
+ */
32
+ export interface SandboxRedisResult {
33
+ commandId: string;
34
+ type: 'success' | 'error' | 'chunk' | 'done';
35
+ sessionId?: string;
36
+ data?: unknown;
37
+ error?: string;
38
+ timestamp: number;
39
+ }
40
+ /**
41
+ * Chunk data to publish
42
+ */
43
+ export interface ChunkData {
44
+ chunkId?: string;
45
+ chunk?: string;
46
+ segmentId?: string;
47
+ isDone?: boolean;
48
+ type?: string;
49
+ senderType?: string;
50
+ timestamp?: number;
51
+ data?: unknown;
52
+ }
53
+ /**
54
+ * Publish a command to sandbox-specific Redis stream
55
+ * @param sandboxId - Sandbox ID
56
+ * @param command - Command to publish
57
+ * @param redisUrl - Optional Redis URL (defaults to REDIS_URL env var)
58
+ */
59
+ export declare function publishCommand(sandboxId: string, command: SandboxCommand, redisUrl?: string): Promise<string>;
60
+ /**
61
+ * Publish a chunk to sandbox-specific Redis stream
62
+ * @param sandboxId - Sandbox ID
63
+ * @param chunk - Chunk data to publish
64
+ * @param redisUrl - Optional Redis URL (defaults to REDIS_URL env var)
65
+ */
66
+ export declare function publishChunk(sandboxId: string, chunk: ChunkData, redisUrl?: string): Promise<void>;
67
+ /**
68
+ * Publish a chunk to session-specific Redis stream
69
+ * @param sessionId - Session ID
70
+ * @param chunk - Chunk data to publish
71
+ * @param redisUrl - Optional Redis URL (defaults to REDIS_URL env var)
72
+ */
73
+ export declare function publishChunkToSession(sessionId: string, chunk: ChunkData, redisUrl?: string): Promise<void>;
74
+ /**
75
+ * Generic stream reading options
76
+ */
77
+ export interface ReadFromStreamOptions {
78
+ /** Redis URL (defaults to REDIS_URL env var) */
79
+ redisUrl?: string;
80
+ /** Maximum time to wait in milliseconds (default: 10 minutes) */
81
+ timeout?: number;
82
+ /** Consumer group name (auto-generated if not provided) */
83
+ groupName?: string;
84
+ /** Consumer name (auto-generated if not provided) */
85
+ consumerName?: string;
86
+ /** Filter by commandId (for sandbox streams) */
87
+ commandId?: string;
88
+ /** Filter function to determine if message should be processed */
89
+ filter?: (message: Record<string, string>) => boolean;
90
+ /** Transform function to convert message to result type */
91
+ transform?: (message: Record<string, string>) => any;
92
+ /** Whether to stop on 'done' or 'error' type messages (default: true) */
93
+ stopOnDone?: boolean;
94
+ /** Block time in milliseconds for XREADGROUP (default: 1000) */
95
+ blockTime?: number;
96
+ /** Count of messages to read per batch (default: 100) */
97
+ count?: number;
98
+ }
99
+ /**
100
+ * Generic function to read from any Redis stream (async generator)
101
+ * @param streamKey - Redis stream key
102
+ * @param options - Configuration options
103
+ */
104
+ export declare function readFromStream<T = Record<string, any>>(streamKey: string, options?: ReadFromStreamOptions): AsyncGenerator<T, void, unknown>;
105
+ /**
106
+ * Read results from sandbox stream (convenience function)
107
+ * @param sandboxId - Sandbox ID
108
+ * @param commandId - Command ID to filter by
109
+ * @param options - Additional options
110
+ */
111
+ export declare function readFromSandbox(sandboxId: string, commandId: string, options?: Omit<ReadFromStreamOptions, 'commandId'>): AsyncGenerator<SandboxRedisResult, void, unknown>;
112
+ /**
113
+ * Session stream chunk data (matches StreamChunkData from apps)
114
+ */
115
+ export interface SessionStreamChunk {
116
+ chunkId?: string;
117
+ chunk?: string;
118
+ segmentId?: string | null;
119
+ isDone?: boolean;
120
+ type?: string;
121
+ senderType?: string;
122
+ timestamp?: number;
123
+ data?: unknown;
124
+ }
125
+ /**
126
+ * Read chunks from session stream (convenience function)
127
+ * @param sessionId - Session ID
128
+ * @param options - Additional options
129
+ */
130
+ export declare function readFromSession(sessionId: string, options?: ReadFromStreamOptions): AsyncGenerator<SessionStreamChunk, void, unknown>;
131
+ /**
132
+ * Wait for a success result for a specific command
133
+ * @param sandboxId - Sandbox ID
134
+ * @param commandId - Command ID to wait for
135
+ * @param redisUrl - Optional Redis URL (defaults to REDIS_URL env var)
136
+ * @param timeout - Timeout in milliseconds (default: 10 minutes)
137
+ * @returns Promise that resolves when success is received
138
+ * @throws Error if timeout or error result is received
139
+ */
140
+ export declare function waitForSuccess(sandboxId: string, commandId: string, redisUrl?: string, timeout?: number): Promise<SandboxRedisResult>;
141
+ /**
142
+ * Wait for an error result for a specific command
143
+ * @param sandboxId - Sandbox ID
144
+ * @param commandId - Command ID to wait for
145
+ * @param redisUrl - Optional Redis URL (defaults to REDIS_URL env var)
146
+ * @param timeout - Timeout in milliseconds (default: 10 minutes)
147
+ * @returns Promise that resolves with error result
148
+ * @throws Error if timeout
149
+ */
150
+ export declare function waitForError(sandboxId: string, commandId: string, redisUrl?: string, timeout?: number): Promise<SandboxRedisResult>;
151
+ /**
152
+ * Wait for a done or error result for a specific command (returns full result data)
153
+ * @param sandboxId - Sandbox ID
154
+ * @param commandId - Command ID to wait for
155
+ * @param redisUrl - Optional Redis URL (defaults to REDIS_URL env var)
156
+ * @param timeout - Timeout in milliseconds (default: 10 minutes)
157
+ * @returns Promise that resolves with done or error result
158
+ * @throws Error if timeout
159
+ */
160
+ export declare function waitForResult(sandboxId: string, commandId: string, redisUrl?: string, timeout?: number): Promise<SandboxRedisResult>;
161
+ //# sourceMappingURL=redis-stream.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redis-stream.d.ts","sourceRoot":"","sources":["../../src/utils/redis-stream.ts"],"names":[],"mappings":"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"}