nolo-cli 0.106.0-alpha.1 → 0.106.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 +1 -1
- package/{_executeModel-C5ZUOC7O.js → _executeModel-EP6HAX3W.js} +77 -69
- package/action-GVA5ARSJ.js +20 -0
- package/{addContentAction-O7R66HEX.js → addContentAction-NZZNAVCB.js} +13 -12
- package/{addDialogAgentAction-74OA7KYP.js → addDialogAgentAction-5HVGEIXI.js} +19 -20
- package/{agentDeleteCommand-YB3S2LPY.js → agentDeleteCommand-M25A6UGB.js} +118 -43
- package/{agentEmailCommands-YBCBTG6X.js → agentEmailCommands-RUL4NL64.js} +99 -89
- package/agentListCommands-KSPFKHFO.js +741 -0
- package/{agentMachineCommands-QHYLBTVW.js → agentMachineCommands-IHBB6PHD.js} +48 -44
- package/{agentProviderCommands-GNPTL5XR.js → agentProviderCommands-ND4S2Q6Q.js} +97 -2
- package/{agentPullCommand-O5MPVJ5E.js → agentPullCommand-B4T2DJ5H.js} +1 -1
- package/agentRecordCommands-7OKIBN6H.js +138 -0
- package/agentRunCommand-GBKJTQQU.js +167 -0
- package/{agentRunControl-AVJR4JW4.js → agentRunControl-3HWA2LLQ.js} +2 -2
- package/{agentRuntimeLocal-FRUE5P2V.js → agentRuntimeLocal-E5HXZNXZ.js} +44 -40
- package/{agentSlice-7OEXULAY.js → agentSlice-7T3ZLYET.js} +15 -14
- package/{appDeleteCommands-JPWTSFID.js → appDeleteCommands-TTJUYTQN.js} +46 -42
- package/{appDeployCommands-YCVY2UYO.js → appDeployCommands-65WYK2TQ.js} +46 -42
- package/{appDeployStatusCommands-JMCEIKTI.js → appDeployStatusCommands-U4XESYYG.js} +46 -42
- package/{appGetCommands-EXWT3QAE.js → appGetCommands-VNHZZC4D.js} +46 -42
- package/{appListCommands-PKRLSWRE.js → appListCommands-O667ZEU6.js} +46 -42
- package/{authCommand-F4EFRRX6.js → authCommand-SUHHTVHA.js} +118 -24
- package/{authCommands-RGOGCPP6.js → authCommands-5RTUDYZW.js} +7 -5
- package/{builtinSkillRegistry-FUAVTRVZ.js → builtinSkillRegistry-PUGT65WS.js} +11 -9
- package/{chromeCommands-FZYAU75D.js → chromeCommands-AU5ZJXBG.js} +289 -37
- package/{chromeOpsCommands-62P2Q2YB.js → chromeOpsCommands-ZYTCMNHG.js} +156 -22
- package/{chunk-ZNV445LB.js → chunk-2NGKYC3L.js} +29 -9
- package/{chunk-JEDZAO7L.js → chunk-2SYTUTLI.js} +257 -37
- package/{chunk-HVURBGF3.js → chunk-2U3NHADM.js} +6 -6
- package/{chunk-XA2FJW4L.js → chunk-3SXZ6SUC.js} +11 -9
- package/{chunk-UKZDAFYT.js → chunk-3VKDWQMJ.js} +6 -10
- package/chunk-4LCOCOR5.js +50 -0
- package/{chunk-JPGCXHNM.js → chunk-4LKMZ3RR.js} +1 -1
- package/{chunk-PQFHGD77.js → chunk-4VDS344D.js} +161 -14
- package/{chunk-2GRGFCF6.js → chunk-4VJAC32I.js} +2 -1
- package/{chunk-6D6VBVEW.js → chunk-4W24JM32.js} +80 -14
- package/{chunk-MC4XLIJ7.js → chunk-523DITKR.js} +1 -1
- package/{chunk-GQBOR3G6.js → chunk-5F7UKMLN.js} +8 -4
- package/{chunk-E4MARS3Q.js → chunk-5GVBDNTO.js} +1 -1
- package/chunk-5MMAK75Q.js +15 -0
- package/{chunk-7S4YWN7P.js → chunk-5UUIGN6I.js} +4 -4
- package/{chunk-42V6BK2E.js → chunk-62IL3KQV.js} +4 -34
- package/{chunk-YCJN2RA3.js → chunk-6AIURTE7.js} +20 -11
- package/{chunk-VLTIYV3X.js → chunk-7I25CBT5.js} +34 -8
- package/chunk-AGIM7IMJ.js +147 -0
- package/{chunk-S4VLC46A.js → chunk-AM4G3LDJ.js} +66 -54
- package/{chunk-5UTFL4QJ.js → chunk-AOTBKDRK.js} +7 -0
- package/{chunk-TJGWNDGO.js → chunk-AZB6HR4I.js} +846 -276
- package/{chunk-L5UXH3B2.js → chunk-BIH7KCDJ.js} +58 -9
- package/{chunk-UZGQNTVW.js → chunk-BPLIXNC6.js} +8 -6
- package/chunk-CEQ75WPL.js +915 -0
- package/chunk-CHOZJMJS.js +78 -0
- package/{chunk-GBRG75BQ.js → chunk-D2MDMY2M.js} +1 -0
- package/{chunk-GPCZ7UXG.js → chunk-DBKRC5O2.js} +1 -1
- package/chunk-DJ3JABG5.js +7990 -0
- package/{chunk-Q554LLSI.js → chunk-DMXLXZKL.js} +1 -1
- package/{chunk-UOBDA2JS.js → chunk-DSXRVBTA.js} +118 -90
- package/{chunk-3VNWWVKB.js → chunk-E3YWHWCR.js} +50 -18
- package/{chunk-HJUYAD4A.js → chunk-EBS4FKW4.js} +5 -5
- package/{chunk-LC43IGO4.js → chunk-EHGIEGLI.js} +834 -962
- package/{chunk-ABQYVJBJ.js → chunk-EV235ILT.js} +5 -5
- package/{chunk-TRV2MIDW.js → chunk-EXAJ6DCR.js} +1 -0
- package/{chunk-TOP2VXOR.js → chunk-FJKZSR5P.js} +5 -5
- package/{chunk-2F7RJC6L.js → chunk-FOXQ7BAB.js} +1 -1
- package/{chunk-SH43IESU.js → chunk-GGC55Q32.js} +199 -29
- package/{chunk-ZCYXJSTU.js → chunk-GMP3NBAA.js} +65 -95
- package/chunk-GMZLP5DV.js +82 -0
- package/{chunk-OIVSQH2O.js → chunk-GU7DC2TD.js} +300 -5
- package/{chunk-FDTR4QJ6.js → chunk-H6A6X4EK.js} +32 -1
- package/{chunk-DVINR3PL.js → chunk-HDLLCBRF.js} +1 -1
- package/{chunk-QOKAKDPE.js → chunk-HIM3FCLF.js} +0 -1
- package/{chunk-RJXZDT2P.js → chunk-HNA5KV37.js} +23 -28
- package/{chunk-ONXOABJR.js → chunk-HNGRBWYF.js} +3 -0
- package/{chunk-ACTMNVHM.js → chunk-I5YMDACN.js} +1 -1
- package/{chunk-O6OSWFZQ.js → chunk-IHPDK6UD.js} +6 -0
- package/{chunk-QDSINZM3.js → chunk-IXH3HKY2.js} +1 -22
- package/{chunk-Q67DOFOO.js → chunk-IYIXAIEB.js} +199 -92
- package/{chunk-BP4XNZRM.js → chunk-JIXGJTBU.js} +4 -4
- package/{chunk-OEVAY4J6.js → chunk-JWNBEIME.js} +18 -20
- package/{chunk-Z77CRGTW.js → chunk-KA5O5KQL.js} +1 -1
- package/{chunk-JZL6EHZR.js → chunk-LGWABBTZ.js} +47 -67
- package/{chunk-LS2ZANRJ.js → chunk-LOCNXNOU.js} +1 -1
- package/{chunk-GEPUP7OO.js → chunk-LOPP5VT6.js} +3 -3
- package/{chunk-DHDMC6FO.js → chunk-LUBFABMJ.js} +15 -14
- package/chunk-LWLNLZC5.js +265 -0
- package/{chunk-BNGW5ASC.js → chunk-LYLO5U3H.js} +15 -2
- package/{chunk-4OEFYTWL.js → chunk-MJ3CRU77.js} +85 -50
- package/{chunk-BFU6C242.js → chunk-NMFV26UG.js} +1 -1
- package/{chunk-NA35QHCF.js → chunk-NTNKA5VL.js} +1 -1
- package/{chunk-FZGV4FGK.js → chunk-NUHHBEJC.js} +378 -187
- package/chunk-NWENLDMM.js +42 -0
- package/chunk-O7SVKKLY.js +875 -0
- package/{chunk-FM2YTE6D.js → chunk-OAXBDMT7.js} +1 -1
- package/chunk-OCZKATRC.js +129 -0
- package/{chunk-EYAQT56M.js → chunk-ODTBO4W6.js} +9 -6
- package/{chunk-VMFTFOWF.js → chunk-OKGVNZTL.js} +35 -8
- package/{chunk-EEGDMATE.js → chunk-OQ5IVGCV.js} +86 -81
- package/{chunk-KQHGZWSV.js → chunk-OXME3PEE.js} +1 -1
- package/{chunk-KQ4ONNQD.js → chunk-OYTWDOQV.js} +155 -8
- package/{chunk-JRQFUXY7.js → chunk-OZ2IIIRP.js} +99 -22
- package/{chunk-WV42OMV7.js → chunk-PFLF4R4E.js} +8 -8
- package/{chunk-J4MOO56S.js → chunk-QDH32WF5.js} +10 -2
- package/{chunk-3DII57IT.js → chunk-QVAWUJAJ.js} +1 -1
- package/{chunk-3BMYXEUW.js → chunk-R5AJODNI.js} +1 -1
- package/{chunk-6OZ36FXI.js → chunk-SJ7CUF65.js} +22 -4
- package/{chunk-IIVGDG4I.js → chunk-SJKULPGX.js} +13 -7
- package/{chunk-ETI2NYVF.js → chunk-SYEBIZOF.js} +4 -4
- package/{chunk-J3WULTWA.js → chunk-TLKXNTQJ.js} +19 -17
- package/chunk-TLYSGGPG.js +15 -0
- package/{chunk-BYMV6QZG.js → chunk-TNIX77YM.js} +4 -0
- package/chunk-TY3TIUJK.js +89 -0
- package/{chunk-I3TQJXQ7.js → chunk-U3C3IA32.js} +9 -2
- package/{chunk-YYLHWIW6.js → chunk-UKZX3NHN.js} +1 -1
- package/chunk-UM7TA3K4.js +1008 -0
- package/{chunk-6YTOJY35.js → chunk-VBG7GWWR.js} +253 -8
- package/chunk-VBQGO5NX.js +164 -0
- package/chunk-VIWDGTDA.js +8 -0
- package/chunk-VJVNU77E.js +83 -0
- package/{chunk-UKWGR5SS.js → chunk-VY6VFGKR.js} +194 -1144
- package/chunk-VYKXIHRP.js +13692 -0
- package/chunk-VZLO4XJD.js +17 -0
- package/{chunk-DNCEALKX.js → chunk-WMWYWYK2.js} +22 -29
- package/{chunk-H56FOERC.js → chunk-XDQ7PHU3.js} +567 -684
- package/{chunk-AEOE4Z6Q.js → chunk-XGOHDYM2.js} +39 -15
- package/{chunk-53HEEOTT.js → chunk-XLWMNFBZ.js} +83 -16
- package/{chunk-V4MJDUSR.js → chunk-YFU5EELM.js} +2 -2
- package/{chunk-IUTWFZOX.js → chunk-YQFLBS6A.js} +68 -46
- package/chunk-YV25TM3R.js +780 -0
- package/chunk-ZRAU6T47.js +56 -0
- package/{chunk-5H7KJX7J.js → chunk-ZVGXD7UJ.js} +5 -5
- package/{chunk-H62HCIUP.js → chunk-ZYM73IHG.js} +36 -22
- package/commandRegistry-6QIAUQDS.js +833 -0
- package/{contentThunks-AZVYDLM4.js → contentThunks-5DDMUQ7B.js} +39 -36
- package/{cooldownCommands-REAWYVTY.js → cooldownCommands-ZLEPIB4A.js} +2 -2
- package/{createAgentAutomationAction-V55DNYCE.js → createAgentAutomationAction-NQ6AZM42.js} +40 -37
- package/createDialogAction-QZ6X4A7O.js +70 -0
- package/{createPageAction-I3HH23O3.js → createPageAction-NCGEJBVK.js} +47 -43
- package/{chunk-GDNQO3QR.js → cursorProvider-YGGNMVWX.js} +2751 -10172
- package/{dbSlice-XVWBAGYN.js → dbSlice-RCZ7NRAF.js} +12 -11
- package/{deleteFile-YG6QMJLU.js → deleteFile-KESP65GC.js} +7 -6
- package/{dialogCommands-YVMHDEOX.js → dialogCommands-OGQLEF63.js} +49 -46
- package/{dialogSlice-LVJ67QWE.js → dialogSlice-GIKNUHNW.js} +57 -37
- package/{dist-VODFSGNG.js → dist-NJC2W7I4.js} +61 -54
- package/{docCreateCommands-7UTWDYJU.js → docCreateCommands-RW6LNYT6.js} +48 -44
- package/{docDeleteCommands-GG6BJ4PS.js → docDeleteCommands-Z742TRNY.js} +49 -45
- package/{docReadCommands-QHMQVSLP.js → docReadCommands-5DIGA42Y.js} +47 -43
- package/{docStore-UJNL6SBT.js → docStore-6GUOZH52.js} +17 -13
- package/{docUpdateCommands-QPL6IVUK.js → docUpdateCommands-ZFZ2QEVK.js} +48 -44
- package/{fetchMessages-EIU7UFFK.js → fetchMessages-3PXAHKCR.js} +5 -5
- package/{getPricing-LUSEABA6.js → getPricing-QVSNUFZ6.js} +4 -4
- package/{handleSendMessageAction-CCL7ETCL.js → handleSendMessageAction-B2VXOLMM.js} +109 -42
- package/index.js +87 -884
- package/{lib-FRRS27KN.js → lib-PU2G2MSO.js} +523 -191
- package/{localDialogRead-BTFJ4V2I.js → localDialogRead-UYCKO7YZ.js} +2 -2
- package/{localRuntimeAuthority-6IR6BBXE.js → localRuntimeAuthority-TU6OBC76.js} +9 -6
- package/{localRuntimeDb-SYQGUF4U.js → localRuntimeDb-VKWVOPPI.js} +1 -1
- package/{machineCommands-2QNINBNI.js → machineCommands-AI3N7JHQ.js} +93 -83
- package/machineWsRunDispatch-RPF2D6VV.js +154 -0
- package/{memberThunks-QGFLFVCI.js → memberThunks-YICJI4IS.js} +20 -18
- package/{models-T3SG6MJ5.js → models-FTNFVO3D.js} +2 -2
- package/oauthTokenStore-ITEB663N.js +23 -0
- package/package.json +1 -1
- package/pdf-U6KSUEZZ.js +26435 -0
- package/processSpawn-SOAV3FEV.js +11 -0
- package/profileConfig-ZGOFORWV.js +43 -0
- package/{providerPresetApply-FG6NZ57W.js → providerPresetApply-OJJXQ7NM.js} +7 -7
- package/{providerRegistry-757OWH3O.js → providerRegistry-DXFBDCGQ.js} +11 -7
- package/{read-COE3ZYR6.js → read-XMBM52Y4.js} +8 -7
- package/{readDocTool-5USN4A6V.js → readDocTool-LAQHKCVT.js} +5 -3
- package/{readlineWorkspace-4GULS23D.js → readlineWorkspace-EPUCVZ73.js} +2594 -2030
- package/{removeDialogAgentAction-IX3MN2ZO.js → removeDialogAgentAction-HDUI2MU3.js} +22 -26
- package/{runAgentClientLoop-MUMLW2SA.js → runAgentClientLoop-OXQMDGAN.js} +78 -71
- package/{runtimeDoctorCommands-X6WDBEQX.js → runtimeDoctorCommands-PIVSBZRZ.js} +4 -4
- package/runtimeModeArgs-2Y7BALTO.js +31 -0
- package/{setDialogExtraReferencesAction-X4HCPNZL.js → setDialogExtraReferencesAction-ADBVOP4O.js} +16 -14
- package/{setPrimaryDialogAgentAction-4GMIQLOD.js → setPrimaryDialogAgentAction-PXVXQJ62.js} +23 -27
- package/{chunk-AFUORTY4.js → settingThunks-G2MJRKUE.js} +226 -940
- package/{skillDiscovery-CYUCJMAG.js → skillDiscovery-ZBU76COE.js} +3 -3
- package/{slateUtils-RIZES3PV.js → slateUtils-NGV2NMKM.js} +1 -1
- package/{spaceCommands-BMXKR7H6.js → spaceCommands-Z662QYY6.js} +51 -47
- package/{streamAgentChatTurn-6EOS5PNG.js → streamAgentChatTurn-YJYEJHP7.js} +214 -114
- package/{switchDialogAgentAction-N52LRPA3.js → switchDialogAgentAction-Z3RZACGF.js} +19 -20
- package/{tableCommands-O6NWHFKV.js → tableCommands-6U4BMLRR.js} +10 -10
- package/{toolApiClient-QVJ6HDNN.js → toolApiClient-AD7CXTA4.js} +4 -3
- package/tools-GHI3WBEI.js +117 -0
- package/{tuiSummaryLlmCaller-WFRWERGK.js → tuiSummaryLlmCaller-WTC6GCQC.js} +25 -23
- package/{updateCommands-2M74UL7P.js → updateCommands-4EHDLF5J.js} +3 -3
- package/{updateDialogTitleAction-4YUVCBDU.js → updateDialogTitleAction-GJCNWTPY.js} +84 -45
- package/action-YVYQEAAV.js +0 -31
- package/agentListCommands-3GWH4E4G.js +0 -410
- package/agentRecordCommands-P76DPWKV.js +0 -128
- package/agentRunCommand-EQPL4F4K.js +0 -156
- package/browser-image-compression-MFDTD7K6.js +0 -1763
- package/chatQueueReduxAdapter-ZBDDI2E5.js +0 -186
- package/chunk-CQ3WA2NE.js +0 -299
- package/chunk-M76ECQRD.js +0 -13658
- package/chunk-MEYIRKDN.js +0 -8967
- package/chunk-PUOC4YRO.js +0 -394
- package/chunk-Q5FJJ6XI.js +0 -103
- package/chunk-S7Z2HMCN.js +0 -25
- package/chunk-WC6UUQ2C.js +0 -20923
- package/chunk-Y5GCAMGP.js +0 -9
- package/chunk-YPREESF4.js +0 -225
- package/createDialogAction-H6URYLIZ.js +0 -65
- package/machineWsRunDispatch-S3XXOKR7.js +0 -144
- package/settingSlice-ZQZVUPKK.js +0 -204
- package/syncMapping-N6RGXGBW.js +0 -437
- package/tools-4AJZHAK3.js +0 -110
- package/{chunk-X7HHHIOZ.js → chunk-Y6ROFCZO.js} +0 -0
- package/{db-WK5MDZVN.js → db-VQSAOWAO.js} +1 -1
|
@@ -10,6 +10,114 @@ var GLOBAL_DIALOG_RUNTIME_KEY = "__global__";
|
|
|
10
10
|
|
|
11
11
|
// packages/chat/dialog/dialogRuntimeStore.ts
|
|
12
12
|
var import_react = __toESM(require_react());
|
|
13
|
+
|
|
14
|
+
// packages/app/utils/localStorageState.ts
|
|
15
|
+
function readStorageJSON(key) {
|
|
16
|
+
if (typeof window === "undefined") return null;
|
|
17
|
+
try {
|
|
18
|
+
const raw = window.localStorage.getItem(key);
|
|
19
|
+
if (!raw) return null;
|
|
20
|
+
return JSON.parse(raw);
|
|
21
|
+
} catch {
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
function writeStorageJSON(key, value) {
|
|
26
|
+
if (typeof window === "undefined") return;
|
|
27
|
+
try {
|
|
28
|
+
window.localStorage.setItem(key, JSON.stringify(value));
|
|
29
|
+
} catch {
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// packages/chat/dialog/mediaJobPendingPersistence.ts
|
|
34
|
+
var MEDIA_JOB_PENDING_STORAGE_KEY = "nolo:chat:media-job-pending:v1";
|
|
35
|
+
var MEDIA_JOB_PENDING_KEEP_PER_DIALOG = 10;
|
|
36
|
+
var currentActorId = null;
|
|
37
|
+
function setMediaJobPendingActor(actorId) {
|
|
38
|
+
currentActorId = actorId && actorId.length > 0 ? actorId : null;
|
|
39
|
+
}
|
|
40
|
+
function getMediaJobPendingActor() {
|
|
41
|
+
return currentActorId;
|
|
42
|
+
}
|
|
43
|
+
var actorKey = () => `@${currentActorId ?? "anon"}`;
|
|
44
|
+
var bucketKeyOf = (dialogKey) => dialogKey ?? GLOBAL_DIALOG_RUNTIME_KEY;
|
|
45
|
+
var isEntry = (value) => {
|
|
46
|
+
if (!value || typeof value !== "object") return false;
|
|
47
|
+
const entry = value;
|
|
48
|
+
return typeof entry.id === "string" && entry.id.length > 0 && typeof entry.name === "string";
|
|
49
|
+
};
|
|
50
|
+
var readAllActors = () => {
|
|
51
|
+
const raw = readStorageJSON(MEDIA_JOB_PENDING_STORAGE_KEY);
|
|
52
|
+
if (!raw || typeof raw !== "object" || Array.isArray(raw)) return {};
|
|
53
|
+
return raw;
|
|
54
|
+
};
|
|
55
|
+
var writeActorMap = (map) => {
|
|
56
|
+
const all = readAllActors();
|
|
57
|
+
all[actorKey()] = map;
|
|
58
|
+
writeStorageJSON(MEDIA_JOB_PENDING_STORAGE_KEY, all);
|
|
59
|
+
};
|
|
60
|
+
function readMediaJobPendingMap() {
|
|
61
|
+
const scoped = readAllActors()[actorKey()];
|
|
62
|
+
if (!scoped || typeof scoped !== "object" || Array.isArray(scoped)) return {};
|
|
63
|
+
const map = {};
|
|
64
|
+
for (const [dialogKey, entries] of Object.entries(scoped)) {
|
|
65
|
+
if (!Array.isArray(entries)) continue;
|
|
66
|
+
const valid = entries.filter(isEntry).map((entry) => ({
|
|
67
|
+
id: entry.id,
|
|
68
|
+
name: entry.name,
|
|
69
|
+
fileKey: typeof entry.fileKey === "string" ? entry.fileKey : void 0,
|
|
70
|
+
mimeType: typeof entry.mimeType === "string" ? entry.mimeType : void 0,
|
|
71
|
+
size: typeof entry.size === "number" ? entry.size : void 0,
|
|
72
|
+
durationSec: typeof entry.durationSec === "number" ? entry.durationSec : void 0,
|
|
73
|
+
savedAt: typeof entry.savedAt === "number" && Number.isFinite(entry.savedAt) ? entry.savedAt : 0
|
|
74
|
+
}));
|
|
75
|
+
if (valid.length) map[dialogKey] = valid;
|
|
76
|
+
}
|
|
77
|
+
return map;
|
|
78
|
+
}
|
|
79
|
+
function upsertMediaJobPendingEntry(entry) {
|
|
80
|
+
const map = readMediaJobPendingMap();
|
|
81
|
+
const dialogKey = bucketKeyOf(entry.dialogKey);
|
|
82
|
+
const kept = (map[dialogKey] ?? []).filter((item) => item.id !== entry.id);
|
|
83
|
+
kept.push({ ...entry, savedAt: Date.now() });
|
|
84
|
+
map[dialogKey] = kept.slice(-MEDIA_JOB_PENDING_KEEP_PER_DIALOG);
|
|
85
|
+
writeActorMap(map);
|
|
86
|
+
}
|
|
87
|
+
function removeMediaJobPendingEntryById(id) {
|
|
88
|
+
const map = readMediaJobPendingMap();
|
|
89
|
+
let changed = false;
|
|
90
|
+
for (const [dialogKey, entries] of Object.entries(map)) {
|
|
91
|
+
const kept = entries.filter((entry) => entry.id !== id);
|
|
92
|
+
if (kept.length !== entries.length) {
|
|
93
|
+
changed = true;
|
|
94
|
+
if (kept.length) map[dialogKey] = kept;
|
|
95
|
+
else delete map[dialogKey];
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
if (changed) writeActorMap(map);
|
|
99
|
+
}
|
|
100
|
+
function clearMediaJobPendingEntries(payload) {
|
|
101
|
+
if (payload?.all) {
|
|
102
|
+
writeStorageJSON(MEDIA_JOB_PENDING_STORAGE_KEY, {});
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
const dialogKey = bucketKeyOf(payload?.dialogKey);
|
|
106
|
+
const map = readMediaJobPendingMap();
|
|
107
|
+
if (!(dialogKey in map)) return;
|
|
108
|
+
delete map[dialogKey];
|
|
109
|
+
writeActorMap(map);
|
|
110
|
+
}
|
|
111
|
+
function pruneMediaJobPendingEntries(dialogKey, keep = MEDIA_JOB_PENDING_KEEP_PER_DIALOG) {
|
|
112
|
+
const key = bucketKeyOf(dialogKey);
|
|
113
|
+
const map = readMediaJobPendingMap();
|
|
114
|
+
const entries = map[key];
|
|
115
|
+
if (!entries || entries.length <= keep) return;
|
|
116
|
+
map[key] = entries.slice(-keep);
|
|
117
|
+
writeActorMap(map);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// packages/chat/dialog/dialogRuntimeStore.ts
|
|
13
121
|
var createEmptyTokenStats = () => ({
|
|
14
122
|
inputTokens: 0,
|
|
15
123
|
outputTokens: 0,
|
|
@@ -21,7 +129,10 @@ var createEmptyDialogRuntimeState = () => ({
|
|
|
21
129
|
activeControllers: {},
|
|
22
130
|
pendingRawData: {},
|
|
23
131
|
loopStopReason: null,
|
|
24
|
-
|
|
132
|
+
turnPhase: null,
|
|
133
|
+
turnPhaseTurnId: null,
|
|
134
|
+
pendingUserInputQueue: [],
|
|
135
|
+
recoveredForegroundTurn: null
|
|
25
136
|
});
|
|
26
137
|
var activeDialogKey = null;
|
|
27
138
|
var configError = null;
|
|
@@ -67,6 +178,8 @@ function resetDialogRuntimeSessionState(dialogKey) {
|
|
|
67
178
|
const runtime = ensureDialogRuntimeState(dialogKey);
|
|
68
179
|
runtime.tokens = createEmptyTokenStats();
|
|
69
180
|
runtime.loopStopReason = null;
|
|
181
|
+
runtime.turnPhase = null;
|
|
182
|
+
runtime.turnPhaseTurnId = null;
|
|
70
183
|
runtime.pendingUserInputQueue = [];
|
|
71
184
|
notify();
|
|
72
185
|
}
|
|
@@ -74,21 +187,49 @@ function addPendingFile(payload) {
|
|
|
74
187
|
const targetRuntimeKey = payload.targetDialogKey ?? payload.runtimeDialogKey ?? (payload.type === "dialog" ? activeDialogKey : payload.dialogKey);
|
|
75
188
|
const runtime = ensureDialogRuntimeState(targetRuntimeKey);
|
|
76
189
|
if (!runtime.pendingFiles.some((f) => f.id === payload.id)) {
|
|
77
|
-
runtime.pendingFiles.
|
|
190
|
+
runtime.pendingFiles = [...runtime.pendingFiles, payload];
|
|
191
|
+
if (payload.type === "media_job") {
|
|
192
|
+
upsertMediaJobPendingEntry({
|
|
193
|
+
id: payload.id,
|
|
194
|
+
name: payload.name,
|
|
195
|
+
fileKey: payload.fileKey,
|
|
196
|
+
mimeType: payload.mimeType,
|
|
197
|
+
size: payload.size,
|
|
198
|
+
durationSec: payload.durationSec,
|
|
199
|
+
// 与写入侧 bucket 推导严格同源:`dialogKey || GLOBAL_DIALOG_RUNTIME_KEY`
|
|
200
|
+
// (useMessageInputFiles 的 effectiveDialogKey 同规则)。不依赖
|
|
201
|
+
// activeDialogKey 隐式回退,保证恢复时读到的就是当初写入的 bucket。
|
|
202
|
+
dialogKey: payload.dialogKey ?? GLOBAL_DIALOG_RUNTIME_KEY
|
|
203
|
+
});
|
|
204
|
+
}
|
|
78
205
|
notify();
|
|
79
206
|
}
|
|
80
207
|
return action("dialogRuntime/addPendingFile", payload);
|
|
81
208
|
}
|
|
82
209
|
function removePendingFile(fileId) {
|
|
83
210
|
const runtime = ensureDialogRuntimeState();
|
|
84
|
-
|
|
211
|
+
let fileToRemove = runtime.pendingFiles.find((f) => f.id === fileId);
|
|
212
|
+
let runtimeHoldingFile = runtime;
|
|
213
|
+
if (!fileToRemove) {
|
|
214
|
+
for (const candidate of Object.values(runtimeByKey)) {
|
|
215
|
+
const found = candidate.pendingFiles.find((f) => f.id === fileId);
|
|
216
|
+
if (found) {
|
|
217
|
+
fileToRemove = found;
|
|
218
|
+
runtimeHoldingFile = candidate;
|
|
219
|
+
break;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
}
|
|
85
223
|
if (fileToRemove) {
|
|
86
224
|
if (fileToRemove.pageKey) {
|
|
87
|
-
delete
|
|
225
|
+
delete runtimeHoldingFile.pendingRawData[fileToRemove.pageKey];
|
|
88
226
|
}
|
|
89
|
-
|
|
227
|
+
runtimeHoldingFile.pendingFiles = runtimeHoldingFile.pendingFiles.filter(
|
|
90
228
|
(file) => file.id !== fileId
|
|
91
229
|
);
|
|
230
|
+
if (fileToRemove.type === "media_job") {
|
|
231
|
+
removeMediaJobPendingEntryById(fileToRemove.id);
|
|
232
|
+
}
|
|
92
233
|
notify();
|
|
93
234
|
}
|
|
94
235
|
return action("dialogRuntime/removePendingFile", fileId);
|
|
@@ -99,10 +240,14 @@ function clearPendingAttachments(payload) {
|
|
|
99
240
|
runtime2.pendingFiles = [];
|
|
100
241
|
runtime2.pendingRawData = {};
|
|
101
242
|
});
|
|
243
|
+
clearMediaJobPendingEntries({ all: true });
|
|
102
244
|
notify();
|
|
103
245
|
return action("dialogRuntime/clearPendingAttachments", payload);
|
|
104
246
|
}
|
|
105
247
|
const runtime = ensureDialogRuntimeState(payload?.dialogKey);
|
|
248
|
+
runtime.pendingFiles.forEach((file) => {
|
|
249
|
+
if (file.type === "media_job") removeMediaJobPendingEntryById(file.id);
|
|
250
|
+
});
|
|
106
251
|
runtime.pendingFiles = [];
|
|
107
252
|
runtime.pendingRawData = {};
|
|
108
253
|
notify();
|
|
@@ -114,11 +259,89 @@ function setLoopStopReason(payload) {
|
|
|
114
259
|
notify();
|
|
115
260
|
return action("dialogRuntime/setLoopStopReason", payload);
|
|
116
261
|
}
|
|
262
|
+
function setRecoveredForegroundTurn(payload) {
|
|
263
|
+
const runtime = ensureDialogRuntimeState(payload.dialogKey);
|
|
264
|
+
runtime.recoveredForegroundTurn = payload.status;
|
|
265
|
+
notify();
|
|
266
|
+
return action("dialogRuntime/setRecoveredForegroundTurn", payload);
|
|
267
|
+
}
|
|
268
|
+
function claimDialogTurnPhase(payload) {
|
|
269
|
+
const runtime = ensureDialogRuntimeState(payload.dialogKey);
|
|
270
|
+
runtime.turnPhaseTurnId = payload.turnId;
|
|
271
|
+
runtime.turnPhase = null;
|
|
272
|
+
notify();
|
|
273
|
+
return action("dialogRuntime/claimDialogTurnPhase", payload);
|
|
274
|
+
}
|
|
275
|
+
function setDialogTurnPhase(payload) {
|
|
276
|
+
const runtime = ensureDialogRuntimeState(payload.dialogKey);
|
|
277
|
+
if (typeof payload.turnId === "string" && runtime.turnPhaseTurnId !== null && runtime.turnPhaseTurnId !== payload.turnId) {
|
|
278
|
+
return action("dialogRuntime/setDialogTurnPhase:rejected", payload);
|
|
279
|
+
}
|
|
280
|
+
runtime.turnPhase = payload.phase;
|
|
281
|
+
runtime.turnPhaseTurnId = payload.phase === null ? null : payload.turnId ?? null;
|
|
282
|
+
notify();
|
|
283
|
+
return action("dialogRuntime/setDialogTurnPhase", payload);
|
|
284
|
+
}
|
|
285
|
+
function clearDialogTurnPhase(payload = {}) {
|
|
286
|
+
return setDialogTurnPhase({ phase: null, dialogKey: payload.dialogKey, turnId: payload.turnId });
|
|
287
|
+
}
|
|
117
288
|
function clearDialogRuntimeState(payload) {
|
|
289
|
+
const runtime = runtimeByKey[payload.dialogKey];
|
|
290
|
+
runtime?.pendingFiles.forEach((file) => {
|
|
291
|
+
if (file.type === "media_job") removeMediaJobPendingEntryById(file.id);
|
|
292
|
+
});
|
|
118
293
|
delete runtimeByKey[payload.dialogKey];
|
|
119
294
|
notify();
|
|
120
295
|
return action("dialogRuntime/clearDialogRuntimeState", payload);
|
|
121
296
|
}
|
|
297
|
+
function restoreMediaJobPendingFiles(dialogKey) {
|
|
298
|
+
const runtimeKey = resolveDialogRuntimeKey(dialogKey);
|
|
299
|
+
const entries = (readMediaJobPendingMap()[runtimeKey] ?? []).slice(-MEDIA_JOB_PENDING_KEEP_PER_DIALOG);
|
|
300
|
+
if (!entries.length) return 0;
|
|
301
|
+
const runtime = ensureDialogRuntimeState(runtimeKey);
|
|
302
|
+
const existingIds = new Set(runtime.pendingFiles.map((file) => file.id));
|
|
303
|
+
let restored = 0;
|
|
304
|
+
for (const entry of entries) {
|
|
305
|
+
if (existingIds.has(entry.id)) continue;
|
|
306
|
+
addPendingFile({
|
|
307
|
+
id: entry.id,
|
|
308
|
+
name: entry.name,
|
|
309
|
+
type: "media_job",
|
|
310
|
+
fileKey: entry.fileKey,
|
|
311
|
+
mimeType: entry.mimeType,
|
|
312
|
+
size: entry.size,
|
|
313
|
+
durationSec: entry.durationSec,
|
|
314
|
+
trackingId: entry.id,
|
|
315
|
+
dialogKey: runtimeKey
|
|
316
|
+
});
|
|
317
|
+
restored += 1;
|
|
318
|
+
}
|
|
319
|
+
pruneMediaJobPendingEntries(runtimeKey);
|
|
320
|
+
return restored;
|
|
321
|
+
}
|
|
322
|
+
var MEDIA_NOTE_PAGE_KEY_PREFIX = "media-note:";
|
|
323
|
+
var isMediaNotePageReference = (pageKey) => typeof pageKey === "string" && pageKey.startsWith(MEDIA_NOTE_PAGE_KEY_PREFIX);
|
|
324
|
+
var getMediaJobRuntimeActor = () => getMediaJobPendingActor();
|
|
325
|
+
function setMediaJobRuntimeActor(actorId) {
|
|
326
|
+
const next = actorId && actorId.length ? actorId : null;
|
|
327
|
+
if (getMediaJobPendingActor() === next) return;
|
|
328
|
+
setMediaJobPendingActor(next);
|
|
329
|
+
for (const key of Object.keys(runtimeByKey)) {
|
|
330
|
+
const runtime = runtimeByKey[key];
|
|
331
|
+
const kept = runtime.pendingFiles.filter(
|
|
332
|
+
(f) => f.type !== "media_job" && !isMediaNotePageReference(f.pageKey)
|
|
333
|
+
);
|
|
334
|
+
if (kept.length !== runtime.pendingFiles.length) {
|
|
335
|
+
runtime.pendingFiles = kept;
|
|
336
|
+
}
|
|
337
|
+
for (const pageKey of Object.keys(runtime.pendingRawData)) {
|
|
338
|
+
if (isMediaNotePageReference(pageKey)) {
|
|
339
|
+
delete runtime.pendingRawData[pageKey];
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
notify();
|
|
344
|
+
}
|
|
122
345
|
function addActiveController(payload) {
|
|
123
346
|
const runtime = ensureDialogRuntimeState(payload.dialogKey);
|
|
124
347
|
runtime.activeControllers[payload.messageId] = payload.controller;
|
|
@@ -181,7 +404,7 @@ function tokenUsageLiveUpdate(payload) {
|
|
|
181
404
|
}
|
|
182
405
|
function addPageReferenceToRuntime(payload) {
|
|
183
406
|
const runtime = ensureDialogRuntimeState(payload.dialogKey);
|
|
184
|
-
runtime.pendingFiles.
|
|
407
|
+
runtime.pendingFiles = [...runtime.pendingFiles, payload.reference];
|
|
185
408
|
if (payload.rawData?.pageKey) {
|
|
186
409
|
runtime.pendingRawData[payload.rawData.pageKey] = payload.rawData;
|
|
187
410
|
}
|
|
@@ -258,6 +481,12 @@ function getPendingUserInputQueue(dialogKey) {
|
|
|
258
481
|
function getLoopStopReason(dialogKey) {
|
|
259
482
|
return getDialogRuntimeState(dialogKey).loopStopReason;
|
|
260
483
|
}
|
|
484
|
+
function getDialogTurnPhase(dialogKey) {
|
|
485
|
+
return getDialogRuntimeState(dialogKey).turnPhase;
|
|
486
|
+
}
|
|
487
|
+
function getRecoveredForegroundTurn(dialogKey) {
|
|
488
|
+
return getDialogRuntimeState(dialogKey).recoveredForegroundTurn;
|
|
489
|
+
}
|
|
261
490
|
var selectDialogRuntimeByKey = (_state, dialogKey) => getDialogRuntimeState(dialogKey);
|
|
262
491
|
var selectPendingFiles = (_state, dialogKey) => getPendingFiles(dialogKey);
|
|
263
492
|
var selectActiveControllers = (_state, dialogKey) => getActiveControllers(dialogKey);
|
|
@@ -293,6 +522,14 @@ function useLoopStopReason(dialogKey) {
|
|
|
293
522
|
(0, import_react.useSyncExternalStore)(subscribe, getSnapshot, getSnapshot);
|
|
294
523
|
return getLoopStopReason(dialogKey);
|
|
295
524
|
}
|
|
525
|
+
function useDialogTurnPhase(dialogKey) {
|
|
526
|
+
(0, import_react.useSyncExternalStore)(subscribe, getSnapshot, getSnapshot);
|
|
527
|
+
return getDialogTurnPhase(dialogKey);
|
|
528
|
+
}
|
|
529
|
+
function useRecoveredForegroundTurn(dialogKey) {
|
|
530
|
+
(0, import_react.useSyncExternalStore)(subscribe, getSnapshot, getSnapshot);
|
|
531
|
+
return getRecoveredForegroundTurn(dialogKey);
|
|
532
|
+
}
|
|
296
533
|
function useDialogRuntimeTokens(dialogKey) {
|
|
297
534
|
(0, import_react.useSyncExternalStore)(subscribe, getSnapshot, getSnapshot);
|
|
298
535
|
return getDialogRuntimeTokens(dialogKey);
|
|
@@ -316,7 +553,14 @@ export {
|
|
|
316
553
|
removePendingFile,
|
|
317
554
|
clearPendingAttachments,
|
|
318
555
|
setLoopStopReason,
|
|
556
|
+
setRecoveredForegroundTurn,
|
|
557
|
+
claimDialogTurnPhase,
|
|
558
|
+
setDialogTurnPhase,
|
|
559
|
+
clearDialogTurnPhase,
|
|
319
560
|
clearDialogRuntimeState,
|
|
561
|
+
restoreMediaJobPendingFiles,
|
|
562
|
+
getMediaJobRuntimeActor,
|
|
563
|
+
setMediaJobRuntimeActor,
|
|
320
564
|
addActiveController,
|
|
321
565
|
removeActiveController,
|
|
322
566
|
clearActiveControllers,
|
|
@@ -330,8 +574,7 @@ export {
|
|
|
330
574
|
deleteDialogRuntime,
|
|
331
575
|
abortActiveControllers,
|
|
332
576
|
getDialogRuntimeTokens,
|
|
333
|
-
|
|
334
|
-
getLoopStopReason,
|
|
577
|
+
getRecoveredForegroundTurn,
|
|
335
578
|
selectDialogRuntimeByKey,
|
|
336
579
|
selectPendingFiles,
|
|
337
580
|
selectActiveControllers,
|
|
@@ -346,6 +589,8 @@ export {
|
|
|
346
589
|
useActiveControllers,
|
|
347
590
|
usePendingUserInputQueue,
|
|
348
591
|
useLoopStopReason,
|
|
592
|
+
useDialogTurnPhase,
|
|
593
|
+
useRecoveredForegroundTurn,
|
|
349
594
|
useDialogRuntimeTokens,
|
|
350
595
|
useCurrentDialogKey,
|
|
351
596
|
useDialogConfigError
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import {
|
|
2
|
+
noloAgentId
|
|
3
|
+
} from "./chunk-TLYSGGPG.js";
|
|
4
|
+
import {
|
|
5
|
+
asTrimmedLowercaseString
|
|
6
|
+
} from "./chunk-QSJ3HFEF.js";
|
|
7
|
+
import {
|
|
8
|
+
normalizeServerOrigin
|
|
9
|
+
} from "./chunk-CF7PE763.js";
|
|
10
|
+
|
|
11
|
+
// packages/app/theme/fontPreference.ts
|
|
12
|
+
var FONT_PRESET_ALIASES = {
|
|
13
|
+
system: "system",
|
|
14
|
+
default: "system",
|
|
15
|
+
hei: "hei",
|
|
16
|
+
heiti: "hei",
|
|
17
|
+
sans: "hei",
|
|
18
|
+
song: "song",
|
|
19
|
+
songti: "song",
|
|
20
|
+
serif: "song",
|
|
21
|
+
kai: "kai",
|
|
22
|
+
kaiti: "kai",
|
|
23
|
+
"kai-ti": "kai",
|
|
24
|
+
"fang-song": "fang-song",
|
|
25
|
+
fangsong: "fang-song",
|
|
26
|
+
"fang song": "fang-song"
|
|
27
|
+
};
|
|
28
|
+
var normalizeFontPreset = (value) => {
|
|
29
|
+
const normalized = asTrimmedLowercaseString(value);
|
|
30
|
+
return FONT_PRESET_ALIASES[normalized];
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
// packages/ai/policy/types.ts
|
|
34
|
+
var DEFAULT_AGENT_BASE_POLICY = {
|
|
35
|
+
version: 1,
|
|
36
|
+
tone: {
|
|
37
|
+
preset: "default",
|
|
38
|
+
resolutionMode: "blend"
|
|
39
|
+
},
|
|
40
|
+
knowledgeCaptureMaxLevel: 4,
|
|
41
|
+
spaceContextMaxLevel: 4,
|
|
42
|
+
selfEvolutionMode: "knowledge_only"
|
|
43
|
+
};
|
|
44
|
+
var DEFAULT_USER_PREFERENCE_PROFILE = {
|
|
45
|
+
version: 1,
|
|
46
|
+
tone: {
|
|
47
|
+
preset: "default"
|
|
48
|
+
},
|
|
49
|
+
knowledgeCaptureLevel: 2,
|
|
50
|
+
spaceContextLevel: 3
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
// packages/app/settings/settingTypes.ts
|
|
54
|
+
var SYSTEM_DEFAULT_AGENT_ID = "system-default";
|
|
55
|
+
|
|
56
|
+
// packages/app/settings/settingNormalizers.ts
|
|
57
|
+
var hasOwn = (target, key) => Object.prototype.hasOwnProperty.call(target, key);
|
|
58
|
+
var normalizeDefaultAgentIdSetting = (value) => {
|
|
59
|
+
if (typeof value !== "string" || value.trim() === "") {
|
|
60
|
+
return void 0;
|
|
61
|
+
}
|
|
62
|
+
return value === noloAgentId || value === SYSTEM_DEFAULT_AGENT_ID ? SYSTEM_DEFAULT_AGENT_ID : value;
|
|
63
|
+
};
|
|
64
|
+
var normalizeAuthorityHomeServerSetting = (value) => {
|
|
65
|
+
const normalized = normalizeServerOrigin(value);
|
|
66
|
+
return /^https?:\/\//i.test(normalized) ? normalized : null;
|
|
67
|
+
};
|
|
68
|
+
var normalizeTonePresetSetting = (value) => {
|
|
69
|
+
switch (value) {
|
|
70
|
+
case "professional":
|
|
71
|
+
case "friendly":
|
|
72
|
+
case "direct":
|
|
73
|
+
case "pragmatic":
|
|
74
|
+
case "default":
|
|
75
|
+
return value;
|
|
76
|
+
default:
|
|
77
|
+
return DEFAULT_USER_PREFERENCE_PROFILE.tone?.preset ?? "default";
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
var normalizePolicyLevelSetting = (value, fallback) => {
|
|
81
|
+
const n = Number(value);
|
|
82
|
+
if (n === 1 || n === 2 || n === 3 || n === 4) {
|
|
83
|
+
return n;
|
|
84
|
+
}
|
|
85
|
+
return fallback;
|
|
86
|
+
};
|
|
87
|
+
var resolveDefaultAgentIdSetting = (value) => normalizeDefaultAgentIdSetting(value) ?? SYSTEM_DEFAULT_AGENT_ID;
|
|
88
|
+
var omitKeys = (record, keys) => {
|
|
89
|
+
const next = { ...record };
|
|
90
|
+
keys.forEach((key) => {
|
|
91
|
+
delete next[key];
|
|
92
|
+
});
|
|
93
|
+
return next;
|
|
94
|
+
};
|
|
95
|
+
var isRecordLike = (v) => typeof v === "object" && v !== null && !Array.isArray(v);
|
|
96
|
+
var normalizeSystemBuiltinSkills = (value, defaults) => {
|
|
97
|
+
const base = isRecordLike(value) ? value : {};
|
|
98
|
+
const result = { ...defaults };
|
|
99
|
+
for (const key of Object.keys(base)) {
|
|
100
|
+
result[key] = Boolean(base[key]);
|
|
101
|
+
}
|
|
102
|
+
return result;
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
// packages/ai/policy/selfUpdateFields.ts
|
|
106
|
+
var AGENT_UPDATE_FIELD_NAMES = [
|
|
107
|
+
"name",
|
|
108
|
+
"handle",
|
|
109
|
+
"model",
|
|
110
|
+
"provider",
|
|
111
|
+
"prompt",
|
|
112
|
+
"introduction",
|
|
113
|
+
"greeting",
|
|
114
|
+
"isPublic",
|
|
115
|
+
"tags",
|
|
116
|
+
"tools",
|
|
117
|
+
"references",
|
|
118
|
+
"temperature",
|
|
119
|
+
"top_p",
|
|
120
|
+
"frequency_penalty",
|
|
121
|
+
"presence_penalty",
|
|
122
|
+
"max_tokens",
|
|
123
|
+
"reasoning_effort"
|
|
124
|
+
];
|
|
125
|
+
var PRIMARY_AUTO_APPROVE_SELF_UPDATE_FIELDS = [
|
|
126
|
+
"greeting",
|
|
127
|
+
"introduction",
|
|
128
|
+
"tags"
|
|
129
|
+
];
|
|
130
|
+
var DEFAULT_AUTO_APPROVED_SELF_UPDATE_FIELDS = [
|
|
131
|
+
...PRIMARY_AUTO_APPROVE_SELF_UPDATE_FIELDS
|
|
132
|
+
];
|
|
133
|
+
var VALID_AGENT_UPDATE_FIELDS = new Set(AGENT_UPDATE_FIELD_NAMES);
|
|
134
|
+
var normalizeAgentUpdateFieldList = (value, fallback = DEFAULT_AUTO_APPROVED_SELF_UPDATE_FIELDS) => {
|
|
135
|
+
if (!Array.isArray(value)) {
|
|
136
|
+
return [...fallback];
|
|
137
|
+
}
|
|
138
|
+
const normalized = Array.from(
|
|
139
|
+
new Set(
|
|
140
|
+
value.filter(
|
|
141
|
+
(item) => typeof item === "string" && VALID_AGENT_UPDATE_FIELDS.has(item)
|
|
142
|
+
)
|
|
143
|
+
)
|
|
144
|
+
);
|
|
145
|
+
return normalized;
|
|
146
|
+
};
|
|
147
|
+
|
|
148
|
+
export {
|
|
149
|
+
normalizeFontPreset,
|
|
150
|
+
DEFAULT_AGENT_BASE_POLICY,
|
|
151
|
+
DEFAULT_USER_PREFERENCE_PROFILE,
|
|
152
|
+
AGENT_UPDATE_FIELD_NAMES,
|
|
153
|
+
DEFAULT_AUTO_APPROVED_SELF_UPDATE_FIELDS,
|
|
154
|
+
normalizeAgentUpdateFieldList,
|
|
155
|
+
SYSTEM_DEFAULT_AGENT_ID,
|
|
156
|
+
hasOwn,
|
|
157
|
+
normalizeDefaultAgentIdSetting,
|
|
158
|
+
normalizeAuthorityHomeServerSetting,
|
|
159
|
+
normalizeTonePresetSetting,
|
|
160
|
+
normalizePolicyLevelSetting,
|
|
161
|
+
resolveDefaultAgentIdSetting,
|
|
162
|
+
omitKeys,
|
|
163
|
+
normalizeSystemBuiltinSkills
|
|
164
|
+
};
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
// packages/cli/secretScan.ts
|
|
2
|
+
var ASSIGNMENT_KEYS = [
|
|
3
|
+
{ label: "password", keys: "password|passwd", min: 8 },
|
|
4
|
+
{ label: "psk", keys: "psk", min: 8 },
|
|
5
|
+
{ label: "api key", keys: "api[_-]?key|apikey", min: 12 },
|
|
6
|
+
{ label: "token", keys: "token|secret", min: 12 }
|
|
7
|
+
];
|
|
8
|
+
var ASSIGNMENT_PATTERNS = ASSIGNMENT_KEYS.map(
|
|
9
|
+
({ label, keys, min }) => ({
|
|
10
|
+
label,
|
|
11
|
+
// 反向引用 \1 让引号成对成为必要条件:半截引号不算。值里允许空格与逗号——
|
|
12
|
+
// 写成带空格的口令是常见形态,旧的字符类会把这种值截成半截从而整条漏掉。
|
|
13
|
+
quoted: new RegExp(
|
|
14
|
+
`\\b(?:${keys})\\s*[:=]\\s*(["'])([^"']{${min},})\\1`,
|
|
15
|
+
"i"
|
|
16
|
+
),
|
|
17
|
+
// 不带引号时只取到分隔符为止,是否算密钥交给 looksLikeBareSecret 判。
|
|
18
|
+
bare: new RegExp(
|
|
19
|
+
`\\b(?:${keys})\\s*[:=]\\s*([^\\s"',#]{${min},})`,
|
|
20
|
+
"i"
|
|
21
|
+
)
|
|
22
|
+
})
|
|
23
|
+
);
|
|
24
|
+
var PRIVATE_KEY_PATTERN = /-----BEGIN [A-Z ]*PRIVATE KEY-----/;
|
|
25
|
+
var EXPRESSION_CHARS = /[?(){};|&<>$]/;
|
|
26
|
+
var CONSTANT_CASE = /^[A-Z][A-Z0-9_]*$/;
|
|
27
|
+
var CAMEL_CASE = /^[a-z][a-z0-9]*(?:[A-Z][a-z0-9]+)+$/;
|
|
28
|
+
var PROPERTY_SEGMENT = /^[A-Za-z_$][\w$]*$/;
|
|
29
|
+
var NAME_FORM_MAX_CHARS = 48;
|
|
30
|
+
var PROPERTY_SEGMENT_MAX_CHARS = 24;
|
|
31
|
+
function looksLikeDottedName(value) {
|
|
32
|
+
const segments = value.split(".");
|
|
33
|
+
if (segments.length < 2) return false;
|
|
34
|
+
return segments.every(
|
|
35
|
+
(segment) => PROPERTY_SEGMENT.test(segment) && (segment.length <= PROPERTY_SEGMENT_MAX_CHARS || CONSTANT_CASE.test(segment) && segment.includes("_"))
|
|
36
|
+
);
|
|
37
|
+
}
|
|
38
|
+
function stripTrailingMarkdownFence(value) {
|
|
39
|
+
return value.replace(/`+$/, "");
|
|
40
|
+
}
|
|
41
|
+
function looksLikeBareSecret(rawValue) {
|
|
42
|
+
const value = stripTrailingMarkdownFence(rawValue);
|
|
43
|
+
if (EXPRESSION_CHARS.test(value)) return false;
|
|
44
|
+
if (CONSTANT_CASE.test(value) && value.includes("_")) return false;
|
|
45
|
+
if (looksLikeDottedName(value)) return false;
|
|
46
|
+
if (value.length > NAME_FORM_MAX_CHARS) {
|
|
47
|
+
return /\d/.test(value);
|
|
48
|
+
}
|
|
49
|
+
if (CAMEL_CASE.test(value)) return false;
|
|
50
|
+
return true;
|
|
51
|
+
}
|
|
52
|
+
function toPreview(line) {
|
|
53
|
+
return line.length > 120 ? `${line.slice(0, 117)}...` : line;
|
|
54
|
+
}
|
|
55
|
+
function findPotentialSecrets(text) {
|
|
56
|
+
const findings = [];
|
|
57
|
+
text.split(/\r?\n/).forEach((line, index) => {
|
|
58
|
+
const lineNumber = index + 1;
|
|
59
|
+
const preview = toPreview(line);
|
|
60
|
+
for (const { label, quoted, bare } of ASSIGNMENT_PATTERNS) {
|
|
61
|
+
if (quoted.test(line)) {
|
|
62
|
+
findings.push({ label, line: lineNumber, preview });
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
const bareMatch = bare.exec(line);
|
|
66
|
+
if (bareMatch && looksLikeBareSecret(bareMatch[1])) {
|
|
67
|
+
findings.push({ label, line: lineNumber, preview });
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
if (PRIVATE_KEY_PATTERN.test(line)) {
|
|
71
|
+
findings.push({ label: "private key", line: lineNumber, preview });
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
return findings;
|
|
75
|
+
}
|
|
76
|
+
function formatSecretFindings(findings) {
|
|
77
|
+
return findings.map((finding) => ` line ${finding.line} (${finding.label}): ${finding.preview}`).join("\n");
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
export {
|
|
81
|
+
findPotentialSecrets,
|
|
82
|
+
formatSecretFindings
|
|
83
|
+
};
|