@excitedjs/dreamux 0.1.1 → 0.1.2
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/README.md +13 -19
- package/bin/dreamux +3 -2
- package/bin/server +3 -3
- package/bin/server-ctl +1 -1
- package/dist/channel/feishu-gate.js +27 -0
- package/dist/channel/feishu-gate.js.map +1 -0
- package/dist/channel/outbound.js +12 -0
- package/dist/channel/outbound.js.map +1 -0
- package/dist/dispatcher/runtime.js +3 -2
- package/dist/dispatcher/runtime.js.map +1 -1
- package/dist/dispatcher/turn-manager.js +10 -8
- package/dist/dispatcher/turn-manager.js.map +1 -1
- package/dist/feishu/bot.js +38 -19
- package/dist/feishu/bot.js.map +1 -1
- package/dist/runtime/codex-args.js +1 -1
- package/dist/runtime/config.js +2 -2
- package/dist/runtime/config.js.map +1 -1
- package/dist/server.js +13 -2
- package/dist/server.js.map +1 -1
- package/package.json +17 -11
- package/dist/feishu/content.js +0 -108
- package/dist/feishu/content.js.map +0 -1
- package/dist/feishu/render.js +0 -600
- package/dist/feishu/render.js.map +0 -1
- package/dist/feishu/types.js +0 -9
- package/dist/feishu/types.js.map +0 -1
package/package.json
CHANGED
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@excitedjs/dreamux",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"description": "Codex-host server — single-session MVP. One node process hosts N dispatchers, each binding 1 Feishu bot + 1 Codex thread.",
|
|
5
5
|
"license": "MIT",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "git+https://github.com/excitedjs/dreamux.git",
|
|
9
|
+
"directory": "packages/dreamux"
|
|
10
|
+
},
|
|
6
11
|
"type": "module",
|
|
7
12
|
"main": "./dist/server.js",
|
|
8
13
|
"engines": {
|
|
@@ -20,11 +25,19 @@
|
|
|
20
25
|
"README.md",
|
|
21
26
|
"LICENSE"
|
|
22
27
|
],
|
|
28
|
+
"scripts": {
|
|
29
|
+
"build": "tsc -p tsconfig.json",
|
|
30
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
31
|
+
"test": "vitest run",
|
|
32
|
+
"test:watch": "vitest",
|
|
33
|
+
"clean": "rm -rf dist",
|
|
34
|
+
"prepublishOnly": "npm run build"
|
|
35
|
+
},
|
|
23
36
|
"dependencies": {
|
|
37
|
+
"@excitedjs/feishu-transport": "workspace:*",
|
|
24
38
|
"better-sqlite3": "^11.5.0",
|
|
25
39
|
"smol-toml": "^1.6.1",
|
|
26
|
-
"ws": "^8.18.0"
|
|
27
|
-
"@excitedjs/feishu-transport": "0.0.1"
|
|
40
|
+
"ws": "^8.18.0"
|
|
28
41
|
},
|
|
29
42
|
"devDependencies": {
|
|
30
43
|
"@types/better-sqlite3": "^7.6.12",
|
|
@@ -32,12 +45,5 @@
|
|
|
32
45
|
"@types/ws": "^8.5.13",
|
|
33
46
|
"typescript": "^5.7.0",
|
|
34
47
|
"vitest": "^2.1.0"
|
|
35
|
-
},
|
|
36
|
-
"scripts": {
|
|
37
|
-
"build": "tsc -p tsconfig.json",
|
|
38
|
-
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
39
|
-
"test": "vitest run",
|
|
40
|
-
"test:watch": "vitest",
|
|
41
|
-
"clean": "rm -rf dist"
|
|
42
48
|
}
|
|
43
|
-
}
|
|
49
|
+
}
|
package/dist/feishu/content.js
DELETED
|
@@ -1,108 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Parsing inbound Feishu message content.
|
|
3
|
-
*
|
|
4
|
-
* Feishu delivers `message.content` as a JSON-encoded string whose shape
|
|
5
|
-
* depends on `message_type`. This module turns that into the plain text the
|
|
6
|
-
* channel forwards to Claude. Attachment message types (image, file) are
|
|
7
|
-
* summarized as a short text marker — the channel forwards text, not binaries.
|
|
8
|
-
*/
|
|
9
|
-
/**
|
|
10
|
-
* Parse one inbound Feishu message into forwardable text. Never throws —
|
|
11
|
-
* malformed content falls back to a best-effort string so a weird message
|
|
12
|
-
* still reaches Claude.
|
|
13
|
-
*/
|
|
14
|
-
export function parseInbound(message) {
|
|
15
|
-
const type = message.message_type ?? 'unknown';
|
|
16
|
-
let parsed;
|
|
17
|
-
try {
|
|
18
|
-
parsed = JSON.parse(message.content ?? '');
|
|
19
|
-
}
|
|
20
|
-
catch {
|
|
21
|
-
return { text: message.content ?? '(unparseable message)' };
|
|
22
|
-
}
|
|
23
|
-
const content = (parsed && typeof parsed === 'object' ? parsed : {});
|
|
24
|
-
switch (type) {
|
|
25
|
-
case 'text': {
|
|
26
|
-
const text = typeof content.text === 'string' ? content.text : '';
|
|
27
|
-
return { text: applyMentions(text, message.mentions) };
|
|
28
|
-
}
|
|
29
|
-
case 'post':
|
|
30
|
-
return { text: extractPostText(content) };
|
|
31
|
-
case 'image':
|
|
32
|
-
return { text: '(image)' };
|
|
33
|
-
case 'file': {
|
|
34
|
-
const fileName = typeof content.file_name === 'string' ? content.file_name : 'unknown';
|
|
35
|
-
return { text: `(file: ${fileName})` };
|
|
36
|
-
}
|
|
37
|
-
default:
|
|
38
|
-
return { text: `(${type} message)` };
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
/**
|
|
42
|
-
* Replace Feishu's `@_user_N` placeholders in text with the mentioned display
|
|
43
|
-
* names, so the forwarded message reads naturally.
|
|
44
|
-
*/
|
|
45
|
-
export function applyMentions(text, mentions) {
|
|
46
|
-
if (!mentions)
|
|
47
|
-
return text;
|
|
48
|
-
let out = text;
|
|
49
|
-
for (const m of mentions) {
|
|
50
|
-
if (m.key && m.name) {
|
|
51
|
-
out = out.split(m.key).join(`@${m.name}`);
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
return out;
|
|
55
|
-
}
|
|
56
|
-
/**
|
|
57
|
-
* Flatten a Feishu rich-text "post" payload into plain text. A post is
|
|
58
|
-
* locale-wrapped (`{ zh_cn: { title, content } }`) and its body is an array of
|
|
59
|
-
* paragraphs, each an array of tagged inline elements.
|
|
60
|
-
*/
|
|
61
|
-
export function extractPostText(content) {
|
|
62
|
-
const post = pickPostLocale(content);
|
|
63
|
-
const lines = [];
|
|
64
|
-
if (typeof post.title === 'string' && post.title.length > 0) {
|
|
65
|
-
lines.push(post.title);
|
|
66
|
-
}
|
|
67
|
-
const body = post.content;
|
|
68
|
-
if (Array.isArray(body)) {
|
|
69
|
-
for (const paragraph of body) {
|
|
70
|
-
if (!Array.isArray(paragraph))
|
|
71
|
-
continue;
|
|
72
|
-
lines.push(paragraph.map(renderPostElement).join(''));
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
return lines.join('\n');
|
|
76
|
-
}
|
|
77
|
-
/** Pick the first present locale block of a post, falling back to the raw object. */
|
|
78
|
-
function pickPostLocale(content) {
|
|
79
|
-
for (const locale of ['zh_cn', 'en_us', 'ja_jp']) {
|
|
80
|
-
const block = content[locale];
|
|
81
|
-
if (block && typeof block === 'object')
|
|
82
|
-
return block;
|
|
83
|
-
}
|
|
84
|
-
return content;
|
|
85
|
-
}
|
|
86
|
-
/** Render one inline post element to text. */
|
|
87
|
-
function renderPostElement(el) {
|
|
88
|
-
if (!el || typeof el !== 'object')
|
|
89
|
-
return '';
|
|
90
|
-
const e = el;
|
|
91
|
-
switch (e.tag) {
|
|
92
|
-
case 'text':
|
|
93
|
-
return typeof e.text === 'string' ? e.text : '';
|
|
94
|
-
case 'a':
|
|
95
|
-
return typeof e.text === 'string'
|
|
96
|
-
? e.text
|
|
97
|
-
: typeof e.href === 'string'
|
|
98
|
-
? e.href
|
|
99
|
-
: '';
|
|
100
|
-
case 'at':
|
|
101
|
-
return `@${typeof e.user_name === 'string' ? e.user_name : ''}`;
|
|
102
|
-
case 'img':
|
|
103
|
-
return '(image)';
|
|
104
|
-
default:
|
|
105
|
-
return '';
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
//# sourceMappingURL=content.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"content.js","sourceRoot":"","sources":["../../src/feishu/content.ts"],"names":[],"mappings":"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"}
|