codex-weixin 0.2.1

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 (93) hide show
  1. package/CHANGELOG.md +45 -0
  2. package/LICENSE +21 -0
  3. package/NOTICE +5 -0
  4. package/README.en.md +200 -0
  5. package/README.md +210 -0
  6. package/dist/bridge/access.d.ts +21 -0
  7. package/dist/bridge/access.js +31 -0
  8. package/dist/bridge/access.js.map +1 -0
  9. package/dist/bridge/actions.d.ts +21 -0
  10. package/dist/bridge/actions.js +120 -0
  11. package/dist/bridge/actions.js.map +1 -0
  12. package/dist/bridge/errors.d.ts +1 -0
  13. package/dist/bridge/errors.js +15 -0
  14. package/dist/bridge/errors.js.map +1 -0
  15. package/dist/bridge/format.d.ts +14 -0
  16. package/dist/bridge/format.js +62 -0
  17. package/dist/bridge/format.js.map +1 -0
  18. package/dist/bridge/prompt-buffer.d.ts +45 -0
  19. package/dist/bridge/prompt-buffer.js +56 -0
  20. package/dist/bridge/prompt-buffer.js.map +1 -0
  21. package/dist/bridge/service.d.ts +38 -0
  22. package/dist/bridge/service.js +292 -0
  23. package/dist/bridge/service.js.map +1 -0
  24. package/dist/codex/app-server-runner.d.ts +74 -0
  25. package/dist/codex/app-server-runner.js +514 -0
  26. package/dist/codex/app-server-runner.js.map +1 -0
  27. package/dist/codex/exec-runner.d.ts +36 -0
  28. package/dist/codex/exec-runner.js +153 -0
  29. package/dist/codex/exec-runner.js.map +1 -0
  30. package/dist/codex/runner.d.ts +22 -0
  31. package/dist/codex/runner.js +57 -0
  32. package/dist/codex/runner.js.map +1 -0
  33. package/dist/codex/sandbox.d.ts +3 -0
  34. package/dist/codex/sandbox.js +15 -0
  35. package/dist/codex/sandbox.js.map +1 -0
  36. package/dist/index.d.ts +15 -0
  37. package/dist/index.js +16 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/server/account-manager.d.ts +94 -0
  40. package/dist/server/account-manager.js +468 -0
  41. package/dist/server/account-manager.js.map +1 -0
  42. package/dist/server/arguments.d.ts +3 -0
  43. package/dist/server/arguments.js +25 -0
  44. package/dist/server/arguments.js.map +1 -0
  45. package/dist/server/http-server.d.ts +23 -0
  46. package/dist/server/http-server.js +481 -0
  47. package/dist/server/http-server.js.map +1 -0
  48. package/dist/server/index.d.ts +2 -0
  49. package/dist/server/index.js +69 -0
  50. package/dist/server/index.js.map +1 -0
  51. package/dist/server/login-manager.d.ts +27 -0
  52. package/dist/server/login-manager.js +49 -0
  53. package/dist/server/login-manager.js.map +1 -0
  54. package/dist/server/process-lock.d.ts +5 -0
  55. package/dist/server/process-lock.js +63 -0
  56. package/dist/server/process-lock.js.map +1 -0
  57. package/dist/state/config.d.ts +19 -0
  58. package/dist/state/config.js +41 -0
  59. package/dist/state/config.js.map +1 -0
  60. package/dist/state/json-store.d.ts +3 -0
  61. package/dist/state/json-store.js +23 -0
  62. package/dist/state/json-store.js.map +1 -0
  63. package/dist/state/paths.d.ts +12 -0
  64. package/dist/state/paths.js +28 -0
  65. package/dist/state/paths.js.map +1 -0
  66. package/dist/state/runtime-state.d.ts +57 -0
  67. package/dist/state/runtime-state.js +212 -0
  68. package/dist/state/runtime-state.js.map +1 -0
  69. package/dist/web/app.js +958 -0
  70. package/dist/web/index.html +273 -0
  71. package/dist/web/styles.css +324 -0
  72. package/dist/web/vendor/lucide.min.js +12 -0
  73. package/dist/web/vendor/marked.umd.js +79 -0
  74. package/dist/web/vendor/purify.min.js +3 -0
  75. package/dist/weixin/accounts.d.ts +22 -0
  76. package/dist/weixin/accounts.js +66 -0
  77. package/dist/weixin/accounts.js.map +1 -0
  78. package/dist/weixin/api.d.ts +75 -0
  79. package/dist/weixin/api.js +191 -0
  80. package/dist/weixin/api.js.map +1 -0
  81. package/dist/weixin/login.d.ts +29 -0
  82. package/dist/weixin/login.js +100 -0
  83. package/dist/weixin/login.js.map +1 -0
  84. package/dist/weixin/media.d.ts +32 -0
  85. package/dist/weixin/media.js +266 -0
  86. package/dist/weixin/media.js.map +1 -0
  87. package/dist/weixin/messages.d.ts +24 -0
  88. package/dist/weixin/messages.js +87 -0
  89. package/dist/weixin/messages.js.map +1 -0
  90. package/dist/weixin/monitor.d.ts +22 -0
  91. package/dist/weixin/monitor.js +110 -0
  92. package/dist/weixin/monitor.js.map +1 -0
  93. package/package.json +61 -0
