@zhin.js/adapter-weixin-ilink 3.0.1 → 3.0.3

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 (164) hide show
  1. package/CHANGELOG.md +46 -0
  2. package/README.md +16 -39
  3. package/adapters/weixin-ilink.ts +30 -0
  4. package/lib/aes-ecb.d.ts +0 -1
  5. package/lib/aes-ecb.js +0 -1
  6. package/lib/cdn-upload.d.ts +0 -1
  7. package/lib/cdn-upload.js +0 -1
  8. package/lib/cdn-url.d.ts +0 -1
  9. package/lib/cdn-url.js +0 -1
  10. package/lib/context-store.d.ts +0 -1
  11. package/lib/context-store.js +0 -1
  12. package/lib/credentials.d.ts +0 -1
  13. package/lib/credentials.js +0 -1
  14. package/lib/endpoint.d.ts +35 -30
  15. package/lib/endpoint.js +218 -236
  16. package/lib/ilink-api.d.ts +0 -1
  17. package/lib/ilink-api.js +0 -1
  18. package/lib/ilink-config-cache.d.ts +0 -1
  19. package/lib/ilink-config-cache.js +0 -1
  20. package/lib/ilink-logger.d.ts +0 -1
  21. package/lib/ilink-logger.js +0 -1
  22. package/lib/ilink-meta.d.ts +0 -1
  23. package/lib/ilink-meta.js +0 -1
  24. package/lib/ilink-random.d.ts +0 -1
  25. package/lib/ilink-random.js +0 -1
  26. package/lib/ilink-redact.d.ts +0 -1
  27. package/lib/ilink-redact.js +0 -1
  28. package/lib/ilink-session-guard.d.ts +0 -1
  29. package/lib/ilink-session-guard.js +0 -1
  30. package/lib/ilink-types.d.ts +0 -1
  31. package/lib/ilink-types.js +0 -1
  32. package/lib/index.d.ts +4 -19
  33. package/lib/index.js +2 -37
  34. package/lib/login.d.ts +4 -6
  35. package/lib/login.js +43 -65
  36. package/lib/media-download.d.ts +1 -2
  37. package/lib/media-download.js +1 -2
  38. package/lib/mime.d.ts +0 -1
  39. package/lib/mime.js +0 -1
  40. package/lib/outbound-media.d.ts +4 -4
  41. package/lib/outbound-media.js +44 -42
  42. package/lib/pic-decrypt.d.ts +0 -1
  43. package/lib/pic-decrypt.js +0 -1
  44. package/lib/protocol.d.ts +52 -0
  45. package/lib/protocol.js +109 -0
  46. package/lib/silk-transcode.d.ts +0 -1
  47. package/lib/silk-transcode.js +0 -1
  48. package/lib/types.d.ts +2 -16
  49. package/lib/types.js +0 -1
  50. package/lib/upload.d.ts +1 -2
  51. package/lib/upload.js +1 -2
  52. package/lib/weixin-inbound.d.ts +1 -2
  53. package/lib/weixin-inbound.js +1 -2
  54. package/lib/weixin-send-media.d.ts +0 -1
  55. package/lib/weixin-send-media.js +0 -1
  56. package/lib/weixin-send.d.ts +1 -2
  57. package/lib/weixin-send.js +2 -3
  58. package/package.json +37 -41
  59. package/plugin.ts +8 -0
  60. package/schema.json +30 -0
  61. package/src/endpoint.ts +261 -279
  62. package/src/index.ts +24 -53
  63. package/src/login.ts +56 -72
  64. package/src/media-download.ts +1 -2
  65. package/src/outbound-media.ts +56 -50
  66. package/src/protocol.ts +172 -0
  67. package/src/types.ts +6 -15
  68. package/src/upload.ts +2 -2
  69. package/src/weixin-inbound.ts +2 -2
  70. package/src/weixin-send.ts +4 -4
  71. package/client/LoginAssistPanel.tsx +0 -200
  72. package/client/WeixinIlinkManagement.tsx +0 -139
  73. package/client/index.tsx +0 -11
  74. package/client/tsconfig.json +0 -13
  75. package/client/utils/api.ts +0 -30
  76. package/dist/index.js +0 -29
  77. package/lib/adapter.d.ts +0 -15
  78. package/lib/adapter.d.ts.map +0 -1
  79. package/lib/adapter.js +0 -21
  80. package/lib/adapter.js.map +0 -1
  81. package/lib/aes-ecb.d.ts.map +0 -1
  82. package/lib/aes-ecb.js.map +0 -1
  83. package/lib/cdn-upload.d.ts.map +0 -1
  84. package/lib/cdn-upload.js.map +0 -1
  85. package/lib/cdn-upload.test.d.ts +0 -2
  86. package/lib/cdn-upload.test.d.ts.map +0 -1
  87. package/lib/cdn-upload.test.js +0 -150
  88. package/lib/cdn-upload.test.js.map +0 -1
  89. package/lib/cdn-url.d.ts.map +0 -1
  90. package/lib/cdn-url.js.map +0 -1
  91. package/lib/context-store.d.ts.map +0 -1
  92. package/lib/context-store.js.map +0 -1
  93. package/lib/credentials.d.ts.map +0 -1
  94. package/lib/credentials.js.map +0 -1
  95. package/lib/endpoint.d.ts.map +0 -1
  96. package/lib/endpoint.js.map +0 -1
  97. package/lib/ilink-api.d.ts.map +0 -1
  98. package/lib/ilink-api.js.map +0 -1
  99. package/lib/ilink-config-cache.d.ts.map +0 -1
  100. package/lib/ilink-config-cache.js.map +0 -1
  101. package/lib/ilink-logger.d.ts.map +0 -1
  102. package/lib/ilink-logger.js.map +0 -1
  103. package/lib/ilink-meta.d.ts.map +0 -1
  104. package/lib/ilink-meta.js.map +0 -1
  105. package/lib/ilink-random.d.ts.map +0 -1
  106. package/lib/ilink-random.js.map +0 -1
  107. package/lib/ilink-redact.d.ts.map +0 -1
  108. package/lib/ilink-redact.js.map +0 -1
  109. package/lib/ilink-session-guard.d.ts.map +0 -1
  110. package/lib/ilink-session-guard.js.map +0 -1
  111. package/lib/ilink-types.d.ts.map +0 -1
  112. package/lib/ilink-types.js.map +0 -1
  113. package/lib/index.d.ts.map +0 -1
  114. package/lib/index.js.map +0 -1
  115. package/lib/login-assist-routes.d.ts +0 -7
  116. package/lib/login-assist-routes.d.ts.map +0 -1
  117. package/lib/login-assist-routes.js +0 -29
  118. package/lib/login-assist-routes.js.map +0 -1
  119. package/lib/login.d.ts.map +0 -1
  120. package/lib/login.js.map +0 -1
  121. package/lib/media-download.d.ts.map +0 -1
  122. package/lib/media-download.js.map +0 -1
  123. package/lib/mime.d.ts.map +0 -1
  124. package/lib/mime.js.map +0 -1
  125. package/lib/mime.test.d.ts +0 -2
  126. package/lib/mime.test.d.ts.map +0 -1
  127. package/lib/mime.test.js +0 -62
  128. package/lib/mime.test.js.map +0 -1
  129. package/lib/outbound-media.d.ts.map +0 -1
  130. package/lib/outbound-media.js.map +0 -1
  131. package/lib/pic-decrypt.d.ts.map +0 -1
  132. package/lib/pic-decrypt.js.map +0 -1
  133. package/lib/routes.d.ts +0 -8
  134. package/lib/routes.d.ts.map +0 -1
  135. package/lib/routes.js +0 -29
  136. package/lib/routes.js.map +0 -1
  137. package/lib/segment-mapper.d.ts +0 -2
  138. package/lib/segment-mapper.d.ts.map +0 -1
  139. package/lib/segment-mapper.js +0 -2
  140. package/lib/segment-mapper.js.map +0 -1
  141. package/lib/silk-transcode.d.ts.map +0 -1
  142. package/lib/silk-transcode.js.map +0 -1
  143. package/lib/silk-transcode.test.d.ts +0 -2
  144. package/lib/silk-transcode.test.d.ts.map +0 -1
  145. package/lib/silk-transcode.test.js +0 -53
  146. package/lib/silk-transcode.test.js.map +0 -1
  147. package/lib/types.d.ts.map +0 -1
  148. package/lib/types.js.map +0 -1
  149. package/lib/upload.d.ts.map +0 -1
  150. package/lib/upload.js.map +0 -1
  151. package/lib/upload.test.d.ts +0 -2
  152. package/lib/upload.test.d.ts.map +0 -1
  153. package/lib/upload.test.js +0 -250
  154. package/lib/upload.test.js.map +0 -1
  155. package/lib/weixin-inbound.d.ts.map +0 -1
  156. package/lib/weixin-inbound.js.map +0 -1
  157. package/lib/weixin-send-media.d.ts.map +0 -1
  158. package/lib/weixin-send-media.js.map +0 -1
  159. package/lib/weixin-send.d.ts.map +0 -1
  160. package/lib/weixin-send.js.map +0 -1
  161. package/src/adapter.ts +0 -25
  162. package/src/login-assist-routes.ts +0 -36
  163. package/src/routes.ts +0 -39
  164. package/src/segment-mapper.ts +0 -1
