nolo-cli 0.105.0-alpha.2 → 0.105.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.
Files changed (208) hide show
  1. package/README.md +1 -1
  2. package/{_executeModel-4W7C3ACS.js → _executeModel-JXG5TLPE.js} +75 -68
  3. package/action-GVA5ARSJ.js +20 -0
  4. package/{addContentAction-O7R66HEX.js → addContentAction-J3DLDV64.js} +12 -11
  5. package/{addDialogAgentAction-74OA7KYP.js → addDialogAgentAction-PHIXJCF2.js} +18 -19
  6. package/{agentDeleteCommand-YB3S2LPY.js → agentDeleteCommand-2AWJGHXG.js} +117 -42
  7. package/{agentEmailCommands-J6YBHL42.js → agentEmailCommands-VV5OSILE.js} +98 -88
  8. package/agentListCommands-OQMRBDWP.js +742 -0
  9. package/{agentMachineCommands-2RWGEBA3.js → agentMachineCommands-3VLLR6RL.js} +48 -43
  10. package/{agentProviderCommands-GNPTL5XR.js → agentProviderCommands-XPJYZSCE.js} +97 -2
  11. package/{agentPullCommand-O5MPVJ5E.js → agentPullCommand-B4T2DJ5H.js} +1 -1
  12. package/agentRecordCommands-GPIARVOW.js +138 -0
  13. package/agentRunCommand-LRJTZ7IM.js +167 -0
  14. package/{agentRunControl-AVJR4JW4.js → agentRunControl-3HWA2LLQ.js} +2 -2
  15. package/{agentRuntimeLocal-FRUE5P2V.js → agentRuntimeLocal-PV6AZOEU.js} +44 -39
  16. package/{agentSlice-6LBOYNKN.js → agentSlice-6R3JKS6I.js} +14 -13
  17. package/{appDeleteCommands-JPWTSFID.js → appDeleteCommands-WEX73P5R.js} +46 -41
  18. package/{appDeployCommands-YCVY2UYO.js → appDeployCommands-7BAXWA4M.js} +46 -41
  19. package/{appDeployStatusCommands-JMCEIKTI.js → appDeployStatusCommands-EJ6A2U4X.js} +46 -41
  20. package/{appGetCommands-EXWT3QAE.js → appGetCommands-SB355OEX.js} +46 -41
  21. package/{appListCommands-PKRLSWRE.js → appListCommands-TSZDPIKJ.js} +46 -41
  22. package/{authCommand-F4EFRRX6.js → authCommand-5PB3YRVV.js} +118 -24
  23. package/{authCommands-RGOGCPP6.js → authCommands-5RTUDYZW.js} +7 -5
  24. package/{builtinSkillRegistry-FUAVTRVZ.js → builtinSkillRegistry-SBBWTANC.js} +10 -8
  25. package/{chromeCommands-FZYAU75D.js → chromeCommands-AU5ZJXBG.js} +289 -37
  26. package/{chromeOpsCommands-62P2Q2YB.js → chromeOpsCommands-ZYTCMNHG.js} +156 -22
  27. package/{chunk-6OZ36FXI.js → chunk-27ONFIEY.js} +22 -4
  28. package/{chunk-JEDZAO7L.js → chunk-2SYTUTLI.js} +257 -37
  29. package/{chunk-HVURBGF3.js → chunk-2U3NHADM.js} +6 -6
  30. package/{chunk-53HEEOTT.js → chunk-2WJ57RJA.js} +83 -16
  31. package/{chunk-OIVSQH2O.js → chunk-3BXNTXYI.js} +299 -5
  32. package/{chunk-V4MJDUSR.js → chunk-3F424ASC.js} +2 -2
  33. package/{chunk-HJUYAD4A.js → chunk-3Q7NEHAR.js} +5 -5
  34. package/chunk-44CU7CKA.js +13545 -0
  35. package/{chunk-EYAQT56M.js → chunk-4DPP773Q.js} +2 -2
  36. package/chunk-4LCOCOR5.js +50 -0
  37. package/{chunk-JPGCXHNM.js → chunk-4LKMZ3RR.js} +1 -1
  38. package/{chunk-2GRGFCF6.js → chunk-4VJAC32I.js} +2 -1
  39. package/{chunk-6D6VBVEW.js → chunk-4W24JM32.js} +80 -14
  40. package/{chunk-H62HCIUP.js → chunk-4WMMIL66.js} +35 -22
  41. package/{chunk-MC4XLIJ7.js → chunk-523DITKR.js} +1 -1
  42. package/{chunk-ZCYXJSTU.js → chunk-54VPQTOA.js} +66 -94
  43. package/{chunk-E4MARS3Q.js → chunk-5GVBDNTO.js} +1 -1
  44. package/chunk-5MMAK75Q.js +15 -0
  45. package/{chunk-7S4YWN7P.js → chunk-5UUIGN6I.js} +4 -4
  46. package/{chunk-42V6BK2E.js → chunk-62IL3KQV.js} +4 -34
  47. package/{chunk-GQBOR3G6.js → chunk-7KVZ5LDQ.js} +2 -2
  48. package/chunk-A4SQRTZ6.js +15 -0
  49. package/{chunk-L5UXH3B2.js → chunk-AFH5QC6R.js} +58 -9
  50. package/{chunk-AEOE4Z6Q.js → chunk-AFSY3ZMB.js} +39 -15
  51. package/chunk-AGIM7IMJ.js +147 -0
  52. package/{chunk-5UTFL4QJ.js → chunk-AOTBKDRK.js} +7 -0
  53. package/{chunk-NA35QHCF.js → chunk-AWVP7PPG.js} +1 -1
  54. package/{chunk-EEGDMATE.js → chunk-B7APRSPS.js} +86 -81
  55. package/{chunk-W324THOB.js → chunk-BB7LVBTS.js} +20 -11
  56. package/{chunk-6YTOJY35.js → chunk-BZ7NPA6G.js} +35 -2
  57. package/{chunk-5H7KJX7J.js → chunk-CFHWVEUJ.js} +5 -5
  58. package/chunk-CHOZJMJS.js +78 -0
  59. package/{chunk-ETI2NYVF.js → chunk-CNA27EMD.js} +4 -4
  60. package/{chunk-ACTMNVHM.js → chunk-CYSYR67N.js} +1 -1
  61. package/{chunk-WV42OMV7.js → chunk-D2GQE6AF.js} +8 -8
  62. package/{chunk-GBRG75BQ.js → chunk-D2MDMY2M.js} +1 -0
  63. package/{chunk-Q554LLSI.js → chunk-DMXLXZKL.js} +1 -1
  64. package/chunk-DZ7R5V3Y.js +164 -0
  65. package/{chunk-3VNWWVKB.js → chunk-E3YWHWCR.js} +50 -18
  66. package/{chunk-KQ4ONNQD.js → chunk-EKPKW6RM.js} +155 -8
  67. package/{chunk-2J5Y72GY.js → chunk-EP7BWZ4B.js} +1 -1
  68. package/{chunk-ABQYVJBJ.js → chunk-EV235ILT.js} +5 -5
  69. package/{chunk-TRV2MIDW.js → chunk-EXAJ6DCR.js} +1 -0
  70. package/{chunk-3ZW5ZJMM.js → chunk-FGSJ3YMD.js} +23 -28
  71. package/{chunk-2F7RJC6L.js → chunk-FOXQ7BAB.js} +1 -1
  72. package/{chunk-SH43IESU.js → chunk-GGC55Q32.js} +199 -29
  73. package/chunk-GMZLP5DV.js +82 -0
  74. package/{chunk-DHDMC6FO.js → chunk-GSKPJIHY.js} +14 -9
  75. package/{chunk-FDTR4QJ6.js → chunk-H6A6X4EK.js} +32 -1
  76. package/{chunk-DVINR3PL.js → chunk-HDLLCBRF.js} +1 -1
  77. package/{chunk-QOKAKDPE.js → chunk-HIM3FCLF.js} +0 -1
  78. package/{chunk-ONXOABJR.js → chunk-HNGRBWYF.js} +3 -0
  79. package/{chunk-VLTIYV3X.js → chunk-HP57OUJO.js} +4 -4
  80. package/{chunk-NXUYQBDZ.js → chunk-HYXABXCZ.js} +29 -78
  81. package/{chunk-DNCEALKX.js → chunk-IEJ5YDA4.js} +22 -29
  82. package/{chunk-O6OSWFZQ.js → chunk-IHPDK6UD.js} +6 -0
  83. package/{chunk-BP4XNZRM.js → chunk-JIXGJTBU.js} +4 -4
  84. package/{chunk-GPCZ7UXG.js → chunk-K6U4NKFJ.js} +1 -1
  85. package/{chunk-Z77CRGTW.js → chunk-KA5O5KQL.js} +1 -1
  86. package/{chunk-4OEFYTWL.js → chunk-L5WOICCV.js} +67 -48
  87. package/{chunk-LS2ZANRJ.js → chunk-LOCNXNOU.js} +1 -1
  88. package/chunk-LWLNLZC5.js +265 -0
  89. package/{chunk-H66KLASO.js → chunk-LWXE6IFU.js} +567 -519
  90. package/{chunk-PUOC4YRO.js → chunk-M7VLQGQP.js} +11 -0
  91. package/chunk-NKWIS6G2.js +442 -0
  92. package/{chunk-BFU6C242.js → chunk-NMFV26UG.js} +1 -1
  93. package/{chunk-DJWMIXDZ.js → chunk-NSAFG343.js} +10 -10
  94. package/{chunk-UKZDAFYT.js → chunk-NSBID7PR.js} +6 -10
  95. package/{chunk-U7ISRJQO.js → chunk-NTR4SD3P.js} +845 -240
  96. package/{chunk-FZGV4FGK.js → chunk-NUHHBEJC.js} +378 -187
  97. package/chunk-NWENLDMM.js +42 -0
  98. package/chunk-O7SVKKLY.js +875 -0
  99. package/chunk-OCZKATRC.js +129 -0
  100. package/{chunk-VMFTFOWF.js → chunk-OKGVNZTL.js} +35 -8
  101. package/{chunk-KQHGZWSV.js → chunk-OXME3PEE.js} +1 -1
  102. package/{chunk-JRQFUXY7.js → chunk-P5GCTVGV.js} +99 -22
  103. package/{chunk-PQFHGD77.js → chunk-QKTESDWK.js} +161 -14
  104. package/{chunk-U3JZVWIB.js → chunk-QMXJ5KDJ.js} +68 -46
  105. package/{chunk-GEPUP7OO.js → chunk-QYUBY3OZ.js} +3 -3
  106. package/{chunk-3BMYXEUW.js → chunk-R5AJODNI.js} +1 -1
  107. package/{chunk-J4MOO56S.js → chunk-RILRSUGC.js} +10 -2
  108. package/{chunk-OEVAY4J6.js → chunk-RWX7AY7J.js} +18 -20
  109. package/{chunk-YY7I6GQ3.js → chunk-S2NSK7AZ.js} +11 -9
  110. package/{chunk-IIVGDG4I.js → chunk-SJKULPGX.js} +13 -7
  111. package/{chunk-BYMV6QZG.js → chunk-TNIX77YM.js} +4 -0
  112. package/chunk-TY3TIUJK.js +89 -0
  113. package/{chunk-I3TQJXQ7.js → chunk-U3C3IA32.js} +9 -2
  114. package/{chunk-UZGQNTVW.js → chunk-UA324D4O.js} +8 -6
  115. package/{chunk-YYLHWIW6.js → chunk-UKZX3NHN.js} +1 -1
  116. package/chunk-UWXDA7L5.js +8005 -0
  117. package/{chunk-3DII57IT.js → chunk-VCAQFMVN.js} +1 -1
  118. package/chunk-VIWDGTDA.js +8 -0
  119. package/chunk-VJVNU77E.js +83 -0
  120. package/{chunk-A6FMKU7M.js → chunk-VVJ2ENLY.js} +47 -67
  121. package/{chunk-UKWGR5SS.js → chunk-VY6VFGKR.js} +194 -1144
  122. package/{chunk-QDSINZM3.js → chunk-WJ3B6FX6.js} +1 -14
  123. package/{chunk-Q67DOFOO.js → chunk-Y3PMXGLH.js} +2 -0
  124. package/chunk-YK5MHOWM.js +915 -0
  125. package/chunk-YV25TM3R.js +780 -0
  126. package/{chunk-TOP2VXOR.js → chunk-YVU4XVJD.js} +5 -5
  127. package/{chunk-HVP6P5FV.js → chunk-Z5NGE5DH.js} +29 -9
  128. package/{chunk-LC43IGO4.js → chunk-ZBHR642M.js} +704 -950
  129. package/chunk-ZRAU6T47.js +56 -0
  130. package/{chunk-XPVRVN4U.js → chunk-ZSUDOTPL.js} +19 -17
  131. package/commandRegistry-QU62WJQX.js +833 -0
  132. package/{contentThunks-LXOZUD2Y.js → contentThunks-VGV3JJVB.js} +37 -35
  133. package/{cooldownCommands-REAWYVTY.js → cooldownCommands-ZLEPIB4A.js} +2 -2
  134. package/{createAgentAutomationAction-M5NDEIC6.js → createAgentAutomationAction-ZNVLI4WV.js} +39 -37
  135. package/createDialogAction-TTUA46DT.js +69 -0
  136. package/{createPageAction-WY5ZKP2M.js → createPageAction-KUFSC5XW.js} +46 -43
  137. package/{chunk-OWS6OYF4.js → cursorProvider-YGGNMVWX.js} +2751 -10172
  138. package/{dbSlice-XVWBAGYN.js → dbSlice-MYEETO73.js} +11 -10
  139. package/{deleteFile-YG6QMJLU.js → deleteFile-KESP65GC.js} +7 -6
  140. package/{dialogCommands-YVMHDEOX.js → dialogCommands-DRDPEOTL.js} +49 -45
  141. package/{dialogSlice-HSGREZGA.js → dialogSlice-V2SVSTIV.js} +41 -34
  142. package/{dist-VODFSGNG.js → dist-NJC2W7I4.js} +61 -54
  143. package/{docCreateCommands-7UTWDYJU.js → docCreateCommands-M26CFDDQ.js} +48 -43
  144. package/{docDeleteCommands-GG6BJ4PS.js → docDeleteCommands-LRZHCKVX.js} +49 -44
  145. package/{docReadCommands-QHMQVSLP.js → docReadCommands-6QJSISHK.js} +47 -42
  146. package/{docStore-IIS36NGG.js → docStore-4RWAFNDM.js} +16 -12
  147. package/{docUpdateCommands-QPL6IVUK.js → docUpdateCommands-W4KU4U5T.js} +48 -43
  148. package/{fetchMessages-EIU7UFFK.js → fetchMessages-3PXAHKCR.js} +5 -5
  149. package/{getPricing-LUSEABA6.js → getPricing-NMMFT3YI.js} +4 -4
  150. package/{handleSendMessageAction-FEHCWMN2.js → handleSendMessageAction-VEWLGB5Z.js} +107 -41
  151. package/index.js +87 -884
  152. package/{lib-FRRS27KN.js → lib-PU2G2MSO.js} +523 -191
  153. package/{localDialogRead-BTFJ4V2I.js → localDialogRead-UYCKO7YZ.js} +2 -2
  154. package/{localRuntimeAuthority-6IR6BBXE.js → localRuntimeAuthority-TU6OBC76.js} +9 -6
  155. package/{localRuntimeDb-SYQGUF4U.js → localRuntimeDb-VKWVOPPI.js} +1 -1
  156. package/{machineCommands-ERCXIPJC.js → machineCommands-AEHHCJEW.js} +92 -82
  157. package/machineWsRunDispatch-MY2KHS36.js +154 -0
  158. package/{memberThunks-QGFLFVCI.js → memberThunks-EE6TI3TV.js} +20 -18
  159. package/{models-T3SG6MJ5.js → models-ZPU5EDF4.js} +2 -2
  160. package/oauthTokenStore-ITEB663N.js +23 -0
  161. package/package.json +1 -1
  162. package/pdf-U6KSUEZZ.js +26435 -0
  163. package/processSpawn-SOAV3FEV.js +11 -0
  164. package/profileConfig-ZGOFORWV.js +43 -0
  165. package/{providerPresetApply-FG6NZ57W.js → providerPresetApply-TEBH7FDX.js} +7 -7
  166. package/{providerRegistry-757OWH3O.js → providerRegistry-CBJLNCET.js} +11 -7
  167. package/{read-COE3ZYR6.js → read-PJIT2YEJ.js} +7 -6
  168. package/{readDocTool-5USN4A6V.js → readDocTool-DRSXHGNL.js} +5 -3
  169. package/{readlineWorkspace-PXATJOED.js → readlineWorkspace-7Q6MITLV.js} +2605 -2031
  170. package/{removeDialogAgentAction-IX3MN2ZO.js → removeDialogAgentAction-IN4WUKJJ.js} +21 -25
  171. package/{runAgentClientLoop-UY76PPZM.js → runAgentClientLoop-H2JALUVD.js} +76 -70
  172. package/{runtimeDoctorCommands-X6WDBEQX.js → runtimeDoctorCommands-PIVSBZRZ.js} +4 -4
  173. package/runtimeModeArgs-2Y7BALTO.js +31 -0
  174. package/{setDialogExtraReferencesAction-X4HCPNZL.js → setDialogExtraReferencesAction-VDRF7LPK.js} +15 -13
  175. package/{setPrimaryDialogAgentAction-4GMIQLOD.js → setPrimaryDialogAgentAction-RO6LIWJ4.js} +22 -26
  176. package/{chunk-AFUORTY4.js → settingThunks-3OPOLOIA.js} +226 -940
  177. package/{skillDiscovery-CYUCJMAG.js → skillDiscovery-ZBU76COE.js} +3 -3
  178. package/{slateUtils-RIZES3PV.js → slateUtils-NGV2NMKM.js} +1 -1
  179. package/{spaceCommands-BMXKR7H6.js → spaceCommands-UBLL5EF2.js} +51 -46
  180. package/{streamAgentChatTurn-3YVIO4KE.js → streamAgentChatTurn-FFJWW3FD.js} +214 -108
  181. package/{switchDialogAgentAction-N52LRPA3.js → switchDialogAgentAction-MVF2JNE7.js} +18 -19
  182. package/{tableCommands-O6NWHFKV.js → tableCommands-6U4BMLRR.js} +10 -10
  183. package/{toolApiClient-QVJ6HDNN.js → toolApiClient-EJT6TMFG.js} +3 -3
  184. package/tools-AZRYLYNK.js +116 -0
  185. package/{tuiSummaryLlmCaller-WFRWERGK.js → tuiSummaryLlmCaller-7S5HJ3MT.js} +25 -22
  186. package/{updateCommands-2M74UL7P.js → updateCommands-4EHDLF5J.js} +3 -3
  187. package/{updateDialogTitleAction-GF5T3VMK.js → updateDialogTitleAction-5WXTRUJM.js} +82 -44
  188. package/action-YVYQEAAV.js +0 -31
  189. package/agentListCommands-3GWH4E4G.js +0 -410
  190. package/agentRecordCommands-UOF6YM5M.js +0 -128
  191. package/agentRunCommand-AVBWVTAJ.js +0 -156
  192. package/browser-image-compression-MFDTD7K6.js +0 -1763
  193. package/chatQueueReduxAdapter-WFROMKD3.js +0 -186
  194. package/chunk-CQ3WA2NE.js +0 -299
  195. package/chunk-FQUHIG5X.js +0 -20782
  196. package/chunk-M76ECQRD.js +0 -13658
  197. package/chunk-MEYIRKDN.js +0 -8967
  198. package/chunk-Q5FJJ6XI.js +0 -103
  199. package/chunk-S7Z2HMCN.js +0 -25
  200. package/chunk-Y5GCAMGP.js +0 -9
  201. package/chunk-YPREESF4.js +0 -225
  202. package/createDialogAction-TDFOINOY.js +0 -65
  203. package/machineWsRunDispatch-OVA3G76V.js +0 -144
  204. package/settingSlice-ZQZVUPKK.js +0 -204
  205. package/syncMapping-N6RGXGBW.js +0 -437
  206. package/tools-Q6IBBG33.js +0 -110
  207. package/{chunk-X7HHHIOZ.js → chunk-Y6ROFCZO.js} +0 -0
  208. package/{db-WK5MDZVN.js → db-VQSAOWAO.js} +1 -1
