nolo-cli 0.1.10 → 0.1.12

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 (232) hide show
  1. package/README.md +0 -32
  2. package/agentRuntimeCommands.ts +1 -1
  3. package/client/compactDialog.ts +2 -5
  4. package/commandRegistry.ts +2 -2
  5. package/machineCommands.ts +28 -3
  6. package/package.json +5 -25
  7. package/ai/agent/_executeModel.ts +0 -118
  8. package/ai/agent/agentSlice.ts +0 -525
  9. package/ai/agent/appWorkingMemory.ts +0 -126
  10. package/ai/agent/avatarUtils.ts +0 -24
  11. package/ai/agent/buildEditingContext.ts +0 -373
  12. package/ai/agent/buildSystemPrompt.ts +0 -532
  13. package/ai/agent/cleanAgentMessages.ts +0 -140
  14. package/ai/agent/cliChatClient.ts +0 -119
  15. package/ai/agent/contextCompiler.ts +0 -107
  16. package/ai/agent/contextLayerContract.ts +0 -44
  17. package/ai/agent/createAgentSchema.ts +0 -234
  18. package/ai/agent/executeToolCall.ts +0 -58
  19. package/ai/agent/fetchAgentContexts.ts +0 -42
  20. package/ai/agent/generatePrompt.ts +0 -3
  21. package/ai/agent/getFullChatContextKeys.ts +0 -168
  22. package/ai/agent/hooks/fetchPublicAgents.ts +0 -133
  23. package/ai/agent/hooks/useAgentConfig.ts +0 -61
  24. package/ai/agent/hooks/useAgentDialog.ts +0 -35
  25. package/ai/agent/hooks/useAgentFormValidation.ts +0 -202
  26. package/ai/agent/hooks/usePublicAgents.ts +0 -473
  27. package/ai/agent/persistMessageWithFixedId.ts +0 -37
  28. package/ai/agent/planSlice.ts +0 -259
  29. package/ai/agent/referenceUtils.ts +0 -229
  30. package/ai/agent/runAgentBackground.ts +0 -238
  31. package/ai/agent/runAgentClientLoop.ts +0 -138
  32. package/ai/agent/runtimeGuidance.ts +0 -97
  33. package/ai/agent/runtimeServerBase.ts +0 -37
  34. package/ai/agent/server/fetchPublicAgents.ts +0 -128
  35. package/ai/agent/startParallelAgentStreams.ts +0 -424
  36. package/ai/agent/startupProtocol.ts +0 -53
  37. package/ai/agent/streamAgentChatTurn.ts +0 -1278
  38. package/ai/agent/streamAgentChatTurnUtils.ts +0 -738
  39. package/ai/agent/types.ts +0 -71
  40. package/ai/agent/utils/imageOutput.ts +0 -33
  41. package/ai/agent/utils/sortUtils.ts +0 -250
  42. package/ai/agent/web/referencePickerUtils.ts +0 -146
  43. package/ai/ai.locale.ts +0 -1079
  44. package/ai/chat/accumulateToolCallChunks.ts +0 -95
  45. package/ai/chat/fetchUtils.native.ts +0 -276
  46. package/ai/chat/fetchUtils.ts +0 -153
  47. package/ai/chat/parseApiError.ts +0 -64
  48. package/ai/chat/parseMultilineSSE.ts +0 -95
  49. package/ai/chat/sendOpenAICompletionsRequest.native.ts +0 -682
  50. package/ai/chat/sendOpenAICompletionsRequest.ts +0 -703
  51. package/ai/chat/sendOpenAIResponseRequest.ts +0 -491
  52. package/ai/chat/shouldUseServerProxy.ts +0 -18
  53. package/ai/chat/sseClient.native.ts +0 -91
  54. package/ai/chat/sseClient.ts +0 -67
  55. package/ai/chat/streamReader.native.ts +0 -31
  56. package/ai/chat/streamReader.ts +0 -62
  57. package/ai/chat/updateTotalUsage.ts +0 -72
  58. package/ai/context/buildReferenceContext.ts +0 -437
  59. package/ai/context/calculateContextUsage.ts +0 -133
  60. package/ai/context/retention.ts +0 -165
  61. package/ai/context/tokenUtils.ts +0 -78
  62. package/ai/index.ts +0 -1
  63. package/ai/llm/calculateGeminiImageTokens.ts +0 -57
  64. package/ai/llm/deepinfra.ts +0 -28
  65. package/ai/llm/fireworks.ts +0 -50
  66. package/ai/llm/generateRequestBody.ts +0 -165
  67. package/ai/llm/getModelContextWindow.ts +0 -84
  68. package/ai/llm/getNoloKey.ts +0 -31
  69. package/ai/llm/getPricing.ts +0 -199
  70. package/ai/llm/hooks/useModelPricing.ts +0 -75
  71. package/ai/llm/imagePricing.ts +0 -40
  72. package/ai/llm/isResponseAPIModel.ts +0 -13
  73. package/ai/llm/mimo.ts +0 -71
  74. package/ai/llm/mistral.ts +0 -22
  75. package/ai/llm/modelAvatar.ts +0 -427
  76. package/ai/llm/models.ts +0 -45
  77. package/ai/llm/openrouterModels.ts +0 -269
  78. package/ai/llm/providers.ts +0 -306
  79. package/ai/llm/reasoningModels.ts +0 -28
  80. package/ai/llm/types.ts +0 -59
  81. package/ai/llm/usageRequestOptions.ts +0 -59
  82. package/ai/memory/capture.ts +0 -148
  83. package/ai/memory/consolidate.ts +0 -104
  84. package/ai/memory/delete.ts +0 -147
  85. package/ai/memory/overlay.ts +0 -84
  86. package/ai/memory/query.ts +0 -38
  87. package/ai/memory/queryShared.ts +0 -160
  88. package/ai/memory/rank.ts +0 -105
  89. package/ai/memory/recentRelationshipRecap.ts +0 -249
  90. package/ai/memory/remember.ts +0 -167
  91. package/ai/memory/runtime.ts +0 -76
  92. package/ai/memory/store.ts +0 -20
  93. package/ai/memory/storeShared.ts +0 -76
  94. package/ai/memory/types.ts +0 -46
  95. package/ai/memory/understanding.ts +0 -349
  96. package/ai/memory/understandingGreeting.ts +0 -264
  97. package/ai/messages/type.ts +0 -20
  98. package/ai/policy/personalizationDialog.ts +0 -333
  99. package/ai/policy/runtimePolicy.ts +0 -440
  100. package/ai/policy/selfUpdateFields.ts +0 -48
  101. package/ai/policy/types.ts +0 -64
  102. package/ai/skills/referenceRuntime.ts +0 -274
  103. package/ai/skills/skillDiagnostics.ts +0 -251
  104. package/ai/skills/skillDocBuilder.ts +0 -139
  105. package/ai/skills/skillDocProtocol.ts +0 -434
  106. package/ai/skills/skillReferenceSummary.ts +0 -63
  107. package/ai/skills/skillSummaryMarker.ts +0 -26
  108. package/ai/token/calculatePrice.ts +0 -544
  109. package/ai/token/db.ts +0 -98
  110. package/ai/token/externalToolCost.ts +0 -330
  111. package/ai/token/hooks/useRecords.ts +0 -65
  112. package/ai/token/missingUsageEstimate.ts +0 -42
  113. package/ai/token/modelUsageQuery.ts +0 -252
  114. package/ai/token/normalizeUsage.ts +0 -84
  115. package/ai/token/openaiImageGenerationUsage.ts +0 -56
  116. package/ai/token/prepareTokenUsageData.ts +0 -88
  117. package/ai/token/query.ts +0 -88
  118. package/ai/token/queryUserTokens.ts +0 -59
  119. package/ai/token/resolveBillingTarget.ts +0 -52
  120. package/ai/token/saveTokenRecord.ts +0 -53
  121. package/ai/token/serverDialogProjection.ts +0 -78
  122. package/ai/token/serverTokenWriter.ts +0 -143
  123. package/ai/token/stats.ts +0 -21
  124. package/ai/token/tokenThunks.ts +0 -24
  125. package/ai/token/types.ts +0 -93
  126. package/ai/tools/agent/agentTools.ts +0 -176
  127. package/ai/tools/agent/agentUpdateShared.ts +0 -311
  128. package/ai/tools/agent/callAgentTool.ts +0 -139
  129. package/ai/tools/agent/createAgentTool.ts +0 -512
  130. package/ai/tools/agent/createDialogTool.ts +0 -69
  131. package/ai/tools/agent/createSkillAgentTool.ts +0 -62
  132. package/ai/tools/agent/parallelBudget.ts +0 -221
  133. package/ai/tools/agent/presets/appBuilderPreset.ts +0 -145
  134. package/ai/tools/agent/runLlmTool.ts +0 -96
  135. package/ai/tools/agent/runStreamingAgentTool.ts +0 -73
  136. package/ai/tools/agent/skillAgentArgs.ts +0 -106
  137. package/ai/tools/agent/skillAgentPreset.ts +0 -89
  138. package/ai/tools/agent/streamParallelAgentsTool.ts +0 -122
  139. package/ai/tools/agent/updateAgentTool.ts +0 -96
  140. package/ai/tools/agent/updateSelfTool.ts +0 -113
  141. package/ai/tools/amazonProductScraperTool.ts +0 -86
  142. package/ai/tools/apifyActorClient.ts +0 -45
  143. package/ai/tools/appEditGuard.ts +0 -372
  144. package/ai/tools/appReadSnapshot.ts +0 -153
  145. package/ai/tools/appTools.ts +0 -1549
  146. package/ai/tools/applyEditTool.ts +0 -256
  147. package/ai/tools/applyLineEditsTool.ts +0 -312
  148. package/ai/tools/browserTools/click.ts +0 -33
  149. package/ai/tools/browserTools/closeSession.ts +0 -29
  150. package/ai/tools/browserTools/common.ts +0 -27
  151. package/ai/tools/browserTools/openSession.ts +0 -48
  152. package/ai/tools/browserTools/readContent.ts +0 -38
  153. package/ai/tools/browserTools/selectOption.ts +0 -46
  154. package/ai/tools/browserTools/typeText.ts +0 -42
  155. package/ai/tools/category/createCategoryTool.ts +0 -66
  156. package/ai/tools/category/queryContentsByCategoryTool.ts +0 -69
  157. package/ai/tools/category/updateContentCategoryTool.ts +0 -75
  158. package/ai/tools/cfBrowserTools.ts +0 -319
  159. package/ai/tools/cfSpeechToTextTool.ts +0 -49
  160. package/ai/tools/checkEnvTool.ts +0 -65
  161. package/ai/tools/cloudflareCrawlTool.ts +0 -289
  162. package/ai/tools/codeSearchTool.ts +0 -111
  163. package/ai/tools/codeTools.ts +0 -101
  164. package/ai/tools/createDocTool.ts +0 -132
  165. package/ai/tools/createPlanTool.ts +0 -999
  166. package/ai/tools/createSkillDocTool.ts +0 -155
  167. package/ai/tools/createWorkflowTool.ts +0 -154
  168. package/ai/tools/deepseekOcrTool.ts +0 -34
  169. package/ai/tools/delayTool.ts +0 -31
  170. package/ai/tools/deleteSpacesTool.ts +0 -325
  171. package/ai/tools/deleteSpacesToolModel.ts +0 -159
  172. package/ai/tools/devReloadUtils.ts +0 -29
  173. package/ai/tools/dialogMessageSearch.ts +0 -137
  174. package/ai/tools/doctorSkillTool.ts +0 -72
  175. package/ai/tools/ecommerceScraperTool.ts +0 -86
  176. package/ai/tools/emailTools.ts +0 -549
  177. package/ai/tools/evalSkillTool.ts +0 -92
  178. package/ai/tools/exaSearchTool.ts +0 -64
  179. package/ai/tools/execBashTool.ts +0 -379
  180. package/ai/tools/executeSqlTool.ts +0 -192
  181. package/ai/tools/fetchWebpageSupport.ts +0 -309
  182. package/ai/tools/fetchWebpageTool.ts +0 -84
  183. package/ai/tools/geminiImagePreviewTool.ts +0 -361
  184. package/ai/tools/generateDocxTool.ts +0 -215
  185. package/ai/tools/googleSearchScraperTool.ts +0 -106
  186. package/ai/tools/importDataTool.ts +0 -133
  187. package/ai/tools/importSkillTool.ts +0 -162
  188. package/ai/tools/index.ts +0 -1858
  189. package/ai/tools/listFilesTool.ts +0 -82
  190. package/ai/tools/listUserSpacesTool.ts +0 -113
  191. package/ai/tools/modelUsageTools.ts +0 -142
  192. package/ai/tools/olmOcrTool.ts +0 -34
  193. package/ai/tools/openaiImageTool.ts +0 -218
  194. package/ai/tools/paddleOcrTool.ts +0 -34
  195. package/ai/tools/prepareTools.ts +0 -23
  196. package/ai/tools/readDocTool.ts +0 -84
  197. package/ai/tools/readFileTool.ts +0 -211
  198. package/ai/tools/readTool.ts +0 -163
  199. package/ai/tools/readXPostTool.ts +0 -233
  200. package/ai/tools/rememberMemoryTool.ts +0 -84
  201. package/ai/tools/remotionVideoTool.ts +0 -151
  202. package/ai/tools/searchDialogMessagesTool.ts +0 -222
  203. package/ai/tools/searchRepoTool.ts +0 -115
  204. package/ai/tools/searchWorkspaceTool.ts +0 -259
  205. package/ai/tools/skillFollowup.ts +0 -86
  206. package/ai/tools/surfWeatherTool.ts +0 -169
  207. package/ai/tools/table/addTableRowTool.ts +0 -217
  208. package/ai/tools/table/createTableTool.ts +0 -315
  209. package/ai/tools/table/rowTools.ts +0 -366
  210. package/ai/tools/table/schemaTools.ts +0 -244
  211. package/ai/tools/table/shareTableTool.ts +0 -148
  212. package/ai/tools/table/toolShared.ts +0 -129
  213. package/ai/tools/toolApiClient.ts +0 -198
  214. package/ai/tools/toolNameAliases.ts +0 -57
  215. package/ai/tools/toolResultError.ts +0 -42
  216. package/ai/tools/toolRunSlice.ts +0 -303
  217. package/ai/tools/toolSchemaCompatibility.ts +0 -53
  218. package/ai/tools/toolVisibility.ts +0 -4
  219. package/ai/tools/types.ts +0 -20
  220. package/ai/tools/uiAskChoiceTool.ts +0 -104
  221. package/ai/tools/updateContentTitleTool.ts +0 -84
  222. package/ai/tools/updateDocTool.ts +0 -105
  223. package/ai/tools/updateUserPreferenceProfileTool.ts +0 -145
  224. package/ai/tools/whisperTool.ts +0 -77
  225. package/ai/tools/writeFileTool.ts +0 -210
  226. package/ai/tools/youtubeScraperTool.ts +0 -116
  227. package/ai/tools/ziweiChartTool.ts +0 -678
  228. package/ai/types.ts +0 -55
  229. package/ai/workflow/workflowExecutor.ts +0 -323
  230. package/ai/workflow/workflowSlice.ts +0 -73
  231. package/ai/workflow/workflowTypes.ts +0 -106
  232. package/connector-experimental/index.ts +0 -5
