nolo-cli 0.84.0-alpha.1 → 0.84.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 (168) hide show
  1. package/README.md +2 -2
  2. package/{_executeModel-IULR47HG.js → _executeModel-BPUR2QYH.js} +51 -50
  3. package/{action-D22U6CTH.js → action-P4TNFGAD.js} +11 -11
  4. package/{addContentAction-XAPUTGL4.js → addContentAction-MB2HHMDZ.js} +9 -9
  5. package/{addDialogAgentAction-M7VLLBZM.js → addDialogAgentAction-S2NRBCWW.js} +9 -9
  6. package/{agentDeleteCommand-2S4WCDQC.js → agentDeleteCommand-MNAA6MIG.js} +32 -30
  7. package/{agentEmailCommands-V3ADGHX7.js → agentEmailCommands-SK34WJKU.js} +70 -66
  8. package/{agentGrantCommands-R3VQEZJR.js → agentGrantCommands-M3XFO6EN.js} +2 -2
  9. package/{agentListCommands-EPK3S274.js → agentListCommands-I26MKI4T.js} +55 -36
  10. package/{agentMachineCommands-XMZWK7P3.js → agentMachineCommands-M6QDR6P3.js} +32 -30
  11. package/{agentProviderCommands-65ZC2WB4.js → agentProviderCommands-X3UNW77C.js} +87 -0
  12. package/{agentPullCommand-N7L2CT7L.js → agentPullCommand-O5MPVJ5E.js} +3 -3
  13. package/agentRecordCommands-HTHLO2MM.js +129 -0
  14. package/{agentRunCommand-VUWNWC7C.js → agentRunCommand-IAIRCMTH.js} +70 -65
  15. package/{agentRunControl-T44MESII.js → agentRunControl-AVJR4JW4.js} +2 -2
  16. package/{agentRuntimeLocal-YRONTDLM.js → agentRuntimeLocal-3WTYYIT2.js} +32 -26
  17. package/{agentSlice-2P7OJFES.js → agentSlice-TVP3HINW.js} +10 -10
  18. package/{appDeleteCommands-YS7UGMP3.js → appDeleteCommands-SB5TNLKY.js} +32 -30
  19. package/{appDeployCommands-XIE5Z4BE.js → appDeployCommands-2IPKZINV.js} +32 -30
  20. package/{appDeployStatusCommands-54UDVYET.js → appDeployStatusCommands-K63TFUID.js} +32 -30
  21. package/{appGetCommands-6XYLBCRN.js → appGetCommands-VU2SLNEH.js} +32 -30
  22. package/{appListCommands-VEGH7SF5.js → appListCommands-S3T4DJ36.js} +32 -30
  23. package/{authCommand-JIEOFHXW.js → authCommand-HGP2XTKC.js} +185 -28
  24. package/{authCommands-ILTBI6JV.js → authCommands-RGOGCPP6.js} +4 -5
  25. package/builtinSkillRegistry-Q2VVY3SC.js +33 -0
  26. package/{chatQueueReduxAdapter-GPYCH5Z2.js → chatQueueReduxAdapter-TWIYKVIZ.js} +25 -25
  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-BOYUESO7.js → chunk-3AMA42ZI.js} +1 -1
  31. package/{chunk-RZOJRTKR.js → chunk-3BGIKIPF.js} +444 -920
  32. package/{chunk-HQUORJTM.js → chunk-3BMYXEUW.js} +1 -1
  33. package/{chunk-EBKMQULC.js → chunk-3IUWIAHP.js} +13 -15
  34. package/{chunk-NTW5GWDM.js → chunk-3VNWWVKB.js} +2 -0
  35. package/{chunk-4SZ37KLL.js → chunk-3VUWPRFW.js} +50 -30
  36. package/{chunk-WL2RKIBF.js → chunk-3YIAR5UI.js} +1 -1
  37. package/{chunk-DWUCB2A3.js → chunk-42V6BK2E.js} +1 -1
  38. package/{chunk-AX7RMXSH.js → chunk-4MK3I7Y4.js} +38 -4
  39. package/{chunk-PF6O3GR3.js → chunk-52Q2IW2X.js} +1340 -1273
  40. package/{chunk-Y3NZYLPG.js → chunk-5MEYHVIB.js} +1 -1
  41. package/{chunk-5XTOKQLW.js → chunk-5UTFL4QJ.js} +6 -2
  42. package/chunk-5ZUL4CUO.js +10 -0
  43. package/{chunk-6YTOJY35.js → chunk-6D2JFXLY.js} +35 -0
  44. package/{chunk-E6RGHPDR.js → chunk-6D6VBVEW.js} +4 -6
  45. package/{chunk-FZGV4FGK.js → chunk-6GFOD3TK.js} +260 -140
  46. package/{chunk-TMPLPCVX.js → chunk-6OZ36FXI.js} +2 -2
  47. package/{chunk-PZM3EENV.js → chunk-6Z7MY3V7.js} +1 -1
  48. package/{chunk-BYEJ7K2Z.js → chunk-7S4YWN7P.js} +1 -1
  49. package/{chunk-SREASRV5.js → chunk-ABQYVJBJ.js} +1 -1
  50. package/chunk-ACTMNVHM.js +93 -0
  51. package/{chunk-ZZCJUXUI.js → chunk-AHAHBQMU.js} +2 -2
  52. package/{chunk-BJCWNHVU.js → chunk-BFDFRLLQ.js} +2 -2
  53. package/chunk-BMQ2MJUK.js +153 -0
  54. package/chunk-BNGW5ASC.js +344 -0
  55. package/{chunk-2KDR4CWE.js → chunk-BYMV6QZG.js} +24 -1
  56. package/{chunk-73BR2IQT.js → chunk-CWQINZEA.js} +127 -7
  57. package/{chunk-HTMVBPOF.js → chunk-DD6XE56O.js} +19 -72
  58. package/{chunk-CADAR6QU.js → chunk-EYAQT56M.js} +4 -3
  59. package/{chunk-CJCJF5XB.js → chunk-FDTR4QJ6.js} +4 -2
  60. package/{chunk-D6XYLSOS.js → chunk-FKNWP6SG.js} +1 -1
  61. package/{chunk-3VPDELAP.js → chunk-FP76KI2Y.js} +1500 -84
  62. package/chunk-FV3JEYR3.js +870 -0
  63. package/{chunk-GCJ3IS5M.js → chunk-GIVFXPWK.js} +177 -6
  64. package/chunk-GMZLP5DV.js +82 -0
  65. package/{chunk-LHDV2QUI.js → chunk-GNCCNNZD.js} +4 -2
  66. package/{chunk-XWNRAIUL.js → chunk-GP5LKBUZ.js} +6 -16
  67. package/{chunk-PZCTYKGU.js → chunk-GQBOR3G6.js} +2 -2
  68. package/{chunk-NFT2AOK5.js → chunk-H4AHY5BU.js} +13 -85
  69. package/{chunk-FNGAF7C4.js → chunk-HAFJ3NDE.js} +137 -12
  70. package/{chunk-ZVN6I33J.js → chunk-HCT7U36O.js} +9 -5
  71. package/{chunk-7QVPPOEC.js → chunk-HKNXJGEC.js} +43 -43
  72. package/{chunk-3JQ2NRYU.js → chunk-HVURBGF3.js} +4 -4
  73. package/{chunk-OZX2IPKM.js → chunk-HYJFRTLW.js} +2 -2
  74. package/{chunk-HH65VA5U.js → chunk-I3TQJXQ7.js} +109 -6
  75. package/{chunk-UDQWGU7F.js → chunk-J4MOO56S.js} +1 -1
  76. package/{chunk-KC5FAHVS.js → chunk-JEDZAO7L.js} +1 -1
  77. package/{chunk-6XIE5ZGI.js → chunk-JPGCXHNM.js} +1 -1
  78. package/{chunk-DUJWWUGV.js → chunk-K36IXSCQ.js} +1 -1
  79. package/{chunk-KRMWO2NN.js → chunk-KAUSRTO6.js} +3 -3
  80. package/{chunk-7FWPLK4M.js → chunk-LJ5VW2UJ.js} +1 -1
  81. package/{chunk-GHEJJGJI.js → chunk-LMREEBWT.js} +833 -109
  82. package/{chunk-RXX4GDIH.js → chunk-LS2ZANRJ.js} +1 -1
  83. package/chunk-LVIFM7VW.js +1625 -0
  84. package/{chunk-BJIRLHJR.js → chunk-M2EJHDJP.js} +4 -0
  85. package/{chunk-EVBFYPDC.js → chunk-MC4XLIJ7.js} +6 -2
  86. package/{chunk-KEZNSFGD.js → chunk-MZYBSTMH.js} +11 -173
  87. package/chunk-OCZKATRC.js +129 -0
  88. package/{chunk-MXUSPS2N.js → chunk-OIVSQH2O.js} +1510 -1592
  89. package/{chunk-E36HZARC.js → chunk-P5EVSOPA.js} +93 -17
  90. package/{chunk-SZLVDREM.js → chunk-PBA4UJBK.js} +3 -3
  91. package/{chunk-URWDSZRW.js → chunk-PMAIQX7A.js} +3 -3
  92. package/{chunk-AETZ7AD6.js → chunk-Q554LLSI.js} +1 -1
  93. package/{chunk-AJHEFRGJ.js → chunk-Q67DOFOO.js} +214 -5
  94. package/{chunk-UZ6XXCVR.js → chunk-QDSINZM3.js} +15 -2
  95. package/{chunk-NRALD3CC.js → chunk-QSHEEA5N.js} +54 -10
  96. package/chunk-QU7KDSZX.js +677 -0
  97. package/{chunk-T25L377S.js → chunk-RPJUFEGR.js} +10 -10
  98. package/{chunk-QCZX4FTW.js → chunk-SH43IESU.js} +173 -15
  99. package/{chunk-SPAQ4PVV.js → chunk-SV5IJK6K.js} +1 -1
  100. package/{chunk-BKJO7LDP.js → chunk-U4OKDZFH.js} +6 -6
  101. package/{chunk-DM4FBSWG.js → chunk-UDVH2P4A.js} +7 -7
  102. package/{chunk-4EJ5QYB5.js → chunk-UEVXFHQB.js} +2 -2
  103. package/{chunk-JYYZCK2Z.js → chunk-V7E4PXQD.js} +1 -1
  104. package/{chunk-NHRQCXIQ.js → chunk-VMFTFOWF.js} +13 -3
  105. package/{chunk-YFADVSZE.js → chunk-VRTTFDBM.js} +7 -6
  106. package/{chunk-U7YP7ECK.js → chunk-WP5UXDA5.js} +84 -13
  107. package/{chunk-5J7W2VWW.js → chunk-WV42OMV7.js} +6 -265
  108. package/{chunk-3QPYFHAH.js → chunk-XD2MJFUG.js} +1 -1
  109. package/{chunk-IDGYOD2O.js → chunk-XP3VVAPG.js} +3174 -223
  110. package/{chunk-ETLZZQJE.js → chunk-Z2PV6O2T.js} +121 -26
  111. package/{chunk-BZNGCVAW.js → chunk-Z5625XML.js} +4 -4
  112. package/{contentThunks-THSCADSK.js → contentThunks-JYWI7G7I.js} +26 -26
  113. package/{cooldownCommands-BSCH2W7P.js → cooldownCommands-REAWYVTY.js} +2 -2
  114. package/{createAgentAutomationAction-WGN3UQ5A.js → createAgentAutomationAction-Z4SUJ54Y.js} +26 -26
  115. package/{createDialogAction-3EN2NLH7.js → createDialogAction-RCHFLVJ2.js} +29 -29
  116. package/{createPageAction-4VK473QV.js → createPageAction-YK2253XQ.js} +28 -28
  117. package/{dbSlice-GKGGFNOB.js → dbSlice-A6C6H32X.js} +8 -8
  118. package/{deleteFile-LWSR674W.js → deleteFile-YG6QMJLU.js} +3 -3
  119. package/{dialogCommands-PS4NWYY7.js → dialogCommands-X4UOZQWX.js} +36 -32
  120. package/{dialogSlice-CLV7SVOZ.js → dialogSlice-IVTWLCE2.js} +31 -25
  121. package/{docCreateCommands-4KANZJR6.js → docCreateCommands-VD6TGHG4.js} +33 -31
  122. package/{docDeleteCommands-F2S2TRUF.js → docDeleteCommands-OT3R2G4W.js} +34 -32
  123. package/{docReadCommands-B2WDPZQE.js → docReadCommands-2G7BIXSH.js} +33 -31
  124. package/{docStore-TDLCHWPF.js → docStore-UENKCCDX.js} +9 -9
  125. package/{docUpdateCommands-E7TKHRIO.js → docUpdateCommands-45MVJKZA.js} +33 -31
  126. package/{fetchMessages-DRABNDPZ.js → fetchMessages-EIU7UFFK.js} +3 -4
  127. package/{getPricing-QVTUQQTM.js → getPricing-LUSEABA6.js} +4 -4
  128. package/{handleSendMessageAction-AHL3ZHE4.js → handleSendMessageAction-LM2J4HC3.js} +66 -74
  129. package/index.js +99 -86
  130. package/{localDialogRead-PUQKFI73.js → localDialogRead-BTFJ4V2I.js} +2 -2
  131. package/{localRuntimeDb-P37ZTX55.js → localRuntimeDb-SYQGUF4U.js} +1 -1
  132. package/{machineCommands-OTABVXOA.js → machineCommands-6N6MQIE6.js} +69 -65
  133. package/{machineWsRunDispatch-V4EVQSMZ.js → machineWsRunDispatch-7MFKVQCR.js} +65 -61
  134. package/{memberThunks-KATHH3F4.js → memberThunks-P2ECUJ56.js} +9 -9
  135. package/{models-GS72DVJS.js → models-T3SG6MJ5.js} +2 -2
  136. package/{offlineMarxistsAgentCommand-GEH6SNNA.js → offlineMarxistsAgentCommand-HGXZV4XJ.js} +1 -1
  137. package/package.json +1 -1
  138. package/pdf-U6KSUEZZ.js +26435 -0
  139. package/providerPresetApply-XI3WUPTI.js +214 -0
  140. package/providerRegistry-KEPWWGXD.js +31 -0
  141. package/{read-LC6HVYBN.js → read-COE3ZYR6.js} +5 -4
  142. package/{readDocTool-N3ERJHHF.js → readDocTool-5USN4A6V.js} +1 -1
  143. package/{readlineWorkspace-IIT3FQ6I.js → readlineWorkspace-JWBON5CX.js} +291 -135
  144. package/{removeDialogAgentAction-F5GPTALR.js → removeDialogAgentAction-W66BJ7CF.js} +12 -12
  145. package/{runAgentClientLoop-7TQM7IAR.js → runAgentClientLoop-TA4SSPHE.js} +49 -49
  146. package/{runtimeDoctorCommands-CROTMULY.js → runtimeDoctorCommands-X6WDBEQX.js} +2 -2
  147. package/{setDialogExtraReferencesAction-AY4ZCF3A.js → setDialogExtraReferencesAction-2ALKG3WA.js} +10 -10
  148. package/{setPrimaryDialogAgentAction-HPMG7V3R.js → setPrimaryDialogAgentAction-TQZB55F6.js} +12 -12
  149. package/{settingSlice-OEJA4NQO.js → settingSlice-P4ZW7K5X.js} +10 -10
  150. package/{spaceCommands-FSYH7AL4.js → spaceCommands-6NSAXB7D.js} +31 -29
  151. package/{streamAgentChatTurn-6EF6TVFK.js → streamAgentChatTurn-X5ENGUIS.js} +126 -65
  152. package/{switchDialogAgentAction-HMDZTZ4I.js → switchDialogAgentAction-3KI72HHS.js} +9 -9
  153. package/{tableCommands-SUNTHAYX.js → tableCommands-O6NWHFKV.js} +1 -1
  154. package/{toolApiClient-VGYUB4P5.js → toolApiClient-G3M73RTB.js} +3 -3
  155. package/{tools-R3QNWWTD.js → tools-XRQR7ZZR.js} +45 -45
  156. package/tuiSummaryLlmCaller-UFGFOIIW.js +128 -0
  157. package/{updateCommands-Y363MC3L.js → updateCommands-2M74UL7P.js} +2 -2
  158. package/{updateDialogTitleAction-F3EUOWOB.js → updateDialogTitleAction-ESUUD3GT.js} +46 -29
  159. package/agentRecordCommands-WFPWLWOF.js +0 -125
  160. package/chunk-FMODTASJ.js +0 -109
  161. package/chunk-I42VC5KR.js +0 -15
  162. package/chunk-NB5SIWC4.js +0 -611
  163. package/chunk-NG4UT4K4.js +0 -79
  164. package/codingSkills-7S6523WH.js +0 -48
  165. package/tuiSummaryLlmCaller-PWOXTCBF.js +0 -116
  166. package/{chunk-3RAG2NAD.js → chunk-UKWGR5SS.js} +3 -3
  167. package/{db-VQSAOWAO.js → db-WK5MDZVN.js} +1 -1
  168. 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-BZNGCVAW.js";