@@ -1,28 +1,35 @@
1
1
  import {
2
2
  addContentToSpace
3
- } from "./chunk-A6FMKU7M.js";
3
+ } from "./chunk-VVJ2ENLY.js";
4
4
  import {
5
+ format,
5
6
  prepareAndPersistMessage,
6
7
  uiAskChoiceFunc,
7
8
  uiAskChoiceFunctionSchema
8
- } from "./chunk-FQUHIG5X.js";
9
+ } from "./chunk-44CU7CKA.js";
9
10
  import {
10
- require_date_fns
11
- } from "./chunk-M76ECQRD.js";
11
+ formatISO
12
+ } from "./chunk-ZRAU6T47.js";
12
13
  import {
13
14
  buildBuiltinObjectSkillReference
14
- } from "./chunk-DHDMC6FO.js";
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-H62HCIUP.js";
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-VMFTFOWF.js";
34
- import {
35
- extractCustomId
36
- } from "./chunk-M2EJHDJP.js";
40
+ } from "./chunk-OKGVNZTL.js";
37
41
  import {
38
42
  isDevelopment
39
- } from "./chunk-QOKAKDPE.js";
43
+ } from "./chunk-HIM3FCLF.js";
40
44
  import {
41
45
  selectIdentityUserId
42
46
  } from "./chunk-SEJ5OS6F.js";
