nolo-cli 0.147.0-alpha.2 → 0.149.0-alpha.1

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 (102) hide show
  1. package/{_executeModel-3OCR5R5P.js → _executeModel-OW3H7ICR.js} +29 -28
  2. package/{action-3ZOODRBC.js → action-GI44T4DR.js} +6 -6
  3. package/{addContentAction-IJHG2ZV7.js → addContentAction-B2DRF7P6.js} +5 -5
  4. package/{addDialogAgentAction-RLPSTAQ2.js → addDialogAgentAction-2P2FLTLD.js} +4 -4
  5. package/{agentDeleteCommand-6OGADD24.js → agentDeleteCommand-7IDWF6E3.js} +14 -13
  6. package/{agentEmailCommands-OAPYGNYC.js → agentEmailCommands-A6XBQZBN.js} +31 -30
  7. package/{agentListCommands-FRJZOOEG.js → agentListCommands-IW3GQVUP.js} +16 -15
  8. package/{agentMachineCommands-OWLOV5WO.js → agentMachineCommands-DQPUIMAC.js} +14 -13
  9. package/{agentProviderCommands-TWB6E5WD.js → agentProviderCommands-YK2BIIXZ.js} +1 -1
  10. package/{agentRecordCommands-BW7HM6VH.js → agentRecordCommands-VCA76W6B.js} +31 -30
  11. package/{agentRunCommand-O2F3NU2H.js → agentRunCommand-YNLDKVR7.js} +31 -30
  12. package/{agentRuntimeLocal-QQCDFR7B.js → agentRuntimeLocal-AK2QVJHY.js} +12 -11
  13. package/{agentSlice-ZOCKW66S.js → agentSlice-O4RUQUMT.js} +5 -5
  14. package/{appDeleteCommands-OGKQC2AM.js → appDeleteCommands-N3XEVVYC.js} +15 -14
  15. package/{appDeployCommands-Y2FV4JML.js → appDeployCommands-AWFIXYVW.js} +15 -14
  16. package/{appDeployStatusCommands-FNML5SUV.js → appDeployStatusCommands-CZRON2FO.js} +15 -14
  17. package/{appGetCommands-4FOY7W5E.js → appGetCommands-XQIUY4TD.js} +15 -14
  18. package/{appListCommands-E5SF6SIY.js → appListCommands-NNG4H36Y.js} +15 -14
  19. package/{chatQueueReduxAdapter-DFZ6QB4K.js → chatQueueReduxAdapter-TJRMXMYA.js} +11 -11
  20. package/{chunk-27VHPPII.js → chunk-36KZDDO5.js} +6 -6
  21. package/{chunk-KRC6GI2Q.js → chunk-3DAVPNFT.js} +2 -2
  22. package/{chunk-T76D3OYX.js → chunk-3SV7RM24.js} +1 -1
  23. package/{chunk-O7WXJIUI.js → chunk-4H22P2JV.js} +11 -9
  24. package/{chunk-M2YBIBBS.js → chunk-5TEEECZM.js} +1 -1
  25. package/{chunk-Z7IZQF56.js → chunk-6FGTMQCL.js} +1 -1
  26. package/{chunk-ETZWFV6M.js → chunk-7CHC4W22.js} +1 -1
  27. package/{chunk-PZ3HKBET.js → chunk-ACQD6YI2.js} +19 -19
  28. package/{chunk-ZSPC3ZTC.js → chunk-AKG5W4LG.js} +1 -1
  29. package/{chunk-CCOXTK3I.js → chunk-ALFH24P3.js} +26 -0
  30. package/{chunk-7NANRWL4.js → chunk-ALGORS6Y.js} +1 -1
  31. package/chunk-ATLTFRYJ.js +411 -0
  32. package/{chunk-HNRASX3X.js → chunk-CPUFH46E.js} +1 -1
  33. package/{chunk-GMVELWJG.js → chunk-CU3QB4HW.js} +2 -2
  34. package/{chunk-LQ6P2MFG.js → chunk-DXHL7G2L.js} +14 -14
  35. package/{chunk-2EE5UD3N.js → chunk-DY7ANLKG.js} +1 -1
  36. package/{chunk-I44MDY73.js → chunk-GOH6RW6F.js} +3 -3
  37. package/chunk-HTVYCXBP.js +681 -0
  38. package/{chunk-QALRKMHF.js → chunk-HYZIYH2H.js} +5 -5
  39. package/{chunk-EFZKILX6.js → chunk-IAESIMK7.js} +1 -1
  40. package/{chunk-OXGHM2WW.js → chunk-ID7LNBWR.js} +27 -257
  41. package/{chunk-HLUYTEBY.js → chunk-K2CSUCHJ.js} +1 -1
  42. package/{chunk-JORF7I7F.js → chunk-MST6R3E4.js} +3 -3
  43. package/{chunk-QJLEMM2V.js → chunk-O2OWEFII.js} +1 -1
  44. package/{chunk-724HIKHT.js → chunk-OHOVNO7I.js} +4 -127
  45. package/{chunk-P4CRULYJ.js → chunk-OMRJYNCI.js} +3 -3
  46. package/chunk-PQWU42UQ.js +132 -0
  47. package/{chunk-JQ4LUB5I.js → chunk-PZZTFEKK.js} +1 -1
  48. package/{chunk-QIH323EV.js → chunk-QXGPFY6J.js} +1 -1
  49. package/{chunk-B7ANJQWZ.js → chunk-RSEEDUMS.js} +2 -2
  50. package/{chunk-ELYEQNUI.js → chunk-RYZINGPM.js} +3 -3
  51. package/{chunk-AATZZAZE.js → chunk-SLLGJZDT.js} +1 -1
  52. package/{chunk-3IYMTWYZ.js → chunk-SONWNI3L.js} +2 -2
  53. package/chunk-TB3MIBRC.js +1716 -0
  54. package/{chunk-2B74TU77.js → chunk-TXH4IWJL.js} +3 -3
  55. package/{chunk-UC3Q7X3J.js → chunk-TZZ2WRBL.js} +5 -5
  56. package/{chunk-36HTQWBD.js → chunk-UASIEDKM.js} +3 -3
  57. package/{chunk-BJUDYFV5.js → chunk-UQNS32WZ.js} +1 -1
  58. package/{chunk-AUXHZ2M5.js → chunk-WIWM4FE3.js} +1 -1
  59. package/{chunk-YU2THNST.js → chunk-XISEYOGH.js} +1 -1
  60. package/{chunk-BFLSOVHN.js → chunk-XYJSY4KG.js} +16 -14
  61. package/{chunk-NU4DCNMR.js → chunk-YAQJJDC2.js} +4 -571
  62. package/{chunk-D76D3RTR.js → chunk-Z4CSIXYP.js} +2 -2
  63. package/{chunk-BCJPO6SE.js → chunk-ZUEK6A6C.js} +10 -10
  64. package/{commandRegistry-OPVCVVOQ.js → commandRegistry-2KBOXZQC.js} +42 -42
  65. package/{contentThunks-IWXWFN6P.js → contentThunks-BDIQRZR6.js} +12 -12
  66. package/{createAgentAutomationAction-ROWX5ZPK.js → createAgentAutomationAction-5UGTB26P.js} +12 -12
  67. package/{createDialogAction-WLVAITHA.js → createDialogAction-B7VGVEVU.js} +13 -13
  68. package/{createPageAction-DAJL6GES.js → createPageAction-CDLDKPRM.js} +12 -12
  69. package/{dbSlice-HFPIJT5P.js → dbSlice-DQ32LYTJ.js} +4 -4
  70. package/{deleteFile-UEAD5A5Z.js → deleteFile-NX6QHCWZ.js} +2 -2
  71. package/{dialogCommands-KSPH6QOU.js → dialogCommands-G7YBVAMC.js} +15 -14
  72. package/{dialogSlice-WW75BKLO.js → dialogSlice-N3YB65G5.js} +11 -11
  73. package/{docCreateCommands-B64BLZVJ.js → docCreateCommands-ZSLGVBZT.js} +14 -13
  74. package/{docDeleteCommands-UX2GXKUT.js → docDeleteCommands-5N4GVZBG.js} +15 -14
  75. package/{docReadCommands-5A6GF3XL.js → docReadCommands-YJSAA7AV.js} +14 -13
  76. package/{docStore-2SADZYLX.js → docStore-E3CEOV5Q.js} +5 -5
  77. package/{docUpdateCommands-UTBGZPSR.js → docUpdateCommands-WEMLSW6W.js} +14 -13
  78. package/{handleSendMessageAction-2M57WHLO.js → handleSendMessageAction-DQAD5ERJ.js} +440 -106
  79. package/index.js +3 -3
  80. package/{machineCommands-7JUTOZP2.js → machineCommands-HAP75VSG.js} +30 -29
  81. package/{machineWsRunDispatch-6EETR3RV.js → machineWsRunDispatch-L32G7C4P.js} +30 -29
  82. package/{memberThunks-SKFZ37VS.js → memberThunks-5ZXPR63F.js} +5 -5
  83. package/package.json +1 -1
  84. package/{providerPresetApply-XTEXOH7X.js → providerPresetApply-DD6NGWW6.js} +1 -1
  85. package/{providerRegistry-ADYDSLKR.js → providerRegistry-XDRLMYGJ.js} +1 -1
  86. package/{read-IEJLLUXY.js → read-EPTJRAEF.js} +2 -2
  87. package/{readDocTool-4SPYCP2Y.js → readDocTool-W4NDXNEX.js} +1 -1
  88. package/{readlineWorkspace-LBLAGNGM.js → readlineWorkspace-7BC66QSX.js} +34 -33
  89. package/{removeDialogAgentAction-R4RTGM2S.js → removeDialogAgentAction-OSYNZRX7.js} +6 -6
  90. package/{runAgentClientLoop-RPEULJFS.js → runAgentClientLoop-6E6UC3CE.js} +30 -28
  91. package/{setDialogExtraReferencesAction-NU2VZ7JZ.js → setDialogExtraReferencesAction-M32UYNCG.js} +5 -5
  92. package/{setPrimaryDialogAgentAction-VUY2FRVL.js → setPrimaryDialogAgentAction-WZ7KI3YA.js} +6 -6
  93. package/{settingSlice-CNE75ISY.js → settingSlice-Q6EKL7EQ.js} +5 -5
  94. package/{spaceCommands-HZUAGZXH.js → spaceCommands-UJOVU4XI.js} +14 -13
  95. package/{streamAgentChatTurn-D5POCPVX.js → streamAgentChatTurn-3UXPYFNX.js} +71 -1268
  96. package/{switchDialogAgentAction-JC27CP72.js → switchDialogAgentAction-GMR7WN3P.js} +4 -4
  97. package/{tools-I6D2B2G6.js → tools-MKYDMWA4.js} +21 -21
  98. package/{tuiSummaryLlmCaller-RVW6CJSK.js → tuiSummaryLlmCaller-3YFNHCTW.js} +7 -7
  99. package/{updateDialogTitleAction-7YZ7FNAK.js → updateDialogTitleAction-UPFV7TDT.js} +12 -12
  100. package/chunk-BJ3KD73I.js +0 -155
  101. package/chunk-JK5XW3NO.js +0 -108
  102. package/chunk-YYKMFBK7.js +0 -306
@@ -2,14 +2,21 @@ import {
2
2
  applyModelLayerOverride
3
3
  } from "./chunk-LTRXGFMS.js";
4
4
  import {
5
- buildStaticUserPolicyContext,
6
- resolveSpaceContextPreloadPlan
7
- } from "./chunk-QJLEMM2V.js";
8
- import {
5
+ applyImageConfigRuntimeOverride,
6
+ buildDynamicContexts,
9
7
  buildForegroundTurnAdmissionFetchInit,
8
+ buildStaticContexts,
9
+ compressOldToolResults,
10
10
  consumeAgentRunStream,
11
- projectDesktopToolUiContent
12
- } from "./chunk-YYKMFBK7.js";
11
+ mergeAgentToolsWithRuntime,
12
+ mergeContexts,
13
+ projectDesktopToolUiContent,
14
+ resolveImageGenerationStreamingState,
15
+ resolveTurnToolContext,
16
+ trimMessagesWithSummary,
17
+ validateAccessAndBalance
18
+ } from "./chunk-TB3MIBRC.js";
19
+ import "./chunk-O2OWEFII.js";
13
20
  import {
14
21
  buildCliPrompt
15
22
  } from "./chunk-ATNTHIZI.js";
@@ -20,11 +27,11 @@ import {
20
27
  readStreamChunk,
21
28
  sendOpenAICompletionsRequest,
22
29
  updateTotalUsage
23
- } from "./chunk-LQ6P2MFG.js";
30
+ } from "./chunk-DXHL7G2L.js";
24
31
  import "./chunk-JEXVIMYZ.js";
25
32
  import {
26
33
  prepareTools
27
- } from "./chunk-KRC6GI2Q.js";
34
+ } from "./chunk-3DAVPNFT.js";
28
35
  import {
29
36
  isContextOverflowText,
30
37
  parseApiError
@@ -32,71 +39,50 @@ import {
32
39
  import {
33
40
  INVALID_TOOL_ARGS_REPLACEMENT,
34
41
  buildInvalidToolCallSelfHealResult,
35
- fetchReferenceContents,
36
42
  generateRequestBody,
37
43
  isResponsesConversationStateRejection,
38
- mergeReferences,
39
44
  parseToolCallArguments,
40
45
  performFetchRequest,
41
46
  resolveAgentCallPlan,
42
47
  resolveClientWire,
43
- resolveReferenceAssets,
44
- resolveToolsFromKeys,
45
48
  sanitizeOutboundResponsesInput,
46
49
  selectResponsesConversationState,
47
50
  updateResponsesConversationState
48
- } from "./chunk-NU4DCNMR.js";
51
+ } from "./chunk-YAQJJDC2.js";
49
52
  import "./chunk-EOARMOVD.js";
50
53
  import "./chunk-HS7MLR74.js";
51
54
  import {
52
55
  performServerProxyFetchWithRetry
53
- } from "./chunk-JK5XW3NO.js";
54
- import {
55
- getAllToolRuns
56
- } from "./chunk-OXGHM2WW.js";
57
- import "./chunk-2EE5UD3N.js";
56
+ } from "./chunk-HTVYCXBP.js";
57
+ import "./chunk-ID7LNBWR.js";
58
+ import "./chunk-DY7ANLKG.js";
58
59
  import "./chunk-5UTFL4QJ.js";
59
60
  import "./chunk-KQHGZWSV.js";
60
61
  import {
61
62
  createSSEParser,
62
- resolveAgentRecommendedSkillNames,
63
- resolveAgentRequiredPackIds,
64
63
  waitForAbortableDelay
65
- } from "./chunk-BJ3KD73I.js";
64
+ } from "./chunk-ATLTFRYJ.js";
66
65
  import "./chunk-NF64D32W.js";
67
66
  import "./chunk-3L2WKC3W.js";
68
67
  import "./chunk-4JMDLJAD.js";
69
- import "./chunk-P4CRULYJ.js";
70
- import "./chunk-HNRASX3X.js";
68
+ import "./chunk-OMRJYNCI.js";
69
+ import "./chunk-CPUFH46E.js";
71
70
  import "./chunk-YRRASA5Q.js";