7
+ } from "./chunk-Z5625XML.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-I3TQJXQ7.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-3AMA42ZI.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-XD2MJFUG.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-KRMWO2NN.js";
64
+ } from "./chunk-KAUSRTO6.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-RZOJRTKR.js";
83
+ } from "./chunk-3BGIKIPF.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-CWQINZEA.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-IDGYOD2O.js";
112
+ } from "./chunk-XP3VVAPG.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-DM4FBSWG.js";
119
+ } from "./chunk-UDVH2P4A.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,16 +132,14 @@ import {
123
132
  applySystemBuiltinSkillFilter,
124
133
  expandEnabledPacks,
125
134
  resolveEffectiveEnabledPacks
126
- } from "./chunk-GCJ3IS5M.js";
135
+ } from "./chunk-GIVFXPWK.js";
127
136
  import {
128
137
  DEFAULT_HYBRID_READ_TIMEOUT_MS,
129
138
  Duration_exports,
130
139
  Effect_exports,
131
140
  Exit_exports,
132
141
  Option_exports,
133
- accumulateGeminiChunks,
134
142
  aggregateResponsesStream,
135
- buildGeminiGenerateContentRequest,
136
143
  buildLoadSkillExecutor,
137
144
  buildLocalDialogWritePlan,
138
145
  buildLocalWorkspaceOpenAiTools,
@@ -145,22 +152,17 @@ import {
145
152
  evaluateFileWritePolicy,
146
153
  executeLocalToolWithPolicy,
147
154
  executeOpenAiCompatibleChatCompletion,
148
- fetchAntigravityCloudCodeCompletion,
149
155
  filterRetainedLedgerRecords,
156
+ getAgentRuntimeToolParametersIndex,
150
157
  internalListWorkspaceEntries,
151
158
  internalSearchWorkspace,
152
- isGemini3Model,
153
159
  isLineRangeCovered,
154
160
  localDialogMessageRecordToRuntimeMessage,
155
- parseSseDataLineJson,
156
- parseSseDataLineObject,
157
161
  parseSyncServersEnv,
158
- parseUpstreamErrorBody,
159
- resolveAntigravityFinishReason,
162
+ readDevinUpstreamFailure,
160
163
  resolveOpenAiCompatibleProviderConfig,
161
- shouldUseGeminiNativeToolRoute,
162
164
  summarizeToolArguments
163
- } from "./chunk-PF6O3GR3.js";
165
+ } from "./chunk-52Q2IW2X.js";
164
166
  import {
165
167
  PlatformStreamInterruptedError,
166
168
  buildPlatformChatCompletionRequest,
@@ -169,17 +171,30 @@ import {
169
171
  parsePlatformChatCompletionData,
170
172
  parsePlatformChatCompletionResponse,
171
173
  readPlatformChatSseCompletion,
172
- readSseDataValues,
173
174
  resolvePlatformChatProviderConfig,
174
175
  shouldUsePlatformChatProvider
175
- } from "./chunk-NFT2AOK5.js";
176
+ } from "./chunk-H4AHY5BU.js";
176
177
  import {
177
- isDevinOAuthAgent
178
- } from "./chunk-FMODTASJ.js";
178
+ accumulateGeminiChunks,
179
+ buildGeminiGenerateContentRequest,
180
+ fetchAntigravityCloudCodeCompletion,
181
+ isGemini3Model,
182
+ parseSseDataLineJson,
183
+ parseSseDataLineObject,
184
+ parseUpstreamErrorBody,
185
+ resolveAntigravityFinishReason,
186
+ shouldUseGeminiNativeToolRoute
187
+ } from "./chunk-FV3JEYR3.js";
188
+ import {
189
+ readSseDataValues
190
+ } from "./chunk-GMZLP5DV.js";
179
191
  import {
180
192
  resolveAgentRuntimeConfigFromRecord,
181
193
  resolveHistoricalToolContentCap
182
- } from "./chunk-AX7RMXSH.js";
194
+ } from "./chunk-4MK3I7Y4.js";
195
+ import {
196
+ isDevinOAuthAgent
197
+ } from "./chunk-5ZUL4CUO.js";
183
198
  import {
184
199
  collectStablePromptPrefix,
185
200
  convertMessagesToResponsesInput,
@@ -190,38 +205,39 @@ import {
190
205
  buildNoloWorkspaceOpenAiTools,
191
206
  parseNoloWorkspaceToolArguments,
192
207
  resolveRuntimeToolSurfaceForAgent
193
- } from "./chunk-ZVN6I33J.js";
208
+ } from "./chunk-HCT7U36O.js";
194
209
  import {
195
210
  mergeAvailabilityDeadline,
196
211
  resolveAvailabilityAction,
197
212
  resolveCooldownGate
198
- } from "./chunk-CJCJF5XB.js";
213
+ } from "./chunk-FDTR4QJ6.js";
199
214
  import {
200
215
  isAntigravityOAuthAgent
201
- } from "./chunk-LHDV2QUI.js";
216
+ } from "./chunk-GNCCNNZD.js";
202
217
  import {
203
218
  resolvePlatformAuthToken
204
- } from "./chunk-TMPLPCVX.js";
219
+ } from "./chunk-6OZ36FXI.js";
205
220
  import {
206
221
  buildDialogFallbackTitleFromUserInput,
207
222
  normalizeDialogTitle
208
223
  } from "./chunk-2MBTWINN.js";