43
47
  import {
44
- isRecord
45
- } from "./chunk-KUG52IAP.js";
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 = (0, import_date_fns.format)(/* @__PURE__ */ new Date(), "MM-dd HH:mm");
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: (0, import_date_fns.formatISO)(/* @__PURE__ */ new Date()),
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-6IR6BBXE.js");
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 { isAbsolute, relative, resolve } from "node:path";
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
- function parseAllowedRoots(env = process.env) {
32
- const raw = env?.NOLO_CHROME_UPLOAD_ROOTS;
33
- if (!raw || typeof raw !== "string") {
34
- return [];
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
- return raw.split(",").map((entry) => entry.trim()).filter(Boolean).filter((entry) => isAbsolute(entry)).map((entry) => {
37
- const resolved = resolve(entry);
38
- if (existsSync(resolved)) {
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
- return resolved;
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 allowedRoots = parseAllowedRoots(env);
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
- "Upload roots not configured in NOLO_CHROME_UPLOAD_ROOTS; all uploads are refused."
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: error?.code ?? "CHROME_CONNECTOR_ERROR",
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 chrome_list_tabs before calling ${action}.`
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 chrome_read_page or a CSS selector."
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 defaultPort = process.env.NOLO_CHROME_CONNECTOR_PORT || "38947";
244
- const endpoint = args?.endpoint ?? process.env.NOLO_CHROME_CONNECTOR_RPC_URL ?? `http://127.0.0.1:${defaultPort}/rpc`;
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: ["browser_debug"],
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 expectedExtensionId = args?.expectedExtensionId ?? NOLO_CHROME_CONNECTOR_EXTENSION_ID;
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 !== expectedExtensionId) {
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 ${expectedExtensionId}, received ${typeof receivedExtensionId === "string" ? receivedExtensionId : "unknown"}.`,
309
- { expectedExtensionId, receivedExtensionId }
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 result = await (args.client ?? createChromeConnectorClient()).request(action, payload);
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-QDSINZM3.js";
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-VMFTFOWF.js";
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\uFF0C\u5141\u8BB8\u5E26\u539F\u56E0\u8DF3\u8FC7\uFF08commit message \u6CE8\u660E [no-review: \u539F\u56E0]\uFF09\uFF0C\u4F46\u9ED8\u8BA4\u5FC5\u987B\u6D3E review\u3002`;
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\u8BF7\u5728\u684C\u9762\u7AEF\u6D4F\u89C8\u5668\u4F7F\u7528\u3002",
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\u82E5\u62A5\u300C\u8BE5\u5E73\u53F0\u9700\u8981\u767B\u5F55\u6001\uFF0C\u8BF7\u5728\u684C\u9762\u7AEF\u6D4F\u89C8\u5668\u4E2D\u4F7F\u7528\u300D\uFF0C\u63D0\u793A\u7528\u6237\u6539\u8D70\u684C\u9762\u7AEF\u6D4F\u89C8\u80FD\u529B\uFF0C\u4E0D\u8981\u5C1D\u8BD5\u4F20 cookie\u3002
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
  };
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  MEMORY_USE_GUIDANCE,
3
3
  wrapHistoricalSummaryWithReplayGuard
4
- } from "./chunk-2GRGFCF6.js";
4
+ } from "./chunk-4VJAC32I.js";
5
5
 
6
6
  // packages/agent-runtime/turnContext.ts
7
7
  var DEFAULT_RECENT_CONTENT_LIMIT = 10;