clawcenter 0.1.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.
- package/LICENSE +201 -0
- package/README.md +180 -0
- package/bin/clawcenter.js +2 -0
- package/dist/center/commands/system-commands.d.ts +15 -0
- package/dist/center/commands/system-commands.d.ts.map +1 -0
- package/dist/center/commands/system-commands.js +363 -0
- package/dist/center/commands/system-commands.js.map +1 -0
- package/dist/center/dispatcher.d.ts +32 -0
- package/dist/center/dispatcher.d.ts.map +1 -0
- package/dist/center/dispatcher.js +264 -0
- package/dist/center/dispatcher.js.map +1 -0
- package/dist/center/hub.d.ts +16 -0
- package/dist/center/hub.d.ts.map +1 -0
- package/dist/center/hub.js +214 -0
- package/dist/center/hub.js.map +1 -0
- package/dist/center/router/engine.d.ts +35 -0
- package/dist/center/router/engine.d.ts.map +1 -0
- package/dist/center/router/engine.js +106 -0
- package/dist/center/router/engine.js.map +1 -0
- package/dist/center/router/hashtag.d.ts +15 -0
- package/dist/center/router/hashtag.d.ts.map +1 -0
- package/dist/center/router/hashtag.js +21 -0
- package/dist/center/router/hashtag.js.map +1 -0
- package/dist/center/wechat/api.d.ts +131 -0
- package/dist/center/wechat/api.d.ts.map +1 -0
- package/dist/center/wechat/api.js +205 -0
- package/dist/center/wechat/api.js.map +1 -0
- package/dist/center/wechat/cdn.d.ts +13 -0
- package/dist/center/wechat/cdn.d.ts.map +1 -0
- package/dist/center/wechat/cdn.js +100 -0
- package/dist/center/wechat/cdn.js.map +1 -0
- package/dist/center/wechat/connector.d.ts +51 -0
- package/dist/center/wechat/connector.d.ts.map +1 -0
- package/dist/center/wechat/connector.js +253 -0
- package/dist/center/wechat/connector.js.map +1 -0
- package/dist/center/wechat/login.d.ts +13 -0
- package/dist/center/wechat/login.d.ts.map +1 -0
- package/dist/center/wechat/login.js +81 -0
- package/dist/center/wechat/login.js.map +1 -0
- package/dist/core/agents/adapter.d.ts +43 -0
- package/dist/core/agents/adapter.d.ts.map +1 -0
- package/dist/core/agents/adapter.js +2 -0
- package/dist/core/agents/adapter.js.map +1 -0
- package/dist/core/agents/claude-code.d.ts +19 -0
- package/dist/core/agents/claude-code.d.ts.map +1 -0
- package/dist/core/agents/claude-code.js +138 -0
- package/dist/core/agents/claude-code.js.map +1 -0
- package/dist/core/agents/claude-sdk.d.ts +17 -0
- package/dist/core/agents/claude-sdk.d.ts.map +1 -0
- package/dist/core/agents/claude-sdk.js +85 -0
- package/dist/core/agents/claude-sdk.js.map +1 -0
- package/dist/core/agents/codebuddy.d.ts +19 -0
- package/dist/core/agents/codebuddy.d.ts.map +1 -0
- package/dist/core/agents/codebuddy.js +352 -0
- package/dist/core/agents/codebuddy.js.map +1 -0
- package/dist/core/agents/codex.d.ts +18 -0
- package/dist/core/agents/codex.d.ts.map +1 -0
- package/dist/core/agents/codex.js +300 -0
- package/dist/core/agents/codex.js.map +1 -0
- package/dist/core/agents/cursor-agent.d.ts +19 -0
- package/dist/core/agents/cursor-agent.d.ts.map +1 -0
- package/dist/core/agents/cursor-agent.js +253 -0
- package/dist/core/agents/cursor-agent.js.map +1 -0
- package/dist/core/agents/http-agent.d.ts +17 -0
- package/dist/core/agents/http-agent.d.ts.map +1 -0
- package/dist/core/agents/http-agent.js +91 -0
- package/dist/core/agents/http-agent.js.map +1 -0
- package/dist/core/agents/manager.d.ts +45 -0
- package/dist/core/agents/manager.d.ts.map +1 -0
- package/dist/core/agents/manager.js +245 -0
- package/dist/core/agents/manager.js.map +1 -0
- package/dist/core/agents/openclaw.d.ts +19 -0
- package/dist/core/agents/openclaw.d.ts.map +1 -0
- package/dist/core/agents/openclaw.js +173 -0
- package/dist/core/agents/openclaw.js.map +1 -0
- package/dist/core/agents/opencode.d.ts +19 -0
- package/dist/core/agents/opencode.d.ts.map +1 -0
- package/dist/core/agents/opencode.js +175 -0
- package/dist/core/agents/opencode.js.map +1 -0
- package/dist/core/agents/worker-agent.d.ts +24 -0
- package/dist/core/agents/worker-agent.d.ts.map +1 -0
- package/dist/core/agents/worker-agent.js +40 -0
- package/dist/core/agents/worker-agent.js.map +1 -0
- package/dist/core/api/routes.d.ts +6 -0
- package/dist/core/api/routes.d.ts.map +1 -0
- package/dist/core/api/routes.js +238 -0
- package/dist/core/api/routes.js.map +1 -0
- package/dist/core/db/schema.d.ts +3 -0
- package/dist/core/db/schema.d.ts.map +1 -0
- package/dist/core/db/schema.js +97 -0
- package/dist/core/db/schema.js.map +1 -0
- package/dist/core/db/store.d.ts +167 -0
- package/dist/core/db/store.d.ts.map +1 -0
- package/dist/core/db/store.js +469 -0
- package/dist/core/db/store.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +70 -0
- package/dist/index.js.map +1 -0
- package/dist/logger.d.ts +6 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +22 -0
- package/dist/logger.js.map +1 -0
- package/dist/server.d.ts +28 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +158 -0
- package/dist/server.js.map +1 -0
- package/dist/tui/App.d.ts +78 -0
- package/dist/tui/App.d.ts.map +1 -0
- package/dist/tui/App.js +106 -0
- package/dist/tui/App.js.map +1 -0
- package/dist/tui/index.d.ts +7 -0
- package/dist/tui/index.d.ts.map +1 -0
- package/dist/tui/index.js +12 -0
- package/dist/tui/index.js.map +1 -0
- package/dist/worker/client.d.ts +28 -0
- package/dist/worker/client.d.ts.map +1 -0
- package/dist/worker/client.js +142 -0
- package/dist/worker/client.js.map +1 -0
- package/package.json +74 -0
- package/web/dist/assets/index-Bvq27OV5.js +60 -0
- package/web/dist/index.html +63 -0
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import { spawn, execFile } from "node:child_process";
|
|
2
|
+
const MODELS_CACHE_TTL = 60_000;
|
|
3
|
+
export class OpenCodeAdapter {
|
|
4
|
+
id;
|
|
5
|
+
displayName;
|
|
6
|
+
type = "opencode";
|
|
7
|
+
supportsModelSwitch = true;
|
|
8
|
+
status = "stopped";
|
|
9
|
+
config = {};
|
|
10
|
+
processes = new Map();
|
|
11
|
+
modelsCache = null;
|
|
12
|
+
constructor(id, displayName) {
|
|
13
|
+
this.id = id;
|
|
14
|
+
this.displayName = displayName;
|
|
15
|
+
}
|
|
16
|
+
async start(config) {
|
|
17
|
+
this.config = config;
|
|
18
|
+
this.status = "running";
|
|
19
|
+
}
|
|
20
|
+
async stop() {
|
|
21
|
+
for (const proc of this.processes.values()) {
|
|
22
|
+
proc.kill("SIGTERM");
|
|
23
|
+
}
|
|
24
|
+
this.processes.clear();
|
|
25
|
+
this.status = "stopped";
|
|
26
|
+
}
|
|
27
|
+
getModel() {
|
|
28
|
+
return this.config.model;
|
|
29
|
+
}
|
|
30
|
+
setModel(model) {
|
|
31
|
+
this.config.model = model;
|
|
32
|
+
}
|
|
33
|
+
async listModels(provider) {
|
|
34
|
+
const cacheKey = provider ?? "__all__";
|
|
35
|
+
const now = Date.now();
|
|
36
|
+
if (this.modelsCache && this.modelsCache.key === cacheKey && now - this.modelsCache.time < MODELS_CACHE_TTL) {
|
|
37
|
+
return this.modelsCache.models;
|
|
38
|
+
}
|
|
39
|
+
const opencodePath = this.config.opencodePath ?? "opencode";
|
|
40
|
+
const args = ["models"];
|
|
41
|
+
if (provider)
|
|
42
|
+
args.push(provider);
|
|
43
|
+
const models = await new Promise((resolve) => {
|
|
44
|
+
execFile(opencodePath, args, {
|
|
45
|
+
timeout: 15_000,
|
|
46
|
+
env: { ...process.env, TERM: "dumb" },
|
|
47
|
+
}, (err, stdout) => {
|
|
48
|
+
if (err) {
|
|
49
|
+
console.error(`[opencode:${this.id}] Failed to list models:`, err.message);
|
|
50
|
+
resolve([]);
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
const lines = stdout.trim().split("\n").map((l) => l.trim()).filter(Boolean);
|
|
54
|
+
resolve(lines.map((line) => {
|
|
55
|
+
const slashIdx = line.indexOf("/");
|
|
56
|
+
return {
|
|
57
|
+
id: line,
|
|
58
|
+
provider: slashIdx !== -1 ? line.substring(0, slashIdx) : "default",
|
|
59
|
+
};
|
|
60
|
+
}));
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
this.modelsCache = { key: cacheKey, models, time: now };
|
|
64
|
+
return models;
|
|
65
|
+
}
|
|
66
|
+
async send(params) {
|
|
67
|
+
if (this.status !== "running") {
|
|
68
|
+
throw new Error(`Agent ${this.id} is not running`);
|
|
69
|
+
}
|
|
70
|
+
const args = ["run", "--format", "json"];
|
|
71
|
+
if (params.agentSessionId) {
|
|
72
|
+
args.push("--session", params.agentSessionId);
|
|
73
|
+
}
|
|
74
|
+
const model = this.config.model;
|
|
75
|
+
if (model) {
|
|
76
|
+
args.push("-m", model);
|
|
77
|
+
}
|
|
78
|
+
args.push("--", params.message);
|
|
79
|
+
const env = { TERM: "dumb" };
|
|
80
|
+
for (const [k, v] of Object.entries(process.env)) {
|
|
81
|
+
if (v !== undefined)
|
|
82
|
+
env[k] = v;
|
|
83
|
+
}
|
|
84
|
+
for (const [k, v] of Object.entries(this.config.env ?? {})) {
|
|
85
|
+
env[k] = v;
|
|
86
|
+
}
|
|
87
|
+
return new Promise((resolve, reject) => {
|
|
88
|
+
const opencodePath = this.config.opencodePath ?? "opencode";
|
|
89
|
+
const proc = spawn(opencodePath, args, {
|
|
90
|
+
cwd: this.config.cwd ?? process.cwd(),
|
|
91
|
+
env,
|
|
92
|
+
shell: false,
|
|
93
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
94
|
+
});
|
|
95
|
+
this.processes.set(params.sessionId, proc);
|
|
96
|
+
let sessionId;
|
|
97
|
+
const chunks = [];
|
|
98
|
+
let lastResult = "";
|
|
99
|
+
let lineBuffer = "";
|
|
100
|
+
proc.stdout?.on("data", (data) => {
|
|
101
|
+
lineBuffer += data.toString();
|
|
102
|
+
const lines = lineBuffer.split("\n");
|
|
103
|
+
lineBuffer = lines.pop() ?? "";
|
|
104
|
+
for (const line of lines) {
|
|
105
|
+
if (!line.trim())
|
|
106
|
+
continue;
|
|
107
|
+
try {
|
|
108
|
+
const event = JSON.parse(line);
|
|
109
|
+
if (event.sessionID || event.sessionId || event.session_id) {
|
|
110
|
+
sessionId = event.sessionID ?? event.sessionId ?? event.session_id;
|
|
111
|
+
}
|
|
112
|
+
if (event.type === "text" && event.part?.text) {
|
|
113
|
+
chunks.push(event.part.text);
|
|
114
|
+
params.onStream?.(event.part.text);
|
|
115
|
+
}
|
|
116
|
+
else if (event.type === "text" || event.type === "content") {
|
|
117
|
+
const text = event.text ?? event.content ?? "";
|
|
118
|
+
if (text) {
|
|
119
|
+
chunks.push(text);
|
|
120
|
+
params.onStream?.(text);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
if (event.type === "result" || event.type === "finish") {
|
|
124
|
+
lastResult = event.result ?? event.text ?? "";
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
catch {
|
|
128
|
+
if (line.trim()) {
|
|
129
|
+
chunks.push(line.trim());
|
|
130
|
+
params.onStream?.(line.trim());
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
});
|
|
135
|
+
proc.stderr?.on("data", (data) => {
|
|
136
|
+
const text = data.toString().trim();
|
|
137
|
+
if (text)
|
|
138
|
+
console.error(`[opencode:${this.id}] stderr:`, text);
|
|
139
|
+
});
|
|
140
|
+
proc.on("error", (err) => {
|
|
141
|
+
this.processes.delete(params.sessionId);
|
|
142
|
+
reject(new Error(`OpenCode process error: ${err.message}`));
|
|
143
|
+
});
|
|
144
|
+
proc.on("close", (code) => {
|
|
145
|
+
this.processes.delete(params.sessionId);
|
|
146
|
+
if (lineBuffer.trim()) {
|
|
147
|
+
try {
|
|
148
|
+
const event = JSON.parse(lineBuffer);
|
|
149
|
+
if (event.sessionID || event.sessionId || event.session_id) {
|
|
150
|
+
sessionId = event.sessionID ?? event.sessionId ?? event.session_id;
|
|
151
|
+
}
|
|
152
|
+
if (event.type === "text" && event.part?.text) {
|
|
153
|
+
chunks.push(event.part.text);
|
|
154
|
+
}
|
|
155
|
+
else if (event.type === "text" || event.type === "content") {
|
|
156
|
+
const text = event.text ?? event.content ?? "";
|
|
157
|
+
if (text)
|
|
158
|
+
chunks.push(text);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
catch { /* ignore */ }
|
|
162
|
+
}
|
|
163
|
+
if (code !== 0 && chunks.length === 0 && !lastResult) {
|
|
164
|
+
reject(new Error(`OpenCode exited with code ${code}`));
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
resolve({
|
|
168
|
+
text: lastResult || chunks.join("\n") || "(No response)",
|
|
169
|
+
agentSessionId: sessionId,
|
|
170
|
+
});
|
|
171
|
+
});
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
//# sourceMappingURL=opencode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opencode.js","sourceRoot":"","sources":["../../../src/core/agents/opencode.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { AgentAdapter, AgentConfig, ModelInfo, SendParams, SendResult } from "./adapter.js";
|
|
2
|
+
export type WorkerSendFn = (agentId: string, params: SendParams) => Promise<SendResult>;
|
|
3
|
+
/**
|
|
4
|
+
* Proxy adapter for agents running on remote Worker nodes.
|
|
5
|
+
* The actual work is delegated to the Worker via WebSocket.
|
|
6
|
+
*/
|
|
7
|
+
export declare class WorkerAgentAdapter implements AgentAdapter {
|
|
8
|
+
readonly id: string;
|
|
9
|
+
readonly displayName: string;
|
|
10
|
+
readonly type: "worker";
|
|
11
|
+
readonly supportsModelSwitch = false;
|
|
12
|
+
status: "running" | "stopped" | "error";
|
|
13
|
+
private workerSend;
|
|
14
|
+
readonly nodeId: string;
|
|
15
|
+
constructor(id: string, displayName: string, nodeId: string);
|
|
16
|
+
setWorkerSend(fn: WorkerSendFn): void;
|
|
17
|
+
start(_config: AgentConfig): Promise<void>;
|
|
18
|
+
stop(): Promise<void>;
|
|
19
|
+
send(params: SendParams): Promise<SendResult>;
|
|
20
|
+
getModel(): string | undefined;
|
|
21
|
+
setModel(): void;
|
|
22
|
+
listModels(): Promise<ModelInfo[]>;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=worker-agent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker-agent.d.ts","sourceRoot":"","sources":["../../../src/core/agents/worker-agent.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAEjG,MAAM,MAAM,YAAY,GAAG,CACzB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,UAAU,KACf,OAAO,CAAC,UAAU,CAAC,CAAC;AAEzB;;;GAGG;AACH,qBAAa,kBAAmB,YAAW,YAAY;IAQnD,QAAQ,CAAC,EAAE,EAAE,MAAM;IACnB,QAAQ,CAAC,WAAW,EAAE,MAAM;IAR9B,QAAQ,CAAC,IAAI,EAAG,QAAQ,CAAU;IAClC,QAAQ,CAAC,mBAAmB,SAAS;IACrC,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,OAAO,CAAa;IACpD,OAAO,CAAC,UAAU,CAA6B;IAC/C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;gBAGb,EAAE,EAAE,MAAM,EACV,WAAW,EAAE,MAAM,EAC5B,MAAM,EAAE,MAAM;IAKhB,aAAa,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI;IAI/B,KAAK,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAO1C,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAIrB,IAAI,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;IAOnD,QAAQ,IAAI,MAAM,GAAG,SAAS;IAC9B,QAAQ,IAAI,IAAI;IACV,UAAU,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;CACzC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Proxy adapter for agents running on remote Worker nodes.
|
|
3
|
+
* The actual work is delegated to the Worker via WebSocket.
|
|
4
|
+
*/
|
|
5
|
+
export class WorkerAgentAdapter {
|
|
6
|
+
id;
|
|
7
|
+
displayName;
|
|
8
|
+
type = "worker";
|
|
9
|
+
supportsModelSwitch = false;
|
|
10
|
+
status = "stopped";
|
|
11
|
+
workerSend = null;
|
|
12
|
+
nodeId;
|
|
13
|
+
constructor(id, displayName, nodeId) {
|
|
14
|
+
this.id = id;
|
|
15
|
+
this.displayName = displayName;
|
|
16
|
+
this.nodeId = nodeId;
|
|
17
|
+
}
|
|
18
|
+
setWorkerSend(fn) {
|
|
19
|
+
this.workerSend = fn;
|
|
20
|
+
}
|
|
21
|
+
async start(_config) {
|
|
22
|
+
if (!this.workerSend) {
|
|
23
|
+
throw new Error(`Worker agent ${this.id}: no worker connection`);
|
|
24
|
+
}
|
|
25
|
+
this.status = "running";
|
|
26
|
+
}
|
|
27
|
+
async stop() {
|
|
28
|
+
this.status = "stopped";
|
|
29
|
+
}
|
|
30
|
+
async send(params) {
|
|
31
|
+
if (this.status !== "running" || !this.workerSend) {
|
|
32
|
+
throw new Error(`Worker agent ${this.id} is not available`);
|
|
33
|
+
}
|
|
34
|
+
return this.workerSend(this.id, params);
|
|
35
|
+
}
|
|
36
|
+
getModel() { return undefined; }
|
|
37
|
+
setModel() { }
|
|
38
|
+
async listModels() { return []; }
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=worker-agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker-agent.js","sourceRoot":"","sources":["../../../src/core/agents/worker-agent.ts"],"names":[],"mappings":"AAOA;;;GAGG;AACH,MAAM,OAAO,kBAAkB;IAQlB;IACA;IARF,IAAI,GAAG,QAAiB,CAAC;IACzB,mBAAmB,GAAG,KAAK,CAAC;IACrC,MAAM,GAAoC,SAAS,CAAC;IAC5C,UAAU,GAAwB,IAAI,CAAC;IACtC,MAAM,CAAS;IAExB,YACW,EAAU,EACV,WAAmB,EAC5B,MAAc;QAFL,OAAE,GAAF,EAAE,CAAQ;QACV,gBAAW,GAAX,WAAW,CAAQ;QAG5B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,aAAa,CAAC,EAAgB;QAC5B,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,OAAoB;QAC9B,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,gBAAgB,IAAI,CAAC,EAAE,wBAAwB,CAAC,CAAC;QACnE,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,MAAkB;QAC3B,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YAClD,MAAM,IAAI,KAAK,CAAC,gBAAgB,IAAI,CAAC,EAAE,mBAAmB,CAAC,CAAC;QAC9D,CAAC;QACD,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;IAC1C,CAAC;IAED,QAAQ,KAAyB,OAAO,SAAS,CAAC,CAAC,CAAC;IACpD,QAAQ,KAA+B,CAAC;IACxC,KAAK,CAAC,UAAU,KAA2B,OAAO,EAAE,CAAC,CAAC,CAAC;CACxD"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { FastifyInstance } from "fastify";
|
|
2
|
+
import type { Store } from "../db/store.js";
|
|
3
|
+
import type { AgentManager } from "../agents/manager.js";
|
|
4
|
+
import type { Dispatcher } from "../../center/dispatcher.js";
|
|
5
|
+
export declare function registerApiRoutes(app: FastifyInstance, store: Store, agentManager: AgentManager, dispatcher?: Dispatcher): void;
|
|
6
|
+
//# sourceMappingURL=routes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../../src/core/api/routes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE/C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEzD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAE7D,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,eAAe,EACpB,KAAK,EAAE,KAAK,EACZ,YAAY,EAAE,YAAY,EAC1B,UAAU,CAAC,EAAE,UAAU,GACtB,IAAI,CA2RN"}
|
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
import QRCode from "qrcode";
|
|
2
|
+
export function registerApiRoutes(app, store, agentManager, dispatcher) {
|
|
3
|
+
// ─── Settings ───
|
|
4
|
+
app.get("/api/settings", async () => {
|
|
5
|
+
return store.getAllSettings();
|
|
6
|
+
});
|
|
7
|
+
app.put("/api/settings", async (req) => {
|
|
8
|
+
const { key, value } = req.body;
|
|
9
|
+
store.setSetting(key, value);
|
|
10
|
+
return { ok: true };
|
|
11
|
+
});
|
|
12
|
+
// ─── Stats ───
|
|
13
|
+
app.get("/api/stats", async () => {
|
|
14
|
+
return store.getStats();
|
|
15
|
+
});
|
|
16
|
+
// ─── WeChat Accounts ───
|
|
17
|
+
app.get("/api/wechat-accounts", async () => {
|
|
18
|
+
return store.listWechatAccounts().map((a) => ({
|
|
19
|
+
...a,
|
|
20
|
+
token: a.token ? "***" : null,
|
|
21
|
+
get_updates_buf: a.get_updates_buf ? `(${a.get_updates_buf.length} bytes)` : "",
|
|
22
|
+
}));
|
|
23
|
+
});
|
|
24
|
+
app.post("/api/wechat-accounts", async (req) => {
|
|
25
|
+
const account = store.createWechatAccount(req.body);
|
|
26
|
+
return account;
|
|
27
|
+
});
|
|
28
|
+
app.delete("/api/wechat-accounts/:id", async (req) => {
|
|
29
|
+
if (dispatcher) {
|
|
30
|
+
await dispatcher.stopConnector(req.params.id);
|
|
31
|
+
}
|
|
32
|
+
store.deleteWechatAccount(req.params.id);
|
|
33
|
+
return { ok: true };
|
|
34
|
+
});
|
|
35
|
+
app.post("/api/wechat-accounts/:id/login", async (req, reply) => {
|
|
36
|
+
if (!dispatcher) {
|
|
37
|
+
return reply.code(400).send({ error: "Not in center mode" });
|
|
38
|
+
}
|
|
39
|
+
const connector = dispatcher.getConnector(req.params.id);
|
|
40
|
+
if (connector) {
|
|
41
|
+
return reply.code(400).send({ error: "Already connected" });
|
|
42
|
+
}
|
|
43
|
+
const account = store.getWechatAccount(req.params.id);
|
|
44
|
+
if (!account) {
|
|
45
|
+
return reply.code(404).send({ error: `Account "${req.params.id}" not found` });
|
|
46
|
+
}
|
|
47
|
+
const { WechatConnector } = await import("../../center/wechat/connector.js");
|
|
48
|
+
const tempConnector = new WechatConnector(store, req.params.id);
|
|
49
|
+
const accountId = req.params.id;
|
|
50
|
+
const emitLog = (type, text) => {
|
|
51
|
+
dispatcher?.emit("log", { time: Date.now(), type, wechatId: accountId, text });
|
|
52
|
+
};
|
|
53
|
+
try {
|
|
54
|
+
let loginResolved = false;
|
|
55
|
+
const qrContent = await new Promise((resolve, reject) => {
|
|
56
|
+
tempConnector.login({
|
|
57
|
+
onQrCode: (url) => { loginResolved = true; resolve(url); },
|
|
58
|
+
onStatus: (msg) => {
|
|
59
|
+
console.log(`[Login:${accountId}]`, msg);
|
|
60
|
+
emitLog("info", `[Login] ${msg}`);
|
|
61
|
+
},
|
|
62
|
+
}).then(async () => {
|
|
63
|
+
console.log(`[Login:${accountId}] Login successful, starting connector...`);
|
|
64
|
+
emitLog("info", `[Login] Login successful`);
|
|
65
|
+
try {
|
|
66
|
+
await dispatcher.startConnector(accountId);
|
|
67
|
+
}
|
|
68
|
+
catch (err) {
|
|
69
|
+
console.error(`[Login:${accountId}] Auto-connect failed:`, err.message);
|
|
70
|
+
emitLog("error", `[Login] Auto-connect failed: ${err.message}`);
|
|
71
|
+
}
|
|
72
|
+
}).catch((err) => {
|
|
73
|
+
const msg = err.message;
|
|
74
|
+
console.error(`[Login:${accountId}] Background login failed:`, msg);
|
|
75
|
+
emitLog("error", `[Login] Failed: ${msg}`);
|
|
76
|
+
if (!loginResolved)
|
|
77
|
+
reject(err);
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
const qrUrl = await QRCode.toDataURL(qrContent, { width: 300, margin: 2 });
|
|
81
|
+
return { qrUrl, status: "waiting_for_scan" };
|
|
82
|
+
}
|
|
83
|
+
catch (err) {
|
|
84
|
+
const message = err.message;
|
|
85
|
+
console.error(`[Login:${accountId}] Error:`, message);
|
|
86
|
+
emitLog("error", `[Login] Failed: ${message}`);
|
|
87
|
+
return reply.code(500).send({ error: `Login failed: ${message}` });
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
app.post("/api/wechat-accounts/:id/connect", async (req, reply) => {
|
|
91
|
+
if (!dispatcher) {
|
|
92
|
+
return reply.code(400).send({ error: "Not in center mode" });
|
|
93
|
+
}
|
|
94
|
+
try {
|
|
95
|
+
await dispatcher.startConnector(req.params.id);
|
|
96
|
+
return { ok: true, status: "connected" };
|
|
97
|
+
}
|
|
98
|
+
catch (err) {
|
|
99
|
+
return reply.code(400).send({ error: err.message });
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
app.post("/api/wechat-accounts/:id/disconnect", async (req) => {
|
|
103
|
+
if (dispatcher) {
|
|
104
|
+
await dispatcher.stopConnector(req.params.id);
|
|
105
|
+
}
|
|
106
|
+
return { ok: true };
|
|
107
|
+
});
|
|
108
|
+
// ─── Agents ───
|
|
109
|
+
app.get("/api/agents", async () => {
|
|
110
|
+
const agents = store.listAgents();
|
|
111
|
+
return agents.map((a) => ({
|
|
112
|
+
...a,
|
|
113
|
+
runtimeStatus: agentManager.getAdapter(a.id)?.status ?? a.status,
|
|
114
|
+
}));
|
|
115
|
+
});
|
|
116
|
+
app.post("/api/agents", async (req, reply) => {
|
|
117
|
+
try {
|
|
118
|
+
await agentManager.addAgent({
|
|
119
|
+
id: req.body.id,
|
|
120
|
+
displayName: req.body.display_name,
|
|
121
|
+
type: req.body.type,
|
|
122
|
+
config: req.body.config,
|
|
123
|
+
autoStart: req.body.auto_start,
|
|
124
|
+
});
|
|
125
|
+
return store.getAgent(req.body.id);
|
|
126
|
+
}
|
|
127
|
+
catch (err) {
|
|
128
|
+
return reply.code(400).send({ error: err.message });
|
|
129
|
+
}
|
|
130
|
+
});
|
|
131
|
+
app.put("/api/agents/:id", async (req, reply) => {
|
|
132
|
+
const agent = store.getAgent(req.params.id);
|
|
133
|
+
if (!agent)
|
|
134
|
+
return reply.code(404).send({ error: "Agent not found" });
|
|
135
|
+
const updates = {};
|
|
136
|
+
if (req.body.display_name)
|
|
137
|
+
updates.display_name = req.body.display_name;
|
|
138
|
+
if (req.body.config)
|
|
139
|
+
updates.config = req.body.config;
|
|
140
|
+
store.updateAgent(req.params.id, updates);
|
|
141
|
+
return store.getAgent(req.params.id);
|
|
142
|
+
});
|
|
143
|
+
app.delete("/api/agents/:id", async (req) => {
|
|
144
|
+
await agentManager.removeAgent(req.params.id);
|
|
145
|
+
return { ok: true };
|
|
146
|
+
});
|
|
147
|
+
app.get("/api/agents/:id/models", async (req, reply) => {
|
|
148
|
+
const adapter = agentManager.getAdapter(req.params.id);
|
|
149
|
+
if (!adapter)
|
|
150
|
+
return reply.code(404).send({ error: "Agent not found" });
|
|
151
|
+
if (!adapter.supportsModelSwitch) {
|
|
152
|
+
return reply.code(400).send({ error: `Agent type "${adapter.type}" does not support model switching` });
|
|
153
|
+
}
|
|
154
|
+
try {
|
|
155
|
+
const provider = req.query.provider;
|
|
156
|
+
const models = await agentManager.listAgentModels(req.params.id, provider);
|
|
157
|
+
const currentModel = agentManager.getAgentModel(req.params.id);
|
|
158
|
+
return { models, currentModel };
|
|
159
|
+
}
|
|
160
|
+
catch (err) {
|
|
161
|
+
return reply.code(500).send({ error: err.message });
|
|
162
|
+
}
|
|
163
|
+
});
|
|
164
|
+
app.put("/api/agents/:id/model", async (req, reply) => {
|
|
165
|
+
try {
|
|
166
|
+
agentManager.setAgentModel(req.params.id, req.body.model);
|
|
167
|
+
return { ok: true, model: req.body.model };
|
|
168
|
+
}
|
|
169
|
+
catch (err) {
|
|
170
|
+
return reply.code(400).send({ error: err.message });
|
|
171
|
+
}
|
|
172
|
+
});
|
|
173
|
+
app.post("/api/agents/:id/start", async (req, reply) => {
|
|
174
|
+
try {
|
|
175
|
+
await agentManager.startAgent(req.params.id);
|
|
176
|
+
return { ok: true };
|
|
177
|
+
}
|
|
178
|
+
catch (err) {
|
|
179
|
+
return reply.code(400).send({ error: err.message });
|
|
180
|
+
}
|
|
181
|
+
});
|
|
182
|
+
app.post("/api/agents/:id/stop", async (req, reply) => {
|
|
183
|
+
try {
|
|
184
|
+
await agentManager.stopAgent(req.params.id);
|
|
185
|
+
return { ok: true };
|
|
186
|
+
}
|
|
187
|
+
catch (err) {
|
|
188
|
+
return reply.code(400).send({ error: err.message });
|
|
189
|
+
}
|
|
190
|
+
});
|
|
191
|
+
// ─── Access Rules ───
|
|
192
|
+
app.get("/api/access-rules", async (req) => {
|
|
193
|
+
const wechatId = req.query.wechat_id;
|
|
194
|
+
return store.listAccessRules(wechatId);
|
|
195
|
+
});
|
|
196
|
+
app.post("/api/access-rules", async (req) => {
|
|
197
|
+
return store.createAccessRule(req.body);
|
|
198
|
+
});
|
|
199
|
+
app.delete("/api/access-rules/:id", async (req) => {
|
|
200
|
+
store.deleteAccessRule(parseInt(req.params.id, 10));
|
|
201
|
+
return { ok: true };
|
|
202
|
+
});
|
|
203
|
+
// ─── Access Matrix ───
|
|
204
|
+
app.get("/api/access-matrix", async () => {
|
|
205
|
+
return {
|
|
206
|
+
matrix: store.getAccessMatrix(),
|
|
207
|
+
wechat_accounts: store.listWechatAccounts().map((a) => ({ id: a.id, name: a.name, status: a.status })),
|
|
208
|
+
agents: store.listAgents().map((a) => ({ id: a.id, display_name: a.display_name, type: a.type, status: a.status })),
|
|
209
|
+
};
|
|
210
|
+
});
|
|
211
|
+
app.put("/api/access-matrix/toggle", async (req) => {
|
|
212
|
+
store.setAccess(req.body.wechat_id, req.body.agent_id, req.body.enabled);
|
|
213
|
+
return { ok: true };
|
|
214
|
+
});
|
|
215
|
+
app.put("/api/access-matrix/default", async (req) => {
|
|
216
|
+
store.setDefaultAgent(req.body.wechat_id, req.body.agent_id);
|
|
217
|
+
return { ok: true };
|
|
218
|
+
});
|
|
219
|
+
// ─── Sessions ───
|
|
220
|
+
app.get("/api/sessions", async (req) => {
|
|
221
|
+
const agentId = req.query.agent_id;
|
|
222
|
+
return store.listSessions(agentId);
|
|
223
|
+
});
|
|
224
|
+
app.delete("/api/sessions/:id", async (req) => {
|
|
225
|
+
store.clearSession(req.params.id);
|
|
226
|
+
return { ok: true };
|
|
227
|
+
});
|
|
228
|
+
// ─── Messages ───
|
|
229
|
+
app.get("/api/messages", async (req) => {
|
|
230
|
+
const limit = parseInt(req.query.limit ?? "50", 10);
|
|
231
|
+
return store.listRecentMessages(limit);
|
|
232
|
+
});
|
|
233
|
+
// ─── Workers ───
|
|
234
|
+
app.get("/api/workers", async () => {
|
|
235
|
+
return store.listWorkerNodes();
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
//# sourceMappingURL=routes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routes.js","sourceRoot":"","sources":["../../../src/core/api/routes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export declare const SCHEMA_SQL = "\nCREATE TABLE IF NOT EXISTS wechat_accounts (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n token TEXT,\n base_url TEXT NOT NULL DEFAULT 'https://ilinkai.weixin.qq.com',\n cdn_base_url TEXT NOT NULL DEFAULT 'https://novac2c.cdn.weixin.qq.com/c2c',\n account_id TEXT,\n user_id TEXT,\n status TEXT NOT NULL DEFAULT 'disconnected',\n get_updates_buf TEXT NOT NULL DEFAULT '',\n created_at INTEGER NOT NULL,\n updated_at INTEGER NOT NULL\n);\n\nCREATE TABLE IF NOT EXISTS agents (\n id TEXT PRIMARY KEY,\n display_name TEXT NOT NULL,\n type TEXT NOT NULL,\n config TEXT NOT NULL DEFAULT '{}',\n status TEXT NOT NULL DEFAULT 'stopped',\n node_id TEXT NOT NULL DEFAULT 'local',\n created_at INTEGER NOT NULL,\n updated_at INTEGER NOT NULL\n);\n\nCREATE TABLE IF NOT EXISTS access_rules (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n wechat_id TEXT NOT NULL,\n user_pattern TEXT NOT NULL DEFAULT '*',\n agent_id TEXT NOT NULL,\n is_default INTEGER NOT NULL DEFAULT 0,\n UNIQUE(wechat_id, user_pattern, agent_id)\n);\n\nCREATE TABLE IF NOT EXISTS sessions (\n id TEXT PRIMARY KEY,\n wechat_id TEXT NOT NULL,\n user_id TEXT NOT NULL,\n agent_id TEXT NOT NULL,\n agent_session TEXT,\n label TEXT,\n is_active INTEGER NOT NULL DEFAULT 1,\n message_count INTEGER NOT NULL DEFAULT 0,\n created_at INTEGER NOT NULL,\n last_active INTEGER NOT NULL\n);\n\nCREATE TABLE IF NOT EXISTS messages (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n wechat_msg_id TEXT,\n client_id TEXT,\n session_id TEXT NOT NULL,\n agent_id TEXT NOT NULL,\n wechat_id TEXT NOT NULL,\n user_id TEXT NOT NULL,\n direction TEXT NOT NULL,\n content TEXT,\n media_path TEXT,\n created_at INTEGER NOT NULL\n);\n\nCREATE INDEX IF NOT EXISTS idx_messages_client_id ON messages(client_id);\nCREATE INDEX IF NOT EXISTS idx_messages_session_id ON messages(session_id);\nCREATE INDEX IF NOT EXISTS idx_messages_created_at ON messages(created_at);\n\nCREATE TABLE IF NOT EXISTS sticky_routes (\n wechat_id TEXT NOT NULL,\n user_id TEXT NOT NULL,\n agent_id TEXT NOT NULL,\n updated_at INTEGER NOT NULL,\n PRIMARY KEY(wechat_id, user_id)\n);\n\nCREATE TABLE IF NOT EXISTS settings (\n key TEXT PRIMARY KEY,\n value TEXT NOT NULL\n);\n\nCREATE TABLE IF NOT EXISTS worker_nodes (\n id TEXT PRIMARY KEY,\n address TEXT,\n status TEXT NOT NULL DEFAULT 'disconnected',\n last_seen INTEGER NOT NULL,\n created_at INTEGER NOT NULL\n);\n";
|
|
2
|
+
export declare const DEFAULT_SETTINGS: Record<string, string>;
|
|
3
|
+
//# sourceMappingURL=schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/core/db/schema.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,UAAU,gqFAsFtB,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAQnD,CAAC"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
export const SCHEMA_SQL = `
|
|
2
|
+
CREATE TABLE IF NOT EXISTS wechat_accounts (
|
|
3
|
+
id TEXT PRIMARY KEY,
|
|
4
|
+
name TEXT NOT NULL,
|
|
5
|
+
token TEXT,
|
|
6
|
+
base_url TEXT NOT NULL DEFAULT 'https://ilinkai.weixin.qq.com',
|
|
7
|
+
cdn_base_url TEXT NOT NULL DEFAULT 'https://novac2c.cdn.weixin.qq.com/c2c',
|
|
8
|
+
account_id TEXT,
|
|
9
|
+
user_id TEXT,
|
|
10
|
+
status TEXT NOT NULL DEFAULT 'disconnected',
|
|
11
|
+
get_updates_buf TEXT NOT NULL DEFAULT '',
|
|
12
|
+
created_at INTEGER NOT NULL,
|
|
13
|
+
updated_at INTEGER NOT NULL
|
|
14
|
+
);
|
|
15
|
+
|
|
16
|
+
CREATE TABLE IF NOT EXISTS agents (
|
|
17
|
+
id TEXT PRIMARY KEY,
|
|
18
|
+
display_name TEXT NOT NULL,
|
|
19
|
+
type TEXT NOT NULL,
|
|
20
|
+
config TEXT NOT NULL DEFAULT '{}',
|
|
21
|
+
status TEXT NOT NULL DEFAULT 'stopped',
|
|
22
|
+
node_id TEXT NOT NULL DEFAULT 'local',
|
|
23
|
+
created_at INTEGER NOT NULL,
|
|
24
|
+
updated_at INTEGER NOT NULL
|
|
25
|
+
);
|
|
26
|
+
|
|
27
|
+
CREATE TABLE IF NOT EXISTS access_rules (
|
|
28
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
29
|
+
wechat_id TEXT NOT NULL,
|
|
30
|
+
user_pattern TEXT NOT NULL DEFAULT '*',
|
|
31
|
+
agent_id TEXT NOT NULL,
|
|
32
|
+
is_default INTEGER NOT NULL DEFAULT 0,
|
|
33
|
+
UNIQUE(wechat_id, user_pattern, agent_id)
|
|
34
|
+
);
|
|
35
|
+
|
|
36
|
+
CREATE TABLE IF NOT EXISTS sessions (
|
|
37
|
+
id TEXT PRIMARY KEY,
|
|
38
|
+
wechat_id TEXT NOT NULL,
|
|
39
|
+
user_id TEXT NOT NULL,
|
|
40
|
+
agent_id TEXT NOT NULL,
|
|
41
|
+
agent_session TEXT,
|
|
42
|
+
label TEXT,
|
|
43
|
+
is_active INTEGER NOT NULL DEFAULT 1,
|
|
44
|
+
message_count INTEGER NOT NULL DEFAULT 0,
|
|
45
|
+
created_at INTEGER NOT NULL,
|
|
46
|
+
last_active INTEGER NOT NULL
|
|
47
|
+
);
|
|
48
|
+
|
|
49
|
+
CREATE TABLE IF NOT EXISTS messages (
|
|
50
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
51
|
+
wechat_msg_id TEXT,
|
|
52
|
+
client_id TEXT,
|
|
53
|
+
session_id TEXT NOT NULL,
|
|
54
|
+
agent_id TEXT NOT NULL,
|
|
55
|
+
wechat_id TEXT NOT NULL,
|
|
56
|
+
user_id TEXT NOT NULL,
|
|
57
|
+
direction TEXT NOT NULL,
|
|
58
|
+
content TEXT,
|
|
59
|
+
media_path TEXT,
|
|
60
|
+
created_at INTEGER NOT NULL
|
|
61
|
+
);
|
|
62
|
+
|
|
63
|
+
CREATE INDEX IF NOT EXISTS idx_messages_client_id ON messages(client_id);
|
|
64
|
+
CREATE INDEX IF NOT EXISTS idx_messages_session_id ON messages(session_id);
|
|
65
|
+
CREATE INDEX IF NOT EXISTS idx_messages_created_at ON messages(created_at);
|
|
66
|
+
|
|
67
|
+
CREATE TABLE IF NOT EXISTS sticky_routes (
|
|
68
|
+
wechat_id TEXT NOT NULL,
|
|
69
|
+
user_id TEXT NOT NULL,
|
|
70
|
+
agent_id TEXT NOT NULL,
|
|
71
|
+
updated_at INTEGER NOT NULL,
|
|
72
|
+
PRIMARY KEY(wechat_id, user_id)
|
|
73
|
+
);
|
|
74
|
+
|
|
75
|
+
CREATE TABLE IF NOT EXISTS settings (
|
|
76
|
+
key TEXT PRIMARY KEY,
|
|
77
|
+
value TEXT NOT NULL
|
|
78
|
+
);
|
|
79
|
+
|
|
80
|
+
CREATE TABLE IF NOT EXISTS worker_nodes (
|
|
81
|
+
id TEXT PRIMARY KEY,
|
|
82
|
+
address TEXT,
|
|
83
|
+
status TEXT NOT NULL DEFAULT 'disconnected',
|
|
84
|
+
last_seen INTEGER NOT NULL,
|
|
85
|
+
created_at INTEGER NOT NULL
|
|
86
|
+
);
|
|
87
|
+
`;
|
|
88
|
+
export const DEFAULT_SETTINGS = {
|
|
89
|
+
reply_prefix_format: "[{displayName}]",
|
|
90
|
+
web_port: "9800",
|
|
91
|
+
worker_port: "9801",
|
|
92
|
+
web_host: "0.0.0.0",
|
|
93
|
+
worker_host: "0.0.0.0",
|
|
94
|
+
worker_web_port: "9802",
|
|
95
|
+
worker_web_host: "127.0.0.1",
|
|
96
|
+
};
|
|
97
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/core/db/schema.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,UAAU,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsFzB,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAA2B;IACtD,mBAAmB,EAAE,iBAAiB;IACtC,QAAQ,EAAE,MAAM;IAChB,WAAW,EAAE,MAAM;IACnB,QAAQ,EAAE,SAAS;IACnB,WAAW,EAAE,SAAS;IACtB,eAAe,EAAE,MAAM;IACvB,eAAe,EAAE,WAAW;CAC7B,CAAC"}
|