nolo-cli 0.16.0-alpha.2 → 0.16.0-alpha.21

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 (136) hide show
  1. package/{_executeModel-QAUS6B7J.js → _executeModel-GRCQXT5R.js} +51 -45
  2. package/{action-GUOZYYGN.js → action-LT7BRFLK.js} +10 -9
  3. package/{addContentAction-QDGHGUBH.js → addContentAction-PL3KKBDH.js} +9 -8
  4. package/{addDialogAgentAction-Z4YCYZIV.js → addDialogAgentAction-FCMSKYAF.js} +8 -7
  5. package/{agentDeleteCommand-365DMKHW.js → agentDeleteCommand-WNL3CNQX.js} +32 -29
  6. package/{agentEmailCommands-TQMXL36I.js → agentEmailCommands-MPEUMRAS.js} +63 -57
  7. package/{agentListCommands-6B5X4RC6.js → agentListCommands-YO4AOQMS.js} +31 -28
  8. package/{agentMachineCommands-LOEARB6V.js → agentMachineCommands-WYM6YRYJ.js} +30 -27
  9. package/{agentPullCommand-6HWUT3SW.js → agentPullCommand-ZZGU5KOY.js} +4 -4
  10. package/agentRecordCommands-BVWSHMIY.js +105 -0
  11. package/{agentRunCommand-SGMH67WT.js → agentRunCommand-E3ZI6RSF.js} +64 -55
  12. package/{agentRunControl-6ADXVYMR.js → agentRunControl-Y5AFH5PQ.js} +24 -1
  13. package/{agentRuntimeLocal-YSYZ33ER.js → agentRuntimeLocal-P4VGX6H6.js} +26 -25
  14. package/{agentSlice-IVE735EV.js → agentSlice-D33GU3JL.js} +9 -8
  15. package/{appDeleteCommands-6QYOO3JB.js → appDeleteCommands-VA4R2SWX.js} +29 -26
  16. package/{appDeployCommands-WTCT6XO6.js → appDeployCommands-JWMWQNG6.js} +29 -26
  17. package/{appDeployStatusCommands-CGWGZJKB.js → appDeployStatusCommands-KYXGLZSQ.js} +29 -26
  18. package/{appGetCommands-O4OCAMRW.js → appGetCommands-ELOO3JG6.js} +29 -26
  19. package/{appListCommands-UENFP4XY.js → appListCommands-SJUW4RLW.js} +29 -26
  20. package/{authCommand-YFTR3347.js → authCommand-WJZPOLSS.js} +16 -9
  21. package/{authCommands-YXGOXNBZ.js → authCommands-XTBV7OFZ.js} +6 -5
  22. package/{chunk-RKM3K52F.js → chunk-34WPV75U.js} +23 -2
  23. package/{chunk-VPTJB4HM.js → chunk-3ND52WIL.js} +2 -5
  24. package/{chunk-SOTZ6RDN.js → chunk-3Q7WHGCB.js} +1 -1
  25. package/{chunk-KKY4B2Q2.js → chunk-4PWB7JRR.js} +4 -1
  26. package/{chunk-U7LEGLEB.js → chunk-4T5F7YZQ.js} +1 -1
  27. package/{chunk-OQMPU2ML.js → chunk-5PGGCJGV.js} +6 -6
  28. package/chunk-7BUYEZ6U.js +671 -0
  29. package/{chunk-AS3ZQ3O2.js → chunk-7OBMZCRD.js} +1 -1
  30. package/{chunk-WA6KZL5V.js → chunk-AAODAAUQ.js} +23 -20
  31. package/{chunk-GRTFNYLR.js → chunk-AKVLLMOU.js} +3 -3
  32. package/{chunk-QLUFR47U.js → chunk-AL2V7U3E.js} +1 -1
  33. package/{chunk-MTU75CZ2.js → chunk-B5TOXZAK.js} +1 -1
  34. package/{chunk-QZVGMD5F.js → chunk-BE2GNT5E.js} +2 -8
  35. package/{chunk-JKWWVF2I.js → chunk-D3HVJJIA.js} +1 -1
  36. package/{chunk-B4KT7RN2.js → chunk-DKZFOK24.js} +18 -89
  37. package/chunk-DL6EPNIK.js +50 -0
  38. package/{chunk-YYIRR6QC.js → chunk-E5KQTMMJ.js} +212 -250
  39. package/{chunk-4QQFLN5C.js → chunk-EGPCU42M.js} +58 -8
  40. package/{chunk-XVP3C2KY.js → chunk-ELT65PZW.js} +2 -2
  41. package/{chunk-EMXI3N3Z.js → chunk-ENP2ELIL.js} +5 -5
  42. package/{chunk-6565R2TI.js → chunk-EXAEHRLI.js} +112 -191
  43. package/chunk-FQZZLA3C.js +223 -0
  44. package/{chunk-WPN6RMDF.js → chunk-GMZZ5EKJ.js} +3 -3
  45. package/{chunk-RSYUDGGZ.js → chunk-HQNPCMWL.js} +3 -3
  46. package/{chunk-OGGHETUE.js → chunk-HQPG2PIV.js} +62 -19
  47. package/{chunk-4NLUNENX.js → chunk-IQZ6TGVW.js} +10 -3
  48. package/{chunk-VE6XMVKG.js → chunk-J67FKTTY.js} +330 -213
  49. package/{chunk-G2MKOQCB.js → chunk-JFE7XW4D.js} +1 -1
  50. package/{setDialogExtraReferencesAction-2VLGWQKG.js → chunk-JLA4FXYC.js} +2 -17
  51. package/{chunk-OOIN7HSO.js → chunk-JP7REMYP.js} +19 -1
  52. package/chunk-KFEVY3ST.js +255 -0
  53. package/{chunk-I66RU7P7.js → chunk-KKWJ5VPZ.js} +1 -1
  54. package/{chunk-WRN5EQT7.js → chunk-L2RRMXNJ.js} +13 -4
  55. package/{chunk-ISYE6GZB.js → chunk-L6NVTGI7.js} +1 -1
  56. package/{chunk-HRQCKQA5.js → chunk-MUCU6ATG.js} +8 -257
  57. package/{chunk-BFRVXJJJ.js → chunk-MUIT5AAM.js} +112 -27
  58. package/{chunk-WNLPAOIT.js → chunk-MVQ4TBSD.js} +1 -1
  59. package/{chunk-O53CP2QR.js → chunk-N2HYIBLH.js} +6 -6
  60. package/{chunk-524BDL33.js → chunk-O6W2O2DA.js} +1 -15
  61. package/{chunk-YC3DJILJ.js → chunk-PUSK7HXJ.js} +64 -22
  62. package/{chunk-OOSFSFMA.js → chunk-R5V5G73M.js} +2 -0
  63. package/{chunk-4IJYA27C.js → chunk-RG2U2MTJ.js} +1 -1
  64. package/{chunk-Z24FGIU2.js → chunk-RIDWN7AP.js} +34 -15
  65. package/{chunk-IKXL2HZ3.js → chunk-RK5NYQEL.js} +1 -1
  66. package/{chunk-QLFCNUVQ.js → chunk-RUTSBLDM.js} +1629 -261
  67. package/{chunk-TTGAVETO.js → chunk-RVOUXDFU.js} +5 -5
  68. package/{chunk-JTINRTBT.js → chunk-SKDNBYZK.js} +2 -2
  69. package/{chunk-KMQPSTMJ.js → chunk-TRT4I4UD.js} +2 -2
  70. package/{chunk-EHLHSX7R.js → chunk-UB4RYYNQ.js} +9 -2
  71. package/{chunk-N5424GSW.js → chunk-UGUW3FHG.js} +4 -4
  72. package/{chunk-YNHQIXX5.js → chunk-UIOYWBU7.js} +395 -326
  73. package/chunk-V5R4NZP2.js +78 -0
  74. package/{chunk-MYMMNKYL.js → chunk-VNAEBGDK.js} +156 -6
  75. package/{chunk-J55UHASN.js → chunk-VST53WEL.js} +1 -1
  76. package/{chunk-6MHDWKOT.js → chunk-VVKQFITN.js} +25 -12
  77. package/{chunk-W4NVOSFF.js → chunk-WFHXMLHZ.js} +1 -1
  78. package/{chunk-H33743XH.js → chunk-WJRJDX2W.js} +1 -1
  79. package/chunk-X4Q4UZEY.js +26 -0
  80. package/{chunk-E237VE6U.js → chunk-XFYDGBXL.js} +4 -4
  81. package/{chunk-JS33TCQ3.js → chunk-XHG22OEX.js} +4 -4
  82. package/{chunk-DVRHHFEA.js → chunk-XMLRJUU5.js} +1 -1
  83. package/{chunk-V2J635L5.js → chunk-XOIF2TNF.js} +2 -2
  84. package/{chunk-SFXYKGK2.js → chunk-XRZJGPFI.js} +7 -7
  85. package/chunk-ZHXJ6M7T.js +27 -0
  86. package/chunk-ZZ2MH7LE.js +84 -0
  87. package/{cliExecutor-K3F7DMRO.js → cliExecutor-DNE7TCC4.js} +2 -2
  88. package/codingSkills-36KN5NQT.js +48 -0
  89. package/{createAgentAutomationAction-TS6NNZ4X.js → createAgentAutomationAction-ONKZ46XE.js} +22 -21
  90. package/{createDialogAction-5HVQ33EX.js → createDialogAction-7QWJEBKU.js} +24 -23
  91. package/{createPageAction-4F3ZGQJD.js → createPageAction-PB3KXZIA.js} +28 -27
  92. package/{dbSlice-OP6UPXKA.js → dbSlice-CGSRFJN3.js} +8 -7
  93. package/{deleteFile-WPWVZE4B.js → deleteFile-WDZ3VM7B.js} +3 -3
  94. package/{dialogCommands-ZL6L24BS.js → dialogCommands-YZFU4Q26.js} +30 -27
  95. package/{dialogSlice-FAWUQDJW.js → dialogSlice-53B5ISGQ.js} +22 -21
  96. package/{docCreateCommands-LYROQTFH.js → docCreateCommands-LOUC5PFB.js} +28 -25
  97. package/{docDeleteCommands-6TWGTZNR.js → docDeleteCommands-HHPGT4BR.js} +29 -26
  98. package/{docReadCommands-PRULNF26.js → docReadCommands-YPSN4HEF.js} +28 -25
  99. package/{docStore-2UHVWLTV.js → docStore-LJXXRB5W.js} +23 -22
  100. package/{docUpdateCommands-NNYYWJBI.js → docUpdateCommands-CJCZO54M.js} +28 -25
  101. package/{fetchMessages-KTNM7QAR.js → fetchMessages-BMGVZVSE.js} +4 -3
  102. package/{getPricing-UGDJHI7M.js → getPricing-RYY6OBA4.js} +4 -4
  103. package/handleSendMessageAction-ICGX4QCM.js +402 -0
  104. package/index.js +68 -68
  105. package/{localDialogRead-2VRI24F4.js → localDialogRead-HQZPVIE3.js} +1 -1
  106. package/{localRuntimeDb-LGDF6FQP.js → localRuntimeDb-THJZGAOJ.js} +1 -1
  107. package/{machineCommands-JQPEQFSE.js → machineCommands-YLDZXK4D.js} +64 -58
  108. package/{machineWsRunDispatch-FFFNWVEW.js → machineWsRunDispatch-LTQL3DRE.js} +56 -50
  109. package/{models-LSCRJJ6P.js → models-5K5G2CZI.js} +2 -2
  110. package/package.json +1 -1
  111. package/queryRunOverlay-O4LOMMPO.js +161 -0
  112. package/{read-HXHAZBKH.js → read-3FMPZPER.js} +3 -3
  113. package/{readDocTool-VPBDTO4G.js → readDocTool-VSYHKK3V.js} +1 -1
  114. package/{readlineWorkspace-QSXHSBHA.js → readlineWorkspace-OSPVWNAT.js} +699 -168
  115. package/{removeDialogAgentAction-HUFVN35S.js → removeDialogAgentAction-OAGA2G3U.js} +11 -10
  116. package/{runAgentClientLoop-A75BUU6D.js → runAgentClientLoop-76SUKKPX.js} +46 -40
  117. package/runOverlayPresentation-ZO4VCWEU.js +11 -0
  118. package/{runtimeDoctorCommands-THIHX2SY.js → runtimeDoctorCommands-E2OUORHK.js} +6 -6
  119. package/setDialogExtraReferencesAction-JZEXA5SL.js +27 -0
  120. package/{setPrimaryDialogAgentAction-VB4UV2CC.js → setPrimaryDialogAgentAction-4ZUQQKDG.js} +27 -18
  121. package/{settingSlice-7JYPQNAC.js → settingSlice-7MNKHZ6R.js} +9 -8
  122. package/{skillDiscovery-6M2BZUFN.js → skillDiscovery-KJWT7JBU.js} +3 -3
  123. package/{spaceCommands-4LE45GB7.js → spaceCommands-GIF7MKVD.js} +31 -28
  124. package/{spaceSlice-444MFUP6.js → spaceSlice-M4PVN5PO.js} +22 -21
  125. package/{streamAgentChatTurn-DJAE7USZ.js → streamAgentChatTurn-GCKTFSHQ.js} +96 -55
  126. package/{tableCommands-3P7MJ3PF.js → tableCommands-BEQAGE4I.js} +1 -1
  127. package/{tools-YB6LXSVN.js → tools-RJVFXOLR.js} +35 -30
  128. package/{tuiSummaryLlmCaller-QQL3JA5I.js → tuiSummaryLlmCaller-VUNVBRX3.js} +7 -6
  129. package/types-ZSTJ7MPR.js +7 -0
  130. package/{updateDialogTitleAction-6HGFBM64.js → updateDialogTitleAction-PSR67DLV.js} +25 -24
  131. package/agentRecordCommands-DCH2WBL2.js +0 -99
  132. package/chunk-BYXBJQAS.js +0 -0
  133. package/handleSendMessageAction-LJPUYNOH.js +0 -215
  134. package/{chunk-O4BU24WZ.js → chunk-6Y7A3OQQ.js} +3 -3
  135. package/{chunk-CMKUBIGW.js → chunk-X7W4TNB4.js} +3 -3
  136. package/{localRuntimeAuthority-TEGCOWX4.js → localRuntimeAuthority-4IXJCHZ7.js} +3 -3
