@seaverse/conversation-sdk 0.4.0 → 0.4.2

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 (125) hide show
  1. package/README.md +1 -1
  2. package/dist/aggregated/apps-with-conversations.d.ts +1 -1
  3. package/dist/aggregated/index.d.ts +3 -0
  4. package/dist/client/ConversationClient.d.ts +24 -0
  5. package/dist/client/ConversationsClient.d.ts +31 -0
  6. package/dist/client/ConversationsClient.js +50 -0
  7. package/dist/client/ConversationsClient.js.map +1 -0
  8. package/dist/client/EnvironmentConfig.d.ts +12 -0
  9. package/dist/client/EnvironmentConfig.d.ts.map +1 -0
  10. package/dist/client/EnvironmentConfig.js +21 -0
  11. package/dist/client/EnvironmentConfig.js.map +1 -0
  12. package/dist/client/MessagesClient.d.ts +31 -0
  13. package/dist/client/MessagesClient.js +57 -0
  14. package/dist/client/MessagesClient.js.map +1 -0
  15. package/dist/client/index.d.ts +3 -0
  16. package/dist/client/index.js +3 -0
  17. package/dist/client/index.js.map +1 -0
  18. package/dist/data/DbClient.d.ts +76 -0
  19. package/dist/data/DbClient.d.ts.map +1 -0
  20. package/dist/data/DbClient.js +107 -0
  21. package/dist/data/DbClient.js.map +1 -0
  22. package/dist/data/index.d.ts +2 -0
  23. package/dist/data/index.d.ts.map +1 -0
  24. package/dist/data/index.js +2 -0
  25. package/dist/data/index.js.map +1 -0
  26. package/dist/data/postgrest-headers.d.ts +10 -0
  27. package/dist/data/postgrest-headers.d.ts.map +1 -0
  28. package/dist/data/postgrest-headers.js +58 -0
  29. package/dist/data/postgrest-headers.js.map +1 -0
  30. package/dist/data/query.types.d.ts +62 -0
  31. package/dist/data/query.types.d.ts.map +1 -0
  32. package/dist/data/query.types.js +2 -0
  33. package/dist/data/query.types.js.map +1 -0
  34. package/dist/errors/AuthError.d.ts +8 -0
  35. package/dist/errors/AuthError.d.ts.map +1 -0
  36. package/dist/errors/AuthError.js +10 -0
  37. package/dist/errors/AuthError.js.map +1 -0
  38. package/dist/errors/BaseError.d.ts +17 -0
  39. package/dist/errors/BaseError.d.ts.map +1 -0
  40. package/dist/errors/BaseError.js +26 -0
  41. package/dist/errors/BaseError.js.map +1 -0
  42. package/dist/errors/NetworkError.d.ts +8 -0
  43. package/dist/errors/NetworkError.d.ts.map +1 -0
  44. package/dist/errors/NetworkError.js +10 -0
  45. package/dist/errors/NetworkError.js.map +1 -0
  46. package/dist/errors/ProtocolError.d.ts +8 -0
  47. package/dist/errors/ProtocolError.d.ts.map +1 -0
  48. package/dist/errors/ProtocolError.js +10 -0
  49. package/dist/errors/ProtocolError.js.map +1 -0
  50. package/dist/errors/TimeoutError.d.ts +8 -0
  51. package/dist/errors/TimeoutError.d.ts.map +1 -0
  52. package/dist/errors/TimeoutError.js +10 -0
  53. package/dist/errors/TimeoutError.js.map +1 -0
  54. package/dist/errors/index.d.ts +6 -0
  55. package/dist/errors/index.d.ts.map +1 -0
  56. package/dist/errors/index.js +6 -0
  57. package/dist/errors/index.js.map +1 -0
  58. package/dist/resources/AppsResource.d.ts +37 -0
  59. package/dist/resources/AppsResource.d.ts.map +1 -0
  60. package/dist/resources/AppsResource.js +51 -0
  61. package/dist/resources/AppsResource.js.map +1 -0
  62. package/dist/resources/ConversationsResource.d.ts +87 -0
  63. package/dist/resources/MessagesResource.d.ts +57 -0
  64. package/dist/resources/MessagesResource.d.ts.map +1 -0
  65. package/dist/resources/MessagesResource.js +117 -0
  66. package/dist/resources/MessagesResource.js.map +1 -0
  67. package/dist/session/session-token.d.ts +2 -2
  68. package/dist/session/session-token.js +2 -2
  69. package/dist/session/session-token.js.map +1 -1
  70. package/dist/transforms/app.transform.d.ts +6 -0
  71. package/dist/transforms/app.transform.d.ts.map +1 -0
  72. package/dist/transforms/app.transform.js +39 -0
  73. package/dist/transforms/app.transform.js.map +1 -0
  74. package/dist/transforms/conversation.transform.d.ts +14 -0
  75. package/dist/transforms/conversation.transform.d.ts.map +1 -0
  76. package/dist/transforms/conversation.transform.js +64 -0
  77. package/dist/transforms/conversation.transform.js.map +1 -0
  78. package/dist/transforms/message.transform.d.ts +32 -0
  79. package/dist/transforms/message.transform.d.ts.map +1 -0
  80. package/dist/transforms/message.transform.js +132 -0
  81. package/dist/transforms/message.transform.js.map +1 -0
  82. package/dist/transport/HttpClient.d.ts +34 -0
  83. package/dist/transport/HttpClient.d.ts.map +1 -0
  84. package/dist/transport/HttpClient.js +158 -0
  85. package/dist/transport/HttpClient.js.map +1 -0
  86. package/dist/transport/config.types.d.ts +40 -0
  87. package/dist/transport/config.types.d.ts.map +1 -0
  88. package/dist/transport/config.types.js +2 -0
  89. package/dist/transport/config.types.js.map +1 -0
  90. package/dist/transport/index.d.ts +10 -0
  91. package/dist/transport/index.d.ts.map +1 -0
  92. package/dist/transport/index.js +11 -0
  93. package/dist/transport/index.js.map +1 -0
  94. package/dist/transport/timeout.d.ts +12 -0
  95. package/dist/transport/timeout.d.ts.map +1 -0
  96. package/dist/transport/timeout.js +29 -0
  97. package/dist/transport/timeout.js.map +1 -0
  98. package/dist/types/common.types.d.ts +24 -0
  99. package/dist/types/common.types.d.ts.map +1 -0
  100. package/dist/types/common.types.js +5 -0
  101. package/dist/types/common.types.js.map +1 -0
  102. package/dist/types/config.types.d.ts +28 -0
  103. package/dist/types/config.types.d.ts.map +1 -0
  104. package/dist/types/config.types.js +2 -0
  105. package/dist/types/config.types.js.map +1 -0
  106. package/dist/types/http.types.d.ts +47 -0
  107. package/dist/types/http.types.d.ts.map +1 -0
  108. package/dist/types/http.types.js +2 -0
  109. package/dist/types/http.types.js.map +1 -0
  110. package/dist/types/index.d.ts +7 -0
  111. package/dist/types/index.js +2 -0
  112. package/dist/types/index.js.map +1 -0
  113. package/dist/types/models.types.d.ts +178 -0
  114. package/dist/types/models.types.d.ts.map +1 -0
  115. package/dist/types/models.types.js +5 -0
  116. package/dist/types/models.types.js.map +1 -0
  117. package/dist/types/pagination.types.d.ts +69 -0
  118. package/dist/types/pagination.types.d.ts.map +1 -0
  119. package/dist/types/pagination.types.js +24 -0
  120. package/dist/types/pagination.types.js.map +1 -0
  121. package/dist/types/token.types.d.ts +6 -0
  122. package/dist/types/token.types.d.ts.map +1 -0
  123. package/dist/types/token.types.js +2 -0
  124. package/dist/types/token.types.js.map +1 -0
  125. package/package.json +3 -3
