nolo-cli 0.82.0-alpha.5 → 0.82.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 (161) hide show
  1. package/README.md +2 -2
  2. package/{_executeModel-225YRU52.js → _executeModel-FHVQOYWX.js} +48 -48
  3. package/{action-D22U6CTH.js → action-YVYQEAAV.js} +11 -11
  4. package/{addContentAction-XAPUTGL4.js → addContentAction-O7R66HEX.js} +9 -9
  5. package/{addDialogAgentAction-M7VLLBZM.js → addDialogAgentAction-74OA7KYP.js} +8 -8
  6. package/{agentDeleteCommand-ZJNQGVR2.js → agentDeleteCommand-4427YKQF.js} +31 -29
  7. package/{agentEmailCommands-VLVWFWX2.js → agentEmailCommands-LYDIAUOP.js} +67 -63
  8. package/{agentGrantCommands-R3VQEZJR.js → agentGrantCommands-M3XFO6EN.js} +2 -2
  9. package/{agentListCommands-GHQGLAUU.js → agentListCommands-O4AEMQVV.js} +40 -32
  10. package/{agentMachineCommands-QDXYENZJ.js → agentMachineCommands-F6IHXMPD.js} +31 -29
  11. package/{agentProviderCommands-65ZC2WB4.js → agentProviderCommands-GNPTL5XR.js} +87 -0
  12. package/{agentPullCommand-N7L2CT7L.js → agentPullCommand-O5MPVJ5E.js} +3 -3
  13. package/agentRecordCommands-BDLFOU7E.js +128 -0
  14. package/{agentRunCommand-YSCD65HH.js → agentRunCommand-HSSYFGMC.js} +65 -61
  15. package/{agentRunControl-T44MESII.js → agentRunControl-WCTKX5VL.js} +2 -2
  16. package/{agentRuntimeLocal-ZOHB7OOO.js → agentRuntimeLocal-IW3IM5P6.js} +27 -25
  17. package/{agentSlice-O2SBU5TK.js → agentSlice-G54NT6PX.js} +10 -10
  18. package/{appDeleteCommands-PRT6K5N2.js → appDeleteCommands-ZXLXNRHF.js} +31 -29
  19. package/{appDeployCommands-63ZONFAN.js → appDeployCommands-PWB4YERK.js} +31 -29
  20. package/{appDeployStatusCommands-AFAYCVR3.js → appDeployStatusCommands-2EZKZP7Y.js} +31 -29
  21. package/{appGetCommands-TNZDZE36.js → appGetCommands-JNUKOWHO.js} +31 -29
  22. package/{appListCommands-IA4SPG2X.js → appListCommands-6X3H67SS.js} +31 -29
  23. package/{authCommand-EVGFLAHO.js → authCommand-F4EFRRX6.js} +164 -24
  24. package/{authCommands-ILTBI6JV.js → authCommands-RGOGCPP6.js} +4 -5
  25. package/builtinSkillRegistry-FUAVTRVZ.js +33 -0
  26. package/{chatQueueReduxAdapter-4SM3DAWX.js → chatQueueReduxAdapter-VJXYSZ2D.js} +24 -24
  27. package/{chromeCommands-VOIRNJBL.js → chromeCommands-FZYAU75D.js} +1 -1
  28. package/{chromeOpsCommands-M7DPCX2T.js → chromeOpsCommands-62P2Q2YB.js} +31 -1
  29. package/{chunk-C3FZR5EC.js → chunk-2F7RJC6L.js} +1 -1
  30. package/{chunk-QC5LGHYP.js → chunk-2YMRWISD.js} +10 -5
  31. package/{chunk-HQUORJTM.js → chunk-3BMYXEUW.js} +1 -1
  32. package/{chunk-3QPYFHAH.js → chunk-3DII57IT.js} +1 -1
  33. package/{chunk-NTW5GWDM.js → chunk-3VNWWVKB.js} +2 -0
  34. package/{chunk-DWUCB2A3.js → chunk-42V6BK2E.js} +1 -1
  35. package/{chunk-KIS76A2P.js → chunk-4EZHSKTB.js} +38 -4
  36. package/{chunk-GBPZKFYK.js → chunk-53HEEOTT.js} +4 -4
  37. package/{chunk-5XTOKQLW.js → chunk-5UTFL4QJ.js} +6 -2
  38. package/chunk-5ZUL4CUO.js +10 -0
  39. package/{chunk-E6RGHPDR.js → chunk-6D6VBVEW.js} +4 -6
  40. package/{chunk-CMH2SYHX.js → chunk-6OZ36FXI.js} +2 -2
  41. package/{chunk-NRALD3CC.js → chunk-76WEAXJB.js} +49 -10
  42. package/{chunk-3W2JJOH3.js → chunk-7REEVK4I.js} +3 -3
  43. package/{chunk-BYEJ7K2Z.js → chunk-7S4YWN7P.js} +1 -1
  44. package/{chunk-SREASRV5.js → chunk-ABQYVJBJ.js} +1 -1
  45. package/chunk-ACTMNVHM.js +93 -0
  46. package/{chunk-XWNRAIUL.js → chunk-AFUORTY4.js} +6 -16
  47. package/{chunk-E36HZARC.js → chunk-ASQYTZTR.js} +46 -9
  48. package/{chunk-73IOJLK2.js → chunk-AVV3M6CX.js} +10 -10
  49. package/{chunk-WL2RKIBF.js → chunk-BLJWCTRL.js} +1 -1
  50. package/chunk-BNGW5ASC.js +344 -0
  51. package/{chunk-SZLVDREM.js → chunk-BP4XNZRM.js} +3 -3
  52. package/{chunk-2KDR4CWE.js → chunk-BYMV6QZG.js} +24 -1
  53. package/{chunk-MYU3MJCF.js → chunk-DHDMC6FO.js} +175 -7
  54. package/{chunk-FP27MNSX.js → chunk-DL2LVM5E.js} +3 -3
  55. package/{chunk-EXMHJN7C.js → chunk-EYAQT56M.js} +4 -3
  56. package/{chunk-5LSS6MFZ.js → chunk-F5OE5KSJ.js} +13 -15
  57. package/{chunk-CJCJF5XB.js → chunk-FDTR4QJ6.js} +4 -2
  58. package/{chunk-NJ6WLAPS.js → chunk-FEEHCOBD.js} +1 -1
  59. package/{chunk-YSKEOTPH.js → chunk-GGMVRZRO.js} +155 -795
  60. package/{chunk-PYXL2CJL.js → chunk-GPCZ7UXG.js} +1 -1
  61. package/{chunk-K7AG465Q.js → chunk-GQBOR3G6.js} +4 -2
  62. package/{chunk-YFADVSZE.js → chunk-H62HCIUP.js} +6 -6
  63. package/{chunk-PZM3EENV.js → chunk-HJUYAD4A.js} +1 -1
  64. package/{chunk-A3NNC2LA.js → chunk-HOBJGHLD.js} +1235 -59
  65. package/{chunk-3JQ2NRYU.js → chunk-HVURBGF3.js} +4 -4
  66. package/{chunk-6SD5OPQ4.js → chunk-IIBAPOTQ.js} +11 -173
  67. package/{chunk-ZVN6I33J.js → chunk-IIVGDG4I.js} +6 -5
  68. package/{chunk-UDQWGU7F.js → chunk-J4MOO56S.js} +1 -1
  69. package/{chunk-KC5FAHVS.js → chunk-JEDZAO7L.js} +1 -1
  70. package/{chunk-6XIE5ZGI.js → chunk-JPGCXHNM.js} +1 -1
  71. package/chunk-JRQFUXY7.js +1625 -0
  72. package/chunk-KQ4ONNQD.js +677 -0
  73. package/{chunk-CPSZJBLK.js → chunk-L7I247DF.js} +105 -26
  74. package/{chunk-RXX4GDIH.js → chunk-LS2ZANRJ.js} +1 -1
  75. package/{chunk-BJIRLHJR.js → chunk-M2EJHDJP.js} +4 -0
  76. package/{chunk-EVBFYPDC.js → chunk-MC4XLIJ7.js} +6 -2
  77. package/{chunk-DSRXPQWA.js → chunk-NEDZDG3M.js} +43 -43
  78. package/{chunk-UJ63UXGE.js → chunk-OIVSQH2O.js} +1006 -801
  79. package/{chunk-AETZ7AD6.js → chunk-Q554LLSI.js} +1 -1
  80. package/chunk-Q5FJJ6XI.js +103 -0
  81. package/{chunk-AJHEFRGJ.js → chunk-Q67DOFOO.js} +214 -5
  82. package/{chunk-UZ6XXCVR.js → chunk-QDSINZM3.js} +15 -2
  83. package/{chunk-D6XYLSOS.js → chunk-QIAVMDHY.js} +1 -1
  84. package/{chunk-YWG6EMH3.js → chunk-RG6JBBX5.js} +10 -6
  85. package/{chunk-YXLXHIT2.js → chunk-RTUYRRBM.js} +6 -6
  86. package/{chunk-HHLTFENG.js → chunk-SDTTBMBU.js} +907 -317
  87. package/{chunk-QCZX4FTW.js → chunk-SH43IESU.js} +173 -15
  88. package/{chunk-LSZXYE64.js → chunk-SL4QHSPQ.js} +756 -80
  89. package/{chunk-FNGAF7C4.js → chunk-SNPMM7H3.js} +137 -12
  90. package/{chunk-EM6MPSEI.js → chunk-SPUTJ4DW.js} +52 -30
  91. package/{chunk-SO7B7NW3.js → chunk-STHU4Y5X.js} +413 -62
  92. package/{chunk-SPAQ4PVV.js → chunk-SV5IJK6K.js} +1 -1
  93. package/{chunk-KVDUCO4Q.js → chunk-TDRTS7QW.js} +16 -12
  94. package/{chunk-BJCWNHVU.js → chunk-TOP2VXOR.js} +2 -2
  95. package/{chunk-4EJ5QYB5.js → chunk-UKZDAFYT.js} +1 -1
  96. package/{chunk-PGSKWZCB.js → chunk-UZGQNTVW.js} +1 -1
  97. package/{chunk-ZZCJUXUI.js → chunk-V4MJDUSR.js} +2 -2
  98. package/{chunk-JYYZCK2Z.js → chunk-V7E4PXQD.js} +1 -1
  99. package/{chunk-OZX2IPKM.js → chunk-VLTIYV3X.js} +1 -1
  100. package/{chunk-NHRQCXIQ.js → chunk-VMFTFOWF.js} +13 -3
  101. package/{chunk-4UW2LDVA.js → chunk-VQW3EKYS.js} +15 -15
  102. package/{chunk-HH65VA5U.js → chunk-WGR3J4Q6.js} +101 -4
  103. package/{chunk-5J7W2VWW.js → chunk-WV42OMV7.js} +6 -265
  104. package/{chunk-Q46HQOW3.js → chunk-XTAZCQUT.js} +7 -7
  105. package/{chunk-DUJWWUGV.js → chunk-YQTQQX2H.js} +1 -1
  106. package/{chunk-BOYUESO7.js → chunk-Z77CRGTW.js} +1 -1
  107. package/{contentThunks-ENAVF2YU.js → contentThunks-D6QQKIPF.js} +25 -25
  108. package/{cooldownCommands-BSCH2W7P.js → cooldownCommands-REAWYVTY.js} +2 -2
  109. package/{createAgentAutomationAction-CH6BYC7K.js → createAgentAutomationAction-UIPWW4DG.js} +25 -25
  110. package/{createDialogAction-23UDOXSO.js → createDialogAction-573VVP3X.js} +28 -28
  111. package/{createPageAction-J6AEMLHK.js → createPageAction-LRFSS6TD.js} +26 -26
  112. package/{dbSlice-GKGGFNOB.js → dbSlice-XVWBAGYN.js} +8 -8
  113. package/{deleteFile-LWSR674W.js → deleteFile-YG6QMJLU.js} +3 -3
  114. package/{dialogCommands-BJJGCCQR.js → dialogCommands-KFK2FF5B.js} +35 -31
  115. package/{dialogSlice-F7RD6PUY.js → dialogSlice-EXLC5XTD.js} +24 -24
  116. package/{docCreateCommands-53GB2FU3.js → docCreateCommands-V777WOZ7.js} +32 -30
  117. package/{docDeleteCommands-TAW5JEBU.js → docDeleteCommands-5KHT7Z5Q.js} +33 -31
  118. package/{docReadCommands-F5N7N5E3.js → docReadCommands-BLROGWP3.js} +32 -30
  119. package/{docStore-WX4YBGXC.js → docStore-DZNGJXX7.js} +9 -9
  120. package/{docUpdateCommands-YQ7TRT35.js → docUpdateCommands-QXOZHQ5H.js} +32 -30
  121. package/{fetchMessages-DRABNDPZ.js → fetchMessages-EIU7UFFK.js} +3 -4
  122. package/{getPricing-HRMSOF3E.js → getPricing-LUSEABA6.js} +4 -4
  123. package/{handleSendMessageAction-CW4LULIR.js → handleSendMessageAction-OROTZBPO.js} +24 -24
  124. package/index.js +102 -85
  125. package/{localDialogRead-PUQKFI73.js → localDialogRead-BTFJ4V2I.js} +2 -2
  126. package/{localRuntimeDb-P37ZTX55.js → localRuntimeDb-SYQGUF4U.js} +1 -1
  127. package/{machineCommands-FIYWY5EU.js → machineCommands-IJWERHRH.js} +64 -60
  128. package/{machineWsRunDispatch-KQ4OFFNR.js → machineWsRunDispatch-XQ36M4L7.js} +62 -58
  129. package/{memberThunks-KATHH3F4.js → memberThunks-QGFLFVCI.js} +9 -9
  130. package/{models-GS72DVJS.js → models-T3SG6MJ5.js} +2 -2
  131. package/{offlineMarxistsAgentCommand-GEH6SNNA.js → offlineMarxistsAgentCommand-HGXZV4XJ.js} +1 -1
  132. package/package.json +1 -1
  133. package/providerPresetApply-FG6NZ57W.js +214 -0
  134. package/providerRegistry-757OWH3O.js +31 -0
  135. package/{read-LC6HVYBN.js → read-COE3ZYR6.js} +5 -4
  136. package/{readDocTool-N3ERJHHF.js → readDocTool-5USN4A6V.js} +1 -1
  137. package/{readlineWorkspace-QYI6BRNA.js → readlineWorkspace-EB3362L3.js} +144 -108
  138. package/{removeDialogAgentAction-F5GPTALR.js → removeDialogAgentAction-IX3MN2ZO.js} +11 -11
  139. package/{runAgentClientLoop-GZ5VUGAW.js → runAgentClientLoop-3MR2NPWR.js} +47 -47
  140. package/{runtimeDoctorCommands-CROTMULY.js → runtimeDoctorCommands-X6WDBEQX.js} +2 -2
  141. package/{setDialogExtraReferencesAction-AY4ZCF3A.js → setDialogExtraReferencesAction-X4HCPNZL.js} +9 -9
  142. package/{setPrimaryDialogAgentAction-HPMG7V3R.js → setPrimaryDialogAgentAction-4GMIQLOD.js} +11 -11
  143. package/{settingSlice-OEJA4NQO.js → settingSlice-ZQZVUPKK.js} +10 -10
  144. package/{spaceCommands-IYMIXCMC.js → spaceCommands-TIDVUPDV.js} +30 -28
  145. package/{streamAgentChatTurn-EAXIUJTK.js → streamAgentChatTurn-CLP2JWCQ.js} +59 -58
  146. package/{switchDialogAgentAction-HMDZTZ4I.js → switchDialogAgentAction-N52LRPA3.js} +8 -8
  147. package/{tableCommands-SUNTHAYX.js → tableCommands-O6NWHFKV.js} +1 -1
  148. package/{toolApiClient-VGYUB4P5.js → toolApiClient-QVJ6HDNN.js} +2 -2
  149. package/{tools-QWQOW6J4.js → tools-OXEEBABR.js} +43 -43
  150. package/tuiSummaryLlmCaller-VJY3YD2Q.js +127 -0
  151. package/{updateCommands-Y363MC3L.js → updateCommands-2M74UL7P.js} +2 -2
  152. package/{updateDialogTitleAction-2HCE2M7S.js → updateDialogTitleAction-4YWKF2OE.js} +45 -28
  153. package/agentRecordCommands-AQFYM5HS.js +0 -124
  154. package/chunk-3IT2PFHL.js +0 -611
  155. package/chunk-I42VC5KR.js +0 -15
  156. package/chunk-NG4UT4K4.js +0 -79
  157. package/codingSkills-E6KSDNSJ.js +0 -48
  158. package/tuiSummaryLlmCaller-3Z24VUWM.js +0 -116
  159. package/{chunk-3RAG2NAD.js → chunk-UKWGR5SS.js} +3 -3
  160. package/{db-VQSAOWAO.js → db-WK5MDZVN.js} +1 -1
  161. package/{localRuntimeAuthority-R5UBODT3.js → localRuntimeAuthority-6IR6BBXE.js} +3 -3