@@ -8,45 +8,39 @@ import {
8
8
  import {
9
9
  sortSafeAgentSummaries,
10
10
  toSafeAgentSummary
11
- } from "./chunk-OOIN7HSO.js";
11
+ } from "./chunk-JP7REMYP.js";
12
12
  import {
13
13
  getUserDataItemTimestamp,
14
14
  mergeAndDedupUserData
15
15
  } from "./chunk-KQHGZWSV.js";
16
- import {
17
- createDocState
18
- } from "./chunk-O53CP2QR.js";
19
16
  import {
20
17
  readDocFunc,
21
18
  readDocFunctionSchema,
22
19
  readPageFunc,
23
20
  readPageFunctionSchema,
24
21
  slateToSimplifiedMarkdown
25
- } from "./chunk-U7LEGLEB.js";
22
+ } from "./chunk-4T5F7YZQ.js";
26
23
  import {
27
24
  markdownToSlate
28
25
  } from "./chunk-3LY4F7SV.js";
26
+ import {
27
+ isSkillSummaryMarker
28
+ } from "./chunk-VF4K2QE6.js";
29
+ import {
30
+ createDocState
31
+ } from "./chunk-N2HYIBLH.js";
32
+ import {
33
+ setDialogExtraReferencesAction
34
+ } from "./chunk-JLA4FXYC.js";
29
35
  import {
30
36
  extractMentionsFromSlate
31
37
  } from "./chunk-VP4WJWKW.js";
32
38
  import {
33
39
  slateToRenderMarkdown
34
40
  } from "./chunk-63W5N6P3.js";
35
- import {
36
- isSkillSummaryMarker
37
- } from "./chunk-VF4K2QE6.js";
38
41
  import {
39
42
  createDialogAction
40
- } from "./chunk-Z24FGIU2.js";
41
- import {
42
- buildSkillDocMarkdown,
43
- normalizeSkillBudgetTier,
44
- normalizeSkillModalities,
45
- normalizeStringArray,
46
- parseExternalSkillMarkdown,
47
- parseSkillDocProtocol,
48
- resolvePageSkillMetadata
49
- } from "./chunk-VC6OZXO5.js";
43
+ } from "./chunk-RIDWN7AP.js";
50
44
  import {
51
45
  addCategory,
52
46
  addContentToSpace,
@@ -63,6 +57,7 @@ import {
63
57
  instance,
64
58
  loadTableRows,
65
59
  normalizeAppRouteId,
60
+ resolveDialogRuntimeAgentKey,
66
61
  selectAllMemberSpaces,
67
62
  selectAllMsgs,
68
63
  selectCurrentDialogConfig,
@@ -76,19 +71,31 @@ import {
76
71
  updateContentCategory,
77
72
  updateContentTitle,
78
73
  updateStep
79
- } from "./chunk-YNHQIXX5.js";
74
+ } from "./chunk-UIOYWBU7.js";
80
75
  import {
81
76
  createAgent,
82
77
  runLlm,
83
78
  streamAgentChatTurn,
84
79
  updateAgent
85
- } from "./chunk-OQMPU2ML.js";
80
+ } from "./chunk-5PGGCJGV.js";
81
+ import {
82
+ buildCodingSkillContentBySlug,
83
+ buildCodingSkillPageKey,
84
+ resolveCodingBuiltinSlug
85
+ } from "./chunk-7BUYEZ6U.js";
86
+ import {
87
+ buildSkillDocMarkdown,
88
+ normalizeSkillBudgetTier,
89
+ normalizeSkillModalities,
90
+ normalizeStringArray,
91
+ parseExternalSkillMarkdown,
92
+ parseSkillDocProtocol,
93
+ resolvePageSkillMetadata
94
+ } from "./chunk-VC6OZXO5.js";
86
95
  import {
87
96
  NOLO_WORKSPACE_TOOL_NAMES,
88
97
  buildNoloSubjectRefQueryTarget,
89
98
  buildNoloTableQueryRequest,
90
- canonicalizeToolName,
91
- canonicalizeToolNames,
92
99
  clampNoloPositiveInteger,
93
100
  filterNoloDialogSubjectRefEvidence,
94
101
  getNoloComparableUpdatedAt,
@@ -98,13 +105,25 @@ import {
98
105
  redactAgentRecordForWorkspaceTool,
99
106
  resolveNoloDialogInput,
100
107
  verifyNoloDialogSubjectRefQuery
101
- } from "./chunk-B4KT7RN2.js";
108
+ } from "./chunk-DKZFOK24.js";
102
109
  import {
103
110
  buildDatabaseFileContentUrl
104
- } from "./chunk-4QQFLN5C.js";
111
+ } from "./chunk-EGPCU42M.js";
105
112
  import {
106
113
  DEFAULT_MODEL
107
- } from "./chunk-OGGHETUE.js";
114
+ } from "./chunk-HQPG2PIV.js";
115
+ import {
116
+ toErrorMessage
117
+ } from "./chunk-HNMXYYJR.js";
118
+ import {
119
+ addContentAction,
120
+ createSpaceKey,
121
+ normalizeSpaceId
122
+ } from "./chunk-ELT65PZW.js";
123
+ import {
124
+ canonicalizeToolName,
125
+ canonicalizeToolNames
126
+ } from "./chunk-ZZ2MH7LE.js";
108
127
  import {
109
128
  ToolApiError,
110
129
  buildToolRequestHeaders,
@@ -126,11 +145,16 @@ import {
126
145
  compactWhitespace
127
146
  } from "./chunk-DWLEOOGR.js";
128
147
  import {
129
- toErrorMessage
130
- } from "./chunk-HNMXYYJR.js";
148
+ TASK_PREVIEW_MAX,
149
+ formatListRunsCard,
150
+ formatStartRunCard,
151
+ formatStatusRunCard,
152
+ formatStopRunCard,
153
+ resolveRunLabel
154
+ } from "./chunk-FQZZLA3C.js";
131
155
  import {
132
156
  shareResourceAction
133
- } from "./chunk-N5424GSW.js";
157
+ } from "./chunk-UGUW3FHG.js";
134
158
  import {
135
159
  AGENT_UPDATE_FIELD_NAMES,
136
160
  SYSTEM_AGENT_CAPABILITIES,
@@ -139,23 +163,19 @@ import {
139
163
  selectAutoApproveSelfUpdateFields,
140
164
  selectCurrentServer,
141
165
  selectSyncServers
142
- } from "./chunk-TTGAVETO.js";
166
+ } from "./chunk-RVOUXDFU.js";
143
167
  import {
144
168
  asRecordOrEmpty
145
169
  } from "./chunk-KX6YBIHG.js";
146
- import {
147
- addContentAction,
148
- createSpaceKey,
149
- normalizeSpaceId
150
- } from "./chunk-XVP3C2KY.js";
151
170
  import {
152
171
  patch,
153
172
  read,
154
173
  readAndWait,
155
174
  readAndWaitAction,
175
+ selectById,
156
176
  toTimestampMs,
157
177
  write
158
- } from "./chunk-SFXYKGK2.js";
178
+ } from "./chunk-XRZJGPFI.js";
159
179
  import {
160
180
  SEPARATOR,
161
181
  createAgentKey,
@@ -167,20 +187,20 @@ import {
167
187
  rowKey,
168
188
  toTrimmedString,
169
189
  ulid
170
- } from "./chunk-O4BU24WZ.js";
190
+ } from "./chunk-6Y7A3OQQ.js";
191
+ import {
192
+ asOptionalFiniteNumber
193
+ } from "./chunk-WWC7I6TA.js";
171
194
  import {
172
195
  asNonEmptyStringArray,
173
196
  asTrimmedNonEmptyStringArray
174
197
  } from "./chunk-I42VC5KR.js";
175
- import {
176
- asOptionalFiniteNumber
177
- } from "./chunk-WWC7I6TA.js";
178
198
  import {
179
199
  asTrimmedLowercaseString
180
200
  } from "./chunk-QSJ3HFEF.js";
181
201
  import {
182
202
  readAction
183
- } from "./chunk-VPTJB4HM.js";
203
+ } from "./chunk-3ND52WIL.js";
184
204
  import {
185
205
  createAsyncThunk,
186
206
  getRuntimeServerContext,
@@ -188,10 +208,10 @@ import {
188
208
  selectIdentityToken,
189
209
  selectIdentityUserId,
190
210
  selectRuntimeSnapshot
191
- } from "./chunk-DVRHHFEA.js";
211
+ } from "./chunk-XMLRJUU5.js";
192
212
  import {
193
213
  isAbortError
194
- } from "./chunk-OOSFSFMA.js";
214
+ } from "./chunk-R5V5G73M.js";
195
215
  import {
196
216
  asTrimmedString
197
217
  } from "./chunk-3EUW3WEO.js";
