nolo-cli 0.96.0-alpha.1 → 0.96.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 (181) hide show
  1. package/README.md +1 -1
  2. package/{_executeModel-AUQRMRWL.js → _executeModel-GWF37P7J.js} +68 -63
  3. package/{action-YVYQEAAV.js → action-GI44T4DR.js} +10 -10
  4. package/{addContentAction-O7R66HEX.js → addContentAction-B2DRF7P6.js} +9 -9
  5. package/{addDialogAgentAction-74OA7KYP.js → addDialogAgentAction-T3I7IXPK.js} +15 -17
  6. package/{agentDeleteCommand-4BAHJRU3.js → agentDeleteCommand-5SHJMUF7.js} +47 -43
  7. package/{agentEmailCommands-QISOY7Y6.js → agentEmailCommands-YC7RFNYN.js} +90 -82
  8. package/{agentListCommands-U46ODMQU.js → agentListCommands-O4DSVOHQ.js} +78 -82
  9. package/{agentMachineCommands-EHV2KM2C.js → agentMachineCommands-ZSQCK3SA.js} +42 -38
  10. package/{agentProviderCommands-GNPTL5XR.js → agentProviderCommands-EMZCM6VA.js} +1 -1
  11. package/{agentPullCommand-O5MPVJ5E.js → agentPullCommand-HF4A42D4.js} +1 -1
  12. package/agentRecordCommands-MUG5QMN7.js +136 -0
  13. package/{agentRunCommand-K4CLMA6B.js → agentRunCommand-5EBSIN74.js} +90 -80
  14. package/{agentRunControl-XLGD3UZ5.js → agentRunControl-5T64LM2M.js} +2 -2
  15. package/{agentRuntimeLocal-O4HPUJA4.js → agentRuntimeLocal-KTWDCVYZ.js} +44 -36
  16. package/{agentSlice-ZYT2OUR3.js → agentSlice-QA6WAKNE.js} +11 -11
  17. package/{appDeleteCommands-R5BBTKQK.js → appDeleteCommands-JPPKN55V.js} +42 -38
  18. package/{appDeployCommands-ZJIXOJWD.js → appDeployCommands-QU5PW23S.js} +42 -38
  19. package/{appDeployStatusCommands-B3R2ZTBF.js → appDeployStatusCommands-QVAJTRSP.js} +42 -38
  20. package/{appGetCommands-2AQSOV2A.js → appGetCommands-LT3KDTHJ.js} +42 -38
  21. package/{appListCommands-HCIJGZFY.js → appListCommands-V37HIWKN.js} +42 -38
  22. package/{authCommand-F4EFRRX6.js → authCommand-2YPMMIJN.js} +117 -23
  23. package/{authCommands-RGOGCPP6.js → authCommands-FFDS4FVX.js} +7 -5
  24. package/{builtinSkillRegistry-FUAVTRVZ.js → builtinSkillRegistry-CALVIJTX.js} +6 -5
  25. package/{chatQueueReduxAdapter-Q5V4YJVI.js → chatQueueReduxAdapter-YYIRKWPD.js} +30 -29
  26. package/{chromeCommands-FZYAU75D.js → chromeCommands-K27J4OVZ.js} +124 -28
  27. package/{chromeOpsCommands-62P2Q2YB.js → chromeOpsCommands-IXRLN57H.js} +4 -3
  28. package/{chunk-6OZ36FXI.js → chunk-27ONFIEY.js} +22 -4
  29. package/{chunk-JEDZAO7L.js → chunk-2SYTUTLI.js} +257 -37
  30. package/{chunk-OIVSQH2O.js → chunk-3BXNTXYI.js} +299 -5
  31. package/{chunk-BLJWCTRL.js → chunk-45LEXXBA.js} +1 -1
  32. package/{chunk-EYAQT56M.js → chunk-4DPP773Q.js} +2 -2
  33. package/chunk-4LCOCOR5.js +50 -0
  34. package/{chunk-2GRGFCF6.js → chunk-4VJAC32I.js} +2 -1
  35. package/{chunk-LLT642J4.js → chunk-4W65H3KF.js} +24 -5
  36. package/{chunk-MC4XLIJ7.js → chunk-523DITKR.js} +1 -1
  37. package/chunk-5G7QSEFG.js +13349 -0
  38. package/{chunk-E4MARS3Q.js → chunk-5GVBDNTO.js} +1 -1
  39. package/chunk-5J3PYNUP.js +255 -0
  40. package/chunk-5MMAK75Q.js +15 -0
  41. package/{chunk-JPGCXHNM.js → chunk-5OA5HMTL.js} +1 -1
  42. package/{chunk-42V6BK2E.js → chunk-62IL3KQV.js} +4 -34
  43. package/{chunk-6YTOJY35.js → chunk-6D2JFXLY.js} +35 -0
  44. package/{chunk-3BMYXEUW.js → chunk-6O4IK4V2.js} +1 -1
  45. package/{chunk-WADCY6G6.js → chunk-6ZWMH6TJ.js} +111 -41
  46. package/{chunk-ABQYVJBJ.js → chunk-7CHC4W22.js} +1 -1
  47. package/{chunk-YQTQQX2H.js → chunk-7IJ3GSRH.js} +1 -1
  48. package/{chunk-GQBOR3G6.js → chunk-7KVZ5LDQ.js} +2 -2
  49. package/{chunk-OA6Q2A4I.js → chunk-A7RSPKU6.js} +98 -22
  50. package/chunk-ALY3N3HU.js +7600 -0
  51. package/{chunk-Q554LLSI.js → chunk-AUDNYVRC.js} +1 -1
  52. package/{chunk-GPCZ7UXG.js → chunk-AZRHIN5B.js} +1 -1
  53. package/chunk-BMQ2MJUK.js +153 -0
  54. package/{chunk-3IIEFNGY.js → chunk-C53ZG23R.js} +2 -2
  55. package/chunk-CHOZJMJS.js +78 -0
  56. package/{chunk-HJUYAD4A.js → chunk-CPUFH46E.js} +8 -8
  57. package/{chunk-LS2ZANRJ.js → chunk-CTUQJVQM.js} +1 -1
  58. package/{chunk-BP4XNZRM.js → chunk-CU3QB4HW.js} +3 -3
  59. package/{chunk-ACTMNVHM.js → chunk-CYSYR67N.js} +1 -1
  60. package/{chunk-KQ4ONNQD.js → chunk-DAWDCRIG.js} +82 -8
  61. package/{chunk-VLTIYV3X.js → chunk-DCLMZ5TX.js} +4 -4
  62. package/{chunk-UKZDAFYT.js → chunk-DSSTTEKI.js} +6 -10
  63. package/{chunk-HVURBGF3.js → chunk-ESRMFY7G.js} +2 -2
  64. package/{chunk-TRV2MIDW.js → chunk-EXAJ6DCR.js} +1 -0
  65. package/{chunk-ZLR5JN3E.js → chunk-FKBRWL4E.js} +7 -7
  66. package/{chunk-XOVEWFLK.js → chunk-G3BCMDJB.js} +100 -100
  67. package/chunk-GMZLP5DV.js +82 -0
  68. package/{chunk-FDTR4QJ6.js → chunk-H6A6X4EK.js} +32 -1
  69. package/{chunk-DVINR3PL.js → chunk-HDLLCBRF.js} +1 -1
  70. package/{chunk-ONXOABJR.js → chunk-HNGRBWYF.js} +3 -0
  71. package/{chunk-IAO6JBYW.js → chunk-HP2HV7RZ.js} +171 -14
  72. package/{chunk-H62HCIUP.js → chunk-HYZIYH2H.js} +11 -10
  73. package/{chunk-NTW5GWDM.js → chunk-I3QNET24.js} +32 -17
  74. package/{chunk-WV42OMV7.js → chunk-IAESIMK7.js} +4 -4
  75. package/{chunk-JRQFUXY7.js → chunk-KCDUTE5V.js} +96 -19
  76. package/{chunk-XRWZB6CF.js → chunk-KLTTJFH2.js} +23 -76
  77. package/{chunk-IIVGDG4I.js → chunk-LNPYTNMG.js} +8 -4
  78. package/{chunk-AFDS2CVM.js → chunk-MDMTFGJ2.js} +15 -20
  79. package/{chunk-4MY4GLIW.js → chunk-MN3RHOFX.js} +969 -1090
  80. package/{chunk-7S4YWN7P.js → chunk-MX574M24.js} +1 -1
  81. package/{chunk-FZGV4FGK.js → chunk-NUHHBEJC.js} +378 -187
  82. package/{chunk-53HEEOTT.js → chunk-O26PCYLS.js} +80 -13
  83. package/{chunk-3DII57IT.js → chunk-O2OWEFII.js} +1 -1
  84. package/chunk-OCZKATRC.js +129 -0
  85. package/{chunk-6D6VBVEW.js → chunk-OTEMQQZI.js} +80 -14
  86. package/chunk-P6GMCCAT.js +870 -0
  87. package/{chunk-CPH3W5A7.js → chunk-Q4GP72HX.js} +94 -3
  88. package/{chunk-DHDMC6FO.js → chunk-QKUMVP3O.js} +11 -6
  89. package/{chunk-76WEAXJB.js → chunk-QXWGM7NK.js} +18 -15
  90. package/{chunk-JOHSKZQX.js → chunk-R2TEASHZ.js} +865 -207
  91. package/{chunk-Z77CRGTW.js → chunk-R4SQ3LGW.js} +1 -1
  92. package/{chunk-V4MJDUSR.js → chunk-RSEEDUMS.js} +2 -2
  93. package/{chunk-UZGQNTVW.js → chunk-S5XGT6GB.js} +5 -3
  94. package/{chunk-QIAVMDHY.js → chunk-SDAPKV2N.js} +4 -4
  95. package/{chunk-SNPMM7H3.js → chunk-SN2U5EE7.js} +13 -13
  96. package/{chunk-AFUORTY4.js → chunk-SONWNI3L.js} +21 -21
  97. package/{chunk-A6G32FNX.js → chunk-SYAMDUAL.js} +13 -13
  98. package/{chunk-BYMV6QZG.js → chunk-TNIX77YM.js} +4 -0
  99. package/{chunk-OF7AQZUG.js → chunk-TU5NE4U3.js} +9 -84
  100. package/{chunk-EGSKXKR5.js → chunk-TWROMK2A.js} +1 -1
  101. package/chunk-TY3TIUJK.js +89 -0
  102. package/chunk-UNYJU5L6.js +780 -0
  103. package/{chunk-J4MOO56S.js → chunk-UQNS32WZ.js} +10 -2
  104. package/chunk-VIWDGTDA.js +8 -0
  105. package/chunk-VJVNU77E.js +83 -0
  106. package/{chunk-MMPXJXHT.js → chunk-VKEMMN62.js} +584 -480
  107. package/{chunk-ZXKVPF4K.js → chunk-W5HY3V6I.js} +236 -36
  108. package/{chunk-JAXOVNM4.js → chunk-WILHZY7K.js} +45 -45
  109. package/{chunk-UKWGR5SS.js → chunk-WIWM4FE3.js} +187 -398
  110. package/{chunk-BGSLKVCP.js → chunk-XAAUXO27.js} +6 -7
  111. package/{chunk-O6OSWFZQ.js → chunk-XUWRURDF.js} +6 -0
  112. package/{chunk-Q67DOFOO.js → chunk-Y3PMXGLH.js} +2 -0
  113. package/{chunk-SH43IESU.js → chunk-YUNJN43V.js} +44 -9
  114. package/{chunk-BZWBEHGD.js → chunk-YYMTXN25.js} +66 -38
  115. package/{chunk-TOP2VXOR.js → chunk-Z4CSIXYP.js} +2 -2
  116. package/{chunk-DEUUPHOO.js → chunk-ZGESTNDD.js} +77 -17
  117. package/{chunk-2F7RJC6L.js → chunk-ZOVKKMF6.js} +1 -1
  118. package/chunk-ZRAU6T47.js +56 -0
  119. package/commandRegistry-JPJBZMSB.js +833 -0
  120. package/{contentThunks-PT23JWJX.js → contentThunks-S5S6Y7FH.js} +32 -30
  121. package/{cooldownCommands-REAWYVTY.js → cooldownCommands-ZLEPIB4A.js} +2 -2
  122. package/{createAgentAutomationAction-N27SYTLU.js → createAgentAutomationAction-E3V23HF4.js} +32 -30
  123. package/{createDialogAction-XZPLHD5G.js → createDialogAction-PS2N7OCP.js} +36 -33
  124. package/{createPageAction-KHVJQ3CS.js → createPageAction-6XUY3KXJ.js} +38 -36
  125. package/{chunk-3SJQXXGY.js → cursorProvider-YGGNMVWX.js} +2560 -9879
  126. package/{dbSlice-XVWBAGYN.js → dbSlice-DQ32LYTJ.js} +8 -8
  127. package/{deleteFile-YG6QMJLU.js → deleteFile-NX6QHCWZ.js} +3 -3
  128. package/{dialogCommands-ZUWW5UT6.js → dialogCommands-3YXLYO2W.js} +45 -41
  129. package/{dialogSlice-3YH242HS.js → dialogSlice-NTZ5GT5B.js} +36 -29
  130. package/{dist-VODFSGNG.js → dist-NJC2W7I4.js} +61 -54
  131. package/{docCreateCommands-Q6FADDSJ.js → docCreateCommands-4JSMQDST.js} +44 -40
  132. package/{docDeleteCommands-ZKIH54PZ.js → docDeleteCommands-3KTE3KP6.js} +44 -40
  133. package/{docReadCommands-7BZT2QTW.js → docReadCommands-54BL4OYN.js} +43 -39
  134. package/{docStore-YSZRNUUD.js → docStore-QE6H3LDC.js} +11 -10
  135. package/{docUpdateCommands-WJXWTRL7.js → docUpdateCommands-BMBPTW5U.js} +44 -40
  136. package/{fetchMessages-EIU7UFFK.js → fetchMessages-67MEFPZR.js} +2 -2
  137. package/{getPricing-LUSEABA6.js → getPricing-NMMFT3YI.js} +3 -3
  138. package/{handleSendMessageAction-KJO2QDBM.js → handleSendMessageAction-34BJIBML.js} +91 -83
  139. package/index.js +87 -884
  140. package/{localDialogRead-BTFJ4V2I.js → localDialogRead-EBRS242U.js} +2 -2
  141. package/{localRuntimeAuthority-6IR6BBXE.js → localRuntimeAuthority-5W6IJRAD.js} +6 -6
  142. package/{localRuntimeDb-SYQGUF4U.js → localRuntimeDb-3LRMNLCM.js} +1 -1
  143. package/{machineCommands-QC4TD7GJ.js → machineCommands-KBMEZDL3.js} +85 -77
  144. package/{machineWsRunDispatch-XUOIAXO7.js → machineWsRunDispatch-FRANXJZJ.js} +82 -74
  145. package/{memberThunks-QGFLFVCI.js → memberThunks-5ZXPR63F.js} +9 -9
  146. package/{models-T3SG6MJ5.js → models-ZPU5EDF4.js} +2 -2
  147. package/oauthTokenStore-ITEB663N.js +23 -0
  148. package/package.json +1 -1
  149. package/pdf-U6KSUEZZ.js +26435 -0
  150. package/processSpawn-SOAV3FEV.js +11 -0
  151. package/profileConfig-ZGOFORWV.js +43 -0
  152. package/{providerPresetApply-FG6NZ57W.js → providerPresetApply-76AVU3HD.js} +7 -7
  153. package/{providerRegistry-757OWH3O.js → providerRegistry-Z62NC45X.js} +11 -7
  154. package/{read-COE3ZYR6.js → read-EPTJRAEF.js} +5 -5
  155. package/{readDocTool-5USN4A6V.js → readDocTool-W4NDXNEX.js} +5 -3
  156. package/{readlineWorkspace-74TXXSLO.js → readlineWorkspace-P7WDR4NG.js} +2450 -2022
  157. package/{removeDialogAgentAction-IX3MN2ZO.js → removeDialogAgentAction-BVAWQKXE.js} +17 -19
  158. package/{runAgentClientLoop-37BXJD62.js → runAgentClientLoop-5OQN64SG.js} +62 -58
  159. package/{runtimeDoctorCommands-X6WDBEQX.js → runtimeDoctorCommands-3USD722U.js} +3 -3
  160. package/runtimeModeArgs-2Y7BALTO.js +31 -0
  161. package/{setDialogExtraReferencesAction-X4HCPNZL.js → setDialogExtraReferencesAction-LYY45IAD.js} +12 -11
  162. package/{setPrimaryDialogAgentAction-4GMIQLOD.js → setPrimaryDialogAgentAction-73IL7DLU.js} +18 -20
  163. package/{settingSlice-ZQZVUPKK.js → settingSlice-Q6EKL7EQ.js} +9 -9
  164. package/{skillDiscovery-CYUCJMAG.js → skillDiscovery-ZBU76COE.js} +3 -3
  165. package/{spaceCommands-P3ONT6LL.js → spaceCommands-W7B34E7K.js} +44 -40
  166. package/{streamAgentChatTurn-FGXQXALU.js → streamAgentChatTurn-7AX7XVHL.js} +184 -91
  167. package/{switchDialogAgentAction-N52LRPA3.js → switchDialogAgentAction-UUXDSQ6X.js} +15 -17
  168. package/{tableCommands-O6NWHFKV.js → tableCommands-G7RV3RU3.js} +4 -4
  169. package/{toolApiClient-QVJ6HDNN.js → toolApiClient-INIQCPGY.js} +3 -3
  170. package/{tools-R5UF2KZO.js → tools-357446VN.js} +55 -51
  171. package/{tuiSummaryLlmCaller-T2SHYMDZ.js → tuiSummaryLlmCaller-74NRRLVW.js} +18 -16
  172. package/{updateCommands-2M74UL7P.js → updateCommands-4EHDLF5J.js} +3 -3
  173. package/{updateDialogTitleAction-RTADGV7A.js → updateDialogTitleAction-A2OK52IY.js} +81 -43
  174. package/agentRecordCommands-SIPURU2S.js +0 -128
  175. package/chunk-FOWEGIMF.js +0 -18881
  176. package/chunk-M76ECQRD.js +0 -13658
  177. package/chunk-Q5FJJ6XI.js +0 -103
  178. package/chunk-S7Z2HMCN.js +0 -25
  179. package/{chunk-VMFTFOWF.js → chunk-3AH7LNUB.js} +7 -7
  180. package/{chunk-X7HHHIOZ.js → chunk-Y6ROFCZO.js} +0 -0
  181. package/{db-WK5MDZVN.js → db-VQSAOWAO.js} +1 -1
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  isAgentRunTerminalStatus
3
- } from "./chunk-NTW5GWDM.js";
3
+ } from "./chunk-I3QNET24.js";
4
4
  import {
5
5
  isCompiledBinary,
6
6
  resolveCliEntrypointPath
@@ -11,6 +11,60 @@ import { homedir as nodeHomedir } from "node:os";
11
11
  import { dirname, isAbsolute, join, resolve } from "node:path";
12
12
  import * as nodeFs from "node:fs";
13
13
  import { execFileSync as nodeExecFileSync, spawn as nodeSpawn } from "node:child_process";
14
+
15
+ // packages/ai/tools/agent/runFailureClass.ts
16
+ var RATE_LIMIT_PATTERN = /429|rate.?limit|quota|insufficient.?balance|UPSTREAM_402|cooling|冷却/i;
17
+ var PROVIDER_ERROR_PATTERN = /provider|upstream|5\d\d|bad.?gateway|service.?unavailable|overloaded/i;
18
+ var MALFORMED_PATTERN = /MALFORMED_FUNCTION_CALL|malformed|invalid.?function.?call|invalid.?tool.?call/i;
19
+ var STALLED_PATTERN = /stall|no.?progress|repetition|stagnant|无进展|卡死/i;
20
+ var TOOL_ERROR_PATTERN = /tool.?error|tool.?fail|工具/i;
21
+ function classifyRunFailure(input) {
22
+ const status = typeof input.status === "string" ? input.status : "";
23
+ if (status === "done" || status === "killed" || status === "cancelled") {
24
+ return void 0;
25
+ }
26
+ const reason = typeof input.failureReason === "string" ? input.failureReason : "";
27
+ const message = typeof input.errorMessage === "string" ? input.errorMessage : "";
28
+ switch (reason) {
29
+ case "provider_rate_limited":
30
+ return { failureClass: "rate_limited", retryable: true };
31
+ case "provider_error":
32
+ return MALFORMED_PATTERN.test(message) ? { failureClass: "provider_error", retryable: false } : { failureClass: "provider_error", retryable: true };
33
+ case "stalled":
34
+ return { failureClass: "stalled", retryable: false };
35
+ case "tool_error":
36
+ return { failureClass: "tool_error", retryable: false };
37
+ case "config_unresolved":
38
+ return { failureClass: "unknown", retryable: false };
39
+ case "cancelled":
40
+ return void 0;
41
+ default:
42
+ break;
43
+ }
44
+ if (message) {
45
+ if (RATE_LIMIT_PATTERN.test(message)) {
46
+ return { failureClass: "rate_limited", retryable: true };
47
+ }
48
+ if (MALFORMED_PATTERN.test(message)) {
49
+ return { failureClass: "provider_error", retryable: false };
50
+ }
51
+ if (STALLED_PATTERN.test(message)) {
52
+ return { failureClass: "stalled", retryable: false };
53
+ }
54
+ if (TOOL_ERROR_PATTERN.test(message)) {
55
+ return { failureClass: "tool_error", retryable: false };
56
+ }
57
+ if (PROVIDER_ERROR_PATTERN.test(message)) {
58
+ return { failureClass: "provider_error", retryable: true };
59
+ }
60
+ }
61
+ if (status === "failed" || status === "timeout" || status === "orphaned") {
62
+ return { failureClass: "unknown", retryable: false };
63
+ }
64
+ return void 0;
65
+ }
66
+
67
+ // packages/cli/agentRunControl.ts
14
68
  var RUN_TERMINAL_STATUSES = /* @__PURE__ */ new Set([
15
69
  "done",
16
70
  "failed",
@@ -794,6 +848,7 @@ async function spawnLocalBackgroundRun(input, deps = {}) {
794
848
  logPath,
795
849
  queuePath,
796
850
  batchId,
851
+ ...typeof input.credentialGroup === "string" && input.credentialGroup.trim() ? { credentialGroup: input.credentialGroup.trim() } : {},
797
852
  ...typeof input.parentDialogId === "string" && input.parentDialogId.trim() ? { parentDialogId: input.parentDialogId.trim() } : {},
798
853
  ...dodCommands && dodCommands.length > 0 ? { dodCommands } : {},
799
854
  ...spawnHead ? { spawnHead } : {},
@@ -925,6 +980,15 @@ function transitionRunToTerminal(runId, update, deps = {}, options = {}) {
925
980
  } else if (update.status === "killed") {
926
981
  record2.failureReason = "cancelled";
927
982
  }
983
+ const classification = classifyRunFailure({
984
+ status: update.status,
985
+ failureReason: record2.failureReason,
986
+ errorMessage: update.note ?? record2.note
987
+ });
988
+ if (classification) {
989
+ record2.failureClass = classification.failureClass;
990
+ record2.retryable = classification.retryable;
991
+ }
928
992
  const resolvedToolCount = typeof update.toolCallCount === "number" ? update.toolCallCount : record2.activity?.counters?.toolCalls;
929
993
  if (typeof resolvedToolCount === "number") {
930
994
  record2.toolCallCount = resolvedToolCount;
@@ -1044,6 +1108,15 @@ function checkStaleRun(runId, deps = {}) {
1044
1108
  const at = now().toISOString();
1045
1109
  latest.status = "orphaned";
1046
1110
  latest.note = pidReused ? "orphaned: process gone (pid reused by another process)" : "orphaned: process gone without writing terminal status";
1111
+ const orphanClassification = classifyRunFailure({
1112
+ status: "orphaned",
1113
+ failureReason: latest.failureReason,
1114
+ errorMessage: latest.note
1115
+ });
1116
+ if (orphanClassification) {
1117
+ latest.failureClass = orphanClassification.failureClass;
1118
+ latest.retryable = orphanClassification.retryable;
1119
+ }
1047
1120
  latest.endedAt = at;
1048
1121
  latest.reconciledAt = at;
1049
1122
  latest.pid = void 0;
@@ -1259,6 +1332,18 @@ function printStatusOnce(record, deps) {
1259
1332
  }
1260
1333
  if (record.note) deps.output.write(`note: ${record.note}
1261
1334
  `);
1335
+ if (record.failureReason) deps.output.write(`failure: ${record.failureReason}
1336
+ `);
1337
+ if (record.failureClass) {
1338
+ deps.output.write(
1339
+ `class: ${record.failureClass}${typeof record.retryable === "boolean" ? ` (retryable=${record.retryable})` : ""}
1340
+ `
1341
+ );
1342
+ }
1343
+ if (record.credentialGroup) {
1344
+ deps.output.write(`credGroup: ${record.credentialGroup}
1345
+ `);
1346
+ }
1262
1347
  const activitySummary = formatActivitySummary(record.activity);
1263
1348
  if (activitySummary) deps.output.write(`${activitySummary}
1264
1349
  `);
@@ -1388,14 +1473,20 @@ async function terminateRunProcess(record, initialSignal, deps) {
1388
1473
  signalGroup(initialSignal);
1389
1474
  if (initialSignal === "SIGTERM") {
1390
1475
  const deadline = nowMs() + TERMINATE_GRACE_MS;
1391
- while (!isPidGone(pid, deps) && nowMs() < deadline) {
1476
+ const maxIterations = Math.ceil(TERMINATE_GRACE_MS / TERMINATE_POLL_MS) + 1;
1477
+ let iterations = 0;
1478
+ while (!isPidGone(pid, deps) && nowMs() < deadline && iterations < maxIterations) {
1479
+ iterations += 1;
1392
1480
  await sleep(TERMINATE_POLL_MS);
1393
1481
  }
1394
1482
  }
1395
1483
  if (!isPidGone(pid, deps)) {
1396
1484
  signalGroup("SIGKILL");
1397
1485
  const killDeadline = nowMs() + TERMINATE_KILL_GRACE_MS;
1398
- while (!isPidGone(pid, deps) && nowMs() < killDeadline) {
1486
+ const maxIterations = Math.ceil(TERMINATE_KILL_GRACE_MS / TERMINATE_POLL_MS) + 1;
1487
+ let iterations = 0;
1488
+ while (!isPidGone(pid, deps) && nowMs() < killDeadline && iterations < maxIterations) {
1489
+ iterations += 1;
1399
1490
  await sleep(TERMINATE_POLL_MS);
1400
1491
  }
1401
1492
  }
@@ -1,13 +1,16 @@
1
1
  import {
2
2
  buildSkillDocMarkdown
3
- } from "./chunk-Q554LLSI.js";
3
+ } from "./chunk-AUDNYVRC.js";
4
+ import {
5
+ CHROME_CONNECTOR_ACCEPTED_TOOL_NAMES
6
+ } from "./chunk-5J3PYNUP.js";
4
7
  import {
5
8
  SYSTEM_AGENT_CAPABILITIES,
6
9
  SYSTEM_AGENT_CAPABILITY_IDS
7
10
  } from "./chunk-QDSINZM3.js";
8
11
  import {
9
12
  createKey
10
- } from "./chunk-VMFTFOWF.js";
13
+ } from "./chunk-3AH7LNUB.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(
@@ -1,17 +1,13 @@
1
1
  import {
2
2
  buildLocalAgentLookupKeys,
3
3
  shouldReadAgentKeyRemotely
4
- } from "./chunk-Z77CRGTW.js";
4
+ } from "./chunk-R4SQ3LGW.js";
5
5
  import {
6
6
  resolveCliAgentKeyInput
7
7
  } from "./chunk-SV5IJK6K.js";
8
8
  import {
9
9
  toErrorMessage
10
10
  } from "./chunk-HNMXYYJR.js";
11
- import {
12
- readPipeText,
13
- spawnProcess
14
- } from "./chunk-X7HHHIOZ.js";
15
11
  import {
16
12
  parseUserIdFromAuthToken,
17
13
  readOption,
@@ -19,9 +15,13 @@ import {
19
15
  resolveServerCandidates,
20
16
  resolveServerUrl
21
17
  } from "./chunk-A7GB5UGH.js";
18
+ import {
19
+ readPipeText,
20
+ spawnProcess
21
+ } from "./chunk-Y6ROFCZO.js";
22
22
  import {
23
23
  createAgentKey
24
- } from "./chunk-VMFTFOWF.js";
24
+ } from "./chunk-3AH7LNUB.js";
25
25
 
26
26
  // packages/cli/agentRecordHelpers.ts
27
27
  import { readFileSync } from "node:fs";
@@ -277,12 +277,17 @@ async function resolveAgentRecordFromHybridStore(args) {
277
277
  });
278
278
  if (fresh) {
279
279
  try {
280
- await args.db.put(key, { ...fresh, dbKey: key, cachedAt: Date.now() });
280
+ await args.db.put(key, {
281
+ ...fresh,
282
+ dbKey: key,
283
+ serverOrigin: record.serverOrigin,
284
+ cachedAt: Date.now()
285
+ });
281
286
  } catch {
282
287
  }
283
288
  return {
284
289
  agentKey: key,
285
- record: fresh,
290
+ record: { ...fresh, serverOrigin: record.serverOrigin },
286
291
  source: record?.serverOrigin ? "remote-cache" : "local-cache",
287
292
  cacheHit: false
288
293
  };
@@ -506,7 +511,7 @@ function parseAgentUpdateArgs(args) {
506
511
  updates[entry.slice(0, index)] = parseJsonishValue(entry.slice(index + 1));
507
512
  }
508
513
  if (Object.keys(updates).length === 0) {
509
- if (!promptDoc && !copyProviderFrom) {
514
+ if (!promptDoc && !copyProviderFrom && !presetId) {
510
515
  throw new Error("No updates provided. Use --model / --cli-provider / --api-source / --field key=value.");
511
516
  }
512
517
  }
@@ -518,21 +523,19 @@ async function buildCreatedAgentRecord(args) {
518
523
  const resolvedAgentInput = resolveCliAgentKeyInput(args.parsed.agentInput);
519
524
  const agentKey = resolvedAgentInput.startsWith("agent-") ? resolvedAgentInput : createAgentKey.private(userId || "local", resolvedAgentInput);
520
525
  if (args.parsed.presetId) {
521
- const { resolveProviderPresetFields } = await import("./providerPresetApply-FG6NZ57W.js");
526
+ const { resolveProviderPresetFields } = await import("./providerPresetApply-76AVU3HD.js");
522
527
  const fields = resolveProviderPresetFields(args.parsed.presetId);
523
528
  if (fields.kind === "manual") {
524
529
  throw new Error(
525
530
  `unknown --preset "${args.parsed.presetId}". Run \`nolo agent providers\` to list preset ids.`
526
531
  );
527
532
  }
528
- if (fields.kind === "oauth" || fields.requiresDesktopOAuth) {
529
- throw new Error(
530
- `--preset "${args.parsed.presetId}" is an OAuth subscription; create it in Nolo Desktop (OAuth login required).`
531
- );
532
- }
533
533
  const u = args.parsed.updates;
534
534
  u.apiSource = "custom";
535
535
  u.provider = u.provider ?? fields.provider;
536
+ if (fields.apiKeyRef && !u.apiKeyRef) {
537
+ u.apiKeyRef = fields.apiKeyRef;
538
+ }
536
539
  if (fields.customProviderUrl && !u.customProviderUrl) {
537
540
  u.customProviderUrl = fields.customProviderUrl;
538
541
  }