package/src/upload.ts CHANGED
@@ -2,8 +2,8 @@ import crypto from "node:crypto";
2
2
  import fs from "node:fs/promises";
3
3
  import path from "node:path";
4
4
 
5
- import { getUploadUrl } from "./ilink-api.js";
6
- import type { WeixinApiOptions } from "./ilink-api.js";
5
+ import { getUploadUrl, type WeixinApiOptions } from './ilink-api.js';
6
+
7
7
  import { aesEcbPaddedSize } from "./aes-ecb.js";
8
8
  import { uploadBufferToCdn } from "./cdn-upload.js";
9
9
  import { logger } from "./ilink-logger.js";
@@ -3,8 +3,8 @@ import path from "node:path";
3
3
 
4
4
  import { logger } from "./ilink-logger.js";
5
5
  import { generateId } from "./ilink-random.js";
6
- import type { WeixinMessage, MessageItem } from "./ilink-types.js";
7
- import { MessageItemType } from "./ilink-types.js";
6
+ import { MessageItemType, type WeixinMessage, type MessageItem } from './ilink-types.js';
7
+
8
8
  import { resolveStateDir } from "./credentials.js";
9
9
 
10
10
  // ---------------------------------------------------------------------------
@@ -1,9 +1,9 @@
1
- import { sendMessage as sendMessageApi } from "./ilink-api.js";
2
- import type { WeixinApiOptions } from "./ilink-api.js";
1
+ import { sendMessage as sendMessageApi, type WeixinApiOptions } from './ilink-api.js';
2
+
3
3
  import { logger } from "./ilink-logger.js";
4
4
  import { generateId } from "./ilink-random.js";
5
- import type { MessageItem, SendMessageReq } from "./ilink-types.js";
6
- import { MessageItemType, MessageState, MessageType } from "./ilink-types.js";
5
+ import { MessageItemType, MessageState, MessageType, type MessageItem, type SendMessageReq } from './ilink-types.js';
6
+
7
7
  import type { UploadedFileInfo } from "./upload.js";
8
8
 