@@ -4,15 +4,15 @@ import {
4
4
  refreshAntigravityOAuthToken,
5
5
  refreshOpenAiCodexToken,
6
6
  xaiRefresh
7
- } from "./chunk-GBPZKFYK.js";
7
+ } from "./chunk-53HEEOTT.js";
8
+ import {
9
+ defaultLoopbackRequest
10
+ } from "./chunk-EADNWBAZ.js";
8
11
  import {
9
12
  createChromeConnectorClient,
10
13
  createVerifiedChromeConnectorClient,
11
14
  executeChromeConnectorTool
12
- } from "./chunk-QCZX4FTW.js";
13
- import {
14
- defaultLoopbackRequest
15
- } from "./chunk-EADNWBAZ.js";
15
+ } from "./chunk-SH43IESU.js";
16
16
  import {
17
17
  ackRunRecord,
18
18
  appendRunQueue,
@@ -21,6 +21,7 @@ import {
21
21
  commitRunRecordClaim,
22
22
  findRunRecord,
23
23
  gcRunRecords,
24
+ isRunTerminalStatus,
24
25
  popAllQueueEntries,
25
26
  queryRunRecords,
26
27
  releaseRunRecordAck,
@@ -29,7 +30,7 @@ import {
29
30
  terminateRunProcess,
30
31
  transitionRunToTerminal,
31
32
  withQueueLock
32
- } from "./chunk-HH65VA5U.js";
33
+ } from "./chunk-WGR3J4Q6.js";
33
34
  import {
34
35
  clearCredentialAvailability,
35
36
  markCredentialUnavailable,
@@ -37,30 +38,30 @@ import {
37
38
  readCredentialEntry,
38
39
  recordCredentialProbe,
39
40
  resolveCredentialKeyWithFallback
40
- } from "./chunk-DWUCB2A3.js";
41
+ } from "./chunk-42V6BK2E.js";
41
42
  import {
42
43
  buildLocalAgentLookupKeys
43
- } from "./chunk-BOYUESO7.js";
44
+ } from "./chunk-Z77CRGTW.js";
44
45
  import {
45
46
  LOCAL_CODEX_AGENT_ID,
46
47
  LOCAL_CODEX_AGENT_KEY,
47
48
  NOLO_DEFAULT_AGENT_ID,
48
49
  NOLO_DEFAULT_AGENT_KEY
49
- } from "./chunk-SPAQ4PVV.js";
50
+ } from "./chunk-SV5IJK6K.js";
50
51
  import {
51
52
  CliProviderQuotaError,
52
53
  executeCli
53
54
  } from "./chunk-MP64VFGD.js";
54
55
  import {
55
56
  inferCaptureIntent
56
- } from "./chunk-3QPYFHAH.js";
57
+ } from "./chunk-3DII57IT.js";
57
58
  import {
58
59
  buildCliPrompt
59
60
  } from "./chunk-ATNTHIZI.js";
60
61
  import {
61
62
  inlineImageUrlsForCustomProvider,
62
63
  prepareTools
63
- } from "./chunk-3W2JJOH3.js";
64
+ } from "./chunk-7REEVK4I.js";
64
65
  import {
65
66
  getServerProviderSecret
66
67
  } from "./chunk-HS7MLR74.js";
@@ -69,6 +70,7 @@ import {
69
70
  CONTROL_AGENT_RUN_ACTIONS,
70
71
  buildControlAgentRunFunctionSchema,
71
72
  buildStartAgentRunFunctionSchema,
73
+ checkCredentialFanout,
72
74
  deleteMemoryFunctionSchema,
73
75
  queryMemoryFunctionSchema,
74
76
  readXPostFunc,
@@ -78,11 +80,11 @@ import {
78
80
  rememberMemoryFunctionSchema,
79
81
  resolveAgentRequiredPackIds,
80
82
  setTodoListFunc
81
- } from "./chunk-YSKEOTPH.js";
83
+ } from "./chunk-GGMVRZRO.js";
82
84
  import {
83
85
  fetchWithTransientRetry,
84
86
  isTransientFetchError
85
- } from "./chunk-5XTOKQLW.js";
87
+ } from "./chunk-5UTFL4QJ.js";
86
88
  import {
87
89
  TASK_PREVIEW_MAX,
88
90
  formatListRunsCard,
@@ -94,26 +96,33 @@ import {
94
96
  isAgentRunTerminalStatus,
95
97
  resolveRunLabel,
96
98
  shortRunId
97
- } from "./chunk-NTW5GWDM.js";
99
+ } from "./chunk-3VNWWVKB.js";
100
+ import {
101
+ deriveCredentialGroup
102
+ } from "./chunk-RG6JBBX5.js";
103
+ import {
104
+ getModelPricing
105
+ } from "./chunk-EYAQT56M.js";
98
106
  import {
99
107
  applyBuiltinAgentRuntimeOverride,
100
108
  applyTokenUsageToDayStats,
101
109
  prepareTokenUsageData,
102
110
  resolveBuiltinPlatformAgentConfig,
103
111
  runKeyed
104
- } from "./chunk-SO7B7NW3.js";
112
+ } from "./chunk-STHU4Y5X.js";
105
113
  import {
114
+ BUILTIN_DIALOG_LLM_CHAT_FALLBACK_MODEL,
106
115
  BUILTIN_TITLE_LLM_CONFIG
107
- } from "./chunk-EVBFYPDC.js";
116
+ } from "./chunk-MC4XLIJ7.js";
108
117
  import {
109
118
  fetchServerSyncedCredential
110
- } from "./chunk-Q46HQOW3.js";
119
+ } from "./chunk-XTAZCQUT.js";
111
120
  import {
112
121
  require_date_fns
113
122
  } from "./chunk-M76ECQRD.js";
114
123
  import {
115
124
  getDefaultCliLocalRuntimeDb
116
- } from "./chunk-C3FZR5EC.js";
125
+ } from "./chunk-2F7RJC6L.js";
117
126
  import {
118
127
  FORCED_TOOLS,
119
128
  addDefaultLightWebToolsForConfiguredAgents,
@@ -123,7 +132,7 @@ import {
123
132
  applySystemBuiltinSkillFilter,
124
133
  expandEnabledPacks,
125
134
  resolveEffectiveEnabledPacks
126
- } from "./chunk-MYU3MJCF.js";
135
+ } from "./chunk-DHDMC6FO.js";
127
136
  import {
128
137
  DEFAULT_HYBRID_READ_TIMEOUT_MS,
129
138
  Duration_exports,
@@ -139,6 +148,7 @@ import {
139
148
  buildLocalWorkspaceToolset,
140
149
  buildNoloWorkspaceCliToolExecutors,
141
150
  codexStreamFailureStatus,
151
+ createDevinProvider,
142
152
  createHybridRecordStore,
143
153
  createLocalWorkspaceToolExecutors,
144
154
  evaluateFileWritePolicy,
@@ -155,11 +165,12 @@ import {
155
165
  parseSseDataLineObject,
156
166
  parseSyncServersEnv,
157
167
  parseUpstreamErrorBody,
168
+ readDevinUpstreamFailure,
158
169
  resolveAntigravityFinishReason,
159
170
  resolveOpenAiCompatibleProviderConfig,
160
171
  shouldUseGeminiNativeToolRoute,
161
172
  summarizeToolArguments
162
- } from "./chunk-HHLTFENG.js";
173
+ } from "./chunk-SDTTBMBU.js";
163
174
  import {
164
175
  PlatformStreamInterruptedError,
165
176
  buildPlatformChatCompletionRequest,
@@ -171,11 +182,14 @@ import {
171
182
  readSseDataValues,
172
183
  resolvePlatformChatProviderConfig,
173
184
  shouldUsePlatformChatProvider
174
- } from "./chunk-QC5LGHYP.js";
185
+ } from "./chunk-2YMRWISD.js";
175
186
  import {
176
187
  resolveAgentRuntimeConfigFromRecord,
177
188
  resolveHistoricalToolContentCap
178
- } from "./chunk-KIS76A2P.js";
189
+ } from "./chunk-4EZHSKTB.js";
190
+ import {
191
+ isDevinOAuthAgent
192
+ } from "./chunk-5ZUL4CUO.js";
179
193
  import {
180
194
  collectStablePromptPrefix,
181
195
  convertMessagesToResponsesInput,
@@ -186,38 +200,39 @@ import {
186
200
  buildNoloWorkspaceOpenAiTools,
187
201
  parseNoloWorkspaceToolArguments,
188
202
  resolveRuntimeToolSurfaceForAgent
189
- } from "./chunk-ZVN6I33J.js";
203
+ } from "./chunk-IIVGDG4I.js";
190
204
  import {
191
205
  mergeAvailabilityDeadline,
192
206
  resolveAvailabilityAction,
193
207
  resolveCooldownGate
194
- } from "./chunk-CJCJF5XB.js";
208
+ } from "./chunk-FDTR4QJ6.js";
195
209
  import {
196
210
  isAntigravityOAuthAgent
197
- } from "./chunk-PGSKWZCB.js";
211
+ } from "./chunk-UZGQNTVW.js";
198
212
  import {
199
213
  resolvePlatformAuthToken
200
- } from "./chunk-CMH2SYHX.js";
214
+ } from "./chunk-6OZ36FXI.js";
201
215
  import {
202
216
  buildDialogFallbackTitleFromUserInput,
203
217
  normalizeDialogTitle
204
218
  } from "./chunk-2MBTWINN.js";
205
219
  import {
206
220
  normalizeUsage
207
- } from "./chunk-DSRXPQWA.js";
221
+ } from "./chunk-NEDZDG3M.js";
208
222
  import {
209
223
  clipCompactText,
210
224
  createProviderCallTimingTracker,
211
225
  finalizeProviderCallTiming,
212
226
  observeMeaningfulProviderResponseAt,
213
227
  withProviderCallTimingFields
214
- } from "./chunk-E36HZARC.js";
228
+ } from "./chunk-ASQYTZTR.js";
215
229
  import {
216
230
  estimateTokenCount
217
231
  } from "./chunk-PSCNXBYA.js";
218
232
  import {
233
+ getModelConfig,
219
234
  isAdaptiveThinkingModelId
220
- } from "./chunk-UJ63UXGE.js";
235
+ } from "./chunk-OIVSQH2O.js";
221
236
  import {
222
237
  compactWhitespace
223
238
  } from "./chunk-DWLEOOGR.js";
