@krischoichoi/channel-weixin 0.6.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 (138) hide show
  1. package/README.md +101 -0
  2. package/lib/adapter.d.ts +90 -0
  3. package/lib/adapter.d.ts.map +1 -0
  4. package/lib/adapter.js +247 -0
  5. package/lib/adapter.js.map +1 -0
  6. package/lib/auth/account-store.d.ts +60 -0
  7. package/lib/auth/account-store.d.ts.map +1 -0
  8. package/lib/auth/account-store.js +84 -0
  9. package/lib/auth/account-store.js.map +1 -0
  10. package/lib/auth/login.d.ts +83 -0
  11. package/lib/auth/login.d.ts.map +1 -0
  12. package/lib/auth/login.js +202 -0
  13. package/lib/auth/login.js.map +1 -0
  14. package/lib/config.d.ts +52 -0
  15. package/lib/config.d.ts.map +1 -0
  16. package/lib/config.js +36 -0
  17. package/lib/config.js.map +1 -0
  18. package/lib/definition.d.ts +59 -0
  19. package/lib/definition.d.ts.map +1 -0
  20. package/lib/definition.js +146 -0
  21. package/lib/definition.js.map +1 -0
  22. package/lib/ilink/base-info.d.ts +22 -0
  23. package/lib/ilink/base-info.d.ts.map +1 -0
  24. package/lib/ilink/base-info.js +11 -0
  25. package/lib/ilink/base-info.js.map +1 -0
  26. package/lib/ilink/client.d.ts +110 -0
  27. package/lib/ilink/client.d.ts.map +1 -0
  28. package/lib/ilink/client.js +308 -0
  29. package/lib/ilink/client.js.map +1 -0
  30. package/lib/ilink/constants.d.ts +59 -0
  31. package/lib/ilink/constants.d.ts.map +1 -0
  32. package/lib/ilink/constants.js +59 -0
  33. package/lib/ilink/constants.js.map +1 -0
  34. package/lib/ilink/errors.d.ts +79 -0
  35. package/lib/ilink/errors.d.ts.map +1 -0
  36. package/lib/ilink/errors.js +121 -0
  37. package/lib/ilink/errors.js.map +1 -0
  38. package/lib/ilink/headers.d.ts +40 -0
  39. package/lib/ilink/headers.d.ts.map +1 -0
  40. package/lib/ilink/headers.js +70 -0
  41. package/lib/ilink/headers.js.map +1 -0
  42. package/lib/ilink/schema.d.ts +154 -0
  43. package/lib/ilink/schema.d.ts.map +1 -0
  44. package/lib/ilink/schema.js +140 -0
  45. package/lib/ilink/schema.js.map +1 -0
  46. package/lib/ilink/types.d.ts +235 -0
  47. package/lib/ilink/types.d.ts.map +1 -0
  48. package/lib/ilink/types.js +21 -0
  49. package/lib/ilink/types.js.map +1 -0
  50. package/lib/index.d.ts +50 -0
  51. package/lib/index.d.ts.map +1 -0
  52. package/lib/index.js +91 -0
  53. package/lib/index.js.map +1 -0
  54. package/lib/manifest.d.ts +54 -0
  55. package/lib/manifest.d.ts.map +1 -0
  56. package/lib/manifest.js +32 -0
  57. package/lib/manifest.js.map +1 -0
  58. package/lib/media/decrypt.d.ts +3 -0
  59. package/lib/media/decrypt.d.ts.map +1 -0
  60. package/lib/media/decrypt.js +16 -0
  61. package/lib/media/decrypt.js.map +1 -0
  62. package/lib/media/download.d.ts +22 -0
  63. package/lib/media/download.d.ts.map +1 -0
  64. package/lib/media/download.js +62 -0
  65. package/lib/media/download.js.map +1 -0
  66. package/lib/media/encrypt.d.ts +3 -0
  67. package/lib/media/encrypt.d.ts.map +1 -0
  68. package/lib/media/encrypt.js +16 -0
  69. package/lib/media/encrypt.js.map +1 -0
  70. package/lib/media/send-media.d.ts +41 -0
  71. package/lib/media/send-media.d.ts.map +1 -0
  72. package/lib/media/send-media.js +52 -0
  73. package/lib/media/send-media.js.map +1 -0
  74. package/lib/media/silk-transcode.d.ts +38 -0
  75. package/lib/media/silk-transcode.d.ts.map +1 -0
  76. package/lib/media/silk-transcode.js +88 -0
  77. package/lib/media/silk-transcode.js.map +1 -0
  78. package/lib/media/upload.d.ts +38 -0
  79. package/lib/media/upload.d.ts.map +1 -0
  80. package/lib/media/upload.js +122 -0
  81. package/lib/media/upload.js.map +1 -0
  82. package/lib/messaging/dedup.d.ts +87 -0
  83. package/lib/messaging/dedup.d.ts.map +1 -0
  84. package/lib/messaging/dedup.js +127 -0
  85. package/lib/messaging/dedup.js.map +1 -0
  86. package/lib/messaging/mapper.d.ts +26 -0
  87. package/lib/messaging/mapper.d.ts.map +1 -0
  88. package/lib/messaging/mapper.js +107 -0
  89. package/lib/messaging/mapper.js.map +1 -0
  90. package/lib/messaging/monitor.d.ts +109 -0
  91. package/lib/messaging/monitor.d.ts.map +1 -0
  92. package/lib/messaging/monitor.js +234 -0
  93. package/lib/messaging/monitor.js.map +1 -0
  94. package/lib/messaging/quote.d.ts +9 -0
  95. package/lib/messaging/quote.d.ts.map +1 -0
  96. package/lib/messaging/quote.js +35 -0
  97. package/lib/messaging/quote.js.map +1 -0
  98. package/lib/messaging/send.d.ts +54 -0
  99. package/lib/messaging/send.d.ts.map +1 -0
  100. package/lib/messaging/send.js +173 -0
  101. package/lib/messaging/send.js.map +1 -0
  102. package/lib/messaging/typing.d.ts +34 -0
  103. package/lib/messaging/typing.d.ts.map +1 -0
  104. package/lib/messaging/typing.js +56 -0
  105. package/lib/messaging/typing.js.map +1 -0
  106. package/lib/storage/context-token.d.ts +26 -0
  107. package/lib/storage/context-token.d.ts.map +1 -0
  108. package/lib/storage/context-token.js +26 -0
  109. package/lib/storage/context-token.js.map +1 -0
  110. package/lib/storage/sync-cursor.d.ts +27 -0
  111. package/lib/storage/sync-cursor.d.ts.map +1 -0
  112. package/lib/storage/sync-cursor.js +25 -0
  113. package/lib/storage/sync-cursor.js.map +1 -0
  114. package/lib/transport.d.ts +38 -0
  115. package/lib/transport.d.ts.map +1 -0
  116. package/lib/transport.js +68 -0
  117. package/lib/transport.js.map +1 -0
  118. package/lib/upstream/compat.d.ts +54 -0
  119. package/lib/upstream/compat.d.ts.map +1 -0
  120. package/lib/upstream/compat.js +54 -0
  121. package/lib/upstream/compat.js.map +1 -0
  122. package/lib/upstream/config-manager.d.ts +35 -0
  123. package/lib/upstream/config-manager.d.ts.map +1 -0
  124. package/lib/upstream/config-manager.js +91 -0
  125. package/lib/upstream/config-manager.js.map +1 -0
  126. package/lib/upstream/index.d.ts +42 -0
  127. package/lib/upstream/index.d.ts.map +1 -0
  128. package/lib/upstream/index.js +13 -0
  129. package/lib/upstream/index.js.map +1 -0
  130. package/lib/upstream/port.d.ts +153 -0
  131. package/lib/upstream/port.d.ts.map +1 -0
  132. package/lib/upstream/port.js +15 -0
  133. package/lib/upstream/port.js.map +1 -0
  134. package/lib/upstream/tencent-upstream.d.ts +116 -0
  135. package/lib/upstream/tencent-upstream.d.ts.map +1 -0
  136. package/lib/upstream/tencent-upstream.js +518 -0
  137. package/lib/upstream/tencent-upstream.js.map +1 -0
  138. package/package.json +48 -0
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Classification: A — DSH glue [keep].
3
+ *
4
+ * Typed iLink protocol errors + redaction + normalization. This is DSH error
5
+ * mapping onto `ChannelError`; not a duplicated platform algorithm. The
6
+ * official package throws raw Errors; DSH's typed layer surfaces them under the
7
+ * standard Channel contract. Keep.
8
+ */
9
+ /**
10
+ * Typed iLink protocol errors and normalization.
11
+ *
12
+ * Tokens are NEVER embedded in error messages or logs — every message passes
13
+ * through {@link redactMessage}.
14
+ */
15
+ import { ChannelError, ChannelSendError } from '@krischoichoi/channel-core';
16
+ /** iLink protocol-level error (server returned non-zero `ret` or `errcode`). */
17
+ export declare class ILinkError extends ChannelError {
18
+ /** Upstream ret code (`0` = success). */
19
+ readonly ret: number;
20
+ /** Optional server error code (e.g. -14 stale token). */
21
+ readonly errcode?: number;
22
+ /** Raw server message; already redacted. */
23
+ readonly upstreamMessage?: string;
24
+ constructor(ret: number, message: string, options?: {
25
+ errcode?: number;
26
+ errmsg?: string;
27
+ cause?: unknown;
28
+ });
29
+ }
30
+ /** The bot token is stale / expired (server `ret === -14` or `errcode === -14`). */
31
+ export declare class StaleTokenError extends ChannelError {
32
+ readonly accountId: string;
33
+ constructor(accountId: string, options?: {
34
+ cause?: unknown;
35
+ });
36
+ }
37
+ /** A request timed out (client-side or long-poll client abort). */
38
+ export declare class ILinkTimeoutError extends ChannelError {
39
+ readonly operation: string;
40
+ constructor(operation: string, options?: {
41
+ cause?: unknown;
42
+ });
43
+ }
44
+ /** A request was aborted by an external signal (normal teardown). */
45
+ export declare class ILinkAbortError extends ChannelError {
46
+ readonly operation: string;
47
+ constructor(operation: string, options?: {
48
+ cause?: unknown;
49
+ });
50
+ }
51
+ /** A sendmessage RPC failed; keeps the ChannelSendError code. */
52
+ export declare class ILinkSendError extends ChannelSendError {
53
+ readonly operation: string;
54
+ constructor(operation: string, message: string, options?: {
55
+ cause?: unknown;
56
+ });
57
+ }
58
+ /**
59
+ * Redact known sensitive values from a message/body for logs and errors.
60
+ */
61
+ export declare function redactMessage(input: string | undefined | null): string;
62
+ /**
63
+ * Normalize an unknown thrown value into a typed iLink error. Determines
64
+ * whether the failure was a protocol ret-code error, a stale token, a timeout,
65
+ * an abort, or a network error — and throws the closest typed error. Never
66
+ * includes token values.
67
+ */
68
+ export declare function normalizeILinkError(error: unknown, context: {
69
+ operation: string;
70
+ accountId: string;
71
+ ret?: number;
72
+ errcode?: number;
73
+ errmsg?: string;
74
+ }): ChannelError;
75
+ /** Whether a thrown value indicates an external abort. */
76
+ export declare function isAbortError(error: unknown): boolean;
77
+ /** Whether a thrown value indicates a timeout abort. */
78
+ export declare function isTimeoutError(error: unknown): boolean;
79
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/ilink/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH;;;;;GAKG;AACH,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAG5E,gFAAgF;AAChF,qBAAa,UAAW,SAAQ,YAAY;IAC1C,yCAAyC;IACzC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,yDAAyD;IACzD,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,4CAA4C;IAC5C,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;gBAGhC,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE;CAQnE;AAED,oFAAoF;AACpF,qBAAa,eAAgB,SAAQ,YAAY;IAC/C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;gBAEf,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE;CAO7D;AAED,mEAAmE;AACnE,qBAAa,iBAAkB,SAAQ,YAAY;IACjD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;gBAEf,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE;CAK7D;AAED,qEAAqE;AACrE,qBAAa,eAAgB,SAAQ,YAAY;IAC/C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;gBAEf,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE;CAK7D;AAED,iEAAiE;AACjE,qBAAa,cAAe,SAAQ,gBAAgB;IAClD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;gBAEf,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE;CAK9E;AAID;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,CAGtE;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,OAAO,EACd,OAAO,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GACjG,YAAY,CAyBd;AAED,0DAA0D;AAC1D,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAGpD;AAED,wDAAwD;AACxD,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAEtD"}
@@ -0,0 +1,121 @@
1
+ /**
2
+ * Classification: A — DSH glue [keep].
3
+ *
4
+ * Typed iLink protocol errors + redaction + normalization. This is DSH error
5
+ * mapping onto `ChannelError`; not a duplicated platform algorithm. The
6
+ * official package throws raw Errors; DSH's typed layer surfaces them under the
7
+ * standard Channel contract. Keep.
8
+ */
9
+ /**
10
+ * Typed iLink protocol errors and normalization.
11
+ *
12
+ * Tokens are NEVER embedded in error messages or logs — every message passes
13
+ * through {@link redactMessage}.
14
+ */
15
+ import { ChannelError, ChannelSendError } from '@krischoichoi/channel-core';
16
+ import { STALE_TOKEN_ERRCODE } from './constants.js';
17
+ /** iLink protocol-level error (server returned non-zero `ret` or `errcode`). */
18
+ export class ILinkError extends ChannelError {
19
+ /** Upstream ret code (`0` = success). */
20
+ ret;
21
+ /** Optional server error code (e.g. -14 stale token). */
22
+ errcode;
23
+ /** Raw server message; already redacted. */
24
+ upstreamMessage;
25
+ constructor(ret, message, options) {
26
+ super('CHANNEL_ERROR', message, { cause: options?.cause });
27
+ this.name = 'ILinkError';
28
+ this.ret = ret;
29
+ this.errcode = options?.errcode;
30
+ this.upstreamMessage = options?.errmsg ? redactMessage(options.errmsg) : undefined;
31
+ }
32
+ }
33
+ /** The bot token is stale / expired (server `ret === -14` or `errcode === -14`). */
34
+ export class StaleTokenError extends ChannelError {
35
+ accountId;
36
+ constructor(accountId, options) {
37
+ super('CHANNEL_AUTH_FAILED', `weixin bot token for account '${accountId}' is stale or expired; re-authenticate via QR login`, {
38
+ cause: options?.cause,
39
+ });
40
+ this.name = 'StaleTokenError';
41
+ this.accountId = accountId;
42
+ }
43
+ }
44
+ /** A request timed out (client-side or long-poll client abort). */
45
+ export class ILinkTimeoutError extends ChannelError {
46
+ operation;
47
+ constructor(operation, options) {
48
+ super('CHANNEL_ERROR', `weixin ${operation} timed out`, { cause: options?.cause });
49
+ this.name = 'ILinkTimeoutError';
50
+ this.operation = operation;
51
+ }
52
+ }
53
+ /** A request was aborted by an external signal (normal teardown). */
54
+ export class ILinkAbortError extends ChannelError {
55
+ operation;
56
+ constructor(operation, options) {
57
+ super('CHANNEL_ERROR', `weixin ${operation} aborted`, { cause: options?.cause });
58
+ this.name = 'ILinkAbortError';
59
+ this.operation = operation;
60
+ }
61
+ }
62
+ /** A sendmessage RPC failed; keeps the ChannelSendError code. */
63
+ export class ILinkSendError extends ChannelSendError {
64
+ operation;
65
+ constructor(operation, message, options) {
66
+ super(message, { cause: options?.cause });
67
+ this.name = 'ILinkSendError';
68
+ this.operation = operation;
69
+ }
70
+ }
71
+ const SENSITIVE_TOKEN = /(bot_token|token|context_token|authorization|authorization|access_key|aes_key)/gi;
72
+ /**
73
+ * Redact known sensitive values from a message/body for logs and errors.
74
+ */
75
+ export function redactMessage(input) {
76
+ if (!input)
77
+ return '';
78
+ return String(input).replace(SENSITIVE_TOKEN, '<redacted>');
79
+ }
80
+ /**
81
+ * Normalize an unknown thrown value into a typed iLink error. Determines
82
+ * whether the failure was a protocol ret-code error, a stale token, a timeout,
83
+ * an abort, or a network error — and throws the closest typed error. Never
84
+ * includes token values.
85
+ */
86
+ export function normalizeILinkError(error, context) {
87
+ // Re-wrap typed protocol errors.
88
+ if (error instanceof ILinkError || error instanceof StaleTokenError)
89
+ return error;
90
+ const { operation, accountId, ret, errcode, errmsg } = context;
91
+ if (ret === STALE_TOKEN_ERRCODE || errcode === STALE_TOKEN_ERRCODE) {
92
+ return new StaleTokenError(accountId, { cause: error });
93
+ }
94
+ if ((ret !== undefined && ret !== 0) || (errcode !== undefined && errcode !== 0)) {
95
+ const code = ret !== undefined && ret !== 0 ? ret : errcode;
96
+ const detail = ret !== undefined && ret !== 0 ? `ret=${ret}` : `errcode=${errcode}`;
97
+ return new ILinkError(code, redactMessage(errmsg) || `weixin ${operation} returned ${detail}`, { errcode });
98
+ }
99
+ if (isAbortError(error))
100
+ return new ILinkAbortError(operation, { cause: error });
101
+ if (isTimeoutError(error))
102
+ return new ILinkTimeoutError(operation, { cause: error });
103
+ if (error instanceof ChannelError) {
104
+ // Preserve transport-channel errors but redact any accidental token text.
105
+ const channel = error;
106
+ return new ChannelError(channel.code ?? 'CHANNEL_ERROR', redactMessage(channel.message), { cause: channel });
107
+ }
108
+ const base = error instanceof Error ? error.message : String(error);
109
+ return new ChannelError('CHANNEL_ERROR', `weixin ${operation} failed: ${redactMessage(base)}`, { cause: error });
110
+ }
111
+ /** Whether a thrown value indicates an external abort. */
112
+ export function isAbortError(error) {
113
+ if (error instanceof ILinkAbortError)
114
+ return true;
115
+ return error?.name === 'AbortError';
116
+ }
117
+ /** Whether a thrown value indicates a timeout abort. */
118
+ export function isTimeoutError(error) {
119
+ return error?.code === 'UND_ERR_CONNECT_TIMEOUT' || error?.name === 'AbortError';
120
+ }
121
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/ilink/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH;;;;;GAKG;AACH,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC5E,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAErD,gFAAgF;AAChF,MAAM,OAAO,UAAW,SAAQ,YAAY;IAC1C,yCAAyC;IAChC,GAAG,CAAS;IACrB,yDAAyD;IAChD,OAAO,CAAU;IAC1B,4CAA4C;IACnC,eAAe,CAAU;IAElC,YACE,GAAW,EACX,OAAe,EACf,OAAgE;QAEhE,KAAK,CAAC,eAAe,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QAC3D,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;QACzB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,OAAO,GAAG,OAAO,EAAE,OAAO,CAAC;QAChC,IAAI,CAAC,eAAe,GAAG,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACrF,CAAC;CACF;AAED,oFAAoF;AACpF,MAAM,OAAO,eAAgB,SAAQ,YAAY;IACtC,SAAS,CAAS;IAE3B,YAAY,SAAiB,EAAE,OAA6B;QAC1D,KAAK,CAAC,qBAAqB,EAAE,iCAAiC,SAAS,qDAAqD,EAAE;YAC5H,KAAK,EAAE,OAAO,EAAE,KAAK;SACtB,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;QAC9B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;CACF;AAED,mEAAmE;AACnE,MAAM,OAAO,iBAAkB,SAAQ,YAAY;IACxC,SAAS,CAAS;IAE3B,YAAY,SAAiB,EAAE,OAA6B;QAC1D,KAAK,CAAC,eAAe,EAAE,UAAU,SAAS,YAAY,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QACnF,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;QAChC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;CACF;AAED,qEAAqE;AACrE,MAAM,OAAO,eAAgB,SAAQ,YAAY;IACtC,SAAS,CAAS;IAE3B,YAAY,SAAiB,EAAE,OAA6B;QAC1D,KAAK,CAAC,eAAe,EAAE,UAAU,SAAS,UAAU,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QACjF,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;QAC9B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;CACF;AAED,iEAAiE;AACjE,MAAM,OAAO,cAAe,SAAQ,gBAAgB;IACzC,SAAS,CAAS;IAE3B,YAAY,SAAiB,EAAE,OAAe,EAAE,OAA6B;QAC3E,KAAK,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QAC1C,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;QAC7B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;CACF;AAED,MAAM,eAAe,GAAG,kFAAkF,CAAC;AAE3G;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,KAAgC;IAC5D,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC;IACtB,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,eAAe,EAAE,YAAY,CAAC,CAAC;AAC9D,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CACjC,KAAc,EACd,OAAkG;IAElG,iCAAiC;IACjC,IAAI,KAAK,YAAY,UAAU,IAAI,KAAK,YAAY,eAAe;QAAE,OAAO,KAAK,CAAC;IAElF,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAC/D,IAAI,GAAG,KAAK,mBAAmB,IAAI,OAAO,KAAK,mBAAmB,EAAE,CAAC;QACnE,OAAO,IAAI,eAAe,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IAC1D,CAAC;IACD,IAAI,CAAC,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,CAAC,CAAC,EAAE,CAAC;QACjF,MAAM,IAAI,GAAG,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAQ,CAAC;QAC7D,MAAM,MAAM,GAAG,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC,CAAC,WAAW,OAAO,EAAE,CAAC;QACpF,OAAO,IAAI,UAAU,CAAC,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,IAAI,UAAU,SAAS,aAAa,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;IAC9G,CAAC;IAED,IAAI,YAAY,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,eAAe,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IACjF,IAAI,cAAc,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,iBAAiB,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IAErF,IAAI,KAAK,YAAY,YAAY,EAAE,CAAC;QAClC,0EAA0E;QAC1E,MAAM,OAAO,GAAG,KAAqB,CAAC;QACtC,OAAO,IAAI,YAAY,CAAC,OAAO,CAAC,IAAI,IAAI,eAAe,EAAE,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;IAC/G,CAAC;IAED,MAAM,IAAI,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACpE,OAAO,IAAI,YAAY,CAAC,eAAe,EAAE,UAAU,SAAS,YAAY,aAAa,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;AACnH,CAAC;AAED,0DAA0D;AAC1D,MAAM,UAAU,YAAY,CAAC,KAAc;IACzC,IAAI,KAAK,YAAY,eAAe;QAAE,OAAO,IAAI,CAAC;IAClD,OAAQ,KAAe,EAAE,IAAI,KAAK,YAAY,CAAC;AACjD,CAAC;AAED,wDAAwD;AACxD,MAAM,UAAU,cAAc,CAAC,KAAc;IAC3C,OAAQ,KAA2B,EAAE,IAAI,KAAK,yBAAyB,IAAK,KAAe,EAAE,IAAI,KAAK,YAAY,CAAC;AACrH,CAAC"}
@@ -0,0 +1,40 @@
1
+ export interface BuildHeadersOptions {
2
+ /** Bot token for the `Authorization` header; omitted when absent. */
3
+ token?: string;
4
+ /** Base URL (used only to derive a {@link buildClientVersion} seed — kept for symmetric API). */
5
+ baseUrl?: string;
6
+ /** Weixin user id (uint32) used to seed X-WECHAT-UIN randomness. */
7
+ uin?: number;
8
+ /** Optional client version override; defaults to {@link encodeClientVersion}. */
9
+ clientVersion?: number;
10
+ /** Optional routing tag; emitted as `SKRouteTag` when present. */
11
+ routeTag?: string;
12
+ /** Injectable random source for X-WECHAT-UIN (tests). */
13
+ rand?: () => number;
14
+ }
15
+ /**
16
+ * Encode a dotted version `major.minor.patch` as a uint32 `0x00MMNNPP`
17
+ * (high 8 bits fixed to 0).
18
+ */
19
+ export declare function encodeClientVersion(major?: number, minor?: number, patch?: number): number;
20
+ /** Parse `major.minor.patch` and return the encoded uint32. */
21
+ export declare function clientVersionFromString(version: string): number;
22
+ /**
23
+ * X-WECHAT-UIN: a random uint32 rendered as a decimal string, then base64.
24
+ * Falls back to a seeded/deterministic value when a uint32 is supplied via
25
+ * `opts.uin` (tests), otherwise uses crypto randomness.
26
+ */
27
+ export declare function buildWechatUin(uint32?: number, rand?: () => number): string;
28
+ /**
29
+ * Build the shared iLink request headers.
30
+ *
31
+ * - Content-Type: application/json
32
+ * - AuthorizationType: ilink_bot_token
33
+ * - Authorization: Bearer <token> (only when a token is provided)
34
+ * - X-WECHAT-UIN: <random uint32 -> decimal -> base64>
35
+ * - iLink-App-Id: bot
36
+ * - iLink-App-ClientVersion: <encoded uint32>
37
+ * - SKRouteTag (optional)
38
+ */
39
+ export declare function buildHeaders(opts?: BuildHeadersOptions): Record<string, string>;
40
+ //# sourceMappingURL=headers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"headers.d.ts","sourceRoot":"","sources":["../../src/ilink/headers.ts"],"names":[],"mappings":"AA4BA,MAAM,WAAW,mBAAmB;IAClC,qEAAqE;IACrE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iGAAiG;IACjG,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oEAAoE;IACpE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,iFAAiF;IACjF,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,kEAAkE;IAClE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yDAAyD;IACzD,IAAI,CAAC,EAAE,MAAM,MAAM,CAAC;CACrB;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,SAAI,EAAE,KAAK,SAAI,EAAE,KAAK,SAAI,GAAG,MAAM,CAE3E;AAED,+DAA+D;AAC/D,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAM/D;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,MAAoB,GAAG,MAAM,CAIxF;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,YAAY,CAAC,IAAI,GAAE,mBAAwB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAiBnF"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Classification: C — duplicate protocol header assembly [@deprecated upstream-gap].
3
+ *
4
+ * iLink request headers (Authorization, X-WECHAT-UIN, iLink-App-Id,
5
+ * ClientVersion, SKRouteTag). The official buildHeaders lives inside
6
+ * api/api.js (OpenClaw coupled — imports util/logger + auth/accounts). Kept as
7
+ * an upstream-gap; reusable primitives (client-version encoding, base-info) are
8
+ * DSH glue that stays.
9
+ */
10
+ /**
11
+ * iLink HTTP header construction.
12
+ *
13
+ * Every endpoint shares the same header set; building them here avoids
14
+ * duplicating header logic per request.
15
+ */
16
+ import pkg from '../../package.json' with { type: 'json' };
17
+ import { AUTHORIZATION_TYPE, HEADER_AUTHORIZATION, HEADER_AUTHORIZATION_TYPE, HEADER_CONTENT_TYPE, HEADER_ILINK_APP_CLIENT_VERSION, HEADER_ILINK_APP_ID, HEADER_SK_ROUTE_TAG, HEADER_X_WECHAT_UIN, ILINK_APP_ID, } from './constants.js';
18
+ /**
19
+ * Encode a dotted version `major.minor.patch` as a uint32 `0x00MMNNPP`
20
+ * (high 8 bits fixed to 0).
21
+ */
22
+ export function encodeClientVersion(major = 0, minor = 0, patch = 0) {
23
+ return ((major & 0xff) << 16) | ((minor & 0xff) << 8) | (patch & 0xff);
24
+ }
25
+ /** Parse `major.minor.patch` and return the encoded uint32. */
26
+ export function clientVersionFromString(version) {
27
+ const parts = version.split('.').map((part) => Number.parseInt(part, 10));
28
+ const major = Number.isFinite(parts[0]) ? parts[0] : 0;
29
+ const minor = Number.isFinite(parts[1]) ? parts[1] : 0;
30
+ const patch = Number.isFinite(parts[2]) ? parts[2] : 0;
31
+ return encodeClientVersion(major, minor, patch);
32
+ }
33
+ /**
34
+ * X-WECHAT-UIN: a random uint32 rendered as a decimal string, then base64.
35
+ * Falls back to a seeded/deterministic value when a uint32 is supplied via
36
+ * `opts.uin` (tests), otherwise uses crypto randomness.
37
+ */
38
+ export function buildWechatUin(uint32, rand = Math.random) {
39
+ const value = uint32 !== undefined ? uint32 & 0xffffffff : (rand() * 0xffffffff) >>> 0;
40
+ const decimal = String(value >>> 0);
41
+ return Buffer.from(decimal, 'utf-8').toString('base64');
42
+ }
43
+ /**
44
+ * Build the shared iLink request headers.
45
+ *
46
+ * - Content-Type: application/json
47
+ * - AuthorizationType: ilink_bot_token
48
+ * - Authorization: Bearer <token> (only when a token is provided)
49
+ * - X-WECHAT-UIN: <random uint32 -> decimal -> base64>
50
+ * - iLink-App-Id: bot
51
+ * - iLink-App-ClientVersion: <encoded uint32>
52
+ * - SKRouteTag (optional)
53
+ */
54
+ export function buildHeaders(opts = {}) {
55
+ const headers = {
56
+ [HEADER_CONTENT_TYPE]: 'application/json',
57
+ [HEADER_AUTHORIZATION_TYPE]: AUTHORIZATION_TYPE,
58
+ [HEADER_X_WECHAT_UIN]: buildWechatUin(opts.uin, opts.rand),
59
+ [HEADER_ILINK_APP_ID]: ILINK_APP_ID,
60
+ [HEADER_ILINK_APP_CLIENT_VERSION]: String(opts.clientVersion ?? clientVersionFromString(pkg.version)),
61
+ };
62
+ if (opts.token?.trim()) {
63
+ headers[HEADER_AUTHORIZATION] = `Bearer ${opts.token.trim()}`;
64
+ }
65
+ if (opts.routeTag) {
66
+ headers[HEADER_SK_ROUTE_TAG] = opts.routeTag;
67
+ }
68
+ return headers;
69
+ }
70
+ //# sourceMappingURL=headers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"headers.js","sourceRoot":"","sources":["../../src/ilink/headers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,154 @@
1
+ /** Runtime schemas for every iLink JSON trust boundary. */
2
+ import { z } from 'zod';
3
+ import type { ILinkMessageItem } from './types.js';
4
+ export declare const responseEnvelopeSchema: z.ZodObject<{
5
+ ret: z.ZodOptional<z.ZodNumber>;
6
+ errcode: z.ZodOptional<z.ZodNumber>;
7
+ errmsg: z.ZodOptional<z.ZodString>;
8
+ }, z.core.$loose>;
9
+ export declare const baseInfoSchema: z.ZodObject<{
10
+ channel_version: z.ZodOptional<z.ZodString>;
11
+ bot_agent: z.ZodOptional<z.ZodString>;
12
+ }, z.core.$strip>;
13
+ export declare const cdnMediaSchema: z.ZodObject<{
14
+ encrypt_query_param: z.ZodOptional<z.ZodString>;
15
+ aes_key: z.ZodOptional<z.ZodString>;
16
+ encrypt_type: z.ZodOptional<z.ZodNumber>;
17
+ full_url: z.ZodOptional<z.ZodString>;
18
+ }, z.core.$strip>;
19
+ export declare const messageItemSchema: z.ZodType<ILinkMessageItem>;
20
+ export declare const messageSchema: z.ZodObject<{
21
+ seq: z.ZodOptional<z.ZodNumber>;
22
+ message_id: z.ZodOptional<z.ZodNumber>;
23
+ from_user_id: z.ZodOptional<z.ZodString>;
24
+ to_user_id: z.ZodOptional<z.ZodString>;
25
+ client_id: z.ZodOptional<z.ZodString>;
26
+ create_time_ms: z.ZodOptional<z.ZodNumber>;
27
+ update_time_ms: z.ZodOptional<z.ZodNumber>;
28
+ session_id: z.ZodOptional<z.ZodString>;
29
+ group_id: z.ZodOptional<z.ZodString>;
30
+ message_type: z.ZodOptional<z.ZodNumber>;
31
+ message_state: z.ZodOptional<z.ZodNumber>;
32
+ item_list: z.ZodOptional<z.ZodArray<z.ZodType<ILinkMessageItem, unknown, z.core.$ZodTypeInternals<ILinkMessageItem, unknown>>>>;
33
+ context_token: z.ZodOptional<z.ZodString>;
34
+ run_id: z.ZodOptional<z.ZodString>;
35
+ }, z.core.$strip>;
36
+ export declare const getUploadUrlRequestSchema: z.ZodObject<{
37
+ filekey: z.ZodOptional<z.ZodString>;
38
+ media_type: z.ZodOptional<z.ZodNumber>;
39
+ to_user_id: z.ZodOptional<z.ZodString>;
40
+ rawsize: z.ZodOptional<z.ZodNumber>;
41
+ rawfilemd5: z.ZodOptional<z.ZodString>;
42
+ filesize: z.ZodOptional<z.ZodNumber>;
43
+ thumb_rawsize: z.ZodOptional<z.ZodNumber>;
44
+ thumb_rawfilemd5: z.ZodOptional<z.ZodString>;
45
+ thumb_filesize: z.ZodOptional<z.ZodNumber>;
46
+ no_need_thumb: z.ZodOptional<z.ZodBoolean>;
47
+ aeskey: z.ZodOptional<z.ZodString>;
48
+ base_info: z.ZodOptional<z.ZodObject<{
49
+ channel_version: z.ZodOptional<z.ZodString>;
50
+ bot_agent: z.ZodOptional<z.ZodString>;
51
+ }, z.core.$strip>>;
52
+ }, z.core.$strip>;
53
+ export declare const sendMessageRequestSchema: z.ZodObject<{
54
+ msg: z.ZodOptional<z.ZodObject<{
55
+ seq: z.ZodOptional<z.ZodNumber>;
56
+ message_id: z.ZodOptional<z.ZodNumber>;
57
+ from_user_id: z.ZodOptional<z.ZodString>;
58
+ to_user_id: z.ZodOptional<z.ZodString>;
59
+ client_id: z.ZodOptional<z.ZodString>;
60
+ create_time_ms: z.ZodOptional<z.ZodNumber>;
61
+ update_time_ms: z.ZodOptional<z.ZodNumber>;
62
+ session_id: z.ZodOptional<z.ZodString>;
63
+ group_id: z.ZodOptional<z.ZodString>;
64
+ message_type: z.ZodOptional<z.ZodNumber>;
65
+ message_state: z.ZodOptional<z.ZodNumber>;
66
+ item_list: z.ZodOptional<z.ZodArray<z.ZodType<ILinkMessageItem, unknown, z.core.$ZodTypeInternals<ILinkMessageItem, unknown>>>>;
67
+ context_token: z.ZodOptional<z.ZodString>;
68
+ run_id: z.ZodOptional<z.ZodString>;
69
+ }, z.core.$strip>>;
70
+ base_info: z.ZodOptional<z.ZodObject<{
71
+ channel_version: z.ZodOptional<z.ZodString>;
72
+ bot_agent: z.ZodOptional<z.ZodString>;
73
+ }, z.core.$strip>>;
74
+ }, z.core.$strip>;
75
+ export declare const qrCodeResponseSchema: z.ZodObject<{
76
+ qrcode: z.ZodString;
77
+ qrcode_img_content: z.ZodString;
78
+ ret: z.ZodOptional<z.ZodNumber>;
79
+ errcode: z.ZodOptional<z.ZodNumber>;
80
+ errmsg: z.ZodOptional<z.ZodString>;
81
+ }, z.core.$strip>;
82
+ export declare const qrStatusResponseSchema: z.ZodObject<{
83
+ status: z.ZodOptional<z.ZodEnum<{
84
+ wait: "wait";
85
+ scaned: "scaned";
86
+ confirmed: "confirmed";
87
+ expired: "expired";
88
+ need_verifycode: "need_verifycode";
89
+ verify_code_blocked: "verify_code_blocked";
90
+ scaned_but_redirect: "scaned_but_redirect";
91
+ binded_redirect: "binded_redirect";
92
+ }>>;
93
+ bot_token: z.ZodOptional<z.ZodString>;
94
+ ilink_bot_id: z.ZodOptional<z.ZodString>;
95
+ baseurl: z.ZodOptional<z.ZodString>;
96
+ ilink_user_id: z.ZodOptional<z.ZodString>;
97
+ redirect_host: z.ZodOptional<z.ZodString>;
98
+ ret: z.ZodOptional<z.ZodNumber>;
99
+ errcode: z.ZodOptional<z.ZodNumber>;
100
+ errmsg: z.ZodOptional<z.ZodString>;
101
+ }, z.core.$strip>;
102
+ export declare const getUpdatesResponseSchema: z.ZodObject<{
103
+ msgs: z.ZodOptional<z.ZodArray<z.ZodObject<{
104
+ seq: z.ZodOptional<z.ZodNumber>;
105
+ message_id: z.ZodOptional<z.ZodNumber>;
106
+ from_user_id: z.ZodOptional<z.ZodString>;
107
+ to_user_id: z.ZodOptional<z.ZodString>;
108
+ client_id: z.ZodOptional<z.ZodString>;
109
+ create_time_ms: z.ZodOptional<z.ZodNumber>;
110
+ update_time_ms: z.ZodOptional<z.ZodNumber>;
111
+ session_id: z.ZodOptional<z.ZodString>;
112
+ group_id: z.ZodOptional<z.ZodString>;
113
+ message_type: z.ZodOptional<z.ZodNumber>;
114
+ message_state: z.ZodOptional<z.ZodNumber>;
115
+ item_list: z.ZodOptional<z.ZodArray<z.ZodType<ILinkMessageItem, unknown, z.core.$ZodTypeInternals<ILinkMessageItem, unknown>>>>;
116
+ context_token: z.ZodOptional<z.ZodString>;
117
+ run_id: z.ZodOptional<z.ZodString>;
118
+ }, z.core.$strip>>>;
119
+ get_updates_buf: z.ZodOptional<z.ZodString>;
120
+ longpolling_timeout_ms: z.ZodOptional<z.ZodNumber>;
121
+ ret: z.ZodOptional<z.ZodNumber>;
122
+ errcode: z.ZodOptional<z.ZodNumber>;
123
+ errmsg: z.ZodOptional<z.ZodString>;
124
+ }, z.core.$strip>;
125
+ export declare const sendMessageResponseSchema: z.ZodObject<{
126
+ ret: z.ZodOptional<z.ZodNumber>;
127
+ errcode: z.ZodOptional<z.ZodNumber>;
128
+ errmsg: z.ZodOptional<z.ZodString>;
129
+ }, z.core.$strip>;
130
+ export declare const getUploadUrlResponseSchema: z.ZodObject<{
131
+ upload_param: z.ZodOptional<z.ZodString>;
132
+ thumb_upload_param: z.ZodOptional<z.ZodString>;
133
+ upload_full_url: z.ZodOptional<z.ZodString>;
134
+ ret: z.ZodOptional<z.ZodNumber>;
135
+ errcode: z.ZodOptional<z.ZodNumber>;
136
+ errmsg: z.ZodOptional<z.ZodString>;
137
+ }, z.core.$strip>;
138
+ export declare const getConfigResponseSchema: z.ZodObject<{
139
+ typing_ticket: z.ZodOptional<z.ZodString>;
140
+ ret: z.ZodOptional<z.ZodNumber>;
141
+ errcode: z.ZodOptional<z.ZodNumber>;
142
+ errmsg: z.ZodOptional<z.ZodString>;
143
+ }, z.core.$strip>;
144
+ export declare const sendTypingResponseSchema: z.ZodObject<{
145
+ ret: z.ZodOptional<z.ZodNumber>;
146
+ errcode: z.ZodOptional<z.ZodNumber>;
147
+ errmsg: z.ZodOptional<z.ZodString>;
148
+ }, z.core.$strip>;
149
+ export declare const notifyResponseSchema: z.ZodObject<{
150
+ ret: z.ZodOptional<z.ZodNumber>;
151
+ errcode: z.ZodOptional<z.ZodNumber>;
152
+ errmsg: z.ZodOptional<z.ZodString>;
153
+ }, z.core.$strip>;
154
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/ilink/schema.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAQnD,eAAO,MAAM,sBAAsB;;;;iBAAiD,CAAC;AAErF,eAAO,MAAM,cAAc;;;iBAGzB,CAAC;AAEH,eAAO,MAAM,cAAc;;;;;iBAKzB,CAAC;AAEH,eAAO,MAAM,iBAAiB,EAAE,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAkDvD,CAAC;AAEJ,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;iBAexB,CAAC;AAEH,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;iBAapC,CAAC;AAEH,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;iBAGnC,CAAC;AAEH,eAAO,MAAM,oBAAoB;;;;;;iBAI/B,CAAC;AAEH,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;iBAWjC,CAAC;AAEH,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;iBAKnC,CAAC;AAEH,eAAO,MAAM,yBAAyB;;;;iBAAmC,CAAC;AAE1E,eAAO,MAAM,0BAA0B;;;;;;;iBAKrC,CAAC;AAEH,eAAO,MAAM,uBAAuB;;;;;iBAGlC,CAAC;AAEH,eAAO,MAAM,wBAAwB;;;;iBAAmC,CAAC;AACzE,eAAO,MAAM,oBAAoB;;;;iBAAmC,CAAC"}
@@ -0,0 +1,140 @@
1
+ /** Runtime schemas for every iLink JSON trust boundary. */
2
+ import { z } from 'zod';
3
+ const responseEnvelopeFields = {
4
+ ret: z.number().int().optional(),
5
+ errcode: z.number().int().optional(),
6
+ errmsg: z.string().optional(),
7
+ };
8
+ export const responseEnvelopeSchema = z.object(responseEnvelopeFields).passthrough();
9
+ export const baseInfoSchema = z.object({
10
+ channel_version: z.string().optional(),
11
+ bot_agent: z.string().optional(),
12
+ });
13
+ export const cdnMediaSchema = z.object({
14
+ encrypt_query_param: z.string().optional(),
15
+ aes_key: z.string().optional(),
16
+ encrypt_type: z.number().int().optional(),
17
+ full_url: z.string().optional(),
18
+ });
19
+ export const messageItemSchema = z.lazy(() => z.object({
20
+ type: z.number().int().optional(),
21
+ create_time_ms: z.number().optional(),
22
+ update_time_ms: z.number().optional(),
23
+ is_completed: z.boolean().optional(),
24
+ msg_id: z.string().optional(),
25
+ ref_msg: z.object({
26
+ message_item: messageItemSchema.optional(),
27
+ title: z.string().optional(),
28
+ }).optional(),
29
+ text_item: z.object({ text: z.string().optional() }).optional(),
30
+ image_item: z.object({
31
+ media: cdnMediaSchema.optional(),
32
+ thumb_media: cdnMediaSchema.optional(),
33
+ aeskey: z.string().optional(),
34
+ url: z.string().optional(),
35
+ mid_size: z.number().optional(),
36
+ thumb_size: z.number().optional(),
37
+ }).optional(),
38
+ voice_item: z.object({
39
+ media: cdnMediaSchema.optional(),
40
+ encode_type: z.number().int().optional(),
41
+ bits_per_sample: z.number().optional(),
42
+ sample_rate: z.number().optional(),
43
+ playtime: z.number().optional(),
44
+ text: z.string().optional(),
45
+ }).optional(),
46
+ file_item: z.object({
47
+ media: cdnMediaSchema.optional(),
48
+ file_name: z.string().optional(),
49
+ md5: z.string().optional(),
50
+ len: z.string().optional(),
51
+ }).optional(),
52
+ video_item: z.object({
53
+ media: cdnMediaSchema.optional(),
54
+ video_size: z.number().optional(),
55
+ play_length: z.number().optional(),
56
+ video_md5: z.string().optional(),
57
+ thumb_media: cdnMediaSchema.optional(),
58
+ thumb_size: z.number().optional(),
59
+ }).optional(),
60
+ tool_call_start_item: z.object({
61
+ tool_name: z.string().optional(),
62
+ tool_call_id: z.string().optional(),
63
+ }).optional(),
64
+ tool_call_result_item: z.object({
65
+ tool_name: z.string().optional(),
66
+ tool_call_id: z.string().optional(),
67
+ status: z.string().optional(),
68
+ }).optional(),
69
+ }));
70
+ export const messageSchema = z.object({
71
+ seq: z.number().optional(),
72
+ message_id: z.number().optional(),
73
+ from_user_id: z.string().optional(),
74
+ to_user_id: z.string().optional(),
75
+ client_id: z.string().optional(),
76
+ create_time_ms: z.number().optional(),
77
+ update_time_ms: z.number().optional(),
78
+ session_id: z.string().optional(),
79
+ group_id: z.string().optional(),
80
+ message_type: z.number().int().optional(),
81
+ message_state: z.number().int().optional(),
82
+ item_list: z.array(messageItemSchema).optional(),
83
+ context_token: z.string().optional(),
84
+ run_id: z.string().optional(),
85
+ });
86
+ export const getUploadUrlRequestSchema = z.object({
87
+ filekey: z.string().optional(),
88
+ media_type: z.number().int().optional(),
89
+ to_user_id: z.string().optional(),
90
+ rawsize: z.number().int().nonnegative().optional(),
91
+ rawfilemd5: z.string().optional(),
92
+ filesize: z.number().int().nonnegative().optional(),
93
+ thumb_rawsize: z.number().int().nonnegative().optional(),
94
+ thumb_rawfilemd5: z.string().optional(),
95
+ thumb_filesize: z.number().int().nonnegative().optional(),
96
+ no_need_thumb: z.boolean().optional(),
97
+ aeskey: z.string().optional(),
98
+ base_info: baseInfoSchema.optional(),
99
+ });
100
+ export const sendMessageRequestSchema = z.object({
101
+ msg: messageSchema.optional(),
102
+ base_info: baseInfoSchema.optional(),
103
+ });
104
+ export const qrCodeResponseSchema = z.object({
105
+ ...responseEnvelopeFields,
106
+ qrcode: z.string(),
107
+ qrcode_img_content: z.string(),
108
+ });
109
+ export const qrStatusResponseSchema = z.object({
110
+ ...responseEnvelopeFields,
111
+ status: z.enum([
112
+ 'wait', 'scaned', 'confirmed', 'expired', 'need_verifycode',
113
+ 'verify_code_blocked', 'scaned_but_redirect', 'binded_redirect',
114
+ ]).optional(),
115
+ bot_token: z.string().optional(),
116
+ ilink_bot_id: z.string().optional(),
117
+ baseurl: z.string().optional(),
118
+ ilink_user_id: z.string().optional(),
119
+ redirect_host: z.string().optional(),
120
+ });
121
+ export const getUpdatesResponseSchema = z.object({
122
+ ...responseEnvelopeFields,
123
+ msgs: z.array(messageSchema).optional(),
124
+ get_updates_buf: z.string().optional(),
125
+ longpolling_timeout_ms: z.number().optional(),
126
+ });
127
+ export const sendMessageResponseSchema = z.object(responseEnvelopeFields);
128
+ export const getUploadUrlResponseSchema = z.object({
129
+ ...responseEnvelopeFields,
130
+ upload_param: z.string().optional(),
131
+ thumb_upload_param: z.string().optional(),
132
+ upload_full_url: z.string().optional(),
133
+ });
134
+ export const getConfigResponseSchema = z.object({
135
+ ...responseEnvelopeFields,
136
+ typing_ticket: z.string().optional(),
137
+ });
138
+ export const sendTypingResponseSchema = z.object(responseEnvelopeFields);
139
+ export const notifyResponseSchema = z.object(responseEnvelopeFields);
140
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/ilink/schema.ts"],"names":[],"mappings":"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"}