9
9
  function generateClientId(): string {
@@ -1,200 +0,0 @@
1
- import { useCallback, useEffect, useRef, useState } from "react";
2
- import {
3
- LogIn,
4
- QrCode,
5
- AlertCircle,
6
- Loader2,
7
- X,
8
- } from "lucide-react";
9
- import { apiFetch } from "./utils/api";
10
-
11
- interface PendingLoginTask {
12
- id: string;
13
- adapter: string;
14
- endpointId: string;
15
- type: string;
16
- payload?: {
17
- message?: string;
18
- image?: string;
19
- url?: string;
20
- qrcode?: string;
21
- [key: string]: unknown;
22
- };
23
- createdAt: number;
24
- }
25
-
26
- const POLL_BASE_MS = 2_000;
27
- const POLL_MAX_MS = 15_000;
28
- const ADAPTER_FILTER = "weixin-ilink";
29
-
30
- export default function LoginAssistPanel() {
31
- const [pending, setPending] = useState<PendingLoginTask[]>([]);
32
- const [loading, setLoading] = useState(true);
33
- const [error, setError] = useState<string | null>(null);
34
- const [submitting, setSubmitting] = useState<Record<string, boolean>>({});
35
-
36
- const consecutiveEmptyRef = useRef(0);
37
- const timerRef = useRef<ReturnType<typeof setTimeout>>();
38
-
39
- const fetchPending = useCallback(async () => {
40
- try {
41
- const res = await apiFetch("/api/login-assist/pending");
42
- if (!res.ok) throw new Error("获取待办失败");
43
- const data = (await res.json()) as unknown;
44
- const list = Array.isArray(data) ? (data as PendingLoginTask[]) : [];
45
- const filtered = list.filter((t) => t.adapter === ADAPTER_FILTER);
46
- setPending(filtered);
47
- setError(null);
48
- consecutiveEmptyRef.current = filtered.length > 0 ? 0 : consecutiveEmptyRef.current + 1;
49
- } catch (err) {
50
- setError((err as Error).message);
51
- consecutiveEmptyRef.current++;
52
- } finally {
53
- setLoading(false);
54
- }
55
- }, []);
56
-
57
- const scheduleNext = useCallback(() => {
58
- const delay = Math.min(
59
- POLL_BASE_MS * Math.pow(1.5, consecutiveEmptyRef.current),
60
- POLL_MAX_MS,
61
- );
62
- timerRef.current = setTimeout(async () => {
63
- await fetchPending();
64
- scheduleNext();
65
- }, delay);
66
- }, [fetchPending]);
67
-
68
- useEffect(() => {
69
- void fetchPending().then(scheduleNext);
70
- return () => clearTimeout(timerRef.current);
71
- }, [fetchPending, scheduleNext]);
72
-
73
- const handleSubmit = async (id: string, value: string | Record<string, unknown>) => {
74
- setSubmitting((s) => ({ ...s, [id]: true }));
75
- try {
76
- const res = await apiFetch("/api/login-assist/submit", {
77
- method: "POST",
78
- headers: { "Content-Type": "application/json" },
79
- body: JSON.stringify({ id, value }),
80
- });
81
- if (!res.ok) throw new Error("提交失败");
82
- consecutiveEmptyRef.current = 0;
83
- await fetchPending();
84
- } catch (err) {
85
- setError((err as Error).message);
86
- } finally {
87
- setSubmitting((s) => ({ ...s, [id]: false }));
88
- }
89
- };
90
-
91
- const handleCancel = async (id: string) => {
92
- try {
93
- const res = await apiFetch("/api/login-assist/cancel", {
94
- method: "POST",
95
- headers: { "Content-Type": "application/json" },
96
- body: JSON.stringify({ id }),
97
- });
98
- if (res.ok) await fetchPending();
99
- } catch {
100
- /* ignore */
101
- }
102
- };
103
-
104
- if (loading && pending.length === 0) {
105
- return (
106
- <div className="flex justify-center py-12">
107
- <Loader2 className="w-6 h-6 animate-spin text-blue-500" />
108
- </div>
109
- );
110
- }
111
-
112
- return (
113
- <div className="space-y-4">
114
- <p className="text-sm text-muted-foreground">
115
- 首次启动无凭证时,请用微信扫描 ClawBot 二维码;刷新页面后仍可继续查看待办。
116
- </p>
117
-
118
- {error && (
119
- <div className="flex items-center gap-2 p-3 rounded border border-red-200 bg-red-50 text-red-600 text-sm dark:bg-red-900/20 dark:text-red-400 dark:border-red-800">
120
- <AlertCircle className="w-4 h-4 shrink-0" />
121
- <span>{error}</span>
122
- <button type="button" onClick={() => setError(null)} className="ml-auto">
123
- <X className="w-3.5 h-3.5" />
124
- </button>
125
- </div>
126
- )}
127
-
128
- {pending.length === 0 ? (
129
- <div className="border rounded-lg bg-card p-12 text-center">
130
- <LogIn className="w-16 h-16 mx-auto mb-4 opacity-25" />
131
- <h3 className="text-lg font-semibold mb-1">暂无待办</h3>
132
- <p className="text-sm text-muted-foreground">需要扫码登录时,二维码将显示在此处</p>
133
- </div>
134
- ) : (
135
- <div className="space-y-4">
136
- {pending.map((task) => (
137
- <div key={task.id} className="border rounded-lg bg-card p-4 shadow-sm">
138
- <div className="flex items-start justify-between flex-wrap gap-2 mb-2">
139
- <div className="flex items-center gap-2 font-semibold">
140
- <QrCode className="w-4 h-4" /> 扫码登录
141
- </div>
142
- <div className="flex gap-1 text-xs">
143
- <span className="px-2 py-0.5 rounded border">{task.adapter}</span>
144
- <span className="px-2 py-0.5 rounded bg-muted">{task.endpointId}</span>
145
- </div>
146
- </div>
147
-
148
- {task.payload?.message && (
149
- <p className="text-sm text-muted-foreground mb-3">{task.payload.message}</p>
150
- )}
151
-
152
- {task.type === "qrcode" && task.payload?.image && (
153
- <div className="flex justify-center p-4 bg-muted/30 rounded-lg mb-3">
154
- <img
155
- src={String(task.payload.image)}
156
- alt="登录二维码"
157
- className="max-w-[200px] w-full h-auto"
158
- />
159
- </div>
160
- )}
161
-
162
- {task.type === "qrcode" && !task.payload?.image && task.payload?.url && (
163
- <p className="text-sm break-all mb-3">
164
- <a
165
- href={String(task.payload.url)}
166
- target="_blank"
167
- rel="noopener noreferrer"
168
- className="text-primary hover:underline"
169
- >
170
- 打开二维码链接
171
- </a>
172
- </p>
173
- )}
174
-
175
- {task.type === "qrcode" && (
176
- <div className="flex gap-2 mt-3">
177
- <button
178
- type="button"
179
- className="h-9 px-4 rounded-md bg-primary text-primary-foreground text-sm disabled:opacity-50"
180
- disabled={!!submitting[task.id]}
181
- onClick={() => void handleSubmit(task.id, { done: true })}
182
- >
183
- {submitting[task.id] ? "提交中…" : "我已扫码"}
184
- </button>
185
- <button
186
- type="button"
187
- className="h-9 px-4 rounded-md border text-sm hover:bg-accent transition-colors"
188
- onClick={() => void handleCancel(task.id)}
189
- >
190
- 取消
191
- </button>
192
- </div>
193
- )}
194
- </div>
195
- ))}
196
- </div>
197
- )}
198
- </div>
199
- );
200
- }
@@ -1,139 +0,0 @@
1
- import { useCallback, useEffect, useState } from "react";
2
- import { Bot, LogIn, RefreshCw, Wifi, WifiOff, Loader2 } from "lucide-react";
3
- import LoginAssistPanel from "./LoginAssistPanel";
4
- import { apiFetch } from "./utils/api";
5
-
6
- interface EndpointRow {
7
- name: string;
8
- connected: boolean;
9
- status: string;
10
- hasCredentials?: boolean;
11
- }
12
-
13
- type Tab = "overview" | "login";
14
-
15
- export default function WeixinIlinkManagement() {
16
- const [tab, setTab] = useState<Tab>("overview");
17
- const [endpoints, setEndpoints] = useState<EndpointRow[]>([]);
18
- const [loading, setLoading] = useState(true);
19
- const [err, setErr] = useState<string | null>(null);
20
-
21
- const loadBots = useCallback(async () => {
22
- setLoading(true);
23
- setErr(null);
24
- try {
25
- const res = await apiFetch("/api/weixin-ilink/endpoints");
26
- const json = (await res.json()) as { success?: boolean; data?: EndpointRow[]; message?: string };
27
- if (!res.ok || !json.success) throw new Error(json.message || "加载失败");
28
- setEndpoints(Array.isArray(json.data) ? json.data : []);
29
- } catch (e) {
30
- setErr((e as Error).message);
31
- setEndpoints([]);
32
- } finally {
33
- setLoading(false);
34
- }
35
- }, []);
36
-
37
- useEffect(() => {
38
- if (tab === "overview") void loadBots();
39
- }, [tab, loadBots]);
40
-
41
- return (
42
- <div className="p-6 max-w-5xl mx-auto space-y-5">
43
- <div className="flex items-center justify-between">
44
- <div>
45
- <h1 className="text-2xl font-bold flex items-center gap-2">
46
- <Bot className="w-6 h-6" /> 微信 iLink(ClawBot)
47
- </h1>
48
- <p className="text-sm text-muted-foreground mt-1">
49
- 个人微信长轮询适配器:概览与扫码登录辅助
50
- </p>
51
- </div>
52
- {tab === "overview" && (
53
- <button
54
- type="button"
55
- onClick={() => void loadBots()}
56
- disabled={loading}
57
- className="flex items-center gap-1 px-3 py-1.5 rounded bg-blue-500 text-white hover:bg-blue-600 disabled:opacity-50 text-sm"
58
- >
59
- <RefreshCw className={`w-4 h-4 ${loading ? "animate-spin" : ""}`} /> 刷新
60
- </button>
61
- )}
62
- </div>
63
-
64
- <div className="flex gap-1 border-b">
65
- <button
66
- type="button"
67
- onClick={() => setTab("overview")}
68
- className={`px-4 py-2 text-sm font-medium border-b-2 transition-colors ${
69
- tab === "overview"
70
- ? "border-blue-500 text-blue-600"
71
- : "border-transparent text-gray-500 hover:text-gray-700"
72
- }`}
73
- >
74
- <span className="flex items-center gap-1.5">
75
- <Bot className="w-4 h-4" /> 概览
76
- </span>
77
- </button>
78
- <button
79
- type="button"
80
- onClick={() => setTab("login")}
81
- className={`px-4 py-2 text-sm font-medium border-b-2 transition-colors ${
82
- tab === "login"
83
- ? "border-blue-500 text-blue-600"
84
- : "border-transparent text-gray-500 hover:text-gray-700"
85
- }`}
86
- >
87
- <span className="flex items-center gap-1.5">
88
- <LogIn className="w-4 h-4" /> 登录辅助
89
- </span>
90
- </button>
91
- </div>
92
-
93
- {tab === "overview" && (
94
- <div className="space-y-4">
95
- {err && (
96
- <p className="text-sm text-red-600">{err}</p>
97
- )}
98
- {loading ? (
99
- <div className="flex justify-center py-12">
100
- <Loader2 className="w-6 h-6 animate-spin text-blue-500" />
101
- </div>
102
- ) : endpoints.length === 0 ? (
103
- <div className="border rounded-lg p-8 text-center text-muted-foreground">
104
- 暂无 weixin-ilink Endpoint 实例
105
- </div>
106
- ) : (
107
- <div className="grid gap-3">
108
- {endpoints.map((endpoint) => (
109
- <div key={endpoint.name} className="border rounded-lg p-4 flex items-center justify-between">
110
- <div>
111
- <div className="font-semibold">{endpoint.name}</div>
112
- <div className="text-xs text-muted-foreground mt-1">
113
- 凭证:{endpoint.hasCredentials ? "已保存" : "未登录"}
114
- </div>
115
- </div>
116
- <div className="flex items-center gap-2 text-sm">
117
- {endpoint.connected ? (
118
- <>
119
- <Wifi className="w-4 h-4 text-green-500" />
120
- <span className="text-green-600">在线</span>
121
- </>
122
- ) : (
123
- <>
124
- <WifiOff className="w-4 h-4 text-gray-400" />
125
- <span className="text-gray-500">离线</span>
126
- </>
127
- )}
128
- </div>
129
- </div>
130
- ))}
131
- </div>
132
- )}
133
- </div>
134
- )}
135
-
136
- {tab === "login" && <LoginAssistPanel />}
137
- </div>
138
- );
139
- }
package/client/index.tsx DELETED
@@ -1,11 +0,0 @@
1
- import type { PluginRegisterHostApi } from "@zhin.js/contract";
2
- import WeixinIlinkManagement from "./WeixinIlinkManagement";
3
-
4
- export function register(api: PluginRegisterHostApi) {
5
- api.addRoute({
6
- path: "/console/weixin-ilink",
7
- name: "微信 iLink",
8
- element: api.React.createElement(WeixinIlinkManagement, { hostReact: api.React }),
9
- });
10
- api.addTool({ id: "weixin-ilink", name: "微信 iLink", path: "/console/weixin-ilink" });
11
- }
@@ -1,13 +0,0 @@
1
- {
2
- "compilerOptions": {
3
- "target": "ES2022",
4
- "module": "ESNext",
5
- "moduleResolution": "bundler",
6
- "jsx": "react-jsx",
7
- "strict": true,
8
- "skipLibCheck": true,
9
- "esModuleInterop": true,
10
- "isolatedModules": true
11
- },
12
- "include": ["./**/*"]
13
- }
@@ -1,30 +0,0 @@
1
- const TOKEN_KEY = "zhin_api_token";
2
- const API_BASE_KEY = "zhin_api_base";
3
-
4
- export function getApiBase(): string {
5
- const stored = localStorage.getItem(API_BASE_KEY)?.trim();
6
- if (stored) return stored.replace(/\/$/, "");
7
- if (typeof window !== "undefined") return window.location.origin;
8
- return "";
9
- }
10
-
11
- export function getToken(): string | null {
12
- return localStorage.getItem(TOKEN_KEY);
13
- }
14
-
15
- export async function apiFetch(input: RequestInfo | URL, init?: RequestInit): Promise<Response> {
16
- const token = getToken();
17
- const headers = new Headers(init?.headers);
18
- if (token) headers.set("Authorization", `Bearer ${token}`);
19
-
20
- const base = getApiBase();
21
- const url =
22
- typeof input === "string" && input.startsWith("/") ? `${base}${input}` : input;
23
-
24
- const res = await fetch(url, { ...init, headers });
25
- if (res.status === 401) {
26
- localStorage.removeItem(TOKEN_KEY);
27
- window.dispatchEvent(new CustomEvent("zhin:auth-required"));
28
- }
29
- return res;
30
- }
package/dist/index.js DELETED
@@ -1,29 +0,0 @@
1
- import{useCallback as he,useEffect as ge,useState as b}from"react";import{forwardRef as ae,createElement as te}from"react";var y=(...e)=>e.filter((t,l,f)=>!!t&&t.trim()!==""&&f.indexOf(t)===l).join(" ").trim();var W=e=>e.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase();var E=e=>e.replace(/^([A-Z])|[\s-_]+(\w)/g,(t,l,f)=>f?f.toUpperCase():l.toLowerCase());var U=e=>{let t=E(e);return t.charAt(0).toUpperCase()+t.slice(1)};import{forwardRef as ee,createElement as z}from"react";var R={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};var V=e=>{for(let t in e)if(t.startsWith("aria-")||t==="role"||t==="title")return!0;return!1};import{createContext as j,useContext as Y,useMemo as Fe,createElement as ye}from"react";var $=j({});var N=()=>Y($);var X=ee(({color:e,size:t,strokeWidth:l,absoluteStrokeWidth:f,className:n="",children:r,iconNode:m,...x},p)=>{let{size:s=24,strokeWidth:i=2,absoluteStrokeWidth:P=!1,color:q="currentColor",className:v=""}=N()??{},a=f??P?Number(l??i)*24/Number(t??s):l??i;return z("svg",{ref:p,...R,width:t??s??R.width,height:t??s??R.height,stroke:e??q,strokeWidth:a,className:y("lucide",v,n),...!r&&!V(x)&&{"aria-hidden":"true"},...x},[...m.map(([g,I])=>z(g,I)),...Array.isArray(r)?r:[r]])});var d=(e,t)=>{let l=ae(({className:f,...n},r)=>te(X,{ref:r,iconNode:t,className:y(`lucide-${W(U(e))}`,`lucide-${e}`,f),...n}));return l.displayName=U(e),l};var oe=[["path",{d:"M12 8V4H8",key:"hb8ula"}],["rect",{width:"16",height:"12",x:"4",y:"8",rx:"2",key:"enze0r"}],["path",{d:"M2 14h2",key:"vft8re"}],["path",{d:"M20 14h2",key:"4cs60a"}],["path",{d:"M15 13v2",key:"1xurst"}],["path",{d:"M9 13v2",key:"rq6x2g"}]],k=d("bot",oe);var ue=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["line",{x1:"12",x2:"12",y1:"8",y2:"12",key:"1pkeuh"}],["line",{x1:"12",x2:"12.01",y1:"16",y2:"16",key:"4dfq90"}]],C=d("circle-alert",ue);var de=[["path",{d:"M21 12a9 9 0 1 1-6.219-8.56",key:"13zald"}]],L=d("loader-circle",de);var le=[["path",{d:"m10 17 5-5-5-5",key:"1bsop3"}],["path",{d:"M15 12H3",key:"6jk70r"}],["path",{d:"M15 3h4a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2h-4",key:"u53s6r"}]],S=d("log-in",le);var fe=[["rect",{width:"5",height:"5",x:"3",y:"3",rx:"1",key:"1tu5fj"}],["rect",{width:"5",height:"5",x:"16",y:"3",rx:"1",key:"1v8r4q"}],["rect",{width:"5",height:"5",x:"3",y:"16",rx:"1",key:"1x03jg"}],["path",{d:"M21 16h-3a2 2 0 0 0-2 2v3",key:"177gqh"}],["path",{d:"M21 21v.01",key:"ents32"}],["path",{d:"M12 7v3a2 2 0 0 1-2 2H7",key:"8crl2c"}],["path",{d:"M3 12h.01",key:"nlz23k"}],["path",{d:"M12 3h.01",key:"n36tog"}],["path",{d:"M12 16v.01",key:"133mhm"}],["path",{d:"M16 12h1",key:"1slzba"}],["path",{d:"M21 12v.01",key:"1lwtk9"}],["path",{d:"M12 21v-1",key:"1880an"}]],A=d("qr-code",fe);var re=[["path",{d:"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8",key:"v9h5vc"}],["path",{d:"M21 3v5h-5",key:"1q7to0"}],["path",{d:"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16",key:"3uifl3"}],["path",{d:"M8 16H3v5",key:"1cv678"}]],B=d("refresh-cw",re);var se=[["path",{d:"M12 20h.01",key:"zekei9"}],["path",{d:"M8.5 16.429a5 5 0 0 1 7 0",key:"1bycff"}],["path",{d:"M5 12.859a10 10 0 0 1 5.17-2.69",key:"1dl1wf"}],["path",{d:"M19 12.859a10 10 0 0 0-2.007-1.523",key:"4k23kn"}],["path",{d:"M2 8.82a15 15 0 0 1 4.177-2.643",key:"1grhjp"}],["path",{d:"M22 8.82a15 15 0 0 0-11.288-3.764",key:"z3jwby"}],["path",{d:"m2 2 20 20",key:"1ooewy"}]],M=d("wifi-off",se);var ie=[["path",{d:"M12 20h.01",key:"zekei9"}],["path",{d:"M2 8.82a15 15 0 0 1 20 0",key:"dnpr2z"}],["path",{d:"M5 12.859a10 10 0 0 1 14 0",key:"1x1e6c"}],["path",{d:"M8.5 16.429a5 5 0 0 1 7 0",key:"1bycff"}]],D=d("wifi",ie);var ce=[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]],F=d("x",ce);import{useCallback as Z,useEffect as Le,useRef as Q,useState as T}from"react";var K="zhin_api_token",ne="zhin_api_base";function pe(){let e=localStorage.getItem(ne)?.trim();return e?e.replace(/\/$/,""):typeof window<"u"?window.location.origin:""}function me(){return localStorage.getItem(K)}async function w(e,t){let l=me(),f=new Headers(t?.headers);l&&f.set("Authorization",`Bearer ${l}`);let n=pe(),r=typeof e=="string"&&e.startsWith("/")?`${n}${e}`:e,m=await fetch(r,{...t,headers:f});return m.status===401&&(localStorage.removeItem(K),window.dispatchEvent(new CustomEvent("zhin:auth-required"))),m}import{jsx as o,jsxs as h}from"react/jsx-runtime";var Ie=2e3,xe=15e3,Ce="weixin-ilink";function O(){let[e,t]=T([]),[l,f]=T(!0),[n,r]=T(null),[m,x]=T({}),p=Q(0),s=Q(),i=Z(async()=>{try{let a=await w("/api/login-assist/pending");if(!a.ok)throw new Error("\u83B7\u53D6\u5F85\u529E\u5931\u8D25");let g=await a.json(),G=(Array.isArray(g)?g:[]).filter(_=>_.adapter===Ce);t(G),r(null),p.current=G.length>0?0:p.current+1}catch(a){r(a.message),p.current++}finally{f(!1)}},[]),P=Z(()=>{let a=Math.min(Ie*Math.pow(1.5,p.current),xe);s.current=setTimeout(async()=>{await i(),P()},a)},[i]);Le(()=>(i().then(P),()=>clearTimeout(s.current)),[i,P]);let q=async(a,g)=>{x(I=>({...I,[a]:!0}));try{if(!(await w("/api/login-assist/submit",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({id:a,value:g})})).ok)throw new Error("\u63D0\u4EA4\u5931\u8D25");p.current=0,await i()}catch(I){r(I.message)}finally{x(I=>({...I,[a]:!1}))}},v=async a=>{try{(await w("/api/login-assist/cancel",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({id:a})})).ok&&await i()}catch{}};return l&&e.length===0?o("div",{className:"flex justify-center py-12",children:o(L,{className:"w-6 h-6 animate-spin text-blue-500"})}):h("div",{className:"space-y-4",children:[o("p",{className:"text-sm text-muted-foreground",children:"\u9996\u6B21\u542F\u52A8\u65E0\u51ED\u8BC1\u65F6\uFF0C\u8BF7\u7528\u5FAE\u4FE1\u626B\u63CF ClawBot \u4E8C\u7EF4\u7801\uFF1B\u5237\u65B0\u9875\u9762\u540E\u4ECD\u53EF\u7EE7\u7EED\u67E5\u770B\u5F85\u529E\u3002"}),n&&h("div",{className:"flex items-center gap-2 p-3 rounded border border-red-200 bg-red-50 text-red-600 text-sm dark:bg-red-900/20 dark:text-red-400 dark:border-red-800",children:[o(C,{className:"w-4 h-4 shrink-0"}),o("span",{children:n}),o("button",{type:"button",onClick:()=>r(null),className:"ml-auto",children:o(F,{className:"w-3.5 h-3.5"})})]}),e.length===0?h("div",{className:"border rounded-lg bg-card p-12 text-center",children:[o(S,{className:"w-16 h-16 mx-auto mb-4 opacity-25"}),o("h3",{className:"text-lg font-semibold mb-1",children:"\u6682\u65E0\u5F85\u529E"}),o("p",{className:"text-sm text-muted-foreground",children:"\u9700\u8981\u626B\u7801\u767B\u5F55\u65F6\uFF0C\u4E8C\u7EF4\u7801\u5C06\u663E\u793A\u5728\u6B64\u5904"})]}):o("div",{className:"space-y-4",children:e.map(a=>h("div",{className:"border rounded-lg bg-card p-4 shadow-sm",children:[h("div",{className:"flex items-start justify-between flex-wrap gap-2 mb-2",children:[h("div",{className:"flex items-center gap-2 font-semibold",children:[o(A,{className:"w-4 h-4"})," \u626B\u7801\u767B\u5F55"]}),h("div",{className:"flex gap-1 text-xs",children:[o("span",{className:"px-2 py-0.5 rounded border",children:a.adapter}),o("span",{className:"px-2 py-0.5 rounded bg-muted",children:a.endpointId})]})]}),a.payload?.message&&o("p",{className:"text-sm text-muted-foreground mb-3",children:a.payload.message}),a.type==="qrcode"&&a.payload?.image&&o("div",{className:"flex justify-center p-4 bg-muted/30 rounded-lg mb-3",children:o("img",{src:String(a.payload.image),alt:"\u767B\u5F55\u4E8C\u7EF4\u7801",className:"max-w-[200px] w-full h-auto"})}),a.type==="qrcode"&&!a.payload?.image&&a.payload?.url&&o("p",{className:"text-sm break-all mb-3",children:o("a",{href:String(a.payload.url),target:"_blank",rel:"noopener noreferrer",className:"text-primary hover:underline",children:"\u6253\u5F00\u4E8C\u7EF4\u7801\u94FE\u63A5"})}),a.type==="qrcode"&&h("div",{className:"flex gap-2 mt-3",children:[o("button",{type:"button",className:"h-9 px-4 rounded-md bg-primary text-primary-foreground text-sm disabled:opacity-50",disabled:!!m[a.id],onClick:()=>{q(a.id,{done:!0})},children:m[a.id]?"\u63D0\u4EA4\u4E2D\u2026":"\u6211\u5DF2\u626B\u7801"}),o("button",{type:"button",className:"h-9 px-4 rounded-md border text-sm hover:bg-accent transition-colors",onClick:()=>{v(a.id)},children:"\u53D6\u6D88"})]})]},a.id))})]})}import{Fragment as J,jsx as u,jsxs as c}from"react/jsx-runtime";function H(){let[e,t]=b("overview"),[l,f]=b([]),[n,r]=b(!0),[m,x]=b(null),p=he(async()=>{r(!0),x(null);try{let s=await w("/api/weixin-ilink/endpoints"),i=await s.json();if(!s.ok||!i.success)throw new Error(i.message||"\u52A0\u8F7D\u5931\u8D25");f(Array.isArray(i.data)?i.data:[])}catch(s){x(s.message),f([])}finally{r(!1)}},[]);return ge(()=>{e==="overview"&&p()},[e,p]),c("div",{className:"p-6 max-w-5xl mx-auto space-y-5",children:[c("div",{className:"flex items-center justify-between",children:[c("div",{children:[c("h1",{className:"text-2xl font-bold flex items-center gap-2",children:[u(k,{className:"w-6 h-6"})," \u5FAE\u4FE1 iLink\uFF08ClawBot\uFF09"]}),u("p",{className:"text-sm text-muted-foreground mt-1",children:"\u4E2A\u4EBA\u5FAE\u4FE1\u957F\u8F6E\u8BE2\u9002\u914D\u5668\uFF1A\u6982\u89C8\u4E0E\u626B\u7801\u767B\u5F55\u8F85\u52A9"})]}),e==="overview"&&c("button",{type:"button",onClick:()=>{p()},disabled:n,className:"flex items-center gap-1 px-3 py-1.5 rounded bg-blue-500 text-white hover:bg-blue-600 disabled:opacity-50 text-sm",children:[u(B,{className:`w-4 h-4 ${n?"animate-spin":""}`})," \u5237\u65B0"]})]}),c("div",{className:"flex gap-1 border-b",children:[u("button",{type:"button",onClick:()=>t("overview"),className:`px-4 py-2 text-sm font-medium border-b-2 transition-colors ${e==="overview"?"border-blue-500 text-blue-600":"border-transparent text-gray-500 hover:text-gray-700"}`,children:c("span",{className:"flex items-center gap-1.5",children:[u(k,{className:"w-4 h-4"})," \u6982\u89C8"]})}),u("button",{type:"button",onClick:()=>t("login"),className:`px-4 py-2 text-sm font-medium border-b-2 transition-colors ${e==="login"?"border-blue-500 text-blue-600":"border-transparent text-gray-500 hover:text-gray-700"}`,children:c("span",{className:"flex items-center gap-1.5",children:[u(S,{className:"w-4 h-4"})," \u767B\u5F55\u8F85\u52A9"]})})]}),e==="overview"&&c("div",{className:"space-y-4",children:[m&&u("p",{className:"text-sm text-red-600",children:m}),n?u("div",{className:"flex justify-center py-12",children:u(L,{className:"w-6 h-6 animate-spin text-blue-500"})}):l.length===0?u("div",{className:"border rounded-lg p-8 text-center text-muted-foreground",children:"\u6682\u65E0 weixin-ilink Endpoint \u5B9E\u4F8B"}):u("div",{className:"grid gap-3",children:l.map(s=>c("div",{className:"border rounded-lg p-4 flex items-center justify-between",children:[c("div",{children:[u("div",{className:"font-semibold",children:s.name}),c("div",{className:"text-xs text-muted-foreground mt-1",children:["\u51ED\u8BC1\uFF1A",s.hasCredentials?"\u5DF2\u4FDD\u5B58":"\u672A\u767B\u5F55"]})]}),u("div",{className:"flex items-center gap-2 text-sm",children:s.connected?c(J,{children:[u(D,{className:"w-4 h-4 text-green-500"}),u("span",{className:"text-green-600",children:"\u5728\u7EBF"})]}):c(J,{children:[u(M,{className:"w-4 h-4 text-gray-400"}),u("span",{className:"text-gray-500",children:"\u79BB\u7EBF"})]})})]},s.name))})]}),e==="login"&&u(O,{})]})}function Ra(e){e.addRoute({path:"/console/weixin-ilink",name:"\u5FAE\u4FE1 iLink",element:e.React.createElement(H,{hostReact:e.React})}),e.addTool({id:"weixin-ilink",name:"\u5FAE\u4FE1 iLink",path:"/console/weixin-ilink"})}export{Ra as register};
2
- /*! Bundled license information:
3
-
4
- lucide-react/dist/esm/shared/src/utils/mergeClasses.mjs:
5
- lucide-react/dist/esm/shared/src/utils/toKebabCase.mjs:
6
- lucide-react/dist/esm/shared/src/utils/toCamelCase.mjs:
7
- lucide-react/dist/esm/shared/src/utils/toPascalCase.mjs:
8
- lucide-react/dist/esm/defaultAttributes.mjs:
9
- lucide-react/dist/esm/shared/src/utils/hasA11yProp.mjs:
10
- lucide-react/dist/esm/context.mjs:
11
- lucide-react/dist/esm/Icon.mjs:
12
- lucide-react/dist/esm/createLucideIcon.mjs:
13
- lucide-react/dist/esm/icons/bot.mjs:
14
- lucide-react/dist/esm/icons/circle-alert.mjs:
15
- lucide-react/dist/esm/icons/loader-circle.mjs:
16
- lucide-react/dist/esm/icons/log-in.mjs:
17
- lucide-react/dist/esm/icons/qr-code.mjs:
18
- lucide-react/dist/esm/icons/refresh-cw.mjs:
19
- lucide-react/dist/esm/icons/wifi-off.mjs:
20
- lucide-react/dist/esm/icons/wifi.mjs:
21
- lucide-react/dist/esm/icons/x.mjs:
22
- lucide-react/dist/esm/lucide-react.mjs:
23
- (**
24
- * @license lucide-react v1.23.0 - ISC
25
- *
26
- * This source code is licensed under the ISC license.
27
- * See the LICENSE file in the root directory of this source tree.
28
- *)
29
- */
package/lib/adapter.d.ts DELETED
@@ -1,15 +0,0 @@
1
- /**
2
- * 微信 iLink(ClawBot)适配器
3
- */
4
- import { Adapter, type Plugin } from "zhin.js";
5
- import { WeixinIlinkEndpoint } from "./endpoint.js";
6
- import type { WeixinIlinkEndpointConfig } from "./types.js";
7
- import type { OutboundRichSegmentPolicy } from "zhin.js";
8
- export declare class WeixinIlinkAdapter extends Adapter<WeixinIlinkEndpoint> {
9
- static readonly capabilities: readonly ["inbound", "outbound"];
10
- static outboundRichSegmentPolicy: OutboundRichSegmentPolicy;
11
- static interactivePolicy: "text";
12
- constructor(plugin: Plugin);
13
- createEndpoint(config: WeixinIlinkEndpointConfig): WeixinIlinkEndpoint;
14
- }
15
- //# sourceMappingURL=adapter.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAC5D,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,SAAS,CAAC;AAEzD,qBAAa,kBAAmB,SAAQ,OAAO,CAAC,mBAAmB,CAAC;IAClE,gBAAyB,YAAY,mCAAoC;IACzE,OAAgB,yBAAyB,EAAE,yBAAyB,CAIlE;IACF,OAAgB,iBAAiB,EAAG,MAAM,CAAU;gBAExC,MAAM,EAAE,MAAM;IAI1B,cAAc,CAAC,MAAM,EAAE,yBAAyB,GAAG,mBAAmB;CAGvE"}
package/lib/adapter.js DELETED
@@ -1,21 +0,0 @@
1
- /**
2
- * 微信 iLink(ClawBot)适配器
3
- */
4
- import { Adapter } from "zhin.js";
5
- import { WeixinIlinkEndpoint } from "./endpoint.js";
6
- export class WeixinIlinkAdapter extends Adapter {
7
- static capabilities = ['inbound', 'outbound'];
8
- static outboundRichSegmentPolicy = {
9
- qrcode: 'image',
10
- html: 'text',
11
- markdown: 'origin',
12
- };
13
- static interactivePolicy = 'text';
14
- constructor(plugin) {
15
- super(plugin, "weixin-ilink", []);
16
- }
17
- createEndpoint(config) {
18
- return new WeixinIlinkEndpoint(this, config);
19
- }
20
- }
21
- //# sourceMappingURL=adapter.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,OAAO,EAAe,MAAM,SAAS,CAAC;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAIpD,MAAM,OAAO,kBAAmB,SAAQ,OAA4B;IAClE,MAAM,CAAmB,YAAY,GAAG,CAAC,SAAS,EAAE,UAAU,CAAU,CAAC;IACzE,MAAM,CAAU,yBAAyB,GAA8B;QACrE,MAAM,EAAE,OAAO;QACf,IAAI,EAAE,MAAM;QACZ,QAAQ,EAAE,QAAQ;KACnB,CAAC;IACF,MAAM,CAAU,iBAAiB,GAAG,MAAe,CAAC;IAEpD,YAAY,MAAc;QACxB,KAAK,CAAC,MAAM,EAAE,cAAc,EAAE,EAAE,CAAC,CAAC;IACpC,CAAC;IAED,cAAc,CAAC,MAAiC;QAC9C,OAAO,IAAI,mBAAmB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC/C,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"aes-ecb.d.ts","sourceRoot":"","sources":["../src/aes-ecb.ts"],"names":[],"mappings":"AAKA,kEAAkE;AAClE,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAGpE;AAED,uDAAuD;AACvD,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAGrE;AAED,+EAA+E;AAC/E,wBAAgB,gBAAgB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CAE9D"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"aes-ecb.js","sourceRoot":"","sources":["../src/aes-ecb.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/D,kEAAkE;AAClE,MAAM,UAAU,aAAa,CAAC,SAAiB,EAAE,GAAW;IAC1D,MAAM,MAAM,GAAG,cAAc,CAAC,aAAa,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;IACxD,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;AACnE,CAAC;AAED,uDAAuD;AACvD,MAAM,UAAU,aAAa,CAAC,UAAkB,EAAE,GAAW;IAC3D,MAAM,QAAQ,GAAG,gBAAgB,CAAC,aAAa,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;IAC5D,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;AACxE,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,gBAAgB,CAAC,aAAqB;IACpD,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,aAAa,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC;AAClD,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"cdn-upload.d.ts","sourceRoot":"","sources":["../src/cdn-upload.ts"],"names":[],"mappings":"AAQA;;;;GAIG;AACH,wBAAsB,iBAAiB,CAAC,MAAM,EAAE;IAC9C,GAAG,EAAE,MAAM,CAAC;IACZ,mGAAmG;IACnG,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC;IAAE,aAAa,EAAE,MAAM,CAAA;CAAE,CAAC,CAgErC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"cdn-upload.js","sourceRoot":"","sources":["../src/cdn-upload.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=cdn-upload.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cdn-upload.test.d.ts","sourceRoot":"","sources":["../src/cdn-upload.test.ts"],"names":[],"mappings":""}