nolo-cli 0.104.0-alpha.1 → 0.104.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 +1 -1
- package/{_executeModel-4W7C3ACS.js → _executeModel-JXG5TLPE.js} +75 -68
- package/action-GVA5ARSJ.js +20 -0
- package/{addContentAction-O7R66HEX.js → addContentAction-J3DLDV64.js} +12 -11
- package/{addDialogAgentAction-74OA7KYP.js → addDialogAgentAction-PHIXJCF2.js} +18 -19
- package/{agentDeleteCommand-2YAHAZFJ.js → agentDeleteCommand-2AWJGHXG.js} +117 -42
- package/{agentEmailCommands-O2KH4G7U.js → agentEmailCommands-VV5OSILE.js} +98 -88
- package/agentListCommands-OQMRBDWP.js +742 -0
- package/{agentMachineCommands-5I5CCUBM.js → agentMachineCommands-3VLLR6RL.js} +48 -43
- package/{agentProviderCommands-GNPTL5XR.js → agentProviderCommands-XPJYZSCE.js} +97 -2
- package/{agentPullCommand-O5MPVJ5E.js → agentPullCommand-B4T2DJ5H.js} +1 -1
- package/agentRecordCommands-GPIARVOW.js +138 -0
- package/agentRunCommand-LRJTZ7IM.js +167 -0
- package/{agentRunControl-AVJR4JW4.js → agentRunControl-3HWA2LLQ.js} +2 -2
- package/{agentRuntimeLocal-VXZSDIGT.js → agentRuntimeLocal-PV6AZOEU.js} +48 -39
- package/{agentSlice-6LBOYNKN.js → agentSlice-6R3JKS6I.js} +14 -13
- package/{appDeleteCommands-32MHLR4L.js → appDeleteCommands-WEX73P5R.js} +46 -41
- package/{appDeployCommands-WCQOUSOB.js → appDeployCommands-7BAXWA4M.js} +46 -41
- package/{appDeployStatusCommands-6QKB7DYN.js → appDeployStatusCommands-EJ6A2U4X.js} +46 -41
- package/{appGetCommands-SFAPP5PB.js → appGetCommands-SB355OEX.js} +46 -41
- package/{appListCommands-EKUBDRUO.js → appListCommands-TSZDPIKJ.js} +46 -41
- package/{authCommand-F4EFRRX6.js → authCommand-5PB3YRVV.js} +118 -24
- package/{authCommands-RGOGCPP6.js → authCommands-5RTUDYZW.js} +7 -5
- package/{builtinSkillRegistry-FUAVTRVZ.js → builtinSkillRegistry-SBBWTANC.js} +10 -8
- package/{chromeCommands-FZYAU75D.js → chromeCommands-AU5ZJXBG.js} +289 -37
- package/{chromeOpsCommands-62P2Q2YB.js → chromeOpsCommands-ZYTCMNHG.js} +156 -22
- package/{chunk-6OZ36FXI.js → chunk-27ONFIEY.js} +22 -4
- package/{chunk-JEDZAO7L.js → chunk-2SYTUTLI.js} +257 -37
- package/{chunk-HVURBGF3.js → chunk-2U3NHADM.js} +6 -6
- package/{chunk-53HEEOTT.js → chunk-2WJ57RJA.js} +83 -16
- package/{chunk-OIVSQH2O.js → chunk-3BXNTXYI.js} +299 -5
- package/{chunk-V4MJDUSR.js → chunk-3F424ASC.js} +2 -2
- package/{chunk-HJUYAD4A.js → chunk-3Q7NEHAR.js} +5 -5
- package/chunk-44CU7CKA.js +13545 -0
- package/{chunk-EYAQT56M.js → chunk-4DPP773Q.js} +2 -2
- package/chunk-4LCOCOR5.js +50 -0
- package/{chunk-JPGCXHNM.js → chunk-4LKMZ3RR.js} +1 -1
- package/{chunk-2GRGFCF6.js → chunk-4VJAC32I.js} +2 -1
- package/{chunk-6D6VBVEW.js → chunk-4W24JM32.js} +80 -14
- package/{chunk-H62HCIUP.js → chunk-4WMMIL66.js} +35 -22
- package/{chunk-MC4XLIJ7.js → chunk-523DITKR.js} +1 -1
- package/{chunk-ZCYXJSTU.js → chunk-54VPQTOA.js} +66 -94
- 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-GQBOR3G6.js → chunk-7KVZ5LDQ.js} +2 -2
- package/chunk-A4SQRTZ6.js +15 -0
- package/{chunk-L5UXH3B2.js → chunk-AFH5QC6R.js} +58 -9
- package/{chunk-AEOE4Z6Q.js → chunk-AFSY3ZMB.js} +39 -15
- package/chunk-AGIM7IMJ.js +147 -0
- package/{chunk-5UTFL4QJ.js → chunk-AOTBKDRK.js} +7 -0
- package/{chunk-NA35QHCF.js → chunk-AWVP7PPG.js} +1 -1
- package/{chunk-EEGDMATE.js → chunk-B7APRSPS.js} +86 -81
- package/{chunk-W324THOB.js → chunk-BB7LVBTS.js} +20 -11
- package/{chunk-6YTOJY35.js → chunk-BZ7NPA6G.js} +35 -2
- package/{chunk-5H7KJX7J.js → chunk-CFHWVEUJ.js} +5 -5
- package/chunk-CHOZJMJS.js +78 -0
- package/{chunk-ETI2NYVF.js → chunk-CNA27EMD.js} +4 -4
- package/{chunk-ACTMNVHM.js → chunk-CYSYR67N.js} +1 -1
- package/{chunk-WV42OMV7.js → chunk-D2GQE6AF.js} +8 -8
- package/{chunk-GBRG75BQ.js → chunk-D2MDMY2M.js} +1 -0
- package/{chunk-Q554LLSI.js → chunk-DMXLXZKL.js} +1 -1
- package/chunk-DZ7R5V3Y.js +164 -0
- package/{chunk-3VNWWVKB.js → chunk-E3YWHWCR.js} +50 -18
- package/{chunk-KQ4ONNQD.js → chunk-EKPKW6RM.js} +155 -8
- package/{chunk-2J5Y72GY.js → chunk-EP7BWZ4B.js} +1 -1
- package/{chunk-ABQYVJBJ.js → chunk-EV235ILT.js} +5 -5
- package/{chunk-TRV2MIDW.js → chunk-EXAJ6DCR.js} +1 -0
- package/{chunk-3ZW5ZJMM.js → chunk-FGSJ3YMD.js} +23 -28
- package/{chunk-2F7RJC6L.js → chunk-FOXQ7BAB.js} +1 -1
- package/{chunk-SH43IESU.js → chunk-GGC55Q32.js} +199 -29
- package/chunk-GMZLP5DV.js +82 -0
- package/{chunk-DHDMC6FO.js → chunk-GSKPJIHY.js} +14 -9
- 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-ONXOABJR.js → chunk-HNGRBWYF.js} +3 -0
- package/{chunk-VLTIYV3X.js → chunk-HP57OUJO.js} +4 -4
- package/{chunk-NXUYQBDZ.js → chunk-HYXABXCZ.js} +29 -78
- package/{chunk-DNCEALKX.js → chunk-IEJ5YDA4.js} +22 -29
- package/{chunk-O6OSWFZQ.js → chunk-IHPDK6UD.js} +6 -0
- package/{chunk-BP4XNZRM.js → chunk-JIXGJTBU.js} +4 -4
- package/{chunk-GPCZ7UXG.js → chunk-K6U4NKFJ.js} +1 -1
- package/{chunk-Z77CRGTW.js → chunk-KA5O5KQL.js} +1 -1
- package/{chunk-4OEFYTWL.js → chunk-L5WOICCV.js} +67 -48
- package/{chunk-LS2ZANRJ.js → chunk-LOCNXNOU.js} +1 -1
- package/chunk-LWLNLZC5.js +265 -0
- package/{chunk-H66KLASO.js → chunk-LWXE6IFU.js} +567 -519
- package/{chunk-PUOC4YRO.js → chunk-M7VLQGQP.js} +11 -0
- package/chunk-NKWIS6G2.js +442 -0
- package/{chunk-BFU6C242.js → chunk-NMFV26UG.js} +1 -1
- package/{chunk-DJWMIXDZ.js → chunk-NSAFG343.js} +10 -10
- package/{chunk-UKZDAFYT.js → chunk-NSBID7PR.js} +6 -10
- package/{chunk-4J4QNKTW.js → chunk-NTR4SD3P.js} +845 -240
- package/{chunk-FZGV4FGK.js → chunk-NUHHBEJC.js} +378 -187
- package/chunk-NWENLDMM.js +42 -0
- package/chunk-O7SVKKLY.js +875 -0
- package/chunk-OCZKATRC.js +129 -0
- package/{chunk-VMFTFOWF.js → chunk-OKGVNZTL.js} +35 -8
- package/{chunk-KQHGZWSV.js → chunk-OXME3PEE.js} +1 -1
- package/{chunk-JRQFUXY7.js → chunk-P5GCTVGV.js} +99 -22
- package/{chunk-PQFHGD77.js → chunk-QKTESDWK.js} +161 -14
- package/{chunk-U3JZVWIB.js → chunk-QMXJ5KDJ.js} +68 -46
- package/{chunk-GEPUP7OO.js → chunk-QYUBY3OZ.js} +3 -3
- package/{chunk-3BMYXEUW.js → chunk-R5AJODNI.js} +1 -1
- package/{chunk-J4MOO56S.js → chunk-RILRSUGC.js} +10 -2
- package/{chunk-OEVAY4J6.js → chunk-RWX7AY7J.js} +18 -20
- package/{chunk-YY7I6GQ3.js → chunk-S2NSK7AZ.js} +11 -9
- package/{chunk-IIVGDG4I.js → chunk-SJKULPGX.js} +13 -7
- 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-UZGQNTVW.js → chunk-UA324D4O.js} +8 -6
- package/{chunk-YYLHWIW6.js → chunk-UKZX3NHN.js} +1 -1
- package/chunk-UWXDA7L5.js +8005 -0
- package/{chunk-3DII57IT.js → chunk-VCAQFMVN.js} +1 -1
- package/chunk-VIWDGTDA.js +8 -0
- package/chunk-VJVNU77E.js +83 -0
- package/{chunk-A6FMKU7M.js → chunk-VVJ2ENLY.js} +47 -67
- package/{chunk-UKWGR5SS.js → chunk-VY6VFGKR.js} +194 -1144
- package/{chunk-QDSINZM3.js → chunk-WJ3B6FX6.js} +1 -14
- package/{chunk-Q67DOFOO.js → chunk-Y3PMXGLH.js} +2 -0
- package/chunk-YK5MHOWM.js +915 -0
- package/chunk-YV25TM3R.js +780 -0
- package/{chunk-TOP2VXOR.js → chunk-YVU4XVJD.js} +5 -5
- package/{chunk-7SOWRCQQ.js → chunk-Z5NGE5DH.js} +29 -9
- package/{chunk-6VFARHZW.js → chunk-ZBHR642M.js} +994 -1079
- package/chunk-ZRAU6T47.js +56 -0
- package/{chunk-B6P4QKEN.js → chunk-ZSUDOTPL.js} +19 -17
- package/commandRegistry-QU62WJQX.js +833 -0
- package/{contentThunks-LXOZUD2Y.js → contentThunks-VGV3JJVB.js} +37 -35
- package/{cooldownCommands-REAWYVTY.js → cooldownCommands-ZLEPIB4A.js} +2 -2
- package/{createAgentAutomationAction-M5NDEIC6.js → createAgentAutomationAction-ZNVLI4WV.js} +39 -37
- package/createDialogAction-TTUA46DT.js +69 -0
- package/{createPageAction-WY5ZKP2M.js → createPageAction-KUFSC5XW.js} +46 -43
- package/{chunk-ITBLTYQB.js → cursorProvider-YGGNMVWX.js} +2496 -9897
- package/{dbSlice-XVWBAGYN.js → dbSlice-MYEETO73.js} +11 -10
- package/{deleteFile-YG6QMJLU.js → deleteFile-KESP65GC.js} +7 -6
- package/{dialogCommands-5J56DFWN.js → dialogCommands-DRDPEOTL.js} +49 -45
- package/{dialogSlice-HSGREZGA.js → dialogSlice-V2SVSTIV.js} +41 -34
- package/{dist-VODFSGNG.js → dist-NJC2W7I4.js} +61 -54
- package/{docCreateCommands-KYI2DC2U.js → docCreateCommands-M26CFDDQ.js} +48 -43
- package/{docDeleteCommands-67REUSRY.js → docDeleteCommands-LRZHCKVX.js} +49 -44
- package/{docReadCommands-HOSVSBDJ.js → docReadCommands-6QJSISHK.js} +47 -42
- package/{docStore-IIS36NGG.js → docStore-4RWAFNDM.js} +16 -12
- package/{docUpdateCommands-EMGCSMXY.js → docUpdateCommands-W4KU4U5T.js} +48 -43
- package/{fetchMessages-EIU7UFFK.js → fetchMessages-3PXAHKCR.js} +5 -5
- package/{getPricing-LUSEABA6.js → getPricing-NMMFT3YI.js} +4 -4
- package/{handleSendMessageAction-FEHCWMN2.js → handleSendMessageAction-VEWLGB5Z.js} +107 -41
- 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-G5J754EH.js → machineCommands-AEHHCJEW.js} +92 -82
- package/machineWsRunDispatch-MY2KHS36.js +154 -0
- package/{memberThunks-QGFLFVCI.js → memberThunks-EE6TI3TV.js} +20 -18
- package/{models-T3SG6MJ5.js → models-ZPU5EDF4.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-TEBH7FDX.js} +7 -7
- package/{providerRegistry-757OWH3O.js → providerRegistry-CBJLNCET.js} +11 -7
- package/{read-COE3ZYR6.js → read-PJIT2YEJ.js} +7 -6
- package/{readDocTool-5USN4A6V.js → readDocTool-DRSXHGNL.js} +5 -3
- package/{readlineWorkspace-TGCYJFEB.js → readlineWorkspace-7Q6MITLV.js} +2685 -2050
- package/{removeDialogAgentAction-IX3MN2ZO.js → removeDialogAgentAction-IN4WUKJJ.js} +21 -25
- package/{runAgentClientLoop-UY76PPZM.js → runAgentClientLoop-H2JALUVD.js} +76 -70
- package/{runtimeDoctorCommands-X6WDBEQX.js → runtimeDoctorCommands-PIVSBZRZ.js} +4 -4
- package/runtimeModeArgs-2Y7BALTO.js +31 -0
- package/{setDialogExtraReferencesAction-X4HCPNZL.js → setDialogExtraReferencesAction-VDRF7LPK.js} +15 -13
- package/{setPrimaryDialogAgentAction-4GMIQLOD.js → setPrimaryDialogAgentAction-RO6LIWJ4.js} +22 -26
- package/{chunk-AFUORTY4.js → settingThunks-3OPOLOIA.js} +226 -940
- package/{skillDiscovery-CYUCJMAG.js → skillDiscovery-ZBU76COE.js} +3 -3
- package/{slateUtils-RIZES3PV.js → slateUtils-NGV2NMKM.js} +1 -1
- package/{spaceCommands-NKJVJCQQ.js → spaceCommands-UBLL5EF2.js} +51 -46
- package/{streamAgentChatTurn-3YVIO4KE.js → streamAgentChatTurn-FFJWW3FD.js} +214 -108
- package/{switchDialogAgentAction-N52LRPA3.js → switchDialogAgentAction-MVF2JNE7.js} +18 -19
- package/{tableCommands-O6NWHFKV.js → tableCommands-6U4BMLRR.js} +10 -10
- package/{toolApiClient-QVJ6HDNN.js → toolApiClient-EJT6TMFG.js} +3 -3
- package/tools-AZRYLYNK.js +116 -0
- package/{tuiSummaryLlmCaller-WFRWERGK.js → tuiSummaryLlmCaller-7S5HJ3MT.js} +25 -22
- package/{updateCommands-2M74UL7P.js → updateCommands-4EHDLF5J.js} +3 -3
- package/{updateDialogTitleAction-GF5T3VMK.js → updateDialogTitleAction-5WXTRUJM.js} +82 -44
- package/action-YVYQEAAV.js +0 -31
- package/agentListCommands-GUDMBDHZ.js +0 -410
- package/agentRecordCommands-RSS44XHC.js +0 -128
- package/agentRunCommand-P7VHL4ZR.js +0 -156
- package/browser-image-compression-MFDTD7K6.js +0 -1763
- package/chatQueueReduxAdapter-WFROMKD3.js +0 -186
- package/chunk-CQ3WA2NE.js +0 -299
- package/chunk-FQUHIG5X.js +0 -20782
- package/chunk-M76ECQRD.js +0 -13658
- package/chunk-MEYIRKDN.js +0 -8967
- package/chunk-Q5FJJ6XI.js +0 -103
- package/chunk-S7Z2HMCN.js +0 -25
- package/chunk-Y5GCAMGP.js +0 -9
- package/chunk-YPREESF4.js +0 -225
- package/createDialogAction-TDFOINOY.js +0 -65
- package/machineWsRunDispatch-VXYBYYKM.js +0 -144
- package/settingSlice-ZQZVUPKK.js +0 -204
- package/syncMapping-N6RGXGBW.js +0 -437
- package/tools-Q6IBBG33.js +0 -110
- package/{chunk-X7HHHIOZ.js → chunk-Y6ROFCZO.js} +0 -0
- package/{db-WK5MDZVN.js → db-VQSAOWAO.js} +1 -1
|
@@ -1,28 +1,35 @@
|
|
|
1
1
|
import {
|
|
2
2
|
addContentToSpace
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-VVJ2ENLY.js";
|
|
4
4
|
import {
|
|
5
|
+
format,
|
|
5
6
|
prepareAndPersistMessage,
|
|
6
7
|
uiAskChoiceFunc,
|
|
7
8
|
uiAskChoiceFunctionSchema
|
|
8
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-44CU7CKA.js";
|
|
9
10
|
import {
|
|
10
|
-
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
formatISO
|
|
12
|
+
} from "./chunk-ZRAU6T47.js";
|
|
12
13
|
import {
|
|
13
14
|
buildBuiltinObjectSkillReference
|
|
14
|
-
} from "./chunk-
|
|
15
|
-
import {
|
|
16
|
-
PLATFORM_HOSTED_DEEPSEEK_FLASH_MODEL,
|
|
17
|
-
PLATFORM_HOSTED_KIMI_PROVIDER
|
|
18
|
-
} from "./chunk-Q67DOFOO.js";
|
|
15
|
+
} from "./chunk-GSKPJIHY.js";
|
|
19
16
|
import {
|
|
20
17
|
read,
|
|
21
18
|
readAndWait,
|
|
22
19
|
removeCachedEntity,
|
|
23
20
|
upsertSSREntity,
|
|
24
21
|
write
|
|
25
|
-
} from "./chunk-
|
|
22
|
+
} from "./chunk-4WMMIL66.js";
|
|
23
|
+
import {
|
|
24
|
+
PLATFORM_HOSTED_DEEPSEEK_FLASH_MODEL,
|
|
25
|
+
PLATFORM_HOSTED_KIMI_PROVIDER
|
|
26
|
+
} from "./chunk-Y3PMXGLH.js";
|
|
27
|
+
import {
|
|
28
|
+
extractCustomId
|
|
29
|
+
} from "./chunk-M2EJHDJP.js";
|
|
30
|
+
import {
|
|
31
|
+
isRecord
|
|
32
|
+
} from "./chunk-KUG52IAP.js";
|
|
26
33
|
import {
|
|
27
34
|
createAgentKey,
|
|
28
35
|
createDialogKey,
|
|
@@ -30,34 +37,22 @@ import {
|
|
|
30
37
|
dialogMessageRange,
|
|
31
38
|
memoryOwnerRange,
|
|
32
39
|
memorySubjectKindRange
|
|
33
|
-
} from "./chunk-
|
|
34
|
-
import {
|
|
35
|
-
extractCustomId
|
|
36
|
-
} from "./chunk-M2EJHDJP.js";
|
|
40
|
+
} from "./chunk-OKGVNZTL.js";
|
|
37
41
|
import {
|
|
38
42
|
isDevelopment
|
|
39
|
-
} from "./chunk-
|
|
43
|
+
} from "./chunk-HIM3FCLF.js";
|
|
40
44
|
import {
|
|
41
45
|
selectIdentityUserId
|
|
42
46
|
} from "./chunk-SEJ5OS6F.js";
|
|
43
47
|
import {
|
|
44
|
-
|
|
45
|
-
} from "./chunk-
|
|
48
|
+
asOptionalPositiveFiniteNumber
|
|
49
|
+
} from "./chunk-U6VC4MU4.js";
|
|
46
50
|
import {
|
|
47
51
|
asTrimmedString
|
|
48
52
|
} from "./chunk-3EUW3WEO.js";
|
|
49
|
-
import {
|
|
50
|
-
asOptionalPositiveFiniteNumber
|
|
51
|
-
} from "./chunk-U6VC4MU4.js";
|
|
52
53
|
import {
|
|
53
54
|
asOptionalTrimmedString
|
|
54
55
|
} from "./chunk-G3SUCT4W.js";
|
|
55
|
-
import {
|
|
56
|
-
__toESM
|
|
57
|
-
} from "./chunk-4VNS5WPM.js";
|
|
58
|
-
|
|
59
|
-
// packages/chat/dialog/actions/createDialogAction.ts
|
|
60
|
-
var import_date_fns = __toESM(require_date_fns());
|
|
61
56
|
|
|
62
57
|
// packages/chat/dialog/objectAssistantRegistry.ts
|
|
63
58
|
var OBJECT_ASSISTANT_TO_SKILL = {
|
|
@@ -811,7 +806,7 @@ var createDialogAction = async (args, thunkApi) => {
|
|
|
811
806
|
preview: recentRelationshipRecapResolution.recap ?? null
|
|
812
807
|
});
|
|
813
808
|
}
|
|
814
|
-
const time =
|
|
809
|
+
const time = format(/* @__PURE__ */ new Date(), "MM-dd HH:mm");
|
|
815
810
|
const title = titleOverride || (agentMode === "auto" ? "\u65B0\u5BF9\u8BDD" : agentConfig?.name || "Agent") + " " + time;
|
|
816
811
|
const spaceId = explicitSpaceId;
|
|
817
812
|
const dialogPath = createDialogKey(userId);
|
|
@@ -853,7 +848,7 @@ var createDialogAction = async (args, thunkApi) => {
|
|
|
853
848
|
...agentMode === "auto" && autoRoute ? { autoRoute } : {},
|
|
854
849
|
title,
|
|
855
850
|
type: "dialog" /* DIALOG */,
|
|
856
|
-
createdAt:
|
|
851
|
+
createdAt: formatISO(/* @__PURE__ */ new Date()),
|
|
857
852
|
...spaceId && { spaceId },
|
|
858
853
|
category,
|
|
859
854
|
referenceKeys,
|
|
@@ -14,7 +14,7 @@ function buildCliLocalRuntimeDbEnv(env = process.env) {
|
|
|
14
14
|
};
|
|
15
15
|
}
|
|
16
16
|
async function getDefaultCliLocalRuntimeDb(options = {}) {
|
|
17
|
-
const { getDefaultCliLocalRuntimeDb: getAuthorityBackedDb } = await import("./localRuntimeAuthority-
|
|
17
|
+
const { getDefaultCliLocalRuntimeDb: getAuthorityBackedDb } = await import("./localRuntimeAuthority-TU6OBC76.js");
|
|
18
18
|
return getAuthorityBackedDb(options);
|
|
19
19
|
}
|
|
20
20
|
|
|
@@ -5,13 +5,10 @@ import {
|
|
|
5
5
|
isRecord
|
|
6
6
|
} from "./chunk-KUG52IAP.js";
|
|
7
7
|
|
|
8
|
-
// packages/desktop-chrome-connector/chromeConnector.ts
|
|
9
|
-
import { existsSync as existsSync2, readFileSync } from "node:fs";
|
|
10
|
-
import { resolve as resolve2 } from "node:path";
|
|
11
|
-
|
|
12
8
|
// packages/desktop-chrome-connector/uploadSecurity.mjs
|
|
13
|
-
import { existsSync, realpathSync, statSync } from "node:fs";
|
|
14
|
-
import {
|
|
9
|
+
import { existsSync, lstatSync, mkdirSync, realpathSync, statSync } from "node:fs";
|
|
10
|
+
import { homedir } from "node:os";
|
|
11
|
+
import { isAbsolute, join, relative, resolve } from "node:path";
|
|
15
12
|
var DEFAULT_MAX_FILE_BYTES = 25 * 1024 * 1024;
|
|
16
13
|
var DEFAULT_MAX_FILES = 10;
|
|
17
14
|
var UploadSecurityError = class extends Error {
|
|
@@ -28,22 +25,106 @@ function isSubpath(parent, child) {
|
|
|
28
25
|
const rel = relative(parent, child);
|
|
29
26
|
return !rel.startsWith("..") && !isAbsolute(rel);
|
|
30
27
|
}
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
28
|
+
var DEFAULT_UPLOAD_ROOT_SUFFIX = join(".nolo", "uploads");
|
|
29
|
+
function resolveDefaultUploadRoot(env = process.env) {
|
|
30
|
+
let home;
|
|
31
|
+
try {
|
|
32
|
+
home = env?.HOME || homedir();
|
|
33
|
+
} catch (err) {
|
|
34
|
+
throw createUploadSecurityError(
|
|
35
|
+
"path_not_allowed",
|
|
36
|
+
`Could not determine the home directory for the default upload root: ${err instanceof Error ? err.message : String(err)}`
|
|
37
|
+
);
|
|
35
38
|
}
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
+
if (typeof home !== "string" || !isAbsolute(home)) {
|
|
40
|
+
throw createUploadSecurityError(
|
|
41
|
+
"path_not_allowed",
|
|
42
|
+
`Home directory '${String(home)}' must be an absolute path to derive the default upload root '${DEFAULT_UPLOAD_ROOT_SUFFIX}'.`
|
|
43
|
+
);
|
|
44
|
+
}
|
|
45
|
+
return resolve(join(home, DEFAULT_UPLOAD_ROOT_SUFFIX));
|
|
46
|
+
}
|
|
47
|
+
function splitConfiguredRoots(raw) {
|
|
48
|
+
const entries = typeof raw === "string" ? raw.split(",").map((entry) => entry.trim()).filter(Boolean) : [];
|
|
49
|
+
const absolute = [];
|
|
50
|
+
const dropped = [];
|
|
51
|
+
for (const entry of entries) {
|
|
52
|
+
(isAbsolute(entry) ? absolute : dropped).push(entry);
|
|
53
|
+
}
|
|
54
|
+
return { absolute, dropped };
|
|
55
|
+
}
|
|
56
|
+
function resolveUploadRoots(env = process.env) {
|
|
57
|
+
const raw = env?.NOLO_CHROME_UPLOAD_ROOTS;
|
|
58
|
+
if (raw !== void 0) {
|
|
59
|
+
const { absolute, dropped } = splitConfiguredRoots(raw);
|
|
60
|
+
const roots = absolute.map((entry) => {
|
|
61
|
+
const resolved = resolve(entry);
|
|
62
|
+
if (!existsSync(resolved)) {
|
|
63
|
+
return resolved;
|
|
64
|
+
}
|
|
39
65
|
try {
|
|
40
66
|
return realpathSync(resolved);
|
|
41
67
|
} catch {
|
|
42
68
|
return resolved;
|
|
43
69
|
}
|
|
70
|
+
});
|
|
71
|
+
return { configured: true, isDefault: false, roots, dropped };
|
|
72
|
+
}
|
|
73
|
+
const defaultDir = resolveDefaultUploadRoot(env);
|
|
74
|
+
return {
|
|
75
|
+
configured: false,
|
|
76
|
+
isDefault: true,
|
|
77
|
+
roots: [existsSync(defaultDir) ? inspectDefaultUploadRoot(defaultDir) : defaultDir],
|
|
78
|
+
dropped: []
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
function ensureDefaultUploadRoot(env = process.env) {
|
|
82
|
+
if (env?.NOLO_CHROME_UPLOAD_ROOTS !== void 0) {
|
|
83
|
+
return resolveUploadRoots(env);
|
|
84
|
+
}
|
|
85
|
+
const defaultDir = resolveDefaultUploadRoot(env);
|
|
86
|
+
if (!existsSync(defaultDir)) {
|
|
87
|
+
try {
|
|
88
|
+
mkdirSync(defaultDir, { recursive: true, mode: 448 });
|
|
89
|
+
} catch (err) {
|
|
90
|
+
throw createUploadSecurityError(
|
|
91
|
+
"path_not_allowed",
|
|
92
|
+
`Default upload root '${defaultDir}' could not be created: ${err instanceof Error ? err.message : String(err)}`
|
|
93
|
+
);
|
|
44
94
|
}
|
|
45
|
-
|
|
46
|
-
}
|
|
95
|
+
}
|
|
96
|
+
return { configured: false, isDefault: true, roots: [inspectDefaultUploadRoot(defaultDir)], dropped: [] };
|
|
97
|
+
}
|
|
98
|
+
function inspectDefaultUploadRoot(defaultDir) {
|
|
99
|
+
let lst;
|
|
100
|
+
try {
|
|
101
|
+
lst = lstatSync(defaultDir);
|
|
102
|
+
} catch (err) {
|
|
103
|
+
throw createUploadSecurityError(
|
|
104
|
+
"path_not_allowed",
|
|
105
|
+
`Default upload root '${defaultDir}' could not be inspected: ${err instanceof Error ? err.message : String(err)}`
|
|
106
|
+
);
|
|
107
|
+
}
|
|
108
|
+
if (lst.isSymbolicLink()) {
|
|
109
|
+
throw createUploadSecurityError(
|
|
110
|
+
"path_not_allowed",
|
|
111
|
+
`Default upload root '${defaultDir}' is a symbolic link, which is not permitted. Set NOLO_CHROME_UPLOAD_ROOTS to the real directory if you need a custom location.`
|
|
112
|
+
);
|
|
113
|
+
}
|
|
114
|
+
if (!lst.isDirectory()) {
|
|
115
|
+
throw createUploadSecurityError(
|
|
116
|
+
"path_not_allowed",
|
|
117
|
+
`Default upload root '${defaultDir}' is not a directory.`
|
|
118
|
+
);
|
|
119
|
+
}
|
|
120
|
+
try {
|
|
121
|
+
return realpathSync(defaultDir);
|
|
122
|
+
} catch (err) {
|
|
123
|
+
throw createUploadSecurityError(
|
|
124
|
+
"path_not_allowed",
|
|
125
|
+
`Default upload root '${defaultDir}' canonical path could not be resolved: ${err instanceof Error ? err.message : String(err)}`
|
|
126
|
+
);
|
|
127
|
+
}
|
|
47
128
|
}
|
|
48
129
|
function validateUploadFiles(options = {}) {
|
|
49
130
|
const {
|
|
@@ -61,11 +142,14 @@ function validateUploadFiles(options = {}) {
|
|
|
61
142
|
`Too many files: ${files.length} provided, maximum allowed is ${maxFiles}.`
|
|
62
143
|
);
|
|
63
144
|
}
|
|
64
|
-
const
|
|
145
|
+
const rootsInfo = ensureDefaultUploadRoot(env);
|
|
146
|
+
const allowedRoots = rootsInfo.roots;
|
|
65
147
|
if (allowedRoots.length === 0) {
|
|
148
|
+
const dropped = rootsInfo.dropped ?? [];
|
|
149
|
+
const droppedHint = dropped.length ? ` Ignored entries: ${dropped.map((entry) => `'${entry}'`).join(", ")} (only absolute paths are accepted; '~' and relative paths are never expanded).` : "";
|
|
66
150
|
throw createUploadSecurityError(
|
|
67
151
|
"path_not_allowed",
|
|
68
|
-
|
|
152
|
+
`NOLO_CHROME_UPLOAD_ROOTS is set but contains no usable absolute path; all uploads are refused.${droppedHint}`
|
|
69
153
|
);
|
|
70
154
|
}
|
|
71
155
|
const fileStats = [];
|
|
@@ -135,8 +219,29 @@ function logUploadAudit(entry, logFn = console.warn) {
|
|
|
135
219
|
}
|
|
136
220
|
|
|
137
221
|
// packages/desktop-chrome-connector/chromeConnector.ts
|
|
222
|
+
import { existsSync as existsSync2, readFileSync } from "node:fs";
|
|
223
|
+
import { resolve as resolve2 } from "node:path";
|
|
138
224
|
var NOLO_CHROME_CONNECTOR_EXTENSION_ID = "ahpdoopadkamnglhlacfjdfnonpjdplg";
|
|
225
|
+
var NOLO_FIREFOX_CONNECTOR_EXTENSION_ID = "nolo-browser-connector@nolo.chat";
|
|
226
|
+
var NOLO_CONNECTOR_EXTENSION_IDS = [
|
|
227
|
+
NOLO_CHROME_CONNECTOR_EXTENSION_ID,
|
|
228
|
+
NOLO_FIREFOX_CONNECTOR_EXTENSION_ID
|
|
229
|
+
];
|
|
139
230
|
var NOLO_CHROME_CONNECTOR_PROTOCOL_VERSION = "2";
|
|
231
|
+
var NOLO_CHROME_CONNECTOR_DEFAULT_PORTS = {
|
|
232
|
+
chrome: 38947,
|
|
233
|
+
firefox: 38948
|
|
234
|
+
};
|
|
235
|
+
var CONNECTOR_BROWSER_EXTENSION_IDS = {
|
|
236
|
+
chrome: NOLO_CHROME_CONNECTOR_EXTENSION_ID,
|
|
237
|
+
firefox: NOLO_FIREFOX_CONNECTOR_EXTENSION_ID
|
|
238
|
+
};
|
|
239
|
+
function connectorEndpointForBrowser(browser, env = process.env) {
|
|
240
|
+
const explicitUrl = env.NOLO_CHROME_CONNECTOR_RPC_URL;
|
|
241
|
+
if (explicitUrl) return explicitUrl;
|
|
242
|
+
const port = browser === "firefox" ? env.NOLO_FIREFOX_CONNECTOR_PORT : env.NOLO_CHROME_CONNECTOR_PORT;
|
|
243
|
+
return `http://127.0.0.1:${port || NOLO_CHROME_CONNECTOR_DEFAULT_PORTS[browser]}/rpc`;
|
|
244
|
+
}
|
|
140
245
|
function defaultTokenPath() {
|
|
141
246
|
return resolve2(
|
|
142
247
|
process.env.HOME || "",
|
|
@@ -149,6 +254,18 @@ function readConnectorToken(tokenPath = defaultTokenPath()) {
|
|
|
149
254
|
return readFileSync(tokenPath, "utf8").trim();
|
|
150
255
|
}
|
|
151
256
|
var CHROME_TOOL_ACTIONS = {
|
|
257
|
+
browser_list_tabs: "list_tabs",
|
|
258
|
+
browser_open_tab: "open_tab",
|
|
259
|
+
browser_close_tab: "close_tab",
|
|
260
|
+
browser_read_page: "read_page",
|
|
261
|
+
browser_click_element: "click",
|
|
262
|
+
browser_type: "type",
|
|
263
|
+
browser_press: "press",
|
|
264
|
+
browser_scroll: "scroll",
|
|
265
|
+
browser_screenshot: "screenshot",
|
|
266
|
+
browser_read_console: "read_console",
|
|
267
|
+
browser_read_network: "read_network",
|
|
268
|
+
// Legacy aliases (kept for existing agents/tests).
|
|
152
269
|
chrome_list_tabs: "list_tabs",
|
|
153
270
|
chrome_open_tab: "open_tab",
|
|
154
271
|
chrome_close_tab: "close_tab",
|
|
@@ -164,6 +281,12 @@ var CHROME_TOOL_ACTIONS = {
|
|
|
164
281
|
chrome_upload_file: "set_files",
|
|
165
282
|
chrome_upload: "set_files"
|
|
166
283
|
};
|
|
284
|
+
for (const legacyName of ["chrome_set_files", "chrome_upload_file", "chrome_upload"]) {
|
|
285
|
+
const action = CHROME_TOOL_ACTIONS[legacyName];
|
|
286
|
+
if (action) {
|
|
287
|
+
CHROME_TOOL_ACTIONS[`browser_${legacyName.slice("chrome_".length)}`] = action;
|
|
288
|
+
}
|
|
289
|
+
}
|
|
167
290
|
function createConnectorError(code, message, details) {
|
|
168
291
|
const error = new Error(message);
|
|
169
292
|
error.code = code;
|
|
@@ -183,9 +306,13 @@ function parseArguments(raw) {
|
|
|
183
306
|
}
|
|
184
307
|
}
|
|
185
308
|
function errorPayload(error) {
|
|
309
|
+
const code = error?.code ?? "CHROME_CONNECTOR_ERROR";
|
|
186
310
|
return {
|
|
187
|
-
code
|
|
311
|
+
code,
|
|
188
312
|
message: toErrorMessage(error),
|
|
313
|
+
...code === "CHROME_CONNECTOR_UNAVAILABLE" ? {
|
|
314
|
+
hint: "The Nolo Browser Connector is not reachable. It runs inside the user's own Chrome or Firefox \u2014 ask the user to open their browser with the Nolo Browser Connector extension enabled, or install it from https://nolo.chat/downloads (Firefox can install the signed .xpi directly), then retry."
|
|
315
|
+
} : {},
|
|
189
316
|
...error?.details !== void 0 ? { details: error.details } : {}
|
|
190
317
|
};
|
|
191
318
|
}
|
|
@@ -198,7 +325,7 @@ function validateChromeConnectorPayload(action, payload) {
|
|
|
198
325
|
if (!tabId) {
|
|
199
326
|
throw createConnectorError(
|
|
200
327
|
"TAB_ID_REQUIRED",
|
|
201
|
-
`Provide the tabId from
|
|
328
|
+
`Provide the tabId from browser_list_tabs before calling ${action}.`
|
|
202
329
|
);
|
|
203
330
|
}
|
|
204
331
|
if (!TARGET_REQUIRED_ACTIONS.has(action)) return;
|
|
@@ -210,7 +337,7 @@ function validateChromeConnectorPayload(action, payload) {
|
|
|
210
337
|
if (!elementRef && !selector) {
|
|
211
338
|
throw createConnectorError(
|
|
212
339
|
"ELEMENT_TARGET_REQUIRED",
|
|
213
|
-
"Provide elementRef from
|
|
340
|
+
"Provide elementRef from browser_read_page or a CSS selector."
|
|
214
341
|
);
|
|
215
342
|
}
|
|
216
343
|
if (action === "set_files") {
|
|
@@ -240,8 +367,8 @@ function validateChromeConnectorPayload(action, payload) {
|
|
|
240
367
|
}
|
|
241
368
|
function createChromeConnectorClient(args) {
|
|
242
369
|
if (args?.request) return { request: args.request };
|
|
243
|
-
const
|
|
244
|
-
const endpoint = args?.endpoint ??
|
|
370
|
+
const browser = args?.browser ?? "chrome";
|
|
371
|
+
const endpoint = args?.endpoint ?? connectorEndpointForBrowser(browser);
|
|
245
372
|
const fetchImpl = args?.fetchImpl ?? fetch;
|
|
246
373
|
const token = args?.token ?? readConnectorToken(args?.tokenPath);
|
|
247
374
|
return {
|
|
@@ -285,7 +412,10 @@ var REQUIRED_CHROME_CONNECTOR_FEATURES = {
|
|
|
285
412
|
type: ["compact_observation_v2", "action_gate"],
|
|
286
413
|
press: ["compact_observation_v2", "action_gate"],
|
|
287
414
|
scroll: ["compact_observation_v2"],
|
|
288
|
-
screenshot:
|
|
415
|
+
// Both browsers advertise the dedicated `screenshot` feature: Chrome serves it through
|
|
416
|
+
// Page.captureScreenshot (browser_debug-adjacent) while Firefox falls back to
|
|
417
|
+
// tabs.captureVisibleTab, so gating on browser_debug would wrongly refuse Firefox.
|
|
418
|
+
screenshot: ["screenshot"],
|
|
289
419
|
read_console: ["browser_debug"],
|
|
290
420
|
read_network: ["browser_debug"],
|
|
291
421
|
detach: ["browser_debug"],
|
|
@@ -294,19 +424,43 @@ var REQUIRED_CHROME_CONNECTOR_FEATURES = {
|
|
|
294
424
|
function requiredFeaturesForConnectorAction(action) {
|
|
295
425
|
return [...REQUIRED_CHROME_CONNECTOR_FEATURES[action] ?? []];
|
|
296
426
|
}
|
|
427
|
+
function createChromeConnectorClientResolver(args) {
|
|
428
|
+
const cache = /* @__PURE__ */ new Map();
|
|
429
|
+
const overrides = args?.clients;
|
|
430
|
+
const resolve3 = (selector) => {
|
|
431
|
+
const existing = cache.get(selector);
|
|
432
|
+
if (existing) return existing;
|
|
433
|
+
let client;
|
|
434
|
+
if (selector === "chrome" || selector === "firefox") {
|
|
435
|
+
const inner = overrides?.[selector] ?? createChromeConnectorClient({ browser: selector });
|
|
436
|
+
client = createVerifiedChromeConnectorClient({
|
|
437
|
+
client: inner,
|
|
438
|
+
expectedBrowser: selector
|
|
439
|
+
});
|
|
440
|
+
} else {
|
|
441
|
+
client = overrides?.default ?? createVerifiedChromeConnectorClient({ client: createChromeConnectorClient() });
|
|
442
|
+
}
|
|
443
|
+
cache.set(selector, client);
|
|
444
|
+
return client;
|
|
445
|
+
};
|
|
446
|
+
return resolve3;
|
|
447
|
+
}
|
|
297
448
|
function createVerifiedChromeConnectorClient(args) {
|
|
298
449
|
const client = args?.client ?? createChromeConnectorClient();
|
|
299
|
-
const
|
|
450
|
+
const expectedExtensionIds = new Set(
|
|
451
|
+
args?.expectedExtensionIds ?? (args?.expectedBrowser ? [CONNECTOR_BROWSER_EXTENSION_IDS[args.expectedBrowser]] : args?.expectedExtensionId ? [args.expectedExtensionId] : NOLO_CONNECTOR_EXTENSION_IDS)
|
|
452
|
+
);
|
|
300
453
|
let verified = null;
|
|
301
454
|
let negotiatedFeatures = [];
|
|
302
455
|
const verify = async () => {
|
|
303
456
|
const connectorInfo = await client.request("connector_info", {});
|
|
304
457
|
const receivedExtensionId = connectorInfo?.extensionId;
|
|
305
|
-
if (receivedExtensionId !==
|
|
458
|
+
if (typeof receivedExtensionId !== "string" || !expectedExtensionIds.has(receivedExtensionId)) {
|
|
459
|
+
const expectedList = [...expectedExtensionIds].join(", ");
|
|
306
460
|
throw createConnectorError(
|
|
307
461
|
"CHROME_CONNECTOR_EXTENSION_MISMATCH",
|
|
308
|
-
`Chrome connector extension id mismatch: expected ${
|
|
309
|
-
{
|
|
462
|
+
`Chrome connector extension id mismatch: expected one of ${expectedList}, received ${typeof receivedExtensionId === "string" ? receivedExtensionId : "unknown"}.`,
|
|
463
|
+
{ expectedExtensionIds: [...expectedExtensionIds], receivedExtensionId }
|
|
310
464
|
);
|
|
311
465
|
}
|
|
312
466
|
const receivedProtocolVersion = connectorInfo?.protocolVersion;
|
|
@@ -366,9 +520,21 @@ async function executeChromeConnectorTool(args) {
|
|
|
366
520
|
};
|
|
367
521
|
}
|
|
368
522
|
try {
|
|
369
|
-
const payload = parseArguments(args.call.arguments);
|
|
523
|
+
const { target: rawTarget, ...payload } = parseArguments(args.call.arguments);
|
|
524
|
+
const target = typeof rawTarget === "string" && rawTarget.trim().length > 0 ? rawTarget.trim().toLowerCase() : void 0;
|
|
525
|
+
if (target !== void 0 && target !== "chrome" && target !== "firefox") {
|
|
526
|
+
throw createConnectorError(
|
|
527
|
+
"INVALID_BROWSER_TARGET",
|
|
528
|
+
`browser target must be "chrome" or "firefox", received "${rawTarget}".`,
|
|
529
|
+
{ receivedTarget: rawTarget }
|
|
530
|
+
);
|
|
531
|
+
}
|
|
370
532
|
validateChromeConnectorPayload(action, payload);
|
|
371
|
-
const
|
|
533
|
+
const client = args.clientForTarget?.(target) ?? (target ? createVerifiedChromeConnectorClient({
|
|
534
|
+
client: createChromeConnectorClient({ browser: target }),
|
|
535
|
+
expectedBrowser: target
|
|
536
|
+
}) : args.client ?? createVerifiedChromeConnectorClient({ client: createChromeConnectorClient() }));
|
|
537
|
+
const result = await client.request(action, payload);
|
|
372
538
|
return {
|
|
373
539
|
content: JSON.stringify({ ok: true, result }),
|
|
374
540
|
metadata: {
|
|
@@ -391,10 +557,14 @@ async function executeChromeConnectorTool(args) {
|
|
|
391
557
|
var CHROME_CONNECTOR_TOOL_ACTIONS = { ...CHROME_TOOL_ACTIONS };
|
|
392
558
|
|
|
393
559
|
export {
|
|
560
|
+
resolveUploadRoots,
|
|
394
561
|
NOLO_CHROME_CONNECTOR_EXTENSION_ID,
|
|
562
|
+
NOLO_FIREFOX_CONNECTOR_EXTENSION_ID,
|
|
563
|
+
NOLO_CONNECTOR_EXTENSION_IDS,
|
|
395
564
|
NOLO_CHROME_CONNECTOR_PROTOCOL_VERSION,
|
|
396
565
|
createChromeConnectorClient,
|
|
397
566
|
REQUIRED_CHROME_CONNECTOR_FEATURES,
|
|
567
|
+
createChromeConnectorClientResolver,
|
|
398
568
|
createVerifiedChromeConnectorClient,
|
|
399
569
|
executeChromeConnectorTool
|
|
400
570
|
};
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
// packages/agent-runtime/sseFrames.ts
|
|
2
|
+
async function* readSseFrames(response) {
|
|
3
|
+
const reader = response.body?.getReader();
|
|
4
|
+
if (!reader) {
|
|
5
|
+
throw new Error("SSE response did not include a readable body.");
|
|
6
|
+
}
|
|
7
|
+
const decoder = new TextDecoder();
|
|
8
|
+
let buffer = "";
|
|
9
|
+
while (true) {
|
|
10
|
+
const { done, value } = await reader.read();
|
|
11
|
+
if (done) break;
|
|
12
|
+
buffer += decoder.decode(value, { stream: true });
|
|
13
|
+
let boundary = findSseFrameBoundary(buffer);
|
|
14
|
+
while (boundary) {
|
|
15
|
+
yield buffer.slice(0, boundary.index);
|
|
16
|
+
buffer = buffer.slice(boundary.index + boundary.separatorLength);
|
|
17
|
+
boundary = findSseFrameBoundary(buffer);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
const remaining = decoder.decode();
|
|
21
|
+
if (remaining) {
|
|
22
|
+
buffer += remaining;
|
|
23
|
+
let boundary = findSseFrameBoundary(buffer);
|
|
24
|
+
while (boundary) {
|
|
25
|
+
yield buffer.slice(0, boundary.index);
|
|
26
|
+
buffer = buffer.slice(boundary.index + boundary.separatorLength);
|
|
27
|
+
boundary = findSseFrameBoundary(buffer);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
if (buffer.trim()) yield buffer;
|
|
31
|
+
}
|
|
32
|
+
function findSseFrameBoundary(buffer) {
|
|
33
|
+
const lfLf = buffer.indexOf("\n\n");
|
|
34
|
+
const crLfCrLf = buffer.indexOf("\r\n\r\n");
|
|
35
|
+
if (lfLf === -1 && crLfCrLf === -1) return null;
|
|
36
|
+
const useLf = lfLf !== -1 && (crLfCrLf === -1 || lfLf < crLfCrLf);
|
|
37
|
+
return useLf ? { index: lfLf, separatorLength: 2 } : { index: crLfCrLf, separatorLength: 4 };
|
|
38
|
+
}
|
|
39
|
+
async function* streamSseDataValues(response, parse) {
|
|
40
|
+
const reader = response.body?.getReader();
|
|
41
|
+
if (!reader) return;
|
|
42
|
+
const decoder = new TextDecoder();
|
|
43
|
+
let buffer = "";
|
|
44
|
+
while (true) {
|
|
45
|
+
const { done, value } = await reader.read();
|
|
46
|
+
if (done) break;
|
|
47
|
+
buffer += decoder.decode(value, { stream: true });
|
|
48
|
+
const lines = buffer.split("\n");
|
|
49
|
+
buffer = lines.pop() ?? "";
|
|
50
|
+
for (const line of lines) {
|
|
51
|
+
const parsed = parse(line);
|
|
52
|
+
if (parsed) yield parsed;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
const remaining = decoder.decode();
|
|
56
|
+
if (remaining) {
|
|
57
|
+
buffer += remaining;
|
|
58
|
+
const lines = buffer.split("\n");
|
|
59
|
+
buffer = lines.pop() ?? "";
|
|
60
|
+
for (const line of lines) {
|
|
61
|
+
const parsed = parse(line);
|
|
62
|
+
if (parsed) yield parsed;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
if (buffer.trim()) {
|
|
66
|
+
const parsed = parse(buffer);
|
|
67
|
+
if (parsed) yield parsed;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
async function readSseDataValues(response, parse) {
|
|
71
|
+
const values = [];
|
|
72
|
+
for await (const value of streamSseDataValues(response, parse)) {
|
|
73
|
+
values.push(value);
|
|
74
|
+
}
|
|
75
|
+
return values;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
export {
|
|
79
|
+
readSseFrames,
|
|
80
|
+
streamSseDataValues,
|
|
81
|
+
readSseDataValues
|
|
82
|
+
};
|
|
@@ -1,13 +1,16 @@
|
|
|
1
|
-
import {
|
|
2
|
-
buildSkillDocMarkdown
|
|
3
|
-
} from "./chunk-Q554LLSI.js";
|
|
4
1
|
import {
|
|
5
2
|
SYSTEM_AGENT_CAPABILITIES,
|
|
6
3
|
SYSTEM_AGENT_CAPABILITY_IDS
|
|
7
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-WJ3B6FX6.js";
|
|
5
|
+
import {
|
|
6
|
+
buildSkillDocMarkdown
|
|
7
|
+
} from "./chunk-DMXLXZKL.js";
|
|
8
|
+
import {
|
|
9
|
+
CHROME_CONNECTOR_ACCEPTED_TOOL_NAMES
|
|
10
|
+
} from "./chunk-LWLNLZC5.js";
|
|
8
11
|
import {
|
|
9
12
|
createKey
|
|
10
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-OKGVNZTL.js";
|
|
11
14
|
|
|
12
15
|
// packages/ai/tools/codeWorkDiscipline.ts
|
|
13
16
|
var CODE_WORK_DISCIPLINE_BODY = `## \u6548\u7387\u4F18\u5148\uFF08\u7701 token\uFF09
|
|
@@ -30,7 +33,7 @@ var CODE_WORK_DISCIPLINE_BODY = `## \u6548\u7387\u4F18\u5148\uFF08\u7701 token\u
|
|
|
30
33
|
- \u6309\u89D2\u8272\u52A0\u8F7D\u5BF9\u5E94 skill\uFF1Areviewer \u5148 \`loadSkill("coding-review")\` \u62FF\u901A\u7528\u6D41\u7A0B\uFF0C\u518D\u6309\u89D2\u8272 \`loadSkill("coding-review-<role>")\` \u62FF\u68C0\u67E5\u9879\u3002\u89D2\u8272\u6E05\u5355\uFF1Acode-quality\uFF08**\u5FC5\u8DD1**\uFF09/ architecture\uFF08**\u5355\u72EC\u6D3E\u53D1**\uFF0C\u4E2D\u7EA7\u4EE5\u4E0A\u95EE\u9898\uFF09/ security\uFF08\u6309\u9700 + \u5B89\u5168\u654F\u611F\u89E6\u53D1\u5FC5\u8DD1\uFF09/ frontend-ux\uFF08\u6D89\u53CA UI \u65F6\uFF09/ backend-data\uFF08\u6D89\u53CA server \u65F6\uFF09\u3002\u89D2\u8272\u5207\u5272\u7684\u76EE\u7684\u662F\u6CE8\u610F\u529B\u9694\u79BB\u2014\u2014\u6BCF\u4E2A\u89D2\u8272\u53EA\u76EF\u81EA\u5DF1\u7684\u68C0\u67E5\u9762\uFF0C\u6309\u9700\u542F\u7528\uFF0C\u907F\u514D\u4E00\u4E2A reviewer \u80CC\u6240\u6709\u89D2\u8272\u5BFC\u81F4\u6CE8\u610F\u529B\u7A00\u91CA\u3002
|
|
31
34
|
- Verdict \u6807\u51C6\uFF1AAPPROVE\uFF08\u65E0 CRITICAL \u6216 HIGH\uFF09\u2192 \u53EF commit\uFF1BWARNING\uFF08\u4EC5 HIGH\uFF09\u2192 \u62A5\u544A owner \u51B3\u5B9A\uFF1BBLOCK\uFF08\u6709 CRITICAL\uFF09\u2192 \u5FC5\u987B\u5148\u4FEE\u3002
|
|
32
35
|
- review \u662F\u591A\u8F6E\u6536\u655B\u7684\uFF1A\u6D3E reviewer \u5BA1\u5DE5\u4F5C\u533A diff \u2192 \u51FA finding \u5C31\u4FEE \u2192 \u590D\u5BA1\uFF0C\u76F4\u5230 APPROVE \u624D\u63D0\u4EA4\u3002\u6BCF\u8F6E review \u65E0\u4E0A\u4E0B\u6587\u2014\u2014reviewer \u53EA\u770B\u5F53\u524D\u5DE5\u4F5C\u533A diff\uFF0C\u4E0D\u5E26\u4E0A\u4E00\u8F6E finding \u8BB0\u5FC6\u3002
|
|
33
|
-
- \u82E5\u5904\u4E8E\u5355 Agent \u72EC\u5360\u73AF\u5883\u3001\u5176\u4ED6 agent \u4E0D\u53EF\u8FBE\u3001\u6216\u7528\u6237\u660E\u786E\u8981\u6C42\u76F4\u63A5\u63D0\u4EA4\
|
|
36
|
+
- \u82E5\u5904\u4E8E\u5355 Agent \u72EC\u5360\u73AF\u5883\u3001\u5176\u4ED6 agent \u4E0D\u53EF\u8FBE\u3001\u6216\u7528\u6237\u660E\u786E\u8981\u6C42\u76F4\u63A5\u63D0\u4EA4\uFF1A\u4E0D\u8981\u8865\u5199\u6216\u4F2A\u9020 review \u8BC1\u636E\uFF0C\u4E5F**\u4E0D\u8981\u7528 [no-review: \u539F\u56E0] \u8FD9\u7C7B\u5199\u6CD5**\u2014\u2014\u5B83\u4EFB\u4F55\u5224\u636E\u90FD\u89E3\u6790\u4E0D\u4E86\uFF0C\u5199\u4E86\u7167\u6837\u88AB\u62E6\u3002\u81EA\u6709\u95F8\u95E8\u8BA4\u7684\u5F62\u5F0F\u662F Reviewed-by: <\u975E\u7A7A\u7F72\u540D> \u52A0 Review: \u5E26\u7ED3\u8BBA\uFF08APPROVE / Approved / WARNING\uFF0C\u5360\u4F4D\u7B26\u5982 <pending> \u4E0D\u7B97\uFF09\uFF0Ccommit-msg \u4E0E pre-push / pre-merge \u90FD\u8D70\u8FD9\u4E00\u6761\u6B63\u5219\u3002pre-push / pre-merge **\u53E6**\u8BA4\u4E00\u6761 owner-only \u8C41\u514D\uFF1A\u6B63\u6587\u5199 No-Review: <\u539F\u56E0> \u4E14 commit author email \u547D\u4E2D packages/nolo-ci/core/src/mapping.ts \u7684 NO_REVIEW_OWNER_EMAILS \u767D\u540D\u5355\u2014\u2014agent \u8EAB\u4EFD\uFF08\u5982 app-builder@nolo.local\uFF09\u4E0D\u9002\u7528\u3002\u771F\u88AB\u5361\u4F4F\u5C31\u5982\u5B9E\u4E0A\u62A5\u5361\u70B9\u3001\u7531 owner \u51B3\u5B9A\uFF1Bgit push --no-verify \u4EC5\u9650\u7BA1\u7406\u5458/\u7D27\u6025\u6062\u590D\uFF0C\u670D\u52A1\u7AEF G2 \u4E0D\u53EF\u7ED5\u8FC7\u3002`;
|
|
34
37
|
var buildCodeWorkDiscipline = (heading) => `# ${heading}
|
|
35
38
|
|
|
36
39
|
${CODE_WORK_DISCIPLINE_BODY}`;
|
|
@@ -61,6 +64,8 @@ var TOOL_PACKS = {
|
|
|
61
64
|
"updateSelf",
|
|
62
65
|
"ask_user",
|
|
63
66
|
"createAgentAutomation",
|
|
67
|
+
"updateAgentAutomation",
|
|
68
|
+
"deleteAgentAutomation",
|
|
64
69
|
"notifyUser"
|
|
65
70
|
],
|
|
66
71
|
// L2 - 联网搜索:与 CAPABILITY_PACKS「web-search」对齐。
|
|
@@ -236,7 +241,7 @@ var CAPABILITY_PACKS = [
|
|
|
236
241
|
{
|
|
237
242
|
id: "video-transcription",
|
|
238
243
|
label: "\u89C6\u9891\u8F6C\u5199",
|
|
239
|
-
description: "\u8D34\u89C6\u9891\u94FE\u63A5\u5373\u53EF\u8F6C\u5199\u4E3A\u5E26\u6807\u70B9\u6587\u672C\u4E0E SRT\u3002\u652F\u6301 B \u7AD9\u5206 P\uFF08\u9ED8\u8BA4\u5168\u90E8\u5904\u7406\uFF09\u3001YouTube \u7B49\uFF1B\u6296\u97F3\
|
|
244
|
+
description: "\u8D34\u89C6\u9891\u94FE\u63A5\u5373\u53EF\u8F6C\u5199\u4E3A\u5E26\u6807\u70B9\u6587\u672C\u4E0E SRT\u3002\u652F\u6301 B \u7AD9\u5206 P\uFF08\u9ED8\u8BA4\u5168\u90E8\u5904\u7406\uFF09\u3001YouTube \u7B49\uFF1B\u652F\u6301\u6296\u97F3\u5206\u4EAB\u6587\u6848/\u77ED\u94FE\uFF0C\u628A\u5206\u4EAB\u6587\u5B57\u91CC\u7684\u94FE\u63A5\u4F20\u7ED9 url\u3002",
|
|
240
245
|
tools: ["transcribeVideo"],
|
|
241
246
|
defaultEnabled: false,
|
|
242
247
|
icon: "\u{1F3AC}",
|
|
@@ -246,7 +251,7 @@ var CAPABILITY_PACKS = [
|
|
|
246
251
|
- \u7528\u6237\u8D34\u4E0A\u89C6\u9891\u94FE\u63A5\u65F6\uFF0C\u76F4\u63A5\u8C03\u7528 \`transcribeVideo({ url })\`\uFF0C\u4E0D\u8981\u5148\u95EE\u8981\u4E0D\u8981\u8F6C\u5199\u3002
|
|
247
252
|
- B \u7AD9\u5206 P / \u5408\u96C6\uFF1A\u7F3A\u7701\u5904\u7406\u5168\u90E8\uFF1B\u82E5\u7528\u6237\u6307\u5B9A\u300C\u53EA\u8981\u7B2C 3\u30014 \u96C6\u300D\u5219\u4F20 \`p: [3, 4]\`\u3002
|
|
248
253
|
- \u8FD4\u56DE\u91CC\u7684 \`processedParts\` / \`availableParts\` \u5FC5\u987B\u5411\u7528\u6237\u8BF4\u6E05\u695A\uFF0C\u907F\u514D\u9759\u9ED8\u4E22\u5206 P\u3002
|
|
249
|
-
- \u6296\u97F3\
|
|
254
|
+
- \u652F\u6301\u6296\u97F3\u5206\u4EAB\u6587\u6848/\u77ED\u94FE\uFF0C\u628A\u5206\u4EAB\u6587\u5B57\u91CC\u7684\u94FE\u63A5\u4F20\u7ED9 url\u3002
|
|
250
255
|
`
|
|
251
256
|
}
|
|
252
257
|
];
|
|
@@ -353,7 +358,7 @@ function isWebSearchTool(name) {
|
|
|
353
358
|
return WEB_SEARCH_TOOL_NAMES.has(name);
|
|
354
359
|
}
|
|
355
360
|
function isBrowserTool(name) {
|
|
356
|
-
return name.startsWith("browser_");
|
|
361
|
+
return name.startsWith("browser_") && !CHROME_CONNECTOR_ACCEPTED_TOOL_NAMES.includes(name);
|
|
357
362
|
}
|
|
358
363
|
function addDefaultLightWebToolsForConfiguredAgents(toolNames, agentConfig) {
|
|
359
364
|
const explicitToolNames = Array.isArray(
|
|
@@ -180,6 +180,36 @@ function resolveCooldownGate(input, now) {
|
|
|
180
180
|
}
|
|
181
181
|
return now - lastProbeAt >= PROBE_INTERVAL_MS ? "probe" : "blocked";
|
|
182
182
|
}
|
|
183
|
+
function resolveCredentialKey(agent) {
|
|
184
|
+
if (!agent || typeof agent !== "object") return void 0;
|
|
185
|
+
for (const field of ["apiKeyRef", "credentialRef"]) {
|
|
186
|
+
const value = agent[field];
|
|
187
|
+
if (typeof value === "string") {
|
|
188
|
+
const trimmed = value.trim();
|
|
189
|
+
if (trimmed) return trimmed;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
return void 0;
|
|
193
|
+
}
|
|
194
|
+
function resolveCredentialKeyWithFallback(agent) {
|
|
195
|
+
const byRef = resolveCredentialKey(agent);
|
|
196
|
+
if (byRef) return byRef;
|
|
197
|
+
if (!agent || typeof agent !== "object") return void 0;
|
|
198
|
+
const endpoint = agent.customProviderUrl;
|
|
199
|
+
if (typeof endpoint === "string") {
|
|
200
|
+
const trimmed = endpoint.trim();
|
|
201
|
+
if (trimmed) {
|
|
202
|
+
try {
|
|
203
|
+
const origin = new URL(trimmed).origin;
|
|
204
|
+
if (origin && origin !== "null") return `custom-endpoint:${origin}`;
|
|
205
|
+
} catch {
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
const key = agent.key;
|
|
210
|
+
if (typeof key === "string" && key.trim()) return `custom-agent:${key.trim()}`;
|
|
211
|
+
return void 0;
|
|
212
|
+
}
|
|
183
213
|
|
|
184
214
|
export {
|
|
185
215
|
QUOTA_ERROR_PATTERNS,
|
|
@@ -188,5 +218,6 @@ export {
|
|
|
188
218
|
isQuotaLimited403Body,
|
|
189
219
|
resolveAvailabilityAction,
|
|
190
220
|
mergeAvailabilityDeadline,
|
|
191
|
-
resolveCooldownGate
|
|
221
|
+
resolveCooldownGate,
|
|
222
|
+
resolveCredentialKeyWithFallback
|
|
192
223
|
};
|