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,292 @@
1
+ import path from "node:path";
2
+ import { AccessController } from "./access.js";
3
+ import { parseActionBlocks } from "./actions.js";
4
+ import { buildPrompt, chunkText } from "./format.js";
5
+ import { PromptBuffer } from "./prompt-buffer.js";
6
+ import { HybridCodexRunner } from "../codex/runner.js";
7
+ import { isWorkspaceAllowed } from "../state/config.js";
8
+ import { isStaleContextError } from "../weixin/api.js";
9
+ import { downloadInboundAttachments, sendLocalMediaFile } from "../weixin/media.js";
10
+ export class BridgeService {
11
+ options;
12
+ access;
13
+ buffers;
14
+ runner;
15
+ constructor(options) {
16
+ this.options = options;
17
+ this.access = new AccessController({
18
+ allowedSenderIds: options.config.allowedSenderIds,
19
+ pairedSenderIds: options.stateStore.listPairedSenderIds()
20
+ });
21
+ this.buffers = new PromptBuffer({
22
+ maxItems: options.config.maxBufferItems,
23
+ ttlMs: options.config.promptBufferTtlMs
24
+ });
25
+ this.runner = options.runner ?? new HybridCodexRunner({
26
+ backend: options.config.codexBackend,
27
+ codexBin: options.config.codexBin,
28
+ execSandbox: options.config.codexExecSandbox
29
+ });
30
+ }
31
+ async handleMessage(message) {
32
+ if (message.contextToken) {
33
+ this.options.stateStore.rememberContextToken(message.senderId, message.contextToken);
34
+ }
35
+ const access = this.access.requireAccess(message.senderId);
36
+ if (!access.allowed) {
37
+ await this.reply(message.senderId, access.message);
38
+ return;
39
+ }
40
+ this.options.stateStore.setPairedSenderIds(this.access.listPairedSenderIds());
41
+ this.options.stateStore.ensureActiveSession(message.senderId, this.options.config.defaultCwd);
42
+ const command = parseCommand(message.text);
43
+ if (command) {
44
+ await this.handleCommand(message, command);
45
+ return;
46
+ }
47
+ if (this.buffers.isActive(message.senderId)) {
48
+ const items = await this.promptItemsFromMessage(message);
49
+ for (const item of items) {
50
+ this.buffers.append(message.senderId, item);
51
+ }
52
+ await this.reply(message.senderId, "Buffered. Send /prompt done when ready.");
53
+ return;
54
+ }
55
+ await this.runCodexTurn(message, "", await this.promptItemsFromMessage(message));
56
+ }
57
+ async handleCommand(message, command) {
58
+ switch (command.name) {
59
+ case "help":
60
+ case "h":
61
+ await this.reply(message.senderId, helpText());
62
+ return;
63
+ case "status":
64
+ case "where":
65
+ await this.reply(message.senderId, await this.statusText(message.senderId));
66
+ return;
67
+ case "bind":
68
+ await this.bindWorkspace(message.senderId, command.arg);
69
+ return;
70
+ case "new":
71
+ this.options.stateStore.createSession(message.senderId, this.options.stateStore.getWorkspace(message.senderId) ?? this.options.config.defaultCwd);
72
+ await this.reply(message.senderId, "Created a new Codex session for the next message.");
73
+ return;
74
+ case "prompt":
75
+ await this.handlePromptCommand(message.senderId, command.arg);
76
+ return;
77
+ case "stop":
78
+ await this.runner.stop(this.options.stateStore.getThread(message.senderId));
79
+ await this.reply(message.senderId, "Stop signal sent.");
80
+ return;
81
+ default:
82
+ await this.reply(message.senderId, `Unknown command: /${command.name}. Send /help.`);
83
+ }
84
+ }
85
+ async bindWorkspace(senderId, rawPath) {
86
+ if (!rawPath.trim()) {
87
+ await this.reply(senderId, "Usage: /bind <absolute-workspace-path>");
88
+ return;
89
+ }
90
+ const workspace = path.resolve(rawPath.trim());
91
+ if (!isWorkspaceAllowed(workspace, this.options.config.allowedWorkspaces)) {
92
+ await this.reply(senderId, `Workspace is not allowed: ${workspace}`);
93
+ return;
94
+ }
95
+ this.options.stateStore.setWorkspace(senderId, workspace);
96
+ await this.reply(senderId, `Bound to workspace:\n${workspace}`);
97
+ }
98
+ async handlePromptCommand(senderId, arg) {
99
+ const sub = arg.trim().toLowerCase();
100
+ if (sub === "start") {
101
+ const result = this.buffers.start(senderId);
102
+ await this.reply(senderId, result.status === "started" ? "Prompt buffer started." : "Prompt buffer is already active.");
103
+ return;
104
+ }
105
+ if (sub === "done") {
106
+ const flushed = this.buffers.done(senderId);
107
+ if (flushed.status === "empty") {
108
+ await this.reply(senderId, "Prompt buffer is empty.");
109
+ return;
110
+ }
111
+ await this.runCodexTurn({ id: "buffer", senderId, text: "", attachments: [], raw: {} }, "", flushed.items);
112
+ return;
113
+ }
114
+ await this.reply(senderId, "Usage: /prompt start or /prompt done");
115
+ }
116
+ async promptItemsFromMessage(message) {
117
+ const items = [];
118
+ if (message.text.trim()) {
119
+ items.push({ kind: "text", text: message.text });
120
+ }
121
+ const attachments = message.attachments ?? [];
122
+ if (!attachments.length) {
123
+ return items;
124
+ }
125
+ try {
126
+ const downloaded = await downloadInboundAttachments({
127
+ rootDir: this.options.inboundDir ?? path.join(this.options.config.defaultCwd, ".codex-weixin-inbound"),
128
+ senderId: message.senderId,
129
+ messageId: message.id,
130
+ attachments,
131
+ maxBytes: this.options.config.maxInboundBytes,
132
+ fetch: this.options.mediaFetch
133
+ });
134
+ for (const attachment of downloaded) {
135
+ items.push({
136
+ kind: attachment.kind,
137
+ path: attachment.path,
138
+ label: attachment.label
139
+ });
140
+ }
141
+ }
142
+ catch (error) {
143
+ items.push({
144
+ kind: "text",
145
+ text: `[WeChat attachment download failed: ${error instanceof Error ? error.message : String(error)}]`
146
+ });
147
+ }
148
+ return items;
149
+ }
150
+ async runCodexTurn(message, text, attachments = []) {
151
+ const session = this.options.stateStore.ensureActiveSession(message.senderId, this.options.config.defaultCwd);
152
+ const workspace = this.options.stateStore.getWorkspace(message.senderId) ?? this.options.config.defaultCwd;
153
+ const threadId = this.options.stateStore.getThread(message.senderId) || undefined;
154
+ this.options.onTurnStatus?.({ senderId: message.senderId, sessionId: session.id, active: true });
155
+ try {
156
+ await this.withTyping(message.senderId, async () => {
157
+ console.log(`[codex-weixin] starting Codex turn for ${message.senderId} in ${workspace}`);
158
+ const result = await this.runner.run({
159
+ prompt: buildPrompt(text, attachments),
160
+ cwd: workspace,
161
+ threadId,
162
+ model: this.options.config.model,
163
+ effort: this.options.config.effort
164
+ });
165
+ console.log(`[codex-weixin] Codex turn completed for ${message.senderId}; text=${result.text.length} chars`);
166
+ if (result.threadId) {
167
+ this.options.stateStore.setThread(message.senderId, result.threadId);
168
+ }
169
+ const parsed = parseActionBlocks(result.text);
170
+ if (parsed.visibleText.trim()) {
171
+ for (const chunk of chunkText(parsed.visibleText)) {
172
+ await this.reply(message.senderId, chunk);
173
+ }
174
+ }
175
+ for (const action of parsed.actions.send) {
176
+ await this.sendLocalMedia(message.senderId, action);
177
+ }
178
+ });
179
+ }
180
+ finally {
181
+ this.options.onTurnStatus?.({ senderId: message.senderId, sessionId: session.id, active: false });
182
+ }
183
+ }
184
+ async sendLocalMedia(senderId, action) {
185
+ try {
186
+ await sendLocalMediaFile({
187
+ client: this.options.weixin,
188
+ toUserId: senderId,
189
+ contextToken: this.options.stateStore.getContextToken(senderId),
190
+ filePath: action.path,
191
+ kind: action.type
192
+ });
193
+ }
194
+ catch (error) {
195
+ await this.reply(senderId, `[codex-weixin] Failed to send ${action.type}: ${error instanceof Error ? error.message : String(error)}`);
196
+ }
197
+ }
198
+ async withTyping(senderId, run) {
199
+ const sendTyping = async (typing) => {
200
+ try {
201
+ await this.options.weixin.sendTyping({
202
+ toUserId: senderId,
203
+ contextToken: this.options.stateStore.getContextToken(senderId),
204
+ typing
205
+ });
206
+ }
207
+ catch (error) {
208
+ console.warn(`WeChat typing indicator failed for ${senderId}: ${error instanceof Error ? error.message : String(error)}`);
209
+ }
210
+ };
211
+ await sendTyping(true);
212
+ const timer = setInterval(() => {
213
+ void sendTyping(true);
214
+ }, 5_000);
215
+ try {
216
+ await run();
217
+ }
218
+ finally {
219
+ clearInterval(timer);
220
+ await sendTyping(false);
221
+ }
222
+ }
223
+ async statusText(senderId) {
224
+ const session = this.options.stateStore.getActiveSession(senderId);
225
+ const workspace = session?.workspace ?? this.options.config.defaultCwd;
226
+ let runtime = {};
227
+ try {
228
+ runtime = await this.runner.getRuntimeInfo(workspace, session?.threadId);
229
+ }
230
+ catch (error) {
231
+ console.warn(`Codex runtime info unavailable: ${error instanceof Error ? error.message : String(error)}`);
232
+ }
233
+ return [
234
+ "codex-weixin status",
235
+ `sender: ${senderId}`,
236
+ `session: ${session?.title ?? "(new)"}`,
237
+ `workspace: ${workspace}`,
238
+ `thread: ${session?.threadId || "(new)"}`,
239
+ `backend: ${this.options.config.codexBackend}`,
240
+ `exec sandbox: ${this.options.config.codexExecSandbox ?? "(Codex default)"}`,
241
+ `model: ${this.options.config.model ?? runtime.model ?? "(Codex default)"}`,
242
+ `effort: ${this.options.config.effort ?? runtime.effort ?? "(Codex default)"}`
243
+ ].join("\n");
244
+ }
245
+ async reply(senderId, text) {
246
+ const contextToken = this.options.stateStore.getContextToken(senderId);
247
+ try {
248
+ console.log(`[codex-weixin] sending reply to ${senderId}; text=${text.length} chars`);
249
+ await this.options.weixin.sendText({ toUserId: senderId, text, contextToken });
250
+ console.log(`[codex-weixin] sent reply to ${senderId}`);
251
+ }
252
+ catch (error) {
253
+ if (isStaleContextError(error)) {
254
+ console.warn(`WeChat context token is stale for ${senderId}; ask user to send a fresh message.`);
255
+ return;
256
+ }
257
+ throw error;
258
+ }
259
+ }
260
+ allowSender(senderId) {
261
+ this.access.allow(senderId);
262
+ this.options.stateStore.setPairedSenderIds(this.access.listPairedSenderIds());
263
+ }
264
+ removeSender(senderId) {
265
+ this.access.remove(senderId);
266
+ this.options.stateStore.setPairedSenderIds(this.access.listPairedSenderIds());
267
+ }
268
+ listAllowedSenders() {
269
+ return this.access.listPairedSenderIds();
270
+ }
271
+ }
272
+ function parseCommand(text) {
273
+ const trimmed = text.trim();
274
+ if (!trimmed.startsWith("/")) {
275
+ return undefined;
276
+ }
277
+ const [name, ...rest] = trimmed.slice(1).split(/\s+/);
278
+ return { name: name.toLowerCase(), arg: rest.join(" ") };
279
+ }
280
+ function helpText() {
281
+ return [
282
+ "codex-weixin commands:",
283
+ "/help - show commands",
284
+ "/status - show current binding",
285
+ "/bind <absolute-path> - bind this chat to a workspace",
286
+ "/new - create a new managed Codex session",
287
+ "/prompt start - buffer multiple WeChat messages",
288
+ "/prompt done - submit buffered prompt",
289
+ "/stop - interrupt the current Codex task"
290
+ ].join("\n");
291
+ }
292
+ //# sourceMappingURL=service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/bridge/service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,74 @@
1
+ import { type CodexRunResult } from "./exec-runner.js";
2
+ export type AppServerRunnerOptions = {
3
+ codexBin?: string;
4
+ requestTimeoutMs?: number;
5
+ };
6
+ export type CodexRunnerInput = {
7
+ prompt: string;
8
+ cwd: string;
9
+ threadId?: string;
10
+ model?: string;
11
+ effort?: string;
12
+ };
13
+ export type CodexHistoryMessage = {
14
+ id: string;
15
+ role: "user" | "assistant";
16
+ text: string;
17
+ createdAt?: string;
18
+ };
19
+ export type CodexRuntimeInfo = {
20
+ model?: string;
21
+ effort?: string;
22
+ provider?: string;
23
+ };
24
+ export type CodexModelOption = {
25
+ model: string;
26
+ displayName: string;
27
+ description: string;
28
+ isDefault: boolean;
29
+ defaultEffort?: string;
30
+ supportedEfforts: Array<{
31
+ effort: string;
32
+ description: string;
33
+ }>;
34
+ };
35
+ export declare class AppServerCodexRunner {
36
+ private readonly options;
37
+ private child?;
38
+ private lines?;
39
+ private connectPromise?;
40
+ private initialized;
41
+ private closed;
42
+ private nextId;
43
+ private stderr;
44
+ private readonly pending;
45
+ private readonly activeTurns;
46
+ private readonly turnWaiters;
47
+ private readonly turnEvents;
48
+ private readonly turnTexts;
49
+ private readonly completedTurns;
50
+ private readonly runtimeInfoByThread;
51
+ private modelOptions?;
52
+ constructor(options?: AppServerRunnerOptions);
53
+ run(input: CodexRunnerInput): Promise<CodexRunResult>;
54
+ listSessions(): Promise<unknown>;
55
+ getHistory(threadId: string): Promise<CodexHistoryMessage[]>;
56
+ getRuntimeInfo(cwd: string, threadId?: string): Promise<CodexRuntimeInfo>;
57
+ listModels(): Promise<CodexModelOption[]>;
58
+ stop(threadId?: string): Promise<void>;
59
+ close(): void;
60
+ private ensureConnected;
61
+ private startAppServer;
62
+ private request;
63
+ private notify;
64
+ private send;
65
+ private handleMessage;
66
+ private handleNotification;
67
+ private waitForTurn;
68
+ private finishTurn;
69
+ private appendTurnEvent;
70
+ private handleServerRequest;
71
+ private handleChildFailure;
72
+ private failTransport;
73
+ }
74
+ export declare function parseThreadHistory(thread: Record<string, unknown> | undefined): CodexHistoryMessage[];