72
71
  import "./chunk-63W5N6P3.js";
73
72
  import "./chunk-VF4K2QE6.js";
73
+ import "./chunk-TXH4IWJL.js";
74
+ import "./chunk-6FGTMQCL.js";
75
+ import "./chunk-XPRWFQQK.js";
76
+ import "./chunk-UQNS32WZ.js";
77
+ import "./chunk-MEYIRKDN.js";
78
+ import "./chunk-36KZDDO5.js";
74
79
  import {
75
- getDocState
76
- } from "./chunk-2B74TU77.js";
77
- import "./chunk-Z7IZQF56.js";
78
- import {
79
- resolveToolBaseUrl
80
- } from "./chunk-XPRWFQQK.js";
81
- import "./chunk-BJUDYFV5.js";
82
- import {
83
- extractCategorizedMentions
84
- } from "./chunk-MEYIRKDN.js";
85
- import {
86
- getTableState
87
- } from "./chunk-27VHPPII.js";
88
- import {
89
- getCurrentSpaceId,
90
- getCurrentSpaceIdRaw,
91
- getViewMode
80
+ getCurrentSpaceId
92
81
  } from "./chunk-ZJ7UHBJS.js";
93
82
  import {
94
- PERSONALIZATION_DIALOG_CATEGORY,
95
83
  addToolMessage,
96
84
  addUserMessage,
97
- buildPersonalizationDialogPolicyContext,
98
85
  estimateMissingUsage,
99
- extractReferenceKeysFromMessage,
100
86
  finalizeTransientMessageOnError,
101
87
  messageStreamEnd,
102
88
  messageStreaming,
@@ -109,16 +95,16 @@ import {
109
95
  shouldBlockForGptPro,
110
96
  updateTokens,
111
97
  updateToolMessage
112
- } from "./chunk-PZ3HKBET.js";
98
+ } from "./chunk-ACQD6YI2.js";
113
99
  import "./chunk-523DITKR.js";
114
100
  import "./chunk-YYLHWIW6.js";
115
101
  import "./chunk-6O4IK4V2.js";
116
- import "./chunk-UC3Q7X3J.js";
102
+ import "./chunk-TZZ2WRBL.js";
117
103
  import {
118
104
  createCliChatTurnStream,
119
105
  getCliChatSession,
120
106
  startCliChatSession
121
- } from "./chunk-D76D3RTR.js";
107
+ } from "./chunk-Z4CSIXYP.js";
122
108
  import "./chunk-5RGU3J7P.js";
123
109
  import "./chunk-M76ECQRD.js";
124
110
  import {
@@ -129,50 +115,35 @@ import {
129
115
  dequeueUserInput,
130
116
  removeActiveController,
131
117
  selectActiveControllers,
132
- selectPendingFiles,
133
118
  selectPendingUserInputQueue,
134
119
  setDialogTurnPhase,
135
120
  tokenUsageLiveUpdate
136
121
  } from "./chunk-B6SAMB33.js";
137
122
  import "./chunk-YDH3FDFQ.js";
138
123
  import "./chunk-MX574M24.js";
139
- import {
140
- getFinalPrice,
141
- getModelPricing,
142
- getPrices,
143
- hasExplicitAgentPricing
144
- } from "./chunk-4DPP773Q.js";
124
+ import "./chunk-4DPP773Q.js";
145
125
  import {
146
126
  getPublicImageAgentDefaultProfile,
147
127
  getPublicImageAgentMode
148
128
  } from "./chunk-VIDPVFP3.js";
149
129
  import "./chunk-AGGIDPCZ.js";
150
- import "./chunk-GMVELWJG.js";
130
+ import "./chunk-CU3QB4HW.js";
151
131
  import "./chunk-B2XUQXQX.js";
152
- import {
153
- TOOL_PACKS,
154
- addDefaultSystemCapabilityTools,
155
- applyDefaultWebToolPacks,
156
- applyDisabledTools,
157
- applySystemBuiltinSkillFilter,
158
- expandEnabledPackPromptPatches,
159
- expandEnabledPacks,
160
- resolveEffectiveEnabledPacks
161
- } from "./chunk-6TPOEJMQ.js";
132
+ import "./chunk-6TPOEJMQ.js";
162
133
  import "./chunk-AUDNYVRC.js";
163
134
  import "./chunk-KHCLMKZZ.js";
164
135
  import {
165
136
  assertDesktopAgentRuntimeTurnBodyHasNoRawSecrets,
166
137
  buildDesktopAgentRuntimeAgentConfigSnapshot,
167
138
  buildDesktopAgentRuntimeDialogHistorySnapshot,
168
- projectToolMessageContent,
169
139
  resolveAgentContextWindow,
170
140
  stripImagePartsForTextOnlyAgent
171
- } from "./chunk-724HIKHT.js";
141
+ } from "./chunk-OHOVNO7I.js";
172
142
  import "./chunk-5ZUL4CUO.js";
173
143
  import "./chunk-CQ3WA2NE.js";
144
+ import "./chunk-PQWU42UQ.js";
174
145
  import "./chunk-N7J63Q6C.js";
175
- import "./chunk-HLUYTEBY.js";
146
+ import "./chunk-K2CSUCHJ.js";
176
147
  import {
177
148
  extractImagePartsFromResponseOutput,
178
149
  extractTextFromResponseOutput,
@@ -185,12 +156,9 @@ import "./chunk-H6A6X4EK.js";
185
156
  import "./chunk-S5XGT6GB.js";
186
157
  import "./chunk-27ONFIEY.js";
187
158
  import {
188
- getModelContextWindow,
189
159
  getModelInfo
190
- } from "./chunk-ZSPC3ZTC.js";
191
- import {
192
- planContextUsage
193
- } from "./chunk-ELYEQNUI.js";
160
+ } from "./chunk-AKG5W4LG.js";
161
+ import "./chunk-RYZINGPM.js";
194
162
  import {
195
163
  estimateTokenCount
196
164
  } from "./chunk-PSCNXBYA.js";
@@ -204,35 +172,22 @@ import {
204
172
  toErrorMessage
205
173
  } from "./chunk-HNMXYYJR.js";
206
174
  import {
207
- getApiEndpoint,
208
- getModelConfig,
209
- getProviderByModelName
175
+ getApiEndpoint
210
176
  } from "./chunk-3BXNTXYI.js";
211
177
  import "./chunk-W7XHHYWM.js";
212
- import "./chunk-B7ANJQWZ.js";
178
+ import "./chunk-RSEEDUMS.js";
213
179
  import "./chunk-UAD2WT54.js";
214
180
  import "./chunk-ZWQUWF6W.js";
215
- import {
216
- buildLinkedSpacesSection,
217
- buildSpaceContextLayer
218
- } from "./chunk-HDLLCBRF.js";
181
+ import "./chunk-HDLLCBRF.js";
219
182
  import "./chunk-4VJAC32I.js";
220
- import {
221
- canonicalizeToolNames,
222
- prioritizeToolNames
223
- } from "./chunk-XUWRURDF.js";
183
+ import "./chunk-XUWRURDF.js";
224
184
  import "./chunk-5J3PYNUP.js";
225
185
  import "./chunk-CYSYR67N.js";
226
186
  import "./chunk-Y3PMXGLH.js";
227
187
  import {
228
- selectAiRecentContentLimit,
229
188
  selectCurrentServer,
230
- selectGlobalPrompt,
231
- selectKnowledgeCaptureLevel,
232
- selectMaxExecutionTime,
233
- selectSpaceContextLevel,
234
- selectUserTonePreset
235
- } from "./chunk-3IYMTWYZ.js";
189
+ selectMaxExecutionTime
190
+ } from "./chunk-SONWNI3L.js";
236
191
  import "./chunk-Y5GCAMGP.js";
237
192
  import "./chunk-QDSINZM3.js";
238
193
  import {
@@ -243,29 +198,25 @@ import {
243
198
  read,
244
199
  selectById,
245
200
  write
246
- } from "./chunk-QALRKMHF.js";
247
- import "./chunk-ETZWFV6M.js";
201
+ } from "./chunk-HYZIYH2H.js";
202
+ import "./chunk-7CHC4W22.js";
248
203
  import {
249
- asNonEmptyStringArray,
250
204
  createDialogMessageKeyAndId,
251
- dialogMessageKey,
252
- metaKey
205
+ dialogMessageKey
253
206
  } from "./chunk-3AH7LNUB.js";
254
207
  import "./chunk-WWC7I6TA.js";
255
208
  import "./chunk-QSJ3HFEF.js";
256
- import "./chunk-EFZKILX6.js";
209
+ import "./chunk-IAESIMK7.js";
257
210
  import {
258
211
  selectRuntimeCurrentServer
259
- } from "./chunk-AUXHZ2M5.js";
212
+ } from "./chunk-WIWM4FE3.js";
260
213
  import {
261
214
  getIsDesktopApp,
262
215
  isAbortError
263
216
  } from "./chunk-QOKAKDPE.js";
264
217
  import {
265
- getSessionSnapshotForState,
266
218
  selectIdentityToken,
267
219
  selectIdentityUser,
268
- selectIdentityUserBalance,
269
220
  selectIdentityUserId
270
221
  } from "./chunk-SEJ5OS6F.js";
271
222
  import "./chunk-OW765XBU.js";
@@ -369,107 +320,6 @@ function runChatQueueTurnEnd(payload) {
369
320
  };
370
321
  }
371
322
 
372
- // packages/ai/agent/getFullChatContextKeys.ts
373
- var difference = (arrA, arrB) => {
374
- if (!arrA.length) return [];
375
- if (!arrB.length) return [...arrA];
376
- const exclude = new Set(arrB);
377
- return arrA.filter((item) => !exclude.has(item));
378
- };
379
- var getFullChatContextKeys = async (state, dispatch, agentConfig, userInput, dialogConfig) => {
380
- const msgs = selectAllMsgs(
381
- state,
382
- dialogConfig?.dbKey ? extractCustomId(dialogConfig.dbKey) : dialogConfig?.id
383
- );
384
- const botInstructionKeys = /* @__PURE__ */ new Set();
385
- const botKnowledgeKeys = /* @__PURE__ */ new Set();
386
- if (Array.isArray(agentConfig.references)) {
387
- for (const ref of agentConfig.references) {
388
- if (!ref?.dbKey) continue;
389
- if (ref.type === "instruction") {
390
- botInstructionKeys.add(ref.dbKey);
391
- } else {
392
- botKnowledgeKeys.add(ref.dbKey);
393
- }
394
- }
395
- }
396
- const currentInputKeys = /* @__PURE__ */ new Set();
397
- if (Array.isArray(userInput)) {
398
- for (const part of userInput) {
399
- if (part?.pageKey) currentInputKeys.add(part.pageKey);
400
- if (part?.dialogKey) currentInputKeys.add(part.dialogKey);
401
- }
402
- }
403
- const historyKeys = /* @__PURE__ */ new Set();
404
- const savedKeys = dialogConfig?.referenceKeys;
405
- if (Array.isArray(savedKeys)) {
406
- savedKeys.forEach((k) => historyKeys.add(k));
407
- }
408
- const scanContentParts = (msg) => {
409
- if (!msg) return;
410
- for (const key of extractReferenceKeysFromMessage(msg)) {
411
- historyKeys.add(key);
412
- }
413
- };
414
- if (msgs && msgs.length > 0) {
415
- const summarizedBeforeId = dialogConfig?.summarizedBeforeId;
416
- if (!summarizedBeforeId) {
417
- for (const msg of msgs) scanContentParts(msg);
418
- } else {
419
- let foundMarker = false;
420
- let startScan = false;
421
- for (const msg of msgs) {
422
- if (!startScan) {
423
- if (msg.id === summarizedBeforeId) {
424
- foundMarker = true;
425
- startScan = true;
426
- }
427
- continue;
428
- }
429
- scanContentParts(msg);
430
- }
431
- if (!foundMarker) {
432
- console.warn(`[getFullChatContextKeys] marker ${summarizedBeforeId} not found, scanning all`);
433
- for (const msg of msgs) scanContentParts(msg);
434
- }
435
- }
436
- }
437
- return {
438
- botInstructionKeys,
439
- currentInputKeys,
440
- historyKeys,
441
- botKnowledgeKeys
442
- };
443
- };
444
- var deduplicateContextKeys = (keys) => {
445
- const {
446
- botInstructionKeys,
447
- currentInputKeys,
448
- historyKeys,
449
- botKnowledgeKeys
450
- } = keys;
451
- const finalBotInstructionKeys = Array.from(botInstructionKeys);
452
- const finalCurrentInputKeys = difference(
453
- Array.from(currentInputKeys),
454
- finalBotInstructionKeys
455
- );
456
- const finalHistoryKeys = difference(Array.from(historyKeys), [
457
- ...finalBotInstructionKeys,
458
- ...finalCurrentInputKeys
459
- ]);
460
- const finalBotKnowledgeKeys = difference(Array.from(botKnowledgeKeys), [
461
- ...finalBotInstructionKeys,
462
- ...finalCurrentInputKeys,
463
- ...finalHistoryKeys
464
- ]);
465
- return {
466
- botInstructionsContext: finalBotInstructionKeys,
467
- currentInputContext: finalCurrentInputKeys,
468
- historyContext: finalHistoryKeys,
469
- botKnowledgeContext: finalBotKnowledgeKeys
470
- };
471
- };
472
-
473
323
  // packages/ai/chat/streamRetry.ts
474
324
  var MAX_INITIAL_STREAM_RETRIES = 3;
475
325
  var DEFAULT_INITIAL_STREAM_RETRY_AFTER_MS = 1500;
@@ -1246,1008 +1096,6 @@ function applyQuickChatModelOverride(base, override) {
1246
1096
  );
1247
1097
  }
1248
1098
 