@@ -226,7 +241,7 @@ import {
226
241
  resolveCurrentRunRuntimeToolPolicy,
227
242
  resolveLocalWorkspaceExecutorOptionsFromPolicy,
228
243
  resolveRequestedRuntimeToolNames
229
- } from "./chunk-3JQ2NRYU.js";
244
+ } from "./chunk-HVURBGF3.js";
230
245
  import {
231
246
  createOAuthTokenStore,
232
247
  isTokenExpired,
@@ -246,24 +261,42 @@ import {
246
261
  import {
247
262
  DEFAULT_NOLO_SERVER_URL
248
263
  } from "./chunk-OLZBQWZU.js";
264
+ import {
265
+ isNoloHostedProvider,
266
+ isPlatformHostedImageModel
267
+ } from "./chunk-Q67DOFOO.js";
249
268
  import {
250
269
  createTokenKey,
251
270
  createTokenStatsKey,
252
271
  createUserKey,
253
272
  dialogMessageRange
254
- } from "./chunk-NHRQCXIQ.js";
273
+ } from "./chunk-VMFTFOWF.js";
255
274
  import {
256
275
  asTrimmedLowercaseString
257
276
  } from "./chunk-QSJ3HFEF.js";
258
277
  import {
278
+ PUBLIC_DEEPSEEK_V4_FLASH_AGENT_ID,
279
+ PUBLIC_DEEPSEEK_V4_PRO_AGENT_ID,
280
+ PUBLIC_GLM_53_FLASH_AGENT_ID,
281
+ PUBLIC_GPT_IMAGE_2_CONTINUOUS_AGENT_ID,
282
+ PUBLIC_GPT_IMAGE_2_EDITOR_AGENT_ID,
283
+ PUBLIC_GPT_IMAGE_2_GENERATOR_AGENT_ID,
284
+ PUBLIC_NANO_BANANA_2_LITE_AGENT_ID,
285
+ builtinAgentCatalogEntryById,
286
+ isRetiredCatalogEntry,
259
287
  isSystemBuiltinTrustedAgentKey
260
- } from "./chunk-5J7W2VWW.js";
288
+ } from "./chunk-BNGW5ASC.js";
261
289
  import {
262
- asTrimmedString
263
- } from "./chunk-3EUW3WEO.js";
290
+ parsePublicAgentId,
291
+ parseSystemAgentId,
292
+ publicAgentKey
293
+ } from "./chunk-M2EJHDJP.js";
264
294
  import {
265
295
  isRecord
266
296
  } from "./chunk-KUG52IAP.js";
297
+ import {
298
+ asTrimmedString
299
+ } from "./chunk-3EUW3WEO.js";
267
300
  import {
268
301
  NOLO_CLUSTER_SERVERS
269
302
  } from "./chunk-LCBAMY2M.js";
@@ -574,6 +607,10 @@ var STRINGS = {
574
607
  en: "\u2713 Copied the selection to the clipboard.",
575
608
  zh: "\u2713 \u5DF2\u590D\u5236\u9009\u533A\u5230\u526A\u8D34\u677F\u3002"
576
609
  },
