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,153 @@
1
+ import { spawn } from "node:child_process";
2
+ import fs from "node:fs";
3
+ import path from "node:path";
4
+ export function buildCodexExecArgs(input) {
5
+ if (input.threadId) {
6
+ if (input.sandbox) {
7
+ return [
8
+ "exec",
9
+ "--skip-git-repo-check",
10
+ "--sandbox",
11
+ input.sandbox,
12
+ "--json",
13
+ "resume",
14
+ input.threadId,
15
+ input.prompt
16
+ ];
17
+ }
18
+ return ["exec", "resume", "--skip-git-repo-check", "--json", input.threadId, input.prompt];
19
+ }
20
+ return [
21
+ "exec",
22
+ "--skip-git-repo-check",
23
+ ...(input.sandbox ? ["--sandbox", input.sandbox] : []),
24
+ "--json",
25
+ input.prompt
26
+ ];
27
+ }
28
+ export class CodexExecRunner {
29
+ options;
30
+ activeRuns = [];
31
+ constructor(options = {}) {
32
+ this.options = options;
33
+ }
34
+ run(input) {
35
+ const codexCommand = resolveCodexCommand(this.options.codexBin ?? "codex");
36
+ const timeoutMs = this.options.timeoutMs ?? 600_000;
37
+ const args = buildCodexExecArgs({
38
+ ...input,
39
+ sandbox: this.options.sandbox ?? input.sandbox
40
+ });
41
+ return new Promise((resolve, reject) => {
42
+ const child = spawn(codexCommand.command, [...codexCommand.argsPrefix, ...args], {
43
+ cwd: input.cwd,
44
+ stdio: ["ignore", "pipe", "pipe"],
45
+ shell: false
46
+ });
47
+ const activeRun = { child, threadId: input.threadId };
48
+ this.activeRuns.push(activeRun);
49
+ const removeActiveRun = () => {
50
+ const index = this.activeRuns.indexOf(activeRun);
51
+ if (index >= 0) {
52
+ this.activeRuns.splice(index, 1);
53
+ }
54
+ };
55
+ const timer = setTimeout(() => {
56
+ child.kill();
57
+ reject(new Error(`codex exec timed out after ${timeoutMs}ms`));
58
+ }, timeoutMs);
59
+ const stdout = [];
60
+ const stderr = [];
61
+ child.stdout.on("data", (chunk) => stdout.push(chunk));
62
+ child.stderr.on("data", (chunk) => stderr.push(chunk));
63
+ child.on("error", (error) => {
64
+ clearTimeout(timer);
65
+ removeActiveRun();
66
+ reject(error);
67
+ });
68
+ child.on("close", (code) => {
69
+ clearTimeout(timer);
70
+ removeActiveRun();
71
+ const raw = Buffer.concat(stdout).toString("utf8");
72
+ const err = Buffer.concat(stderr).toString("utf8");
73
+ if (code !== 0) {
74
+ reject(formatCodexExecFailure(code, err));
75
+ return;
76
+ }
77
+ const parsed = parseCodexExecOutput(raw);
78
+ resolve({ raw, text: parsed.text, threadId: parsed.threadId });
79
+ });
80
+ });
81
+ }
82
+ async stop(threadId) {
83
+ const target = threadId
84
+ ? [...this.activeRuns].reverse().find((run) => run.threadId === threadId)
85
+ : this.activeRuns.at(-1);
86
+ target?.child.kill();
87
+ }
88
+ close() {
89
+ for (const run of this.activeRuns.splice(0)) {
90
+ run.child.kill();
91
+ }
92
+ }
93
+ }
94
+ export function formatCodexExecFailure(code, stderr) {
95
+ const detail = stderr.trim();
96
+ const base = `codex exec exited with code ${code ?? "unknown"}: ${detail}`;
97
+ if (/CreateProcessAsUserW failed:\s*1312/i.test(detail)) {
98
+ return new Error(`${base}\nWindows background sandbox startup failed. ` +
99
+ `Set "codexExecSandbox": "danger-full-access" in ~/.codex-weixin/config.json only if you accept full access to this machine.`);
100
+ }
101
+ return new Error(base);
102
+ }
103
+ export function resolveCodexCommand(codexBin) {
104
+ if (/\.(?:js|mjs|cjs)$/i.test(codexBin)) {
105
+ return { command: process.execPath, argsPrefix: [codexBin] };
106
+ }
107
+ if (process.platform !== "win32") {
108
+ return { command: codexBin, argsPrefix: [] };
109
+ }
110
+ const npmShim = process.env.CHAT_CODEX_BIN;
111
+ const npmRoot = npmShim ? path.dirname(npmShim) : "";
112
+ const bundledCli = npmRoot
113
+ ? path.join(npmRoot, "node_modules", "@openai", "codex", "bin", "codex.js")
114
+ : "";
115
+ if (bundledCli && fs.existsSync(bundledCli)) {
116
+ return { command: process.execPath, argsPrefix: [bundledCli] };
117
+ }
118
+ return { command: codexBin, argsPrefix: [] };
119
+ }
120
+ export function parseCodexExecOutput(raw) {
121
+ const lines = raw.split(/\r?\n/).filter(Boolean);
122
+ let lastText = "";
123
+ let threadId;
124
+ for (const line of lines) {
125
+ try {
126
+ const event = JSON.parse(line);
127
+ const type = String(event.type ?? event.event ?? "");
128
+ if (type === "thread.started" && typeof event.thread_id === "string") {
129
+ threadId = event.thread_id;
130
+ continue;
131
+ }
132
+ const item = event.item;
133
+ if (type === "item.completed" && item?.type === "agent_message" && typeof item.text === "string") {
134
+ lastText = item.text;
135
+ continue;
136
+ }
137
+ if (/message|response|final|output/i.test(type)) {
138
+ const value = event.text ?? event.content ?? event.message;
139
+ if (typeof value === "string") {
140
+ lastText = value;
141
+ }
142
+ }
143
+ }
144
+ catch {
145
+ lastText = line;
146
+ }
147
+ }
148
+ return { text: lastText || raw.trim(), threadId };
149
+ }
150
+ export function extractFinalText(raw) {
151
+ return parseCodexExecOutput(raw).text;
152
+ }
153
+ //# sourceMappingURL=exec-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exec-runner.js","sourceRoot":"","sources":["../../src/codex/exec-runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import { type CodexHistoryMessage, type CodexModelOption, type CodexRunnerInput, type CodexRuntimeInfo } from "./app-server-runner.js";
2
+ import { type CodexRunResult } from "./exec-runner.js";
3
+ import type { CodexExecSandbox } from "./sandbox.js";
4
+ export type CodexBackend = "auto" | "app-server" | "exec";
5
+ export type HybridCodexRunnerOptions = {
6
+ backend: CodexBackend;
7
+ codexBin?: string;
8
+ execSandbox?: CodexExecSandbox;
9
+ timeoutMs?: number;
10
+ };
11
+ export declare class HybridCodexRunner {
12
+ private readonly options;
13
+ private readonly appServer;
14
+ private readonly exec;
15
+ constructor(options: HybridCodexRunnerOptions);
16
+ run(input: CodexRunnerInput): Promise<CodexRunResult>;
17
+ stop(threadId?: string): Promise<void>;
18
+ getHistory(threadId: string): Promise<CodexHistoryMessage[]>;
19
+ getRuntimeInfo(cwd: string, threadId?: string): Promise<CodexRuntimeInfo>;
20
+ listModels(): Promise<CodexModelOption[]>;
21
+ close(): void;
22
+ }
@@ -0,0 +1,57 @@
1
+ import { AppServerCodexRunner } from "./app-server-runner.js";
2
+ import { CodexExecRunner } from "./exec-runner.js";
3
+ export class HybridCodexRunner {
4
+ options;
5
+ appServer;
6
+ exec;
7
+ constructor(options) {
8
+ this.options = options;
9
+ this.appServer = new AppServerCodexRunner({
10
+ codexBin: options.codexBin,
11
+ requestTimeoutMs: options.timeoutMs
12
+ });
13
+ this.exec = new CodexExecRunner({
14
+ codexBin: options.codexBin,
15
+ sandbox: options.execSandbox,
16
+ timeoutMs: options.timeoutMs
17
+ });
18
+ }
19
+ async run(input) {
20
+ if (this.options.backend === "exec") {
21
+ return this.exec.run(input);
22
+ }
23
+ try {
24
+ return await this.appServer.run(input);
25
+ }
26
+ catch (error) {
27
+ if (this.options.backend === "app-server") {
28
+ throw error;
29
+ }
30
+ const fallback = await this.exec.run(input);
31
+ return {
32
+ ...fallback,
33
+ text: `Warning: Codex app-server was unavailable, used codex exec fallback.\n\n${fallback.text}`
34
+ };
35
+ }
36
+ }
37
+ async stop(threadId) {
38
+ await Promise.all([
39
+ this.appServer.stop(threadId),
40
+ this.exec.stop(threadId)
41
+ ]);
42
+ }
43
+ async getHistory(threadId) {
44
+ return this.appServer.getHistory(threadId);
45
+ }
46
+ async getRuntimeInfo(cwd, threadId) {
47
+ return this.appServer.getRuntimeInfo(cwd, threadId);
48
+ }
49
+ async listModels() {
50
+ return this.appServer.listModels();
51
+ }
52
+ close() {
53
+ this.appServer.close();
54
+ this.exec.close();
55
+ }
56
+ }
57
+ //# sourceMappingURL=runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/codex/runner.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EAKrB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,eAAe,EAAuB,MAAM,kBAAkB,CAAC;AAYxE,MAAM,OAAO,iBAAiB;IAIC;IAHZ,SAAS,CAAuB;IAChC,IAAI,CAAkB;IAEvC,YAA6B,OAAiC;QAAjC,YAAO,GAAP,OAAO,CAA0B;QAC5D,IAAI,CAAC,SAAS,GAAG,IAAI,oBAAoB,CAAC;YACxC,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,gBAAgB,EAAE,OAAO,CAAC,SAAS;SACpC,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,GAAG,IAAI,eAAe,CAAC;YAC9B,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,OAAO,EAAE,OAAO,CAAC,WAAW;YAC5B,SAAS,EAAE,OAAO,CAAC,SAAS;SAC7B,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,KAAuB;QAC/B,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,KAAK,MAAM,EAAE,CAAC;YACpC,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC9B,CAAC;QACD,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACzC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,KAAK,YAAY,EAAE,CAAC;gBAC1C,MAAM,KAAK,CAAC;YACd,CAAC;YACD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAC5C,OAAO;gBACL,GAAG,QAAQ;gBACX,IAAI,EAAE,2EAA2E,QAAQ,CAAC,IAAI,EAAE;aACjG,CAAC;QACJ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,QAAiB;QAC1B,MAAM,OAAO,CAAC,GAAG,CAAC;YAChB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC;YAC7B,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC;SACzB,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,QAAgB;QAC/B,OAAO,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,GAAW,EAAE,QAAiB;QACjD,OAAO,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IACtD,CAAC;IAED,KAAK,CAAC,UAAU;QACd,OAAO,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,CAAC;IACrC,CAAC;IAED,KAAK;QACH,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;QACvB,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;IACpB,CAAC;CACF"}
@@ -0,0 +1,3 @@
1
+ export declare const CODEX_EXEC_SANDBOXES: readonly ["read-only", "workspace-write", "danger-full-access"];
2
+ export type CodexExecSandbox = typeof CODEX_EXEC_SANDBOXES[number];
3
+ export declare function parseCodexExecSandbox(value: unknown): CodexExecSandbox | undefined;
@@ -0,0 +1,15 @@
1
+ export const CODEX_EXEC_SANDBOXES = [
2
+ "read-only",
3
+ "workspace-write",
4
+ "danger-full-access"
5
+ ];
6
+ export function parseCodexExecSandbox(value) {
7
+ if (value === undefined) {
8
+ return undefined;
9
+ }
10
+ if (typeof value === "string" && CODEX_EXEC_SANDBOXES.includes(value)) {
11
+ return value;
12
+ }
13
+ throw new Error(`Invalid codexExecSandbox: ${String(value)}. Expected one of: ${CODEX_EXEC_SANDBOXES.join(", ")}`);
14
+ }
15
+ //# sourceMappingURL=sandbox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sandbox.js","sourceRoot":"","sources":["../../src/codex/sandbox.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,WAAW;IACX,iBAAiB;IACjB,oBAAoB;CACZ,CAAC;AAIX,MAAM,UAAU,qBAAqB,CAAC,KAAc;IAClD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,oBAAoB,CAAC,QAAQ,CAAC,KAAyB,CAAC,EAAE,CAAC;QAC1F,OAAO,KAAyB,CAAC;IACnC,CAAC;IACD,MAAM,IAAI,KAAK,CACb,6BAA6B,MAAM,CAAC,KAAK,CAAC,sBAAsB,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAClG,CAAC;AACJ,CAAC"}
@@ -0,0 +1,15 @@
1
+ export * from "./bridge/access.js";
2
+ export * from "./bridge/actions.js";
3
+ export * from "./bridge/format.js";
4
+ export * from "./bridge/prompt-buffer.js";
5
+ export * from "./bridge/service.js";
6
+ export * from "./codex/exec-runner.js";
7
+ export * from "./codex/runner.js";
8
+ export * from "./state/config.js";
9
+ export * from "./state/paths.js";
10
+ export * from "./state/runtime-state.js";
11
+ export * from "./weixin/accounts.js";
12
+ export * from "./weixin/api.js";
13
+ export * from "./weixin/media.js";
14
+ export * from "./weixin/messages.js";
15
+ export * from "./weixin/monitor.js";
package/dist/index.js ADDED
@@ -0,0 +1,16 @@
1
+ export * from "./bridge/access.js";
2
+ export * from "./bridge/actions.js";
3
+ export * from "./bridge/format.js";
4
+ export * from "./bridge/prompt-buffer.js";
5
+ export * from "./bridge/service.js";
6
+ export * from "./codex/exec-runner.js";
7
+ export * from "./codex/runner.js";
8
+ export * from "./state/config.js";
9
+ export * from "./state/paths.js";
10
+ export * from "./state/runtime-state.js";
11
+ export * from "./weixin/accounts.js";
12
+ export * from "./weixin/api.js";
13
+ export * from "./weixin/media.js";
14
+ export * from "./weixin/messages.js";
15
+ export * from "./weixin/monitor.js";
16
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,0BAA0B,CAAC;AACzC,cAAc,sBAAsB,CAAC;AACrC,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC"}
@@ -0,0 +1,94 @@
1
+ import { BridgeService } from "../bridge/service.js";
2
+ import type { CodexHistoryMessage, CodexModelOption, CodexRuntimeInfo } from "../codex/app-server-runner.js";
3
+ import { HybridCodexRunner } from "../codex/runner.js";
4
+ import { type CodexWeixinConfig } from "../state/config.js";
5
+ import { type StatePaths } from "../state/paths.js";
6
+ import { type ManagedSession } from "../state/runtime-state.js";
7
+ import { type PublicWeixinAccount, type WeixinAccount } from "../weixin/accounts.js";
8
+ import { WeixinApiClient } from "../weixin/api.js";
9
+ import { type MonitorOptions } from "../weixin/monitor.js";
10
+ export type AccountRunStatus = "stopped" | "starting" | "running" | "error";
11
+ export type AccountSummary = PublicWeixinAccount & {
12
+ status: AccountRunStatus;
13
+ error?: string;
14
+ pairedSenderIds: string[];
15
+ lastActiveSenderId?: string;
16
+ sessionCount: number;
17
+ };
18
+ export type AccountSession = ManagedSession & {
19
+ accountId: string;
20
+ active: boolean;
21
+ responding: boolean;
22
+ };
23
+ export type SessionChatResult = {
24
+ threadId: string;
25
+ message: SessionHistoryMessage;
26
+ };
27
+ export type SessionUpload = {
28
+ name: string;
29
+ data: Buffer;
30
+ };
31
+ export type SessionMessageAttachment = {
32
+ index: number;
33
+ type: "image" | "file" | "video";
34
+ name: string;
35
+ size?: number;
36
+ available: boolean;
37
+ };
38
+ export type SessionHistoryMessage = CodexHistoryMessage & {
39
+ attachments: SessionMessageAttachment[];
40
+ };
41
+ export type SessionAttachmentFile = SessionMessageAttachment & {
42
+ path: string;
43
+ };
44
+ export type AccountManagerOptions = {
45
+ paths: StatePaths;
46
+ configProvider?: () => CodexWeixinConfig;
47
+ clientFactory?: (account: WeixinAccount) => WeixinApiClient;
48
+ bridgeFactory?: (input: ConstructorParameters<typeof BridgeService>[0]) => BridgeService;
49
+ monitor?: (options: MonitorOptions) => Promise<void>;
50
+ runnerFactory?: (config: CodexWeixinConfig) => HybridCodexRunner;
51
+ };
52
+ export declare class AccountManager {
53
+ private readonly options;
54
+ private readonly entries;
55
+ private readonly respondingSessions;
56
+ private readonly configProvider;
57
+ private readonly clientFactory;
58
+ private readonly bridgeFactory;
59
+ private readonly monitor;
60
+ private readonly runnerFactory;
61
+ private runner?;
62
+ constructor(options: AccountManagerOptions);
63
+ startAll(): Promise<void>;
64
+ stopAll(): Promise<void>;
65
+ restartRunning(): Promise<void>;
66
+ startAccount(accountId: string, persist?: boolean): Promise<AccountSummary>;
67
+ stopAccount(accountId: string, persist?: boolean): Promise<AccountSummary>;
68
+ removeAccount(accountId: string): Promise<void>;
69
+ renameAccount(accountId: string, displayName: string): AccountSummary;
70
+ listAccounts(): AccountSummary[];
71
+ listSessions(): AccountSession[];
72
+ getCodexRuntimeInfo(): Promise<CodexRuntimeInfo>;
73
+ getCodexModels(): Promise<CodexModelOption[]>;
74
+ createSession(accountId: string, senderId: string, workspace?: string, title?: string): AccountSession;
75
+ renameSession(accountId: string, sessionId: string, title: string): AccountSession;
76
+ activateSession(accountId: string, sessionId: string): AccountSession;
77
+ resetSession(accountId: string, sessionId: string): AccountSession;
78
+ deleteSession(accountId: string, sessionId: string): void;
79
+ getSessionMessages(accountId: string, sessionId: string): Promise<SessionHistoryMessage[]>;
80
+ getSessionAttachment(accountId: string, sessionId: string, messageId: string, attachmentIndex: number): Promise<SessionAttachmentFile>;
81
+ private readSessionMessages;
82
+ continueSession(accountId: string, sessionId: string, text: string, uploads?: SessionUpload[]): Promise<SessionChatResult>;
83
+ private saveSessionUploads;
84
+ allowSender(accountId: string, senderId: string): void;
85
+ removeSender(accountId: string, senderId: string): void;
86
+ private storeFor;
87
+ private isActive;
88
+ private sessionSummary;
89
+ private isSessionResponding;
90
+ private setSessionResponding;
91
+ private runnerFor;
92
+ private closeRunner;
93
+ private summary;
94
+ }