1249
- // packages/ai/agent/canvasEditingContext.ts
1250
- function buildCanvasNodeEditingContextSummary(runtimeOptions) {
1251
- if (runtimeOptions?.editingTarget?.kind !== "canvas_node") return null;
1252
- const editingTarget = runtimeOptions.editingTarget;
1253
- const metadata = editingTarget.metadata ?? {};
1254
- const selectedNodeId = typeof metadata.selectedNodeId === "string" ? metadata.selectedNodeId : editingTarget.key ?? "(\u672A\u77E5\u8282\u70B9)";
1255
- const part = typeof metadata.part === "string" ? metadata.part : editingTarget.title ?? selectedNodeId;
1256
- const nodeType = typeof metadata.type === "string" ? metadata.type : "(\u672A\u77E5\u7C7B\u578B)";
1257
- const path = Array.isArray(metadata.path) ? metadata.path.filter((item) => typeof item === "string") : [];
1258
- const props = asRecordOrEmpty(metadata.props);
1259
- const style = asRecordOrEmpty(metadata.style);
1260
- return [
1261
- "\u5F53\u524D\u7F16\u8F91\u76EE\u6807\uFF1ACanvas Tree \u4E2D\u7684\u4E00\u4E2A\u9009\u4E2D\u8282\u70B9\u3002",
1262
- `- \u8282\u70B9 ID: ${selectedNodeId}`,
1263
- `- part: ${part}`,
1264
- `- \u8282\u70B9\u7C7B\u578B: ${nodeType}`,
1265
- ...path.length ? [`- \u8282\u70B9\u8DEF\u5F84: ${path.join(" > ")}`] : [],
1266
- "",
1267
- "\u5F53\u524D\u8282\u70B9 props:",
1268
- JSON.stringify(props, null, 2),
1269
- "",
1270
- "\u5F53\u524D\u8282\u70B9 style:",
1271
- JSON.stringify(style, null, 2),
1272
- "",
1273
- "\u3010\u7ED9 AI \u7684\u64CD\u4F5C\u6307\u5357 / \u975E\u7528\u6237\u539F\u8BDD\u3011",
1274
- `1. \u5982\u679C\u7528\u6237\u8981\u6C42\u4FEE\u6539\u5F53\u524D\u6A21\u5757\uFF0C\u53EA\u8F93\u51FA updateNode\uFF0C\u76EE\u6807 id \u5FC5\u987B\u662F ${selectedNodeId}\u3002`,
1275
- "2. \u4E0D\u8981\u91CD\u5EFA root/shell\uFF0C\u4E0D\u8981\u91CD\u65B0 append \u5DF2\u5B58\u5728\u7684\u5927\u5757\u5185\u5BB9\u3002",
1276
- "3. \u9664\u975E\u7528\u6237\u660E\u786E\u8981\u6C42\u65B0\u589E\u5B50\u6A21\u5757\uFF0C\u5426\u5219\u4E0D\u8981 appendNode\u3002",
1277
- "4. \u56DE\u590D\u4ECD\u5FC5\u987B\u9075\u5B88 Canvas Tree MVP \u534F\u8BAE\uFF1A\u53EA\u8F93\u51FA canvas_snapshot NDJSON\uFF0C\u4E0D\u8981\u8F93\u51FA\u89E3\u91CA\u6216\u6E90\u7801\u3002"
1278
- ].join("\n");
1279
- }
1280
-
1281
- // packages/ai/agent/buildEditingContext.ts
1282
- var buildAppConstraintPacks = (args) => {
1283
- const imports = new Set(args.externalImports);
1284
- const fileSet = new Set(args.fileNames);
1285
- const packs = [
1286
- {
1287
- id: "repair-loop",
1288
- title: "\u9884\u68C0\u4E0E\u5B9A\u70B9\u4FEE\u590D",
1289
- rules: [
1290
- "\u6BCF\u6B21\u6539\u5B8C\u4EE3\u7801\u540E\uFF0C\u5148\u8C03\u7528 appPreflight\uFF0C\u53EA\u6709\u9884\u68C0\u901A\u8FC7\u540E\u518D\u8C03\u7528 appDeploy\u3002",
1291
- "\u5982\u679C preflight / deploy \u5931\u8D25\uFF0C\u4F18\u5148\u6839\u636E\u8FD4\u56DE\u7684 issues \u505A\u5B9A\u70B9\u4FEE\u590D\uFF0C\u7136\u540E\u91CD\u65B0 preflight\uFF1B\u4E0D\u8981\u65E0\u5173\u91CD\u5199\u6574\u9875\u5E94\u7528\u3002",
1292
- "\u5982\u679C\u5DE5\u5177\u7ED3\u679C\u91CC\u5E26\u6709 repairPlan\uFF0C\u9ED8\u8BA4\u7ACB\u5373\u6267\u884C repairPlan \u4E2D\u7684\u5C40\u90E8\u4FEE\u590D\u6B65\u9AA4\uFF0C\u4E0D\u8981\u5148\u505C\u4E0B\u6765\u95EE\u7528\u6237\u3002",
1293
- "\u5982\u679C\u5DE5\u5177\u7ED3\u679C\u660E\u786E\u8BF4\u660E\u662F HTML / \u975E JSON \u54CD\u5E94\u3001transport failure \u6216 retryable=false\uFF0C\u505C\u6B62\u81EA\u52A8 deploy \u91CD\u8BD5\uFF1B\u8FD9\u8BF4\u660E\u5F53\u524D\u662F\u5E73\u53F0\u901A\u9053\u5F02\u5E38\uFF0C\u4E0D\u662F\u4EE3\u7801\u95EE\u9898\u3002"
1294
- ]
1295
- },
1296
- {
1297
- id: "design-system",
1298
- title: "\u8BBE\u8BA1\u7CFB\u7EDF\u4E0E\u5C0F\u6539\u52A8\u7EA6\u675F",
1299
- rules: [
1300
- "\u5148\u68C0\u67E5\u5F53\u524D\u5E94\u7528\u662F\u5426\u5DF2\u7ECF\u6709 theme / tokens / designSystem / \u5171\u4EAB\u6837\u5F0F\u5E38\u91CF\uFF1B\u5982\u679C\u5DF2\u6709\uFF0C\u4F18\u5148\u6CBF\u7528\u8FD9\u5957\u8BBE\u8BA1\u7CFB\u7EDF\uFF0C\u4E0D\u8981\u5E73\u884C\u518D\u9020\u4E00\u5957\u3002",
1301
- "\u5982\u679C\u5F53\u524D\u5E94\u7528\u8FD8\u6CA1\u6709\u8BBE\u8BA1\u7CFB\u7EDF\uFF0C\u800C\u7528\u6237\u9700\u6C42\u6D89\u53CA UI / \u6837\u5F0F / \u65B0\u9875\u9762\uFF0C\u4F18\u5148\u8865\u4E00\u5C42\u6700\u5C0F\u5171\u4EAB token\uFF08colors\u3001typography\u3001spacing\u3001radius\u3001shadow\uFF09\uFF0C\u518D\u8BA9\u7EC4\u4EF6\u6D88\u8D39\u8FD9\u4E9B token\u3002",
1302
- "\u5982\u679C\u5F53\u524D\u5E94\u7528\u662F\u65E7\u5199\u6CD5\uFF1A\u89C6\u89C9\u503C\u6563\u843D\u5728\u591A\u4E2A\u7EC4\u4EF6\u7684\u786C\u7F16\u7801 style / \u5E38\u91CF\u91CC\uFF0C\u800C\u672C\u6B21\u9700\u6C42\u53EA\u662F\u8C03\u5B57\u4F53\u3001\u989C\u8272\u3001\u95F4\u8DDD\u3001\u5706\u89D2\u3001\u9634\u5F71\uFF0C\u9ED8\u8BA4\u6267\u884C\u4E00\u6B21\u6700\u5C0F token \u8FC1\u79FB\uFF0C\u518D\u5728 token \u5C42\u5B8C\u6210\u8C03\u6574\uFF1B\u4E0D\u8981\u7EE7\u7EED\u628A\u65B0\u6570\u5B57\u6563\u843D\u5199\u56DE\u591A\u4E2A\u4F4D\u7F6E\u3002",
1303
- "\u5F53\u7528\u6237\u53EA\u662F\u60F3\u8C03\u5B57\u4F53\u5927\u5C0F\u3001\u5B57\u91CD\u3001\u989C\u8272\u3001\u5706\u89D2\u3001\u9634\u5F71\u3001\u95F4\u8DDD\u7B49\u89C6\u89C9\u53C2\u6570\u65F6\uFF0C\u4F18\u5148\u4FEE\u6539 token \u6216\u547D\u4E2D\u7684\u5C40\u90E8\u7EC4\u4EF6\uFF0C\u4E0D\u8981\u987A\u624B\u91CD\u5199\u6574\u4E2A\u9875\u9762\u7ED3\u6784\u3002",
1304
- "\u9664\u975E\u7528\u6237\u660E\u786E\u8981\u6C42\u6574\u4F53\u6539\u7248\u6216\u91CD\u505A\u98CE\u683C\uFF0C\u5426\u5219\u4E0D\u8981\u8FDE\u5E26\u4FEE\u6539\u5E03\u5C40\u3001\u7EC4\u4EF6\u6811\u3001\u6587\u6848\u3001\u6570\u636E\u6D41\u3001\u8DEF\u7531\u6216\u672A\u547D\u4E2D\u7684\u9875\u9762\u3002",
1305
- "\u5982\u679C\u53EA\u662F\u5C0F\u6539\u4E00\u5904\uFF0C\u5C3D\u91CF\u628A\u53D8\u66F4\u6536\u655B\u5728\u5C11\u6570\u6587\u4EF6\uFF0C\u5E76\u4FDD\u6301\u672A\u547D\u4E2D\u6587\u4EF6\u7684\u7ED3\u6784\u4E0E\u547D\u540D\u7A33\u5B9A\u3002"
1306
- ]
1307
- }
1308
- ];
1309
- if (args.framework === "react-spa" || fileSet.has("main.tsx") || fileSet.has("App.tsx")) {
1310
- packs.push({
1311
- id: "react-spa-core",
1312
- title: "React SPA \u5F62\u6001\u4FDD\u6301",
1313
- rules: [
1314
- '\u7EE7\u7EED\u6CBF\u7528 framework: "react-spa" + files\uFF0C\u4E0D\u8981\u9000\u56DE\u5355\u6587\u4EF6 Worker\u3002',
1315
- "\u4FDD\u7559\u7A33\u5B9A\u5165\u53E3\u7ED3\u6784\uFF0C\u4F18\u5148\u7EF4\u62A4 main.tsx + App.tsx\uFF0C\u518D\u5C40\u90E8\u4FEE\u6539\u7EC4\u4EF6\u6587\u4EF6\u3002"
1316
- ]
1317
- });
1318
- }
1319
- if (imports.has("react-icons/lu")) {
1320
- packs.push({
1321
- id: "react-icons-lu",
1322
- title: "Lucide \u56FE\u6807\u5B89\u5168\u89C4\u5219",
1323
- rules: [
1324
- "\u53EA\u80FD\u4F7F\u7528 react-icons/lu \u4E2D\u771F\u5B9E\u5B58\u5728\u7684\u56FE\u6807\u540D\uFF0C\u4E0D\u8981\u731C\u6D4B\u53D8\u4F53\u540D\u3002",
1325
- "\u5982\u679C\u4E0D\u786E\u5B9A\u56FE\u6807\u540D\uFF0C\u4F18\u5148\u4F7F\u7528 LuCircle\u3001LuCheck\u3001LuX\u3001LuInfo\u3001LuArrowRight \u8FD9\u7C7B\u57FA\u7840\u56FE\u6807\u3002"
1326
- ]
1327
- });
1328
- }
1329
- if (imports.has("leaflet") || imports.has("react-leaflet")) {
1330
- packs.push({
1331
- id: "leaflet",
1332
- title: "Leaflet \u5730\u56FE\u7EA6\u675F",
1333
- rules: [
1334
- "\u4E0D\u8981\u624B\u52A8 import leaflet.css\uFF1B\u5E73\u53F0\u4F1A\u81EA\u52A8\u6CE8\u5165 Leaflet \u6837\u5F0F\u3002",
1335
- "\u4FEE\u6539\u5730\u56FE\u65F6\u4F18\u5148\u4FDD\u7559\u73B0\u6709\u5750\u6807\u3001\u7F29\u653E\u548C\u56FE\u5C42\u7ED3\u6784\uFF0C\u53EA\u505A\u5FC5\u8981\u7684\u4EA4\u4E92\u6216\u89C6\u89C9\u8C03\u6574\u3002"
1336
- ]
1337
- });
1338
- }
1339
- if (imports.has("@xyflow/react")) {
1340
- packs.push({
1341
- id: "xyflow",
1342
- title: "Flow \u56FE\u7F16\u8F91\u7EA6\u675F",
1343
- rules: [
1344
- "\u4E0D\u8981\u65B0\u589E\u5916\u90E8 CSS import\uFF1B\u9700\u8981\u6837\u5F0F\u65F6\u76F4\u63A5\u8865\u6700\u5C0F\u5FC5\u8981\u5185\u8054\u6837\u5F0F\u6216\u7EC4\u4EF6\u5185 style \u6807\u7B7E\u3002",
1345
- "\u4F18\u5148\u590D\u7528\u73B0\u6709\u8282\u70B9/\u8FB9\u6570\u636E\u7ED3\u6784\uFF0C\u907F\u514D\u91CD\u5199\u6574\u5957 flow \u753B\u5E03\u3002"
1346
- ]
1347
- });
1348
- }
1349
- if (imports.has("echarts") || imports.has("echarts-for-react")) {
1350
- packs.push({
1351
- id: "echarts",
1352
- title: "\u56FE\u8868\u6539\u52A8\u7EA6\u675F",
1353
- rules: [
1354
- "\u4F18\u5148\u5C40\u90E8\u4FEE\u6539 option \u914D\u7F6E\u3001\u6570\u636E\u6620\u5C04\u548C\u7EC4\u4EF6 props\uFF0C\u4E0D\u8981\u91CD\u5199\u6574\u4E2A\u56FE\u8868\u9875\u9762\u3002",
1355
- "\u54CD\u5E94\u5F0F\u5E03\u5C40\u4F18\u5148\u9760\u5BB9\u5668\u5C3A\u5BF8\u548C\u73B0\u6709\u7EC4\u4EF6\u7ED3\u6784\u8C03\u6574\uFF0C\u4E0D\u8981\u989D\u5916\u5F15\u5165 CSS \u6587\u4EF6\u3002"
1356
- ]
1357
- });
1358
- }
1359
- if (imports.has("docx") || imports.has("xlsx")) {
1360
- packs.push({
1361
- id: "file-processing",
1362
- title: "\u6587\u6863/\u8868\u683C\u5904\u7406\u7EA6\u675F",
1363
- rules: [
1364
- "\u4E0D\u8981\u628A\u5927\u578B\u6570\u636E\u6216\u6A21\u677F\u5185\u5BB9\u76F4\u63A5\u5185\u5D4C\u8FDB\u4EE3\u7801\u5E38\u91CF\uFF1B\u4F18\u5148\u4FDD\u7559\u8FD0\u884C\u65F6\u52A0\u8F7D\u65B9\u5F0F\u3002",
1365
- "\u4FEE\u6539\u5BFC\u5165\u5BFC\u51FA\u903B\u8F91\u65F6\uFF0C\u4F18\u5148\u6CBF\u7528\u73B0\u6709\u6587\u4EF6\u5904\u7406\u94FE\u8DEF\u548C\u6570\u636E\u7ED3\u6784\u3002"
1366
- ]
1367
- });
1368
- }
1369
- return packs;
1370
- };
1371
- var formatAppConstraintPacks = (packs) => {
1372
- if (packs.length === 0) return [];
1373
- return [
1374
- "",
1375
- "\u5F53\u524D\u6FC0\u6D3B\u7EA6\u675F\u5305\uFF08\u6309\u5F53\u524D\u5E94\u7528\u4F9D\u8D56/\u5F62\u6001\u52A8\u6001\u6CE8\u5165\uFF09\uFF1A",
1376
- ...packs.flatMap((pack) => [
1377
- `- ${pack.title}\uFF08${pack.id}\uFF09`,
1378
- ...pack.rules.map((rule) => ` - ${rule}`)
1379
- ])
1380
- ];
1381
- };
1382
- function resolveEditingTargetTableIdentity(editingTarget) {
1383
- if (!editingTarget || editingTarget.kind !== "table") return null;
1384
- const metadata = editingTarget.metadata;
1385
- const tenantId = typeof editingTarget.tenantId === "string" && editingTarget.tenantId || typeof metadata?.tenantId === "string" && metadata.tenantId || void 0;
1386
- const tableId = typeof editingTarget.tableId === "string" && editingTarget.tableId || typeof metadata?.tableId === "string" && metadata.tableId || void 0;
1387
- if (!tenantId || !tableId) return null;
1388
- return { tenantId, tableId };
1389
- }
1390
- var buildEditingContextSummary = (state, runtimeOptions) => {
1391
- const targetKind = runtimeOptions?.editingTarget?.kind;
1392
- if (targetKind === "table") {
1393
- const editingTarget = runtimeOptions?.editingTarget;
1394
- const targetIdentity = resolveEditingTargetTableIdentity(editingTarget);
1395
- if (!targetIdentity) return null;
1396
- const { tenantId, tableId } = targetIdentity;
1397
- const targetDbKey = metaKey(tenantId, tableId);
1398
- const dbEntities = state?.db?.entities;
1399
- const metaFromDb = dbEntities?.[targetDbKey];
1400
- const stateTable = state?.table;
1401
- const metaFromStateTable = stateTable?.currentTable?.tableId === tableId || stateTable?.currentTable?.dbKey === targetDbKey ? stateTable.currentTable : null;
1402
- const uiTableState = getTableState();
1403
- const metaFromUiCache = uiTableState.currentTable?.tenantId === tenantId && uiTableState.currentTable?.tableId === tableId ? uiTableState.currentTable : null;
1404
- const table = metaFromDb ?? metaFromStateTable ?? metaFromUiCache ?? {
1405
- tenantId,
1406
- tableId,
1407
- displayName: editingTarget?.title ?? tableId,
1408
- description: editingTarget?.summary ?? "",
1409
- columns: Array.isArray(editingTarget?.metadata?.columns) ? editingTarget?.metadata?.columns : Array.isArray(editingTarget?.metadata?.columnNames) ? (editingTarget?.metadata?.columnNames).map((name) => ({ name, label: name })) : []
1410
- };
1411
- let rows = [];
1412
- if (metaFromUiCache && Array.isArray(uiTableState.rows)) {
1413
- rows = uiTableState.rows;
1414
- } else if (metaFromStateTable && Array.isArray(stateTable?.rows)) {
1415
- rows = stateTable.rows;
1416
- } else if (dbEntities) {
1417
- rows = Object.values(dbEntities).filter(
1418
- (entity) => entity?.type === "table_row" /* TABLE_ROW */ && entity?.tenantId === tenantId && entity?.tableId === tableId && !entity?.deletedAt
1419
- );
1420
- }
1421
- const metadata = editingTarget?.metadata;
1422
- const focusContext = metadata && typeof metadata === "object" ? metadata.focusContext : null;
1423
- if (!table) return null;
1424
- const columns = Array.isArray(table.columns) ? table.columns : [];
1425
- const columnSummaries = columns.length ? columns.map((c) => {
1426
- const displayName = c.label || c.name;
1427
- const type = c.type || "text";
1428
- const requiredFlag = c.required ? "\u5FC5\u586B" : "\u53EF\u9009";
1429
- const primaryFlag = c.isPrimary ? "\uFF0C\u4E3B\u5B57\u6BB5" : "";
1430
- const optionsStr = Array.isArray(c.options) && c.options.length ? `\uFF0C\u53EF\u9009\u503C\uFF1A${c.options.join(" | ")}` : "";
1431
- const descStr = c.description ? `\u3002\u8BF4\u660E\uFF1A${c.description}` : "";
1432
- return `- ${c.name}\uFF08\u663E\u793A\u540D\uFF1A${displayName}\uFF0C\u7C7B\u578B\uFF1A${type}\uFF0C${requiredFlag}${primaryFlag}${optionsStr}${descStr}\uFF09`;
1433
- }) : ["- (\u5F53\u524D\u8868\u5C1A\u672A\u5B9A\u4E49\u5B57\u6BB5)"];
1434
- const sampleRows = Array.isArray(rows) ? rows.slice(0, 20) : [];
1435
- const rowsPreview = sampleRows.length ? JSON.stringify(sampleRows, null, 2) : "(\u5F53\u524D\u8868\u6682\u65E0\u884C\u6570\u636E)";
1436
- const tableTitle = table.displayName ?? table.tableId ?? "(\u672A\u547D\u540D\u8868)";
1437
- const tableDesc = table.description ? `\u7528\u9014\u8BF4\u660E\uFF1A${table.description}` : "(\u6682\u65E0\u7528\u9014\u8BF4\u660E)";
1438
- const tableTagsLine = Array.isArray(table.tags) && table.tags.length ? `- \u5173\u952E\u8BCD\u6807\u7B7E: ${table.tags.join(", ")}` : null;
1439
- return [
1440
- "\u5F53\u524D\u7F16\u8F91\u76EE\u6807\uFF1A\u4E00\u5F20\u6570\u636E\u8868\uFF08Editing Table\uFF09\u3002",
1441
- `- \u8868 ID: ${table.tableId}`,
1442
- `- \u663E\u793A\u540D\u79F0: ${tableTitle}`,
1443
- `- ${tableDesc}`,
1444
- ...tableTagsLine ? [tableTagsLine] : [],
1445
- ...focusContext && typeof focusContext === "object" && "columnName" in focusContext ? [
1446
- "",
1447
- "\u5F53\u524D\u7126\u70B9\uFF08Focus Context\uFF09\uFF1A",
1448
- `- \u5F53\u524D\u5355\u5143\u683C\u5217: ${String(focusContext.columnName ?? "(\u672A\u77E5\u5217)")}`,
1449
- ...focusContext.rowTitle ? [`- \u5F53\u524D\u884C\u6807\u9898: ${String(focusContext.rowTitle)}`] : [],
1450
- ...focusContext.rowIndex !== null && focusContext.rowIndex !== void 0 ? [`- \u5F53\u524D\u884C\u53F7: ${Number(focusContext.rowIndex) + 1}`] : [],
1451
- ...focusContext.cellPreview ? [`- \u5F53\u524D\u5355\u5143\u683C\u5185\u5BB9\u9884\u89C8: ${String(focusContext.cellPreview)}`] : []
1452
- ] : [],
1453
- "",
1454
- "\u5B57\u6BB5\u5B9A\u4E49\uFF08Field Schema\uFF09\uFF1A",
1455
- ...columnSummaries,
1456
- "",
1457
- "\u3010\u7ED9 AI \u7684\u64CD\u4F5C\u6307\u5357 / \u975E\u7528\u6237\u539F\u8BDD\u3011",
1458
- "\u5F53\u7528\u6237\u5E0C\u671B\u5728\u5F53\u524D\u8868\u4E2D\u201C\u65B0\u589E\u4E00\u884C / \u65B0\u589E\u8BB0\u5F55 / \u63D2\u5165\u4E00\u6761 / \u5E2E\u6211\u8BB0\u4E00\u6761 xxx\u201D\u65F6\uFF1A",
1459
- "1. \u5FC5\u987B\u8C03\u7528\u5DE5\u5177 addTableRow\uFF08\u800C\u4E0D\u662F\u53EA\u5728\u56DE\u7B54\u4E2D\u53E3\u5934\u63CF\u8FF0\u8981\u65B0\u589E\u7684\u6570\u636E\uFF09\u3002",
1460
- "2. \u8C03\u7528 addTableRow \u65F6\uFF1A",
1461
- " - \u4F7F\u7528\u53C2\u6570 values\uFF08\u4E00\u4E2A\u5BF9\u8C61\uFF09\uFF0C\u5176\u4E2D\u6BCF\u4E2A key \u5FC5\u987B\u662F\u4E0A\u9762\u5B57\u6BB5\u540D\u4E4B\u4E00\uFF08name\uFF0C\u800C\u4E0D\u662F label\uFF09\u3002",
1462
- ' - \u4F8B\u5982\uFF1A{"values":{"title":"\u4FEE Bug #123","status":"todo","note":"\u9AD8\u4F18\u5148\u7EA7"}}\u3002',
1463
- " - \u5C3D\u91CF\u4ECE\u7528\u6237\u7684\u81EA\u7136\u8BED\u8A00\u4E2D\u63A8\u65AD\u5E76\u586B\u6EE1\u6240\u6709\u76F8\u5173\u5B57\u6BB5\uFF1B\u5BF9\u4E8E\u5FC5\u586B\u5B57\u6BB5\uFF08required=true\uFF09\u5C24\u5176\u8981\u6CE8\u610F\u3002",
1464
- ' - \u7528\u6237\u6CA1\u6709\u63D0\u5230\u7684\u5B57\u6BB5\uFF0C\u53EF\u4EE5\u4F7F\u7528\u7A7A\u5B57\u7B26\u4E32 "" \u6216 null \u4F5C\u4E3A\u5360\u4F4D\u3002',
1465
- " - \u7EDD\u4E0D\u8981\u4F20\u5165\u7A7A\u5BF9\u8C61 {} \u4F5C\u4E3A values\u3002",
1466
- "",
1467
- "\u4EE5\u4E0B\u662F\u90E8\u5206\u793A\u4F8B\u884C\uFF08\u6700\u591A 20 \u884C\uFF0C\u7528\u4E8E\u5E2E\u52A9\u4F60\u7406\u89E3\u5217\u542B\u4E49\uFF0C\u8BF7\u907F\u514D\u5728\u56DE\u7B54\u4E2D\u5B8C\u6574\u7C98\u8D34\u6574\u8868\uFF09\uFF1A",
1468
- rowsPreview
1469
- ].join("\n");
1470
- }
1471
- if (targetKind === "page" || targetKind === "article") {
1472
- const page = getDocState();
1473
- const metadata = runtimeOptions?.editingTarget?.metadata;
1474
- const focusContext = metadata && typeof metadata === "object" ? metadata.focusContext : null;
1475
- if (!page) return null;
1476
- const title = page.title ?? "(\u672A\u547D\u540D\u9875\u9762)";
1477
- return [
1478
- "\u5F53\u524D\u7F16\u8F91\u76EE\u6807\uFF1A\u4E00\u4E2A\u9875\u9762 / \u6587\u7AE0\uFF08Editing Document\uFF09\u3002",
1479
- `- \u6807\u9898: ${title}`,
1480
- ...focusContext && typeof focusContext === "object" && "anchorPath" in focusContext ? [
1481
- "",
1482
- "\u5F53\u524D\u7126\u70B9\uFF08Focus Context\uFF09\uFF1A",
1483
- `- \u5149\u6807\u662F\u5426\u6298\u53E0: ${Boolean(focusContext.isCollapsed) ? "\u662F" : "\u5426"}`,
1484
- ...focusContext.blockType ? [`- \u5F53\u524D\u5757\u7C7B\u578B: ${String(focusContext.blockType)}`] : [],
1485
- ...focusContext.selectedText ? [`- \u5F53\u524D\u9009\u4E2D\u6587\u672C: ${String(focusContext.selectedText)}`] : [],
1486
- ...focusContext.anchorPath?.length ? [`- \u5F53\u524D\u951A\u70B9\u8DEF\u5F84: ${focusContext.anchorPath.join(" > ")}`] : []
1487
- ] : [],
1488
- "",
1489
- "\u5982\u679C\u7528\u6237\u8981\u6C42\u4F60\u5BF9\u8FD9\u7BC7\u6587\u7AE0\u8FDB\u884C\u4FEE\u6539\u6216\u4F18\u5316\uFF0C\u8BF7\u5728\u56DE\u7B54\u4E2D\u660E\u786E\u6307\u51FA\u4FEE\u6539\u65B9\u5411\u3002",
1490
- "\u5982\u679C\u5B58\u5728\u5F53\u524D\u9009\u533A\u6216\u5149\u6807\u4E0A\u4E0B\u6587\uFF0C\u4F18\u5148\u56F4\u7ED5\u8BE5\u5C40\u90E8\u4F4D\u7F6E\u505A\u5B9A\u70B9\u6539\u5199\uFF0C\u800C\u4E0D\u662F\u6CDB\u6CDB\u91CD\u5199\u6574\u7BC7\u6587\u6863\u3002"
1491
- ].join("\n");
1492
- }
1493
- if (targetKind === "app") {
1494
- const editingTarget = runtimeOptions?.editingTarget;
1495
- const metadata = editingTarget?.metadata;
1496
- const appId = editingTarget?.key ?? "(\u672A\u77E5 appId)";
1497
- const title = editingTarget?.title ?? "(\u672A\u547D\u540D\u5E94\u7528)";
1498
- const framework = typeof metadata?.framework === "string" ? metadata.framework : "worker";
1499
- const appUrl = typeof metadata?.appUrl === "string" ? metadata.appUrl : null;
1500
- const fileNames = Array.isArray(metadata?.fileNames) ? metadata.fileNames.filter((name) => typeof name === "string") : [];
1501
- const externalImports = Array.isArray(metadata?.externalImports) ? metadata.externalImports.filter(
1502
- (name) => typeof name === "string"
1503
- ) : [];
1504
- const sourceSummary = asOptionalTrimmedString(editingTarget?.summary) ?? null;
1505
- const selectedNode = metadata && typeof metadata === "object" && metadata.selectedNode && typeof metadata.selectedNode === "object" ? metadata.selectedNode : null;
1506
- const constraintPacks = buildAppConstraintPacks({
1507
- framework,
1508
- fileNames,
1509
- externalImports
1510
- });
1511
- if (selectedNode && typeof selectedNode.cssPath === "string") {
1512
- const tagName = typeof selectedNode.tagName === "string" && selectedNode.tagName ? selectedNode.tagName : "\u5143\u7D20";
1513
- const cssPath = String(selectedNode.cssPath);
1514
- const outerHTMLSnippet = typeof selectedNode.outerHTMLSnippet === "string" ? selectedNode.outerHTMLSnippet : "";
1515
- const textSnippet = typeof selectedNode.textSnippet === "string" ? selectedNode.textSnippet : "";
1516
- const noloLoc = typeof selectedNode.noloLoc === "string" ? selectedNode.noloLoc : "";
1517
- constraintPacks.push({
1518
- id: "selected-node",
1519
- title: "\u7528\u6237\u9009\u4E2D\u8282\u70B9\uFF08\u5B9A\u70B9\u4FEE\u6539\uFF09",
1520
- rules: [
1521
- `\u7528\u6237\u5DF2\u5728\u9884\u89C8\u4E2D\u7CBE\u51C6\u9009\u4E2D\u4E00\u4E2A\u5143\u7D20\uFF1A<${tagName}> \uFF0CCSS \u8DEF\u5F84\uFF1A${cssPath}${noloLoc ? `\uFF0C\u6E90\u7801\u4F4D\u7F6E\uFF1A${noloLoc}` : ""}\u3002\u672C\u8F6E\u4FEE\u6539\u5FC5\u987B\u4EE5\u8FD9\u4E2A\u5143\u7D20\u4E3A\u4E2D\u5FC3\u3002`,
1522
- `\u9009\u4E2D\u5143\u7D20\u7684 HTML \u7247\u6BB5\uFF08\u53EF\u80FD\u622A\u65AD\uFF09\uFF1A${outerHTMLSnippet}${textSnippet ? `\uFF1B\u53EF\u89C1\u6587\u672C\uFF1A${textSnippet}` : ""}\u3002\u5148\u5728\u6E90\u7801\u6587\u4EF6\u4E2D\u5B9A\u4F4D\u5230\u751F\u6210\u8FD9\u6BB5 HTML \u7684\u4EE3\u7801\uFF0C\u518D\u52A8\u624B\u3002`,
1523
- "\u4FEE\u6539\u6536\u655B\u5728\u8BE5\u5143\u7D20\u53CA\u5176\u76F4\u63A5\u6837\u5F0F\u6765\u6E90\uFF08\u547D\u4E2D\u7684\u7EC4\u4EF6/\u7C7B/design token\uFF09\uFF1B\u8C03\u89C6\u89C9\u53C2\u6570\u4F18\u5148\u6539 token \u6216\u5C40\u90E8\u7EC4\u4EF6\u3002",
1524
- "\u7981\u6B62\u91CD\u5199\u672A\u547D\u4E2D\u7684\u9875\u9762\u7ED3\u6784\u3001\u5E03\u5C40\u3001\u6587\u6848\u3001\u6570\u636E\u6D41\u6216\u5176\u4ED6\u7EC4\u4EF6\uFF1B\u4FDD\u6301\u672A\u547D\u4E2D\u6587\u4EF6\u4E0D\u53D8\u3002",
1525
- "\u5982\u679C\u6309 CSS \u8DEF\u5F84\u548C HTML \u7247\u6BB5\u5728\u6E90\u7801\u4E2D\u627E\u4E0D\u5230\u5BF9\u5E94\u4F4D\u7F6E\uFF0C\u5148\u5411\u7528\u6237\u8BF4\u660E\u5E76\u8BF7\u7528\u6237\u91CD\u65B0\u9009\u62E9\uFF0C\u4E0D\u8981\u51ED\u731C\u6D4B\u5927\u8303\u56F4\u6539\u52A8\u3002"
1526
- ]
1527
- });
1528
- }
1529
- return [
1530
- "\u5F53\u524D\u7F16\u8F91\u76EE\u6807\uFF1A\u4E00\u4E2A Web \u5E94\u7528\uFF08Editing App\uFF09\u3002",
1531
- `- \u5E94\u7528 ID: ${appId}`,
1532
- `- \u540D\u79F0: ${title}`,
1533
- `- \u6280\u672F\u5F62\u6001: ${framework}`,
1534
- ...appUrl ? [`- \u5F53\u524D\u8BBF\u95EE\u5730\u5740: ${appUrl}`] : [],
1535
- ...fileNames.length ? [`- \u5F53\u524D\u6E90\u7801\u6587\u4EF6: ${fileNames.join(", ")}`] : ["- \u5F53\u524D\u6E90\u7801\u6587\u4EF6: (\u672A\u63D0\u4F9B\u591A\u6587\u4EF6\u6E05\u5355\uFF1B\u53EF\u80FD\u662F\u5355\u6587\u4EF6\u6E90\u7801\uFF0C\u4E5F\u53EF\u80FD\u53EA\u5269\u90E8\u7F72\u4EA7\u7269)"],
1536
- ...externalImports.length ? [`- \u5F53\u524D\u4F9D\u8D56\u767D\u540D\u5355\u547D\u4E2D: ${externalImports.join(", ")}`] : [],
1537
- ...sourceSummary ? ["", sourceSummary] : [],
1538
- "",
1539
- "\u3010\u7ED9 AI \u7684\u64CD\u4F5C\u6307\u5357 / \u975E\u7528\u6237\u539F\u8BDD\u3011",
1540
- "1. \u7528\u6237\u8981\u6C42\u4FEE\u6539\u5F53\u524D\u5E94\u7528\u65F6\uFF0C\u5148\u8C03\u7528 appRead \u83B7\u53D6\u5F53\u524D\u4EE3\u7801/\u6587\u4EF6\uFF0C\u518D\u57FA\u4E8E\u73B0\u6709\u5B9E\u73B0\u4FEE\u6539\u3002",
1541
- "1b. \u5982\u679C appFileList / appFileSearch / appFileRead \u8FD4\u56DE 409\uFF08APP_WORKSPACE_MISSING / \u6E90\u7801\u5DE5\u4F5C\u533A\u7F3A\u5931\uFF09\u6216 400\uFF08UNSUPPORTED_APP_FRAMEWORK / \u4E0D\u662F Nolo React SSR\uFF09\uFF0C**\u7ACB\u5373\u505C\u6B62\u4FEE\u6539\uFF0C\u4E0D\u8981\u81EA\u5DF1\u7F16\u5360\u4F4D\u4EE3\u7801\u6216\u964D\u7EA7 framework \u53BB appDeploy**\u3002\u5148\u8C03\u7528 appVersionList(appId) \u67E5\u770B\u5386\u53F2\u7248\u672C\uFF0C\u9009\u4E00\u4E2A\u6700\u8FD1\u7684\u5B8C\u6574\u7248\u672C\u7528 appVersionRestore(appId, versionId) \u6062\u590D\uFF0C\u6062\u590D\u540E\u6E90\u7801\u5DE5\u4F5C\u533A\u4F1A\u91CD\u5EFA\uFF0C\u518D\u7EE7\u7EED\u4FEE\u6539\u3002\u5982\u679C\u6CA1\u6709\u5386\u53F2\u7248\u672C\uFF0C\u518D\u5411\u7528\u6237\u8BF4\u660E\u60C5\u51B5\u3002\u7EDD\u4E0D\u53EF\u4EE5\u7528 `fetch(appUrl)`\u3001\u7A7A\u4EE3\u7801\u3001\u5360\u4F4D\u4EE3\u7801\u53BB appDeploy\u2014\u2014\u90A3\u4F1A\u8986\u76D6\u73B0\u6709\u5E94\u7528\u5BFC\u81F4\u6570\u636E\u4E22\u5931\u3002",
1542
- "2. \u5982\u679C appRead \u8FD4\u56DE workspaceRef/sourceFiles/sourceOmitted\uFF0C\u4E0D\u8981\u6574\u7AD9\u91CD\u5199\uFF1B\u4F7F\u7528 App Builder \u7684\u53D7\u9650 workspace \u6587\u4EF6\u5DE5\u5177\uFF1AappFileList=globFiles\u3001appFileSearch=codeSearch\u3001appFileRead=readFile\u3001appFileReplace=editFile\u3001appFileWrite=writeFile\u3002\u5148\u5B9A\u4F4D\u6587\u4EF6\u4E0E\u547D\u4E2D\u884C\uFF0C\u5927\u6587\u4EF6\u53EA\u8BFB\u53D6\u5FC5\u8981\u884C\u8303\u56F4\uFF1B\u6587\u5B57\u3001\u6837\u5F0F\u3001token\u3001\u5C40\u90E8\u903B\u8F91\u7B49\u5C0F\u6539\u52A8\u5FC5\u987B\u4F18\u5148\u7528 appFileReplace \u7CBE\u786E\u66FF\u6362\u552F\u4E00\u7247\u6BB5\uFF0C\u53EA\u6709\u65B0\u5EFA\u6587\u4EF6\u6216\u786E\u5B9E\u9700\u8981\u6574\u6587\u4EF6\u91CD\u5199\u65F6\u624D\u7528 appFileWrite\u3002",
1543
- "3. \u5148\u8BC6\u522B\u5F53\u524D\u5E94\u7528\u662F\u5426\u5DF2\u6709 theme / tokens / design system\uFF1B\u5DF2\u6709\u5C31\u4F18\u5148\u6539\u8FD9\u5C42\uFF0C\u6CA1\u6709\u518D\u8865\u4E00\u5C42\u6700\u5C0F\u5171\u4EAB token\uFF0C\u518D\u57FA\u4E8E token \u8C03\u6574\u7EC4\u4EF6\u3002",
1544
- "4. \u5982\u679C\u5F53\u524D\u5E94\u7528\u8FD8\u662F\u65E7\u5199\u6CD5\uFF1A\u89C6\u89C9\u503C\u6563\u843D\u5728\u7EC4\u4EF6\u786C\u7F16\u7801 style \u91CC\uFF0C\u800C\u7528\u6237\u53EA\u662F\u505A\u5B57\u4F53/\u989C\u8272/\u95F4\u8DDD\u7B49\u89C6\u89C9\u5FAE\u8C03\uFF0C\u9ED8\u8BA4\u5148\u628A\u547D\u4E2D\u7684\u89C6\u89C9\u503C\u62BD\u5230\u6700\u5C0F token \u5C42\uFF0C\u518D\u5B8C\u6210\u672C\u6B21\u4FEE\u6539\uFF1B\u9664\u975E\u7528\u6237\u660E\u786E\u8981\u6C42\u4E0D\u8981\u91CD\u6784\u3002",
1545
- `5. \u91CD\u65B0\u90E8\u7F72\u5F53\u524D\u5E94\u7528\u65F6\uFF0CappDeploy \u5FC5\u987B\u7EE7\u7EED\u4F20\u540C\u4E00\u4E2A appId\uFF08${appId}\uFF09\uFF0C\u907F\u514D\u521B\u5EFA\u65B0\u5E94\u7528\u3002`,
1546
- framework === "nolo-react" ? "6. \u5F53\u524D\u5E94\u7528\u662F Nolo React SSR\uFF0C\u4FEE\u6539\u65F6\u4F18\u5148\u4F7F\u7528\u53D7\u9650 app workspace \u6587\u4EF6\u5DE5\u5177\u64CD\u4F5C\u6E90\u7801\u5DE5\u4F5C\u533A\uFF0C\u7136\u540E appPreflight/appDeploy\uFF1B\u4E0D\u8981\u9000\u56DE react-spa \u6216\u5355\u6587\u4EF6 Worker\u3002" : framework === "react-spa" ? '6. \u5F53\u524D\u5E94\u7528\u662F React SPA\uFF0C\u4FEE\u6539\u65F6\u7EE7\u7EED\u6CBF\u7528 framework: "react-spa" + files\uFF0C\u4E0D\u8981\u9000\u56DE\u5355\u6587\u4EF6 Worker\u3002' : "6. \u5F53\u524D\u5E94\u7528\u76EE\u524D\u662F Worker \u5F62\u6001\uFF1B\u5982\u679C\u9700\u6C42\u53D8\u6210\u590D\u6742\u4EA4\u4E92\u6216\u56FE\u8868\uFF0C\u53EF\u4EE5\u8BC4\u4F30\u5347\u7EA7\u4E3A React SPA\u3002",
1547
- ...fileNames.length ? [] : [
1548
- "7. \u5F53\u524D\u6CA1\u6709\u6E90\u7801\u6587\u4EF6\u6E05\u5355\u65F6\uFF0C\u5FC5\u987B\u5148\u7528 appRead \u5224\u65AD\u8BFB\u5230\u7684\u662F\u53EF\u7EF4\u62A4\u6E90\u7801\u8FD8\u662F\u90E8\u7F72\u4EA7\u7269 / \u6253\u5305 bundle\u3002",
1549
- "8. \u5982\u679C appRead \u8FD4\u56DE\u7684\u662F HTML \u58F3\u3001importmap\u3001\u538B\u7F29 bundle \u6216\u660E\u663E\u4E0D\u662F\u539F\u59CB\u6E90\u7801\u6587\u4EF6\uFF0C\u7981\u6B62\u5728\u672A\u544A\u77E5\u7528\u6237\u98CE\u9669\u7684\u60C5\u51B5\u4E0B\u6574\u7AD9\u91CD\u5199\uFF1B\u5E94\u5148\u8BF4\u660E\u201C\u5F53\u524D\u7F3A\u5C11\u539F\u59CB\u6E90\u7801\u5FEB\u7167\uFF0C\u7EE7\u7EED\u4FEE\u6539\u66F4\u50CF\u6574\u4F53\u91CD\u5EFA\u201D\uFF0C\u7B49\u7528\u6237\u786E\u8BA4\u540E\u518D\u7EE7\u7EED\u3002"
1550
- ],
1551
- "9. \u5982\u679C\u7528\u6237\u53EA\u662F\u8981\u8C03\u5B57\u4F53\u5927\u5C0F\u3001\u914D\u8272\u3001\u5706\u89D2\u3001\u9634\u5F71\u3001\u7559\u767D\u7B49\u89C6\u89C9\u7EC6\u8282\uFF0C\u9ED8\u8BA4\u4F18\u5148\u6539\u8BBE\u8BA1 token \u6216\u547D\u4E2D\u7684\u5C40\u90E8\u7EC4\u4EF6\uFF1B\u5BF9\u65E7\u5199\u6CD5\u5E94\u7528\u5219\u4F18\u5148\u505A\u6700\u5C0F token \u8FC1\u79FB\uFF0C\u4E0D\u8981\u53EA\u6539\u6563\u843D\u786C\u7F16\u7801\u3002",
1552
- "10. \u6BCF\u6B21\u4FEE\u6539\u5B8C\u6210\u540E\uFF0C\u5148 appPreflight\uFF0C\u518D appDeploy\uFF1B\u5982\u679C\u5931\u8D25\uFF0C\u6309\u8FD4\u56DE issues \u5B9A\u70B9\u4FEE\u590D\u3002",
1553
- "11. \u56DE\u590D\u7528\u6237\u65F6\u4F18\u5148\u8BF4\u660E\u505A\u4E86\u4EC0\u4E48\u53D8\u5316\u3001\u73B0\u5728\u5E94\u7528\u53EF\u4EE5\u600E\u4E48\u7528\uFF0C\u800C\u4E0D\u662F\u76F4\u63A5\u5806\u4EE3\u7801\u3002",
1554
- ...formatAppConstraintPacks(constraintPacks)
1555
- ].join("\n");
1556
- }
1557
- if (targetKind === "local_preview") {
1558
- const metadata = runtimeOptions?.editingTarget?.metadata;
1559
- const selectedNode = metadata && typeof metadata === "object" && metadata.selectedNode && typeof metadata.selectedNode === "object" ? metadata.selectedNode : null;
1560
- if (!selectedNode) return null;
1561
- const readString = (key) => typeof selectedNode[key] === "string" ? selectedNode[key] : "";
1562
- const tagName = readString("tagName") || "\u5143\u7D20";
1563
- const cssPath = readString("cssPath");
1564
- const noloLoc = readString("noloLoc");
1565
- const textSnippet = readString("textSnippet");
1566
- const outerHTMLSnippet = readString("outerHTMLSnippet");
1567
- return [
1568
- "\u5F53\u524D\u7F16\u8F91\u76EE\u6807\uFF1A\u672C\u5730\u5DE5\u4F5C\u533A\u91CC\u6B63\u5728\u9884\u89C8\u7684\u7F51\u9875\uFF08Local Preview\uFF09\u3002",
1569
- `\u7528\u6237\u5728\u9884\u89C8\u4E2D\u9009\u4E2D\u4E86\u4E00\u4E2A\u5143\u7D20\uFF1A<${tagName}>\uFF0CCSS \u8DEF\u5F84\uFF1A${cssPath}${noloLoc ? `\uFF0C\u6E90\u7801\u4F4D\u7F6E\uFF1A${noloLoc}` : ""}\u3002`,
1570
- `\u9009\u4E2D\u5143\u7D20\u7684 HTML \u7247\u6BB5\uFF08\u53EF\u80FD\u622A\u65AD\uFF09\uFF1A${outerHTMLSnippet}${textSnippet ? `\uFF1B\u53EF\u89C1\u6587\u672C\uFF1A${textSnippet}` : ""}\u3002`,
1571
- "",
1572
- "\u3010\u7ED9 AI \u7684\u64CD\u4F5C\u6307\u5357 / \u975E\u7528\u6237\u539F\u8BDD\u3011",
1573
- "1. \u672C\u8F6E\u4FEE\u6539\u5FC5\u987B\u4EE5\u8FD9\u4E2A\u5143\u7D20\u4E3A\u4E2D\u5FC3\uFF1B\u5148\u5728\u672C\u5730\u5DE5\u4F5C\u533A\u6E90\u7801\u4E2D\u5B9A\u4F4D\u5230\u751F\u6210\u8FD9\u6BB5 HTML \u7684\u4EE3\u7801\uFF0C\u518D\u52A8\u624B\u3002",
1574
- noloLoc ? "2. \u5DF2\u7ED9\u51FA\u6E90\u7801\u4F4D\u7F6E\uFF0C\u76F4\u63A5\u8BFB\u8BE5\u6587\u4EF6\u7684\u5BF9\u5E94\u884C\u8303\u56F4\u786E\u8BA4\uFF0C\u4E0D\u8981\u5168\u5C40\u641C\u7D22\u3002" : "2. \u6CA1\u6709\u6E90\u7801\u4F4D\u7F6E\u65F6\uFF0C\u7528 CSS \u8DEF\u5F84\u91CC\u7684\u7C7B\u540D\u3001\u53EF\u89C1\u6587\u672C\u6216 HTML \u7247\u6BB5\u641C\u7D22\u5DE5\u4F5C\u533A\u5B9A\u4F4D\uFF0C\u4E0D\u8981\u51ED\u731C\u6D4B\u6539\u52A8\u3002",
1575
- "3. \u4FEE\u6539\u6536\u655B\u5728\u8BE5\u5143\u7D20\u53CA\u5176\u76F4\u63A5\u6837\u5F0F\u6765\u6E90\uFF08\u547D\u4E2D\u7684\u7EC4\u4EF6/\u7C7B/design token\uFF09\uFF1B\u4FDD\u6301\u672A\u547D\u4E2D\u7684\u6587\u4EF6\u4E0D\u53D8\u3002",
1576
- "4. \u5982\u679C\u5B9A\u4F4D\u7ED3\u679C\u843D\u5728 node_modules \u6216\u6765\u81EA\u63A5\u53E3\u6570\u636E\uFF0C\u5148\u544A\u8BC9\u7528\u6237\u5B9E\u9645\u60C5\u51B5\uFF0C\u518D\u63D0\u51FA\u53EF\u884C\u7684\u6539\u6CD5\uFF0C\u4E0D\u8981\u786C\u6539\u3002",
1577
- "5. \u5982\u679C\u6309 CSS \u8DEF\u5F84\u548C HTML \u7247\u6BB5\u627E\u4E0D\u5230\u5BF9\u5E94\u4F4D\u7F6E\uFF0C\u5148\u5411\u7528\u6237\u8BF4\u660E\u5E76\u8BF7\u5176\u91CD\u65B0\u9009\u62E9\u3002"
1578
- ].join("\n");
1579
- }
1580
- if (targetKind === "image" || targetKind === "file") {
1581
- const editingTarget = runtimeOptions?.editingTarget;
1582
- const metadata = editingTarget?.metadata;
1583
- const title = editingTarget?.title ?? "(\u672A\u547D\u540D\u5BF9\u8C61)";
1584
- const objectKey = editingTarget?.key ?? "(\u672A\u77E5 key)";
1585
- const fileId = typeof metadata?.fileId === "string" ? metadata.fileId : null;
1586
- const url = typeof metadata?.url === "string" ? metadata.url : null;
1587
- const size = typeof metadata?.size === "number" ? metadata.size : null;
1588
- return [
1589
- `\u5F53\u524D\u7F16\u8F91\u76EE\u6807\uFF1A\u4E00\u4E2A${targetKind === "image" ? "\u56FE\u7247" : "\u6587\u4EF6"}\u5BF9\u8C61\uFF08Editing ${targetKind === "image" ? "Image" : "File"}\uFF09\u3002`,
1590
- `- \u5BF9\u8C61 key: ${objectKey}`,
1591
- `- \u6807\u9898: ${title}`,
1592
- ...fileId ? [`- fileId: ${fileId}`] : [],
1593
- ...url ? [`- \u8D44\u6E90\u5730\u5740: ${url}`] : [],
1594
- ...size !== null ? [`- \u6587\u4EF6\u5927\u5C0F: ${size} bytes`] : [],
1595
- "",
1596
- "\u3010\u7ED9 AI \u7684\u64CD\u4F5C\u6307\u5357 / \u975E\u7528\u6237\u539F\u8BDD\u3011",
1597
- targetKind === "image" ? "\u5F53\u524D\u9636\u6BB5\u4F18\u5148\u5E2E\u52A9\u7528\u6237\u7406\u89E3\u56FE\u7247\u5185\u5BB9\u3001\u63D0\u70BC\u91CD\u70B9\u3001\u547D\u540D\u5F52\u7C7B\u548C\u4E0B\u4E00\u6B65\u5904\u7406\u5EFA\u8BAE\u3002\u4E0D\u8981\u5047\u88C5\u5DF2\u7ECF\u5B8C\u6210\u590D\u6742\u56FE\u7247\u7F16\u8F91\u3002" : "\u5F53\u524D\u9636\u6BB5\u4F18\u5148\u5E2E\u52A9\u7528\u6237\u7406\u89E3\u6587\u4EF6\u7528\u9014\u3001\u63D0\u53D6\u5904\u7406\u601D\u8DEF\u3001\u7ED9\u51FA\u6574\u7406\u5EFA\u8BAE\u548C\u4E0B\u4E00\u6B65\u64CD\u4F5C\u5EFA\u8BAE\u3002\u4E0D\u8981\u5047\u88C5\u5DF2\u7ECF\u5B8C\u6574\u89E3\u6790\u6587\u4EF6\u5185\u5BB9\u3002"
1598
- ].join("\n");
1599
- }
1600
- if (targetKind === "canvas_node") {
1601
- return buildCanvasNodeEditingContextSummary(runtimeOptions);
1602
- }
1603
- return null;
1604
- };
1605
-
1606
- // packages/ai/agent/appWorkingMemory.ts
1607
- var APP_TOOL_NAMES = /* @__PURE__ */ new Set([
1608
- "appList",
1609
- "appRead",
1610
- "appDeploy",
1611
- "appPreflight",
1612
- "appDelete"
1613
- ]);
1614
- var contentToText = (content) => {
1615
- if (!content) return "";
1616
- if (typeof content === "string") return content;
1617
- if (Array.isArray(content)) {
1618
- return content.map((part) => "text" in part ? part.text ?? "" : "").join("\n");
1619
- }
1620
- return "";
1621
- };
1622
- var parseAppListEntries = (text) => text.split("\n").map((line) => line.trim()).filter((line) => line.startsWith("- **") && line.includes("(appId:"));
1623
- var buildRecentAppToolMemory = (messages, toolRuns) => {
1624
- const messageById = new Map(messages.map((msg) => [msg.id, msg]));
1625
- const recentRuns = [...toolRuns].filter((run) => APP_TOOL_NAMES.has(run.toolName)).sort((a, b) => (b.startedAt ?? 0) - (a.startedAt ?? 0)).slice(0, 8);
1626
- if (recentRuns.length === 0) return null;
1627
- const lines = [
1628
- "\u8FD9\u4E9B\u4FE1\u606F\u6765\u81EA\u5F53\u524D\u5BF9\u8BDD\u91CC\u6700\u8FD1\u7684 app \u5DE5\u5177\u8C03\u7528\uFF0C\u4E0D\u4F9D\u8D56\u53F3\u4FA7\u7F16\u8F91\u6001\u3002"
1629
- ];
1630
- const latestDeployLike = recentRuns.find(
1631
- (run) => ["appDeploy", "appRead", "appPreflight"].includes(run.toolName)
1632
- );
1633
- if (latestDeployLike) {
1634
- const input = latestDeployLike.input ?? {};
1635
- const parts = [
1636
- `- \u6700\u8FD1\u4E00\u6B21\u5173\u952E app \u64CD\u4F5C: ${latestDeployLike.toolName}`,
1637
- typeof input.appId === "string" ? `appId=${input.appId}` : null,
1638
- typeof input.name === "string" ? `name=${input.name}` : null,
1639
- typeof input.framework === "string" ? `framework=${input.framework}` : null
1640
- ].filter(Boolean);
1641
- lines.push(parts.join("\uFF0C"));
1642
- }
1643
- const relatedMessages = recentRuns.map((run) => messageById.get(run.messageId)).filter((msg) => !!msg);
1644
- const appListMessage = relatedMessages.find((msg) => msg.toolName === "appList");
1645
- if (appListMessage) {
1646
- const entries = parseAppListEntries(contentToText(appListMessage.content)).slice(0, 5);
1647
- if (entries.length > 0) {
1648
- lines.push("- \u6700\u8FD1\u4E00\u6B21 appList \u7ED3\u679C\uFF1A");
1649
- lines.push(...entries.map((entry) => ` ${entry}`));
1650
- }
1651
- }
1652
- const latestReadMessage = relatedMessages.find((msg) => msg.toolName === "appRead");
1653
- if (latestReadMessage) {
1654
- const text = contentToText(latestReadMessage.content);
1655
- const appId = text.match(/- appId:\s*(.+)/)?.[1]?.trim();
1656
- const url = text.match(/- 访问地址:\s*(.+)/)?.[1]?.trim();
1657
- if (appId || url) {
1658
- lines.push(
1659
- [
1660
- "- \u6700\u8FD1\u4E00\u6B21 appRead \u771F\u503C:",
1661
- appId ? `appId=${appId}` : null,
1662
- url ? `url=${url}` : null
1663
- ].filter(Boolean).join("\uFF0C")
1664
- );
1665
- }
1666
- }
1667
- const latestPreflightRun = recentRuns.find((run) => run.toolName === "appPreflight");
1668
- if (latestPreflightRun) {
1669
- lines.push(
1670
- [
1671
- "- \u6700\u8FD1\u4E00\u6B21 appPreflight:",
1672
- latestPreflightRun.status === "failed" ? "\u5931\u8D25" : "\u5DF2\u6267\u884C",
1673
- latestPreflightRun.outputSummary ? `\u6458\u8981=${latestPreflightRun.outputSummary}` : null
1674
- ].filter(Boolean).join("\uFF0C")
1675
- );
1676
- }
1677
- const latestDeployMessage = relatedMessages.find((msg) => msg.toolName === "appDeploy");
1678
- if (latestDeployMessage) {
1679
- const text = contentToText(latestDeployMessage.content);
1680
- const appId = text.match(/- appId:\s*(.+)/)?.[1]?.trim();
1681
- const url = text.match(/- 访问地址:\s*(.+)/)?.[1]?.trim();
1682
- if (appId || url) {
1683
- lines.push(
1684
- [
1685
- "- \u6700\u8FD1\u4E00\u6B21 appDeploy \u7ED3\u679C:",
1686
- appId ? `appId=${appId}` : null,
1687
- url ? `url=${url}` : null
1688
- ].filter(Boolean).join("\uFF0C")
1689
- );
1690
- }
1691
- }
1692
- lines.push(
1693
- "- \u5982\u679C\u7528\u6237\u8BF4\u201C\u521A\u624D\u90A3\u4E2A app / \u90A3\u4E2A\u7F51\u7AD9\u201D\uFF0C\u4F18\u5148\u628A\u5B83\u7406\u89E3\u4E3A\u4E0A\u9762\u6700\u8FD1\u4E00\u6B21\u88AB\u8BFB\u53D6\u3001\u9884\u68C0\u6216\u90E8\u7F72\u7684\u5E94\u7528\uFF1B\u82E5\u4ECD\u6709\u6B67\u4E49\uFF0C\u518D\u7528 appList \u6216 appRead \u786E\u8BA4\u3002"
1694
- );
1695
- return lines.join("\n");
1696
- };
1697
-
1698
- // packages/ai/agent/streamAgentChatTurnUtils.ts
1699
- var BROWSER_UNAVAILABLE_CORE_TOOLS = {
1700
- createAgentAutomation: true,
1701
- updateAgentAutomation: true,
1702
- deleteAgentAutomation: true,
1703
- notifyUser: true
1704
- };
1705
- var getRuntimeCoreTools = () => {
1706
- if (typeof window === "undefined") {
1707
- return [...TOOL_PACKS.CORE];
1708
- }
1709
- return TOOL_PACKS.CORE.filter(
1710
- (toolName) => !BROWSER_UNAVAILABLE_CORE_TOOLS[toolName]
1711
- );
1712
- };
1713
- var isInlineVisualArtifactAgent = (agentConfig) => {
1714
- const tags = Array.isArray(agentConfig.tags) ? agentConfig.tags : [];
1715
- return tags.some(
1716
- (tag) => typeof tag === "string" && ["inline-artifact", "streaming-ui"].includes(tag)
1717
- );
1718
- };
1719
- var estimateTokensOfMessage = (msg) => {
1720
- let content = "";
1721
- if (typeof msg.content === "string") {
1722
- content = msg.content;
1723
- } else if (Array.isArray(msg.content)) {
1724
- content = msg.content.map((p) => {
1725
- if (p.type === "text") return p.text || "";
1726
- if (p.type === "image_url") return "[image]";
1727
- return "[non-text]";
1728
- }).join("");
1729
- } else if (msg.content && typeof msg.content === "object") {
1730
- content = JSON.stringify(msg.content);
1731
- }
1732
- let extraTokens = 0;
1733
- if (Array.isArray(msg.tool_calls)) {
1734
- const toolsStr = JSON.stringify(msg.tool_calls);
1735
- extraTokens = estimateTokenCount(toolsStr);
1736
- }
1737
- return estimateTokenCount(content) + extraTokens;
1738
- };
1739
- var classifyConversationLoad = (messages) => {
1740
- const N = 20;
1741
- if (!Array.isArray(messages) || messages.length === 0) return "light";
1742
- const tail = messages.slice(-N);
1743
- const tokenSamples = tail.map(estimateTokensOfMessage);
1744
- if (tokenSamples.length === 0) return "light";
1745
- const sum = tokenSamples.reduce((acc, v) => acc + v, 0);
1746
- const avg = sum / tokenSamples.length;
1747
- const sorted = [...tokenSamples].sort((a, b) => a - b);
1748
- const p95 = sorted[Math.floor((sorted.length - 1) * 0.95)];
1749
- if (p95 < 200 && avg < 120) {
1750
- return "light";
1751
- }
1752
- if (p95 > 2e3 || avg > 1200) {
1753
- return "heavy";
1754
- }
1755
- return "medium";
1756
- };
1757
- var compressOldToolResults = (messages) => {
1758
- return messages.map((msg) => {
1759
- if (msg.role !== "tool") return msg;
1760
- const content = typeof msg.content === "string" ? msg.content : JSON.stringify(msg.content);
1761
- const projected = projectToolMessageContent({
1762
- content,
1763
- toolName: msg.name
1764
- });
1765
- if (projected === content) return msg;
1766
- return { ...msg, content: projected };
1767
- });
1768
- };
1769
- var trimMessagesWithSummary = (messages, contextWindow, summaryTokenCount) => {
1770
- const recentLoad = classifyConversationLoad(messages);
1771
- const { rawMessageBudget, minTailTokens } = planContextUsage({
1772
- contextWindow,
1773
- summaryTokens: summaryTokenCount,
1774
- recentLoad
1775
- });
1776
- if (!Array.isArray(messages) || messages.length === 0) return messages;
1777
- let totalTokens = 0;
1778
- let keepCount = 0;
1779
- for (let i = messages.length - 1; i >= 0; i--) {
1780
- const t = estimateTokensOfMessage(messages[i]);
1781
- if (totalTokens + t > rawMessageBudget) break;
1782
- totalTokens += t;
1783
- keepCount++;
1784
- }
1785
- if (keepCount >= messages.length) {
1786
- return messages;
1787
- }
1788
- if (totalTokens < minTailTokens) {
1789
- const maxBudgetWithSlack = rawMessageBudget * 1.2;
1790
- for (let i = messages.length - 1 - keepCount; i >= 0; i--) {
1791
- const t = estimateTokensOfMessage(messages[i]);
1792
- if (totalTokens + t > maxBudgetWithSlack) break;
1793
- totalTokens += t;
1794
- keepCount++;
1795
- if (totalTokens >= minTailTokens) break;
1796
- }
1797
- }
1798
- if (keepCount === 0 && messages.length > 0) {
1799
- keepCount = Math.min(2, messages.length);
1800
- }
1801
- let cutIndex = messages.length - keepCount;
1802
- if (cutIndex < 0) cutIndex = 0;
1803
- while (cutIndex > 0 && messages[cutIndex]?.role === "tool") {
1804
- cutIndex--;
1805
- }
1806
- return messages.slice(cutIndex);
1807
- };
1808
- var createDbSliceTurnContextSource = (dispatch) => ({
1809
- readRecord: async (dbKey) => {
1810
- const result = await dispatch(read({ dbKey })).unwrap();
1811
- return result ?? null;
1812
- }
1813
- });
1814
- var joinMapValues = (map) => Array.from(map.values()).join("");
1815
- var formatCurrentInputContext = (pendingFiles, currentInputMap) => {
1816
- if (pendingFiles.length === 0 || currentInputMap.size === 0) {
1817
- return joinMapValues(currentInputMap);
1818
- }
1819
- const relevantPendingFiles = pendingFiles.filter((file) => {
1820
- const key = file.sourceDialogKey || file.dialogKey || file.pageKey;
1821
- return key && currentInputMap.has(key);
1822
- });
1823
- if (relevantPendingFiles.length === 0) {
1824
- return joinMapValues(currentInputMap);
1825
- }
1826
- const filesByGroup = /* @__PURE__ */ new Map();
1827
- for (const file of relevantPendingFiles) {
1828
- const groupKey = file.groupId || file.id;
1829
- const group = filesByGroup.get(groupKey);
1830
- if (group) {
1831
- group.push(file);
1832
- } else {
1833
- filesByGroup.set(groupKey, [file]);
1834
- }
1835
- }
1836
- let sourceCounter = 1;
1837
- let output = "";
1838
- filesByGroup.forEach((filesInGroup) => {
1839
- const isGroup = filesInGroup.length > 1;
1840
- const sourceName = isGroup ? filesInGroup[0].name.split(" (")[0] : filesInGroup[0].name;
1841
- output += `--- Source ${sourceCounter}: "${sourceName}" ---
1842
- `;
1843
- filesInGroup.forEach((file) => {
1844
- const key = file.sourceDialogKey || file.dialogKey || file.pageKey;
1845
- if (!key) return;
1846
- const content = currentInputMap.get(key);
1847
- if (!content) return;
1848
- if (isGroup) {
1849
- output += `### Document: "${file.name}"
1850
- ${content}
1851
- `;
1852
- } else {
1853
- output += `${content}
1854
- `;
1855
- }
1856
- });
1857
- output += `--- End of Source ${sourceCounter} ---
1858
-
1859
- `;
1860
- sourceCounter++;
1861
- });
1862
- return output;
1863
- };
1864
- var validateAccessAndBalance = (agentConfig, state) => {
1865
- const userBalance = selectIdentityUserBalance(state);
1866
- const currentUserId = selectIdentityUserId(state);
1867
- const isCustomApi = agentConfig.apiSource === "custom";
1868
- const isCliApi = agentConfig.apiSource === "cli";
1869
- const isDeviceLocalOwner = agentConfig.userId === "local" && !currentUserId;
1870
- const isOwner = isDeviceLocalOwner || Boolean(currentUserId) && agentConfig.userId === currentUserId;
1871
- if (!isOwner) {
1872
- const hasWhitelist = Array.isArray(agentConfig.whitelist) && agentConfig.whitelist.length > 0;
1873
- if (hasWhitelist) {
1874
- const isUserInWhitelist = !!currentUserId && agentConfig.whitelist?.includes(currentUserId);
1875
- if (!isUserInWhitelist) {
1876
- return "\u60A8\u4E0D\u5728\u8BE5\u5E94\u7528\u7684\u767D\u540D\u5355\u4E2D\uFF0C\u65E0\u6CD5\u4F7F\u7528\u3002";
1877
- }
1878
- }
1879
- }
1880
- if (isCustomApi || isCliApi) {
1881
- return null;
1882
- }
1883
- const SUBSCRIPTION_OAUTH_REFS = /* @__PURE__ */ new Set([
1884
- "cursor",
1885
- "chatgpt",
1886
- "xai",
1887
- "antigravity",
1888
- "claude"
1889
- ]);
1890
- if (SUBSCRIPTION_OAUTH_REFS.has((agentConfig.apiKeyRef ?? "").trim().toLowerCase())) {
1891
- return null;
1892
- }
1893
- const isPlatformApi = agentConfig.apiSource === "platform" || agentConfig.useServerProxy === true;
1894
- if (isDeviceLocalOwner && !isPlatformApi) {
1895
- return null;
1896
- }
1897
- if (typeof userBalance !== "number") {
1898
- const hasSessionUser = Boolean(
1899
- getSessionSnapshotForState(state)?.activeAccountId
1900
- );
1901
- if (!currentUserId || !hasSessionUser) {
1902
- return "\u8BF7\u767B\u5F55\u540E\u4F7F\u7528\u5E73\u53F0\u6A21\u578B\uFF0C\u6216\u6539\u7528\u672C\u5730\u81EA\u5B9A\u4E49/API/CLI Agent\u3002";
1903
- }
1904
- return "\u6B63\u5728\u83B7\u53D6\u7528\u6237\u4F59\u989D\uFF0C\u8BF7\u7A0D\u5019...";
1905
- }
1906
- const serverPrices = getModelPricing(agentConfig.provider || "", agentConfig.model);
1907
- if (!serverPrices && !hasExplicitAgentPricing(agentConfig)) {
1908
- return "\u65E0\u6CD5\u83B7\u53D6\u6A21\u578B\u5B9A\u4EF7\u4FE1\u606F\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002";
1909
- }
1910
- const prices = getPrices(agentConfig, serverPrices ?? null);
1911
- const maxPrice = getFinalPrice(prices);
1912
- if (userBalance < maxPrice) {
1913
- return "\u4F59\u989D\u4E0D\u8DB3\uFF0C\u8BF7\u5145\u503C\u540E\u518D\u8BD5\u3002";
1914
- }
1915
- return null;
1916
- };
1917
- var fetchMemoryOverlayContext = async (state, agentConfig, userInput, dialogConfig) => {
1918
- const token = getSessionSnapshotForState(state)?.activeToken ?? null;
1919
- const currentServer = typeof state?.settings?.currentServer === "string" ? state.settings.currentServer : null;
1920
- const agentKey = asOptionalTrimmedString(agentConfig.dbKey) ?? "";
1921
- if (!token || !currentServer || !agentKey) return null;
1922
- const baseUrl = resolveToolBaseUrl(currentServer);
1923
- if (!baseUrl) return null;
1924
- const inputText = typeof userInput === "string" ? userInput : JSON.stringify(userInput ?? "");
1925
- const spaceId = asOptionalTrimmedString(dialogConfig?.spaceId) ?? (getViewMode() === "all" ? void 0 : asOptionalTrimmedString(getCurrentSpaceIdRaw()));
1926
- try {
1927
- const response = await fetch(`${baseUrl}/api/memory/query`, {
1928
- method: "POST",
1929
- headers: {
1930
- "Content-Type": "application/json",
1931
- Authorization: `Bearer ${token}`
1932
- },
1933
- body: JSON.stringify({
1934
- agentKey,
1935
- userInput: inputText,
1936
- ...spaceId ? { spaceId } : {}
1937
- })
1938
- });
1939
- if (!response.ok) return null;
1940
- const payload = await response.json().catch(() => null);
1941
- return asOptionalTrimmedString(payload?.promptBlock) ?? null;
1942
- } catch {
1943
- return null;
1944
- }
1945
- };
1946
- var buildStaticContexts = async (state, dispatch, agentConfig, dialogConfig, referenceContentCache) => {
1947
- const keySets = await getFullChatContextKeys(
1948
- state,
1949
- dispatch,
1950
- agentConfig,
1951
- "",
1952
- // 静态上下文不需要 userInput
1953
- void 0
1954
- // 静态上下文不需要 dialogConfig
1955
- );
1956
- const finalKeys = deduplicateContextKeys(keySets);
1957
- const fetchReferences = (keys) => fetchReferenceContents(keys, dispatch, {
1958
- format: "simplified_markdown",
1959
- inlineMentionMeta: true,
1960
- preloaded: referenceContentCache
1961
- });
1962
- const [botInstructionsMap, botKnowledgeMap] = await Promise.all([
1963
- fetchReferences(finalKeys.botInstructionsContext),
1964
- fetchReferences(finalKeys.botKnowledgeContext)
1965
- ]);
1966
- const globalPrompt = selectGlobalPrompt(state);
1967
- const userTonePreset = selectUserTonePreset(state);
1968
- const knowledgeCaptureLevel = selectKnowledgeCaptureLevel(state);
1969
- const spaceContextLevel = selectSpaceContextLevel(state);
1970
- const userRecentLimit = selectAiRecentContentLimit(state);
1971
- const contextWindow = getModelContextWindow(agentConfig.model) || 128e3;
1972
- const preloadPlan = resolveSpaceContextPreloadPlan(spaceContextLevel);
1973
- const dynamicLimit = Math.floor(contextWindow * preloadPlan.preloadBudgetRatio / 150);
1974
- const recentLimit = preloadPlan.includeRecentContent ? Math.max(3, Math.min(userRecentLimit, Math.max(3, dynamicLimit))) : 0;
1975
- const turnContextSource = createDbSliceTurnContextSource(dispatch);
1976
- let spaceContext = null;
1977
- if (spaceContextLevel > 1) {
1978
- const spaceLayer = await buildSpaceContextLayer({
1979
- source: turnContextSource,
1980
- spaceId: dialogConfig?.spaceId,
1981
- recentContentLimit: recentLimit
1982
- });
1983
- spaceContext = spaceLayer ? spaceLayer.content.trim() : null;
1984
- }
1985
- const linkedSpaceIds = agentConfig.linkedSpaces || [];
1986
- if (linkedSpaceIds.length > 0 && spaceContextLevel > 1) {
1987
- const linkedSection = await buildLinkedSpacesSection({
1988
- source: turnContextSource,
1989
- linkedSpaceIds
1990
- });
1991
- if (linkedSection) {
1992
- spaceContext = (spaceContext ?? "") + `
1993
-
1994
- ${linkedSection}`;
1995
- }
1996
- }
1997
- const dialogPolicyContext = dialogConfig?.category === PERSONALIZATION_DIALOG_CATEGORY ? buildPersonalizationDialogPolicyContext() : null;
1998
- return {
1999
- botInstructionsContext: joinMapValues(botInstructionsMap),
2000
- botKnowledgeContext: joinMapValues(botKnowledgeMap),
2001
- spaceContext,
2002
- userGlobalPrompt: globalPrompt,
2003
- userPolicyContext: [
2004
- buildStaticUserPolicyContext({
2005
- agentConfig,
2006
- settingsRecord: {
2007
- userTonePreset,
2008
- knowledgeCaptureLevel,
2009
- spaceContextLevel,
2010
- enableReadCurrentSpace: spaceContextLevel > 1
2011
- }
2012
- }),
2013
- dialogPolicyContext
2014
- ].filter(Boolean).join("\n")
2015
- };
2016
- };
2017
- var buildDynamicContexts = async (state, dispatch, agentConfig, userInput, runtimeOptions, referenceContentCache, dialogKey) => {
2018
- let dialogSummary = null;
2019
- let dialogConfig;
2020
- if (dialogKey) {
2021
- dialogConfig = selectById(state, dialogKey);
2022
- if (dialogConfig?.summary) {
2023
- dialogSummary = dialogConfig.summary;
2024
- }
2025
- }
2026
- const keySets = await getFullChatContextKeys(
2027
- state,
2028
- dispatch,
2029
- agentConfig,
2030
- userInput,
2031
- dialogConfig
2032
- );
2033
- const finalKeys = deduplicateContextKeys(keySets);
2034
- const fetchReferences = (keys) => fetchReferenceContents(keys, dispatch, {
2035
- format: "simplified_markdown",
2036
- inlineMentionMeta: true,
2037
- preloaded: referenceContentCache
2038
- });
2039
- const [currentInputMap, historyMap] = await Promise.all([
2040
- fetchReferences(finalKeys.currentInputContext),
2041
- fetchReferences(finalKeys.historyContext)
2042
- ]);
2043
- const pendingFiles = selectPendingFiles(state);
2044
- const formattedCurrentInputContext = formatCurrentInputContext(
2045
- pendingFiles,
2046
- currentInputMap
2047
- );
2048
- const dialogId = dialogConfig?.id ?? null;
2049
- const currentDialogMessages = selectAllMsgs(state, dialogId);
2050
- const currentDialogMessageIds = new Set(currentDialogMessages.map((msg) => msg.id));
2051
- const currentDialogToolRuns = getAllToolRuns().filter(
2052
- (run) => currentDialogMessageIds.has(run.messageId)
2053
- );
2054
- const editingContext = buildEditingContextSummary(state, runtimeOptions);
2055
- const appWorkingMemory = buildRecentAppToolMemory(
2056
- currentDialogMessages,
2057
- currentDialogToolRuns
2058
- );
2059
- const memoryOverlay = await fetchMemoryOverlayContext(
2060
- state,
2061
- agentConfig,
2062
- userInput,
2063
- dialogConfig
2064
- );
2065
- return {
2066
- currentInputContext: formattedCurrentInputContext.trim() || null,
2067
- historyContext: joinMapValues(historyMap),
2068
- editingContext,
2069
- appWorkingMemory,
2070
- memoryOverlay,
2071
- dialogSummary,
2072
- referenceKeys: dialogConfig?.referenceKeys || []
2073
- };
2074
- };
2075
- var mergeContexts = (staticCtx, dynamicCtx) => ({
2076
- botInstructionsContext: staticCtx.botInstructionsContext || void 0,
2077
- botKnowledgeContext: staticCtx.botKnowledgeContext || void 0,
2078
- spaceContext: staticCtx.spaceContext || void 0,
2079
- userGlobalPrompt: staticCtx.userGlobalPrompt || void 0,
2080
- userPolicyContext: staticCtx.userPolicyContext || void 0,
2081
- currentInputContext: dynamicCtx.currentInputContext,
2082
- historyContext: dynamicCtx.historyContext || void 0,
2083
- editingContext: dynamicCtx.editingContext,
2084
- appWorkingMemory: dynamicCtx.appWorkingMemory,
2085
- memoryOverlay: dynamicCtx.memoryOverlay,
2086
- dialogSummary: dynamicCtx.dialogSummary,
2087
- referenceKeys: dynamicCtx.referenceKeys
2088
- });
2089
- var mergeAgentToolsWithRuntime = (agentConfig, referencedTools, mentionedTools, runtimeOptions, state) => {
2090
- const rawBaseTools = Array.isArray(agentConfig.tools) ? agentConfig.tools : [];
2091
- const agentEnabledPacks = resolveAgentRequiredPackIds(agentConfig);
2092
- const isInlineArtifact = isInlineVisualArtifactAgent(agentConfig);
2093
- const effectiveEnabledPacks = resolveEffectiveEnabledPacks({
2094
- enabledPacks: agentEnabledPacks,
2095
- declaredOnly: isInlineArtifact
2096
- });
2097
- const expandedPackTools = expandEnabledPacks(
2098
- effectiveEnabledPacks,
2099
- rawBaseTools
2100
- );
2101
- const baseTools = canonicalizeToolNames(expandedPackTools);
2102
- const requiredSkillTools = canonicalizeToolNames(
2103
- agentConfig.referencedTools ?? []
2104
- );
2105
- const recommendedSkillTools = canonicalizeToolNames(
2106
- agentConfig.recommendedSkillTools ?? []
2107
- );
2108
- const recommendedSkillHints = [
2109
- .../* @__PURE__ */ new Set([
2110
- ...asNonEmptyStringArray(agentConfig.recommendedSkillHints),
2111
- ...resolveAgentRecommendedSkillNames(agentConfig)
2112
- ])
2113
- ];
2114
- const skillPromptPatches = [
2115
- .../* @__PURE__ */ new Set([
2116
- ...asNonEmptyStringArray(agentConfig.skillPromptPatches),
2117
- // 能力包的 promptPatch(方法论文档)与 skill reference 的 patch 走同一条
2118
- // 注入链(buildSkillGuidanceBlock → buildSkillGuidancePromptBlock),
2119
- // 让「工具 + 配套纪律」作为一个能力包整体注入 system prompt。
2120
- ...expandEnabledPackPromptPatches(effectiveEnabledPacks)
2121
- ])
2122
- ];
2123
- const webPadded = applyDefaultWebToolPacks({
2124
- toolNames: baseTools,
2125
- skipWeb: isInlineVisualArtifactAgent(agentConfig)
2126
- });
2127
- const enhancedTools = /* @__PURE__ */ new Set([
2128
- ...webPadded,
2129
- ...isInlineVisualArtifactAgent(agentConfig) ? [] : getRuntimeCoreTools(),
2130
- ...isInlineVisualArtifactAgent(agentConfig) ? [] : requiredSkillTools,
2131
- ...isInlineVisualArtifactAgent(agentConfig) ? [] : canonicalizeToolNames(referencedTools),
2132
- ...isInlineVisualArtifactAgent(agentConfig) ? [] : canonicalizeToolNames(mentionedTools)
2133
- ]);
2134
- const extraTools = isInlineVisualArtifactAgent(agentConfig) ? [] : canonicalizeToolNames(runtimeOptions?.extraTools ?? []);
2135
- for (const t of extraTools) {
2136
- enhancedTools.add(t);
2137
- }
2138
- if (!isInlineVisualArtifactAgent(agentConfig)) {
2139
- const viewMode = state ? getViewMode() : "categories";
2140
- if (viewMode === "all") {
2141
- enhancedTools.delete("search_workspace");
2142
- if (!recommendedSkillHints.includes("search-all-spaces")) {
2143
- recommendedSkillHints.push("search-all-spaces");
2144
- }
2145
- } else {
2146
- enhancedTools.add("search_workspace");
2147
- }
2148
- }
2149
- const systemBuiltinSkills = state?.settings?.systemBuiltinSkills;
2150
- const mountedTools = isInlineVisualArtifactAgent(agentConfig) ? Array.from(enhancedTools) : addDefaultSystemCapabilityTools(Array.from(enhancedTools));
2151
- const filteredTools = applySystemBuiltinSkillFilter(
2152
- mountedTools,
2153
- systemBuiltinSkills
2154
- );
2155
- return {
2156
- ...agentConfig,
2157
- tools: applyDisabledTools(
2158
- prioritizeToolNames(
2159
- filteredTools,
2160
- recommendedSkillTools
2161
- ),
2162
- agentConfig?.disabledTools
2163
- ),
2164
- recommendedSkillTools,
2165
- recommendedSkillHints,
2166
- skillPromptPatches
2167
- };
2168
- };
2169
- var applyImageConfigRuntimeOverride = (agentConfig, runtimeOptions) => {
2170
- const override = runtimeOptions?.imageConfigOverride;
2171
- if (!override) {
2172
- return agentConfig;
2173
- }
2174
- const baseImageConfig = agentConfig.imageConfig ?? {};
2175
- return {
2176
- ...agentConfig,
2177
- ...override.imageModelOverride ? { model: override.imageModelOverride } : {},
2178
- imageConfig: {
2179
- ...baseImageConfig,
2180
- ...override
2181
- }
2182
- };
2183
- };
2184
- var formatImageWaitHint = (range) => {
2185
- if (!range || typeof range.min !== "number" || typeof range.max !== "number") {
2186
- return void 0;
2187
- }
2188
- return `\u901A\u5E38\u9700\u8981 ${range.min}-${range.max} \u79D2`;
2189
- };
2190
- var resolveAgentImageModelIdentity = (agentConfig) => {
2191
- let providerKey = (agentConfig.provider || "").toLowerCase();
2192
- let modelName = agentConfig.model ?? "";
2193
- if (modelName.includes("/")) {
2194
- const slash = modelName.indexOf("/");
2195
- if (!providerKey) providerKey = modelName.slice(0, slash);
2196
- modelName = modelName.slice(slash + 1);
2197
- }
2198
- try {
2199
- return {
2200
- providerKey,
2201
- modelConfig: getModelConfig(providerKey, modelName)
2202
- };
2203
- } catch {
2204
- try {
2205
- const detected = getProviderByModelName(modelName);
2206
- if (!detected) {
2207
- return { providerKey, modelConfig: null };
2208
- }
2209
- return {
2210
- providerKey: detected,
2211
- modelConfig: getModelConfig(detected, modelName)
2212
- };
2213
- } catch {
2214
- return { providerKey, modelConfig: null };
2215
- }
2216
- }
2217
- };
2218
- var EXPLICIT_IMAGE_GENERATION_TOOL_NAMES = /* @__PURE__ */ new Set([
2219
- "openAIGptImage",
2220
- "openAIGptImageGenerate",
2221
- "openAIGptImageEdit",
2222
- "chatgptWebImageGenerate",
2223
- "geminiFlashImage",
2224
- "geminiProImagePreview"
2225
- ]);
2226
- var agentUsesExplicitImageGenerationTool = (agentConfig) => {
2227
- const toolNames = Array.isArray(agentConfig.tools) ? agentConfig.tools : Array.isArray(agentConfig.toolNames) ? agentConfig.toolNames : [];
2228
- return toolNames.some(
2229
- (name) => typeof name === "string" && EXPLICIT_IMAGE_GENERATION_TOOL_NAMES.has(name.trim())
2230
- );
2231
- };
2232
- var resolveImageGenerationStreamingState = (agentConfig, args) => {
2233
- const { modelConfig } = resolveAgentImageModelIdentity(agentConfig);
2234
- const hasImageOutput = !!(modelConfig?.hasImageOutput ?? modelConfig?.supportsImageOutput) || agentConfig.imageConfig?.enabled === true || agentUsesExplicitImageGenerationTool(agentConfig);
2235
- if (!hasImageOutput) {
2236
- return void 0;
2237
- }
2238
- const currentProfile = modelConfig?.imageGenerationProfiles?.find(
2239
- (profile) => profile.imageModel === modelConfig.name
2240
- );
2241
- const usesWebImageTool = agentUsesExplicitImageGenerationTool(agentConfig) && (Array.isArray(agentConfig.tools) ? agentConfig.tools : []).includes("chatgptWebImageGenerate");
2242
- return {
2243
- kind: "image_generation",
2244
- stage: args?.stage ?? args?.previous?.stage ?? "submitted",
2245
- startedAt: args?.previous?.startedAt ?? Date.now(),
2246
- waitHint: formatImageWaitHint(modelConfig?.imageGenerationWaitTimeSeconds) ?? (usesWebImageTool ? "\u7F51\u9875\u751F\u56FE\u901A\u5E38\u9700\u8981 30 \u79D2\u5230\u51E0\u5206\u949F\uFF0C\u5207\u6362\u5BF9\u8BDD\u4E0D\u4F1A\u4E2D\u65AD" : "\u901A\u5E38\u9700\u8981\u51E0\u5341\u79D2"),
2247
- profileLabel: currentProfile?.label
2248
- };
2249
- };
2250
-
2251
1099
  // packages/ai/agent/persistMessageWithFixedId.ts