@@ -0,0 +1,39 @@
1
+ /**
2
+ * 转换数据库应用对象为前端模型
3
+ */
4
+ export function transformApp(dbApp) {
5
+ const metadata = (dbApp.metadata || {});
6
+ const coverImageUrls = Array.isArray(metadata.coverImageUrls)
7
+ ? metadata.coverImageUrls
8
+ : Array.isArray(metadata.coverImageURLS)
9
+ ? metadata.coverImageURLS
10
+ : [];
11
+ const createdAtRaw = (dbApp.created_at ?? 0);
12
+ const updatedAtRaw = (dbApp.updated_at ?? 0);
13
+ const createdAtMs = typeof createdAtRaw === 'string' ? Date.parse(createdAtRaw) :
14
+ typeof createdAtRaw === 'number' ? (createdAtRaw > 10000000000 ? createdAtRaw : createdAtRaw * 1000) :
15
+ 0;
16
+ const updatedAtMs = typeof updatedAtRaw === 'string' ? Date.parse(updatedAtRaw) :
17
+ typeof updatedAtRaw === 'number' ? (updatedAtRaw > 10000000000 ? updatedAtRaw : updatedAtRaw * 1000) :
18
+ 0;
19
+ const published = Boolean(metadata.published);
20
+ const id = dbApp.app_id || dbApp.id || '';
21
+ const name = dbApp.app_name || dbApp.name || '';
22
+ return {
23
+ id,
24
+ name,
25
+ displayName: dbApp.display_name || name,
26
+ description: dbApp.description || '',
27
+ thumbnailUrls: dbApp.thumbnail_urls || coverImageUrls,
28
+ userName: dbApp.user_id || dbApp.user_name || '',
29
+ version: dbApp.version || '',
30
+ tags: dbApp.tags ?? null,
31
+ status: dbApp.status || (published ? 'published' : 'draft'),
32
+ positiveCount: dbApp.positive_count || 0,
33
+ forkCount: dbApp.fork_count || 0,
34
+ commentCount: dbApp.comment_count || 0,
35
+ createdAt: Number.isFinite(createdAtMs) ? createdAtMs : 0,
36
+ updatedAt: Number.isFinite(updatedAtMs) ? updatedAtMs : 0,
37
+ };
38
+ }
39
+ //# sourceMappingURL=app.transform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app.transform.js","sourceRoot":"","sources":["../../src/transforms/app.transform.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,KAAmB;IAC9C,MAAM,QAAQ,GAAG,CAAC,KAAK,CAAC,QAAQ,IAAI,EAAE,CAAQ,CAAC;IAC/C,MAAM,cAAc,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC;QAC3D,CAAC,CAAC,QAAQ,CAAC,cAAc;QACzB,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC;YACtC,CAAC,CAAC,QAAQ,CAAC,cAAc;YACzB,CAAC,CAAC,EAAE,CAAC;IAET,MAAM,YAAY,GAAG,CAAC,KAAK,CAAC,UAAU,IAAI,CAAC,CAAQ,CAAC;IACpD,MAAM,YAAY,GAAG,CAAC,KAAK,CAAC,UAAU,IAAI,CAAC,CAAQ,CAAC;IAEpD,MAAM,WAAW,GACf,OAAO,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC;QAC7D,OAAO,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,YAAY,GAAG,WAAW,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC,CAAC;YACtG,CAAC,CAAC;IACJ,MAAM,WAAW,GACf,OAAO,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC;QAC7D,OAAO,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,YAAY,GAAG,WAAW,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC,CAAC;YACtG,CAAC,CAAC;IAEJ,MAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IAC9C,MAAM,EAAE,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC;IAC1C,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC;IAEhD,OAAO;QACL,EAAE;QACF,IAAI;QACJ,WAAW,EAAE,KAAK,CAAC,YAAY,IAAI,IAAI;QACvC,WAAW,EAAE,KAAK,CAAC,WAAW,IAAI,EAAE;QACpC,aAAa,EAAE,KAAK,CAAC,cAAc,IAAI,cAAc;QACrD,QAAQ,EAAE,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,SAAS,IAAI,EAAE;QAChD,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,EAAE;QAC5B,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,IAAI;QACxB,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC;QAC3D,aAAa,EAAE,KAAK,CAAC,cAAc,IAAI,CAAC;QACxC,SAAS,EAAE,KAAK,CAAC,UAAU,IAAI,CAAC;QAChC,YAAY,EAAE,KAAK,CAAC,aAAa,IAAI,CAAC;QACtC,SAAS,EAAE,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;QACzD,SAAS,EAAE,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;KAC1D,CAAC;AACJ,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { Conversation, ConversationResponse, DbSchema } from '../types/models.types.js';
2
+ /**
3
+ * 转换数据库会话对象为前端模型
4
+ */
5
+ export declare function transformConversation(dbConv: DbSchema.Conversation): Conversation;
6
+ /**
7
+ * 转换前端会话对象为数据库格式(用于创建/更新)
8
+ */
9
+ export declare function toDbConversation(conv: Partial<Conversation>): Partial<DbSchema.Conversation>;
10
+ /**
11
+ * 转换数据库会话对象为 API 响应格式(snake_case,匹配 runtime-plugins)
12
+ */
13
+ export declare function toConversationResponse(dbConv: DbSchema.Conversation): ConversationResponse;
14
+ //# sourceMappingURL=conversation.transform.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation.transform.d.ts","sourceRoot":"","sources":["../../src/transforms/conversation.transform.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAa7F;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,QAAQ,CAAC,YAAY,GAC5B,YAAY,CAYd;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,CAU5F;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,QAAQ,CAAC,YAAY,GAC5B,oBAAoB,CAetB"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * 秒时间戳转换为毫秒时间戳
3
+ */
4
+ function toMilliseconds(seconds) {
5
+ if (!seconds)
6
+ return 0;
7
+ // 如果已经是毫秒时间戳(13位),直接返回
8
+ if (seconds > 10000000000)
9
+ return seconds;
10
+ // 否则转换为毫秒
11
+ return seconds * 1000;
12
+ }
13
+ /**
14
+ * 转换数据库会话对象为前端模型
15
+ */
16
+ export function transformConversation(dbConv) {
17
+ const id = (dbConv.conversation_id || dbConv.id || '').toString();
18
+ return {
19
+ id,
20
+ title: dbConv.title || 'Untitled',
21
+ appId: dbConv.app_id,
22
+ userId: dbConv.user_id,
23
+ createdAt: toMilliseconds(dbConv.created_at),
24
+ updatedAt: toMilliseconds(dbConv.updated_at),
25
+ lastActiveAt: toMilliseconds(dbConv.last_message_created_at || dbConv.updated_at),
26
+ messageCount: dbConv.message_count,
27
+ };
28
+ }
29
+ /**
30
+ * 转换前端会话对象为数据库格式(用于创建/更新)
31
+ */
32
+ export function toDbConversation(conv) {
33
+ const result = {};
34
+ // 兼容:优先写 conversation_id
35
+ if (conv.id)
36
+ result.conversation_id = conv.id;
37
+ if (conv.title)
38
+ result.title = conv.title;
39
+ if (conv.appId !== undefined)
40
+ result.app_id = conv.appId;
41
+ if (conv.userId)
42
+ result.user_id = conv.userId;
43
+ return result;
44
+ }
45
+ /**
46
+ * 转换数据库会话对象为 API 响应格式(snake_case,匹配 runtime-plugins)
47
+ */
48
+ export function toConversationResponse(dbConv) {
49
+ const conversation_id = (dbConv.conversation_id || dbConv.id || '').toString();
50
+ return {
51
+ conversation_id,
52
+ app_id: dbConv.app_id,
53
+ backend: 'seaverse',
54
+ backend_session_id: null,
55
+ title: dbConv.title || 'Untitled',
56
+ created_at: dbConv.created_at || 0,
57
+ updated_at: dbConv.updated_at || 0,
58
+ message_count: dbConv.message_count || 0,
59
+ skills_json: null,
60
+ metadata: {},
61
+ user_id: dbConv.user_id,
62
+ };
63
+ }
64
+ //# sourceMappingURL=conversation.transform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation.transform.js","sourceRoot":"","sources":["../../src/transforms/conversation.transform.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,SAAS,cAAc,CAAC,OAA2B;IACjD,IAAI,CAAC,OAAO;QAAE,OAAO,CAAC,CAAC;IACvB,uBAAuB;IACvB,IAAI,OAAO,GAAG,WAAW;QAAE,OAAO,OAAO,CAAC;IAC1C,UAAU;IACV,OAAO,OAAO,GAAG,IAAI,CAAC;AACxB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CACnC,MAA6B;IAE7B,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,eAAe,IAAI,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;IAClE,OAAO;QACL,EAAE;QACF,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,UAAU;QACjC,KAAK,EAAE,MAAM,CAAC,MAAM;QACpB,MAAM,EAAE,MAAM,CAAC,OAAO;QACtB,SAAS,EAAE,cAAc,CAAC,MAAM,CAAC,UAAU,CAAC;QAC5C,SAAS,EAAE,cAAc,CAAC,MAAM,CAAC,UAAU,CAAC;QAC5C,YAAY,EAAE,cAAc,CAAC,MAAM,CAAC,uBAAuB,IAAI,MAAM,CAAC,UAAU,CAAC;QACjF,YAAY,EAAE,MAAM,CAAC,aAAa;KACnC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAA2B;IAC1D,MAAM,MAAM,GAAmC,EAAE,CAAC;IAElD,yBAAyB;IACzB,IAAI,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,eAAe,GAAG,IAAI,CAAC,EAAE,CAAC;IAC9C,IAAI,IAAI,CAAC,KAAK;QAAE,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;IAC1C,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS;QAAE,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC;IACzD,IAAI,IAAI,CAAC,MAAM;QAAE,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC;IAE9C,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CACpC,MAA6B;IAE7B,MAAM,eAAe,GAAG,CAAC,MAAM,CAAC,eAAe,IAAI,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC/E,OAAO;QACL,eAAe;QACf,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,OAAO,EAAE,UAAU;QACnB,kBAAkB,EAAE,IAAI;QACxB,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,UAAU;QACjC,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,CAAC;QAClC,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,CAAC;QAClC,aAAa,EAAE,MAAM,CAAC,aAAa,IAAI,CAAC;QACxC,WAAW,EAAE,IAAI;QACjB,QAAQ,EAAE,EAAE;QACZ,OAAO,EAAE,MAAM,CAAC,OAAO;KACxB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,32 @@
1
+ import type { Message, DbSchema } from '../types/models.types.js';
2
+ /**
3
+ * 转换数据库消息对象为前端模型
4
+ *
5
+ * 完全对齐 runtime-plugins/conversations getMessages 的「全量透传」行为:
6
+ * - content 是合法 JSON 对象 → 直接展开整个 JSON,再用确定性字段覆盖
7
+ * - content 不是 JSON → 返回 { id, role, content, timestamp } 基础结构
8
+ *
9
+ * 额外增强(SDK 比 runtime-plugins 多做的部分):
10
+ * - 从 metadata(JSONB 列)中补充缺失字段(作为 fallback)
11
+ * - conversation_tips 类型自动注入 conversation_id
12
+ *
13
+ * 注意:不透传 metadata_json 字段。runtime-plugins 也不返回该字段。
14
+ * 如果透传,前端 isDuplicateMessage 会把所有 frontend_formatted=true 的消息
15
+ * 全部过滤掉,导致只剩用户消息。
16
+ *
17
+ * @see runtime-plugins/conversations/src/handlers/messages.ts getMessages()
18
+ */
19
+ export declare function transformMessage(dbMsg: DbSchema.Message): Message;
20
+ /**
21
+ * 转换前端消息对象为数据库格式
22
+ *
23
+ * 接受任意包含消息字段的对象,从中提取数据库需要的字段
24
+ */
25
+ export declare function toDbMessage(msg: {
26
+ id?: string;
27
+ conversationId?: string;
28
+ role?: string;
29
+ content?: string;
30
+ metadata?: Record<string, unknown>;
31
+ }): Partial<DbSchema.Message>;
32
+ //# sourceMappingURL=message.transform.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message.transform.d.ts","sourceRoot":"","sources":["../../src/transforms/message.transform.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAYlE;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,QAAQ,CAAC,OAAO,GAAG,OAAO,CA4FjE;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE;IAC/B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC,GAAG,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAU5B"}
@@ -0,0 +1,132 @@
1
+ /**
2
+ * 秒时间戳保持为秒
3
+ * 旧 API 使用秒级时间戳,不转换为毫秒
4
+ */
5
+ function toSeconds(seconds) {
6
+ // 如果是毫秒级时间戳,转换为秒
7
+ if (seconds > 10000000000)
8
+ return Math.floor(seconds / 1000);
9
+ return seconds;
10
+ }
11
+ /**
12
+ * 转换数据库消息对象为前端模型
13
+ *
14
+ * 完全对齐 runtime-plugins/conversations getMessages 的「全量透传」行为:
15
+ * - content 是合法 JSON 对象 → 直接展开整个 JSON,再用确定性字段覆盖
16
+ * - content 不是 JSON → 返回 { id, role, content, timestamp } 基础结构
17
+ *
18
+ * 额外增强(SDK 比 runtime-plugins 多做的部分):
19
+ * - 从 metadata(JSONB 列)中补充缺失字段(作为 fallback)
20
+ * - conversation_tips 类型自动注入 conversation_id
21
+ *
22
+ * 注意:不透传 metadata_json 字段。runtime-plugins 也不返回该字段。
23
+ * 如果透传,前端 isDuplicateMessage 会把所有 frontend_formatted=true 的消息
24
+ * 全部过滤掉,导致只剩用户消息。
25
+ *
26
+ * @see runtime-plugins/conversations/src/handlers/messages.ts getMessages()
27
+ */
28
+ export function transformMessage(dbMsg) {
29
+ // 获取消息 ID(兼容 message_id 和 id 字段)
30
+ const dbId = dbMsg.message_id || dbMsg.id || '';
31
+ // ================================================================
32
+ // 1. 尝试将 content 解析为 JSON(对齐 runtime-plugins 行为)
33
+ // ================================================================
34
+ let parsedContent = null;
35
+ try {
36
+ if (typeof dbMsg.content === 'string' && dbMsg.content.trim().startsWith('{')) {
37
+ const json = JSON.parse(dbMsg.content);
38
+ // 仅在结果是普通对象时使用(与 runtime-plugins 一致:排除数组和原始类型)
39
+ if (json && typeof json === 'object' && !Array.isArray(json)) {
40
+ parsedContent = json;
41
+ }
42
+ }
43
+ }
44
+ catch {
45
+ // 解析失败,走 fallback 路径
46
+ }
47
+ // ================================================================
48
+ // 2. 构建消息对象
49
+ // ================================================================
50
+ let result;
51
+ if (parsedContent) {
52
+ // ── JSON content 路径(全量透传) ──
53
+ // 先展开整个 parsedContent,保留所有字段(含未来新增的未知字段)
54
+ // 再用确定性字段覆盖,确保 id / timestamp 取值正确
55
+ result = {
56
+ ...parsedContent,
57
+ // id: parsedContent 中的 id 优先,否则用 DB 的 message_id/id
58
+ id: parsedContent.id ?? dbId,
59
+ // role: parsedContent 中的 role 优先,否则用 DB 的 role
60
+ role: parsedContent.role ?? dbMsg.role,
61
+ // content: parsedContent 中的 content 优先,否则保持原始 DB content
62
+ // 注意:parsedContent.content 可能为空字符串(合法值),所以用 ?? 而非 ||
63
+ content: parsedContent.content ?? dbMsg.content,
64
+ // timestamp: 始终用 DB 的 created_at(秒级),保持一致
65
+ timestamp: toSeconds(dbMsg.created_at),
66
+ };
67
+ }
68
+ else {
69
+ // ── Fallback 路径(纯文本 content) ──
70
+ // 与 runtime-plugins 的 catch/fallback 分支完全一致
71
+ result = {
72
+ id: dbId,
73
+ role: dbMsg.role,
74
+ content: dbMsg.content,
75
+ timestamp: toSeconds(dbMsg.created_at),
76
+ };
77
+ }
78
+ // ================================================================
79
+ // 3. 从 metadata(JSONB 列)中补充缺失字段
80
+ // runtime-plugins 不做这一步,但 SDK 做 fallback 以覆盖更多场景
81
+ // ================================================================
82
+ const meta = dbMsg.metadata;
83
+ if (meta && typeof meta === 'object') {
84
+ // 遍历 metadata 的所有字段,仅补充 result 中不存在的
85
+ for (const key of Object.keys(meta)) {
86
+ if (result[key] === undefined || result[key] === null) {
87
+ result[key] = meta[key];
88
+ }
89
+ }
90
+ }
91
+ // ================================================================
92
+ // 4. 特殊类型处理
93
+ // ================================================================
94
+ // conversation_tips 类型:注入 conversation_id,移除 content
95
+ if (result.type === 'conversation_tips') {
96
+ result.conversation_id = dbMsg.conversation_id;
97
+ if (result.tips && Array.isArray(result.tips)) {
98
+ delete result.content;
99
+ }
100
+ }
101
+ // toolCalls / tool_calls 兼容:确保 toolCalls 字段存在
102
+ if (!result.toolCalls && result.tool_calls) {
103
+ result.toolCalls = result.tool_calls;
104
+ }
105
+ // ================================================================
106
+ // 5. 不透传 metadata_json(与 runtime-plugins 行为一致)
107
+ // 前端 isDuplicateMessage 会根据 metadata_json 中的 frontend_formatted
108
+ // 标记过滤消息。DB 中所有被前端保存的消息都有此标记,如果透传会导致
109
+ // 所有 assistant 消息被过滤,只剩 user 消息。
110
+ // ================================================================
111
+ return result;
112
+ }
113
+ /**
114
+ * 转换前端消息对象为数据库格式
115
+ *
116
+ * 接受任意包含消息字段的对象,从中提取数据库需要的字段
117
+ */
118
+ export function toDbMessage(msg) {
119
+ const result = {};
120
+ if (msg.id)
121
+ result.id = msg.id;
122
+ if (msg.conversationId)
123
+ result.conversation_id = msg.conversationId;
124
+ if (msg.role)
125
+ result.role = msg.role;
126
+ if (msg.content)
127
+ result.content = msg.content;
128
+ if (msg.metadata)
129
+ result.metadata = msg.metadata;
130
+ return result;
131
+ }
132
+ //# sourceMappingURL=message.transform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message.transform.js","sourceRoot":"","sources":["../../src/transforms/message.transform.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import type { HttpRequestConfig, HttpResponse } from '../types/http.types.js';
2
+ import type { HttpClientConfig } from './config.types.js';
3
+ /**
4
+ * HTTP client for making requests
5
+ */
6
+ export declare class HttpClient {
7
+ private readonly config;
8
+ constructor(config: HttpClientConfig);
9
+ /**
10
+ * Make an HTTP request
11
+ */
12
+ request<T = unknown>(path: string, options?: HttpRequestConfig): Promise<HttpResponse<T>>;
13
+ /**
14
+ * Handle error responses
15
+ */
16
+ private handleErrorResponse;
17
+ /**
18
+ * GET request
19
+ */
20
+ get<T = unknown>(path: string, options?: Omit<HttpRequestConfig, 'method' | 'body'>): Promise<HttpResponse<T>>;
21
+ /**
22
+ * POST request
23
+ */
24
+ post<T = unknown>(path: string, body?: unknown, options?: Omit<HttpRequestConfig, 'method' | 'body'>): Promise<HttpResponse<T>>;
25
+ /**
26
+ * PATCH request
27
+ */
28
+ patch<T = unknown>(path: string, body?: unknown, options?: Omit<HttpRequestConfig, 'method' | 'body'>): Promise<HttpResponse<T>>;
29
+ /**
30
+ * DELETE request
31
+ */
32
+ delete<T = unknown>(path: string, options?: Omit<HttpRequestConfig, 'method' | 'body'>): Promise<HttpResponse<T>>;
33
+ }
34
+ //# sourceMappingURL=HttpClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HttpClient.d.ts","sourceRoot":"","sources":["../../src/transport/HttpClient.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,iBAAiB,EACjB,YAAY,EACb,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAG1D;;GAEG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA6B;gBAExC,MAAM,EAAE,gBAAgB;IAkBpC;;OAEG;IACG,OAAO,CAAC,CAAC,GAAG,OAAO,EACvB,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAyG3B;;OAEG;YACW,mBAAmB;IA8BjC;;OAEG;IACG,GAAG,CAAC,CAAC,GAAG,OAAO,EACnB,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,IAAI,CAAC,iBAAiB,EAAE,QAAQ,GAAG,MAAM,CAAC,GACnD,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAI3B;;OAEG;IACG,IAAI,CAAC,CAAC,GAAG,OAAO,EACpB,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,OAAO,EACd,OAAO,CAAC,EAAE,IAAI,CAAC,iBAAiB,EAAE,QAAQ,GAAG,MAAM,CAAC,GACnD,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAI3B;;OAEG;IACG,KAAK,CAAC,CAAC,GAAG,OAAO,EACrB,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,OAAO,EACd,OAAO,CAAC,EAAE,IAAI,CAAC,iBAAiB,EAAE,QAAQ,GAAG,MAAM,CAAC,GACnD,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAI3B;;OAEG;IACG,MAAM,CAAC,CAAC,GAAG,OAAO,EACtB,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,IAAI,CAAC,iBAAiB,EAAE,QAAQ,GAAG,MAAM,CAAC,GACnD,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;CAG5B"}
@@ -0,0 +1,158 @@
1
+ import { BaseError, NetworkError, AuthError, ProtocolError, } from '../errors/index.js';
2
+ import { withTimeout } from './timeout.js';
3
+ /**
4
+ * HTTP client for making requests
5
+ */
6
+ export class HttpClient {
7
+ constructor(config) {
8
+ // 注意:在某些浏览器/运行时环境中,直接保存 `window.fetch` 的函数引用再调用
9
+ // 可能触发 "Illegal invocation"(this 绑定丢失)。这里对默认 fetch 做显式绑定,
10
+ // 避免在测试页/嵌入式 WebView 等场景报错。
11
+ const defaultFetch = globalThis.fetch ? globalThis.fetch.bind(globalThis) : undefined;
12
+ this.config = {
13
+ baseUrl: config.baseUrl.replace(/\/$/, ''), // Remove trailing slash
14
+ fetch: config.fetch || defaultFetch,
15
+ getAuthToken: config.getAuthToken || (() => null),
16
+ timeoutMs: config.timeoutMs || 30000,
17
+ defaultHeaders: config.defaultHeaders || {},
18
+ onRequest: config.onRequest || (() => { }),
19
+ onResponse: config.onResponse || (() => { }),
20
+ onError: config.onError || (() => { }),
21
+ };
22
+ }
23
+ /**
24
+ * Make an HTTP request
25
+ */
26
+ async request(path, options = {}) {
27
+ const url = `${this.config.baseUrl}${path}`;
28
+ const method = options.method || 'GET';
29
+ try {
30
+ // Build headers
31
+ const headers = {
32
+ ...this.config.defaultHeaders,
33
+ ...options.headers,
34
+ };
35
+ // Add auth token if available
36
+ const token = await this.config.getAuthToken();
37
+ if (token) {
38
+ headers['Authorization'] = `Bearer ${token}`;
39
+ }
40
+ // Add content-type for JSON body
41
+ if (options.body && !headers['Content-Type']) {
42
+ headers['Content-Type'] = 'application/json';
43
+ }
44
+ // Call onRequest hook
45
+ await this.config.onRequest({ url, method, headers, body: options.body });
46
+ // Prepare fetch options
47
+ const fetchOptions = {
48
+ method,
49
+ headers,
50
+ signal: options.signal,
51
+ };
52
+ if (options.body) {
53
+ fetchOptions.body = typeof options.body === 'string'
54
+ ? options.body
55
+ : JSON.stringify(options.body);
56
+ }
57
+ // Make request with timeout
58
+ const response = await withTimeout(this.config.fetch(url, fetchOptions), this.config.timeoutMs);
59
+ // Parse response body
60
+ let data;
61
+ const contentType = response.headers.get('content-type');
62
+ if (contentType?.includes('application/json')) {
63
+ // `response.json()` is typed as `any/unknown` depending on TS lib; we
64
+ // intentionally trust the caller's generic `T` here.
65
+ data = (await response.json());
66
+ }
67
+ else if (contentType?.includes('text/')) {
68
+ data = await response.text();
69
+ }
70
+ else {
71
+ data = await response.blob();
72
+ }
73
+ // Handle error responses
74
+ if (!response.ok) {
75
+ // PostgREST 在分页超出范围时可能返回 416(Range Not Satisfiable)。
76
+ // 这类响应对上层“分页查询”来说应被视为“空结果页”,由调用方结合 Content-Range 自行计算 pagination。
77
+ // 因此这里对 416 做透传,不抛异常。
78
+ if (response.status !== 416) {
79
+ await this.handleErrorResponse(response, data);
80
+ }
81
+ }
82
+ const result = {
83
+ data,
84
+ status: response.status,
85
+ statusText: response.statusText,
86
+ headers: response.headers,
87
+ };
88
+ // Call onResponse hook
89
+ await this.config.onResponse({
90
+ url,
91
+ status: response.status,
92
+ statusText: response.statusText,
93
+ headers: response.headers,
94
+ data,
95
+ });
96
+ return result;
97
+ }
98
+ catch (error) {
99
+ // Call onError hook
100
+ if (error instanceof BaseError) {
101
+ await this.config.onError({
102
+ url,
103
+ message: error.message,
104
+ statusCode: error.statusCode,
105
+ details: error.details,
106
+ });
107
+ }
108
+ else if (error instanceof Error) {
109
+ await this.config.onError({
110
+ url,
111
+ message: error.message,
112
+ });
113
+ }
114
+ throw error;
115
+ }
116
+ }
117
+ /**
118
+ * Handle error responses
119
+ */
120
+ async handleErrorResponse(response, data) {
121
+ const status = response.status;
122
+ // Auth errors
123
+ if (status === 401 || status === 403) {
124
+ throw new AuthError(`Authentication failed: ${response.statusText}`, status, data);
125
+ }
126
+ // Network errors
127
+ if (status >= 500) {
128
+ throw new NetworkError(`Server error: ${response.statusText}`, data);
129
+ }
130
+ // Protocol errors
131
+ throw new ProtocolError(`HTTP ${status}: ${response.statusText}`, data);
132
+ }
133
+ /**
134
+ * GET request
135
+ */
136
+ async get(path, options) {
137
+ return this.request(path, { ...options, method: 'GET' });
138
+ }
139
+ /**
140
+ * POST request
141
+ */
142
+ async post(path, body, options) {
143
+ return this.request(path, { ...options, method: 'POST', body });
144
+ }
145
+ /**
146
+ * PATCH request
147
+ */
148
+ async patch(path, body, options) {
149
+ return this.request(path, { ...options, method: 'PATCH', body });
150
+ }
151
+ /**
152
+ * DELETE request
153
+ */
154
+ async delete(path, options) {
155
+ return this.request(path, { ...options, method: 'DELETE' });
156
+ }
157
+ }
158
+ //# sourceMappingURL=HttpClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HttpClient.js","sourceRoot":"","sources":["../../src/transport/HttpClient.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import type { TokenProvider } from '../types/token.types.js';
2
+ import type { OnRequestHook, OnResponseHook, OnErrorHook } from '../types/http.types.js';
3
+ /**
4
+ * HTTP client configuration
5
+ */
6
+ export interface HttpClientConfig {
7
+ /**
8
+ * Base URL for all requests
9
+ */
10
+ baseUrl: string;
11
+ /**
12
+ * Custom fetch implementation (defaults to global fetch)
13
+ */
14
+ fetch?: typeof fetch;
15
+ /**
16
+ * Token provider function
17
+ */
18
+ getAuthToken?: TokenProvider;
19
+ /**
20
+ * Request timeout in milliseconds (default: 30000)
21
+ */
22
+ timeoutMs?: number;
23
+ /**
24
+ * Default headers to include in all requests
25
+ */
26
+ defaultHeaders?: Record<string, string>;
27
+ /**
28
+ * Hook called before request is sent
29
+ */
30
+ onRequest?: OnRequestHook;
31
+ /**
32
+ * Hook called after successful response
33
+ */
34
+ onResponse?: OnResponseHook;
35
+ /**
36
+ * Hook called on error
37
+ */
38
+ onError?: OnErrorHook;
39
+ }
40
+ //# sourceMappingURL=config.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.types.d.ts","sourceRoot":"","sources":["../../src/transport/config.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,KAAK,EACV,aAAa,EACb,cAAc,EACd,WAAW,EACZ,MAAM,wBAAwB,CAAC;AAEhC;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IAErB;;OAEG;IACH,YAAY,CAAC,EAAE,aAAa,CAAC;IAE7B;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAExC;;OAEG;IACH,SAAS,CAAC,EAAE,aAAa,CAAC;IAE1B;;OAEG;IACH,UAAU,CAAC,EAAE,cAAc,CAAC;IAE5B;;OAEG;IACH,OAAO,CAAC,EAAE,WAAW,CAAC;CACvB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=config.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.types.js","sourceRoot":"","sources":["../../src/transport/config.types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,10 @@
1
+ import { HttpClient } from './HttpClient.js';
2
+ import type { HttpClientConfig } from './config.types.js';
3
+ /**
4
+ * Create an HTTP client with the given configuration
5
+ */
6
+ export declare function createHttpClient(config: HttpClientConfig): HttpClient;
7
+ export { HttpClient } from './HttpClient.js';
8
+ export type { HttpClientConfig } from './config.types.js';
9
+ export { withTimeout, createTimeoutPromise } from './timeout.js';
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/transport/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAE1D;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,GAAG,UAAU,CAErE;AAGD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,YAAY,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { HttpClient } from './HttpClient.js';
2
+ /**
3
+ * Create an HTTP client with the given configuration
4
+ */
5
+ export function createHttpClient(config) {
6
+ return new HttpClient(config);
7
+ }
8
+ // Re-exports
9
+ export { HttpClient } from './HttpClient.js';
10
+ export { withTimeout, createTimeoutPromise } from './timeout.js';
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/transport/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAG7C;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAwB;IACvD,OAAO,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;AAChC,CAAC;AAED,aAAa;AACb,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Create a timeout promise that rejects after specified milliseconds
3
+ */
4
+ export declare function createTimeoutPromise(timeoutMs: number): {
5
+ promise: Promise<never>;
6
+ cancel: () => void;
7
+ };
8
+ /**
9
+ * Race a promise against a timeout
10
+ */
11
+ export declare function withTimeout<T>(promise: Promise<T>, timeoutMs: number): Promise<T>;
12
+ //# sourceMappingURL=timeout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timeout.d.ts","sourceRoot":"","sources":["../../src/transport/timeout.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG;IACvD,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IACxB,MAAM,EAAE,MAAM,IAAI,CAAC;CACpB,CAcA;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,CAAC,EACjC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EACnB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,CAAC,CAAC,CAQZ"}
@@ -0,0 +1,29 @@
1
+ import { TimeoutError } from '../errors/TimeoutError.js';
2
+ /**
3
+ * Create a timeout promise that rejects after specified milliseconds
4
+ */
5
+ export function createTimeoutPromise(timeoutMs) {
6
+ let timeoutId;
7
+ const promise = new Promise((_, reject) => {
8
+ timeoutId = setTimeout(() => {
9
+ reject(new TimeoutError(`Request timeout after ${timeoutMs}ms`, timeoutMs));
10
+ }, timeoutMs);
11
+ });
12
+ const cancel = () => {
13
+ clearTimeout(timeoutId);
14
+ };
15
+ return { promise, cancel };
16
+ }
17
+ /**
18
+ * Race a promise against a timeout
19
+ */
20
+ export async function withTimeout(promise, timeoutMs) {
21
+ const { promise: timeoutPromise, cancel } = createTimeoutPromise(timeoutMs);
22
+ try {
23
+ return await Promise.race([promise, timeoutPromise]);
24
+ }
25
+ finally {
26
+ cancel();
27
+ }
28
+ }
29
+ //# sourceMappingURL=timeout.js.map