610
+ copiedSelectionBusy: {
611
+ en: "\u2713 Copied the selection to the clipboard. Press Esc to stop generating.",
612
+ zh: "\u2713 \u5DF2\u590D\u5236\u9009\u533A\u5230\u526A\u8D34\u677F\u3002\u6309 Esc \u505C\u6B62\u751F\u6210\u3002"
613
+ },
577
614
  copiedAllHistory: {
578
615
  en: "\u2713 Copied the full conversation to the clipboard.",
579
616
  zh: "\u2713 \u5DF2\u590D\u5236\u5B8C\u6574\u5BF9\u8BDD\u5230\u526A\u8D34\u677F\u3002"
@@ -1715,6 +1752,9 @@ function buildCliChromeConnectorOpenAiTools(args) {
1715
1752
  function buildOpenAiTools(args) {
1716
1753
  const toolset = buildLocalWorkspaceToolsetForEnv(args);
1717
1754
  const workspaceToolNames = toolset.toolNames;
1755
+ const modelWorkspaceToolNames = (args.effectiveToolNames ?? workspaceToolNames).filter(
1756
+ (toolName) => toolName !== "taskWait" || !hasRunWakeChannel(args.env)
1757
+ );
1718
1758
  const toolNameSet = new Set(args.toolNames ?? []);
1719
1759
  const uiAskChoiceTools = toolNameSet.has("ask_user") ? prepareTools(["ask_user"]) : [];
1720
1760
  const readPastedTextTools = toolNameSet.has("readPastedText") ? [
@@ -1756,7 +1796,7 @@ function buildOpenAiTools(args) {
1756
1796
  ...uiAskChoiceTools,
1757
1797
  ...readPastedTextTools,
1758
1798
  ...buildLocalWorkspaceOpenAiTools({
1759
- toolNames: args.effectiveToolNames ?? workspaceToolNames,
1799
+ toolNames: modelWorkspaceToolNames,
1760
1800
  exposeShellTools: toolset.exposeShellTools
1761
1801
  }),
1762
1802
  ...buildCliChromeConnectorOpenAiTools({ toolNames: args.toolNames }),
@@ -8045,6 +8085,37 @@ function processCursorServerMessage(msg, state, onTextDelta, onReasoningDelta) {
8045
8085
  state.outputTokens += tokens;
8046
8086
  }
8047
8087
  }
8088
+ function attachCursorUpstreamFailure(error, failure) {
8089
+ if (failure) {
8090
+ error.cursorUpstreamFailure = failure;
8091
+ }
8092
+ return error;
8093
+ }
8094
+ function readCursorUpstreamFailure(error) {
8095
+ if (!error || typeof error !== "object") return void 0;
8096
+ const failure = error.cursorUpstreamFailure;
8097
+ if (!failure || typeof failure !== "object") return void 0;
8098
+ if (typeof failure.status !== "number" || !Number.isFinite(failure.status)) {
8099
+ return void 0;
8100
+ }
8101
+ return failure;
8102
+ }
8103
+ function buildCursorGrpcTrailerError(trailers) {
8104
+ const status = trailers["grpc-status"];
8105
+ if (!status || String(status) === "0") return null;
8106
+ const rawMessage = String(trailers["grpc-message"] || "");
8107
+ let message;
8108
+ try {
8109
+ message = decodeURIComponent(rawMessage);
8110
+ } catch {
8111
+ message = rawMessage;
8112
+ }
8113
+ const statusText = String(status);
8114
+ return attachCursorUpstreamFailure(
8115
+ new Error(`Cursor gRPC error ${statusText}: ${message}`),
8116
+ statusText === "8" || statusText.toLowerCase() === "resource_exhausted" ? { status: 429, body: { code: "resource_exhausted", message } } : void 0
8117
+ );
8118
+ }
8048
8119
  async function streamCursorChat(messages, options) {
8049
8120
  const baseUrl = options.baseUrl || CURSOR_API_URL;
8050
8121
  const clientVersion = options.clientVersion || CURSOR_CLIENT_VERSION;
@@ -8142,14 +8213,9 @@ async function streamCursorChat(messages, options) {
8142
8213
  }
8143
8214
  });
8144
8215
  h2Request.on("trailers", (trailers) => {
8145
- const status = trailers["grpc-status"];
8146
- const msg = trailers["grpc-message"];
8147
- if (status && status !== "0") {
8148
- h2Completion.reject(
8149
- new Error(
8150
- `Cursor gRPC error ${status}: ${decodeURIComponent(String(msg || ""))}`
8151
- )
8152
- );
8216
+ const error = buildCursorGrpcTrailerError(trailers);
8217
+ if (error) {
8218
+ h2Completion.reject(error);
8153
8219
  }
8154
8220
  });
8155
8221
  h2Request.on("end", () => {
@@ -9220,7 +9286,7 @@ function assertWithinLocalToolBudget(args) {
9220
9286
 
9221
9287
  // packages/cli/client/providerResolution/cursorTransport.ts
9222
9288
  var resolveCursorTransport = async (ctx) => {
9223
- const { agentConfig, deps, workspaceRoot, additionalToolNames, buildProviderOpenAiTools, apiKeyRefResolver, activeAgentToolNames, localToolExecutors } = ctx;
9289
+ const { agentConfig, deps, workspaceRoot, additionalToolNames, buildProviderOpenAiTools, apiKeyRefResolver, activeAgentToolNames, localToolExecutors, recordLocalAvailability } = ctx;
9224
9290
  if (isCursorOAuthAgent(agentConfig)) {
9225
9291
  const accessToken = await apiKeyRefResolver("cursor");
9226
9292
  if (!accessToken) {
@@ -9296,15 +9362,88 @@ var resolveCursorTransport = async (ctx) => {
9296
9362
  toolCount: tools.length,
9297
9363
  requestedToolNames
9298
9364
  });
9299
- const result = await cursorProvider.complete(messages, options);
9300
- logLocalRuntimeDiagnostic("provider.request.result", {
9301
- agentKey: agentConfig.key,
9302
- transport: "cursor-connect",
9303
- ok: true,
9304
- contentChars: (result.content ?? "").length,
9305
- toolCallCount: result.tool_calls?.length ?? 0
9306
- });
9307
- return result;
9365
+ try {
9366
+ const result = await cursorProvider.complete(messages, options);
9367
+ await recordLocalAvailability(200);
9368
+ logLocalRuntimeDiagnostic("provider.request.result", {
9369
+ agentKey: agentConfig.key,
9370
+ transport: "cursor-connect",
9371
+ ok: true,
9372
+ contentChars: (result.content ?? "").length,
9373
+ toolCallCount: result.tool_calls?.length ?? 0
9374
+ });
9375
+ return result;
9376
+ } catch (error) {
9377
+ const failure = readCursorUpstreamFailure(error);
9378
+ if (failure) {
9379
+ await recordLocalAvailability(failure.status, failure.body);
9380
+ }
9381
+ throw error;
9382
+ }
9383
+ }
9384
+ };
9385
+ }
9386
+ return null;
9387
+ };
9388
+
9389
+ // packages/cli/client/providerResolution/devinTransport.ts
9390
+ var resolveDevinTransport = async (ctx) => {
9391
+ const {
9392
+ agentConfig,
9393
+ apiKeyRefResolver,
9394
+ deps,
9395
+ buildProviderOpenAiTools,
9396
+ additionalToolNames,
9397
+ recordLocalAvailability
9398
+ } = ctx;
9399
+ if (isDevinOAuthAgent(agentConfig)) {
9400
+ const accessToken = await apiKeyRefResolver("devin");
9401
+ if (!accessToken) {
9402
+ throw new Error(
9403
+ 'OAuth credential for "devin" not found locally. Run `nolo auth devin`.'
9404
+ );
9405
+ }
9406
+ const model = agentConfig.model || "swe-2-max";
9407
+ const { requestedToolNames, tools } = resolveProviderOpenAiToolBundle(
9408
+ agentConfig,
9409
+ deps.env,
9410
+ buildProviderOpenAiTools,
9411
+ additionalToolNames
9412
+ );
9413
+ const devinProvider = createDevinProvider({
9414
+ token: accessToken,
9415
+ model,
9416
+ fetchImpl: ctx.fetchImpl,
9417
+ tools,
9418
+ // agentConfig.temperature reaches every transport except the Devin one;
9419
+ // forward it so the agent form's sampling knob stops being a no-op here.
9420
+ // Left undefined it keeps the upstream client's value.
9421
+ temperature: typeof agentConfig.temperature === "number" ? agentConfig.temperature : void 0
9422
+ });
9423
+ logLocalRuntimeDiagnostic("provider.selected", {
9424
+ agentKey: agentConfig.key,
9425
+ transport: "devin-connect",
9426
+ provider: "devin",
9427
+ model,
9428
+ hasApiKey: true,
9429
+ toolCount: tools.length,
9430
+ requestedToolNames,
9431
+ temperature: typeof agentConfig.temperature === "number" ? agentConfig.temperature : null
9432
+ });
9433
+ return {
9434
+ model,
9435
+ complete: async (messages, options) => {
9436
+ try {
9437
+ const result = await devinProvider.complete(messages, options);
9438
+ await recordLocalAvailability(200);
9439
+ return result;
9440
+ } catch (error) {
9441
+ const failure = readDevinUpstreamFailure(error);
9442
+ if (failure) {
9443
+ await recordLocalAvailability(failure.status, failure.body);
9444
+ }
9445
+ throw error;
9446
+ }
9308
9447
  }
9309
9448
  };
9310
9449
  }
@@ -9411,7 +9550,7 @@ var resolveDirectOpenAiCompatibleTransport = async (ctx) => {
9411
9550
 
9412
9551
  // packages/cli/client/providerResolution/geminiNativeToolTransport.ts
9413
9552
  var resolveGeminiNativeToolTransport = async (ctx) => {
9414
- const { agentConfig, deps, fetchImpl, additionalToolNames, buildProviderOpenAiTools, apiKeyRefResolver, credentialBroker, syncFetcher } = ctx;
9553
+ const { agentConfig, deps, fetchImpl, additionalToolNames, buildProviderOpenAiTools, apiKeyRefResolver, credentialBroker, syncFetcher, recordLocalAvailability } = ctx;
9415
9554
  if (shouldUsePlatformChatProvider(deps.env, agentConfig) && isGemini3Model(agentConfig.model ?? "") && agentConfig.provider === "google") {
9416
9555
  const providerConfig = await resolvePlatformChatProviderConfig({
9417
9556
  agentConfig,
@@ -9478,6 +9617,7 @@ var resolveGeminiNativeToolTransport = async (ctx) => {
9478
9617
  status: res.status,
9479
9618
  error: errText.slice(0, 200)
9480
9619
  });
9620
+ await recordLocalAvailability(res.status, errText);
9481
9621
  throw new Error(
9482
9622
  `gemini native tool provider failed: HTTP ${res.status} ${errText.slice(0, 500)}`
9483
9623
  );
@@ -9503,6 +9643,7 @@ var resolveGeminiNativeToolTransport = async (ctx) => {
9503
9643
  contentChars: text.length,
9504
9644
  toolCallCount: toolCalls.length
9505
9645
  });
9646
+ await recordLocalAvailability(200);
9506
9647
  return result;
9507
9648
  }
9508
9649
  };
@@ -9704,6 +9845,7 @@ var TRANSPORTS = [
9704
9845
  resolveAnthropicOAuthTransport,
9705
9846
  resolveCodexOAuthTransport,
9706
9847
  resolveCursorTransport,
9848
+ resolveDevinTransport,
9707
9849
  resolveGeminiNativeToolTransport,
9708
9850
  resolvePlatformProxyTransport,
9709
9851
  // 兜底必须留在最后。
@@ -10053,6 +10195,446 @@ async function syncLocalDialogEvidenceToRemote(args) {
10053
10195
  return { attempted: true };
10054
10196
  }
10055
10197
 
10198
+ // packages/core/publicAgentSeeds.ts
10199
+ var AGENT_SEED_DEFAULTS = {
10200
+ isPublic: true,
10201
+ allowFork: true,
10202
+ hasVision: false,
10203
+ tools: []
10204
+ };
10205
+ function deterministicId(prefix, seed) {
10206
+ let h = 2166136261;
10207
+ for (let i = 0; i < seed.length; i++) {
10208
+ h ^= seed.charCodeAt(i);
10209
+ h = h * 16777619 >>> 0;
10210
+ }
10211
+ const suffix = h.toString(36).toUpperCase().padStart(14, "0");
10212
+ return (prefix + suffix).slice(0, 26);
10213
+ }
10214
+ function defineAgentSeed(input) {
10215
+ const providerForLookup = isPlatformHostedImageModel(input.model) ? "nolo" : input.provider || "nolo";
10216
+ const tools = input.tools ? [...input.tools] : [...AGENT_SEED_DEFAULTS.tools];
10217
+ const isPublic = input.isPublic ?? AGENT_SEED_DEFAULTS.isPublic;
10218
+ const allowFork = input.allowFork ?? AGENT_SEED_DEFAULTS.allowFork;
10219
+ const tags = input.tags ? [...input.tags] : [];
10220
+ const isPlatformHosted = isNoloHostedProvider(input.provider);
10221
+ const isPlatformPriced = !isPlatformHostedImageModel(input.model) && (isPlatformHosted || input.apiSource === "platform" || input.isPublic === true && !input.apiSource);
10222
+ let inputPrice = isPlatformPriced ? void 0 : input.inputPrice;
10223
+ let outputPrice = isPlatformPriced ? void 0 : input.outputPrice;
10224
+ let hasVision = input.hasVision;
10225
+ const pricesProvided = input.inputPrice !== void 0 || input.outputPrice !== void 0;
10226
+ if (!isPlatformPriced && (inputPrice === void 0 || outputPrice === void 0)) {
10227
+ const pricing = getModelPricing(providerForLookup, input.model);
10228
+ if (!pricing) {
10229
+ throw new Error(`\u672A\u627E\u5230\u6A21\u578B\u4EF7\u683C\u5143\u6570\u636E: ${providerForLookup}/${input.model}`);
10230
+ }
10231
+ if (inputPrice === void 0) inputPrice = pricing.inputPrice;
10232
+ if (outputPrice === void 0) outputPrice = pricing.outputPrice;
10233
+ }
10234
+ if (hasVision === void 0) {
10235
+ if (pricesProvided) {
10236
+ hasVision = AGENT_SEED_DEFAULTS.hasVision;
10237
+ } else {
10238
+ const modelConfig = getModelConfig(providerForLookup, input.model);
10239
+ hasVision = !!modelConfig.hasVision;
10240
+ }
10241
+ }
10242
+ const userVisibleTexts = [
10243
+ ["name", input.name],
10244
+ ["introduction", input.introduction],
10245
+ [
10246
+ "greeting",
10247
+ typeof input.greeting === "string" ? input.greeting : input.greeting?.text
10248
+ ],
10249
+ ["prompt", input.prompt],
10250
+ ...(input.tags ?? []).map((tag) => ["tags", tag])
10251
+ ];
10252
+ for (const [fieldName, text] of userVisibleTexts) {
10253
+ if (!text) continue;
10254
+ const hit = text.match(/平台托管|runinfra|openrouter|ollama/i);
10255
+ if (hit) {
10256
+ throw new Error(
10257
+ `\u516C\u5F00 agent seed\u300C${input.name}\u300D\u7684\u7528\u6237\u53EF\u89C1\u5B57\u6BB5 ${fieldName} \u542B\u4E0A\u6E38\u8DEF\u7531/\u6258\u7BA1\u6E20\u9053\u8BCD\u300C${hit[0]}\u300D\uFF0C\u7981\u6B62\u5199\u5165\uFF08\u6362\u4F9B\u5E94\u5546\u4E0D\u5E94\u7275\u52A8\u7528\u6237\u6587\u6848\uFF1B\u6A21\u578B\u5382\u5546\u540D\u4E0D\u5728\u6B64\u9650\uFF09`
10258
+ );
10259
+ }
10260
+ }
10261
+ const { inputPrice: _strippedInputPrice, outputPrice: _strippedOutputPrice, ...inputRest } = input;
10262
+ const record = {
10263
+ ...inputRest,
10264
+ tools,
10265
+ isPublic,
10266
+ allowFork,
10267
+ tags,
10268
+ hasVision
10269
+ };
10270
+ if (!isPlatformPriced) {
10271
+ record.inputPrice = inputPrice;
10272
+ record.outputPrice = outputPrice;
10273
+ }
10274
+ return record;
10275
+ }
10276
+ var GPT_6_LUNA_DEF = defineAgentSeed({
10277
+ // salt 冻结为历史值 "shared-space-openai-gpt-5-6-luna":deterministicId 由
10278
+ // prefix+salt 哈希得出,改 salt 会换 ID——2026-09-23 Luna 原地换代
10279
+ // (GPT-5.6 Luna → GPT-6 Luna)必须保留稳定 ID,用户收藏/别名/Space
10280
+ // 内容键才不失效。
10281
+ id: deterministicId("01GPT56LUNPB", "shared-space-openai-gpt-5-6-luna"),
10282
+ presetKey: "gpt-6-luna",
10283
+ name: "GPT-6 Luna",
10284
+ // provider 用平台托管命名空间 "nolo"(平台 agent 统一收敛方向):平台价只注册在
10285
+ // nolo 下,agent-run 的托管路由门也只认 nolo。写上游名 "openai" 会让计费落零价
10286
+ // 虚拟模型并绕过 hosted routing(2026-09-24 review CRITICAL)。
10287
+ provider: "nolo",
10288
+ model: "gpt-6-luna",
10289
+ isPublic: true,
10290
+ platformAudit: true,
10291
+ introduction: "OpenAI GPT-6 Luna \u516C\u5F00\u52A9\u624B\uFF08\u8F7B\u91CF\u6863\uFF09\uFF0C\u9002\u5408\u9AD8\u541E\u5410\u3001\u4F4E\u6210\u672C\u3001\u901F\u5EA6\u654F\u611F\u4EFB\u52A1\u3002",
10292
+ greeting: "\u4F60\u597D\uFF0C\u6211\u662F GPT-6 Luna\u3002\u8F7B\u91CF\u6863\u4F4D\uFF0C\u9002\u5408\u5FEB\u901F\u3001\u4F4E\u6210\u672C\u4EFB\u52A1\u3002",
10293
+ prompt: "\u4F18\u5148\u5FEB\u901F\u5B8C\u6210\u4EFB\u52A1\uFF1B\u4FDD\u6301\u56DE\u7B54\u76F4\u63A5\u3001\u7ED3\u8BBA\u660E\u786E\u3002",
10294
+ tools: [],
10295
+ tags: ["openai"]
10296
+ });
10297
+ var DEEPSEEK_V4_FLASH_DEF = defineAgentSeed({
10298
+ id: PUBLIC_DEEPSEEK_V4_FLASH_AGENT_ID,
10299
+ presetKey: "deepseek-v4-flash",
10300
+ name: "DeepSeek Flash",
10301
+ provider: "nolo",
10302
+ model: "deepseek-flash",
10303
+ isPublic: true,
10304
+ introduction: "DeepSeek Flash \u516C\u5F00\u52A9\u624B\uFF0C\u9002\u5408\u9AD8\u6027\u4EF7\u6BD4\u901A\u7528\u95EE\u7B54\u3001\u4EE3\u7801\u4E0E\u957F\u4E0A\u4E0B\u6587\u4EFB\u52A1\u3002",
10305
+ greeting: "\u4F60\u597D\uFF0C\u6211\u662F DeepSeek Flash\u3002\u9002\u5408\u5FEB\u901F\u5904\u7406\u901A\u7528\u95EE\u9898\u3001\u4EE3\u7801\u548C\u957F\u4E0A\u4E0B\u6587\u4EFB\u52A1\u3002",
10306
+ prompt: "\u4F18\u5148\u5FEB\u901F\u3001\u76F4\u63A5\u3001\u7A33\u5B9A\u5730\u5B8C\u6210\u4EFB\u52A1\uFF1B\u9700\u8981\u63A8\u7406\u65F6\u4FDD\u6301\u6B65\u9AA4\u6E05\u6670\u3002",
10307
+ tools: [],
10308
+ tags: ["nolo", "deepseek"]
10309
+ });
10310
+ var DEEPSEEK_V4_PRO_DEF = defineAgentSeed({
10311
+ id: PUBLIC_DEEPSEEK_V4_PRO_AGENT_ID,
10312
+ presetKey: "deepseek-v4-pro",
10313
+ name: "DeepSeek V4 Pro",
10314
+ provider: "nolo",
10315
+ model: "deepseek-v4-pro",
10316
+ hasVision: false,
10317
+ isPublic: true,
10318
+ introduction: "DeepSeek V4 Pro \u516C\u5F00\u52A9\u624B\uFF0C\u9002\u5408\u590D\u6742\u63A8\u7406\u3001\u4EE3\u7801\u3001agentic \u5DE5\u4F5C\u6D41\u4E0E\u957F\u4E0A\u4E0B\u6587\u4EFB\u52A1\u3002",
10319
+ greeting: "\u4F60\u597D\uFF0C\u6211\u662F DeepSeek V4 Pro\u3002\u9002\u5408\u590D\u6742\u63A8\u7406\u3001\u4EE3\u7801\u5206\u6790\u548C\u957F\u4E0A\u4E0B\u6587\u4EFB\u52A1\u3002",
10320
+ prompt: "\u9762\u5BF9\u590D\u6742\u4EFB\u52A1\u4F18\u5148\u62C6\u6E05\u76EE\u6807\u3001\u8BC1\u636E\u548C\u6267\u884C\u8DEF\u5F84\uFF0C\u518D\u7ED9\u51FA\u53EF\u9760\u7ED3\u8BBA\u3002",
10321
+ tools: [],
10322
+ tags: ["nolo", "deepseek"]
10323
+ });
10324
+ var GLM_5_3_DEF = defineAgentSeed({
10325
+ id: "01GLM52DIPB00000000I3E2MY",
10326
+ presetKey: "glm-5.3",
10327
+ name: "GLM 5.3",
10328
+ provider: "nolo",
10329
+ model: "glm-5.3",
10330
+ isPublic: true,
10331
+ hasVision: true,
10332
+ introduction: "GLM 5.3 \u516C\u5F00\u52A9\u624B\uFF0C\u9002\u5408\u590D\u6742\u63A8\u7406\u3001\u957F\u4E0A\u4E0B\u6587\u3001\u4E2D\u6587\u7406\u89E3\u4E0E\u4EE3\u7801\u5206\u6790\u3002",
10333
+ greeting: "\u4F60\u597D\uFF0C\u6211\u662F GLM 5.3\u3002\u9002\u5408\u5904\u7406\u590D\u6742\u5206\u6790\u3001\u9AD8\u8D28\u91CF\u4E2D\u6587\u95EE\u7B54\u4E0E\u4EE3\u7801\u63A8\u7406\u4EFB\u52A1\u3002",
10334
+ prompt: "\u4F18\u5148\u7ED9\u51FA\u76F4\u63A5\u3001\u51C6\u786E\u3001\u53EF\u6267\u884C\u7684\u56DE\u7B54\uFF1B\u590D\u6742\u95EE\u9898\u5148\u7406\u6E05\u76EE\u6807\u548C\u7EA6\u675F\u518D\u63A8\u7406\uFF0C\u4FDD\u6301\u7ED3\u6784\u6E05\u6670\u3001\u4F9D\u636E\u660E\u786E\u3002",
10335
+ tools: [],
10336
+ tags: ["nolo", "glm"]
10337
+ });
10338
+ var GLM_5_3_FLASH_DEF = defineAgentSeed({
10339
+ id: PUBLIC_GLM_53_FLASH_AGENT_ID,
10340
+ presetKey: "glm-5-3-flash",
10341
+ name: "GLM 5.3 Flash",
10342
+ provider: "nolo",
10343
+ model: "glm-5-3-flash",
10344
+ isPublic: true,
10345
+ hasVision: true,
10346
+ introduction: "GLM 5.3 Flash \u516C\u5F00\u52A9\u624B\uFF0C\u5EC9\u4EF7\u5FEB\u6863\uFF0C\u9002\u5408\u9AD8\u9891\u8F7B\u91CF\u95EE\u7B54\u4E0E\u6279\u91CF\u4EFB\u52A1\u3002\u6CE8\u610F\uFF1A\u8BE5\u6A21\u578B\u9ED8\u8BA4\u6DF1\u5EA6\u601D\u8003\uFF0C\u601D\u8003\u8FC7\u7A0B token \u8BA1\u5165\u8F93\u51FA\u8BA1\u8D39\uFF08\u8F93\u51FA 3.2 \u79EF\u5206/\u767E\u4E07 token\uFF09\uFF0C\u5B9E\u9645\u6D88\u8017\u9AD8\u4E8E\u540C\u957F\u5EA6\u53EF\u89C1\u56DE\u590D\uFF1B\u628A agent \u7684 reasoning_effort \u8BBE\u4E3A low \u53EF\u5173\u95ED\u601D\u8003\u2014\u2014\u5355\u8F6E\u95EE\u7B54\u5B9E\u6D4B\u8F93\u51FA token \u964D\u5230\u7EA6 1/5\uFF0C\u591A\u8F6E\u5DE5\u5177\u5FAA\u73AF\u91CC\u7EA6\u964D 4 \u6210\uFF08\u5DE5\u5177\u8F6E\u672C\u8EAB\u601D\u8003\u5C31\u5C11\uFF09\uFF0C\u53EF\u89C1\u56DE\u590D\u957F\u5EA6\u4E0E\u5DE5\u5177\u8C03\u7528\u6B63\u786E\u6027\u5747\u4E0D\u53D8\uFF1Bmedium \u6863 token \u7565\u964D\u4F46\u5EF6\u8FDF\u4E0D\u6539\u5584\u3002",
10347
+ greeting: "\u4F60\u597D\uFF0C\u6211\u662F GLM 5.3 Flash\u3002\u8F7B\u91CF\u5FEB\u901F\u3001\u4EF7\u683C\u4F4E\uFF0C\u9002\u5408\u65E5\u5E38\u95EE\u7B54\u4E0E\u6279\u91CF\u8F7B\u91CF\u4EFB\u52A1\u3002",
10348
+ prompt: "\u76F4\u63A5\u3001\u7B80\u6D01\u5730\u5B8C\u6210\u4EFB\u52A1\uFF1B\u56DE\u7B54\u4FDD\u6301\u7B80\u77ED\uFF0C\u5148\u7ED9\u7ED3\u8BBA\u3002",
10349
+ // 关掉思考:该模型默认档的 reasoning token 计入输出计费,而实测 low 档
10350
+ // reasoning 输出为 0(10/10 样本),单轮问答输出 token 降到约 1/5、多轮工具
10351
+ // 循环降约 4 成,可见回复长度、工具调用正确性与循环完成度均不变。
10352
+ // medium 档只省约 29% token 且延迟不改善,故直接用 low。
10353
+ reasoning_effort: "low",
10354
+ tools: [],
10355
+ tags: ["nolo", "glm", "flash"]
10356
+ });
10357
+ var CLAUDE_FABLE_5_1_DEF = defineAgentSeed({
10358
+ id: deterministicId("01CLDFBL51PB", "shared-space-anthropic-claude-fable-5-1"),
10359
+ presetKey: "claude-fable-5-1",
10360
+ name: "Claude Fable 5.1",
10361
+ provider: "nolo",
10362
+ model: "anthropic/claude-fable-5-1",
10363
+ isPublic: true,
10364
+ hasVision: true,
10365
+ introduction: "Claude Fable 5.1 \u516C\u5F00\u52A9\u624B\uFF0C\u9002\u5408\u590D\u6742\u95EE\u7B54\u3001\u957F\u6587\u5206\u6790\u3001\u4EE3\u7801\u548C\u56FE\u7247\u7406\u89E3\u3002",
10366
+ greeting: "\u4F60\u597D\uFF0C\u6211\u662F Claude Fable 5.1\u3002\u9002\u5408\u590D\u6742\u95EE\u9898\u3001\u957F\u6587\u5206\u6790\u3001\u4EE3\u7801\u548C\u56FE\u7247\u7406\u89E3\u3002",
10367
+ prompt: "\u9762\u5BF9\u590D\u6742\u4EFB\u52A1\u5148\u5398\u6E05\u76EE\u6807\u548C\u7EA6\u675F\uFF0C\u518D\u7ED9\u51FA\u53EF\u9760\u3001\u53EF\u6267\u884C\u3001\u53EF\u590D\u6838\u7684\u7ED3\u679C\u3002",
10368
+ tools: [],
10369
+ tags: ["anthropic", "claude", "fable"]
10370
+ });
10371
+ var CLAUDE_OPUS_5_5_DEF = defineAgentSeed({
10372
+ id: deterministicId("01CLDOPU55PB", "shared-space-anthropic-claude-opus-5-5"),
10373
+ presetKey: "claude-opus-5-5",
10374
+ name: "Claude Opus 5.5",
10375
+ provider: "nolo",
10376
+ model: "anthropic/claude-opus-5-5",
10377
+ isPublic: true,
10378
+ hasVision: true,
10379
+ introduction: "Claude Opus 5.5 \u516C\u5F00\u52A9\u624B\uFF0C\u9002\u5408\u9AD8\u96BE\u63A8\u7406\u3001\u957F\u94FE\u8DEF\u5206\u6790\u548C\u56FE\u7247\u7406\u89E3\u3002",
10380
+ greeting: "\u4F60\u597D\uFF0C\u6211\u662F Claude Opus 5.5\u3002\u9002\u5408\u9AD8\u96BE\u63A8\u7406\u3001\u590D\u6742\u5206\u6790\u548C\u56FE\u7247\u7406\u89E3\u3002",
10381
+ prompt: "\u5148\u786E\u8BA4\u95EE\u9898\u76EE\u6807\u3001\u8BC1\u636E\u548C\u98CE\u9669\uFF0C\u518D\u7ED9\u51FA\u7ED3\u6784\u6E05\u695A\u3001\u7ED3\u8BBA\u660E\u786E\u7684\u56DE\u7B54\u3002",
10382
+ tools: [],
10383
+ tags: ["anthropic", "claude", "opus"]
10384
+ });
10385
+ var GROK_4_6_DEF = defineAgentSeed({
10386
+ id: deterministicId("01GROK46PLAZ", "shared-space-xai-grok-4-6"),
10387
+ presetKey: "grok-4.6",
10388
+ name: "Grok 4.6",
10389
+ provider: "xai",
10390
+ model: "grok-4.6",
10391
+ isPublic: true,
10392
+ hasVision: true,
10393
+ introduction: "xAI Grok 4.6 \u516C\u5F00\u52A9\u624B\uFF0C\u9002\u5408\u5B9E\u65F6\u4FE1\u606F\u5206\u6790\u3001\u590D\u6742\u63A8\u7406\u3001\u4EE3\u7801\u548C\u591A\u6A21\u6001\u4EFB\u52A1\u3002",
10394
+ greeting: "\u4F60\u597D\uFF0C\u6211\u662F Grok 4.6\u3002\u53EF\u4EE5\u5E2E\u4F60\u5206\u6790\u95EE\u9898\u3001\u7F16\u5199\u4EE3\u7801\u3001\u7406\u89E3\u56FE\u7247\u5E76\u5904\u7406\u590D\u6742\u4EFB\u52A1\u3002",
10395
+ prompt: "\u4F18\u5148\u7ED9\u51FA\u76F4\u63A5\u3001\u51C6\u786E\u3001\u53EF\u6267\u884C\u7684\u56DE\u7B54\uFF1B\u9762\u5BF9\u590D\u6742\u95EE\u9898\u5148\u68B3\u7406\u76EE\u6807\u548C\u7EA6\u675F\uFF0C\u518D\u8FDB\u884C\u53EF\u9760\u63A8\u7406\u3002\u5BF9\u4E0D\u786E\u5B9A\u7684\u5185\u5BB9\u660E\u786E\u8BF4\u660E\u4F9D\u636E\u4E0E\u65F6\u6548\u6027\uFF0C\u4E0D\u7F16\u9020\u3002",
10396
+ tools: [],
10397
+ tags: ["xai", "grok"]
10398
+ });
10399
+ var GEMINI_3_8_FLASH_DEF = defineAgentSeed({
10400
+ // 种子串冻结以维持确定性 ID 稳定,勿随版本改名。
10401
+ id: deterministicId("01GEM37FLPB", "shared-space-google-gemini-3-7-flash"),
10402
+ presetKey: "gemini-3.8-flash",
10403
+ name: "Gemini 3.8 Flash",
10404
+ provider: "nolo",
10405
+ model: "gemini-3.8-flash",
10406
+ isPublic: true,
10407
+ introduction: "Gemini 3.8 Flash \u516C\u5F00\u52A9\u624B\uFF0C\u9002\u5408\u5FEB\u901F\u524D\u6CBF\u95EE\u7B54\u3001\u4EE3\u7801\u3001\u591A\u6A21\u6001\u548C\u957F\u4E0A\u4E0B\u6587\u4EFB\u52A1\u3002",
10408
+ greeting: "\u4F60\u597D\uFF0C\u6211\u662F Gemini 3.8 Flash\u3002\u9002\u5408\u5FEB\u901F\u5904\u7406\u957F\u4E0A\u4E0B\u6587\u3001\u591A\u6A21\u6001\u548C\u4EE3\u7801\u4EFB\u52A1\u3002",
10409
+ prompt: "\u4F18\u5148\u76F4\u63A5\u5B8C\u6210\u4EFB\u52A1\uFF1B\u9700\u8981\u63A8\u7406\u6216\u5199\u4EE3\u7801\u65F6\u4FDD\u6301\u6B65\u9AA4\u6E05\u6670\u3001\u7ED3\u8BBA\u53EF\u9760\u3002",
10410
+ tools: [],
10411
+ tags: ["google", "gemini"]
10412
+ });
10413
+ var GPT_IMAGE_2_GENERATOR_DEF = defineAgentSeed({
10414
+ id: PUBLIC_GPT_IMAGE_2_GENERATOR_AGENT_ID,
10415
+ presetKey: "gpt-image-2-generator",
10416
+ name: "GPT Image 2 \u56FE\u7247\u751F\u6210\u5668",
10417
+ provider: "nolo",
10418
+ model: "gpt-6-luna",
10419
+ imageModel: "gpt-image-2",
10420
+ isPublic: true,
10421
+ hasImageOutput: true,
10422
+ imageWorkflow: "generate",
10423
+ imageConfig: { enabled: true },
10424
+ introduction: "\u4E13\u95E8\u8D1F\u8D23 GPT Image 2 \u65B0\u56FE\u751F\u6210\uFF1A\u6587\u672C\u751F\u6210\u65B0\u56FE\u7247\uFF0C\u4E5F\u53EF\u628A\u4E0A\u4F20\u56FE\u7247\u5F53\u4F5C\u53C2\u8003\u56FE\u6765\u751F\u6210\u65B0\u7684\u753B\u9762\u3002",
10425
+ greeting: "\u4F60\u597D\uFF0C\u6211\u662F GPT Image 2 \u56FE\u7247\u751F\u6210\u5668\u3002\u76F4\u63A5\u544A\u8BC9\u6211\u4F60\u60F3\u753B\u4EC0\u4E48\uFF1B\u5982\u679C\u4F60\u4E0A\u4F20\u53C2\u8003\u56FE\uFF0C\u6211\u4F1A\u628A\u5B83\u4EEC\u5F53\u4F5C\u7075\u611F\u53C2\u8003\u6765\u751F\u6210\u4E00\u5F20\u65B0\u7684\u56FE\u7247\u3002",
10426
+ prompt: [
10427
+ "\u5B9A\u4F4D\uFF1A",
10428
+ "- \u4F60\u7684\u4E3B\u4EFB\u52A1\u662F\u6587\u672C\u751F\u6210\u65B0\u56FE\u7247\u3002",
10429
+ "- \u5982\u679C\u7528\u6237\u4E0A\u4F20\u4E86\u53C2\u8003\u56FE\uFF0C\u5B83\u4EEC\u53EA\u7528\u4E8E\u53C2\u8003\u56FE\u5F71\u54CD\u65B0\u56FE\u6784\u56FE\u3001\u98CE\u683C\u3001\u89D2\u8272\u5173\u7CFB\u548C\u89C6\u89C9\u65B9\u5411\u3002",
10430
+ "- \u4E0D\u8981\u628A\u8FD9\u7C7B\u8BF7\u6C42\u5904\u7406\u6210\u591A\u8F6E\u8FDE\u7EED\u7F16\u8F91\u4F1A\u8BDD\uFF1B\u9ED8\u8BA4\u6309\u5355\u6B21\u8BF7\u6C42\u5B8C\u6210\u4E00\u7248\u65B0\u56FE\u3002",
10431
+ "",
10432
+ "\u5DE5\u4F5C\u65B9\u5F0F\uFF1A",
10433
+ "- \u7528\u6237\u7ED9\u51FA\u6E05\u6670\u9700\u6C42\u540E\uFF0C\u76F4\u63A5\u751F\u6210\uFF0C\u4E0D\u5148\u5199\u957F\u7BC7\u89E3\u91CA\u3002",
10434
+ "- prompt \u8981\u660E\u786E\u4E3B\u4F53\u3001\u573A\u666F\u3001\u955C\u5934\u3001\u5149\u7EBF\u3001\u6750\u8D28\u3001\u98CE\u683C\u4E0E\u7981\u6B62\u9879\u3002",
10435
+ "- \u5982\u679C\u7528\u6237\u8981\u6C42\u591A\u7248\u672C\uFF0C\u53EF\u4EE5\u4E00\u6B21\u7ED9\u5C11\u91CF\u5019\u9009\uFF1B\u9ED8\u8BA4\u5148\u7ED9 1 \u5F20\u3002",
10436
+ "- \u5982\u679C\u7528\u6237\u5176\u5B9E\u662F\u5728\u8981\u6C42\u7CBE\u786E\u6539\u56FE\u3001\u5C40\u90E8\u66FF\u6362\u3001\u591A\u56FE\u62FC\u5408\u6216 mask \u4FEE\u6539\uFF0C\u63D0\u9192\u66F4\u9002\u5408\u6539\u7528\u201CGPT Image 2 \u56FE\u7247\u7F16\u8F91\u5668\u201D\u3002",
10437
+ "",
10438
+ "\u56DE\u590D\u65B9\u5F0F\uFF1A",
10439
+ "- \u9ED8\u8BA4\u4E2D\u6587\u8F93\u51FA\uFF0C\u7B80\u77ED\u8BF4\u660E\u7ED3\u679C\uFF0C\u5E76\u7ED9 2-4 \u4E2A\u4E0B\u4E00\u6B65\u53EF\u7EE7\u7EED\u5FAE\u8C03\u7684\u65B9\u5411\u3002"
10440
+ ].join("\n"),
10441
+ tools: ["openAIGptImageGenerate"],
10442
+ tags: ["image", "openai", "gpt-image-2", "generate"]
10443
+ });
10444
+ var GPT_IMAGE_2_EDITOR_DEF = defineAgentSeed({
10445
+ id: PUBLIC_GPT_IMAGE_2_EDITOR_AGENT_ID,
10446
+ presetKey: "gpt-image-2-editor",
10447
+ name: "GPT Image 2 \u56FE\u7247\u7F16\u8F91\u5668",
10448
+ provider: "nolo",
10449
+ model: "gpt-6-luna",
10450
+ imageModel: "gpt-image-2",
10451
+ isPublic: true,
10452
+ hasImageOutput: true,
10453
+ imageWorkflow: "edit",
10454
+ imageConfig: { enabled: true },
10455
+ introduction: "\u4E13\u95E8\u8D1F\u8D23 GPT Image 2 \u5355\u6B21\u8BF7\u6C42\u6539\u56FE\uFF1A\u652F\u6301\u5355\u56FE\u7F16\u8F91\u3001\u591A\u56FE\u53C2\u8003\u5408\u6210\uFF0C\u4EE5\u53CA\u5E26 mask \u7684\u7CBE\u786E\u4FEE\u6539\u3002",
10456
+ greeting: "\u4F60\u597D\uFF0C\u6211\u662F GPT Image 2 \u56FE\u7247\u7F16\u8F91\u5668\u3002\u628A\u8981\u4FEE\u6539\u7684\u56FE\u7247\u3001\u53C2\u8003\u56FE\u6216 mask \u53D1\u7ED9\u6211\uFF0C\u6211\u4F1A\u6309\u5355\u6B21\u8BF7\u6C42\u6539\u56FE\u7684\u65B9\u5F0F\u7ED9\u4F60\u4E00\u7248\u7ED3\u679C\u3002",
10457
+ prompt: [
10458
+ "\u5B9A\u4F4D\uFF1A",
10459
+ "- \u4F60\u7684\u4E3B\u4EFB\u52A1\u662F\u5355\u6B21\u8BF7\u6C42\u6539\u56FE\uFF0C\u4E0D\u662F\u957F\u5BF9\u8BDD\u966A\u4F34\u5F0F\u521B\u4F5C\u3002",
10460
+ "- \u4F60\u652F\u6301\u5355\u56FE\u7F16\u8F91\u3001\u591A\u56FE\u53C2\u8003\u3001\u62FC\u5408\u6784\u56FE\uFF0C\u4EE5\u53CA\u53EF\u9009\u7684 mask \u5C40\u90E8\u4FEE\u6539\u3002",
10461
+ "- \u5982\u679C\u7528\u6237\u8981\u7684\u662F\u6301\u7EED\u51E0\u8F6E\u201C\u7EE7\u7EED\u6539\u3001\u518D\u6765\u4E00\u7248\u3001\u5EF6\u7EED\u4E0A\u4E00\u8F6E\u201D\u7684\u521B\u4F5C\u8FC7\u7A0B\uFF0C\u63D0\u9192\u66F4\u9002\u5408\u201CGPT Image 2 \u8FDE\u7EED\u521B\u4F5C\u52A9\u624B\u201D\u3002",
10462
+ "",
10463
+ "\u5DE5\u4F5C\u65B9\u5F0F\uFF1A",
10464
+ "- \u6536\u5230\u56FE\u7247\u540E\uFF0C\u4F18\u5148\u6309\u5355\u6B21\u8BF7\u6C42\u6539\u56FE\u5B8C\u6210\u5F53\u524D\u76EE\u6807\u3002",
10465
+ "- \u591A\u56FE\u53C2\u8003\u65F6\uFF0C\u8981\u660E\u786E\u6BCF\u5F20\u56FE\u5206\u522B\u627F\u62C5\u4E3B\u4F53\u3001\u98CE\u683C\u3001\u80CC\u666F\u6216\u6784\u56FE\u53C2\u8003\u3002",
10466
+ "- \u5982\u679C\u7528\u6237\u63D0\u4F9B\u4E86 mask\uFF0C\u5C31\u628A mask \u89C6\u4E3A\u5FC5\u987B\u9075\u5B88\u7684\u7F16\u8F91\u8303\u56F4\u3002",
10467
+ "- \u5982\u679C\u7F3A\u5C11\u5173\u952E\u539F\u56FE\u3001\u53C2\u8003\u56FE\u6216 mask\uFF0C\u5148\u7528\u4E00\u53E5\u8BDD\u6307\u51FA\u7F3A\u53E3\uFF0C\u518D\u7B49\u7528\u6237\u8865\u9F50\u3002",
10468
+ "- \u8C03\u7528 openAIGptImageEdit \u65F6\uFF0C\u4F18\u5148\u590D\u7528\u7528\u6237\u5DF2\u4E0A\u4F20\u7684\u539F\u59CB http(s) \u56FE\u7247 URL\uFF1B\u4E0D\u8981\u81EA\u5DF1\u624B\u5199 data URL \u6216\u91CD\u7F16\u7801\u7F29\u7565\u56FE\u3002",
10469
+ "- \u8C03\u7528 openAIGptImageEdit \u65F6\uFF0C\u4E0D\u8981\u4F20 transparent background\uFF1Bbackground \u4E00\u5F8B\u7528 opaque\uFF0C\u9664\u975E\u5E95\u5C42\u80FD\u529B\u4EE5\u540E\u660E\u786E\u652F\u6301\u518D\u8C03\u6574\u3002",
10470
+ "- \u5982\u679C outputFormat \u662F png\uFF08\u6216\u6CA1\u6709\u663E\u5F0F\u6539\u6210 jpeg/webp\uFF09\uFF0C\u4E0D\u8981\u4F20 outputCompression\u3002",
10471
+ "",
10472
+ "\u56DE\u590D\u65B9\u5F0F\uFF1A",
10473
+ "- \u9ED8\u8BA4\u4E2D\u6587\u8F93\u51FA\uFF0C\u7B80\u77ED\u8BF4\u660E\u8FD9\u6B21\u6539\u52A8\uFF0C\u5E76\u7ED9 2-4 \u4E2A\u53EF\u7EE7\u7EED\u7EC6\u5316\u7684\u65B9\u5411\u3002"
10474
+ ].join("\n"),
10475
+ tools: ["openAIGptImageEdit"],
10476
+ tags: ["image", "openai", "gpt-image-2", "edit"]
10477
+ });
10478
+ var GPT_IMAGE_2_CONTINUOUS_DEF = defineAgentSeed({
10479
+ id: PUBLIC_GPT_IMAGE_2_CONTINUOUS_AGENT_ID,
10480
+ presetKey: "gpt-image-2-continuous",
10481
+ name: "GPT Image 2 \u8FDE\u7EED\u521B\u4F5C\u52A9\u624B",
10482
+ provider: "nolo",
10483
+ model: "gpt-6-luna",
10484
+ imageModel: "gpt-image-2",
10485
+ isPublic: true,
10486
+ hasImageOutput: true,
10487
+ imageWorkflow: "continuous",
10488
+ imageConfig: { enabled: true },
10489
+ introduction: "\u4E13\u95E8\u8D1F\u8D23 GPT Image 2 \u591A\u8F6E\u8FDE\u7EED\u521B\u4F5C\uFF1A\u9002\u5408\u5148\u51FA\u4E00\u7248\uFF0C\u518D\u56F4\u7ED5\u4E0A\u4E00\u8F6E\u56FE\u7247\u7EE7\u7EED\u4FEE\u6539\u3001\u7EE7\u7EED\u6269\u5C55\u548C\u7EE7\u7EED\u8FED\u4EE3\u3002",
10490
+ greeting: "\u4F60\u597D\uFF0C\u6211\u662F GPT Image 2 \u8FDE\u7EED\u521B\u4F5C\u52A9\u624B\u3002\u4F60\u53EF\u4EE5\u5148\u8BA9\u6211\u51FA\u4E00\u7248\u56FE\uFF0C\u518D\u56F4\u7ED5\u4E0A\u4E00\u8F6E\u7EE7\u7EED\u4FEE\u6539\u3001\u7EE7\u7EED\u6269\u5C55\u6216\u7EE7\u7EED\u5B9A\u7A3F\u3002",
10491
+ prompt: [
10492
+ "\u5B9A\u4F4D\uFF1A",
10493
+ "- \u4F60\u7684\u4E3B\u4EFB\u52A1\u662F\u591A\u8F6E\u8FDE\u7EED\u521B\u4F5C\u3002",
10494
+ "- \u7528\u6237\u7ECF\u5E38\u4F1A\u57FA\u4E8E\u4E0A\u4E00\u8F6E\u7ED3\u679C\u7EE7\u7EED\u4FEE\u6539\u3001\u7EE7\u7EED\u7EC6\u5316\u3001\u7EE7\u7EED\u6362\u98CE\u683C\u3001\u7EE7\u7EED\u8865\u5143\u7D20\u3002",
10495
+ "- \u4F60\u8981\u628A\u5F53\u524D\u5BF9\u8BDD\u91CC\u7684\u4E0A\u4E00\u8F6E\u56FE\u7247\u89C6\u4F5C\u9ED8\u8BA4\u5EF6\u7EED\u5BF9\u8C61\uFF0C\u800C\u4E0D\u662F\u6BCF\u8F6E\u90FD\u91CD\u65B0\u5F00\u59CB\u3002",
10496
+ "",
10497
+ "\u5DE5\u4F5C\u65B9\u5F0F\uFF1A",
10498
+ "- \u5982\u679C\u5F53\u524D\u8F6E\u7528\u6237\u6CA1\u6709\u4E0A\u4F20\u65B0\u56FE\uFF0C\u4E14\u4E0A\u4E0B\u6587\u91CC\u4E5F\u6CA1\u6709\u4E0A\u4E00\u8F6E\u53EF\u7528\u56FE\u7247\uFF0C\u4F46\u7528\u6237\u662F\u5728\u8981\u6C42\u5148\u51FA\u4E00\u7248\u56FE\uFF0C\u5148\u8C03\u7528 openAIGptImageGenerate \u751F\u6210\u521D\u59CB\u7248\u672C\u3002",
10499
+ "- \u5982\u679C\u5F53\u524D\u8F6E\u7528\u6237\u4E0A\u4F20\u4E86\u65B0\u56FE\uFF0C\u4F18\u5148\u57FA\u4E8E\u65B0\u56FE\u7EE7\u7EED\u521B\u4F5C\u3002",
10500
+ "- \u5982\u679C\u7528\u6237\u6CA1\u6709\u4E0A\u4F20\u65B0\u56FE\uFF0C\u4F46\u4E0A\u4E0B\u6587\u91CC\u5DF2\u6709\u4E0A\u4E00\u8F6E\u53EF\u7528\u56FE\u7247\uFF0C\u9ED8\u8BA4\u6CBF\u7528\u4E0A\u4E00\u8F6E\u7ED3\u679C\u7EE7\u7EED\u4FEE\u6539\u3002",
10501
+ "- \u8C03\u7528 openAIGptImageEdit \u65F6\uFF0C\u4F18\u5148\u590D\u7528\u5F53\u524D\u5BF9\u8BDD\u91CC\u6700\u8FD1\u4E00\u8F6E\u53EF\u7528\u7684\u539F\u59CB http(s) \u56FE\u7247 URL\uFF1B\u4E0D\u8981\u628A\u5DF2\u6709\u56FE\u7247\u91CD\u65B0\u624B\u5199\u6210 data URL \u6216\u4F4E\u4FDD\u771F\u7F29\u7565\u56FE\u3002",
10502
+ "- \u5982\u679C\u7528\u6237\u8BF7\u6C42\u7F16\u8F91\u5374\u6CA1\u6709\u4EFB\u4F55\u53EF\u7528\u56FE\u7247\uFF0C\u5C31\u660E\u786E\u63D0\u793A\u7528\u6237\u5148\u4E0A\u4F20\u4E00\u5F20\u56FE\u7247\u518D\u7EE7\u7EED\u3002",
10503
+ "- \u9ED8\u8BA4\u5148\u7ED9\u5FEB\u901F\u3001\u53EF\u8FED\u4EE3\u7684\u4E00\u7248\uFF1B\u7528\u6237\u660E\u786E\u8BF4\u8981\u6700\u7EC8\u7248\u3001\u9AD8\u6E05\u7248\u65F6\uFF0C\u518D\u63D0\u9AD8\u8D28\u91CF\u3002",
10504
+ "- \u8C03\u7528 openAIGptImageEdit \u65F6\uFF0C\u4E0D\u8981\u4F20 transparent background\uFF1Bbackground \u4E00\u5F8B\u7528 opaque\uFF0C\u9664\u975E\u5E95\u5C42\u80FD\u529B\u4EE5\u540E\u660E\u786E\u652F\u6301\u518D\u8C03\u6574\u3002",
10505
+ "- \u5982\u679C outputFormat \u662F png\uFF08\u6216\u6CA1\u6709\u663E\u5F0F\u6539\u6210 jpeg/webp\uFF09\uFF0C\u4E0D\u8981\u4F20 outputCompression\u3002",
10506
+ "",
10507
+ "\u56DE\u590D\u65B9\u5F0F\uFF1A",
10508
+ "- \u9ED8\u8BA4\u4E2D\u6587\u8F93\u51FA\uFF0C\u4FDD\u6301\u8FDE\u7EED\u534F\u4F5C\u53E3\u543B\uFF0C\u751F\u6210\u540E\u63D0\u793A\u7528\u6237\u53EF\u4EE5\u4ECE\u54EA\u4E9B\u65B9\u5411\u7EE7\u7EED\u7EC6\u5316\u3002"
10509
+ ].join("\n"),
10510
+ tools: ["openAIGptImageGenerate", "openAIGptImageEdit"],
10511
+ tags: ["image", "openai", "gpt-image-2", "continuous"]
10512
+ });
10513
+ var NANO_BANANA_2_LITE_GENERATOR_DEF = defineAgentSeed({
10514
+ id: PUBLIC_NANO_BANANA_2_LITE_AGENT_ID,
10515
+ presetKey: "nano-banana-2-lite-generator",
10516
+ name: "Nano Banana 2 Lite \u6587\u751F\u56FE",
10517
+ provider: "nolo",
10518
+ model: "gemini-3.1-flash-lite-image",
10519
+ isPublic: true,
10520
+ hasImageOutput: true,
10521
+ imageWorkflow: "generate",
10522
+ imageConfig: { enabled: true },
10523
+ introduction: "Nano Banana 2 Lite \u516C\u5F00\u6587\u751F\u56FE\u52A9\u624B\uFF1AGoogle \u6700\u5FEB\u3001\u6700\u4FBF\u5B9C\u7684\u56FE\u7247\u6A21\u578B\uFF0C\u9002\u5408\u5FEB\u901F\u8349\u7A3F\u3001\u6279\u91CF\u751F\u56FE\u548C\u4F4E\u6210\u672C\u89C6\u89C9\u63A2\u7D22\u3002",
10524
+ greeting: "\u4F60\u597D\uFF0C\u6211\u662F Nano Banana 2 Lite \u6587\u751F\u56FE\u52A9\u624B\u3002\u544A\u8BC9\u6211\u4F60\u60F3\u753B\u4EC0\u4E48\uFF0C\u6211\u4F1A\u7528 Google \u6700\u5FEB\u7684\u56FE\u7247\u6A21\u578B\u5FEB\u901F\u751F\u6210\u3002",
10525
+ prompt: [
10526
+ "\u5B9A\u4F4D\uFF1A",
10527
+ "- \u4F60\u7684\u4E3B\u4EFB\u52A1\u662F\u5FEB\u901F\u751F\u6210\u65B0\u56FE\u7247\u3002",
10528
+ "- \u5982\u679C\u7528\u6237\u9700\u8981\u66F4\u7CBE\u81F4\u7684\u7F16\u8F91\u3001\u591A\u56FE\u5408\u6210\u6216\u590D\u6742\u4FEE\u56FE\uFF0C\u5EFA\u8BAE\u4ED6\u4EEC\u53BB\u4F7F\u7528\u201CGPT Image 2 \u56FE\u7247\u7F16\u8F91\u5668\u201D\u6216\u201C\u8BC1\u4EF6\u7167\u5236\u4F5C\u201D\u7B49\u66F4\u5408\u9002\u7684\u5DE5\u5177\u3002",
10529
+ "",
10530
+ "\u5DE5\u4F5C\u65B9\u5F0F\uFF1A",
10531
+ "- \u7528\u6237\u7ED9\u51FA\u6E05\u6670\u9700\u6C42\u540E\uFF0C\u76F4\u63A5\u7528\u5F53\u524D\u6A21\u578B\u751F\u6210\u56FE\u7247\u3002",
10532
+ "- \u5BF9\u7528\u6237\u8BF4\u660E\u65F6\uFF0C\u628A\u5F53\u524D\u56FE\u7247\u6A21\u578B\u79F0\u4E3A\u56FE\u7247\u751F\u6210\u6A21\u578B\uFF0C\u4E0D\u8981\u628A\u6A21\u578B\u8BF4\u6210\u5DE5\u5177\u3002",
10533
+ "- prompt \u8981\u660E\u786E\u4E3B\u4F53\u3001\u573A\u666F\u3001\u98CE\u683C\u3001\u5149\u7EBF\u3001\u6C1B\u56F4\u3002",
10534
+ "- \u5982\u679C\u7528\u6237\u8981\u6C42\u591A\u7248\u672C\uFF0C\u53EF\u4EE5\u4E00\u6B21\u7ED9\u5C11\u91CF\u5019\u9009\uFF1B\u9ED8\u8BA4\u5148\u7ED9 1 \u5F20\u3002",
10535
+ "- \u5982\u679C\u7528\u6237\u4E0A\u4F20\u4E86\u53C2\u8003\u56FE\uFF0C\u8BA9\u6A21\u578B\u53C2\u8003\u6784\u56FE\u6216\u98CE\u683C\u3002",
10536
+ "- \u9ED8\u8BA4\u6BD4\u4F8B 5:4\uFF0C\u9ED8\u8BA4\u5C3A\u5BF8 2K\uFF1B\u7528\u6237\u660E\u786E\u8981\u6C42\u65F6\u6309\u6307\u5B9A\u503C\u4F20\u5165\u3002",
10537
+ "",
10538
+ "\u56DE\u590D\u65B9\u5F0F\uFF1A",
10539
+ "- \u9ED8\u8BA4\u4E2D\u6587\u8F93\u51FA\uFF0C\u7B80\u77ED\u8BF4\u660E\u7ED3\u679C\uFF0C\u5E76\u7ED9 2-4 \u4E2A\u53EF\u7EE7\u7EED\u8C03\u6574\u7684\u65B9\u5411\uFF08\u98CE\u683C\u3001\u6BD4\u4F8B\u3001\u6784\u56FE\u3001\u7EC6\u8282\u7B49\uFF09\u3002"
10540
+ ].join("\n"),
10541
+ tools: [],
10542
+ tags: ["image", "google", "gemini", "nano-banana", "fast", "generate"]
10543
+ });
10544
+ var PUBLIC_AGENT_DEFS = [
10545
+ GPT_6_LUNA_DEF,
10546
+ DEEPSEEK_V4_FLASH_DEF,
10547
+ DEEPSEEK_V4_PRO_DEF,
10548
+ GLM_5_3_DEF,
10549
+ GLM_5_3_FLASH_DEF,
10550
+ CLAUDE_FABLE_5_1_DEF,
10551
+ CLAUDE_OPUS_5_5_DEF,
10552
+ GROK_4_6_DEF,
10553
+ GEMINI_3_8_FLASH_DEF,
10554
+ GPT_IMAGE_2_GENERATOR_DEF,
10555
+ GPT_IMAGE_2_EDITOR_DEF,
10556
+ GPT_IMAGE_2_CONTINUOUS_DEF,
10557
+ NANO_BANANA_2_LITE_GENERATOR_DEF
10558
+ ];
10559
+ var PLATFORM_AUDITED_AGENT_SPECS = PUBLIC_AGENT_DEFS.filter((def) => def.platformAudit).map((def) => ({
10560
+ name: def.name,
10561
+ key: publicAgentKey(def.id)
10562
+ }));
10563
+
10564
+ // packages/agent-runtime/publicAgentCatalogOverride.ts
10565
+ var SEED_BY_ID = new Map(
10566
+ PUBLIC_AGENT_DEFS.map((seed) => [seed.id, seed])
10567
+ );
10568
+ function toPlatformOwnedCatalogId(value) {
10569
+ if (typeof value !== "string") return null;
10570
+ const trimmed = value.trim();
10571
+ if (!trimmed) return null;
10572
+ const parsed = parsePublicAgentId(trimmed);
10573
+ if (parsed) return parsed;
10574
+ const systemId = parseSystemAgentId(trimmed);
10575
+ if (systemId) return systemId;
10576
+ return null;
10577
+ }
10578
+ function readPlatformOwnedKey(record) {
10579
+ const fields = record;
10580
+ for (const value of [fields.dbKey, fields.id]) {
10581
+ if (typeof value !== "string") continue;
10582
+ if (toPlatformOwnedCatalogId(value) === null) continue;
10583
+ return value;
10584
+ }
10585
+ return null;
10586
+ }
10587
+ function resolvePublicAgentCatalogOverride(agentKey) {
10588
+ const id = toPlatformOwnedCatalogId(agentKey);
10589
+ if (!id) return null;
10590
+ const entry = builtinAgentCatalogEntryById(id);
10591
+ if (!entry) return null;
10592
+ if (entry.group !== "public" || isRetiredCatalogEntry(entry)) return null;
10593
+ const seed = SEED_BY_ID.get(entry.id);
10594
+ if (!seed) return null;
10595
+ return {
10596
+ name: entry.name,
10597
+ provider: entry.provider,
10598
+ model: entry.model,
10599
+ introduction: seed.introduction,
10600
+ greeting: seed.greeting,
10601
+ prompt: seed.prompt,
10602
+ tools: [...seed.tools],
10603
+ tags: [...seed.tags]
10604
+ };
10605
+ }
10606
+ function overlayGreeting(recordGreeting, seedGreeting) {
10607
+ const seedText = typeof seedGreeting === "string" ? seedGreeting : isRecord(seedGreeting) ? seedGreeting.text : void 0;
10608
+ if (typeof seedText !== "string" || !seedText) return recordGreeting;
10609
+ if (isRecord(recordGreeting)) {
10610
+ return { ...recordGreeting, text: seedText };
10611
+ }
10612
+ if (recordGreeting === void 0 || recordGreeting === null) {
10613
+ return seedGreeting;
10614
+ }
10615
+ if (typeof recordGreeting === "string") {
10616
+ return seedText;
10617
+ }
10618
+ return recordGreeting;
10619
+ }
10620
+ function applyPublicAgentCatalogOverride(record, agentKey) {
10621
+ const override = resolvePublicAgentCatalogOverride(agentKey) ?? resolvePublicAgentCatalogOverride(readPlatformOwnedKey(record));
10622
+ if (!override) return record;
10623
+ const current = record;
10624
+ const greeting = overlayGreeting(current.greeting, override.greeting);
10625
+ return {
10626
+ ...record,
10627
+ name: override.name,
10628
+ provider: override.provider,
10629
+ model: override.model,
10630
+ introduction: override.introduction,
10631
+ prompt: override.prompt,
10632
+ tools: [...override.tools],
10633
+ tags: [...override.tags],
10634
+ ...greeting !== void 0 ? { greeting } : {}
10635
+ };
10636
+ }
10637
+
10056
10638
  // packages/cli/client/cliLocalAgentRecordReader.ts
10057
10639
  function resolveBuiltinLocalCliAgentConfig(agentRef, userId) {
10058
10640
  const normalized = agentRef.trim();
@@ -10085,7 +10667,10 @@ async function readAgentFromStore(args) {
10085
10667
  if (!record || typeof record !== "object") continue;
10086
10668
  return applyBuiltinAgentRuntimeOverride(
10087
10669
  args.agentRef,
10088
- resolveAgentRuntimeConfigFromRecord(key, record)
10670
+ resolveAgentRuntimeConfigFromRecord(
10671
+ key,
10672
+ applyPublicAgentCatalogOverride(record)
10673
+ )
10089
10674
  );
10090
10675
  }
10091
10676
  return resolveBuiltinPlatformAgentConfig(args.agentRef);
@@ -10454,6 +11039,7 @@ function waitForRunTerminal(args) {
10454
11039
  };
10455
11040
  const loop = Effect_exports.gen(function* () {
10456
11041
  token = args.claim?.acquire() ?? null;
11042
+ const deadline = Date.now() + args.timeoutMs;
10457
11043
  while (true) {
10458
11044
  const state = yield* readEffect(args.read);
10459
11045
  lastState = state;
@@ -10464,6 +11050,9 @@ function waitForRunTerminal(args) {
10464
11050
  }
10465
11051
  return { kind: "terminal", state };
10466
11052
  }
11053
+ if (Date.now() >= deadline) {
11054
+ return { kind: "timeout", waitedMs: args.timeoutMs, lastState };
11055
+ }
10467
11056
  const slept = yield* sleep(args.pollIntervalMs);
10468
11057
  if (slept === "aborted") return { kind: "aborted" };
10469
11058
  }
@@ -10888,6 +11477,12 @@ function buildRunStatusPayload(reconciled, deps, opts = {}) {
10888
11477
  endedAt: reconciled.endedAt ?? null,
10889
11478
  exitCode: reconciled.exitCode ?? null,
10890
11479
  ...reconciled.failureReason ? { failureReason: reconciled.failureReason } : {},
11480
+ // 结构化失败分类 + 可重试性:编排者据此决策,不再肉读 logTail。
11481
+ ...reconciled.failureClass ? { failureClass: reconciled.failureClass } : {},
11482
+ ...typeof reconciled.retryable === "boolean" ? { retryable: reconciled.retryable } : {},
11483
+ // 日志落盘路径始终暴露:stalled/failed 且 dialogId 缺失(如 ephemeral)
11484
+ // 时 logTail 只能靠它读,不能只留在进程内存。
11485
+ ...reconciled.logPath ? { logPath: reconciled.logPath } : {},
10891
11486
  ...typeof reconciled.toolCallCount === "number" ? { toolCallCount: reconciled.toolCallCount } : {},
10892
11487
  ...reconciled.lastAssistantText ? { lastAssistantText: reconciled.lastAssistantText } : {},
10893
11488
  // Non-ephemeral runs expose dialogId so the caller can read the
@@ -10922,6 +11517,39 @@ function buildRunStatusPayload(reconciled, deps, opts = {}) {
10922
11517
  }
10923
11518
  };
10924
11519
  }
11520
+ async function assertCredentialFanoutAllowed(deps, args) {
11521
+ let candidateGroup;
11522
+ if (deps.resolveAgentCredentialGroup) {
11523
+ try {
11524
+ candidateGroup = await deps.resolveAgentCredentialGroup(args.agentKey);
11525
+ } catch {
11526
+ candidateGroup = void 0;
11527
+ }
11528
+ }
11529
+ if (!candidateGroup && typeof args.credentialGroup === "string" && args.credentialGroup.trim()) {
11530
+ candidateGroup = args.credentialGroup.trim();
11531
+ }
11532
+ const { batchId, parentDialogId } = args;
11533
+ if (!batchId && !parentDialogId) return candidateGroup;
11534
+ const active = queryRunRecords({ limit: 500 }, deps).runs.filter((record) => {
11535
+ if (isRunTerminalStatus(record.status)) return false;
11536
+ if (batchId && record.batchId === batchId) return true;
11537
+ if (parentDialogId && record.parentDialogId === parentDialogId) return true;
11538
+ return false;
11539
+ }).map((record) => ({
11540
+ runId: record.runId,
11541
+ agentKey: record.agentKey,
11542
+ credentialGroup: record.credentialGroup
11543
+ }));
11544
+ if (active.length === 0) return candidateGroup;
11545
+ const verdict = checkCredentialFanout({
11546
+ active,
11547
+ candidate: { agentKey: args.agentKey, credentialGroup: candidateGroup },
11548
+ allowUnknownCredential: args.allowUnknownCredential === true
11549
+ });
11550
+ if (!verdict.allowed) throw new Error(verdict.message);
11551
+ return candidateGroup;
11552
+ }
10925
11553
  function createCliStartAgentRunExecutor(deps = {}) {
10926
11554
  return async (call) => {
10927
11555
  const args = parseCallArgs(call);
@@ -10944,6 +11572,14 @@ function createCliStartAgentRunExecutor(deps = {}) {
10944
11572
  ];
10945
11573
  const agentName = typeof args.agentName === "string" && args.agentName.trim() ? args.agentName.trim() : typeof args.name === "string" && args.name.trim() ? args.name.trim() : void 0;
10946
11574
  const batchId = typeof args.batchId === "string" && args.batchId.trim() ? args.batchId.trim() : void 0;
11575
+ const parentDialogId = typeof args.parentDialogId === "string" && args.parentDialogId.trim() ? args.parentDialogId.trim() : void 0;
11576
+ const credentialGroup = await assertCredentialFanoutAllowed(deps, {
11577
+ agentKey,
11578
+ ...batchId ? { batchId } : {},
11579
+ ...parentDialogId ? { parentDialogId } : {},
11580
+ ...typeof args.credentialGroup === "string" && args.credentialGroup.trim() ? { credentialGroup: args.credentialGroup.trim() } : {},
11581
+ allowUnknownCredential: args.allowUnknownCredential === true
11582
+ });
10947
11583
  const dodCommands = Array.isArray(args.dodCommands) ? args.dodCommands.filter((c) => typeof c === "string" && c.trim().length > 0).map((c) => c.trim()) : typeof args.dod === "string" && args.dod.trim().length > 0 ? [args.dod.trim()] : Array.isArray(args.dod) ? args.dod.filter((c) => typeof c === "string" && c.trim().length > 0).map((c) => c.trim()) : void 0;
10948
11584
  const { runId, batchId: resolvedBatchId } = await spawnLocalBackgroundRun(
10949
11585
  {
@@ -10953,7 +11589,8 @@ function createCliStartAgentRunExecutor(deps = {}) {
10953
11589
  agentKey,
10954
11590
  ...agentName ? { agentName } : {},
10955
11591
  ...batchId ? { batchId } : {},
10956
- ...typeof args.parentDialogId === "string" && args.parentDialogId.trim() ? { parentDialogId: args.parentDialogId.trim() } : {},
11592
+ ...credentialGroup ? { credentialGroup } : {},
11593
+ ...parentDialogId ? { parentDialogId } : {},
10957
11594
  ...dodCommands && dodCommands.length > 0 ? { dodCommands } : {},
10958
11595
  cwd: deps.cwd ?? process.cwd(),
10959
11596
  message,
@@ -11039,6 +11676,8 @@ async function spawnContinuationRun(reconciled, userInput, deps) {
11039
11676
  ...agentName ? { agentName } : {},
11040
11677
  ...reconciled.batchId ? { batchId: reconciled.batchId } : {},
11041
11678
  ...reconciled.parentDialogId ? { parentDialogId: reconciled.parentDialogId } : {},
11679
+ // 续跑继承原 run 的凭证组(同一 agent),供并发扇出守卫判定。
11680
+ ...reconciled.credentialGroup ? { credentialGroup: reconciled.credentialGroup } : {},
11042
11681
  cwd: reconciled.cwd ?? deps.cwd ?? process.cwd(),
11043
11682
  message: userInput,
11044
11683
  ...reconciled.ephemeral ? { ephemeral: true } : {},
@@ -11637,7 +12276,8 @@ function buildLocalToolExecutors(args) {
11637
12276
  startAgentRun: createCliStartAgentRunExecutor({
11638
12277
  env: args.env,
11639
12278
  cliEntrypoint: args.cliEntrypoint,
11640
- cwd: args.workspaceRoot
12279
+ cwd: args.workspaceRoot,
12280
+ ...args.resolveAgentCredentialGroup ? { resolveAgentCredentialGroup: args.resolveAgentCredentialGroup } : {}
11641
12281
  }),
11642
12282
  controlAgentRun: createCliControlAgentRunExecutor({
11643
12283
  env: args.env
@@ -11679,7 +12319,7 @@ var REFRESH_BY_PROVIDER = {
11679
12319
  cursor: cursorRefresh
11680
12320
  };
11681
12321
  function isOAuthProvider(value) {
11682
- return value === "chatgpt" || value === "xai" || value === "antigravity" || value === "claude" || value === "cursor";
12322
+ return value === "chatgpt" || value === "xai" || value === "antigravity" || value === "claude" || value === "cursor" || value === "devin";
11683
12323
  }
11684
12324
  function createOAuthApiKeyRefResolver(options = {}) {
11685
12325
  return async (ref, opts) => {
@@ -11771,13 +12411,18 @@ async function generateLocalDialogTitle(input) {
11771
12411
  return { title: fallbackTitle, source: "fallback" };
11772
12412
  }
11773
12413
  if (input.resolveProviderConfig && input.buildRequest && input.parseResponse) {
11774
- try {
11775
- const providerConfig = await input.resolveProviderConfig({
11776
- agentConfig: { ...BUILTIN_TITLE_LLM_CONFIG, key: BUILTIN_TITLE_LLM_CONFIG.id },
11777
- env
11778
- });
11779
- if (providerConfig?.authToken) {
11780
- const request = input.buildRequest({
12414
+ const resolveProviderConfig = input.resolveProviderConfig;
12415
+ const buildRequest = input.buildRequest;
12416
+ const parseResponse = input.parseResponse;
12417
+ const attemptPlatformTitle = async (model) => {
12418
+ try {
12419
+ const agentConfig = model ? { ...BUILTIN_TITLE_LLM_CONFIG, model } : BUILTIN_TITLE_LLM_CONFIG;
12420
+ const providerConfig = await resolveProviderConfig({
12421
+ agentConfig: { ...agentConfig, key: agentConfig.id },
12422
+ env
12423
+ });
12424
+ if (!providerConfig?.authToken) return null;
12425
+ const request = buildRequest({
11781
12426
  providerConfig,
11782
12427
  messages: [
11783
12428
  {
@@ -11809,21 +12454,26 @@ async function generateLocalDialogTitle(input) {
11809
12454
  body: JSON.stringify(patchedBody),
11810
12455
  signal: AbortSignal.timeout(timeoutMs)
11811
12456
  });
11812
- if (res.ok) {
11813
- const raw = await res.text().catch(() => "");
11814
- const data = safeParseJson(raw);
11815
- if (data) {
11816
- const parsed = input.parseResponse({ providerConfig, data });
11817
- const generated = normalizeDialogTitle(
11818
- extractTitleFromLlmContent(parsed.content)
11819
- );
11820
- if (generated) {
11821
- return { title: generated, source: "llm" };
11822
- }
11823
- }
11824
- }
12457
+ if (!res.ok) return null;
12458
+ const raw = await res.text().catch(() => "");
12459
+ const data = safeParseJson(raw);
12460
+ if (!data) return null;
12461
+ const parsed = parseResponse({ providerConfig, data });
12462
+ const generated = normalizeDialogTitle(
12463
+ extractTitleFromLlmContent(parsed.content)
12464
+ );
12465
+ return generated || null;
12466
+ } catch {
12467
+ return null;
11825
12468
  }
11826
- } catch {
12469
+ };
12470
+ const primaryTitle = await attemptPlatformTitle();
12471
+ if (primaryTitle) return { title: primaryTitle, source: "llm" };
12472
+ const fallbackModelTitle = await attemptPlatformTitle(
12473
+ BUILTIN_DIALOG_LLM_CHAT_FALLBACK_MODEL
12474
+ );
12475
+ if (fallbackModelTitle) {
12476
+ return { title: fallbackModelTitle, source: "llm" };
11827
12477
  }
11828
12478
  }
11829
12479
  if (input.resolveDirectProviderConfig) {
@@ -12488,6 +13138,23 @@ function createCliLocalRuntimeAdapter(deps) {
12488
13138
  const localToolUsage = /* @__PURE__ */ new Map();
12489
13139
  const buildProviderOpenAiTools = deps.buildProviderOpenAiTools ?? buildOpenAiTools;
12490
13140
  const additionalToolNames = deps.pastedTextStore ? ["readPastedText"] : [];
13141
+ const resolveAgentCredentialGroup = async (agentRef) => {
13142
+ try {
13143
+ const record = await readAgentFromStore({
13144
+ agentRef,
13145
+ store: await getOrCreateSharedStore(deps),
13146
+ userId
13147
+ });
13148
+ if (!record || typeof record !== "object") return void 0;
13149
+ const rec = record;
13150
+ const existing = typeof rec.credentialGroup === "string" && rec.credentialGroup.trim() ? rec.credentialGroup.trim() : void 0;
13151
+ if (existing) return existing;
13152
+ const ref = typeof rec.apiKeyRef === "string" && rec.apiKeyRef.trim() ? rec.apiKeyRef : typeof rec.credentialRef === "string" && rec.credentialRef.trim() ? rec.credentialRef : void 0;
13153
+ return deriveCredentialGroup(ref)?.credentialGroup;
13154
+ } catch {
13155
+ return void 0;
13156
+ }
13157
+ };
12491
13158
  let activeAgentToolNames = [];
12492
13159
  const workspaceRoot = deps.cwd ?? process.cwd();
12493
13160
  let runtimeToolExecutionLimits = {};
@@ -12500,6 +13167,7 @@ function createCliLocalRuntimeAdapter(deps) {
12500
13167
  readXPost: deps.readXPost,
12501
13168
  readXhsProfile: deps.readXhsProfile,
12502
13169
  cliEntrypoint: CLI_ENTRYPOINT,
13170
+ resolveAgentCredentialGroup,
12503
13171
  ...deps.confirmDestructiveAction ? { confirmDestructiveAction: deps.confirmDestructiveAction } : {},
12504
13172
  ...deps.requestUserChoice ? { requestUserChoice: deps.requestUserChoice } : {},
12505
13173
  ...deps.pastedTextStore ? { pastedTextStore: deps.pastedTextStore } : {},
@@ -12577,13 +13245,21 @@ function createCliLocalRuntimeAdapter(deps) {
12577
13245
  readXPost: deps.readXPost,
12578
13246
  readXhsProfile: deps.readXhsProfile,
12579
13247
  cliEntrypoint: CLI_ENTRYPOINT,
13248
+ resolveAgentCredentialGroup,
12580
13249
  ...deps.confirmDestructiveAction ? { confirmDestructiveAction: deps.confirmDestructiveAction } : {},
12581
13250
  ...deps.requestUserChoice ? { requestUserChoice: deps.requestUserChoice } : {},
12582
13251
  ...deps.pastedTextStore ? { pastedTextStore: deps.pastedTextStore } : {},
12583
13252
  agentKey: agentConfig?.key,
12584
13253
  ...runtimeToolExecutionLimits
12585
13254
  });
12586
- const exposedAgentConfig = agentConfig ? { ...agentConfig, exposedToolNames: activeAgentToolNames } : agentConfig;
13255
+ const exposedAgentConfig = agentConfig ? {
13256
+ ...agentConfig,
13257
+ exposedToolNames: activeAgentToolNames,
13258
+ toolSurface: {
13259
+ ...agentConfig.toolSurface ?? {},
13260
+ finalToolNames: activeAgentToolNames
13261
+ }
13262
+ } : agentConfig;
12587
13263
  if (exposedAgentConfig && !deps.pastedTextStore) {
12588
13264
  preparedAgentRuntimeCache.set(cacheKey, {
12589
13265
  agentConfig: exposedAgentConfig,