209
224
  import {
210
225
  normalizeUsage
211
- } from "./chunk-7QVPPOEC.js";
226
+ } from "./chunk-HKNXJGEC.js";
212
227
  import {
213
228
  clipCompactText,
214
229
  createProviderCallTimingTracker,
215
230
  finalizeProviderCallTiming,
216
231
  observeMeaningfulProviderResponseAt,
217
232
  withProviderCallTimingFields
218
- } from "./chunk-E36HZARC.js";
233
+ } from "./chunk-P5EVSOPA.js";
219
234
  import {
220
235
  estimateTokenCount
221
236
  } from "./chunk-PSCNXBYA.js";
222
237
  import {
238
+ getModelConfig,
223
239
  isAdaptiveThinkingModelId
224
- } from "./chunk-MXUSPS2N.js";
240
+ } from "./chunk-OIVSQH2O.js";
225
241
  import {
226
242
  compactWhitespace
227
243
  } from "./chunk-DWLEOOGR.js";
@@ -230,7 +246,7 @@ import {
230
246
  resolveCurrentRunRuntimeToolPolicy,
231
247
  resolveLocalWorkspaceExecutorOptionsFromPolicy,
232
248
  resolveRequestedRuntimeToolNames
233
- } from "./chunk-3JQ2NRYU.js";
249
+ } from "./chunk-HVURBGF3.js";
234
250
  import {
235
251
  createOAuthTokenStore,
236
252
  isTokenExpired,
@@ -250,24 +266,42 @@ import {
250
266
  import {
251
267
  DEFAULT_NOLO_SERVER_URL
252
268
  } from "./chunk-OLZBQWZU.js";
269
+ import {
270
+ isNoloHostedProvider,
271
+ isPlatformHostedImageModel
272
+ } from "./chunk-Q67DOFOO.js";
253
273
  import {
254
274
  createTokenKey,
255
275
  createTokenStatsKey,
256
276
  createUserKey,
257
277
  dialogMessageRange
258
- } from "./chunk-NHRQCXIQ.js";
278
+ } from "./chunk-VMFTFOWF.js";
259
279
  import {
260
280
  asTrimmedLowercaseString
261
281
  } from "./chunk-QSJ3HFEF.js";
262
282
  import {
283
+ PUBLIC_DEEPSEEK_V4_FLASH_AGENT_ID,
284
+ PUBLIC_DEEPSEEK_V4_PRO_AGENT_ID,
285
+ PUBLIC_GLM_53_FLASH_AGENT_ID,
286
+ PUBLIC_GPT_IMAGE_2_CONTINUOUS_AGENT_ID,
287
+ PUBLIC_GPT_IMAGE_2_EDITOR_AGENT_ID,
288
+ PUBLIC_GPT_IMAGE_2_GENERATOR_AGENT_ID,
289
+ PUBLIC_NANO_BANANA_2_LITE_AGENT_ID,
290
+ builtinAgentCatalogEntryById,
291
+ isRetiredCatalogEntry,
263
292
  isSystemBuiltinTrustedAgentKey
264
- } from "./chunk-5J7W2VWW.js";
293
+ } from "./chunk-BNGW5ASC.js";
265
294
  import {
266
- asTrimmedString
267
- } from "./chunk-3EUW3WEO.js";
295
+ parsePublicAgentId,
296
+ parseSystemAgentId,
297
+ publicAgentKey
298
+ } from "./chunk-M2EJHDJP.js";
268
299
  import {
269
300
  isRecord
270
301
  } from "./chunk-KUG52IAP.js";
302
+ import {
303
+ asTrimmedString
304
+ } from "./chunk-3EUW3WEO.js";
271
305
  import {
272
306
  NOLO_CLUSTER_SERVERS
273
307
  } from "./chunk-LCBAMY2M.js";
@@ -578,6 +612,10 @@ var STRINGS = {
578
612
  en: "\u2713 Copied the selection to the clipboard.",
579
613
  zh: "\u2713 \u5DF2\u590D\u5236\u9009\u533A\u5230\u526A\u8D34\u677F\u3002"
580
614
  },