2252
1100
  async function persistMessageWithFixedId(dispatch, message) {
2253
1101
  dispatch(addUserMessage(message));
@@ -4205,81 +3053,36 @@ ${info.actionHint}` : streamError;
4205
3053
  };
4206
3054
  }
4207
3055
  }
4208
- let extractedMentions;
4209
- if (Array.isArray(userInput)) {
4210
- extractedMentions = extractCategorizedMentions(userInput);
4211
- }
4212
- const mentionedTools = extractedMentions?.tools ?? [];
4213
- const {
4214
- references: normalizedReferences,
4215
- contentByKey: referenceContentCache,
4216
- referencedTools: referenceTools,
4217
- recommendedSkillTools: referenceRecommendedSkillTools,
4218
- recommendedSkillHints: referenceRecommendedSkillHints,
4219
- skillPromptPatches: referenceSkillPromptPatches
4220
- } = await resolveReferenceAssets(
4221
- mergeReferences(agentConfig.references, (selectDialogConfigByKey(getState(), explicitDialogKey) ?? selectCurrentDialogConfig(getState()))?.extraReferences),
4222
- dispatch
4223
- );
3056
+ const activeDialogConfig = selectDialogConfigByKey(getState(), explicitDialogKey) ?? selectCurrentDialogConfig(getState()) ?? currentDialog;
3057
+ const turnToolContext = await resolveTurnToolContext({
3058
+ agentConfig,
3059
+ dialogConfig: activeDialogConfig,
3060
+ userInput,
3061
+ state,
3062
+ dispatch,
3063
+ runtimeOptions
3064
+ });
3065
+ const mentionedTools = turnToolContext.mentionedToolNames;
3066
+ const normalizedReferences = turnToolContext.resolvedReferences ?? [];
3067
+ const referenceTools = turnToolContext.referencedTools ?? [];
3068
+ const contextTools = turnToolContext.contextTools ?? [];
3069
+ const mergedContentCache = turnToolContext.mergedContentCache ?? /* @__PURE__ */ new Map();
4224
3070
  logQuickChatPerfStage2(quickChatPerfStartedAt, "stream-agent-references-resolved", {
4225
- referenceCount: normalizedReferences?.length ?? 0,
4226
- referencedToolCount: referenceTools?.length ?? 0
3071
+ referenceCount: normalizedReferences.length,
3072
+ referencedToolCount: referenceTools.length
4227
3073
  });
4228
3074
  const agentConfigWithReferences = {
4229
3075
  ...agentConfig,
4230
3076
  references: normalizedReferences,
4231
3077
  referencedTools: referenceTools,
4232
- recommendedSkillTools: referenceRecommendedSkillTools,
4233
- recommendedSkillHints: referenceRecommendedSkillHints,
4234
- skillPromptPatches: referenceSkillPromptPatches
3078
+ recommendedSkillTools: turnToolContext.recommendedSkillTools,
3079
+ recommendedSkillHints: turnToolContext.recommendedSkillHints,
3080
+ skillPromptPatches: turnToolContext.skillPromptPatches
4235
3081
  };
4236
3082
  const initialRawMsgs = selectAllMsgs(state, dialogId);
4237
3083
  const initialHistoryIds = new Set(initialRawMsgs.map((m) => m.id));
4238
- const keySets = await getFullChatContextKeys(
4239
- state,
4240
- dispatch,
4241
- agentConfigWithReferences,
4242
- userInput,
4243
- currentDialog ?? void 0
4244
- );
4245
- const finalKeys = deduplicateContextKeys(keySets);
4246
- const allContextKeys = /* @__PURE__ */ new Set([
4247
- ...finalKeys.botInstructionsContext,
4248
- ...finalKeys.currentInputContext,
4249
- ...finalKeys.historyContext,
4250
- ...finalKeys.botKnowledgeContext
4251
- ]);
4252
- const {
4253
- tools: contextTools,
4254
- contentByKey: contextContentCache,
4255
- recommendedSkillTools: contextRecommendedSkillTools = [],
4256
- recommendedSkillHints: contextRecommendedSkillHints = [],
4257
- skillPromptPatches: contextSkillPromptPatches = []
4258
- } = await resolveToolsFromKeys(
4259
- Array.from(allContextKeys),
4260
- dispatch,
4261
- referenceContentCache
4262
- );
4263
- const mergedContentCache = new Map([
4264
- ...referenceContentCache,
4265
- ...contextContentCache
4266
- ]);
4267
3084
  const agentConfigWithTools = mergeAgentToolsWithRuntime(
4268
- {
4269
- ...agentConfigWithReferences,
4270
- recommendedSkillTools: [
4271
- ...agentConfigWithReferences.recommendedSkillTools ?? [],
4272
- ...contextRecommendedSkillTools
4273
- ],
4274
- recommendedSkillHints: [
4275
- ...agentConfigWithReferences.recommendedSkillHints ?? [],
4276
- ...contextRecommendedSkillHints
4277
- ],
4278
- skillPromptPatches: [
4279
- ...agentConfigWithReferences.skillPromptPatches ?? [],
4280
- ...contextSkillPromptPatches
4281
- ]
4282
- },
3085
+ agentConfigWithReferences,
4283
3086
  contextTools,
4284
3087
  mentionedTools,
4285
3088
  runtimeOptions,