@@ -0,0 +1,110 @@
1
+ import { normalizeWeixinMessage } from "./messages.js";
2
+ export class PollRetryBackoff {
3
+ initialMs;
4
+ maxMs;
5
+ currentMs;
6
+ constructor(initialMs, maxMs) {
7
+ this.initialMs = Math.max(0, initialMs);
8
+ this.maxMs = Math.max(this.initialMs, maxMs);
9
+ this.currentMs = this.initialMs;
10
+ }
11
+ next() {
12
+ const delayMs = this.currentMs;
13
+ this.currentMs = Math.min(this.maxMs, this.currentMs === 0 ? 0 : this.currentMs * 2);
14
+ return delayMs;
15
+ }
16
+ reset() {
17
+ this.currentMs = this.initialMs;
18
+ }
19
+ }
20
+ export async function monitorWeixin(options) {
21
+ let syncKey = options.initialSyncKey;
22
+ const pollIntervalMs = options.pollIntervalMs ?? 1000;
23
+ const retryBackoff = new PollRetryBackoff(pollIntervalMs, options.maxPollRetryMs ?? 30_000);
24
+ while (!options.signal?.aborted) {
25
+ let batch;
26
+ try {
27
+ batch = parseUpdateBatch(await options.client.getUpdates(syncKey, options.signal));
28
+ if (batch.syncKey && batch.syncKey !== syncKey) {
29
+ syncKey = batch.syncKey;
30
+ await options.onSyncKey?.(syncKey);
31
+ }
32
+ }
33
+ catch (error) {
34
+ const retryMs = retryBackoff.next();
35
+ console.error(`[codex-weixin] monitor poll failed; retrying in ${retryMs}ms: ${errorDetail(error)}`);
36
+ await delay(retryMs, options.signal);
37
+ continue;
38
+ }
39
+ retryBackoff.reset();
40
+ const { messages } = batch;
41
+ if (messages.length) {
42
+ console.log(`[codex-weixin] received ${messages.length} update(s)`);
43
+ }
44
+ for (const raw of messages) {
45
+ let normalized;
46
+ try {
47
+ normalized = normalizeWeixinMessage(raw);
48
+ }
49
+ catch (error) {
50
+ console.error(`[codex-weixin] failed to normalize message: ${errorDetail(error)}`);
51
+ continue;
52
+ }
53
+ if (!normalized) {
54
+ continue;
55
+ }
56
+ if (options.claimMessage && !options.claimMessage(normalized)) {
57
+ console.log(`[codex-weixin] skipped duplicate message ${normalized.id} from ${normalized.senderId}`);
58
+ continue;
59
+ }
60
+ try {
61
+ console.log(`[codex-weixin] handling message ${normalized.id} from ${normalized.senderId}`);
62
+ await options.onMessage(normalized);
63
+ console.log(`[codex-weixin] handled message ${normalized.id} from ${normalized.senderId}`);
64
+ }
65
+ catch (error) {
66
+ console.error(`[codex-weixin] message handling failed for ${normalized.senderId}: ${errorDetail(error)}`);
67
+ try {
68
+ await options.onMessageError?.(error, normalized);
69
+ }
70
+ catch (reportError) {
71
+ console.error(`[codex-weixin] failed to report message error for ${normalized.senderId}: ${errorDetail(reportError)}`);
72
+ }
73
+ }
74
+ }
75
+ if (!messages.length) {
76
+ await delay(pollIntervalMs, options.signal);
77
+ }
78
+ }
79
+ }
80
+ function parseUpdateBatch(value) {
81
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
82
+ throw new Error("getUpdates response must be an object");
83
+ }
84
+ const response = value;
85
+ const messages = response.msgs ?? response.message_list ?? response.messages ?? [];
86
+ if (!Array.isArray(messages)) {
87
+ throw new Error("getUpdates response messages must be an array");
88
+ }
89
+ const syncKey = [response.get_updates_buf, response.next_sync_key, response.sync_key]
90
+ .find((candidate) => typeof candidate === "string");
91
+ return { syncKey, messages: messages };
92
+ }
93
+ function errorDetail(error) {
94
+ return error instanceof Error ? error.stack ?? error.message : String(error);
95
+ }
96
+ function delay(ms, signal) {
97
+ if (ms <= 0 || signal?.aborted) {
98
+ return Promise.resolve();
99
+ }
100
+ return new Promise((resolve) => {
101
+ const finish = () => {
102
+ clearTimeout(timer);
103
+ signal?.removeEventListener("abort", finish);
104
+ resolve();
105
+ };
106
+ const timer = setTimeout(finish, ms);
107
+ signal?.addEventListener("abort", finish, { once: true });
108
+ });
109
+ }
110
+ //# sourceMappingURL=monitor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"monitor.js","sourceRoot":"","sources":["../../src/weixin/monitor.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,61 @@
1
+ {
2
+ "name": "codex-weixin",
3
+ "version": "0.2.1",
4
+ "description": "Local multi-account WeChat server for OpenAI Codex.",
5
+ "license": "MIT",
6
+ "author": "Xuechao Zou",
7
+ "homepage": "https://github.com/XavierJiezou/codex-weixin#readme",
8
+ "bugs": {
9
+ "url": "https://github.com/XavierJiezou/codex-weixin/issues"
10
+ },
11
+ "repository": {
12
+ "type": "git",
13
+ "url": "git+https://github.com/XavierJiezou/codex-weixin.git"
14
+ },
15
+ "keywords": [
16
+ "codex",
17
+ "wechat",
18
+ "weixin",
19
+ "openai",
20
+ "bridge"
21
+ ],
22
+ "type": "module",
23
+ "bin": {
24
+ "codex-weixin": "dist/server/index.js"
25
+ },
26
+ "files": [
27
+ "dist/",
28
+ "README.md",
29
+ "README.en.md",
30
+ "CHANGELOG.md",
31
+ "LICENSE",
32
+ "NOTICE"
33
+ ],
34
+ "scripts": {
35
+ "build": "tsc -p tsconfig.json && npm run copy:web",
36
+ "copy:web": "node scripts/copy-web-assets.mjs",
37
+ "clean": "node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\"",
38
+ "dev": "tsx src/server/index.ts",
39
+ "start": "node dist/server/index.js",
40
+ "typecheck": "tsc --noEmit",
41
+ "test": "node --test --import tsx test/*.test.ts",
42
+ "prepack": "npm run clean && npm run build"
43
+ },
44
+ "engines": {
45
+ "node": ">=22"
46
+ },
47
+ "dependencies": {
48
+ "dompurify": "^3.4.12",
49
+ "lucide": "^0.468.0",
50
+ "marked": "^18.0.6",
51
+ "open": "^10.1.0",
52
+ "qrcode": "^1.5.4",
53
+ "zod": "^4.3.6"
54
+ },
55
+ "devDependencies": {
56
+ "@types/node": "^22.10.2",
57
+ "@types/qrcode": "^1.5.5",
58
+ "tsx": "^4.19.2",
59
+ "typescript": "^5.8.3"
60
+ }
61
+ }