weflow-cli 1.8.0 → 1.8.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.
- package/CHANGELOG.md +159 -1
- package/OPERATIONS.md +42 -6
- package/README.en.md +3 -3
- package/README.md +3 -3
- package/bin/weflow-cli.ts +3 -1
- package/dist/bin/weflow-cli.js +3 -1
- package/dist/bin/weflow-cli.js.map +1 -1
- package/dist/src/panel/server.js +1 -1
- package/dist/src/panel/server.js.map +1 -1
- package/dist/src/services/assistantPrivacy.d.ts.map +1 -1
- package/dist/src/services/assistantPrivacy.js +7 -2
- package/dist/src/services/assistantPrivacy.js.map +1 -1
- package/dist/src/services/assistantService.d.ts.map +1 -1
- package/dist/src/services/assistantService.js +10 -1
- package/dist/src/services/assistantService.js.map +1 -1
- package/dist/src/services/assistantTools.d.ts +12 -0
- package/dist/src/services/assistantTools.d.ts.map +1 -1
- package/dist/src/services/assistantTools.js +29 -3
- package/dist/src/services/assistantTools.js.map +1 -1
- package/dist/src/services/wereadService.d.ts +33 -6
- package/dist/src/services/wereadService.d.ts.map +1 -1
- package/dist/src/services/wereadService.js +27 -2
- package/dist/src/services/wereadService.js.map +1 -1
- package/docs/BRANCHES.md +13 -4
- package/docs/PROJECT_STATE.md +299 -299
- package/package.json +1 -1
- package/resources/panel/main.cjs +43 -7
- package/resources/panel/mascot-thinking.png +0 -0
- package/resources/panel/panel.css +415 -407
- package/resources/panel/preload.cjs +79 -72
- package/resources/panel/renderer.js +470 -441
- package/scripts/_utils.py +23 -1
- package/scripts/backfill_articles.py +438 -438
- package/scripts/compile_wiki.py +18 -17
- package/scripts/wiki_lint.py +429 -397
- package/src/panel/server.ts +424 -424
- package/src/services/assistantPrivacy.ts +7 -2
- package/src/services/assistantService.ts +11 -1
- package/src/services/assistantTools.ts +33 -3
- package/src/services/wereadService.ts +43 -7
- package/resources/panel/mascot-focus.png +0 -0
|
@@ -1,72 +1,79 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 渲染进程与主进程之间**唯一**的那道缝。
|
|
3
|
-
*
|
|
4
|
-
* 刻意只暴露三件事,而且全是窗口层面的:**没有凭据、没有端口、没有文件系统、没有 URL**。
|
|
5
|
-
* 页面自己用 `fetch('/api/...')` 跟守护进程说话(相对路径 + HttpOnly cookie),
|
|
6
|
-
* 不需要经过主进程,所以也就没有理由把凭据递给它。
|
|
7
|
-
*
|
|
8
|
-
* 订阅只开**一个**,而且通道名**写死在这里**:风险从来不是"能收推送",而是
|
|
9
|
-
* "渲染进程能决定通道名"——那等于把整条 IPC 面交出去。所以不给通用的 `on(name, cb)`。
|
|
10
|
-
*/
|
|
11
|
-
const { contextBridge, ipcRenderer } = require('electron')
|
|
12
|
-
|
|
13
|
-
contextBridge.exposeInMainWorld('weflowPanel', {
|
|
14
|
-
/**
|
|
15
|
-
* 'ball' 收成小球,'chat' 展开成对话窗。
|
|
16
|
-
*
|
|
17
|
-
* `opts.animate === false` 表示"别做动画,直接到位"——页面读 `prefers-reduced-motion`
|
|
18
|
-
* 之后传进来。**为什么让页面来读**:那个媒体查询只有渲染进程有,主进程这边没有等价 API;
|
|
19
|
-
* 而窗口几何的补间在主进程,CSS 管不着它。默认是**动画**(不传就是动画)。
|
|
20
|
-
*/
|
|
21
|
-
setMode: (mode, opts) => ipcRenderer.invoke('panel:setMode',
|
|
22
|
-
mode === 'chat' ? 'chat' : 'ball',
|
|
23
|
-
{ animate: !opts || opts.animate !== false }),
|
|
24
|
-
/** 'window' 只关窗(助手继续跑),'assistant' 连助手一起停 */
|
|
25
|
-
quit: (what) => ipcRenderer.invoke('panel:quit', what === 'assistant' ? 'assistant' : 'window'),
|
|
26
|
-
/**
|
|
27
|
-
* 拖拽。**为什么不是 `-webkit-app-region: drag`**:在 Windows 上拖拽区会**吞掉鼠标事件**,
|
|
28
|
-
* 页面收不到 click——球就点不开了(这正是实测到的故障)。所以拖拽改成自己实现:
|
|
29
|
-
* 主进程记下按下时的窗口位置与指针位置,移动时按差值 setPosition。
|
|
30
|
-
*/
|
|
31
|
-
dragStart: (x, y) => ipcRenderer.invoke('panel:dragStart', { x, y }),
|
|
32
|
-
dragMove: (x, y) => ipcRenderer.invoke('panel:dragMove', { x, y }),
|
|
33
|
-
dragEnd: () => ipcRenderer.invoke('panel:dragEnd'),
|
|
34
|
-
|
|
35
|
-
/**
|
|
36
|
-
* 右键快速回复:把名单交给主进程去弹**原生菜单**,返回用户选中的那个名字(没选就是 null)。
|
|
37
|
-
*
|
|
38
|
-
* 为什么菜单要由主进程弹:原生菜单画在窗口外面,所以球形态那 76x76 的窗口不用先展开成
|
|
39
|
-
* 对话窗——而"点右键顺手把窗口弹出来"正是用户不要的那一下。
|
|
40
|
-
* 名单在这里**收窄**:只要字符串、去掉空的、最多 20 个(主进程那侧还会再去一次重)。
|
|
41
|
-
*/
|
|
42
|
-
openQuickMenu: (labels) => ipcRenderer.invoke('panel:quickMenu',
|
|
43
|
-
(Array.isArray(labels) ? labels : [])
|
|
44
|
-
.filter((name) => typeof name === 'string' && name.trim())
|
|
45
|
-
.map((name) => name.trim())
|
|
46
|
-
.slice(0, 20)),
|
|
47
|
-
|
|
48
|
-
/** 主进程侧的实际状态,供界面显示"关窗后助手还在跑"这类事实 */
|
|
49
|
-
info: () => ipcRenderer.invoke('panel:info'),
|
|
50
|
-
/**
|
|
51
|
-
*
|
|
52
|
-
*
|
|
53
|
-
*
|
|
54
|
-
*
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
1
|
+
/**
|
|
2
|
+
* 渲染进程与主进程之间**唯一**的那道缝。
|
|
3
|
+
*
|
|
4
|
+
* 刻意只暴露三件事,而且全是窗口层面的:**没有凭据、没有端口、没有文件系统、没有 URL**。
|
|
5
|
+
* 页面自己用 `fetch('/api/...')` 跟守护进程说话(相对路径 + HttpOnly cookie),
|
|
6
|
+
* 不需要经过主进程,所以也就没有理由把凭据递给它。
|
|
7
|
+
*
|
|
8
|
+
* 订阅只开**一个**,而且通道名**写死在这里**:风险从来不是"能收推送",而是
|
|
9
|
+
* "渲染进程能决定通道名"——那等于把整条 IPC 面交出去。所以不给通用的 `on(name, cb)`。
|
|
10
|
+
*/
|
|
11
|
+
const { contextBridge, ipcRenderer } = require('electron')
|
|
12
|
+
|
|
13
|
+
contextBridge.exposeInMainWorld('weflowPanel', {
|
|
14
|
+
/**
|
|
15
|
+
* 'ball' 收成小球,'chat' 展开成对话窗。
|
|
16
|
+
*
|
|
17
|
+
* `opts.animate === false` 表示"别做动画,直接到位"——页面读 `prefers-reduced-motion`
|
|
18
|
+
* 之后传进来。**为什么让页面来读**:那个媒体查询只有渲染进程有,主进程这边没有等价 API;
|
|
19
|
+
* 而窗口几何的补间在主进程,CSS 管不着它。默认是**动画**(不传就是动画)。
|
|
20
|
+
*/
|
|
21
|
+
setMode: (mode, opts) => ipcRenderer.invoke('panel:setMode',
|
|
22
|
+
mode === 'chat' ? 'chat' : 'ball',
|
|
23
|
+
{ animate: !opts || opts.animate !== false }),
|
|
24
|
+
/** 'window' 只关窗(助手继续跑),'assistant' 连助手一起停 */
|
|
25
|
+
quit: (what) => ipcRenderer.invoke('panel:quit', what === 'assistant' ? 'assistant' : 'window'),
|
|
26
|
+
/**
|
|
27
|
+
* 拖拽。**为什么不是 `-webkit-app-region: drag`**:在 Windows 上拖拽区会**吞掉鼠标事件**,
|
|
28
|
+
* 页面收不到 click——球就点不开了(这正是实测到的故障)。所以拖拽改成自己实现:
|
|
29
|
+
* 主进程记下按下时的窗口位置与指针位置,移动时按差值 setPosition。
|
|
30
|
+
*/
|
|
31
|
+
dragStart: (x, y) => ipcRenderer.invoke('panel:dragStart', { x, y }),
|
|
32
|
+
dragMove: (x, y) => ipcRenderer.invoke('panel:dragMove', { x, y }),
|
|
33
|
+
dragEnd: () => ipcRenderer.invoke('panel:dragEnd'),
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* 右键快速回复:把名单交给主进程去弹**原生菜单**,返回用户选中的那个名字(没选就是 null)。
|
|
37
|
+
*
|
|
38
|
+
* 为什么菜单要由主进程弹:原生菜单画在窗口外面,所以球形态那 76x76 的窗口不用先展开成
|
|
39
|
+
* 对话窗——而"点右键顺手把窗口弹出来"正是用户不要的那一下。
|
|
40
|
+
* 名单在这里**收窄**:只要字符串、去掉空的、最多 20 个(主进程那侧还会再去一次重)。
|
|
41
|
+
*/
|
|
42
|
+
openQuickMenu: (labels) => ipcRenderer.invoke('panel:quickMenu',
|
|
43
|
+
(Array.isArray(labels) ? labels : [])
|
|
44
|
+
.filter((name) => typeof name === 'string' && name.trim())
|
|
45
|
+
.map((name) => name.trim())
|
|
46
|
+
.slice(0, 20)),
|
|
47
|
+
|
|
48
|
+
/** 主进程侧的实际状态,供界面显示"关窗后助手还在跑"这类事实 */
|
|
49
|
+
info: () => ipcRenderer.invoke('panel:info'),
|
|
50
|
+
/**
|
|
51
|
+
* 凭据失效时请主进程换一张(重读端点文件 + 刷新 cookie + 重载)。
|
|
52
|
+
*
|
|
53
|
+
* 页面**看不到 token**,也不该看到——所以这件事只能由主进程做,页面只负责触发。
|
|
54
|
+
* 助手没在跑、或 token 本来就没变时它**不重载**,返回一个 code 让页面自己决定怎么说。
|
|
55
|
+
*/
|
|
56
|
+
repair: () => ipcRenderer.invoke('panel:repair'),
|
|
57
|
+
/**
|
|
58
|
+
* 主进程把窗口切成了球形态/气泡形态时通知页面。**通道名是常量,不由调用方给**。
|
|
59
|
+
*
|
|
60
|
+
* 载荷在这里**收窄**过再交出去:`mode` 只认 'ball'/'chat',`side` 只认 'left'/'right',
|
|
61
|
+
* `anchorY` 只认 'top'/'bottom',`bubbleHeight` 夹进 1..10000,`fadeMs` 夹进 0..2000,
|
|
62
|
+
* `done` 只认布尔。跟通道名同一个道理——不把主进程给的东西原样透传。
|
|
63
|
+
*/
|
|
64
|
+
onMode: (cb) => {
|
|
65
|
+
if (typeof cb !== 'function') return
|
|
66
|
+
const clampInt = (value, max, min = 0) => {
|
|
67
|
+
const n = Math.round(Number(value))
|
|
68
|
+
return Number.isFinite(n) ? Math.min(Math.max(n, min), max) : min
|
|
69
|
+
}
|
|
70
|
+
ipcRenderer.on('panel:mode', (_event, payload) => cb({
|
|
71
|
+
mode: payload && payload.mode === 'ball' ? 'ball' : 'chat',
|
|
72
|
+
side: payload && payload.side === 'right' ? 'right' : 'left',
|
|
73
|
+
anchorY: payload && payload.anchorY === 'top' ? 'top' : 'bottom',
|
|
74
|
+
bubbleHeight: clampInt(payload && payload.bubbleHeight, 10000, 1),
|
|
75
|
+
fadeMs: clampInt(payload && payload.fadeMs, 2000),
|
|
76
|
+
done: !!(payload && payload.done),
|
|
77
|
+
}))
|
|
78
|
+
},
|
|
79
|
+
})
|