@@ -992,7 +1012,7 @@ var ai_locale_default = {
992
1012
  params: {
993
1013
  name: "The name of the Agent, e.g., 'Meeting Minutes Assistant'.",
994
1014
  model: "The model name to use. Logic: Default 'nolo/glm-5.2'. Complex tasks: 'openai/gpt-5.2'. Cost-saving: 'openai/gpt-5.1'. Aesthetic/Creative: 'gemini-3.6-flash'. Reliable low-cost summary/reasoning: 'deepseek-v4-pro'. Image Generation: 'gemini-3-pro-image-preview' (Best/Expensive), 'gemini-3.1-flash-image-preview' (Ordinary), or 'gemini-3.1-flash-lite-image' (Fastest/Cheapest).",
995
- provider: "The model provider identifier, must match the selected model, e.g., 'openrouter', 'deepseek', 'fireworks', 'mistral', etc.",
1015
+ provider: "The model provider identifier, must match the selected model, e.g., 'openrouter', 'nolo', 'fireworks', 'mistral', etc.",
996
1016
  prompt: "System prompt/instruction describing the Agent's role, tone, and usage.",
997
1017
  introduction: "Introduction displayed in the app market or list, explanatory text for end users.",
998
1018
  greeting: {
@@ -1381,7 +1401,7 @@ var ai_locale_default = {
1381
1401
  params: {
1382
1402
  name: "Agent \u7684\u540D\u79F0\uFF0C\u4F8B\u5982\uFF1A'\u4F1A\u8BAE\u7EAA\u8981\u52A9\u624B'\u3002",
1383
1403
  model: "\u9ED8\u8BA4\u4F7F\u7528 'nolo/glm-5.2'\u3002\u590D\u6742\u4EFB\u52A1: 'openai/gpt-5.2'\u3002\u7701\u6210\u672C\u4F46\u590D\u6742: 'openai/gpt-5.1'\u3002\u8FFD\u6C42\u7F8E\u89C2/\u521B\u610F: 'gemini-3.6-flash'\u3002\u4F4E\u6210\u672C\u6458\u8981/\u63A8\u7406: 'deepseek-v4-pro'\u3002\u751F\u6210\u56FE\u7247: \u8D35/\u9AD8\u8D28\u91CF\u9009 'gemini-3-pro-image-preview'\uFF0C\u666E\u901A\u9009 'gemini-3.1-flash-image-preview'\uFF0C\u6700\u5FEB\u6700\u4FBF\u5B9C\u9009 'gemini-3.1-flash-lite-image'\u3002",
1384
- provider: "\u6A21\u578B\u63D0\u4F9B\u65B9\u6807\u8BC6\uFF0C\u5FC5\u987B\u4E0E\u6240\u9009\u6A21\u578B\u76F8\u5339\u914D\uFF0C\u4F8B\u5982 'openrouter'\u3001'deepseek'\u3001'fireworks'\u3001'mistral' \u7B49\u3002",
1404
+ provider: "\u6A21\u578B\u63D0\u4F9B\u65B9\u6807\u8BC6\uFF0C\u5FC5\u987B\u4E0E\u6240\u9009\u6A21\u578B\u76F8\u5339\u914D\uFF0C\u4F8B\u5982 'openrouter'\u3001'nolo'\u3001'fireworks'\u3001'mistral' \u7B49\u3002",
1385
1405
  prompt: "\u7CFB\u7EDF\u63D0\u793A\u8BCD / \u6307\u4EE4\uFF0C\u63CF\u8FF0\u8FD9\u4E2A Agent \u7684\u89D2\u8272\u3001\u8BED\u6C14\u548C\u4F7F\u7528\u65B9\u5F0F\u3002",
1386
1406
  introduction: "\u5728\u5E94\u7528\u5E02\u573A\u6216\u5217\u8868\u4E2D\u5C55\u793A\u7684\u7B80\u4ECB\uFF0C\u9762\u5411\u7EC8\u7AEF\u7528\u6237\u7684\u8BF4\u660E\u6587\u6848\u3002",
1387
1407
  greeting: {
@@ -2101,6 +2121,7 @@ var chat_locale_default = {
2101
2121
  copyContent: "Copy Content",
2102
2122
  copyDiagnostics: "Copy diagnostics",
2103
2123
  finishReasonLengthNotice: "Response was cut off at the model's output limit",
2124
+ retryProgress: "Auto-retrying {{attempt}}/{{maxAttempts}} \xB7 {{seconds}}s",
2104
2125
  copyFailed: "Copy failed",
2105
2126
  copySuccess: "Copied successfully",
2106
2127
  createDialog: "Create Dialog",
@@ -2462,6 +2483,7 @@ var chat_locale_default = {
2462
2483
  copyContent: "\u590D\u5236\u5185\u5BB9",
2463
2484
  copyDiagnostics: "\u590D\u5236\u8BCA\u65AD\u4FE1\u606F",
2464
2485
  finishReasonLengthNotice: "\u56DE\u7B54\u56E0\u8FBE\u5230\u6A21\u578B\u8F93\u51FA\u4E0A\u9650\u88AB\u622A\u65AD",
2486
+ retryProgress: "\u81EA\u52A8\u91CD\u8BD5 {{attempt}}/{{maxAttempts}} \xB7 {{seconds}}s",
2465
2487
  copyFailed: "\u590D\u5236\u5931\u8D25",
2466
2488
  copySuccess: "\u590D\u5236\u6210\u529F",
2467
2489
  createDialog: "\u521B\u5EFA\u5BF9\u8BDD",
@@ -2818,6 +2840,7 @@ var chat_locale_default = {
2818
2840
  copyContent: "\u8907\u88FD\u5167\u5BB9",
2819
2841
  copyDiagnostics: "\u8907\u88FD\u8A3A\u65B7\u8CC7\u8A0A",
2820
2842
  finishReasonLengthNotice: "\u56DE\u7B54\u56E0\u9054\u5230\u6A21\u578B\u8F38\u51FA\u4E0A\u9650\u88AB\u622A\u65B7",
2843
+ retryProgress: "\u81EA\u52D5\u91CD\u8A66 {{attempt}}/{{maxAttempts}} \xB7 {{seconds}}s",
2821
2844
  copyFailed: "\u8907\u88FD\u5931\u6557",
2822
2845
  copySuccess: "\u8907\u88FD\u6210\u529F",
2823
2846
  createDialog: "\u5275\u5EFA\u5C0D\u8A71",
@@ -3102,6 +3125,7 @@ var chat_locale_default = {
3102
3125
  copyContent: "\u30B3\u30F3\u30C6\u30F3\u30C4\u3092\u30B3\u30D4\u30FC",
3103
3126
  copyDiagnostics: "\u8A3A\u65AD\u60C5\u5831\u3092\u30B3\u30D4\u30FC",
3104
3127
  finishReasonLengthNotice: "\u30E2\u30C7\u30EB\u306E\u51FA\u529B\u4E0A\u9650\u306B\u9054\u3057\u305F\u305F\u3081\u3001\u56DE\u7B54\u304C\u9014\u4E2D\u3067\u7D42\u4E86\u3057\u307E\u3057\u305F",
3128
+ retryProgress: "\u81EA\u52D5\u30EA\u30C8\u30E9\u30A4 {{attempt}}/{{maxAttempts}} \xB7 {{seconds}}s",
3105
3129
  copyFailed: "\u30B3\u30D4\u30FC\u306B\u5931\u6557\u3057\u307E\u3057\u305F",
3106
3130
  copySuccess: "\u30B3\u30D4\u30FC\u306B\u6210\u529F\u3057\u307E\u3057\u305F",
3107
3131
  createDialog: "\u5BFE\u8A71\u3092\u4F5C\u6210",
@@ -5577,6 +5601,9 @@ var interface_locale_default = {
5577
5601
  windowsDesc: "One-click installer for Windows.",
5578
5602
  linuxTitle: "Linux",
5579
5603
  linuxDesc: "Native package for your environment.",
5604
+ linuxTarInstallHint: "Extract and run bin/launcher \u2014 no install needed.",
5605
+ linuxDebInstallHint: "sudo apt install ./nolo-desktop_amd64.deb",
5606
+ linuxRpmInstallHint: "sudo dnf install ./nolo-desktop_x86_64.rpm",
5580
5607
  macosTitle: "macOS",
5581
5608
  macosDesc: "Optimized for Apple Silicon.",
5582
5609
  macosDmgInstaller: {
@@ -5613,7 +5640,6 @@ var interface_locale_default = {
5613
5640
  pricingTitle: "Pricing Details",
5614
5641
  pricingDesc: "View pricing rules",
5615
5642
  guideTitle: "User Guide",
5616
- guideDesc: "Quick start tips",
5617
5643
  downloadClientTitle: "Download Client",
5618
5644
  downloadClientDesc: "Install Nolo on desktop and mobile devices",
5619
5645
  feedbackTitle: "Give Feedback",
@@ -6804,6 +6830,9 @@ var interface_locale_default = {
6804
6830
  windowsDesc: "Windows \u4E00\u952E\u5B89\u88C5\u5305\u3002",
6805
6831
  linuxTitle: "Linux",
6806
6832
  linuxDesc: "\u9002\u914D\u4F60\u672C\u5730\u73AF\u5883\u7684\u539F\u751F\u5305\u3002",
6833
+ linuxTarInstallHint: "\u89E3\u538B\u540E\u8FD0\u884C bin/launcher\uFF0C\u65E0\u9700\u5B89\u88C5\u3002",
6834
+ linuxDebInstallHint: "sudo apt install ./nolo-desktop_amd64.deb",
6835
+ linuxRpmInstallHint: "sudo dnf install ./nolo-desktop_x86_64.rpm",
6807
6836
  macosTitle: "macOS",
6808
6837
  macosDesc: "\u4E3A Apple Silicon \u4F18\u5316\u3002",
6809
6838
  macosDmgInstaller: {
@@ -6840,7 +6869,6 @@ var interface_locale_default = {
6840
6869
  pricingTitle: "\u8BA1\u8D39\u8BE6\u60C5",
6841
6870
  pricingDesc: "\u67E5\u770B\u4EF7\u683C\u89C4\u5219",
6842
6871
  guideTitle: "\u4F7F\u7528\u6307\u5357",
6843
- guideDesc: "\u5FEB\u901F\u4E0A\u624B\u6280\u5DE7",
6844
6872
  downloadClientTitle: "\u4E0B\u8F7D\u5BA2\u6237\u7AEF",
6845
6873
  downloadClientDesc: "\u5B89\u88C5\u684C\u9762\u7AEF\u548C\u79FB\u52A8\u7AEF\uFF0C\u6362\u8BBE\u5907\u4E5F\u80FD\u7EE7\u7EED\u7528",
6846
6874
  feedbackTitle: "\u610F\u89C1\u53CD\u9988",
@@ -8067,7 +8095,6 @@ var interface_locale_default = {
8067
8095
  pricingTitle: "\u8A08\u8CBB\u8A73\u60C5",
8068
8096
  pricingDesc: "\u67E5\u770B\u50F9\u683C\u898F\u5247",
8069
8097
  guideTitle: "\u4F7F\u7528\u6307\u5357",
8070
- guideDesc: "\u5FEB\u901F\u4E0A\u624B\u6280\u5DE7",
8071
8098
  downloadClientTitle: "\u4E0B\u8F09\u5BA2\u6236\u7AEF",
8072
8099
  downloadClientDesc: "\u5B89\u88DD\u684C\u9762\u7AEF\u548C\u884C\u52D5\u7AEF\uFF0C\u63DB\u88DD\u7F6E\u4E5F\u80FD\u7E7C\u7E8C\u7528",
8073
8100
  feedbackTitle: "\u610F\u898B\u56DE\u994B",
@@ -9216,7 +9243,6 @@ var interface_locale_default = {
9216
9243
  pricingTitle: "\u6599\u91D1\u8A73\u7D30",
9217
9244
  pricingDesc: "\u6599\u91D1\u30EB\u30FC\u30EB\u3092\u78BA\u8A8D",
9218
9245
  guideTitle: "\u4F7F\u3044\u65B9\u30AC\u30A4\u30C9",
9219
- guideDesc: "\u30AF\u30A4\u30C3\u30AF\u30B9\u30BF\u30FC\u30C8\u306E\u30B3\u30C4",
9220
9246
  downloadClientTitle: "\u30AF\u30E9\u30A4\u30A2\u30F3\u30C8\u3092\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9",
9221
9247
  downloadClientDesc: "\u30C7\u30B9\u30AF\u30C8\u30C3\u30D7\u3068\u30E2\u30D0\u30A4\u30EB\u306B Nolo \u3092\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB",
9222
9248
  feedbackTitle: "\u30D5\u30A3\u30FC\u30C9\u30D0\u30C3\u30AF",
@@ -11205,7 +11231,7 @@ var i18n_default = instance;
11205
11231
  var TOOL_PACKS = {
11206
11232
  // L1 - 核心:交互 + 自我更新,所有 Agent 必有。
11207
11233
  // rememberMemory 已移至「长期记忆」能力包(defaultEnabled:true),用户可单关。
11208
- CORE: ["ui_ask_choice", "read", "searchDialogMessages", "createDoc", "updateDoc", "search_workspace", "search_all_spaces", "updateSelf", "queryModelUsage", "queryUserGrowthReport", "createAgentAutomation", "notifyUser"],
11234
+ CORE: ["ask_user", "read", "searchDialogMessages", "createDoc", "updateDoc", "search_workspace", "search_all_spaces", "updateSelf", "queryModelUsage", "queryUserGrowthReport", "createAgentAutomation", "notifyUser"],
11209
11235
  // L2 - 联网搜索:与 CAPABILITY_PACKS「web-search」对齐。
11210
11236
  // 社交读工具属于「social-reader」包,不得因 exa_search 被旁路注入。
11211
11237
  LIGHT_WEB: ["exa_search", "fetchWebpage"],
@@ -11226,8 +11252,8 @@ var CAPABILITY_PACKS = [
11226
11252
  {
11227
11253
  id: "long-term-memory",
11228
11254
  label: "\u957F\u671F\u8BB0\u5FC6",
11229
- description: "\u8BA9 agent \u80FD\u628A\u503C\u5F97\u957F\u671F\u4FDD\u7559\u7684\u7528\u6237\u504F\u597D\u3001\u534F\u4F5C\u7EA6\u5B9A\u5199\u6210 episodic memory\uFF0C\u8DE8\u5BF9\u8BDD\u590D\u7528\u3002",
11230
- tools: ["rememberMemory"],
11255
+ description: "\u5BF9\u8BDD\u524D\u81EA\u52A8\u8F7D\u5165\u9AD8\u76F8\u5173\u8BB0\u5FC6\uFF0C\u5E76\u5141\u8BB8 agent \u6309\u9700\u67E5\u8BE2\u6216\u5199\u5165\u957F\u671F\u8BB0\u5FC6\u3002",
11256
+ tools: ["queryMemory", "rememberMemory"],
11231
11257
  defaultEnabled: true,
11232
11258
  icon: "\u{1F9E0}"
11233
11259
  },
@@ -11266,7 +11292,30 @@ var CAPABILITY_PACKS = [
11266
11292
  "listProcesses"
11267
11293
  ],
11268
11294
  defaultEnabled: false,
11269
- icon: "\u{1F4BB}"
11295
+ icon: "\u{1F4BB}",
11296
+ promptPatch: `# \u4EE3\u7801\u6267\u884C\u80FD\u529B\u5305 \u2014 \u64CD\u4F5C\u7EAA\u5F8B
11297
+
11298
+ ## \u6548\u7387\u4F18\u5148\uFF08\u7701 token\uFF09
11299
+ - \u4E0D\u590D\u8FF0\u9700\u6C42\uFF0C\u4E0D\u89E3\u91CA\u300C\u6253\u7B97\u600E\u4E48\u505A\u300D\uFF0C\u76F4\u63A5\u52A8\u624B\u3002\u6539\u5B8C\u53EA\u7528\u4E00\u4E24\u53E5\u8BDD\u8BF4\u6E05\u300C\u6539\u4E86\u4EC0\u4E48\u3001\u53BB\u54EA\u770B\u300D\u3002
11300
+ - \u601D\u8003\u7B80\u77ED\uFF1A\u5B9A\u4F4D\u95EE\u9898\u5373\u53EF\uFF0C\u4E0D\u505A\u957F\u7BC7\u63A8\u6F14\u3002
11301
+ - \u5C0F\u6539\u52A8\u8D70\u6700\u77ED\u8DEF\u5F84\uFF1AsearchFiles/globFiles \u5B9A\u4F4D \u2192 readFile \u786E\u8BA4 \u2192 editFile \u7CBE\u786E\u66FF\u6362\u3002\u80FD\u4E00\u6B21\u547D\u4E2D\u5C31\u4E0D\u8981\u53CD\u590D\u8BFB\u6587\u4EF6\u3002
11302
+ - \u5DF2\u7ECF\u77E5\u9053\u6587\u4EF6\u548C\u4F4D\u7F6E\u65F6\uFF0C\u8DF3\u8FC7\u591A\u4F59\u7684 search/read\uFF0C\u76F4\u63A5 edit\u3002
11303
+ - \u7981\u6B62\u4E3A\u4E00\u4E2A\u5C0F\u6539\u52A8\u6574\u9875\u91CD\u5199\u6216\u8FDE\u5E26\u6539\u52A8\u672A\u547D\u4E2D\u7684\u90E8\u5206\u3002
11304
+
11305
+ ## \u4EE3\u7801\u4FEE\u6539\u7EAA\u5F8B
11306
+ - \u7F16\u8F91\u524D\u5148 readFile \u786E\u8BA4\u5F53\u524D\u5185\u5BB9\uFF0C\u907F\u514D stale hash \u9519\u8BEF\u3002
11307
+ - \u53EA\u78B0\u4EFB\u52A1\u4E66\u5217\u51FA\u7684\u6587\u4EF6\uFF1B\u6539\u5B8C\u7528 \`git status --short\` \u81EA\u67E5\uFF0C\u82E5\u6539\u5230\u6E05\u5355\u5916\u6587\u4EF6\uFF0C\u5982\u5B9E\u62A5\u544A\u3002
11308
+ - \u4E0D\u8981 \`git add\` / \`git commit\` / \`git push\` / \`git stash\` / \`git reset\` / \`git checkout\` / \`git clean\`\u2014\u2014\u6539\u52A8\u7559\u5728\u5DE5\u4F5C\u533A\uFF0C\u63D0\u4EA4\u7531\u8C03\u7528\u65B9\u9A8C\u6536\u540E\u5904\u7406\u3002\u4ED3\u5E93\u5E38\u6709\u591A\u4E2A\u4F1A\u8BDD\u5171\u7528\u4E00\u4E2A checkout\uFF0C\u4F60\u4E00\u63D0\u4EA4\u5C31\u4F1A\u628A\u522B\u4EBA\u7684\u5728\u9014\u6587\u4EF6\u5377\u8FDB\u6765\u3002
11309
+ - \u53EA\u8DD1\u4EFB\u52A1\u91CC\u5217\u51FA\u7684\u6D4B\u8BD5\u6587\u4EF6\uFF0C\u4E0D\u8981\u8DD1 broader \u6D4B\u8BD5\uFF08broaden \u6D4B\u8BD5\u7684\u5931\u8D25\u662F\u9884\u5B58\u7684\uFF0C\u548C\u4F60\u7684\u6539\u52A8\u65E0\u5173\uFF09\u3002
11310
+
11311
+ ## Review \u7EAA\u5F8B\uFF08commit \u524D\u786C\u95E8\uFF09
11312
+ - \u9664 \u22642 \u6B65\u96F6\u903B\u8F91\u98CE\u9669\u7684\u673A\u68B0\u6539\u52A8\uFF08\u9519\u522B\u5B57/\u683C\u5F0F/CSS \u5FAE\u8C03\uFF09\u5916\uFF0C\u6240\u6709\u4EE3\u7801\u53D8\u66F4 commit \u524D\u5FC5\u987B\u5148\u6D3E**\u5176\u4ED6 agent**\uFF08\u4E0D\u540C\u6A21\u578B\u5BB6\u65CF\u4F18\u5148\uFF09review \u5DE5\u4F5C\u533A diff\uFF08\`git diff\`\uFF0C\u672A\u63D0\u4EA4\u7684\u6539\u52A8\uFF09\u3002reviewer \u4E0D\u53EF\u662F\u81EA\u5DF1\u3002\u65E0 review \u4E0D commit\u2014\u2014\u8FD9\u662F\u786C\u95E8\uFF0C\u4E0D\u662F\u5EFA\u8BAE\u3002
11313
+ - \u6D3E\u53D1\u8D70 \`startAgentRun(agentKey, task, { ephemeral: true })\`\uFF08web/\u684C\u9762\u7AEF\u6CA1\u6709 nolo CLI\uFF0C\u6240\u6709 host \u90FD\u6709\u8FD9\u4E2A\u5DE5\u5177\uFF09\u3002ephemeral \u8BA9 review \u5B8C\u6210\u540E\u4E0D\u7559 dialog \u8BB0\u5F55\u3002
11314
+ - task \u91CC\u5FC5\u987B\u5199\u660E\u5BA1\u67E5\u5BF9\u8C61\uFF08\`git diff\` \u770B\u5DE5\u4F5C\u533A\u6539\u52A8\uFF0C\u6216 \`git diff alpha...HEAD\` \u770B\u5DF2\u63D0\u4EA4\u6539\u52A8\uFF09\uFF0C\u5426\u5219 reviewer \u4E0D\u77E5\u9053\u5BA1\u4EC0\u4E48\u3002
11315
+ - \u6309\u89D2\u8272\u52A0\u8F7D\u5BF9\u5E94 skill\uFF1Areviewer \u5148 \`loadSkill("coding-review")\` \u62FF\u901A\u7528\u6D41\u7A0B\uFF0C\u518D\u6309\u89D2\u8272 \`loadSkill("coding-review-<role>")\` \u62FF\u68C0\u67E5\u9879\u3002\u89D2\u8272\u6E05\u5355\uFF1Acode-quality\uFF08**\u5FC5\u8DD1**\uFF09/ architecture\uFF08**\u5355\u72EC\u6D3E\u53D1**\uFF0C\u4E2D\u7EA7\u4EE5\u4E0A\u95EE\u9898\uFF09/ security\uFF08\u6309\u9700 + \u5B89\u5168\u654F\u611F\u89E6\u53D1\u5FC5\u8DD1\uFF09/ frontend-ux\uFF08\u6D89\u53CA UI \u65F6\uFF09/ backend-data\uFF08\u6D89\u53CA server \u65F6\uFF09\u3002\u89D2\u8272\u5207\u5272\u7684\u76EE\u7684\u662F\u6CE8\u610F\u529B\u9694\u79BB\u2014\u2014\u6BCF\u4E2A\u89D2\u8272\u53EA\u76EF\u81EA\u5DF1\u7684\u68C0\u67E5\u9762\uFF0C\u6309\u9700\u542F\u7528\uFF0C\u907F\u514D\u4E00\u4E2A reviewer \u80CC\u6240\u6709\u89D2\u8272\u5BFC\u81F4\u6CE8\u610F\u529B\u7A00\u91CA\u3002
11316
+ - Verdict \u6807\u51C6\uFF1AAPPROVE\uFF08\u65E0 CRITICAL \u6216 HIGH\uFF09\u2192 \u53EF commit\uFF1BWARNING\uFF08\u4EC5 HIGH\uFF09\u2192 \u62A5\u544A owner \u51B3\u5B9A\uFF1BBLOCK\uFF08\u6709 CRITICAL\uFF09\u2192 \u5FC5\u987B\u5148\u4FEE\u3002
11317
+ - review \u53EF\u80FD\u591A\u8F6E\u6536\u655B\uFF08\u6709 finding\u2192\u4FEE\u2192\u518D\u5BA1\u2192\u76F4\u5230 APPROVE\uFF09\u3002\u6BCF\u8F6E review \u662F\u65E0\u4E0A\u4E0B\u6587\u7684\u2014\u2014reviewer \u53EA\u770B\u5F53\u524D\u5DE5\u4F5C\u533A diff\uFF0C\u4E0D\u5E26\u4E0A\u4E00\u8F6E finding \u8BB0\u5FC6\u3002
11318
+ - \u82E5\u5904\u4E8E\u5355 Agent \u72EC\u5360\u73AF\u5883\u3001\u5176\u4ED6 agent \u4E0D\u53EF\u8FBE\u3001\u6216\u7528\u6237\u660E\u786E\u8981\u6C42\u76F4\u63A5\u63D0\u4EA4\uFF0C\u5141\u8BB8\u5E26\u539F\u56E0\u8DF3\u8FC7\uFF08commit message \u6CE8\u660E [no-review: \u539F\u56E0]\uFF09\uFF0C\u4F46\u9ED8\u8BA4\u5FC5\u987B\u6D3E review\u3002`
11270
11319
  },
11271
11320
  {
11272
11321
  id: "skills",
@@ -11434,7 +11483,7 @@ function appendEnabledPackPromptPatches(prompt, enabledPacks) {
11434
11483
 
11435
11484
  ${addition}`;
11436
11485
  }
11437
- var FORCED_TOOLS = ["ui_ask_choice"];
11486
+ var FORCED_TOOLS = ["ask_user"];
11438
11487
  function applyDisabledTools(toolNames, disabledTools) {
11439
11488
  if (!Array.isArray(disabledTools) || disabledTools.length === 0) {
11440
11489
  return toolNames;
@@ -11483,7 +11532,7 @@ var HOSTED_EXEC_RUNTIME_TOOL_POLICY = {
11483
11532
  workspace: { mode: "lease" }
11484
11533
  };
11485
11534
  var findModelConfig = async (modelName, provider) => {
11486
- const { ALL_MODELS } = await import("./models-LSCRJJ6P.js");
11535
+ const { ALL_MODELS } = await import("./models-5K5G2CZI.js");
11487
11536
  const name = toTrimmedString(modelName);
11488
11537
  const prov = toTrimmedString(provider ?? "");
11489
11538
  if (!name) return null;
@@ -11724,7 +11773,7 @@ var buildFormDataFromArgs = async (args) => {
11724
11773
  const trimmedModel = toTrimmedString(model);
11725
11774
  const trimmedProvider = toTrimmedString(provider);
11726
11775
  const modelConfig = await findModelConfig(trimmedModel, trimmedProvider);
11727
- const { getModelPricing } = await import("./getPricing-UGDJHI7M.js");
11776
+ const { getModelPricing } = await import("./getPricing-RYY6OBA4.js");
11728
11777
  const normalizedTools = tools ?? [];
11729
11778
  const resolvedRuntimeToolPolicy = runtimeToolPolicy ?? (normalizedTools.includes("execShell") ? HOSTED_EXEC_RUNTIME_TOOL_POLICY : void 0);
11730
11779
  const formData = {
@@ -12386,7 +12435,7 @@ var createSkillDocFunctionSchema = {
12386
12435
  description: [
12387
12436
  "\u521B\u5EFA\u4E00\u4E2A\u672C\u5730 skill \u6587\u6863\uFF0C\u5E76\u81EA\u52A8\u5199\u5165\u9690\u85CF\u7684 skill-config / eval-config \u534F\u8BAE\u5757\u3002",
12388
12437
  "\u9002\u5408\u628A\u67D0\u4E2A\u80FD\u529B\u6D41\u7A0B\u6C89\u6DC0\u6210\u53EF\u88AB agent \u5F15\u7528\u7684 skill\uFF0C\u800C\u4E0D\u662F\u624B\u5199\u534F\u8BAE\u6CE8\u91CA\u3002",
12389
- "\u521B\u5EFA\u6210\u529F\u540E\uFF0C\u5982\u679C\u7528\u6237\u8FD8\u6CA1\u8BF4\u660E\u4E0B\u4E00\u6B65\uFF0C\u4F18\u5148\u8C03\u7528 ui_ask_choice \u7EE7\u7EED\u8BE2\u95EE\uFF1A\u4EC5\u4FDD\u5B58\u3001\u6302\u5230\u73B0\u6709 Agent\uFF0C\u8FD8\u662F\u65B0\u5EFA\u4E00\u4E2A Agent \u6765\u4F7F\u7528\u5B83\u3002"
12438
+ "\u521B\u5EFA\u6210\u529F\u540E\uFF0C\u5982\u679C\u7528\u6237\u8FD8\u6CA1\u8BF4\u660E\u4E0B\u4E00\u6B65\uFF0C\u4F18\u5148\u8C03\u7528 ask_user \u7EE7\u7EED\u8BE2\u95EE\uFF1A\u4EC5\u4FDD\u5B58\u3001\u6302\u5230\u73B0\u6709 Agent\uFF0C\u8FD8\u662F\u65B0\u5EFA\u4E00\u4E2A Agent \u6765\u4F7F\u7528\u5B83\u3002"
12390
12439
  ].join("\n"),
12391
12440
  parameters: {
12392
12441
  type: "object",
@@ -12809,7 +12858,7 @@ var importSkillFunctionSchema = {
12809
12858
  description: [
12810
12859
  "\u4ECE\u5916\u90E8 SKILL.md\u3001GitHub \u5730\u5740\u6216\u539F\u59CB Markdown \u6587\u672C\u5BFC\u5165\u4E00\u4E2A skill\uFF0C\u5E76\u4FDD\u5B58\u4E3A\u5F53\u524D\u7A7A\u95F4\u4E2D\u7684\u666E\u901A\u6587\u6863\u3002",
12811
12860
  "\u5BFC\u5165\u540E\u4F1A\u81EA\u52A8\u9644\u52A0\u9690\u85CF\u7684 skill-config \u534F\u8BAE\u5757\uFF1B\u65E0\u6CD5\u6620\u5C04\u7684\u811A\u672C\u73AF\u5883\u4F1A\u964D\u7EA7\u4E3A\u8BF4\u660E\u578B skill\u3002",
12812
- "\u5BFC\u5165\u6210\u529F\u540E\uFF0C\u5982\u679C\u7528\u6237\u8FD8\u6CA1\u8BF4\u660E\u4E0B\u4E00\u6B65\uFF0C\u4F18\u5148\u8C03\u7528 ui_ask_choice \u7EE7\u7EED\u8BE2\u95EE\uFF1A\u4EC5\u4FDD\u5B58\u3001\u6302\u5230\u73B0\u6709 Agent\uFF0C\u8FD8\u662F\u65B0\u5EFA\u4E00\u4E2A Agent \u6765\u4F7F\u7528\u5B83\u3002"
12861
+ "\u5BFC\u5165\u6210\u529F\u540E\uFF0C\u5982\u679C\u7528\u6237\u8FD8\u6CA1\u8BF4\u660E\u4E0B\u4E00\u6B65\uFF0C\u4F18\u5148\u8C03\u7528 ask_user \u7EE7\u7EED\u8BE2\u95EE\uFF1A\u4EC5\u4FDD\u5B58\u3001\u6302\u5230\u73B0\u6709 Agent\uFF0C\u8FD8\u662F\u65B0\u5EFA\u4E00\u4E2A Agent \u6765\u4F7F\u7528\u5B83\u3002"
12813
12862
  ].join("\n"),
12814
12863
  parameters: {
12815
12864
  type: "object",
@@ -12911,7 +12960,8 @@ var loadSkillFunctionSchema = {
12911
12960
  description: [
12912
12961
  "\u6309\u540D\u79F0\u52A0\u8F7D\u4E00\u4E2A\u5DF2\u4FDD\u5B58\u7684 skill \u6587\u6863\uFF0C\u8FD4\u56DE\u5176\u5B8C\u6574\u6307\u4EE4\u6B63\u6587\u3002",
12913
12962
  "name \u4F7F\u7528 skill \u4FDD\u5B58\u65F6\u5199\u5165 skill-config \u7684 name\uFF08\u4E5F\u63A5\u53D7 skillId\uFF09\u3002",
12914
- "\u627E\u4E0D\u5230\u5BF9\u5E94 skill \u65F6\u8FD4\u56DE\u5F53\u524D\u53EF\u7528\u7684 skill \u540D\u79F0\u5217\u8868\uFF08\u4E0D\u62A5\u9519\uFF09\u3002"
12963
+ "\u627E\u4E0D\u5230\u5BF9\u5E94 skill \u65F6\u8FD4\u56DE\u5F53\u524D\u53EF\u7528\u7684 skill \u540D\u79F0\u5217\u8868\uFF08\u4E0D\u62A5\u9519\uFF09\u3002",
12964
+ '\u7CFB\u7EDF\u5185\u7F6E\u5199\u4EE3\u7801\u6280\u80FD\uFF1A\u5BF9\u8BDD\u8F6C\u5411\u5199\u4EE3\u7801\u65F6\u7528 loadSkill("coding") \u8F7D\u5165\u5199\u4EE3\u7801\u80FD\u529B\u4E0E\u4EE3\u7801\u5BA1\u67E5\u7EAA\u5F8B\uFF08\u542B review \u89D2\u8272\u5207\u5272\uFF09\u3002'
12915
12965
  ].join("\n"),
12916
12966
  parameters: {
12917
12967
  type: "object",
@@ -13003,7 +13053,33 @@ async function loadSkillFunc(args, thunkApi) {
13003
13053
  const requestedName = asTrimmedString(args?.name);
13004
13054
  if (!requestedName) throw new Error("loadSkill \u9700\u8981\u63D0\u4F9B name\u3002");
13005
13055
  const candidates = await listSkillCandidates(thunkApi);
13006
- const matched = matchSkillCandidate(candidates, requestedName);
13056
+ let matched = matchSkillCandidate(candidates, requestedName);
13057
+ const builtinSlug = !matched ? resolveCodingBuiltinSlug(requestedName) : null;
13058
+ if (builtinSlug) {
13059
+ const runtime2 = getRuntime(thunkApi);
13060
+ const userId = runtime2?.currentUserId;
13061
+ const body2 = buildCodingSkillContentBySlug(builtinSlug);
13062
+ const dbKey = userId ? buildCodingSkillPageKey(userId, builtinSlug) : builtinSlug;
13063
+ if (userId) {
13064
+ try {
13065
+ const { ensureCodingSkills } = await import("./codingSkills-36KN5NQT.js");
13066
+ await ensureCodingSkills(userId)(thunkApi?.dispatch ?? (() => Promise.resolve()));
13067
+ } catch {
13068
+ }
13069
+ }
13070
+ await persistLoadedSkillReference(thunkApi, dbKey, requestedName);
13071
+ return {
13072
+ rawData: {
13073
+ success: true,
13074
+ name: requestedName,
13075
+ dbKey,
13076
+ body: body2
13077
+ },
13078
+ displayData: `Skill "${requestedName}" loaded inline. Follow its instructions.
13079
+
13080
+ ${body2}`
13081
+ };
13082
+ }
13007
13083
  if (!matched) {
13008
13084
  const availableNames = Array.from(
13009
13085
  new Set(candidates.map((candidate) => candidate.name))
@@ -13025,6 +13101,7 @@ async function loadSkillFunc(args, thunkApi) {
13025
13101
  dbKey: matched.dbKey
13026
13102
  });
13027
13103
  const body = extractSkillBody(page);
13104
+ await persistLoadedSkillReference(thunkApi, matched.dbKey, requestedName);
13028
13105
  return {
13029
13106
  rawData: {
13030
13107
  success: true,
@@ -13037,6 +13114,27 @@ async function loadSkillFunc(args, thunkApi) {
13037
13114
  ${body}`
13038
13115
  };
13039
13116
  }
13117
+ async function persistLoadedSkillReference(thunkApi, dbKey, name) {
13118
+ try {
13119
+ const state = thunkApi?.getState?.();
13120
+ const currentDialogKey = getActiveDialogKey();
13121
+ if (!state || !currentDialogKey) return;
13122
+ const dialogConfig = selectById(
13123
+ state,
13124
+ currentDialogKey
13125
+ );
13126
+ const existing = dialogConfig?.extraReferences ?? [];
13127
+ const alreadyMounted = existing.some((ref) => ref.dbKey === dbKey);
13128
+ if (alreadyMounted) return;
13129
+ const newRef = {
13130
+ dbKey,
13131
+ title: name,
13132
+ type: "instruction"
13133
+ };
13134
+ await setDialogExtraReferencesAction([...existing, newRef], thunkApi);
13135
+ } catch {
13136
+ }
13137
+ }
13040
13138
 
13041
13139
  // packages/ai/tools/category/createCategoryTool.ts
13042
13140
  var createCategoryFunctionSchema = {
@@ -14154,7 +14252,7 @@ async function deleteDialogsFunc(args, thunkApi) {
14154
14252
  const deletedDialogIds = [];
14155
14253
  const deletedDialogKeys = [];
14156
14254
  const failures = [];
14157
- const { deleteDialog } = await import("./dialogSlice-FAWUQDJW.js");
14255
+ const { deleteDialog } = await import("./dialogSlice-53B5ISGQ.js");
14158
14256
  for (const target of targets) {
14159
14257
  try {
14160
14258
  await thunkApi.dispatch(deleteDialog(target.dbKey)).unwrap();
@@ -14220,10 +14318,11 @@ function formatAgentListCard(agents, maxDisplay = 20) {
14220
14318
  const visible = agents.slice(0, maxDisplay);
14221
14319
  for (const agent of visible) {
14222
14320
  const star = agent.isFavorite ? "\u2605" : " ";
14321
+ const own = agent.isOwned ? "\u25CE" : " ";
14223
14322
  const name = agent.name || "(unnamed)";
14224
14323
  const model = agent.model || "\u2014";
14225
14324
  const source = agent.apiSource || agent.provider || agent.cliProvider || "\u2014";
14226
- lines.push(`${star} ${name} ${model} ${source}`);
14325
+ lines.push(`${star}${own} ${name} ${model} ${source}`);
14227
14326
  }
14228
14327
  if (total > maxDisplay) {
14229
14328
  lines.push(`\u2026 +${total - maxDisplay} more`);
@@ -14232,7 +14331,7 @@ function formatAgentListCard(agents, maxDisplay = 20) {
14232
14331
  }
14233
14332
  var listAgentsFunctionSchema = {
14234
14333
  name: "listAgents",
14235
- description: "List the current user's Nolo agents as safe summaries. Use readAgent with the selected id/publicKey to resolve the runnable agentKey before delegation.",
14334
+ description: "List the current user's Nolo agents as safe summaries. The `agents` array in the JSON result carries each agent's runnable `agentKey` (agent-<userId>-<id> for owned, agent-pub-<id> for public) plus model, apiSource, tools, prices, isOwned, isFavorite. Copy `agentKey` verbatim into startAgentRun/callAgent. Prefer isOwned agents (use your own quota, no platform credits).",
14236
14335
  parameters: {
14237
14336
  type: "object",
14238
14337
  properties: {
@@ -14281,11 +14380,14 @@ async function listAgentsFunc(args, thunkApi) {
14281
14380
  }
14282
14381
  var readAgentFunctionSchema = {
14283
14382
  name: "readAgent",
14284
- description: "Read one Nolo agent config.",
14383
+ description: "Read one agent's full config from the Nolo workspace. Accepts an agent dbKey (agent-xxx), plain id, alias, or agent URL; resolves it (including public agents via agent-pub-<id>; the server runtime also falls back to handle lookup) and returns the runnable agentKey plus a redacted record with fields such as model, provider, apiSource, tools, prompt, inputPrice, outputPrice, and isPublic. Use it to inspect an agent's full capabilities/credential status before delegation. Note: startAgentRun/callAgent take the exact agentKey from listAgents/readAgent; readAgent is not required before every dispatch when listAgents already gave you the key.",
14285
14384
  parameters: {
14286
14385
  type: "object",
14287
14386
  properties: {
14288
- agent: { type: "string", description: "Agent key, id, alias, or URL." }
14387
+ agent: {
14388
+ type: "string",
14389
+ description: "Agent dbKey (e.g. agent-xxx), agent id, alias, or agent URL."
14390
+ }
14289
14391
  },
14290
14392
  required: ["agent"]
14291
14393
  }
@@ -14418,7 +14520,7 @@ var readSkillDocFunctionSchema = {
14418
14520
  }
14419
14521
  };
14420
14522
  async function readSkillDocFunc(args, thunkApi) {
14421
- const { buildReadDocResult } = await import("./readDocTool-VPBDTO4G.js");
14523
+ const { buildReadDocResult } = await import("./readDocTool-VSYHKK3V.js");
14422
14524
  const id = args?.id ?? args?.doc ?? args?.docKey ?? args?.pageKey;
14423
14525
  if (typeof id !== "string" || !id.trim()) {
14424
14526
  throw new Error("readSkillDoc requires id or doc.");
@@ -19868,7 +19970,7 @@ var selectUserIdFromState = (state) => typeof state?.auth?.currentUser?.userId =
19868
19970
  var selectCurrentServerFromState = (state) => typeof state?.settings?.currentServer === "string" ? state.settings.currentServer : null;
19869
19971
  async function addImageContentToSpace(input) {
19870
19972
  const injectedAddContentAction = input.thunkApi?.extra?.addContentAction;
19871
- const addContentAction2 = typeof injectedAddContentAction === "function" ? injectedAddContentAction : (await import("./addContentAction-QDGHGUBH.js")).addContentAction;
19973
+ const addContentAction2 = typeof injectedAddContentAction === "function" ? injectedAddContentAction : (await import("./addContentAction-PL3KKBDH.js")).addContentAction;
19872
19974
  await addContentAction2(
19873
19975
  {
19874
19976
  spaceId: input.spaceId,
@@ -20620,10 +20722,20 @@ var rememberMemoryFunctionSchema = {
20620
20722
  "\u53EA\u6709\u91CD\u590D\u51FA\u73B0\u7684\u53EF\u6267\u884C\u6D41\u7A0B/\u6392\u969C\u6B65\u9AA4\u624D\u4F20 kind=procedural\uFF1B\u4E00\u822C\u504F\u597D\u548C\u4E8B\u5B9E\u4FDD\u6301\u9ED8\u8BA4 episodic\u3002",
20621
20723
  "scope \u6309\u5185\u5BB9\u6027\u8D28\u9009\uFF0C\u4E0D\u56FA\u5B9A\u4F18\u5148\u67D0\u4E00\u5C42\uFF1A",
20622
20724
  " - Space \u534F\u4F5C\u7EA6\u5B9A/\u56E2\u961F\u89C4\u5219 \u2192 scope=space\uFF08\u5F53\u524D dialog \u7ED1\u5B9A space \u65F6\uFF09",
20623
- " - \u7528\u6237\u4E2A\u4EBA\u8EAB\u4EFD\u6216\u7EAF\u4E2A\u4EBA\u504F\u597D \u2192 scope=auto\uFF08\u9ED8\u8BA4\u8BB0\u5230\u7528\u6237\uFF09",
20624
- " - \u4E0E\u5F53\u524D Agent \u6302\u94A9\u7684\u6709\u6548\u505A\u6CD5 \u2192 scope=auto\uFF08runtime \u81EA\u52A8\u628A subject \u6807\u8BB0\u4E3A\u5F53\u524D Agent\uFF09",
20725
+ " - \u7528\u6237\u4E2A\u4EBA\u8EAB\u4EFD\u6216\u7EAF\u4E2A\u4EBA\u504F\u597D \u2192 scope=user\uFF08\u4E25\u683C\u4FDD\u5B58\u4E3A\u7528\u6237\u4E3B\u4F53\uFF09",
20726
+ " - \u4E0E\u5F53\u524D\u52A9\u624B\u5173\u7CFB\u6302\u94A9\u7684\u504F\u597D\u6216\u6709\u6548\u505A\u6CD5 \u2192 scope=auto\uFF08runtime \u4F7F\u7528\u5F53\u524D auto/fixed \u52A9\u624B\u4E3B\u4F53\uFF09",
20625
20727
  " - \u5F53\u524D\u4EFB\u52A1\u7684\u4E34\u65F6\u8FDB\u5EA6 \u2192 \u4E0D\u8981\u8C03\u7528\uFF0C\u8D70\u5BF9\u8BDD\u4E0A\u4E0B\u6587",
20626
- "\u5199\u6210\u4E00\u53E5\u7B80\u6D01\u3001\u672A\u6765\u4ECD\u53EF\u7406\u89E3\u7684\u8BDD\u3002\u9ED8\u8BA4\u9759\u9ED8\u6267\u884C\uFF0C\u4E0D\u7528\u5411\u7528\u6237\u6C47\u62A5\u5DF2\u8BB0\u4F4F\u3002"
20728
+ "\u5199\u6210\u4E00\u53E5\u7B80\u6D01\u3001\u672A\u6765\u4ECD\u53EF\u7406\u89E3\u7684\u8BDD\u3002\u9ED8\u8BA4\u9759\u9ED8\u6267\u884C\uFF0C\u4E0D\u7528\u5411\u7528\u6237\u6C47\u62A5\u5DF2\u8BB0\u4F4F\u3002",
20729
+ "",
20730
+ "\u3010\u5173\u952E\u89C4\u5219\u3011\u8BB0\u5FC6\u4E0D\u53EF\u7269\u7406\u5220\u9664\uFF0C\u53EA\u80FD\u964D\u7EA7/\u5F52\u6863/\u6807\u6CE8\u3002",
20731
+ "\u7269\u7406\u5220\u9664\u4F1A\u5207\u65AD\u89E3\u91CA\u94FE\u2014\u2014\u7CFB\u7EDF\u65E0\u6CD5\u56DE\u7B54'\u4E3A\u4EC0\u4E48\u53D8\u4E86'\u3001'\u66FE\u7ECF\u4FE1\u4EC0\u4E48'\u3002",
20732
+ "\u9519\u8BEF\u7684\u8BB0\u5FC6\u5E94\u901A\u8FC7 rememberMemory \u4FEE\u6B63\u5E76\u964D\u6743\uFF08\u964D\u4F4E\u7F6E\u4FE1\u5EA6\uFF09\uFF0C\u800C\u4E0D\u662F\u5220\u9664\u3002",
20733
+ "",
20734
+ "\u3010\u7F6E\u4FE1\u5EA6\u6765\u6E90\u3011\u6BCF\u6761\u8BB0\u5FC6\u5FC5\u987B\u6807\u6CE8\u6765\u6E90\uFF08\u4F9B\u53EC\u56DE\u65F6\u5224\u65AD\u53EF\u4FE1\u5EA6\uFF09\uFF1A",
20735
+ " - verified\uFF1A\u5DE5\u5177/\u547D\u4EE4\u5B9E\u6D4B\u9A8C\u8BC1\u8FC7\uFF08\u9AD8\u7F6E\u4FE1\u5EA6\uFF09",
20736
+ " - stated\uFF1A\u7528\u6237\u660E\u786E\u9648\u8FF0\uFF08\u4E2D\u9AD8\u7F6E\u4FE1\u5EA6\uFF09",
20737
+ " - inferred\uFF1A\u6A21\u578B\u63A8\u65AD/\u51ED\u5370\u8C61\uFF0C\u672A\u9A8C\u8BC1\uFF08\u4F4E\u7F6E\u4FE1\u5EA6\u2014\u2014\u5BB9\u6613\u7F16\u9020\uFF0C\u4F18\u5148\u6807\u8BB0\u5B58\u7591\uFF09",
20738
+ "\u8C03\u7528\u65F6\u5C3D\u91CF\u660E\u786E\u6765\u6E90\uFF0C\u65E0\u6CD5\u5224\u65AD\u7684\u4FDD\u5B88\u6807 inferred\u3002"
20627
20739
  ].join("\n"),
20628
20740
  parameters: {
20629
20741
  type: "object",
@@ -20635,7 +20747,7 @@ var rememberMemoryFunctionSchema = {
20635
20747
  scope: {
20636
20748
  type: "string",
20637
20749
  enum: ["auto", "user", "space"],
20638
- description: "\u8BB0\u5FC6\u8303\u56F4\u3002\u6309\u5185\u5BB9\u6027\u8D28\u9009\uFF1ASpace \u534F\u4F5C\u5171\u8BC6\u4F20 space\uFF1B\u7528\u6237\u4E2A\u4EBA\u8EAB\u4EFD/\u504F\u597D\u6216\u4E0E\u5F53\u524D Agent \u6302\u94A9\u7684\u505A\u6CD5\u4F20 auto\uFF08\u9ED8\u8BA4\uFF09\u3002auto \u65F6 runtime \u81EA\u52A8\u5224\u65AD owner\uFF0C\u5E76\u5C06 subject \u6807\u8BB0\u4E3A\u5F53\u524D Agent\uFF08\u5982\u679C\u53EF\u8BC6\u522B\uFF09\u3002"
20750
+ description: "\u8BB0\u5FC6\u8303\u56F4\u3002Space \u534F\u4F5C\u5171\u8BC6\u4F20 space\uFF1B\u7528\u6237\u4E2A\u4EBA\u8EAB\u4EFD/\u504F\u597D\u4F20 user\uFF1B\u4E0E\u5F53\u524D\u52A9\u624B\u5173\u7CFB\u6302\u94A9\u7684\u504F\u597D\u4F20 auto\u3002auto \u65F6 runtime \u4F7F\u7528\u5F53\u524D auto/fixed \u52A9\u624B\u4E3B\u4F53\u3002"
20639
20751
  },
20640
20752
  kind: {
20641
20753
  type: "string",
@@ -20675,6 +20787,52 @@ async function rememberMemoryFunc(args, thunkApi) {
20675
20787
  };
20676
20788
  }
20677
20789
 
20790
+ // packages/ai/tools/queryMemoryToolSchema.ts
20791
+ var queryMemoryFunctionSchema = {
20792
+ name: "queryMemory",
20793
+ description: [
20794
+ "\u6309\u9700\u67E5\u8BE2\u5F53\u524D\u7528\u6237\u3001Space \u548C\u5F53\u524D auto/fixed \u52A9\u624B\u4E3B\u4F53\u7684\u957F\u671F\u8BB0\u5FC6\u3002",
20795
+ "\u5BF9\u8BDD\u5F00\u59CB\u524D\u7CFB\u7EDF\u4F1A\u81EA\u52A8\u8F7D\u5165\u5C11\u91CF\u9AD8\u76F8\u5173\u8BB0\u5FC6\uFF1B\u53EA\u6709\u9884\u8F7D\u4E0D\u8DB3\u3001\u7528\u6237\u63D0\u5230\u8FC7\u53BB\u7EA6\u5B9A/\u504F\u597D/\u7EA0\u6B63/\u672A\u5B8C\u6210\u4E8B\u9879\u65F6\u624D\u8C03\u7528\u3002",
20796
+ "\u4E0D\u8981\u4E3A\u4E86\u666E\u901A\u4E8B\u5B9E\u95EE\u9898\u67E5\u8BE2\uFF0C\u4E5F\u4E0D\u8981\u5728\u540C\u4E00\u8F6E\u7528\u8FD1\u4E49\u8BCD\u53CD\u590D\u67E5\u8BE2\u3002",
20797
+ "",
20798
+ "\u3010\u53EC\u56DE\u89C4\u5219\u3011\u53EC\u56DE\u7684\u8BB0\u5FC6\u5FC5\u987B\u5E26\u5B8C\u6574\u5386\u53F2\u4E0A\u4E0B\u6587\uFF08\u6765\u6E90\u3001\u7F6E\u4FE1\u5EA6\u3001\u53D8\u66F4\u8BB0\u5F55\uFF09\uFF0C\u7981\u6B62\u81EA\u884C\u63A8\u7406\u586B\u8865\u3002",
20799
+ "\u5982\u679C\u8BB0\u5FC6\u6765\u6E90\u662F inferred\uFF08\u63A8\u65AD\uFF09\uFF0C\u5FC5\u987B\u660E\u786E\u6807\u6CE8\u5B58\u7591\uFF0C\u4E0D\u80FD\u5F53\u6210\u9A8C\u8BC1\u8FC7\u7684\u4E8B\u5B9E\u4F7F\u7528\u3002",
20800
+ "\u9AD8\u7F6E\u4FE1\u5EA6\u8BB0\u5FC6\uFF08verified/stated\uFF09\u4F18\u5148\u4F7F\u7528\uFF1B\u4F4E\u7F6E\u4FE1\u5EA6\u8BB0\u5FC6\uFF08inferred\uFF09\u9700\u9A8C\u8BC1\u540E\u518D\u91C7\u7EB3\u3002"
20801
+ ].join("\n"),
20802
+ parameters: {
20803
+ type: "object",
20804
+ properties: {
20805
+ query: {
20806
+ type: "string",
20807
+ description: "\u8981\u4ECE\u957F\u671F\u8BB0\u5FC6\u4E2D\u68C0\u7D22\u7684\u81EA\u7136\u8BED\u8A00\u95EE\u9898\u6216\u5173\u952E\u8BCD\u3002"
20808
+ }
20809
+ },
20810
+ required: ["query"]
20811
+ }
20812
+ };
20813
+
20814
+ // packages/ai/tools/queryMemoryTool.ts
20815
+ async function queryMemoryFunc(args, thunkApi) {
20816
+ const query = String(args.query ?? "").trim();
20817
+ if (!query) throw new Error("queryMemory \u9700\u8981\u975E\u7A7A query\u3002");
20818
+ const state = thunkApi.getState();
20819
+ const dialogKey = getActiveDialogKey();
20820
+ const dialog = dialogKey ? selectById(state, dialogKey) : null;
20821
+ const result = await callToolApi(
20822
+ thunkApi,
20823
+ "/api/memory/query",
20824
+ {
20825
+ agentKey: resolveDialogRuntimeAgentKey(dialog),
20826
+ userInput: query,
20827
+ ...selectCurrentSpaceId(state) ? { spaceId: selectCurrentSpaceId(state) } : {}
20828
+ },
20829
+ { withAuth: true }
20830
+ );
20831
+ const selectedItems = Array.isArray(result?.selectedItems) ? result.selectedItems : [];
20832
+ const displayData = selectedItems.length ? selectedItems.map((item) => String(item?.content ?? "").trim()).filter(Boolean).join("\n") : "\u6CA1\u6709\u627E\u5230\u76F8\u5173\u957F\u671F\u8BB0\u5FC6\u3002";
20833
+ return { rawData: result, displayData };
20834
+ }
20835
+
20678
20836
  // packages/ai/tools/execShellTool.ts
20679
20837
  var execShellFunctionSchema = {
20680
20838
  name: "execShell",
@@ -21275,7 +21433,7 @@ var callAgentFunctionSchema = {
21275
21433
  properties: {
21276
21434
  agentKey: {
21277
21435
  type: "string",
21278
- description: "\u8981\u8C03\u7528\u7684 Agent \u7684\u552F\u4E00 ID \u6216 alias/handle\u3002\u652F\u6301\u4E09\u79CD\u5F62\u5F0F\uFF1A\u5B8C\u6574 agentKey\uFF08\u5982 agent-xxx-01ABC\uFF09\u3001alias\uFF08\u5982 reviewer\uFF0C\u4F1A\u81EA\u52A8\u89E3\u6790\u4E3A agent-{userId}-{alias} \u548C agent-pub-{alias}\uFF09\u3001\u6216 public agent id\uFF08\u5982 01ABC\uFF09\u3002"
21436
+ description: "\u8981\u8C03\u7528\u7684 Agent \u7684\u53EF\u8FD0\u884C dbKey\uFF0C\u5FC5\u987B\u662F listAgents \u8FD4\u56DE\u7684 agentKey \u5B57\u6BB5\uFF08owned: agent-<userId>-<id>\uFF1Bpublic: agent-pub-<id>\uFF09\u6216 readAgent \u8FD4\u56DE\u7684 agentKey\u3002\u53EA\u63A5\u53D7\u7CBE\u786E dbKey\uFF0C\u4E0D\u63A5\u53D7 name/handle/bare id\u3002"
21279
21437
  },
21280
21438
  task: {
21281
21439
  type: "string",
@@ -21911,117 +22069,6 @@ async function runLlmToolFunc(args, thunkApi, _context) {
21911
22069
  }
21912
22070
  }
21913
22071
 
21914
- // packages/ai/tools/agent/agentRunDisplayHelpers.ts
21915
- function getAgentRunStatusIcon(status) {
21916
- switch (status) {
21917
- case "running":
21918
- case "pending":
21919
- return "\u23F3";
21920
- case "done":
21921
- return "\u2713";
21922
- case "failed":
21923
- case "timeout":
21924
- return "\u2717";
21925
- case "killed":
21926
- case "cancelled":
21927
- case "cancelling":
21928
- return "\u{1F6D1}";
21929
- case "not_found":
21930
- default:
21931
- return "?";
21932
- }
21933
- }
21934
- var DEFAULT_LABELS = {
21935
- runStatus: "Run status",
21936
- runStarted: "Run started",
21937
- runStopped: "Run stopped",
21938
- logTail: "Log tail:",
21939
- runs: (count) => `Runs (${count})`
21940
- };
21941
- function resolveLabels(labels) {
21942
- return {
21943
- runStatus: labels?.runStatus ?? DEFAULT_LABELS.runStatus,
21944
- runStarted: labels?.runStarted ?? DEFAULT_LABELS.runStarted,
21945
- runStopped: labels?.runStopped ?? DEFAULT_LABELS.runStopped,
21946
- logTail: labels?.logTail ?? DEFAULT_LABELS.logTail,
21947
- runs: labels?.runs ?? DEFAULT_LABELS.runs
21948
- };
21949
- }
21950
- function isAgentNameFallback(agentName) {
21951
- const trimmed = typeof agentName === "string" ? agentName.trim() : "";
21952
- return !trimmed || trimmed === "agent";
21953
- }
21954
- function formatStartRunCard(agentName, status = "running", labels) {
21955
- const L = resolveLabels(labels);
21956
- const icon = getAgentRunStatusIcon(status);
21957
- const lines = [L.runStarted];
21958
- if (!isAgentNameFallback(agentName)) {
21959
- lines.push(` agent ${agentName}`);
21960
- }
21961
- lines.push(` status ${icon} ${status}`);
21962
- return lines.join("\n");
21963
- }
21964
- function formatStatusRunCard(agentName, status = "running", opts) {
21965
- const L = resolveLabels(opts?.labels);
21966
- const icon = getAgentRunStatusIcon(status);
21967
- const lines = [L.runStatus, ` ${icon} ${status}`];
21968
- if (!isAgentNameFallback(agentName)) {
21969
- lines.push(` agent ${agentName}`);
21970
- }
21971
- if (opts?.pollCount !== void 0 && opts.pollCount > 0) {
21972
- lines.push(` polls ${opts.pollCount}`);
21973
- }
21974
- if (typeof opts?.elapsedMs === "number" && Number.isFinite(opts.elapsedMs)) {
21975
- lines.push(` last ${Math.round(opts.elapsedMs)}ms`);
21976
- }
21977
- if (opts?.lastToolNames && opts.lastToolNames.length > 0) {
21978
- lines.push(` lastTools ${opts.lastToolNames.join(", ")}`);
21979
- }
21980
- if (opts?.toolCallCount !== void 0) {
21981
- lines.push(` toolCalls ${opts.toolCallCount}`);
21982
- }
21983
- if (opts?.errorMessage?.trim()) {
21984
- lines.push(` error ${opts.errorMessage.trim()}`);
21985
- }
21986
- const includeLog = opts?.includeLogTail !== false;
21987
- if (includeLog && opts?.logLines && opts.logLines.length > 0) {
21988
- lines.push("", L.logTail, ...opts.logLines.map((l) => ` ${l}`));
21989
- }
21990
- return lines.join("\n");
21991
- }
21992
- function formatStopRunCard(status = "killed", labels) {
21993
- const L = resolveLabels(labels);
21994
- const icon = getAgentRunStatusIcon(status);
21995
- return `${L.runStopped}
21996
- ${icon} ${status}`;
21997
- }
21998
- function formatListRunsCard(runs, labels) {
21999
- const L = resolveLabels(labels);
22000
- const lines = [L.runs(runs.length)];
22001
- for (const run of runs) {
22002
- const status = run.status ?? "\u2014";
22003
- const icon = getAgentRunStatusIcon(status);
22004
- const name = run.agentName || run.name || "agent";
22005
- lines.push(` ${icon} ${name}`);
22006
- }
22007
- return lines.join("\n");
22008
- }
22009
- function formatNotFoundRunCard(labels) {
22010
- const L = resolveLabels(labels);
22011
- return `${L.runStatus}
22012
- ? not_found`;
22013
- }
22014
- var AGENT_RUN_TERMINAL_STATUSES = /* @__PURE__ */ new Set([
22015
- "done",
22016
- "failed",
22017
- "timeout",
22018
- "killed",
22019
- "cancelled"
22020
- ]);
22021
- function isAgentRunTerminalStatus(status) {
22022
- return typeof status === "string" && AGENT_RUN_TERMINAL_STATUSES.has(status);
22023
- }
22024
-
22025
22072
  // packages/ai/tools/agent/startAgentRunTool.ts
22026
22073
  var startAgentRunFunctionSchema = {
22027
22074
  name: "startAgentRun",
@@ -22031,7 +22078,7 @@ var startAgentRunFunctionSchema = {
22031
22078
  properties: {
22032
22079
  agentKey: {
22033
22080
  type: "string",
22034
- description: "\u8981\u542F\u52A8\u7684 Agent \u7684\u53EF\u8FD0\u884C dbKey\uFF08\u4F18\u5148\u4F7F\u7528 readAgent \u8FD4\u56DE\u7684 agentKey\uFF0C\u683C\u5F0F\u5982 agent-xxx\uFF09\u3002\u5982\u679C\u5DF2\u901A\u8FC7 listAgents/readAgent \u83B7\u53D6\u540D\u79F0\uFF0C\u8BF7\u540C\u65F6\u4F20 agentName\u3002"
22081
+ description: "\u8981\u542F\u52A8\u7684 Agent \u7684\u53EF\u8FD0\u884C dbKey\uFF0C\u5FC5\u987B\u662F listAgents \u8FD4\u56DE\u7684 agentKey \u5B57\u6BB5\uFF08owned: agent-<userId>-<id>\uFF1Bpublic: agent-pub-<id>\uFF09\u6216 readAgent \u8FD4\u56DE\u7684 agentKey\u3002\u53EA\u63A5\u53D7\u7CBE\u786E dbKey\uFF0C\u4E0D\u63A5\u53D7 name/handle/bare id\u3002"
22035
22082
  },
22036
22083
  task: {
22037
22084
  type: "string",
@@ -22047,14 +22094,23 @@ var startAgentRunFunctionSchema = {
22047
22094
  ephemeral: {
22048
22095
  type: "boolean",
22049
22096
  description: "\u53EF\u9009\u3002\u4E3A true \u65F6\u672C\u6B21 run \u4E0D\u6301\u4E45\u5316 dialog\uFF08\u4E0D\u7559\u8BB0\u5F55\uFF09\u3002\u7528\u4E8E\u4E00\u6B21\u6027\u5BA1\u67E5\uFF08review\uFF09\u7B49\u4E0D\u9700\u7559\u75D5\u7684\u573A\u666F\u3002\u9ED8\u8BA4 false\u3002"
22097
+ },
22098
+ batchId: {
22099
+ type: "string",
22100
+ description: "\u53EF\u9009\u3002\u6279\u6B21 id\uFF0C\u7528\u4E8E\u628A\u591A\u4E2A\u5E76\u884C run \u5F52\u4E3A\u4E00\u7EC4\uFF0C\u4FBF\u4E8E\u540E\u7EED controlAgentRun(list, batchId=...) \u6309\u6279\u67E5\u8BE2\u3002\u672A\u4F20\u65F6\u81EA\u52A8\u751F\u6210\u4E00\u4E2A\u5E76\u5728\u8FD4\u56DE\u503C\u4E2D\u5E26\u56DE\uFF0C\u8C03\u7528\u65B9\u65E0\u9700\u5148\u521B\u5EFA\u3002"
22101
+ },
22102
+ trackTodo: {
22103
+ type: "boolean",
22104
+ description: '\u53EF\u9009\u3002\u4E3A true \u65F6\u672C\u6B21 run \u4F1A\u88AB\u8BB0\u5F55\u8FDB runtime todo\uFF08~/.nolo/todos.json\uFF09\u3002\u4F20\u4E86 batchId \u65F6\u9ED8\u8BA4\u5373\u8BB0\u5F55\uFF08\u6BCF\u6279\u5BF9\u5E94\u4E00\u9879 todo\uFF09\u3002todo \u72B6\u6001\u7531\u5173\u8054 run \u72B6\u6001 + review \u7ED3\u8BBA\u63A8\u5BFC\uFF0C\u7528 controlAgentRun(action:"todo") \u67E5\u8BE2\u3002'
22050
22105
  }
22051
22106
  },
22052
22107
  required: ["agentKey", "task"]
22053
22108
  }
22054
22109
  };
22055
22110
  async function startAgentRunFunc(args, thunkApi, _context) {
22056
- const { agentKey, task, input, agentName, ephemeral } = args;
22111
+ const { agentKey, task, input, agentName, ephemeral, batchId } = args;
22057
22112
  const { dispatch } = thunkApi;
22113
+ const effectiveBatchId = typeof batchId === "string" && batchId.trim() ? batchId.trim() : `batch-${(/* @__PURE__ */ new Date()).toISOString().replace(/[:.]/g, "-")}-${Math.random().toString(36).slice(2, 8)}`;
22058
22114
  if (!agentKey) {
22059
22115
  throw new Error("startAgentRun: \u7F3A\u5C11 agentKey \u53C2\u6570\u3002");
22060
22116
  }
@@ -22076,14 +22132,26 @@ async function startAgentRunFunc(args, thunkApi, _context) {
22076
22132
  ).unwrap();
22077
22133
  const runId = bgResult.dialogId;
22078
22134
  const status = bgResult.status ?? "pending";
22079
- const displayName = agentName?.trim() || bgResult.agentName || bgResult.name || "agent";
22135
+ const resolvedName = agentName?.trim() || bgResult.agentName || bgResult.name;
22136
+ const identity = { agentName: resolvedName, agentKey, runId };
22137
+ const taskPreview = task.replace(/\s+/g, " ").trim().slice(0, TASK_PREVIEW_MAX);
22080
22138
  return {
22081
22139
  rawData: {
22082
22140
  runId,
22083
22141
  status,
22084
- ...displayName !== "agent" ? { agentName: displayName } : {}
22085
- },
22086
- displayData: formatStartRunCard(displayName, status)
22142
+ agentKey,
22143
+ // batchId is always returned — minted above when the caller didn't
22144
+ // supply one — so controlAgentRun(list, batchId=...) works on every
22145
+ // host. On the server path the id lives in the tool return; on the
22146
+ // CLI local path it is also persisted on the run record.
22147
+ batchId: effectiveBatchId,
22148
+ ...resolvedName ? { agentName: resolvedName } : {},
22149
+ ...taskPreview ? { taskPreview } : {}
22150
+ },
22151
+ displayData: formatStartRunCard(resolveRunLabel(identity), status, {
22152
+ task: taskPreview,
22153
+ runId
22154
+ })
22087
22155
  };
22088
22156
  } catch (e) {
22089
22157
  throw new Error(`startAgentRun \u542F\u52A8 Agent [${agentKey}] \u5931\u8D25: ${toErrorMessage(e)}`);
@@ -22093,14 +22161,14 @@ async function startAgentRunFunc(args, thunkApi, _context) {
22093
22161
  // packages/ai/tools/agent/controlAgentRunTool.ts
22094
22162
  var controlAgentRunFunctionSchema = {
22095
22163
  name: "controlAgentRun",
22096
- description: "\u89C2\u5BDF\u548C\u63A7\u5236\u540E\u53F0 agent run\u3002\u4E00\u4E2A\u5DE5\u5177\u4E09\u4E2A action\uFF1Alist\uFF08\u5217\u51FA\u6240\u6709 run\uFF09\u3001status\uFF08\u67E5\u5355\u6761 + \u53EF\u9009\u65E5\u5FD7\uFF09\u3001stop\uFF08\u53D6\u6D88 run\uFF09\u3002\u76F8\u5F53\u4E8E Unix \u7684 wait + signal + /proc\u3002\u7528 startAgentRun \u62FF\u5230 runId \u540E\uFF0C\u7528\u672C\u5DE5\u5177\u8DDF\u8FDB\u5EA6\u6216\u53EB\u505C\u3002",
22164
+ description: "\u89C2\u5BDF\u548C\u63A7\u5236\u540E\u53F0 agent run\u3002\u4E00\u4E2A\u5DE5\u5177\u4E09\u4E2A action\uFF1Alist\uFF08\u5217\u51FA run\uFF0C\u652F\u6301\u6309\u6279\u6B21/\u72B6\u6001\u8FC7\u6EE4\u4E0E\u5206\u9875\uFF09\u3001status\uFF08\u67E5\u5355\u6761 + \u53EF\u9009\u65E5\u5FD7\uFF09\u3001stop\uFF08\u53D6\u6D88 run\uFF09\u3002\u76F8\u5F53\u4E8E Unix \u7684 wait + signal + /proc\u3002\u7528 startAgentRun \u62FF\u5230 runId \u540E\uFF0C\u7528\u672C\u5DE5\u5177\u8DDF\u8FDB\u5EA6\u6216\u53EB\u505C\u3002list \u9ED8\u8BA4\u53EA\u8FD4\u56DE\u6700\u8FD1 20 \u6761\uFF0C\u907F\u514D\u5168\u91CF\u51B2\u7206\u4E0A\u4E0B\u6587\uFF1B\u7528 status/batchId/limit/offset \u53D6\u6240\u9700\u5206\u9875\u3002\u6CE8\u610F\uFF1A\u7528\u6237\u754C\u9762\u5DF2\u7ECF\u5728\u72EC\u7ACB\u5B9E\u65F6\u663E\u793A\u6BCF\u6761 run \u7684\u72B6\u6001\uFF0C\u672C\u5DE5\u5177\u662F\u7ED9\u4F60\u81EA\u5DF1\u505A\u51B3\u7B56\u7528\u7684\uFF0C\u4E0D\u662F\u7528\u6765\u7ED9\u7528\u6237\u6C47\u62A5\u8FDB\u5EA6\u7684\u2014\u2014\u4E0D\u5FC5\u4E3A\u4E86\u300C\u8BA9\u7528\u6237\u770B\u5230\u72B6\u6001\u300D\u800C\u8F6E\u8BE2\uFF0C\u4E5F\u4E0D\u8981\u628A\u8FD4\u56DE\u503C\u590D\u8FF0\u7ED9\u7528\u6237\u3002",
22097
22165
  parameters: {
22098
22166
  type: "object",
22099
22167
  properties: {
22100
22168
  action: {
22101
22169
  type: "string",
22102
- enum: ["list", "status", "stop"],
22103
- description: "\u8981\u6267\u884C\u7684\u64CD\u4F5C\uFF1Alist=\u5217\u51FA\u6240\u6709 run\uFF08\u7701\u7565 runId\uFF09\uFF1Bstatus=\u67E5\u5355\u6761 run \u72B6\u6001 + \u53EF\u9009\u65E5\u5FD7\uFF1Bstop=\u53D6\u6D88 run\u3002"
22170
+ enum: ["list", "status", "stop", "todo"],
22171
+ description: "\u8981\u6267\u884C\u7684\u64CD\u4F5C\uFF1Alist=\u5217\u51FA run\uFF08\u7701\u7565 runId\uFF09\uFF1Bstatus=\u67E5\u5355\u6761 run \u72B6\u6001 + \u53EF\u9009\u65E5\u5FD7\uFF1Bstop=\u53D6\u6D88 run\uFF1Btodo=\u5217\u51FA runtime todo\uFF08\u7531 startAgentRun \u7684 batchId/trackTodo \u4EA7\u751F\uFF0C\u72B6\u6001\u7531\u5173\u8054 run \u63A8\u5BFC\uFF09\u3002"
22104
22172
  },
22105
22173
  runId: {
22106
22174
  type: "string",
@@ -22108,26 +22176,41 @@ var controlAgentRunFunctionSchema = {
22108
22176
  },
22109
22177
  tailLines: {
22110
22178
  type: "number",
22111
- description: "\u53EF\u9009\u3002action=status \u65F6\uFF1A0=\u53EA\u8FD4\u56DE\u72B6\u6001\u6458\u8981\uFF0C>0=\u540C\u65F6\u8FD4\u56DE\u6700\u8FD1 N \u884C\u65E5\u5FD7\uFF08\u9ED8\u8BA4 0\uFF09\u3002",
22179
+ description: "\u53EF\u9009\u3002action=status \u65F6\uFF1A0=\u53EA\u8FD4\u56DE\u72B6\u6001\u6458\u8981\uFF0C>0=\u540C\u65F6\u8FD4\u56DE\u6700\u8FD1 N \u884C\u65E5\u5FD7\uFF08\u9ED8\u8BA4 0\uFF09\u3002\u672C\u5730 run \u7684\u72B6\u6001\u6458\u8981\u91CC\u5E26 progress\uFF08toolCalls/llmCalls/fileEdits\u3001inFlight=\u6B64\u523B\u5728\u6267\u884C\u4EC0\u4E48\u3001idleMs=\u8DDD\u4E0A\u6B21\u4E8B\u4EF6\u591A\u4E45\uFF09\uFF0C\u8DB3\u4EE5\u5224\u65AD\u300C\u5728\u5E72\u6D3B\u300D\u8FD8\u662F\u300C\u5361\u4F4F\u4E86\u300D\u2014\u2014\u5148\u770B\u5B83\uFF0C\u53EA\u6709\u786E\u5B9E\u53EF\u7591\u6216\u5DF2\u5931\u8D25\u65F6\u624D tailLines>0 \u62C9\u65E5\u5FD7\u3002",
22112
22180
  default: 0
22113
22181
  },
22182
+ batchId: {
22183
+ type: "string",
22184
+ description: "\u53EF\u9009\u3002action=list \u65F6\u53EA\u8FD4\u56DE\u8BE5\u6279\u6B21\u7684 run\uFF08startAgentRun \u8FD4\u56DE\u503C\u6216\u5165\u53C2\u4E2D\u7684 batchId\uFF09\u3002"
22185
+ },
22186
+ status: {
22187
+ type: "string",
22188
+ description: "\u53EF\u9009\u3002action=list \u65F6\u6309\u72B6\u6001\u8FC7\u6EE4\uFF0C\u652F\u6301\u5355\u503C\u6216\u9017\u53F7\u5206\u9694\u591A\u503C\uFF08\u5982 'running,orphaned'\uFF09\u3002\u4E0E statusFilter \u540C\u4E49\uFF0Cstatus \u4F18\u5148\uFF1B\u53D6\u503C\u5305\u542B orphaned\uFF08pid \u5DF2\u6B7B\u4F46\u8BB0\u5F55\u4ECD running \u7684\u5B64\u513F run\uFF09\u3002\u9ED8\u8BA4 all\uFF08\u4E0D\u8FC7\u6EE4\uFF09\u3002"
22189
+ },
22114
22190
  statusFilter: {
22115
22191
  type: "string",
22116
- enum: ["running", "done", "failed", "cancelled", "all"],
22117
- description: "\u53EF\u9009\u3002action=list \u65F6\u6309\u72B6\u6001\u8FC7\u6EE4\uFF0C\u9ED8\u8BA4 all\u3002"
22192
+ enum: ["running", "done", "failed", "cancelled", "orphaned", "all"],
22193
+ description: "\u53EF\u9009\u3002action=list \u65F6\u6309\u72B6\u6001\u8FC7\u6EE4\uFF0C\u9ED8\u8BA4 all\u3002\u4E0E status \u540C\u4E49\uFF08status \u4F18\u5148\uFF0C\u4E14 status \u652F\u6301\u591A\u503C\uFF09\u3002"
22118
22194
  },
22119
22195
  limit: {
22120
22196
  type: "number",
22121
- description: "\u53EF\u9009\u3002action=list \u65F6\u9650\u5236\u8FD4\u56DE\u6570\u91CF\uFF0C\u9ED8\u8BA4 20\u3002"
22197
+ description: "\u53EF\u9009\u3002action=list \u65F6\u9650\u5236\u8FD4\u56DE\u6570\u91CF\uFF0C\u9ED8\u8BA4 20\uFF0C\u4E0A\u9650 200\u3002\u4E0D\u5E26\u4EFB\u4F55\u53C2\u6570\u4E0D\u4F1A\u8FD4\u56DE\u5168\u91CF\u3002"
22198
+ },
22199
+ offset: {
22200
+ type: "number",
22201
+ description: "\u53EF\u9009\u3002action=list \u65F6\u8DF3\u8FC7\u524D N \u6761\uFF0C\u914D\u5408 limit \u7FFB\u9875\u3002\u9ED8\u8BA4 0\u3002"
22122
22202
  }
22123
22203
  },
22124
22204
  required: ["action"]
22125
22205
  }
22126
22206
  };
22127
22207
  async function controlAgentRunFunc(args, thunkApi, _context) {
22128
- const { action, runId, tailLines, statusFilter, limit } = args;
22208
+ const { action, runId, tailLines, batchId, status, statusFilter, limit, offset } = args;
22129
22209
  if (action === "list") {
22130
- return handleList(thunkApi, { statusFilter, limit });
22210
+ return handleList(thunkApi, { batchId, status, statusFilter, limit, offset });
22211
+ }
22212
+ if (action === "todo") {
22213
+ return handleTodo(thunkApi, { status });
22131
22214
  }
22132
22215
  if (action === "status") {
22133
22216
  if (!runId) throw new Error('controlAgentRun(action:"status"): \u7F3A\u5C11 runId\u3002');
@@ -22142,8 +22225,11 @@ async function controlAgentRunFunc(args, thunkApi, _context) {
22142
22225
  async function handleList(thunkApi, opts) {
22143
22226
  try {
22144
22227
  const body = { action: "list" };
22145
- if (opts.statusFilter) body.statusFilter = opts.statusFilter;
22228
+ const statusVal = opts.status ?? opts.statusFilter;
22229
+ if (statusVal) body.statusFilter = statusVal;
22230
+ if (opts.batchId) body.batchId = opts.batchId;
22146
22231
  if (opts.limit !== void 0) body.limit = opts.limit;
22232
+ if (opts.offset !== void 0) body.offset = opts.offset;
22147
22233
  const data = await callToolApi(
22148
22234
  thunkApi,
22149
22235
  "/api/agent/runs/control",
@@ -22152,9 +22238,10 @@ async function handleList(thunkApi, opts) {
22152
22238
  );
22153
22239
  const resData = data?.data ?? data;
22154
22240
  const runs = resData?.runs ?? [];
22155
- const count = resData?.count ?? runs.length;
22241
+ const total = typeof resData?.total === "number" ? resData.total : runs.length;
22242
+ const hasMore = typeof resData?.hasMore === "boolean" ? resData.hasMore : false;
22156
22243
  return {
22157
- rawData: { runs, count },
22244
+ rawData: { runs, count: runs.length, total, hasMore },
22158
22245
  displayData: formatListRunsCard(runs)
22159
22246
  };
22160
22247
  } catch (e) {
@@ -22179,13 +22266,16 @@ async function handleStatus(thunkApi, opts) {
22179
22266
  }
22180
22267
  const run = resData.run;
22181
22268
  const logLines = resData.logLines;
22182
- const name = run.agentName || run.name || "agent";
22269
+ const name = resolveRunLabel(run);
22183
22270
  return {
22184
22271
  rawData: { found: true, ...run, ...logLines ? { logLines } : {} },
22185
22272
  displayData: formatStatusRunCard(name, run.status, {
22273
+ runId: opts.runId,
22186
22274
  lastToolNames: run.lastToolNames,
22187
22275
  toolCallCount: run.toolCallCount,
22276
+ lastAssistantText: run.lastAssistantText,
22188
22277
  errorMessage: run.errorMessage,
22278
+ timing: { startedAt: run.startedAt, finishedAt: run.finishedAt },
22189
22279
  logLines
22190
22280
  })
22191
22281
  };
@@ -22211,6 +22301,28 @@ async function handleStop(thunkApi, opts) {
22211
22301
  throw new Error(`controlAgentRun(stop) \u5931\u8D25: ${toErrorMessage(e)}`);
22212
22302
  }
22213
22303
  }
22304
+ async function handleTodo(thunkApi, opts) {
22305
+ try {
22306
+ const body = { action: "todo" };
22307
+ if (opts.status) body.status = opts.status;
22308
+ const data = await callToolApi(
22309
+ thunkApi,
22310
+ "/api/agent/runs/control",
22311
+ body,
22312
+ { withAuth: true }
22313
+ );
22314
+ const resData = data?.data ?? data;
22315
+ const todos = resData?.todos ?? [];
22316
+ return {
22317
+ rawData: { todos, count: todos.length },
22318
+ displayData: formatListRunsCard(
22319
+ todos.map((t) => ({ agentName: t?.title ?? t?.id, status: t?.status }))
22320
+ )
22321
+ };
22322
+ } catch (e) {
22323
+ throw new Error(`controlAgentRun(todo) \u5931\u8D25: ${toErrorMessage(e)}`);
22324
+ }
22325
+ }
22214
22326
 
22215
22327
  // packages/ai/tools/agent/agentTools.ts
22216
22328
  var agentToolDefinitions = [
@@ -23404,7 +23516,7 @@ var executeToolRun = createAsyncThunk(
23404
23516
  if (!executionInput) {
23405
23517
  throw new Error(`ToolRun ${id} has no input to execute with.`);
23406
23518
  }
23407
- const { findToolExecutor: findToolExecutor2 } = await import("./tools-YB6LXSVN.js");
23519
+ const { findToolExecutor: findToolExecutor2 } = await import("./tools-RJVFXOLR.js");
23408
23520
  const { executor } = findToolExecutor2(run.toolName);
23409
23521
  toolRunStarted({
23410
23522
  id: run.id,
@@ -23428,7 +23540,7 @@ var executeToolRun = createAsyncThunk(
23428
23540
  const latestState = thunkApi.getState();
23429
23541
  const userId = latestState.auth?.currentUser?.userId;
23430
23542
  if (userId) {
23431
- const { fetchUserSpaceMemberships } = await import("./spaceSlice-444MFUP6.js");
23543
+ const { fetchUserSpaceMemberships } = await import("./spaceSlice-M4PVN5PO.js");
23432
23544
  await thunkApi.dispatch(fetchUserSpaceMemberships(userId));
23433
23545
  }
23434
23546
  }
@@ -25911,7 +26023,7 @@ async function updateDocFunc(args, thunkApi) {
25911
26023
  updated_at: (/* @__PURE__ */ new Date()).toISOString()
25912
26024
  };
25913
26025
  await dispatch(write({ data: updatedPageData, customKey: id })).unwrap();
25914
- const { getDocState, applyExternalDocUpdate } = await import("./docStore-2UHVWLTV.js");
26026
+ const { getDocState, applyExternalDocUpdate } = await import("./docStore-LJXXRB5W.js");
25915
26027
  if (getDocState().pageKey === id) {
25916
26028
  applyExternalDocUpdate({
25917
26029
  slateData: finalSlateData,
@@ -25936,7 +26048,7 @@ async function updateDocFunc(args, thunkApi) {
25936
26048
  // packages/ai/tools/updateUserPreferenceProfileTool.ts
25937
26049
  async function dispatchSetSettings(thunkApi, changes) {
25938
26050
  const injectedSetSettings = thunkApi?.extra?.setSettings;
25939
- const setSettings = typeof injectedSetSettings === "function" ? injectedSetSettings : (await import("./settingSlice-7JYPQNAC.js")).setSettings;
26051
+ const setSettings = typeof injectedSetSettings === "function" ? injectedSetSettings : (await import("./settingSlice-7MNKHZ6R.js")).setSettings;
25940
26052
  await thunkApi.dispatch(setSettings(changes)).unwrap();
25941
26053
  }
25942
26054
  var updateUserPreferenceProfileFunctionSchema = {
@@ -26533,12 +26645,23 @@ var baseToolDefinitions = [
26533
26645
  schema: uiAskChoiceFunctionSchema,
26534
26646
  executor: uiAskChoiceFunc,
26535
26647
  description: {
26536
- name: "ui_ask_choice",
26648
+ name: "ask_user",
26537
26649
  description: "\u5411\u7528\u6237\u63D0\u51FA\u4E00\u4E2A\u5E26\u591A\u4E2A\u9009\u9879\u7684\u95EE\u9898\uFF0C\u8BA9\u754C\u9762\u5C55\u793A\u6309\u94AE\u4F9B\u7528\u6237\u9009\u62E9\u3002",
26538
26650
  category: "\u4EA4\u4E92 / UI"
26539
26651
  },
26540
26652
  behavior: "answer"
26541
26653
  },
26654
+ {
26655
+ id: "queryMemory",
26656
+ schema: queryMemoryFunctionSchema,
26657
+ executor: queryMemoryFunc,
26658
+ description: {
26659
+ name: "queryMemory",
26660
+ description: "\u6309\u9700\u67E5\u8BE2\u5F53\u524D\u7528\u6237\u3001Space \u548C\u52A9\u624B\u4E3B\u4F53\u7684\u957F\u671F\u8BB0\u5FC6\u3002",
26661
+ category: "\u8BB0\u5FC6 / \u957F\u671F\u4E0A\u4E0B\u6587"
26662
+ },
26663
+ behavior: "data"
26664
+ },
26542
26665
  {
26543
26666
  id: "rememberMemory",
26544
26667
  schema: rememberMemoryFunctionSchema,
@@ -27353,7 +27476,7 @@ var baseToolDefinitions = [
27353
27476
  executor: readAgentFunc,
27354
27477
  description: {
27355
27478
  name: "readAgent",
27356
- description: "Read a Nolo agent config.",
27479
+ description: "Read a Nolo agent's full config and resolve its runnable agentKey.",
27357
27480
  category: "Nolo workspace"
27358
27481
  },
27359
27482
  behavior: "data",
@@ -28177,12 +28300,6 @@ export {
28177
28300
  readXPostFunc,
28178
28301
  readXhsProfileFunctionSchema,
28179
28302
  readXhsProfileFunc,
28180
- formatStartRunCard,
28181
- formatStatusRunCard,
28182
- formatStopRunCard,
28183
- formatListRunsCard,
28184
- formatNotFoundRunCard,
28185
- isAgentRunTerminalStatus,
28186
28303
  TOOL_PACKS,
28187
28304
  resolveEffectiveEnabledPacks,
28188
28305
  addDefaultSystemCapabilityTools,