615
+ copiedSelectionBusy: {
616
+ en: "\u2713 Copied the selection to the clipboard. Press Esc to stop generating.",
617
+ zh: "\u2713 \u5DF2\u590D\u5236\u9009\u533A\u5230\u526A\u8D34\u677F\u3002\u6309 Esc \u505C\u6B62\u751F\u6210\u3002"
618
+ },
581
619
  copiedAllHistory: {
582
620
  en: "\u2713 Copied the full conversation to the clipboard.",
583
621
  zh: "\u2713 \u5DF2\u590D\u5236\u5B8C\u6574\u5BF9\u8BDD\u5230\u526A\u8D34\u677F\u3002"
@@ -674,6 +712,35 @@ var STRINGS = {
674
712
  en: "Thinking: {0}",
675
713
  zh: "\u601D\u8003\u4E2D\uFF1A{0}"
676
714
  },
715
+ // --- Pre-delta turn phase labels (ctx-overflow-feedback batch 3) ----------
716
+ // Rendered on the spinner / activity line while the local runtime checks the
717
+ // context window, compacts history, or waits for the first model delta —
718
+ // the previously silent pre-delta window (batch 1/2a 修好 runtime 与 SSE,
719
+ // 这里补齐 CLI/TUI 的状态行投影)。compacting 行附带可取消提示:Esc /
720
+ // Ctrl+C 即 abort,语义与 localLoop 的 abortSignal 一致。
721
+ contextChecking: {
722
+ en: "Checking this model's context window\u2026",
723
+ zh: "\u6B63\u5728\u68C0\u67E5\u5F53\u524D\u6A21\u578B\u7684\u4E0A\u4E0B\u6587\u7A97\u53E3\u2026"
724
+ },
725
+ contextCompacting: {
726
+ en: "Compacting history\u2026 (Esc/Ctrl+C to cancel)",
727
+ zh: "\u6B63\u5728\u538B\u7F29\u5386\u53F2\u8BB0\u5F55\u2026\uFF08Esc/Ctrl+C \u53D6\u6D88\uFF09"
728
+ },
729
+ waitingForModel: {
730
+ en: "Waiting for the model\u2026",
731
+ zh: "\u6B63\u5728\u7B49\u5F85\u6A21\u578B\u54CD\u5E94\u2026"
732
+ },
733
+ // --- Local turn deadline failure (single actionable line) -----------------
734
+ // localLoop 主请求 idle deadline(DEFAULT_LLM_REQUEST_TIMEOUT_MS 兜底或调用方
735
+ // timeoutMs)到达后抛 code=LLM_REQUEST_TIMEOUT;generic 分支的「修本地
736
+ // 凭据」文案在这里是错误指引(请求已发出,问题在上游无响应)。
737
+ // 语义是 idle(静默窗):{0} 内没有任何新输出才放弃,不是说模型「完全没
738
+ // 响应」——文案必须与这个语义一致,否则会把正在生成的用户推向重复发送
739
+ // (2026-10 ctx-overflow-feedback review 修复 1)。
740
+ llmRequestTimedOut: {
741
+ en: "No new model output for {0}, so this turn was stopped. Your message was kept. Retry in this conversation, switch to another model, or run /compact first.",
742
+ zh: "\u6A21\u578B\u5DF2 {0} \u6CA1\u6709\u65B0\u8F93\u51FA\uFF0C\u672C\u8F6E\u5DF2\u505C\u6B62\u7B49\u5F85\uFF08\u53EF\u80FD\u4ECD\u5728\u751F\u6210\uFF09\u3002\u4F60\u7684\u6D88\u606F\u5DF2\u4FDD\u7559\u3002\u53EF\u5728\u672C\u5BF9\u8BDD\u91CD\u8BD5\u3001\u5207\u6362\u5230\u5176\u4ED6\u6A21\u578B\uFF0C\u6216\u5148 /compact \u538B\u7F29\u5BF9\u8BDD\u3002"
743
+ },
677
744
  thinkingTraceLine: {
678
745
  en: "\u273B Thought for {0}",
679
746
  zh: "\u273B \u601D\u8003 {0}"
@@ -1032,6 +1099,18 @@ var STRINGS = {
1032
1099
  en: "Unknown command: {0}\n\n",
1033
1100
  zh: "\u672A\u77E5\u547D\u4EE4\uFF1A{0}\n\n"
1034
1101
  },
1102
+ noConversationLinks: {
1103
+ en: "No links in this conversation yet.",
1104
+ zh: "\u672C\u4F1A\u8BDD\u8FD8\u6CA1\u6709\u51FA\u73B0\u94FE\u63A5\u3002"
1105
+ },
1106
+ conversationLinksCopyHint: {
1107
+ en: "Open one by copying its URL (Cmd/Ctrl + click, or select and copy).",
1108
+ zh: "\u590D\u5236\u5BF9\u5E94 URL \u5373\u53EF\u6253\u5F00\uFF08Cmd/Ctrl + \u70B9\u51FB\uFF0C\u6216\u9009\u4E2D\u590D\u5236\uFF09\u3002"
1109
+ },
1110
+ conversationLinksShowing: {
1111
+ en: "Links in this conversation (showing first {0} of {1}):",
1112
+ zh: "\u672C\u4F1A\u8BDD\u51FA\u73B0\u7684\u94FE\u63A5\uFF08\u663E\u793A\u524D {0} \u4E2A\uFF0C\u5171 {1} \u4E2A\uFF09\uFF1A"
1113
+ },
1035
1114
  runtimeUsage: { en: "Usage: /runtime <auto|local|server>", zh: "\u7528\u6CD5\uFF1A/runtime <auto|local|server>" },
1036
1115
  runtimeSet: { en: "Runtime: {0}", zh: "\u8FD0\u884C\u6A21\u5F0F\uFF1A{0}" },
1037
1116
  displayFixedHint: {
@@ -1338,6 +1417,11 @@ var TOOL_LABELS = {
1338
1417
  function toolLabel(name) {
1339
1418
  return TOOL_LABELS[name]?.[currentLocale] ?? name;
1340
1419
  }
1420
+ function toolLabelVariants(name) {
1421
+ const entry = TOOL_LABELS[name];
1422
+ if (!entry) return [name];
1423
+ return [...new Set(Object.values(entry))];
1424
+ }
1341
1425
  function agentRunCardLabels() {
1342
1426
  return {
1343
1427
  runStatus: t("runStatusLabel"),
@@ -1719,6 +1803,9 @@ function buildCliChromeConnectorOpenAiTools(args) {
1719
1803
  function buildOpenAiTools(args) {
1720
1804
  const toolset = buildLocalWorkspaceToolsetForEnv(args);
1721
1805
  const workspaceToolNames = toolset.toolNames;
1806
+ const modelWorkspaceToolNames = (args.effectiveToolNames ?? workspaceToolNames).filter(
1807
+ (toolName) => toolName !== "taskWait" || !hasRunWakeChannel(args.env)
1808
+ );
1722
1809
  const toolNameSet = new Set(args.toolNames ?? []);
1723
1810
  const uiAskChoiceTools = toolNameSet.has("ask_user") ? prepareTools(["ask_user"]) : [];
1724
1811
  const readPastedTextTools = toolNameSet.has("readPastedText") ? [
@@ -1760,7 +1847,7 @@ function buildOpenAiTools(args) {
1760
1847
  ...uiAskChoiceTools,
1761
1848
  ...readPastedTextTools,
1762
1849
  ...buildLocalWorkspaceOpenAiTools({
1763
- toolNames: args.effectiveToolNames ?? workspaceToolNames,
1850
+ toolNames: modelWorkspaceToolNames,
1764
1851
  exposeShellTools: toolset.exposeShellTools
1765
1852
  }),
1766
1853
  ...buildCliChromeConnectorOpenAiTools({ toolNames: args.toolNames }),
@@ -2420,14 +2507,19 @@ var resolveAntigravityTransport = async (ctx) => {
2420
2507
  requestedToolNames,
2421
2508
  openAiToolNames: summarizeOpenAiToolNames(tools)
2422
2509
  });
2423
- const resolveLocalCredential = async ({ forceRefresh }) => resolveLocalAntigravityCredential({
2424
- credentialOwnerUserId,
2425
- apiKeyRefResolver,
2426
- apiKeyRef: agentConfig.apiKeyRef,
2427
- readCredential: () => readOAuthCredential("antigravity", void 0, legacyCredentialMigration),
2428
- migration: legacyCredentialMigration,
2429
- forceRefresh
2430
- });
2510
+ let lastUsedCredential = initialCredential;
2511
+ const resolveLocalCredential = async ({ forceRefresh }) => {
2512
+ const resolved = await resolveLocalAntigravityCredential({
2513
+ credentialOwnerUserId,
2514
+ apiKeyRefResolver,
2515
+ apiKeyRef: agentConfig.apiKeyRef,
2516
+ readCredential: () => readOAuthCredential("antigravity", void 0, legacyCredentialMigration),
2517
+ migration: legacyCredentialMigration,
2518
+ forceRefresh
2519
+ });
2520
+ lastUsedCredential = resolved;
2521
+ return resolved;
2522
+ };
2431
2523
  let result;
2432
2524
  try {
2433
2525
  result = await invokeAntigravity({
@@ -2481,10 +2573,27 @@ var resolveAntigravityTransport = async (ctx) => {
2481
2573
  };
2482
2574
  }
2483
2575
  if (result.status < 200 || result.status >= 300) {
2484
- const errMsg = result.body && typeof result.body === "object" && result.body.error && typeof result.body.error.message === "string" ? result.body.error.message : JSON.stringify(result.body);
2485
- throw new Error(
2576
+ const upstreamError = result.body && typeof result.body === "object" && result.body.error && typeof result.body.error === "object" ? result.body.error : void 0;
2577
+ const errMsg = (
2578
+ // Google Cloud Code Assist gates calls behind a one-time account
2579
+ // verification and answers HTTP 403 with the validation link in
2580
+ // `error.details[].metadata.validation_url` — NOT in
2581
+ // `error.message`. Extracting only `error.message` here drops the
2582
+ // link before agentRun's extractGoogleValidationLink can recover
2583
+ // it, so when details are present we append them after the clean
2584
+ // message; the extractor scans raw text for validation_url so a
2585
+ // `details=[...]` suffix is enough, and the Detail line keeps its
2586
+ // readable `HTTP 403 <message>` headline. Plain-message errors
2587
+ // keep the old shape so existing output stays unchanged.
2588
+ upstreamError && Array.isArray(upstreamError.details) ? `${typeof upstreamError.message === "string" ? upstreamError.message : ""} details=${JSON.stringify(upstreamError.details)}`.trim() : typeof upstreamError?.message === "string" ? upstreamError.message : JSON.stringify(result.body)
2589
+ );
2590
+ const failure = new Error(
2486
2591
  `local antigravity provider failed: HTTP ${result.status} ${errMsg}`
2487
2592
  );
2593
+ if (lastUsedCredential?.accountId) {
2594
+ failure.credentialAccountId = lastUsedCredential.accountId;
2595
+ }
2596
+ throw failure;
2488
2597
  }
2489
2598
  const choice = Array.isArray(result.body?.choices) ? result.body.choices[0] : void 0;
2490
2599
  const message = choice?.message ?? {};
@@ -8049,6 +8158,37 @@ function processCursorServerMessage(msg, state, onTextDelta, onReasoningDelta) {
8049
8158
  state.outputTokens += tokens;
8050
8159
  }
8051
8160
  }
8161
+ function attachCursorUpstreamFailure(error, failure) {
8162
+ if (failure) {
8163
+ error.cursorUpstreamFailure = failure;
8164
+ }
8165
+ return error;
8166
+ }
8167
+ function readCursorUpstreamFailure(error) {
8168
+ if (!error || typeof error !== "object") return void 0;
8169
+ const failure = error.cursorUpstreamFailure;
8170
+ if (!failure || typeof failure !== "object") return void 0;
8171
+ if (typeof failure.status !== "number" || !Number.isFinite(failure.status)) {
8172
+ return void 0;
8173
+ }
8174
+ return failure;
8175
+ }
8176
+ function buildCursorGrpcTrailerError(trailers) {
8177
+ const status = trailers["grpc-status"];
8178
+ if (!status || String(status) === "0") return null;
8179
+ const rawMessage = String(trailers["grpc-message"] || "");
8180
+ let message;
8181
+ try {
8182
+ message = decodeURIComponent(rawMessage);
8183
+ } catch {
8184
+ message = rawMessage;
8185
+ }
8186
+ const statusText = String(status);
8187
+ return attachCursorUpstreamFailure(
8188
+ new Error(`Cursor gRPC error ${statusText}: ${message}`),
8189
+ statusText === "8" || statusText.toLowerCase() === "resource_exhausted" ? { status: 429, body: { code: "resource_exhausted", message } } : void 0
8190
+ );
8191
+ }
8052
8192
  async function streamCursorChat(messages, options) {
8053
8193
  const baseUrl = options.baseUrl || CURSOR_API_URL;
8054
8194
  const clientVersion = options.clientVersion || CURSOR_CLIENT_VERSION;
@@ -8146,14 +8286,9 @@ async function streamCursorChat(messages, options) {
8146
8286
  }
8147
8287
  });
8148
8288
  h2Request.on("trailers", (trailers) => {
8149
- const status = trailers["grpc-status"];
8150
- const msg = trailers["grpc-message"];
8151
- if (status && status !== "0") {
8152
- h2Completion.reject(
8153
- new Error(
8154
- `Cursor gRPC error ${status}: ${decodeURIComponent(String(msg || ""))}`
8155
- )
8156
- );
8289
+ const error = buildCursorGrpcTrailerError(trailers);
8290
+ if (error) {
8291
+ h2Completion.reject(error);
8157
8292
  }
8158
8293
  });
8159
8294
  h2Request.on("end", () => {
@@ -9174,6 +9309,7 @@ function createCursorProvider(config) {
9174
9309
  ...config.executeTool ? { executeTool: config.executeTool } : {},
9175
9310
  ...config.searchWorkspace ? { searchWorkspace: config.searchWorkspace } : {},
9176
9311
  ...config.listWorkspaceEntries ? { listWorkspaceEntries: config.listWorkspaceEntries } : {},
9312
+ ...options?.signal ? { signal: options.signal } : {},
9177
9313
  ...options?.onTextDelta ? { onTextDelta: options.onTextDelta } : {},
9178
9314
  ...options?.onReasoningDelta ? { onReasoningDelta: options.onReasoningDelta } : {},
9179
9315
  ...options?.onToolEvent ? { onToolEvent: options.onToolEvent } : {},
@@ -9224,7 +9360,7 @@ function assertWithinLocalToolBudget(args) {
9224
9360
 
9225
9361
  // packages/cli/client/providerResolution/cursorTransport.ts
9226
9362
  var resolveCursorTransport = async (ctx) => {
9227
- const { agentConfig, deps, workspaceRoot, additionalToolNames, buildProviderOpenAiTools, apiKeyRefResolver, activeAgentToolNames, localToolExecutors } = ctx;
9363
+ const { agentConfig, deps, workspaceRoot, additionalToolNames, buildProviderOpenAiTools, apiKeyRefResolver, activeAgentToolNames, localToolExecutors, recordLocalAvailability } = ctx;
9228
9364
  if (isCursorOAuthAgent(agentConfig)) {
9229
9365
  const accessToken = await apiKeyRefResolver("cursor");
9230
9366
  if (!accessToken) {
@@ -9251,6 +9387,8 @@ var resolveCursorTransport = async (ctx) => {
9251
9387
  agentToolNames: activeAgentToolNames,
9252
9388
  call,
9253
9389
  executors: localToolExecutors,
9390
+ // 分发前参数闸门:与 host adapter 的 executeTool 同口径。
9391
+ toolParametersIndex: getAgentRuntimeToolParametersIndex(),
9254
9392
  detachMs: resolveExecShellDetachMs(deps.env),
9255
9393
  ...deps.confirmDestructiveAction ? { confirmDestructiveAction: deps.confirmDestructiveAction } : {}
9256
9394
  });
@@ -9300,15 +9438,24 @@ var resolveCursorTransport = async (ctx) => {
9300
9438
  toolCount: tools.length,
9301
9439
  requestedToolNames
9302
9440
  });
9303
- const result = await cursorProvider.complete(messages, options);
9304
- logLocalRuntimeDiagnostic("provider.request.result", {
9305
- agentKey: agentConfig.key,
9306
- transport: "cursor-connect",
9307
- ok: true,
9308
- contentChars: (result.content ?? "").length,
9309
- toolCallCount: result.tool_calls?.length ?? 0
9310
- });
9311
- return result;
9441
+ try {
9442
+ const result = await cursorProvider.complete(messages, options);
9443
+ await recordLocalAvailability(200);
9444
+ logLocalRuntimeDiagnostic("provider.request.result", {
9445
+ agentKey: agentConfig.key,
9446
+ transport: "cursor-connect",
9447
+ ok: true,
9448
+ contentChars: (result.content ?? "").length,
9449
+ toolCallCount: result.tool_calls?.length ?? 0
9450
+ });
9451
+ return result;
9452
+ } catch (error) {
9453
+ const failure = readCursorUpstreamFailure(error);
9454
+ if (failure) {
9455
+ await recordLocalAvailability(failure.status, failure.body);
9456
+ }
9457
+ throw error;
9458
+ }
9312
9459
  }
9313
9460
  };
9314
9461
  }
@@ -9317,7 +9464,14 @@ var resolveCursorTransport = async (ctx) => {
9317
9464
 
9318
9465
  // packages/cli/client/providerResolution/devinTransport.ts
9319
9466
  var resolveDevinTransport = async (ctx) => {
9320
- const { agentConfig, apiKeyRefResolver } = ctx;
9467
+ const {
9468
+ agentConfig,
9469
+ apiKeyRefResolver,
9470
+ deps,
9471
+ buildProviderOpenAiTools,
9472
+ additionalToolNames,
9473
+ recordLocalAvailability
9474
+ } = ctx;
9321
9475
  if (isDevinOAuthAgent(agentConfig)) {
9322
9476
  const accessToken = await apiKeyRefResolver("devin");
9323
9477
  if (!accessToken) {
@@ -9326,22 +9480,46 @@ var resolveDevinTransport = async (ctx) => {
9326
9480
  );
9327
9481
  }
9328
9482
  const model = agentConfig.model || "swe-2-max";
9483
+ const { requestedToolNames, tools } = resolveProviderOpenAiToolBundle(
9484
+ agentConfig,
9485
+ deps.env,
9486
+ buildProviderOpenAiTools,
9487
+ additionalToolNames
9488
+ );
9489
+ const devinProvider = createDevinProvider({
9490
+ token: accessToken,
9491
+ model,
9492
+ fetchImpl: ctx.fetchImpl,
9493
+ tools,
9494
+ // agentConfig.temperature reaches every transport except the Devin one;
9495
+ // forward it so the agent form's sampling knob stops being a no-op here.
9496
+ // Left undefined it keeps the upstream client's value.
9497
+ temperature: typeof agentConfig.temperature === "number" ? agentConfig.temperature : void 0
9498
+ });
9329
9499
  logLocalRuntimeDiagnostic("provider.selected", {
9330
9500
  agentKey: agentConfig.key,
9331
9501
  transport: "devin-connect",
9332
9502
  provider: "devin",
9333
9503
  model,
9334
- hasApiKey: true
9335
- });
9336
- const devinProvider = createDevinProvider({
9337
- token: accessToken,
9338
- model,
9339
- fetchImpl: ctx.fetchImpl
9504
+ hasApiKey: true,
9505
+ toolCount: tools.length,
9506
+ requestedToolNames,
9507
+ temperature: typeof agentConfig.temperature === "number" ? agentConfig.temperature : null
9340
9508
  });
9341
9509
  return {
9342
9510
  model,
9343
9511
  complete: async (messages, options) => {
9344
- return devinProvider.complete(messages, options);
9512
+ try {
9513
+ const result = await devinProvider.complete(messages, options);
9514
+ await recordLocalAvailability(200);
9515
+ return result;
9516
+ } catch (error) {
9517
+ const failure = readDevinUpstreamFailure(error);
9518
+ if (failure) {
9519
+ await recordLocalAvailability(failure.status, failure.body);
9520
+ }
9521
+ throw error;
9522
+ }
9345
9523
  }
9346
9524
  };
9347
9525
  }
@@ -9448,7 +9626,7 @@ var resolveDirectOpenAiCompatibleTransport = async (ctx) => {
9448
9626
 
9449
9627
  // packages/cli/client/providerResolution/geminiNativeToolTransport.ts
9450
9628
  var resolveGeminiNativeToolTransport = async (ctx) => {
9451
- const { agentConfig, deps, fetchImpl, additionalToolNames, buildProviderOpenAiTools, apiKeyRefResolver, credentialBroker, syncFetcher } = ctx;
9629
+ const { agentConfig, deps, fetchImpl, additionalToolNames, buildProviderOpenAiTools, apiKeyRefResolver, credentialBroker, syncFetcher, recordLocalAvailability } = ctx;
9452
9630
  if (shouldUsePlatformChatProvider(deps.env, agentConfig) && isGemini3Model(agentConfig.model ?? "") && agentConfig.provider === "google") {
9453
9631
  const providerConfig = await resolvePlatformChatProviderConfig({
9454
9632
  agentConfig,
@@ -9515,6 +9693,7 @@ var resolveGeminiNativeToolTransport = async (ctx) => {
9515
9693
  status: res.status,
9516
9694
  error: errText.slice(0, 200)
9517
9695
  });
9696
+ await recordLocalAvailability(res.status, errText);
9518
9697
  throw new Error(
9519
9698
  `gemini native tool provider failed: HTTP ${res.status} ${errText.slice(0, 500)}`
9520
9699
  );
@@ -9540,6 +9719,7 @@ var resolveGeminiNativeToolTransport = async (ctx) => {
9540
9719
  contentChars: text.length,
9541
9720
  toolCallCount: toolCalls.length
9542
9721
  });
9722
+ await recordLocalAvailability(200);
9543
9723
  return result;
9544
9724
  }
9545
9725
  };
@@ -10091,6 +10271,446 @@ async function syncLocalDialogEvidenceToRemote(args) {
10091
10271
  return { attempted: true };
10092
10272
  }
10093
10273
 
10274
+ // packages/core/publicAgentSeeds.ts
10275
+ var AGENT_SEED_DEFAULTS = {
10276
+ isPublic: true,
10277
+ allowFork: true,
10278
+ hasVision: false,
10279
+ tools: []
10280
+ };
10281
+ function deterministicId(prefix, seed) {
10282
+ let h = 2166136261;
10283
+ for (let i = 0; i < seed.length; i++) {
10284
+ h ^= seed.charCodeAt(i);
10285
+ h = h * 16777619 >>> 0;
10286
+ }
10287
+ const suffix = h.toString(36).toUpperCase().padStart(14, "0");
10288
+ return (prefix + suffix).slice(0, 26);
10289
+ }
10290
+ function defineAgentSeed(input) {
10291
+ const providerForLookup = isPlatformHostedImageModel(input.model) ? "nolo" : input.provider || "nolo";
10292
+ const tools = input.tools ? [...input.tools] : [...AGENT_SEED_DEFAULTS.tools];
10293
+ const isPublic = input.isPublic ?? AGENT_SEED_DEFAULTS.isPublic;
10294
+ const allowFork = input.allowFork ?? AGENT_SEED_DEFAULTS.allowFork;
10295
+ const tags = input.tags ? [...input.tags] : [];
10296
+ const isPlatformHosted = isNoloHostedProvider(input.provider);
10297
+ const isPlatformPriced = !isPlatformHostedImageModel(input.model) && (isPlatformHosted || input.apiSource === "platform" || input.isPublic === true && !input.apiSource);
10298
+ let inputPrice = isPlatformPriced ? void 0 : input.inputPrice;
10299
+ let outputPrice = isPlatformPriced ? void 0 : input.outputPrice;
10300
+ let hasVision = input.hasVision;
10301
+ const pricesProvided = input.inputPrice !== void 0 || input.outputPrice !== void 0;
10302
+ if (!isPlatformPriced && (inputPrice === void 0 || outputPrice === void 0)) {
10303
+ const pricing = getModelPricing(providerForLookup, input.model);
10304
+ if (!pricing) {
10305
+ throw new Error(`\u672A\u627E\u5230\u6A21\u578B\u4EF7\u683C\u5143\u6570\u636E: ${providerForLookup}/${input.model}`);
10306
+ }
10307
+ if (inputPrice === void 0) inputPrice = pricing.inputPrice;
10308
+ if (outputPrice === void 0) outputPrice = pricing.outputPrice;
10309
+ }
10310
+ if (hasVision === void 0) {
10311
+ if (pricesProvided) {
10312
+ hasVision = AGENT_SEED_DEFAULTS.hasVision;
10313
+ } else {
10314
+ const modelConfig = getModelConfig(providerForLookup, input.model);
10315
+ hasVision = !!modelConfig.hasVision;
10316
+ }
10317
+ }
10318
+ const userVisibleTexts = [
10319
+ ["name", input.name],
10320
+ ["introduction", input.introduction],
10321
+ [
10322
+ "greeting",
10323
+ typeof input.greeting === "string" ? input.greeting : input.greeting?.text
10324
+ ],
10325
+ ["prompt", input.prompt],
10326
+ ...(input.tags ?? []).map((tag) => ["tags", tag])
10327
+ ];
10328
+ for (const [fieldName, text] of userVisibleTexts) {
10329
+ if (!text) continue;
10330
+ const hit = text.match(/平台托管|runinfra|openrouter|ollama/i);
10331
+ if (hit) {
10332
+ throw new Error(
10333
+ `\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`
10334
+ );
10335
+ }
10336
+ }
10337
+ const { inputPrice: _strippedInputPrice, outputPrice: _strippedOutputPrice, ...inputRest } = input;
10338
+ const record = {
10339
+ ...inputRest,
10340
+ tools,
10341
+ isPublic,
10342
+ allowFork,
10343
+ tags,
10344
+ hasVision
10345
+ };
10346
+ if (!isPlatformPriced) {
10347
+ record.inputPrice = inputPrice;
10348
+ record.outputPrice = outputPrice;
10349
+ }
10350
+ return record;
10351
+ }
10352
+ var GPT_6_LUNA_DEF = defineAgentSeed({
10353
+ // salt 冻结为历史值 "shared-space-openai-gpt-5-6-luna":deterministicId 由
10354
+ // prefix+salt 哈希得出,改 salt 会换 ID——2026-09-23 Luna 原地换代
10355
+ // (GPT-5.6 Luna → GPT-6 Luna)必须保留稳定 ID,用户收藏/别名/Space
10356
+ // 内容键才不失效。
10357
+ id: deterministicId("01GPT56LUNPB", "shared-space-openai-gpt-5-6-luna"),
10358
+ presetKey: "gpt-6-luna",
10359
+ name: "GPT-6 Luna",
10360
+ // provider 用平台托管命名空间 "nolo"(平台 agent 统一收敛方向):平台价只注册在
10361
+ // nolo 下,agent-run 的托管路由门也只认 nolo。写上游名 "openai" 会让计费落零价
10362
+ // 虚拟模型并绕过 hosted routing(2026-09-24 review CRITICAL)。
10363
+ provider: "nolo",
10364
+ model: "gpt-6-luna",
10365
+ isPublic: true,
10366
+ platformAudit: true,
10367
+ 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",
10368
+ 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",
10369
+ prompt: "\u4F18\u5148\u5FEB\u901F\u5B8C\u6210\u4EFB\u52A1\uFF1B\u4FDD\u6301\u56DE\u7B54\u76F4\u63A5\u3001\u7ED3\u8BBA\u660E\u786E\u3002",
10370
+ tools: [],
10371
+ tags: ["openai"]
10372
+ });
10373
+ var DEEPSEEK_V4_FLASH_DEF = defineAgentSeed({
10374
+ id: PUBLIC_DEEPSEEK_V4_FLASH_AGENT_ID,
10375
+ presetKey: "deepseek-v4-flash",
10376
+ name: "DeepSeek Flash",
10377
+ provider: "nolo",
10378
+ model: "deepseek-flash",
10379
+ isPublic: true,
10380
+ 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",
10381
+ 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",
10382
+ 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",
10383
+ tools: [],
10384
+ tags: ["nolo", "deepseek"]
10385
+ });
10386
+ var DEEPSEEK_V4_PRO_DEF = defineAgentSeed({
10387
+ id: PUBLIC_DEEPSEEK_V4_PRO_AGENT_ID,
10388
+ presetKey: "deepseek-v4-pro",
10389
+ name: "DeepSeek V4 Pro",
10390
+ provider: "nolo",
10391
+ model: "deepseek-v4-pro",
10392
+ hasVision: false,
10393
+ isPublic: true,
10394
+ 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",
10395
+ 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",
10396
+ 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",
10397
+ tools: [],
10398
+ tags: ["nolo", "deepseek"]
10399
+ });
10400
+ var GLM_5_3_DEF = defineAgentSeed({
10401
+ id: "01GLM52DIPB00000000I3E2MY",
10402
+ presetKey: "glm-5.3",
10403
+ name: "GLM 5.3",
10404
+ provider: "nolo",
10405
+ model: "glm-5.3",
10406
+ isPublic: true,
10407
+ hasVision: true,
10408
+ 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",
10409
+ 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",
10410
+ 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",
10411
+ tools: [],
10412
+ tags: ["nolo", "glm"]
10413
+ });
10414
+ var GLM_5_3_FLASH_DEF = defineAgentSeed({
10415
+ id: PUBLIC_GLM_53_FLASH_AGENT_ID,
10416
+ presetKey: "glm-5-3-flash",
10417
+ name: "GLM 5.3 Flash",
10418
+ provider: "nolo",
10419
+ model: "glm-5-3-flash",
10420
+ isPublic: true,
10421
+ hasVision: true,
10422
+ 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",
10423
+ 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",
10424
+ prompt: "\u76F4\u63A5\u3001\u7B80\u6D01\u5730\u5B8C\u6210\u4EFB\u52A1\uFF1B\u56DE\u7B54\u4FDD\u6301\u7B80\u77ED\uFF0C\u5148\u7ED9\u7ED3\u8BBA\u3002",
10425
+ // 关掉思考:该模型默认档的 reasoning token 计入输出计费,而实测 low 档
10426
+ // reasoning 输出为 0(10/10 样本),单轮问答输出 token 降到约 1/5、多轮工具
10427
+ // 循环降约 4 成,可见回复长度、工具调用正确性与循环完成度均不变。
10428
+ // medium 档只省约 29% token 且延迟不改善,故直接用 low。
10429
+ reasoning_effort: "low",
10430
+ tools: [],
10431
+ tags: ["nolo", "glm", "flash"]
10432
+ });
10433
+ var CLAUDE_FABLE_5_1_DEF = defineAgentSeed({
10434
+ id: deterministicId("01CLDFBL51PB", "shared-space-anthropic-claude-fable-5-1"),
10435
+ presetKey: "claude-fable-5-1",
10436
+ name: "Claude Fable 5.1",
10437
+ provider: "nolo",
10438
+ model: "anthropic/claude-fable-5-1",
10439
+ isPublic: true,
10440
+ hasVision: true,
10441
+ 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",
10442
+ 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",
10443
+ 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",
10444
+ tools: [],
10445
+ tags: ["anthropic", "claude", "fable"]
10446
+ });
10447
+ var CLAUDE_OPUS_5_5_DEF = defineAgentSeed({
10448
+ id: deterministicId("01CLDOPU55PB", "shared-space-anthropic-claude-opus-5-5"),
10449
+ presetKey: "claude-opus-5-5",
10450
+ name: "Claude Opus 5.5",
10451
+ provider: "nolo",
10452
+ model: "anthropic/claude-opus-5-5",
10453
+ isPublic: true,
10454
+ hasVision: true,
10455
+ 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",
10456
+ 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",
10457
+ 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",
10458
+ tools: [],
10459
+ tags: ["anthropic", "claude", "opus"]
10460
+ });
10461
+ var GROK_4_6_DEF = defineAgentSeed({
10462
+ id: deterministicId("01GROK46PLAZ", "shared-space-xai-grok-4-6"),
10463
+ presetKey: "grok-4.6",
10464
+ name: "Grok 4.6",
10465
+ provider: "xai",
10466
+ model: "grok-4.6",
10467
+ isPublic: true,
10468
+ hasVision: true,
10469
+ 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",
10470
+ 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",
10471
+ 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",
10472
+ tools: [],
10473
+ tags: ["xai", "grok"]
10474
+ });
10475
+ var GEMINI_3_8_FLASH_DEF = defineAgentSeed({
10476
+ // 种子串冻结以维持确定性 ID 稳定,勿随版本改名。
10477
+ id: deterministicId("01GEM37FLPB", "shared-space-google-gemini-3-7-flash"),
10478
+ presetKey: "gemini-3.8-flash",
10479
+ name: "Gemini 3.8 Flash",
10480
+ provider: "nolo",
10481
+ model: "gemini-3.8-flash",
10482
+ isPublic: true,
10483
+ 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",
10484
+ 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",
10485
+ 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",
10486
+ tools: [],
10487
+ tags: ["google", "gemini"]
10488
+ });
10489
+ var GPT_IMAGE_2_GENERATOR_DEF = defineAgentSeed({
10490
+ id: PUBLIC_GPT_IMAGE_2_GENERATOR_AGENT_ID,
10491
+ presetKey: "gpt-image-2-generator",
10492
+ name: "GPT Image 2 \u56FE\u7247\u751F\u6210\u5668",
10493
+ provider: "nolo",
10494
+ model: "gpt-6-luna",
10495
+ imageModel: "gpt-image-2",
10496
+ isPublic: true,
10497
+ hasImageOutput: true,
10498
+ imageWorkflow: "generate",
10499
+ imageConfig: { enabled: true },
10500
+ 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",
10501
+ 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",
10502
+ prompt: [
10503
+ "\u5B9A\u4F4D\uFF1A",
10504
+ "- \u4F60\u7684\u4E3B\u4EFB\u52A1\u662F\u6587\u672C\u751F\u6210\u65B0\u56FE\u7247\u3002",
10505
+ "- \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",
10506
+ "- \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",
10507
+ "",
10508
+ "\u5DE5\u4F5C\u65B9\u5F0F\uFF1A",
10509
+ "- \u7528\u6237\u7ED9\u51FA\u6E05\u6670\u9700\u6C42\u540E\uFF0C\u76F4\u63A5\u751F\u6210\uFF0C\u4E0D\u5148\u5199\u957F\u7BC7\u89E3\u91CA\u3002",
10510
+ "- 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",
10511
+ "- \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",
10512
+ "- \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",
10513
+ "",
10514
+ "\u56DE\u590D\u65B9\u5F0F\uFF1A",
10515
+ "- \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"
10516
+ ].join("\n"),
10517
+ tools: ["openAIGptImageGenerate"],
10518
+ tags: ["image", "openai", "gpt-image-2", "generate"]
10519
+ });
10520
+ var GPT_IMAGE_2_EDITOR_DEF = defineAgentSeed({
10521
+ id: PUBLIC_GPT_IMAGE_2_EDITOR_AGENT_ID,
10522
+ presetKey: "gpt-image-2-editor",
10523
+ name: "GPT Image 2 \u56FE\u7247\u7F16\u8F91\u5668",
10524
+ provider: "nolo",
10525
+ model: "gpt-6-luna",
10526
+ imageModel: "gpt-image-2",
10527
+ isPublic: true,
10528
+ hasImageOutput: true,
10529
+ imageWorkflow: "edit",
10530
+ imageConfig: { enabled: true },
10531
+ 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",
10532
+ 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",
10533
+ prompt: [
10534
+ "\u5B9A\u4F4D\uFF1A",
10535
+ "- \u4F60\u7684\u4E3B\u4EFB\u52A1\u662F\u5355\u6B21\u8BF7\u6C42\u6539\u56FE\uFF0C\u4E0D\u662F\u957F\u5BF9\u8BDD\u966A\u4F34\u5F0F\u521B\u4F5C\u3002",
10536
+ "- \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",
10537
+ "- \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",
10538
+ "",
10539
+ "\u5DE5\u4F5C\u65B9\u5F0F\uFF1A",
10540
+ "- \u6536\u5230\u56FE\u7247\u540E\uFF0C\u4F18\u5148\u6309\u5355\u6B21\u8BF7\u6C42\u6539\u56FE\u5B8C\u6210\u5F53\u524D\u76EE\u6807\u3002",
10541
+ "- \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",
10542
+ "- \u5982\u679C\u7528\u6237\u63D0\u4F9B\u4E86 mask\uFF0C\u5C31\u628A mask \u89C6\u4E3A\u5FC5\u987B\u9075\u5B88\u7684\u7F16\u8F91\u8303\u56F4\u3002",
10543
+ "- \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",
10544
+ "- \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",
10545
+ "- \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",
10546
+ "- \u5982\u679C outputFormat \u662F png\uFF08\u6216\u6CA1\u6709\u663E\u5F0F\u6539\u6210 jpeg/webp\uFF09\uFF0C\u4E0D\u8981\u4F20 outputCompression\u3002",
10547
+ "",
10548
+ "\u56DE\u590D\u65B9\u5F0F\uFF1A",
10549
+ "- \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"
10550
+ ].join("\n"),
10551
+ tools: ["openAIGptImageEdit"],
10552
+ tags: ["image", "openai", "gpt-image-2", "edit"]
10553
+ });
10554
+ var GPT_IMAGE_2_CONTINUOUS_DEF = defineAgentSeed({
10555
+ id: PUBLIC_GPT_IMAGE_2_CONTINUOUS_AGENT_ID,
10556
+ presetKey: "gpt-image-2-continuous",
10557
+ name: "GPT Image 2 \u8FDE\u7EED\u521B\u4F5C\u52A9\u624B",
10558
+ provider: "nolo",
10559
+ model: "gpt-6-luna",
10560
+ imageModel: "gpt-image-2",
10561
+ isPublic: true,
10562
+ hasImageOutput: true,
10563
+ imageWorkflow: "continuous",
10564
+ imageConfig: { enabled: true },
10565
+ 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",
10566
+ 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",
10567
+ prompt: [
10568
+ "\u5B9A\u4F4D\uFF1A",
10569
+ "- \u4F60\u7684\u4E3B\u4EFB\u52A1\u662F\u591A\u8F6E\u8FDE\u7EED\u521B\u4F5C\u3002",
10570
+ "- \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",
10571
+ "- \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",
10572
+ "",
10573
+ "\u5DE5\u4F5C\u65B9\u5F0F\uFF1A",
10574
+ "- \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",
10575
+ "- \u5982\u679C\u5F53\u524D\u8F6E\u7528\u6237\u4E0A\u4F20\u4E86\u65B0\u56FE\uFF0C\u4F18\u5148\u57FA\u4E8E\u65B0\u56FE\u7EE7\u7EED\u521B\u4F5C\u3002",
10576
+ "- \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",
10577
+ "- \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",
10578
+ "- \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",
10579
+ "- \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",
10580
+ "- \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",
10581
+ "- \u5982\u679C outputFormat \u662F png\uFF08\u6216\u6CA1\u6709\u663E\u5F0F\u6539\u6210 jpeg/webp\uFF09\uFF0C\u4E0D\u8981\u4F20 outputCompression\u3002",
10582
+ "",
10583
+ "\u56DE\u590D\u65B9\u5F0F\uFF1A",
10584
+ "- \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"
10585
+ ].join("\n"),
10586
+ tools: ["openAIGptImageGenerate", "openAIGptImageEdit"],
10587
+ tags: ["image", "openai", "gpt-image-2", "continuous"]
10588
+ });
10589
+ var NANO_BANANA_2_LITE_GENERATOR_DEF = defineAgentSeed({
10590
+ id: PUBLIC_NANO_BANANA_2_LITE_AGENT_ID,
10591
+ presetKey: "nano-banana-2-lite-generator",
10592
+ name: "Nano Banana 2 Lite \u6587\u751F\u56FE",
10593
+ provider: "nolo",
10594
+ model: "gemini-3.1-flash-lite-image",
10595
+ isPublic: true,
10596
+ hasImageOutput: true,
10597
+ imageWorkflow: "generate",
10598
+ imageConfig: { enabled: true },
10599
+ 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",
10600
+ 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",
10601
+ prompt: [
10602
+ "\u5B9A\u4F4D\uFF1A",
10603
+ "- \u4F60\u7684\u4E3B\u4EFB\u52A1\u662F\u5FEB\u901F\u751F\u6210\u65B0\u56FE\u7247\u3002",
10604
+ "- \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",
10605
+ "",
10606
+ "\u5DE5\u4F5C\u65B9\u5F0F\uFF1A",
10607
+ "- \u7528\u6237\u7ED9\u51FA\u6E05\u6670\u9700\u6C42\u540E\uFF0C\u76F4\u63A5\u7528\u5F53\u524D\u6A21\u578B\u751F\u6210\u56FE\u7247\u3002",
10608
+ "- \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",
10609
+ "- prompt \u8981\u660E\u786E\u4E3B\u4F53\u3001\u573A\u666F\u3001\u98CE\u683C\u3001\u5149\u7EBF\u3001\u6C1B\u56F4\u3002",
10610
+ "- \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",
10611
+ "- \u5982\u679C\u7528\u6237\u4E0A\u4F20\u4E86\u53C2\u8003\u56FE\uFF0C\u8BA9\u6A21\u578B\u53C2\u8003\u6784\u56FE\u6216\u98CE\u683C\u3002",
10612
+ "- \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",
10613
+ "",
10614
+ "\u56DE\u590D\u65B9\u5F0F\uFF1A",
10615
+ "- \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"
10616
+ ].join("\n"),
10617
+ tools: [],
10618
+ tags: ["image", "google", "gemini", "nano-banana", "fast", "generate"]
10619
+ });
10620
+ var PUBLIC_AGENT_DEFS = [
10621
+ GPT_6_LUNA_DEF,
10622
+ DEEPSEEK_V4_FLASH_DEF,
10623
+ DEEPSEEK_V4_PRO_DEF,
10624
+ GLM_5_3_DEF,
10625
+ GLM_5_3_FLASH_DEF,
10626
+ CLAUDE_FABLE_5_1_DEF,
10627
+ CLAUDE_OPUS_5_5_DEF,
10628
+ GROK_4_6_DEF,
10629
+ GEMINI_3_8_FLASH_DEF,
10630
+ GPT_IMAGE_2_GENERATOR_DEF,
10631
+ GPT_IMAGE_2_EDITOR_DEF,
10632
+ GPT_IMAGE_2_CONTINUOUS_DEF,
10633
+ NANO_BANANA_2_LITE_GENERATOR_DEF
10634
+ ];
10635
+ var PLATFORM_AUDITED_AGENT_SPECS = PUBLIC_AGENT_DEFS.filter((def) => def.platformAudit).map((def) => ({
10636
+ name: def.name,
10637
+ key: publicAgentKey(def.id)
10638
+ }));
10639
+
10640
+ // packages/agent-runtime/publicAgentCatalogOverride.ts
10641
+ var SEED_BY_ID = new Map(
10642
+ PUBLIC_AGENT_DEFS.map((seed) => [seed.id, seed])
10643
+ );
10644
+ function toPlatformOwnedCatalogId(value) {
10645
+ if (typeof value !== "string") return null;
10646
+ const trimmed = value.trim();
10647
+ if (!trimmed) return null;
10648
+ const parsed = parsePublicAgentId(trimmed);
10649
+ if (parsed) return parsed;
10650
+ const systemId = parseSystemAgentId(trimmed);
10651
+ if (systemId) return systemId;
10652
+ return null;
10653
+ }
10654
+ function readPlatformOwnedKey(record) {
10655
+ const fields = record;
10656
+ for (const value of [fields.dbKey, fields.id]) {
10657
+ if (typeof value !== "string") continue;
10658
+ if (toPlatformOwnedCatalogId(value) === null) continue;
10659
+ return value;
10660
+ }
10661
+ return null;
10662
+ }
10663
+ function resolvePublicAgentCatalogOverride(agentKey) {
10664
+ const id = toPlatformOwnedCatalogId(agentKey);
10665
+ if (!id) return null;
10666
+ const entry = builtinAgentCatalogEntryById(id);
10667
+ if (!entry) return null;
10668
+ if (entry.group !== "public" || isRetiredCatalogEntry(entry)) return null;
10669
+ const seed = SEED_BY_ID.get(entry.id);
10670
+ if (!seed) return null;
10671
+ return {
10672
+ name: entry.name,
10673
+ provider: entry.provider,
10674
+ model: entry.model,
10675
+ introduction: seed.introduction,
10676
+ greeting: seed.greeting,
10677
+ prompt: seed.prompt,
10678
+ tools: [...seed.tools],
10679
+ tags: [...seed.tags]
10680
+ };
10681
+ }
10682
+ function overlayGreeting(recordGreeting, seedGreeting) {
10683
+ const seedText = typeof seedGreeting === "string" ? seedGreeting : isRecord(seedGreeting) ? seedGreeting.text : void 0;
10684
+ if (typeof seedText !== "string" || !seedText) return recordGreeting;
10685
+ if (isRecord(recordGreeting)) {
10686
+ return { ...recordGreeting, text: seedText };
10687
+ }
10688
+ if (recordGreeting === void 0 || recordGreeting === null) {
10689
+ return seedGreeting;
10690
+ }
10691
+ if (typeof recordGreeting === "string") {
10692
+ return seedText;
10693
+ }
10694
+ return recordGreeting;
10695
+ }
10696
+ function applyPublicAgentCatalogOverride(record, agentKey) {
10697
+ const override = resolvePublicAgentCatalogOverride(agentKey) ?? resolvePublicAgentCatalogOverride(readPlatformOwnedKey(record));
10698
+ if (!override) return record;
10699
+ const current = record;
10700
+ const greeting = overlayGreeting(current.greeting, override.greeting);
10701
+ return {
10702
+ ...record,
10703
+ name: override.name,
10704
+ provider: override.provider,
10705
+ model: override.model,
10706
+ introduction: override.introduction,
10707
+ prompt: override.prompt,
10708
+ tools: [...override.tools],
10709
+ tags: [...override.tags],
10710
+ ...greeting !== void 0 ? { greeting } : {}
10711
+ };
10712
+ }
10713
+
10094
10714
  // packages/cli/client/cliLocalAgentRecordReader.ts
10095
10715
  function resolveBuiltinLocalCliAgentConfig(agentRef, userId) {
10096
10716
  const normalized = agentRef.trim();
@@ -10123,7 +10743,10 @@ async function readAgentFromStore(args) {
10123
10743
  if (!record || typeof record !== "object") continue;
10124
10744
  return applyBuiltinAgentRuntimeOverride(
10125
10745
  args.agentRef,
10126
- resolveAgentRuntimeConfigFromRecord(key, record)
10746
+ resolveAgentRuntimeConfigFromRecord(
10747
+ key,
10748
+ applyPublicAgentCatalogOverride(record)
10749
+ )
10127
10750
  );
10128
10751
  }
10129
10752
  return resolveBuiltinPlatformAgentConfig(args.agentRef);
@@ -10492,6 +11115,9 @@ function waitForRunTerminal(args) {
10492
11115
  };
10493
11116
  const loop = Effect_exports.gen(function* () {
10494
11117
  token = args.claim?.acquire() ?? null;
11118
+ const deadline = Date.now() + args.timeoutMs;
11119
+ const maxIterations = Math.ceil(args.timeoutMs / Math.max(1, args.pollIntervalMs)) + 1;
11120
+ let iterations = 0;
10495
11121
  while (true) {
10496
11122
  const state = yield* readEffect(args.read);
10497
11123
  lastState = state;
@@ -10502,6 +11128,10 @@ function waitForRunTerminal(args) {
10502
11128
  }
10503
11129
  return { kind: "terminal", state };
10504
11130
  }
11131
+ iterations += 1;
11132
+ if (Date.now() >= deadline || iterations >= maxIterations) {
11133
+ return { kind: "timeout", waitedMs: args.timeoutMs, lastState };
11134
+ }
10505
11135
  const slept = yield* sleep(args.pollIntervalMs);
10506
11136
  if (slept === "aborted") return { kind: "aborted" };
10507
11137
  }
@@ -10926,6 +11556,12 @@ function buildRunStatusPayload(reconciled, deps, opts = {}) {
10926
11556
  endedAt: reconciled.endedAt ?? null,
10927
11557
  exitCode: reconciled.exitCode ?? null,
10928
11558
  ...reconciled.failureReason ? { failureReason: reconciled.failureReason } : {},
11559
+ // 结构化失败分类 + 可重试性:编排者据此决策,不再肉读 logTail。
11560
+ ...reconciled.failureClass ? { failureClass: reconciled.failureClass } : {},
11561
+ ...typeof reconciled.retryable === "boolean" ? { retryable: reconciled.retryable } : {},
11562
+ // 日志落盘路径始终暴露:stalled/failed 且 dialogId 缺失(如 ephemeral)
11563
+ // 时 logTail 只能靠它读,不能只留在进程内存。
11564
+ ...reconciled.logPath ? { logPath: reconciled.logPath } : {},
10929
11565
  ...typeof reconciled.toolCallCount === "number" ? { toolCallCount: reconciled.toolCallCount } : {},
10930
11566
  ...reconciled.lastAssistantText ? { lastAssistantText: reconciled.lastAssistantText } : {},
10931
11567
  // Non-ephemeral runs expose dialogId so the caller can read the
@@ -10960,6 +11596,40 @@ function buildRunStatusPayload(reconciled, deps, opts = {}) {
10960
11596
  }
10961
11597
  };
10962
11598
  }
11599
+ async function assertCredentialFanoutAllowed(deps, args) {
11600
+ let candidateGroup;
11601
+ if (deps.resolveAgentCredentialGroup) {
11602
+ try {
11603
+ candidateGroup = await deps.resolveAgentCredentialGroup(args.agentKey);
11604
+ } catch {
11605
+ candidateGroup = void 0;
11606
+ }
11607
+ }
11608
+ if (!candidateGroup && typeof args.credentialGroup === "string" && args.credentialGroup.trim()) {
11609
+ candidateGroup = args.credentialGroup.trim();
11610
+ }
11611
+ const { batchId, parentDialogId } = args;
11612
+ if (!batchId && !parentDialogId) return candidateGroup;
11613
+ const active = queryRunRecords({ limit: 500 }, deps).runs.filter((record) => {
11614
+ if (isRunTerminalStatus(record.status)) return false;
11615
+ if (batchId && record.batchId === batchId) return true;
11616
+ if (parentDialogId && record.parentDialogId === parentDialogId) return true;
11617
+ return false;
11618
+ }).map((record) => ({
11619
+ runId: record.runId,
11620
+ agentKey: record.agentKey,
11621
+ credentialGroup: record.credentialGroup
11622
+ }));
11623
+ if (active.length === 0) return candidateGroup;
11624
+ const verdict = checkCredentialFanout({
11625
+ active,
11626
+ candidate: { agentKey: args.agentKey, credentialGroup: candidateGroup },
11627
+ allowUnknownCredential: args.allowUnknownCredential === true,
11628
+ allowCredentialConcurrency: args.allowCredentialConcurrency === true
11629
+ });
11630
+ if (!verdict.allowed) throw new Error(verdict.message);
11631
+ return candidateGroup;
11632
+ }
10963
11633
  function createCliStartAgentRunExecutor(deps = {}) {
10964
11634
  return async (call) => {
10965
11635
  const args = parseCallArgs(call);
@@ -10982,6 +11652,14 @@ function createCliStartAgentRunExecutor(deps = {}) {
10982
11652
  ];
10983
11653
  const agentName = typeof args.agentName === "string" && args.agentName.trim() ? args.agentName.trim() : typeof args.name === "string" && args.name.trim() ? args.name.trim() : void 0;
10984
11654
  const batchId = typeof args.batchId === "string" && args.batchId.trim() ? args.batchId.trim() : void 0;
11655
+ const parentDialogId = typeof args.parentDialogId === "string" && args.parentDialogId.trim() ? args.parentDialogId.trim() : void 0;
11656
+ const credentialGroup = await assertCredentialFanoutAllowed(deps, {
11657
+ agentKey,
11658
+ ...batchId ? { batchId } : {},
11659
+ ...parentDialogId ? { parentDialogId } : {},
11660
+ ...typeof args.credentialGroup === "string" && args.credentialGroup.trim() ? { credentialGroup: args.credentialGroup.trim() } : {},
11661
+ allowUnknownCredential: args.allowUnknownCredential === true
11662
+ });
10985
11663
  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;
10986
11664
  const { runId, batchId: resolvedBatchId } = await spawnLocalBackgroundRun(
10987
11665
  {
@@ -10991,7 +11669,8 @@ function createCliStartAgentRunExecutor(deps = {}) {
10991
11669
  agentKey,
10992
11670
  ...agentName ? { agentName } : {},
10993
11671
  ...batchId ? { batchId } : {},
10994
- ...typeof args.parentDialogId === "string" && args.parentDialogId.trim() ? { parentDialogId: args.parentDialogId.trim() } : {},
11672
+ ...credentialGroup ? { credentialGroup } : {},
11673
+ ...parentDialogId ? { parentDialogId } : {},
10995
11674
  ...dodCommands && dodCommands.length > 0 ? { dodCommands } : {},
10996
11675
  cwd: deps.cwd ?? process.cwd(),
10997
11676
  message,
@@ -11077,6 +11756,8 @@ async function spawnContinuationRun(reconciled, userInput, deps) {
11077
11756
  ...agentName ? { agentName } : {},
11078
11757
  ...reconciled.batchId ? { batchId: reconciled.batchId } : {},
11079
11758
  ...reconciled.parentDialogId ? { parentDialogId: reconciled.parentDialogId } : {},
11759
+ // 续跑继承原 run 的凭证组(同一 agent),供并发扇出守卫判定。
11760
+ ...reconciled.credentialGroup ? { credentialGroup: reconciled.credentialGroup } : {},
11080
11761
  cwd: reconciled.cwd ?? deps.cwd ?? process.cwd(),
11081
11762
  message: userInput,
11082
11763
  ...reconciled.ephemeral ? { ephemeral: true } : {},
@@ -11675,7 +12356,8 @@ function buildLocalToolExecutors(args) {
11675
12356
  startAgentRun: createCliStartAgentRunExecutor({
11676
12357
  env: args.env,
11677
12358
  cliEntrypoint: args.cliEntrypoint,
11678
- cwd: args.workspaceRoot
12359
+ cwd: args.workspaceRoot,
12360
+ ...args.resolveAgentCredentialGroup ? { resolveAgentCredentialGroup: args.resolveAgentCredentialGroup } : {}
11679
12361
  }),
11680
12362
  controlAgentRun: createCliControlAgentRunExecutor({
11681
12363
  env: args.env
@@ -11809,13 +12491,18 @@ async function generateLocalDialogTitle(input) {
11809
12491
  return { title: fallbackTitle, source: "fallback" };
11810
12492
  }
11811
12493
  if (input.resolveProviderConfig && input.buildRequest && input.parseResponse) {
11812
- try {
11813
- const providerConfig = await input.resolveProviderConfig({
11814
- agentConfig: { ...BUILTIN_TITLE_LLM_CONFIG, key: BUILTIN_TITLE_LLM_CONFIG.id },
11815
- env
11816
- });
11817
- if (providerConfig?.authToken) {
11818
- const request = input.buildRequest({
12494
+ const resolveProviderConfig = input.resolveProviderConfig;
12495
+ const buildRequest = input.buildRequest;
12496
+ const parseResponse = input.parseResponse;
12497
+ const attemptPlatformTitle = async (model) => {
12498
+ try {
12499
+ const agentConfig = model ? { ...BUILTIN_TITLE_LLM_CONFIG, model } : BUILTIN_TITLE_LLM_CONFIG;
12500
+ const providerConfig = await resolveProviderConfig({
12501
+ agentConfig: { ...agentConfig, key: agentConfig.id },
12502
+ env
12503
+ });
12504
+ if (!providerConfig?.authToken) return null;
12505
+ const request = buildRequest({
11819
12506
  providerConfig,
11820
12507
  messages: [
11821
12508
  {
@@ -11847,21 +12534,26 @@ async function generateLocalDialogTitle(input) {
11847
12534
  body: JSON.stringify(patchedBody),
11848
12535
  signal: AbortSignal.timeout(timeoutMs)
11849
12536
  });
11850
- if (res.ok) {
11851
- const raw = await res.text().catch(() => "");
11852
- const data = safeParseJson(raw);
11853
- if (data) {
11854
- const parsed = input.parseResponse({ providerConfig, data });
11855
- const generated = normalizeDialogTitle(
11856
- extractTitleFromLlmContent(parsed.content)
11857
- );
11858
- if (generated) {
11859
- return { title: generated, source: "llm" };
11860
- }
11861
- }
11862
- }
12537
+ if (!res.ok) return null;
12538
+ const raw = await res.text().catch(() => "");
12539
+ const data = safeParseJson(raw);
12540
+ if (!data) return null;
12541
+ const parsed = parseResponse({ providerConfig, data });
12542
+ const generated = normalizeDialogTitle(
12543
+ extractTitleFromLlmContent(parsed.content)
12544
+ );
12545
+ return generated || null;
12546
+ } catch {
12547
+ return null;
11863
12548
  }
11864
- } catch {
12549
+ };
12550
+ const primaryTitle = await attemptPlatformTitle();
12551
+ if (primaryTitle) return { title: primaryTitle, source: "llm" };
12552
+ const fallbackModelTitle = await attemptPlatformTitle(
12553
+ BUILTIN_DIALOG_LLM_CHAT_FALLBACK_MODEL
12554
+ );
12555
+ if (fallbackModelTitle) {
12556
+ return { title: fallbackModelTitle, source: "llm" };
11865
12557
  }
11866
12558
  }
11867
12559
  if (input.resolveDirectProviderConfig) {
@@ -12526,6 +13218,23 @@ function createCliLocalRuntimeAdapter(deps) {
12526
13218
  const localToolUsage = /* @__PURE__ */ new Map();
12527
13219
  const buildProviderOpenAiTools = deps.buildProviderOpenAiTools ?? buildOpenAiTools;
12528
13220
  const additionalToolNames = deps.pastedTextStore ? ["readPastedText"] : [];
13221
+ const resolveAgentCredentialGroup = async (agentRef) => {
13222
+ try {
13223
+ const record = await readAgentFromStore({
13224
+ agentRef,
13225
+ store: await getOrCreateSharedStore(deps),
13226
+ userId
13227
+ });
13228
+ if (!record || typeof record !== "object") return void 0;
13229
+ const rec = record;
13230
+ const existing = typeof rec.credentialGroup === "string" && rec.credentialGroup.trim() ? rec.credentialGroup.trim() : void 0;
13231
+ if (existing) return existing;
13232
+ const ref = typeof rec.apiKeyRef === "string" && rec.apiKeyRef.trim() ? rec.apiKeyRef : typeof rec.credentialRef === "string" && rec.credentialRef.trim() ? rec.credentialRef : void 0;
13233
+ return deriveCredentialGroup(ref)?.credentialGroup;
13234
+ } catch {
13235
+ return void 0;
13236
+ }
13237
+ };
12529
13238
  let activeAgentToolNames = [];
12530
13239
  const workspaceRoot = deps.cwd ?? process.cwd();
12531
13240
  let runtimeToolExecutionLimits = {};
@@ -12538,6 +13247,7 @@ function createCliLocalRuntimeAdapter(deps) {
12538
13247
  readXPost: deps.readXPost,
12539
13248
  readXhsProfile: deps.readXhsProfile,
12540
13249
  cliEntrypoint: CLI_ENTRYPOINT,
13250
+ resolveAgentCredentialGroup,
12541
13251
  ...deps.confirmDestructiveAction ? { confirmDestructiveAction: deps.confirmDestructiveAction } : {},
12542
13252
  ...deps.requestUserChoice ? { requestUserChoice: deps.requestUserChoice } : {},
12543
13253
  ...deps.pastedTextStore ? { pastedTextStore: deps.pastedTextStore } : {},
@@ -12615,13 +13325,21 @@ function createCliLocalRuntimeAdapter(deps) {
12615
13325
  readXPost: deps.readXPost,
12616
13326
  readXhsProfile: deps.readXhsProfile,
12617
13327
  cliEntrypoint: CLI_ENTRYPOINT,
13328
+ resolveAgentCredentialGroup,
12618
13329
  ...deps.confirmDestructiveAction ? { confirmDestructiveAction: deps.confirmDestructiveAction } : {},
12619
13330
  ...deps.requestUserChoice ? { requestUserChoice: deps.requestUserChoice } : {},
12620
13331
  ...deps.pastedTextStore ? { pastedTextStore: deps.pastedTextStore } : {},
12621
13332
  agentKey: agentConfig?.key,
12622
13333
  ...runtimeToolExecutionLimits
12623
13334
  });
12624
- const exposedAgentConfig = agentConfig ? { ...agentConfig, exposedToolNames: activeAgentToolNames } : agentConfig;
13335
+ const exposedAgentConfig = agentConfig ? {
13336
+ ...agentConfig,
13337
+ exposedToolNames: activeAgentToolNames,
13338
+ toolSurface: {
13339
+ ...agentConfig.toolSurface ?? {},
13340
+ finalToolNames: activeAgentToolNames
13341
+ }
13342
+ } : agentConfig;
12625
13343
  if (exposedAgentConfig && !deps.pastedTextStore) {
12626
13344
  preparedAgentRuntimeCache.set(cacheKey, {
12627
13345
  agentConfig: exposedAgentConfig,
@@ -12807,6 +13525,11 @@ function createCliLocalRuntimeAdapter(deps) {
12807
13525
  runToolNames: activeAgentToolNames,
12808
13526
  call: injectedCall,
12809
13527
  executors: localToolExecutors,
13528
+ // 分发前参数闸门:只覆盖 agent-runtime 工具族(workspace + nolo
13529
+ // workspace)。ai/tools registry 的工具不接——它们有各自的前置 policy
13530
+ // guard 与结构化结果契约(例:createTable 的 capture 确认守卫),
13531
+ // 闸门抢先拦截会覆盖这些语义(见 toolArgumentGate.ts 的范围说明)。
13532
+ toolParametersIndex: getAgentRuntimeToolParametersIndex(),
12810
13533
  abortSignal: opts?.abortSignal,
12811
13534
  detachMs: resolveExecShellDetachMs(deps.env),
12812
13535
  ...deps.confirmDestructiveAction ? { confirmDestructiveAction: deps.confirmDestructiveAction } : {}
@@ -12878,6 +13601,7 @@ export {
12878
13601
  dailyWelcomeTip,
12879
13602
  t,
12880
13603
  toolLabel,
13604
+ toolLabelVariants,
12881
13605
  agentRunCardLabels,
12882
13606
  createCliLocalRuntimeAdapter
12883
13607
  };