@@ -1,424 +0,0 @@
1
- import type { RootState } from "app/store";
2
- import type { DialogConfig } from "app/types";
3
- import { patch, read, write } from "database/dbSlice";
4
- import { DataType } from "create/types";
5
- import { createDialogMessageKeyAndId } from "database/keys";
6
- import { streamAgentChatTurn } from "ai/agent/agentSlice";
7
- import { createDialog } from "chat/dialog/dialogSlice";
8
- import { serializeMessageContent } from "chat/messages/messageContent";
9
- import { addToolMessage, selectAllMsgs } from "chat/messages/messageSlice";
10
- import type { Message } from "chat/messages/types";
11
- import { extractCustomId } from "core/prefix";
12
- import {
13
- calculateParallelBranchPricing,
14
- summarizeParallelBudget,
15
- summarizeParallelCosts,
16
- type ParallelBudgetSummary,
17
- } from "ai/tools/agent/parallelBudget";
18
-
19
- type ParallelDisplayMode = "inline" | "folded";
20
-
21
- function getBranchFinalContent(
22
- messages: Message[],
23
- options: {
24
- agentKey: string;
25
- parallelSessionId?: string;
26
- parallelBranchId?: string;
27
- }
28
- ) {
29
- const { agentKey, parallelSessionId, parallelBranchId } = options;
30
- for (let index = messages.length - 1; index >= 0; index -= 1) {
31
- const message = messages[index];
32
- if (!message || message.role !== "assistant") continue;
33
- if (parallelSessionId && message.parallelSessionId !== parallelSessionId) continue;
34
- if (parallelBranchId && message.parallelBranchId !== parallelBranchId) continue;
35
- if (message.agentKey !== agentKey && message.cybotKey !== agentKey) continue;
36
-
37
- const content = serializeMessageContent(message.content);
38
- if (content) {
39
- return { content, messageId: message.id };
40
- }
41
- }
42
-
43
- return null;
44
- }
45
-
46
- async function persistInlineBranchMessage(options: {
47
- dispatch: any;
48
- parentDialogId: string;
49
- agentKey: string;
50
- agentName: string;
51
- content: string;
52
- parallelSessionId: string;
53
- parallelBranchId: string;
54
- parallelLabel: string;
55
- parallelIndex: number;
56
- }) {
57
- const {
58
- dispatch,
59
- parentDialogId,
60
- agentKey,
61
- agentName,
62
- content,
63
- parallelSessionId,
64
- parallelBranchId,
65
- parallelLabel,
66
- parallelIndex,
67
- } = options;
68
- const { key: dbKey, messageId } = createDialogMessageKeyAndId(parentDialogId);
69
- const mirroredMessage: Message & { dialogId?: string } = {
70
- id: messageId,
71
- dbKey,
72
- dialogId: parentDialogId,
73
- role: "assistant",
74
- content,
75
- agentKey,
76
- cybotKey: agentKey,
77
- agentName,
78
- isStreaming: false,
79
- parallelSessionId,
80
- parallelBranchId,
81
- parallelLabel,
82
- parallelIndex,
83
- };
84
-
85
- dispatch(addToolMessage(mirroredMessage));
86
- await dispatch(
87
- write({
88
- data: {
89
- ...mirroredMessage,
90
- type: DataType.MSG,
91
- },
92
- customKey: dbKey,
93
- })
94
- );
95
-
96
- return {
97
- parentMessageId: messageId,
98
- parentMessageKey: dbKey,
99
- };
100
- }
101
-
102
- export async function startParallelAgentStreams(options: {
103
- task: string;
104
- agents: Array<{ agentKey: string; label?: string; branchId?: string; serverBase?: string }>;
105
- dispatch: any;
106
- getState: () => RootState;
107
- dialogId?: string;
108
- dialogKey?: string;
109
- waitForCompletion?: boolean;
110
- displayMode?: ParallelDisplayMode;
111
- budgetCredits?: number;
112
- }) {
113
- const {
114
- task,
115
- agents,
116
- dispatch,
117
- getState,
118
- dialogId,
119
- dialogKey,
120
- waitForCompletion = false,
121
- budgetCredits,
122
- } = options;
123
- const parallelSessionId = `parallel-${Date.now()}-${Math.random()
124
- .toString(36)
125
- .slice(2, 10)}`;
126
- const parentDialogId = dialogKey ? extractCustomId(dialogKey) : null;
127
- const effectiveDisplayMode: ParallelDisplayMode = "inline";
128
-
129
- const branches = await Promise.all(
130
- agents.map(async (agent, index) => {
131
- const branchId = agent.branchId?.trim() || `branch-${index + 1}`;
132
- const config = await dispatch(read({ dbKey: agent.agentKey })).unwrap();
133
- const label =
134
- agent.label?.trim() ||
135
- (typeof config?.name === "string" && config.name.trim()) ||
136
- `Agent ${index + 1}`;
137
-
138
- return {
139
- agentKey: agent.agentKey,
140
- ...(typeof agent.serverBase === "string" && agent.serverBase.trim()
141
- ? { serverBase: agent.serverBase.trim() }
142
- : {}),
143
- parallelBranchId: branchId,
144
- parallelLabel: label,
145
- parallelIndex: index,
146
- agentRecordId: typeof config?.dbKey === "string" ? config.dbKey : agent.agentKey,
147
- model: typeof config?.model === "string" ? config.model : null,
148
- provider: typeof config?.provider === "string" ? config.provider : null,
149
- inputPrice:
150
- typeof config?.inputPrice === "number" && Number.isFinite(config.inputPrice)
151
- ? config.inputPrice
152
- : null,
153
- outputPrice:
154
- typeof config?.outputPrice === "number" && Number.isFinite(config.outputPrice)
155
- ? config.outputPrice
156
- : null,
157
- };
158
- })
159
- );
160
-
161
- const branchTaskPreview = task.replace(/\s+/g, " ").trim().slice(0, 36);
162
- const useChildDialogs = waitForCompletion && !!dialogKey;
163
-
164
- const branchesWithTargets = await Promise.all(
165
- branches.map(async (branch) => {
166
- if (!useChildDialogs) {
167
- return branch;
168
- }
169
-
170
- const childTitle =
171
- branchTaskPreview.length > 0
172
- ? `${branch.parallelLabel} · ${branchTaskPreview}`
173
- : branch.parallelLabel;
174
-
175
- const created = (await dispatch(
176
- createDialog({
177
- cybots: [branch.agentKey],
178
- title: childTitle,
179
- inheritFromDialogKey: dialogKey,
180
- skipGreeting: true,
181
- })
182
- ).unwrap()) as DialogConfig;
183
-
184
- if (created?.dbKey && parentDialogId) {
185
- await dispatch(
186
- patch({
187
- dbKey: created.dbKey,
188
- changes: {
189
- parentDialogId,
190
- },
191
- })
192
- )
193
- .unwrap()
194
- .catch(() => null);
195
- }
196
-
197
- return {
198
- ...branch,
199
- childDialogKey: created?.dbKey,
200
- childDialogId: created?.dbKey ? extractCustomId(created.dbKey) : undefined,
201
- childSpaceId: created?.spaceId,
202
- };
203
- })
204
- );
205
-
206
- if (!waitForCompletion) {
207
- for (const branch of branchesWithTargets) {
208
- void dispatch(
209
- streamAgentChatTurn({
210
- agentKey: branch.agentKey,
211
- userInput: task,
212
- ...(branch.serverBase ? { serverBase: branch.serverBase } : {}),
213
- ...(dialogKey ? { dialogKey } : {}),
214
- runtimeOptions: {
215
- parallelSessionId,
216
- parallelBranchId: branch.parallelBranchId,
217
- parallelLabel: branch.parallelLabel,
218
- parallelIndex: branch.parallelIndex,
219
- },
220
- })
221
- );
222
- }
223
-
224
- return {
225
- displayMode: effectiveDisplayMode,
226
- parallelSessionId,
227
- branches: branchesWithTargets,
228
- };
229
- }
230
-
231
- const results = await Promise.all(
232
- branchesWithTargets.map(async (branch) => {
233
- try {
234
- const targetDialogKey = branch.childDialogKey || dialogKey;
235
- const targetDialogId = branch.childDialogId || dialogId;
236
- const branchTurn = await dispatch(
237
- streamAgentChatTurn({
238
- agentKey: branch.agentKey,
239
- userInput: task,
240
- ...(branch.serverBase ? { serverBase: branch.serverBase } : {}),
241
- ...(targetDialogKey ? { dialogKey: targetDialogKey } : {}),
242
- ...(!branch.childDialogKey
243
- ? {
244
- runtimeOptions: {
245
- parallelSessionId,
246
- parallelBranchId: branch.parallelBranchId,
247
- parallelLabel: branch.parallelLabel,
248
- parallelIndex: branch.parallelIndex,
249
- },
250
- }
251
- : {}),
252
- })
253
- ).unwrap();
254
-
255
- if (!targetDialogId) {
256
- return {
257
- ok: false,
258
- label: branch.parallelLabel,
259
- branchId: branch.parallelBranchId,
260
- parallelSessionId,
261
- parallelIndex: branch.parallelIndex,
262
- agentKey: branch.agentKey,
263
- dialogKey: targetDialogKey ?? null,
264
- dialogId: targetDialogId ?? null,
265
- model: branch.model,
266
- error: "missing dialogId for parallel result collection",
267
- spentCredits: null,
268
- };
269
- }
270
-
271
- const finalMessage = getBranchFinalContent(
272
- selectAllMsgs(getState(), targetDialogId) as Message[],
273
- branch.childDialogKey
274
- ? {
275
- agentKey: branch.agentKey,
276
- }
277
- : {
278
- parallelSessionId,
279
- parallelBranchId: branch.parallelBranchId,
280
- agentKey: branch.agentKey,
281
- }
282
- );
283
-
284
- if (!finalMessage?.content) {
285
- return {
286
- ok: false,
287
- label: branch.parallelLabel,
288
- branchId: branch.parallelBranchId,
289
- parallelSessionId,
290
- parallelIndex: branch.parallelIndex,
291
- agentKey: branch.agentKey,
292
- dialogKey: targetDialogKey ?? null,
293
- dialogId: targetDialogId ?? null,
294
- spaceId: branch.childSpaceId ?? null,
295
- model: branch.model,
296
- error: "branch completed without assistant content",
297
- spentCredits: null,
298
- };
299
- }
300
-
301
- const inlineProjection =
302
- effectiveDisplayMode === "inline" && parentDialogId
303
- ? await persistInlineBranchMessage({
304
- dispatch,
305
- parentDialogId,
306
- agentKey: branch.agentKey,
307
- agentName: branch.parallelLabel,
308
- content: finalMessage.content,
309
- parallelSessionId,
310
- parallelBranchId: branch.parallelBranchId,
311
- parallelLabel: branch.parallelLabel,
312
- parallelIndex: branch.parallelIndex,
313
- })
314
- : null;
315
- const pricing = calculateParallelBranchPricing({
316
- usage: branchTurn?.usage,
317
- agentKey: branch.agentKey,
318
- dialogId: targetDialogId ?? null,
319
- agentConfig: {
320
- id: branch.agentRecordId,
321
- model: branch.model,
322
- provider: branch.provider,
323
- inputPrice: branch.inputPrice,
324
- outputPrice: branch.outputPrice,
325
- },
326
- });
327
-
328
- return {
329
- ok: true,
330
- label: branch.parallelLabel,
331
- branchId: branch.parallelBranchId,
332
- parallelSessionId,
333
- parallelIndex: branch.parallelIndex,
334
- agentKey: branch.agentKey,
335
- agentName: branch.parallelLabel,
336
- dialogKey: targetDialogKey ?? null,
337
- dialogId: targetDialogId ?? null,
338
- spaceId: branch.childSpaceId ?? null,
339
- model: branch.model,
340
- provider: branch.provider,
341
- content: finalMessage.content,
342
- messageId: finalMessage.messageId,
343
- inlineMessageId: inlineProjection?.parentMessageId ?? null,
344
- inlineMessageKey: inlineProjection?.parentMessageKey ?? null,
345
- usage: branchTurn?.usage ?? null,
346
- spentCredits: pricing.spentCredits,
347
- billedModel: pricing.billedModel,
348
- billedProvider: pricing.billedProvider,
349
- billingServiceTier: pricing.billingServiceTier,
350
- pricingError: pricing.pricingError,
351
- };
352
- } catch (error: any) {
353
- return {
354
- ok: false,
355
- label: branch.parallelLabel,
356
- branchId: branch.parallelBranchId,
357
- parallelSessionId,
358
- parallelIndex: branch.parallelIndex,
359
- agentKey: branch.agentKey,
360
- dialogKey: branch.childDialogKey ?? dialogKey ?? null,
361
- dialogId: branch.childDialogId ?? dialogId ?? null,
362
- spaceId: branch.childSpaceId ?? null,
363
- model: branch.model,
364
- provider: branch.provider,
365
- error: error?.message || String(error),
366
- spentCredits: null,
367
- };
368
- }
369
- })
370
- );
371
-
372
- const successful = results.filter((item) => item.ok);
373
- const failed = results.filter((item) => !item.ok);
374
- const stats = {
375
- total: results.length,
376
- succeeded: successful.length,
377
- failed: failed.length,
378
- };
379
- const costSummary = summarizeParallelCosts(results);
380
- const budget = summarizeParallelBudget({
381
- budgetCredits,
382
- results,
383
- }) as ParallelBudgetSummary | null;
384
- const mergedContent = successful
385
- .map((item) => `## ${item.label}\n\n${item.content || "(无内容)"}`)
386
- .join("\n\n");
387
- const failedSummary = failed
388
- .map((item) => `- ${item.label}: ${item.error || "unknown error"}`)
389
- .join("\n");
390
- const llmContext = [
391
- mergedContent ? `并行分支结果:\n${mergedContent}` : "",
392
- failedSummary ? `失败分支:\n${failedSummary}` : "",
393
- costSummary.pricedBranches > 0 || budget
394
- ? [
395
- `并行成本:本轮已花费 ${costSummary.spentCredits} 积分。`,
396
- budget
397
- ? `预算 ${budget.budgetCredits} 积分,剩余 ${budget.remainingCredits} 积分。`
398
- : "",
399
- costSummary.unpricedBranches > 0
400
- ? `${costSummary.unpricedBranches} 个成功分支缺少精确定价。`
401
- : "",
402
- budget?.exhausted
403
- ? "预算已耗尽,请不要再开启新的并行轮次,直接总结当前共识与分歧。"
404
- : "",
405
- ]
406
- .filter(Boolean)
407
- .join(" ")
408
- : "",
409
- ]
410
- .filter(Boolean)
411
- .join("\n\n");
412
-
413
- return {
414
- displayMode: effectiveDisplayMode,
415
- parallelSessionId,
416
- branches: branchesWithTargets,
417
- results,
418
- stats,
419
- costSummary,
420
- ...(budget ? { budget } : {}),
421
- content: mergedContent,
422
- llmContext,
423
- };
424
- }
@@ -1,53 +0,0 @@
1
- type StartupProtocolOptions = {
2
- hasCheckEnvTool?: boolean;
3
- hasExecShellTool?: boolean;
4
- };
5
-
6
- export const buildStartupProtocolBlock = (
7
- options: StartupProtocolOptions = {}
8
- ): string => {
9
- const lines = [
10
- "--- 启动协议 ---",
11
- "每次开始处理一个新请求时,先整理启动上下文,再决定是否调用工具。",
12
- "",
13
- "启动顺序:",
14
- "1. 先读取 policy / knowledge:你的核心 prompt、自动加载的 references、以及用户策略约束。",
15
- "2. 再提炼 current mission:优先从当前用户输入和当前输入上下文里确认本轮目标、交付物和停止条件。",
16
- "3. 再吸收 recent memory:结合 Memory Overlay、历史摘要、最近工作记忆和必要的历史引用,只保留对本轮真正有帮助的部分。",
17
- "",
18
- "在第一次工具调用前,先形成一份内部 working state,至少包含:",
19
- "- current_goal:这一轮真正要完成什么",
20
- "- constraints:当前约束、偏好、边界条件",
21
- "- missing_facts:还缺哪些事实才能安全行动",
22
- "- next_action:下一步最小且高价值的动作",
23
- "",
24
- "决策规则:",
25
- "- 如果 policy / knowledge 已经足够回答,就直接回答,不要为了显得忙而乱调用工具。",
26
- "- 如果 recent memory 与当前用户输入冲突,以当前用户输入为准。",
27
- "- 如果需要依赖环境、文件状态、运行时事实或外部真值,先验证,再行动。",
28
- "- 优先小步推进;每一轮先做最能降低不确定性的动作。",
29
- ];
30
-
31
- if (options.hasCheckEnvTool || options.hasExecShellTool) {
32
- lines.push(
33
- "- 只要任务涉及命令执行、shell 语法、路径约定、运行平台或服务状态,并且这些事实还不够明确,就先确认环境。"
34
- );
35
- }
36
-
37
- if (options.hasCheckEnvTool) {
38
- lines.push(
39
- "- 环境不明确时,优先调用 checkEnv({ check: 'context' }),再决定后续命令和工具路径。"
40
- );
41
- }
42
-
43
- if (options.hasExecShellTool) {
44
- lines.push(
45
- "- 需要执行命令时,先根据已确认的环境选择 shell;Windows 默认 PowerShell,Linux/macOS 默认 bash。"
46
- );
47
- lines.push(
48
- "- 如果只是收集多个只读环境事实,优先合并成一次 shell 调用或一条组合命令,避免拆成很多小探针。"
49
- );
50
- }
51
-
52
- return lines.join("\n");
53
- };