reasonix 0.46.0 → 0.47.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/README.md +64 -12
- package/README.zh-CN.md +54 -9
- package/dashboard/dist/app.js +293 -66
- package/dashboard/dist/app.js.map +1 -1
- package/dist/cli/{acp-LGBLHBKY.js → acp-QK3DMC53.js} +22 -22
- package/dist/cli/chat-VV5UWY4V.js +51 -0
- package/dist/cli/{chunk-AVFXO2EZ.js → chunk-24A7FHGJ.js} +148 -16
- package/dist/cli/chunk-24A7FHGJ.js.map +1 -0
- package/dist/cli/chunk-25T6CVUP.js +0 -0
- package/dist/cli/chunk-2UQP6H6T.js +0 -0
- package/dist/cli/chunk-5QCB62C4.js +0 -0
- package/dist/cli/{chunk-YY227BIQ.js → chunk-6J6BSUCR.js} +2 -2
- package/dist/cli/chunk-6OWJV3YW.js +0 -0
- package/dist/cli/{chunk-A3TSSDS2.js → chunk-BWYVFFKR.js} +2 -2
- package/dist/cli/{chunk-C53JQES5.js → chunk-BYYVYJDX.js} +3 -3
- package/dist/cli/{chunk-HNXDZGC6.js → chunk-CI2PF5QX.js} +2 -2
- package/dist/cli/{chunk-GTZTQNX5.js → chunk-COWPEX54.js} +19 -9
- package/dist/cli/chunk-COWPEX54.js.map +1 -0
- package/dist/cli/{chunk-QJDDIK3Z.js → chunk-E5WCLUIU.js} +2 -2
- package/dist/cli/{chunk-NVURFF27.js → chunk-EQATK2L2.js} +2 -2
- package/dist/cli/{chunk-HKWSPKMU.js → chunk-FDKOUJKZ.js} +8 -8
- package/dist/cli/chunk-FEZK652I.js +0 -0
- package/dist/cli/{chunk-TEUDEGX2.js → chunk-FY4S7TJZ.js} +19 -5
- package/dist/cli/chunk-FY4S7TJZ.js.map +1 -0
- package/dist/cli/{chunk-RDRC3XDT.js → chunk-GDKB2PPK.js} +2 -2
- package/dist/cli/{chunk-XSU4QVFW.js → chunk-HIYTRCSW.js} +27 -14
- package/dist/cli/chunk-HIYTRCSW.js.map +1 -0
- package/dist/cli/{chunk-WL6SNQ5T.js → chunk-ICAFSZHS.js} +307 -114
- package/dist/cli/chunk-ICAFSZHS.js.map +1 -0
- package/dist/cli/{chunk-KQU2TYIL.js → chunk-ICSYGIPN.js} +1916 -1098
- package/dist/cli/chunk-ICSYGIPN.js.map +1 -0
- package/dist/cli/chunk-J5XJHLWM.js +0 -0
- package/dist/cli/chunk-JMBMLOBP.js +0 -0
- package/dist/cli/{chunk-MJ6W5UN3.js → chunk-K6GUKSXH.js} +3 -2
- package/dist/cli/chunk-K6GUKSXH.js.map +1 -0
- package/dist/cli/{chunk-IJ7JA32V.js → chunk-KDRUEXII.js} +189 -26
- package/dist/cli/chunk-KDRUEXII.js.map +1 -0
- package/dist/cli/{chunk-4HCP2UQW.js → chunk-LBLR4CUZ.js} +2 -2
- package/dist/cli/{chunk-2425HK6U.js → chunk-LGEKVMMV.js} +7 -2
- package/dist/cli/{chunk-2425HK6U.js.map → chunk-LGEKVMMV.js.map} +1 -1
- package/dist/cli/{chunk-I4L2GTSE.js → chunk-OJVITDGB.js} +2 -2
- package/dist/cli/chunk-PLHAZOLZ.js +0 -0
- package/dist/cli/{chunk-W7YGWUWU.js → chunk-QVDWH2A2.js} +3 -3
- package/dist/cli/{chunk-R3CTO2HM.js → chunk-QVUFWDD2.js} +2 -2
- package/dist/cli/{chunk-HVUZWNSP.js → chunk-R6GQKKBW.js} +2 -2
- package/dist/cli/{chunk-5ACMUK4Q.js → chunk-RRXUIPWG.js} +20 -18
- package/dist/cli/chunk-RRXUIPWG.js.map +1 -0
- package/dist/cli/chunk-S4XVGLRW.js +0 -0
- package/dist/cli/chunk-SZ5XES2N.js +0 -0
- package/dist/cli/{chunk-CXVWUPA3.js → chunk-TKVXTQ3T.js} +26 -26
- package/dist/cli/chunk-TKVXTQ3T.js.map +1 -0
- package/dist/cli/chunk-TUK7OWJA.js +0 -0
- package/dist/cli/{chunk-JNAQYELD.js → chunk-UDVFBEXC.js} +3 -3
- package/dist/cli/{chunk-CBIQWMS6.js → chunk-VC2CQA5D.js} +9 -9
- package/dist/cli/{chunk-ZZYBBX5N.js → chunk-VJMBISEI.js} +23 -9
- package/dist/cli/chunk-VJMBISEI.js.map +1 -0
- package/dist/cli/{chunk-WK3UFQY3.js → chunk-VKYSZKH2.js} +2 -2
- package/dist/cli/{chunk-LIR2HBQH.js → chunk-VMUUFWFF.js} +2 -2
- package/dist/cli/{chunk-V26WPN3J.js → chunk-VNQGCA3Q.js} +28 -1
- package/dist/cli/chunk-VNQGCA3Q.js.map +1 -0
- package/dist/cli/{chunk-5I2C4JEO.js → chunk-WF7TPVZM.js} +6 -6
- package/dist/cli/{chunk-5I2C4JEO.js.map → chunk-WF7TPVZM.js.map} +1 -1
- package/dist/cli/chunk-X53B3JIX.js +0 -0
- package/dist/cli/chunk-XJXDHAES.js +0 -0
- package/dist/cli/chunk-XXC2BYTV.js +0 -0
- package/dist/cli/{chunk-4CTDEJUF.js → chunk-YDPLF7XR.js} +26 -14
- package/dist/cli/chunk-YDPLF7XR.js.map +1 -0
- package/dist/cli/chunk-ZZM6QJ4W.js +0 -0
- package/dist/cli/{code-DFHSASJ4.js → code-C24TUAE5.js} +39 -35
- package/dist/cli/code-C24TUAE5.js.map +1 -0
- package/dist/cli/{commands-OCU42XG4.js → commands-RR3GIYOK.js} +4 -4
- package/dist/cli/{commit-XCQIQCYG.js → commit-FSHPIINM.js} +3 -3
- package/dist/cli/{desktop-ZCUG7LMF.js → desktop-7NCHPEFB.js} +263 -36
- package/dist/cli/desktop-7NCHPEFB.js.map +1 -0
- package/dist/cli/devtools-HW3WDT3Q.js +0 -0
- package/dist/cli/{diff-66B2KWOJ.js → diff-RAAHHLHV.js} +8 -8
- package/dist/cli/{doctor-Y73CPPRZ.js → doctor-PKVQIXRT.js} +9 -9
- package/dist/cli/{events-NGZ2OJYH.js → events-VRYXOSKI.js} +3 -3
- package/dist/cli/index.js +84 -92
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/{mcp-MPVGBBJF.js → mcp-CRJ26PP4.js} +2 -2
- package/dist/cli/{mcp-browse-4XOTC3FJ.js → mcp-browse-QPAOWZOP.js} +2 -2
- package/dist/cli/{mcp-inspect-CEMGKKAH.js → mcp-inspect-CVCLABRS.js} +4 -4
- package/dist/cli/{prompt-2D7ID24X.js → prompt-SKYXERSI.js} +4 -4
- package/dist/cli/{prune-sessions-OJEYYLHY.js → prune-sessions-SEWX7GP6.js} +2 -2
- package/dist/cli/{replay-AKYQNAQJ.js → replay-KPDW2ZMJ.js} +9 -9
- package/dist/cli/{run-5DPQFSP6.js → run-WIKDIXTG.js} +18 -19
- package/dist/cli/run-WIKDIXTG.js.map +1 -0
- package/dist/cli/{server-TQ2IHYQJ.js → server-P6V2G3P6.js} +82 -34
- package/dist/cli/server-P6V2G3P6.js.map +1 -0
- package/dist/cli/{sessions-KY54NG45.js → sessions-2NULRMSA.js} +29 -15
- package/dist/cli/sessions-2NULRMSA.js.map +1 -0
- package/dist/cli/{setup-XPIOZWS7.js → setup-Y5WDBQFL.js} +8 -8
- package/dist/cli/setup-Y5WDBQFL.js.map +1 -0
- package/dist/cli/{stats-X2VTWKNS.js → stats-T7BL2YOR.js} +6 -6
- package/dist/cli/update-6ITLPRDV.js +0 -0
- package/dist/cli/{version-7O6A5T7Q.js → version-3KWDNWLN.js} +15 -15
- package/dist/index.d.ts +54 -23
- package/dist/index.js +1613 -1152
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/cli/.-3G6VX5S7.js +0 -327
- package/dist/cli/.-6YRPB2C7.js +0 -329
- package/dist/cli/.-EYSVINK3.js +0 -317
- package/dist/cli/chat-ECK5ZGMV.js +0 -51
- package/dist/cli/chunk-4CTDEJUF.js.map +0 -1
- package/dist/cli/chunk-5ACMUK4Q.js.map +0 -1
- package/dist/cli/chunk-AVFXO2EZ.js.map +0 -1
- package/dist/cli/chunk-CXVWUPA3.js.map +0 -1
- package/dist/cli/chunk-GTZTQNX5.js.map +0 -1
- package/dist/cli/chunk-IJ7JA32V.js.map +0 -1
- package/dist/cli/chunk-KQU2TYIL.js.map +0 -1
- package/dist/cli/chunk-MJ6W5UN3.js.map +0 -1
- package/dist/cli/chunk-TEUDEGX2.js.map +0 -1
- package/dist/cli/chunk-V26WPN3J.js.map +0 -1
- package/dist/cli/chunk-WL6SNQ5T.js.map +0 -1
- package/dist/cli/chunk-XSU4QVFW.js.map +0 -1
- package/dist/cli/chunk-ZZYBBX5N.js.map +0 -1
- package/dist/cli/code-DFHSASJ4.js.map +0 -1
- package/dist/cli/desktop-ZCUG7LMF.js.map +0 -1
- package/dist/cli/doctor-Y73CPPRZ.js.map +0 -1
- package/dist/cli/prompt-2D7ID24X.js.map +0 -1
- package/dist/cli/run-5DPQFSP6.js.map +0 -1
- package/dist/cli/server-TQ2IHYQJ.js.map +0 -1
- package/dist/cli/sessions-KY54NG45.js.map +0 -1
- package/dist/cli/setup-XPIOZWS7.js.map +0 -1
- package/dist/cli/stats-X2VTWKNS.js.map +0 -1
- /package/dist/cli/{acp-LGBLHBKY.js.map → acp-QK3DMC53.js.map} +0 -0
- /package/dist/cli/{.-3G6VX5S7.js.map → chat-VV5UWY4V.js.map} +0 -0
- /package/dist/cli/{chunk-YY227BIQ.js.map → chunk-6J6BSUCR.js.map} +0 -0
- /package/dist/cli/{chunk-A3TSSDS2.js.map → chunk-BWYVFFKR.js.map} +0 -0
- /package/dist/cli/{chunk-C53JQES5.js.map → chunk-BYYVYJDX.js.map} +0 -0
- /package/dist/cli/{chunk-HNXDZGC6.js.map → chunk-CI2PF5QX.js.map} +0 -0
- /package/dist/cli/{chunk-QJDDIK3Z.js.map → chunk-E5WCLUIU.js.map} +0 -0
- /package/dist/cli/{chunk-NVURFF27.js.map → chunk-EQATK2L2.js.map} +0 -0
- /package/dist/cli/{chunk-HKWSPKMU.js.map → chunk-FDKOUJKZ.js.map} +0 -0
- /package/dist/cli/{chunk-RDRC3XDT.js.map → chunk-GDKB2PPK.js.map} +0 -0
- /package/dist/cli/{chunk-4HCP2UQW.js.map → chunk-LBLR4CUZ.js.map} +0 -0
- /package/dist/cli/{chunk-I4L2GTSE.js.map → chunk-OJVITDGB.js.map} +0 -0
- /package/dist/cli/{chunk-W7YGWUWU.js.map → chunk-QVDWH2A2.js.map} +0 -0
- /package/dist/cli/{chunk-R3CTO2HM.js.map → chunk-QVUFWDD2.js.map} +0 -0
- /package/dist/cli/{chunk-HVUZWNSP.js.map → chunk-R6GQKKBW.js.map} +0 -0
- /package/dist/cli/{chunk-JNAQYELD.js.map → chunk-UDVFBEXC.js.map} +0 -0
- /package/dist/cli/{chunk-CBIQWMS6.js.map → chunk-VC2CQA5D.js.map} +0 -0
- /package/dist/cli/{chunk-WK3UFQY3.js.map → chunk-VKYSZKH2.js.map} +0 -0
- /package/dist/cli/{chunk-LIR2HBQH.js.map → chunk-VMUUFWFF.js.map} +0 -0
- /package/dist/cli/{commands-OCU42XG4.js.map → commands-RR3GIYOK.js.map} +0 -0
- /package/dist/cli/{commit-XCQIQCYG.js.map → commit-FSHPIINM.js.map} +0 -0
- /package/dist/cli/{diff-66B2KWOJ.js.map → diff-RAAHHLHV.js.map} +0 -0
- /package/dist/cli/{.-6YRPB2C7.js.map → doctor-PKVQIXRT.js.map} +0 -0
- /package/dist/cli/{events-NGZ2OJYH.js.map → events-VRYXOSKI.js.map} +0 -0
- /package/dist/cli/{mcp-MPVGBBJF.js.map → mcp-CRJ26PP4.js.map} +0 -0
- /package/dist/cli/{mcp-browse-4XOTC3FJ.js.map → mcp-browse-QPAOWZOP.js.map} +0 -0
- /package/dist/cli/{mcp-inspect-CEMGKKAH.js.map → mcp-inspect-CVCLABRS.js.map} +0 -0
- /package/dist/cli/{.-EYSVINK3.js.map → prompt-SKYXERSI.js.map} +0 -0
- /package/dist/cli/{prune-sessions-OJEYYLHY.js.map → prune-sessions-SEWX7GP6.js.map} +0 -0
- /package/dist/cli/{replay-AKYQNAQJ.js.map → replay-KPDW2ZMJ.js.map} +0 -0
- /package/dist/cli/{chat-ECK5ZGMV.js.map → stats-T7BL2YOR.js.map} +0 -0
- /package/dist/cli/{version-7O6A5T7Q.js.map → version-3KWDNWLN.js.map} +0 -0
|
@@ -2,16 +2,16 @@
|
|
|
2
2
|
import { createRequire as __cr } from 'node:module'; if (typeof globalThis.require === 'undefined') { globalThis.require = __cr(import.meta.url); }
|
|
3
3
|
import {
|
|
4
4
|
createMcpRuntime
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-COWPEX54.js";
|
|
6
6
|
import {
|
|
7
7
|
buildCodeToolset
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-VC2CQA5D.js";
|
|
9
9
|
import {
|
|
10
10
|
Eventizer,
|
|
11
11
|
autoResolveVerdict
|
|
12
|
-
} from "./chunk-
|
|
13
|
-
import "./chunk-
|
|
14
|
-
import "./chunk-
|
|
12
|
+
} from "./chunk-CI2PF5QX.js";
|
|
13
|
+
import "./chunk-LBLR4CUZ.js";
|
|
14
|
+
import "./chunk-EQATK2L2.js";
|
|
15
15
|
import {
|
|
16
16
|
CacheFirstLoop,
|
|
17
17
|
ImmutablePrefix,
|
|
@@ -19,39 +19,39 @@ import {
|
|
|
19
19
|
listFilesWithStatsAsync,
|
|
20
20
|
parseAtQuery,
|
|
21
21
|
rankPickerCandidates
|
|
22
|
-
} from "./chunk-
|
|
23
|
-
import "./chunk-
|
|
24
|
-
import "./chunk-
|
|
25
|
-
import "./chunk-
|
|
22
|
+
} from "./chunk-ICAFSZHS.js";
|
|
23
|
+
import "./chunk-VKYSZKH2.js";
|
|
24
|
+
import "./chunk-BYYVYJDX.js";
|
|
25
|
+
import "./chunk-HIYTRCSW.js";
|
|
26
26
|
import {
|
|
27
27
|
MemoryStore,
|
|
28
28
|
codeSystemPrompt
|
|
29
|
-
} from "./chunk-
|
|
29
|
+
} from "./chunk-UDVFBEXC.js";
|
|
30
30
|
import {
|
|
31
31
|
canonicalPresetName,
|
|
32
32
|
resolvePreset
|
|
33
|
-
} from "./chunk-
|
|
33
|
+
} from "./chunk-LGEKVMMV.js";
|
|
34
34
|
import {
|
|
35
35
|
countTokensBounded
|
|
36
36
|
} from "./chunk-6OWJV3YW.js";
|
|
37
37
|
import {
|
|
38
38
|
DeepSeekClient,
|
|
39
39
|
pickPrimaryBalance
|
|
40
|
-
} from "./chunk-
|
|
40
|
+
} from "./chunk-VNQGCA3Q.js";
|
|
41
41
|
import "./chunk-25T6CVUP.js";
|
|
42
42
|
import {
|
|
43
43
|
loadDotenv
|
|
44
44
|
} from "./chunk-2UQP6H6T.js";
|
|
45
|
-
import "./chunk-
|
|
45
|
+
import "./chunk-K6GUKSXH.js";
|
|
46
46
|
import {
|
|
47
47
|
pauseGate
|
|
48
|
-
} from "./chunk-
|
|
48
|
+
} from "./chunk-GDKB2PPK.js";
|
|
49
49
|
import {
|
|
50
50
|
SkillStore
|
|
51
|
-
} from "./chunk-
|
|
51
|
+
} from "./chunk-FY4S7TJZ.js";
|
|
52
52
|
import "./chunk-PLHAZOLZ.js";
|
|
53
|
-
import "./chunk-
|
|
54
|
-
import "./chunk-
|
|
53
|
+
import "./chunk-YDPLF7XR.js";
|
|
54
|
+
import "./chunk-BWYVFFKR.js";
|
|
55
55
|
import "./chunk-S4XVGLRW.js";
|
|
56
56
|
import {
|
|
57
57
|
deleteSession,
|
|
@@ -59,12 +59,14 @@ import {
|
|
|
59
59
|
loadSessionMessages,
|
|
60
60
|
loadSessionMeta,
|
|
61
61
|
patchSessionMeta,
|
|
62
|
+
sessionPath,
|
|
62
63
|
timestampSuffix
|
|
63
|
-
} from "./chunk-
|
|
64
|
-
import "./chunk-
|
|
65
|
-
import "./chunk-
|
|
66
|
-
import "./chunk-
|
|
64
|
+
} from "./chunk-RRXUIPWG.js";
|
|
65
|
+
import "./chunk-QVUFWDD2.js";
|
|
66
|
+
import "./chunk-VJMBISEI.js";
|
|
67
|
+
import "./chunk-KDRUEXII.js";
|
|
67
68
|
import {
|
|
69
|
+
describeQQAccess,
|
|
68
70
|
isPlausibleKey,
|
|
69
71
|
loadApiKey,
|
|
70
72
|
loadBaseUrl,
|
|
@@ -72,6 +74,7 @@ import {
|
|
|
72
74
|
loadEditMode,
|
|
73
75
|
loadEditor,
|
|
74
76
|
loadPreset,
|
|
77
|
+
loadQQConfig,
|
|
75
78
|
loadReasoningEffort,
|
|
76
79
|
loadRecentWorkspaces,
|
|
77
80
|
loadResolvedSkillPaths,
|
|
@@ -85,10 +88,11 @@ import {
|
|
|
85
88
|
saveEditMode,
|
|
86
89
|
saveEditor,
|
|
87
90
|
savePreset,
|
|
91
|
+
saveQQConfig,
|
|
88
92
|
saveReasoningEffort,
|
|
89
93
|
saveWorkspaceDir,
|
|
90
94
|
writeConfig
|
|
91
|
-
} from "./chunk-
|
|
95
|
+
} from "./chunk-24A7FHGJ.js";
|
|
92
96
|
import {
|
|
93
97
|
VERSION
|
|
94
98
|
} from "./chunk-XXC2BYTV.js";
|
|
@@ -101,6 +105,58 @@ import { readFile } from "fs/promises";
|
|
|
101
105
|
import { isAbsolute, join, resolve } from "path";
|
|
102
106
|
import { stdin } from "process";
|
|
103
107
|
import { createInterface } from "readline";
|
|
108
|
+
|
|
109
|
+
// src/desktop/qq-settings.ts
|
|
110
|
+
function trimOptional(value) {
|
|
111
|
+
const trimmed = value?.trim();
|
|
112
|
+
return trimmed ? trimmed : void 0;
|
|
113
|
+
}
|
|
114
|
+
function toPreview(appId) {
|
|
115
|
+
if (!appId) return void 0;
|
|
116
|
+
return appId.length > 6 ? `${appId.slice(0, 6)}...` : appId;
|
|
117
|
+
}
|
|
118
|
+
function toAccess(config) {
|
|
119
|
+
return describeQQAccess({
|
|
120
|
+
ownerOpenId: config.ownerOpenId,
|
|
121
|
+
allowlist: config.allowlist
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
function loadDesktopQQState(path) {
|
|
125
|
+
const config = loadQQConfig(path);
|
|
126
|
+
const configured = Boolean(config.appId && config.appSecret);
|
|
127
|
+
return {
|
|
128
|
+
...config,
|
|
129
|
+
sandbox: config.sandbox ?? false,
|
|
130
|
+
enabled: config.enabled === true,
|
|
131
|
+
configured,
|
|
132
|
+
connected: configured && config.enabled === true,
|
|
133
|
+
appIdPreview: toPreview(config.appId),
|
|
134
|
+
access: toAccess(config)
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
function saveDesktopQQSettings(patch, path) {
|
|
138
|
+
const existing = loadQQConfig(path);
|
|
139
|
+
saveQQConfig(
|
|
140
|
+
{
|
|
141
|
+
...existing,
|
|
142
|
+
appId: trimOptional(patch.appId),
|
|
143
|
+
appSecret: trimOptional(patch.appSecret),
|
|
144
|
+
sandbox: patch.sandbox
|
|
145
|
+
},
|
|
146
|
+
path
|
|
147
|
+
);
|
|
148
|
+
return loadDesktopQQState(path);
|
|
149
|
+
}
|
|
150
|
+
function setDesktopQQEnabled(enabled, path) {
|
|
151
|
+
const existing = loadQQConfig(path);
|
|
152
|
+
if (enabled && !(existing.appId && existing.appSecret)) {
|
|
153
|
+
throw new Error("QQ App ID and App Secret are required.");
|
|
154
|
+
}
|
|
155
|
+
saveQQConfig({ ...existing, enabled }, path);
|
|
156
|
+
return loadDesktopQQState(path);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
// src/cli/commands/desktop.ts
|
|
104
160
|
function emit(ev, tabId) {
|
|
105
161
|
const payload = tabId ? { ...ev, tabId } : ev;
|
|
106
162
|
writeSync(1, Buffer.from(`${JSON.stringify(payload)}
|
|
@@ -179,6 +235,9 @@ function emitSettings(tab) {
|
|
|
179
235
|
tab.id
|
|
180
236
|
);
|
|
181
237
|
}
|
|
238
|
+
function emitQQSettings(tab) {
|
|
239
|
+
emit({ type: "$qq_settings", ...loadDesktopQQState() }, tab.id);
|
|
240
|
+
}
|
|
182
241
|
async function emitBalance(tab) {
|
|
183
242
|
if (!tab.runtime) return;
|
|
184
243
|
const bal = await tab.runtime.loop.client.getBalance().catch(() => null);
|
|
@@ -418,6 +477,7 @@ async function desktopCommand(opts) {
|
|
|
418
477
|
installDesktopCrashGuards();
|
|
419
478
|
const tabs = /* @__PURE__ */ new Map();
|
|
420
479
|
const tabContext = new AsyncLocalStorage();
|
|
480
|
+
let lastActiveTabId = "";
|
|
421
481
|
function activeRunningTab() {
|
|
422
482
|
const id = tabContext.getStore();
|
|
423
483
|
return id ? tabs.get(id) : void 0;
|
|
@@ -519,7 +579,13 @@ async function desktopCommand(opts) {
|
|
|
519
579
|
}
|
|
520
580
|
function persistOpenTabs() {
|
|
521
581
|
try {
|
|
522
|
-
saveDesktopOpenTabs(
|
|
582
|
+
saveDesktopOpenTabs(
|
|
583
|
+
Array.from(tabs.values()).map((t) => ({
|
|
584
|
+
dir: t.rootDir,
|
|
585
|
+
session: t.currentSession || void 0,
|
|
586
|
+
active: t.id === lastActiveTabId
|
|
587
|
+
}))
|
|
588
|
+
);
|
|
523
589
|
} catch {
|
|
524
590
|
}
|
|
525
591
|
}
|
|
@@ -622,6 +688,7 @@ async function desktopCommand(opts) {
|
|
|
622
688
|
emitSessions(tab);
|
|
623
689
|
emitSettings(tab);
|
|
624
690
|
emitSkills(tab);
|
|
691
|
+
persistOpenTabs();
|
|
625
692
|
}
|
|
626
693
|
function forgetGate(id) {
|
|
627
694
|
for (const t of tabs.values()) {
|
|
@@ -849,14 +916,44 @@ async function desktopCommand(opts) {
|
|
|
849
916
|
if (tab) tab.pendingGateIds.delete(req.id);
|
|
850
917
|
pauseGate.cancel(req.id);
|
|
851
918
|
});
|
|
852
|
-
function bootstrapTab(initialDir) {
|
|
919
|
+
function bootstrapTab(initialDir, restore) {
|
|
853
920
|
const tab = createTabSkeleton(initialDir);
|
|
854
|
-
|
|
921
|
+
let restoredMessages;
|
|
922
|
+
if (restore?.session) {
|
|
923
|
+
try {
|
|
924
|
+
if (existsSync(sessionPath(restore.session))) {
|
|
925
|
+
const msgs = buildLoadedMessages(loadSessionMessages(restore.session));
|
|
926
|
+
if (msgs.length > 0) {
|
|
927
|
+
tab.currentSession = restore.session;
|
|
928
|
+
restoredMessages = msgs;
|
|
929
|
+
}
|
|
930
|
+
}
|
|
931
|
+
} catch {
|
|
932
|
+
}
|
|
933
|
+
}
|
|
934
|
+
emit({ type: "$tab_opened", workspaceDir: tab.rootDir, active: restore?.active }, tab.id);
|
|
855
935
|
emitSessions(tab);
|
|
856
936
|
emitSettings(tab);
|
|
857
937
|
emitMcpSpecs(tab);
|
|
858
938
|
emitSkills(tab);
|
|
859
939
|
emitMemory(tab);
|
|
940
|
+
emitQQSettings(tab);
|
|
941
|
+
if (restoredMessages) {
|
|
942
|
+
const meta = loadSessionMeta(tab.currentSession);
|
|
943
|
+
emit(
|
|
944
|
+
{
|
|
945
|
+
type: "$session_loaded",
|
|
946
|
+
name: tab.currentSession,
|
|
947
|
+
messages: restoredMessages,
|
|
948
|
+
carryover: {
|
|
949
|
+
totalCostUsd: meta.totalCostUsd ?? 0,
|
|
950
|
+
cacheHitTokens: meta.cacheHitTokens ?? 0,
|
|
951
|
+
cacheMissTokens: meta.cacheMissTokens ?? 0
|
|
952
|
+
}
|
|
953
|
+
},
|
|
954
|
+
tab.id
|
|
955
|
+
);
|
|
956
|
+
}
|
|
860
957
|
if (!loadApiKey()) emit({ type: "$needs_setup", reason: "no_api_key" }, tab.id);
|
|
861
958
|
void emitBalance(tab);
|
|
862
959
|
void initTabToolset(tab).then(() => {
|
|
@@ -867,18 +964,18 @@ async function desktopCommand(opts) {
|
|
|
867
964
|
});
|
|
868
965
|
return tab;
|
|
869
966
|
}
|
|
870
|
-
const
|
|
967
|
+
const savedTabs = opts.dir ? [] : loadDesktopOpenTabs().filter((t) => {
|
|
871
968
|
try {
|
|
872
|
-
return existsSync(
|
|
969
|
+
return existsSync(t.dir) && statSync(t.dir).isDirectory();
|
|
873
970
|
} catch {
|
|
874
971
|
return false;
|
|
875
972
|
}
|
|
876
973
|
});
|
|
877
|
-
first = bootstrapTab(
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
974
|
+
first = bootstrapTab(savedTabs[0]?.dir, savedTabs[0]);
|
|
975
|
+
const restored = [first];
|
|
976
|
+
for (const t of savedTabs.slice(1)) restored.push(bootstrapTab(t.dir, t));
|
|
977
|
+
const activeIdx = savedTabs.findIndex((t) => t.active);
|
|
978
|
+
lastActiveTabId = ((activeIdx >= 0 ? restored[activeIdx] : first) ?? first).id;
|
|
882
979
|
persistOpenTabs();
|
|
883
980
|
const rl = createInterface({ input: stdin });
|
|
884
981
|
rl.on("line", (line) => {
|
|
@@ -893,13 +990,21 @@ async function desktopCommand(opts) {
|
|
|
893
990
|
}
|
|
894
991
|
if (msg.cmd === "tab_open") {
|
|
895
992
|
try {
|
|
896
|
-
bootstrapTab(msg.workspaceDir);
|
|
993
|
+
const opened = bootstrapTab(msg.workspaceDir, { active: true });
|
|
994
|
+
lastActiveTabId = opened.id;
|
|
897
995
|
persistOpenTabs();
|
|
898
996
|
} catch (err) {
|
|
899
997
|
emit({ type: "$error", message: `tab_open failed: ${err.message}` });
|
|
900
998
|
}
|
|
901
999
|
return;
|
|
902
1000
|
}
|
|
1001
|
+
if (msg.cmd === "tab_activate") {
|
|
1002
|
+
if (tabs.has(msg.tabId)) {
|
|
1003
|
+
lastActiveTabId = msg.tabId;
|
|
1004
|
+
persistOpenTabs();
|
|
1005
|
+
}
|
|
1006
|
+
return;
|
|
1007
|
+
}
|
|
903
1008
|
if (msg.cmd === "confirm_response") {
|
|
904
1009
|
forgetGate(msg.id);
|
|
905
1010
|
pauseGate.resolve(msg.id, msg.response);
|
|
@@ -977,7 +1082,10 @@ async function desktopCommand(opts) {
|
|
|
977
1082
|
}
|
|
978
1083
|
const tab = msg.tabId ? tabs.get(msg.tabId) : first;
|
|
979
1084
|
if (!tab) {
|
|
980
|
-
|
|
1085
|
+
process.stderr.write(
|
|
1086
|
+
`rpc dispatch: unknown tabId=${msg.tabId} for cmd=${msg.cmd} \u2014 dropping
|
|
1087
|
+
`
|
|
1088
|
+
);
|
|
981
1089
|
return;
|
|
982
1090
|
}
|
|
983
1091
|
if (msg.cmd === "abort") {
|
|
@@ -1088,12 +1196,26 @@ ${found.body}${argsLine}`;
|
|
|
1088
1196
|
abortTurn(tab);
|
|
1089
1197
|
cancelPendingGates(tab);
|
|
1090
1198
|
tab.currentSession = msg.name;
|
|
1199
|
+
persistOpenTabs();
|
|
1091
1200
|
if (tab.runtime) tab.runtime = buildRuntimeFor(tab);
|
|
1201
|
+
const loadedMessages = buildLoadedMessages(records);
|
|
1202
|
+
if (loadedMessages.length === 0) {
|
|
1203
|
+
let sizeBytes = 0;
|
|
1204
|
+
try {
|
|
1205
|
+
sizeBytes = statSync(sessionPath(msg.name)).size;
|
|
1206
|
+
} catch {
|
|
1207
|
+
}
|
|
1208
|
+
process.stderr.write(
|
|
1209
|
+
`session_load: "${msg.name}" returned 0 messages (file size=${sizeBytes}B) \u2014 empty or unreadable jsonl
|
|
1210
|
+
`
|
|
1211
|
+
);
|
|
1212
|
+
emit({ type: "$session_empty", name: msg.name, sizeBytes }, tab.id);
|
|
1213
|
+
}
|
|
1092
1214
|
emit(
|
|
1093
1215
|
{
|
|
1094
1216
|
type: "$session_loaded",
|
|
1095
1217
|
name: msg.name,
|
|
1096
|
-
messages:
|
|
1218
|
+
messages: loadedMessages,
|
|
1097
1219
|
carryover: {
|
|
1098
1220
|
totalCostUsd: meta.totalCostUsd ?? 0,
|
|
1099
1221
|
cacheHitTokens: meta.cacheHitTokens ?? 0,
|
|
@@ -1103,6 +1225,8 @@ ${found.body}${argsLine}`;
|
|
|
1103
1225
|
tab.id
|
|
1104
1226
|
);
|
|
1105
1227
|
} catch (err) {
|
|
1228
|
+
process.stderr.write(`session_load: "${msg.name}" threw \u2014 ${err.message}
|
|
1229
|
+
`);
|
|
1106
1230
|
emit({ type: "$error", message: `session_load failed: ${err.message}` }, tab.id);
|
|
1107
1231
|
}
|
|
1108
1232
|
return;
|
|
@@ -1111,6 +1235,7 @@ ${found.body}${argsLine}`;
|
|
|
1111
1235
|
abortTurn(tab);
|
|
1112
1236
|
cancelPendingGates(tab);
|
|
1113
1237
|
tab.currentSession = mintSessionFor(tab.rootDir);
|
|
1238
|
+
persistOpenTabs();
|
|
1114
1239
|
if (tab.runtime) tab.runtime = buildRuntimeFor(tab);
|
|
1115
1240
|
emitSessions(tab);
|
|
1116
1241
|
return;
|
|
@@ -1119,6 +1244,10 @@ ${found.body}${argsLine}`;
|
|
|
1119
1244
|
emitSettings(tab);
|
|
1120
1245
|
return;
|
|
1121
1246
|
}
|
|
1247
|
+
if (msg.cmd === "qq_status_get") {
|
|
1248
|
+
emitQQSettings(tab);
|
|
1249
|
+
return;
|
|
1250
|
+
}
|
|
1122
1251
|
if (msg.cmd === "settings_save") {
|
|
1123
1252
|
try {
|
|
1124
1253
|
if (msg.reasoningEffort !== void 0) {
|
|
@@ -1158,6 +1287,68 @@ ${found.body}${argsLine}`;
|
|
|
1158
1287
|
}
|
|
1159
1288
|
return;
|
|
1160
1289
|
}
|
|
1290
|
+
if (msg.cmd === "qq_config_save") {
|
|
1291
|
+
try {
|
|
1292
|
+
saveDesktopQQSettings(
|
|
1293
|
+
{
|
|
1294
|
+
appId: msg.appId,
|
|
1295
|
+
appSecret: msg.appSecret,
|
|
1296
|
+
sandbox: msg.sandbox
|
|
1297
|
+
},
|
|
1298
|
+
void 0
|
|
1299
|
+
);
|
|
1300
|
+
emitQQSettings(tab);
|
|
1301
|
+
} catch (err) {
|
|
1302
|
+
emit(
|
|
1303
|
+
{ type: "$error", message: `qq_config_save failed: ${err.message}` },
|
|
1304
|
+
tab.id
|
|
1305
|
+
);
|
|
1306
|
+
}
|
|
1307
|
+
return;
|
|
1308
|
+
}
|
|
1309
|
+
if (msg.cmd === "qq_connect") {
|
|
1310
|
+
try {
|
|
1311
|
+
const current = loadQQConfig();
|
|
1312
|
+
setDesktopQQEnabled(true);
|
|
1313
|
+
emit(
|
|
1314
|
+
{
|
|
1315
|
+
type: "status",
|
|
1316
|
+
id: Date.now(),
|
|
1317
|
+
ts: (/* @__PURE__ */ new Date()).toISOString(),
|
|
1318
|
+
turn: 0,
|
|
1319
|
+
text: `QQ enabled (${current.sandbox ? "sandbox" : "production"})`
|
|
1320
|
+
},
|
|
1321
|
+
tab.id
|
|
1322
|
+
);
|
|
1323
|
+
emitQQSettings(tab);
|
|
1324
|
+
} catch (err) {
|
|
1325
|
+
emit({ type: "$error", message: `qq_connect failed: ${err.message}` }, tab.id);
|
|
1326
|
+
emitQQSettings(tab);
|
|
1327
|
+
}
|
|
1328
|
+
return;
|
|
1329
|
+
}
|
|
1330
|
+
if (msg.cmd === "qq_disconnect") {
|
|
1331
|
+
try {
|
|
1332
|
+
setDesktopQQEnabled(false);
|
|
1333
|
+
emit(
|
|
1334
|
+
{
|
|
1335
|
+
type: "status",
|
|
1336
|
+
id: Date.now(),
|
|
1337
|
+
ts: (/* @__PURE__ */ new Date()).toISOString(),
|
|
1338
|
+
turn: 0,
|
|
1339
|
+
text: "QQ disabled"
|
|
1340
|
+
},
|
|
1341
|
+
tab.id
|
|
1342
|
+
);
|
|
1343
|
+
emitQQSettings(tab);
|
|
1344
|
+
} catch (err) {
|
|
1345
|
+
emit(
|
|
1346
|
+
{ type: "$error", message: `qq_disconnect failed: ${err.message}` },
|
|
1347
|
+
tab.id
|
|
1348
|
+
);
|
|
1349
|
+
}
|
|
1350
|
+
return;
|
|
1351
|
+
}
|
|
1161
1352
|
if (msg.cmd === "mention_query") {
|
|
1162
1353
|
const nonce = msg.nonce;
|
|
1163
1354
|
const query = msg.query;
|
|
@@ -1230,6 +1421,42 @@ ${found.body}${argsLine}`;
|
|
|
1230
1421
|
});
|
|
1231
1422
|
return;
|
|
1232
1423
|
}
|
|
1424
|
+
if (msg.cmd === "compact_history") {
|
|
1425
|
+
if (!tab.runtime) return;
|
|
1426
|
+
void tab.runtime.loop.compactHistory().catch((err) => {
|
|
1427
|
+
emit({ type: "$error", message: `/compact failed: ${err.message}` }, tab.id);
|
|
1428
|
+
});
|
|
1429
|
+
return;
|
|
1430
|
+
}
|
|
1431
|
+
if (msg.cmd === "retry") {
|
|
1432
|
+
if (!tab.runtime) return;
|
|
1433
|
+
const prev = tab.runtime.loop.retryLastUser();
|
|
1434
|
+
if (prev) {
|
|
1435
|
+
emit({ type: "$retry_result", text: prev }, tab.id);
|
|
1436
|
+
}
|
|
1437
|
+
return;
|
|
1438
|
+
}
|
|
1439
|
+
if (msg.cmd === "btw") {
|
|
1440
|
+
if (!tab.runtime) return;
|
|
1441
|
+
const question = msg.text.trim();
|
|
1442
|
+
if (!question) return;
|
|
1443
|
+
void (async () => {
|
|
1444
|
+
try {
|
|
1445
|
+
const reply = await tab.runtime.loop.client.chat({
|
|
1446
|
+
model: tab.currentModel,
|
|
1447
|
+
messages: [
|
|
1448
|
+
{ role: "system", content: tab.system },
|
|
1449
|
+
{ role: "user", content: question }
|
|
1450
|
+
]
|
|
1451
|
+
});
|
|
1452
|
+
const answer = (typeof reply.content === "string" ? reply.content.trim() : "") || "(no answer)";
|
|
1453
|
+
emit({ type: "$btw_result", question, answer }, tab.id);
|
|
1454
|
+
} catch (err) {
|
|
1455
|
+
emit({ type: "$error", message: `/btw failed: ${err.message}` }, tab.id);
|
|
1456
|
+
}
|
|
1457
|
+
})();
|
|
1458
|
+
return;
|
|
1459
|
+
}
|
|
1233
1460
|
if (msg.cmd === "user_input") {
|
|
1234
1461
|
if (!tab.runtime) {
|
|
1235
1462
|
emit(
|
|
@@ -1252,4 +1479,4 @@ export {
|
|
|
1252
1479
|
desktopCommand,
|
|
1253
1480
|
installDesktopCrashGuards
|
|
1254
1481
|
};
|
|
1255
|
-
//# sourceMappingURL=desktop-
|
|
1482
|
+
//# sourceMappingURL=desktop-7NCHPEFB.js.map
|