nolo-cli 0.202.0-alpha.3 → 0.204.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 (77) hide show
  1. package/{_executeModel-IPRTPSW7.js → _executeModel-P6PJZHAX.js} +16 -16
  2. package/{agentDeleteCommand-6HFA37FH.js → agentDeleteCommand-X5I5MWOV.js} +17 -16
  3. package/{agentEmailCommands-TDBNVIAT.js → agentEmailCommands-E5XLDF6C.js} +19 -18
  4. package/{agentListCommands-YSQSDQM3.js → agentListCommands-POQKNVWF.js} +3 -3
  5. package/{agentMachineCommands-5W23BLFR.js → agentMachineCommands-SKUVXH4H.js} +3 -3
  6. package/{agentProviderCommands-5ALOQLE5.js → agentProviderCommands-MEFUIECN.js} +30 -12
  7. package/{agentRecordCommands-SRIMZZFK.js → agentRecordCommands-Y4MDCVEW.js} +18 -17
  8. package/{agentRunCommand-BLYHIN6S.js → agentRunCommand-D3ZNM22C.js} +19 -18
  9. package/{agentRuntimeLocal-FE66EBRC.js → agentRuntimeLocal-M2RCAORY.js} +2 -2
  10. package/{agentSlice-BFDKYW6H.js → agentSlice-PQVS46OF.js} +1 -1
  11. package/{appDeleteCommands-BEVZGCAG.js → appDeleteCommands-JI6AEOJO.js} +4 -4
  12. package/{appDeployCommands-E7TFCHSP.js → appDeployCommands-W3W4T7BU.js} +4 -4
  13. package/{appDeployStatusCommands-MYY5Z5G3.js → appDeployStatusCommands-QXPI3XS4.js} +4 -4
  14. package/{appGetCommands-HNED5JUU.js → appGetCommands-SQV3MNFW.js} +4 -4
  15. package/{appListCommands-MSBFWPIY.js → appListCommands-DMYRVV7E.js} +4 -4
  16. package/{authCommand-W34UWJGR.js → authCommand-KPTIANH2.js} +1 -1
  17. package/{builtinSkillRegistry-NJVHQIKY.js → builtinSkillRegistry-HH75G5J3.js} +2 -2
  18. package/{chromeOpsCommands-USKE4B4K.js → chromeOpsCommands-JFT4J4LQ.js} +1 -1
  19. package/{chunk-326HCB6L.js → chunk-33OJHC3O.js} +8 -8
  20. package/{chunk-OIB4GARE.js → chunk-4JBJG7XB.js} +3 -3
  21. package/{chunk-RIKSN62L.js → chunk-4UCFQCD4.js} +3 -3
  22. package/{chunk-ETTDZBK5.js → chunk-6YY6MOCF.js} +3 -3
  23. package/{chunk-LAYFVGS4.js → chunk-7H3DHUWL.js} +9 -9
  24. package/{chunk-ASG7VWPK.js → chunk-COJ76M7O.js} +3 -3
  25. package/{chunk-TWVVTUNG.js → chunk-E4KACSRR.js} +2 -2
  26. package/{chunk-CLTGWJVT.js → chunk-E4LYPSYM.js} +2 -0
  27. package/{chunk-5E4FSR4J.js → chunk-EPJFGQYO.js} +1 -1
  28. package/{chunk-YV2RSLM4.js → chunk-EWAQ4DYY.js} +4 -4
  29. package/{chunk-SUBNV2JH.js → chunk-FC4MYLAX.js} +2 -2
  30. package/{chunk-BRZTSZBG.js → chunk-HMQUNXZ7.js} +24 -122
  31. package/{chunk-DKZJJ2NQ.js → chunk-I5PBXF7O.js} +1 -1
  32. package/{chunk-KDUYNEJ5.js → chunk-IK6AAUGM.js} +1 -1
  33. package/{chunk-BLFZULEQ.js → chunk-IVNI335J.js} +2 -2
  34. package/{chunk-DHJXDGC3.js → chunk-JL3YTCPQ.js} +1 -1
  35. package/{chunk-RS66RJLA.js → chunk-LV5V3KRZ.js} +1 -1
  36. package/{chunk-YAGFPXOX.js → chunk-N5E77S4C.js} +128 -7
  37. package/{chunk-Q7GNBUT4.js → chunk-NEZGPBL7.js} +2 -2
  38. package/{chunk-E2FC5RMU.js → chunk-PHNVUFU5.js} +29 -8
  39. package/{chunk-3CWF2EUZ.js → chunk-QUJ3IHEK.js} +1 -1
  40. package/{chunk-HKWGI3TM.js → chunk-QVJ7PDL7.js} +235 -11
  41. package/{chunk-WPQGLJHU.js → chunk-R7FPHYDS.js} +2 -2
  42. package/{chunk-D57YYGMD.js → chunk-SQTBTTAE.js} +2 -2
  43. package/{chunk-C7PKPHK6.js → chunk-SRDWWDBV.js} +5 -5
  44. package/{chunk-6OEPWZV7.js → chunk-TPCDYNJK.js} +3 -0
  45. package/{chunk-SSK4WNJA.js → chunk-WAECKLPA.js} +1 -1
  46. package/chunk-WOAZVUSN.js +126 -0
  47. package/{chunk-LEX6DEH4.js → chunk-Y6M7KJOA.js} +1 -1
  48. package/{chunk-HKMPGHFZ.js → chunk-ZZC64BCU.js} +4 -4
  49. package/{commandRegistry-ZU3RX7A2.js → commandRegistry-YQ47YCJW.js} +59 -59
  50. package/{contentThunks-I4IHSDTM.js → contentThunks-UI4LT732.js} +3 -3
  51. package/{cooldownCommands-5SJ74DNP.js → cooldownCommands-BLRMLW7Q.js} +1 -1
  52. package/{createAgentAutomationAction-WQCH5HR2.js → createAgentAutomationAction-52LH2MRZ.js} +3 -3
  53. package/{createDialogAction-CKMZK5JQ.js → createDialogAction-35JSC2RO.js} +5 -5
  54. package/{createPageAction-QAZHQGY7.js → createPageAction-BPVFIHSO.js} +3 -3
  55. package/{dialogCommands-NEQ6NW5H.js → dialogCommands-XBAEKJVC.js} +4 -4
  56. package/{dialogSlice-GEGACCH2.js → dialogSlice-KHGNTCKG.js} +2 -2
  57. package/{docCreateCommands-EXV267FP.js → docCreateCommands-XBI32MGB.js} +3 -3
  58. package/{docDeleteCommands-TSBILA2Z.js → docDeleteCommands-7EKY3XJR.js} +3 -3
  59. package/{docReadCommands-AKVYHITD.js → docReadCommands-LWDKFZKJ.js} +3 -3
  60. package/{docStore-B4EFT53J.js → docStore-6MKEBLHS.js} +1 -1
  61. package/{docUpdateCommands-G6GULDGZ.js → docUpdateCommands-VFB53K4G.js} +3 -3
  62. package/{handleSendMessageAction-4BACQWOG.js → handleSendMessageAction-24JWFHXL.js} +41 -12
  63. package/index.js +6 -6
  64. package/{localRuntimeAdapter-MTDULOUZ.js → localRuntimeAdapter-RLASCXQ5.js} +17 -16
  65. package/{machineCommands-OGHHBRV3.js → machineCommands-CF72WAXL.js} +18 -17
  66. package/{machineWsRunDispatch-R6DNC3H7.js → machineWsRunDispatch-HITLYZOL.js} +18 -17
  67. package/package.json +1 -1
  68. package/{readlineWorkspace-NC2O4DQP.js → readlineWorkspace-K5EIF774.js} +22 -21
  69. package/{runAgentClientLoop-QKV66PX5.js → runAgentClientLoop-V7XBFJYH.js} +14 -14
  70. package/{secretCommands-MKU25CDP.js → secretCommands-S2DDPIQ4.js} +1 -1
  71. package/{settingThunks-4WU7YE62.js → settingThunks-SWYDFUYT.js} +3 -3
  72. package/{spaceCommands-J7BRTTM3.js → spaceCommands-BFES7F7G.js} +2 -2
  73. package/{streamAgentChatTurn-GM3UNSLS.js → streamAgentChatTurn-RKRNK3P5.js} +28 -18
  74. package/{tools-UJLEQBKI.js → tools-5U5DDFBH.js} +10 -10
  75. package/{updateCommands-RVDAFHBT.js → updateCommands-LEJRRVBB.js} +3 -3
  76. package/{updateDialogTitleAction-24QO27NT.js → updateDialogTitleAction-EK2S55EO.js} +3 -3
  77. package/{windowsSelfUpdate-N2VH2OBW.js → windowsSelfUpdate-LSSQLXVS.js} +2 -2
@@ -20,6 +20,13 @@ import {
20
20
  OAUTH_PROVIDER_REFS,
21
21
  buildLocalAgentLookupKeys
22
22
  } from "./chunk-U7HTU2S7.js";
23
+ import {
24
+ customNativeAuthHeaders,
25
+ detectDeclaredCustomNativeWire,
26
+ isCallerCancellation,
27
+ resolveCustomNativeApiKeyHeader,
28
+ resolveCustomNativeEndpoint
29
+ } from "./chunk-WOAZVUSN.js";
23
30
  import {
24
31
  LOCAL_CODEX_AGENT_ID,
25
32
  LOCAL_CODEX_AGENT_KEY,
@@ -57,11 +64,11 @@ import {
57
64
  import {
58
65
  inferCaptureIntent,
59
66
  resolveUserSkillRuntime
60
- } from "./chunk-Q7GNBUT4.js";
67
+ } from "./chunk-NEZGPBL7.js";
61
68
  import {
62
69
  inlineImageUrlsForCustomProvider,
63
70
  prepareTools
64
- } from "./chunk-BLFZULEQ.js";
71
+ } from "./chunk-IVNI335J.js";
65
72
  import {
66
73
  getServerProviderSecret
67
74
  } from "./chunk-HS7MLR74.js";
@@ -83,7 +90,7 @@ import {
83
90
  resolveCliLocalRuntimeKeyCapability,
84
91
  resolveCliLocalSpawnDispatch,
85
92
  resolveStartAgentRunCwd
86
- } from "./chunk-HKWGI3TM.js";
93
+ } from "./chunk-QVJ7PDL7.js";
87
94
  import {
88
95
  fetchWithTransientRetry,
89
96
  isTransientFetchError
@@ -95,7 +102,7 @@ import {
95
102
  import {
96
103
  resolveAgentRequiredPackIds,
97
104
  resolveUserEnabledSkills
98
- } from "./chunk-DKZJJ2NQ.js";
105
+ } from "./chunk-I5PBXF7O.js";
99
106
  import {
100
107
  applyBuiltinAgentRuntimeOverride,
101
108
  applyTokenUsageToDayStats,
@@ -104,14 +111,14 @@ import {
104
111
  resolveBuiltinPlatformAgentConfig,
105
112
  runKeyed,
106
113
  validateAskChoiceInput
107
- } from "./chunk-326HCB6L.js";
114
+ } from "./chunk-33OJHC3O.js";
108
115
  import {
109
116
  BUILTIN_DIALOG_LLM_CHAT_FALLBACK_MODEL,
110
117
  BUILTIN_TITLE_LLM_CONFIG
111
118
  } from "./chunk-523DITKR.js";
112
119
  import {
113
120
  fetchServerSyncedCredential
114
- } from "./chunk-ETTDZBK5.js";
121
+ } from "./chunk-6YY6MOCF.js";
115
122
  import {
116
123
  getDefaultCliLocalRuntimeDb
117
124
  } from "./chunk-P64WRQYV.js";
@@ -127,7 +134,7 @@ import {
127
134
  applySystemBuiltinSkillFilter,
128
135
  expandEnabledPacks,
129
136
  resolveEffectiveEnabledPacks
130
- } from "./chunk-6OEPWZV7.js";
137
+ } from "./chunk-TPCDYNJK.js";
131
138
  import {
132
139
  DEFAULT_HYBRID_READ_TIMEOUT_MS,
133
140
  Duration_exports,
@@ -171,7 +178,7 @@ import {
171
178
  runExecShellGates,
172
179
  validateConfiguredRootExecutionLease,
173
180
  verifyOwnerRouteAck
174
- } from "./chunk-OIB4GARE.js";
181
+ } from "./chunk-4JBJG7XB.js";
175
182
  import {
176
183
  accumulateGeminiChunks,
177
184
  buildGeminiGenerateContentRequest,
@@ -275,9 +282,6 @@ import {
275
282
  import {
276
283
  compactWhitespace
277
284
  } from "./chunk-DWLEOOGR.js";
278
- import {
279
- isAbortError
280
- } from "./chunk-7DPNBQSV.js";
281
285
  import {
282
286
  createOAuthTokenStore,
283
287
  isTokenExpired,
@@ -380,7 +384,7 @@ import {
380
384
  import {
381
385
  agentRunCardLabels,
382
386
  t
383
- } from "./chunk-CLTGWJVT.js";
387
+ } from "./chunk-E4LYPSYM.js";
384
388
  import {
385
389
  createTokenDialogIndexKey,
386
390
  createTokenKey,
@@ -2876,113 +2880,6 @@ var resolveCodexOAuthTransport = async (ctx) => {
2876
2880
  return null;
2877
2881
  };
2878
2882
 
2879
- // packages/agent-runtime/customNativeWire.ts
2880
- var CHAT_COMPLETIONS_SUFFIX = /\/chat\/completions\/?$/;
2881
- function resolveCustomNativeBase(endpoint) {
2882
- return endpoint.replace(CHAT_COMPLETIONS_SUFFIX, "").replace(/\/+$/, "");
2883
- }
2884
- var NATIVE_PATH_SUFFIX = {
2885
- "openai-responses": "/responses",
2886
- "anthropic-messages": "/messages"
2887
- };
2888
- var ANTHROPIC_MESSAGES_VERSION = "2023-06-01";
2889
- var OPENCODE_HOST = "opencode.ai";
2890
- var OPENCODE_ZEN_GO_PREFIX = "/zen/go";
2891
- var OPENCODE_INFERENCE_GO_PREFIX = "/inference/go";
2892
- function normalizeOpencodeGoGeminiBase(base, wire) {
2893
- if (wire !== "gemini") return base;
2894
- const schemeEnd = base.indexOf("://");
2895
- if (schemeEnd <= 0 || base.slice(0, schemeEnd).toLowerCase() !== "https") return base;
2896
- const authorityStart = schemeEnd + 3;
2897
- const pathStart = base.indexOf("/", authorityStart);
2898
- if (pathStart < 0) return base;
2899
- const host = base.slice(authorityStart, pathStart).toLowerCase();
2900
- if (host !== OPENCODE_HOST) return base;
2901
- const pathAndQuery = base.slice(pathStart);
2902
- const isZenGoPath = pathAndQuery === OPENCODE_ZEN_GO_PREFIX || pathAndQuery.startsWith(`${OPENCODE_ZEN_GO_PREFIX}/`);
2903
- if (!isZenGoPath) return base;
2904
- return `${base.slice(0, authorityStart)}${OPENCODE_HOST}${OPENCODE_INFERENCE_GO_PREFIX}${pathAndQuery.slice(
2905
- OPENCODE_ZEN_GO_PREFIX.length
2906
- )}`;
2907
- }
2908
- function resolveCustomNativeEndpoint(endpoint, wire, model) {
2909
- const base = normalizeOpencodeGoGeminiBase(resolveCustomNativeBase(endpoint), wire);
2910
- switch (wire) {
2911
- case "gemini":
2912
- return `${base}/models/${model}:streamGenerateContent?alt=sse`;
2913
- case "openai-responses":
2914
- case "anthropic-messages": {
2915
- const suffix = NATIVE_PATH_SUFFIX[wire];
2916
- return base.endsWith(suffix) ? base : `${base}${suffix}`;
2917
- }
2918
- }
2919
- }
2920
- var RESERVED_CUSTOM_NATIVE_AUTH_HEADERS = [
2921
- // 凭据之外、由通道自己决定的头
2922
- "accept",
2923
- "accept-encoding",
2924
- "anthropic-version",
2925
- "content-type",
2926
- "content-length",
2927
- "user-agent",
2928
- "x-opencode-session",
2929
- // 请求走私 / 连接语义(hop-by-hop 与 Host/Cookie 家族)
2930
- "connection",
2931
- "cookie",
2932
- "host",
2933
- "keep-alive",
2934
- "proxy-authenticate",
2935
- "proxy-authorization",
2936
- "proxy-connection",
2937
- "te",
2938
- "trailer",
2939
- "transfer-encoding",
2940
- "upgrade"
2941
- ];
2942
- var HTTP_HEADER_TOKEN_RE = /^[!#$%&'*+\-.^_`|~0-9A-Za-z]+$/;
2943
- var CustomNativeApiKeyHeaderError = class extends Error {
2944
- code = "INVALID_API_KEY_HEADER";
2945
- constructor(message) {
2946
- super(message);
2947
- this.name = "CustomNativeApiKeyHeaderError";
2948
- }
2949
- };
2950
- function resolveCustomNativeApiKeyHeader(apiKeyHeader) {
2951
- const headerName = apiKeyHeader?.trim();
2952
- if (!headerName) return void 0;
2953
- if (!HTTP_HEADER_TOKEN_RE.test(headerName)) {
2954
- throw new CustomNativeApiKeyHeaderError(
2955
- `Invalid apiKeyHeader "${headerName}": not a valid HTTP header name (spaces, ":", CR/LF, control characters and other non-token characters are not allowed).`
2956
- );
2957
- }
2958
- if (RESERVED_CUSTOM_NATIVE_AUTH_HEADERS.includes(headerName.toLowerCase())) {
2959
- throw new CustomNativeApiKeyHeaderError(
2960
- `Invalid apiKeyHeader "${headerName}": reserved header, it cannot be used as the API key header.`
2961
- );
2962
- }
2963
- return headerName;
2964
- }
2965
- function customNativeAuthHeaderValue(headerName, apiKey) {
2966
- return headerName.toLowerCase() === "authorization" ? apiKey.startsWith("Bearer ") ? apiKey : `Bearer ${apiKey}` : apiKey;
2967
- }
2968
- function customNativeAuthHeaders(wire, apiKey, apiKeyHeader) {
2969
- const overrideName = resolveCustomNativeApiKeyHeader(apiKeyHeader);
2970
- switch (wire) {
2971
- case "gemini":
2972
- return overrideName ? { [overrideName]: customNativeAuthHeaderValue(overrideName, apiKey) } : { "x-goog-api-key": apiKey };
2973
- case "openai-responses":
2974
- return overrideName ? { [overrideName]: customNativeAuthHeaderValue(overrideName, apiKey) } : { Authorization: `Bearer ${apiKey}` };
2975
- case "anthropic-messages":
2976
- return {
2977
- ...overrideName ? { [overrideName]: customNativeAuthHeaderValue(overrideName, apiKey) } : { "x-api-key": apiKey },
2978
- "anthropic-version": ANTHROPIC_MESSAGES_VERSION
2979
- };
2980
- }
2981
- }
2982
- function isCallerCancellation(error, callerSignal) {
2983
- return isAbortError(error) || callerSignal?.aborted === true;
2984
- }
2985
-
2986
2883
  // packages/agent-runtime/customNativeProvider.ts
2987
2884
  var TRANSPORT_LABEL = {
2988
2885
  "gemini": "gemini-native-custom",
@@ -3214,7 +3111,8 @@ function buildAnthropicMessagesCustomNativeProvider(p) {
3214
3111
  var resolveCustomNativeTransport = async (ctx) => {
3215
3112
  const { agentConfig, deps, apiKeyRefResolver, credentialBroker, syncFetcher, fetchImpl, recordLocalAvailability, buildProviderOpenAiTools, additionalToolNames } = ctx;
3216
3113
  if (!agentConfig.customProviderUrl) return null;
3217
- const wire = findModelConfig(agentConfig.provider ?? "", agentConfig.model ?? "")?.nativeProtocol;
3114
+ const declaredWire = detectDeclaredCustomNativeWire(agentConfig.customProviderUrl);
3115
+ const wire = findModelConfig(agentConfig.provider ?? "", agentConfig.model ?? "")?.nativeProtocol ?? (declaredWire === "openai-responses" ? declaredWire : null);
3218
3116
  if (!wire) return null;
3219
3117
  const config = await resolveOpenAiCompatibleProviderConfig({ agentConfig, env: deps.env, apiKeyRefResolver, credentialBroker, syncFetcher });
3220
3118
  if (!config.apiKey) return null;
@@ -3957,8 +3855,12 @@ var resolveOwnerOAuthProxyTransport = async (ctx) => {
3957
3855
  model: providerConfig.model,
3958
3856
  provider: providerConfig.provider,
3959
3857
  ...streamed.tool_calls ? { tool_calls: streamed.tool_calls } : {},
3960
- ...streamed.reasoning_content ? { reasoning_content: streamed.reasoning_content } : {}
3961
- // owner_required 不上报 usage:N1 约束,客户端不产生可计费 token 记录。
3858
+ ...streamed.reasoning_content ? { reasoning_content: streamed.reasoning_content } : {},
3859
+ ...streamed.finish_reason ? { finish_reason: streamed.finish_reason } : {},
3860
+ ...streamed.stream_complete ? { stream_complete: true } : {},
3861
+ ...streamed.streamTruncated ? { stream_truncated: true } : {}
3862
+ // owner_required 不上报 usage:N1 约束,客户端不产生可计费 token 记录;
3863
+ // 流完整性证据(finish_reason / stream_complete / stream_truncated)与计费无关,必须透传。
3962
3864
  };
3963
3865
  }
3964
3866
  const raw = await res.text().catch(() => "");
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  resolveBuiltinCapability,
3
3
  resolveBuiltinSkillEntry
4
- } from "./chunk-LEX6DEH4.js";
4
+ } from "./chunk-Y6M7KJOA.js";
5
5
  import {
6
6
  noloAgentId
7
7
  } from "./chunk-Y6ORVLSS.js";
@@ -92,7 +92,7 @@ var buildIdentityBlock = (input) => {
92
92
  var DELETE_SAFETY_RED_LINE = [
93
93
  "\u3010\u5220\u9664\u5B89\u5168\u7EA2\u7EBF \xB7 \u6700\u9AD8\u4F18\u5148\u7EA7\u3011",
94
94
  "\u9664\u4E0B\u8FF0\u552F\u4E00\u4F8B\u5916\u5916\uFF0C\u4EFB\u4F55\u5220\u9664\u64CD\u4F5C\uFF08\u6587\u4EF6\u3001\u6570\u636E\u3001\u5E73\u53F0/\u8FDC\u7AEF\u5185\u5BB9\u3001\u6D88\u606F\u7B49\uFF0C\u65E0\u8BBA\u5355\u6761\u6216\u6279\u91CF\uFF09\u6267\u884C\u524D\uFF0C\u5FC5\u987B\u5148\u5411\u7528\u6237\u5448\u73B0\u5B8C\u6574\u5F85\u5220\u6E05\u5355\uFF08\u540D\u79F0/\u8DEF\u5F84/\u6807\u9898\u7B49\u53EF\u8BC6\u522B\u4FE1\u606F\uFF0C\u4E0D\u5F97\u622A\u65AD\uFF09\uFF0C\u5E76\u83B7\u5F97\u7528\u6237\u660E\u786E\u786E\u8BA4\u540E\u624D\u53EF\u6267\u884C\uFF1B\u4E25\u7981\u7528\u6A21\u7CCA\u5B9A\u4F4D\uFF08\u5982\u201C\u5217\u8868\u6700\u4E0B\u65B9\u201D\uFF09\u6307\u4EE3\u5220\u9664\u76EE\u6807\uFF0C\u4E25\u7981\u5148\u5220\u540E\u62A5\u3002\u5B88\u536B\u68C0\u67E5\u4E0E\u5220\u9664\u52A8\u4F5C**\u4E0D\u5F97\u7528 `;` \u8FDE\u63A5**\u2014\u2014\u5FC5\u987B\u7528 `&&`/`if` \u8BA9\u5220\u9664\u52A8\u4F5C\u5904\u5728\u5B88\u536B\u7684\u6210\u8D25\u8DEF\u5F84\u4E0A\uFF0C\u5426\u5219\u5B88\u536B\u6253\u5370\u7684\u300C\u6709\u5DEE\u5F02 \u2192 \u4E0D\u5220\u300D\u62E6\u4E0D\u4F4F\u7D27\u968F\u5176\u540E\u88AB `;` \u4E32\u8054\u6267\u884C\u7684\u5220\u9664\u547D\u4EE4\uFF082026-10-07 \u771F\u5B9E\u8E29\u5751\uFF09\u3002\uFF082026-09-26 \u6279\u91CF\u8BEF\u5220\u4E8B\u6545\u6559\u8BAD\uFF09",
95
- "\u552F\u4E00\u4F8B\u5916\xB7\u53EF\u9A8C\u8BC1\u6062\u590D\u7684\u4EFB\u52A1\u6E05\u7406\uFF1A\u672C\u6B21\u4EFB\u52A1\u4EB2\u81EA\u521B\u5EFA/\u542F\u52A8\u3001\u4E14\u6E05\u7406\u524D\u5DF2\u7528\u5B9E\u9645\u547D\u4EE4\u9010\u9879\u9A8C\u8BC1\u300C\u8981\u5220\u7684\u5168\u90E8\u5185\u5BB9\u53E6\u6709\u5B8C\u6574\u526F\u672C\u3001\u5220\u4E86\u53EF\u65E0\u635F\u6062\u590D\u300D\u7684\u8D44\u6E90\uFF0C\u53EF\u514D\u4E8B\u524D\u6E05\u5355\u4E0E\u786E\u8BA4\uFF0C\u6E05\u7406\u540E\u5728\u6C47\u62A5\u4E2D\u9010\u9879\u5217\u660E\uFF1B\u7CBE\u786E\u5B9A\u4F4D\u4ECD\u5FC5\u987B\u3002\u4EC5\u9650\uFF1A\u2460 \u5DF2\u5B8C\u6574\u5408\u5165\u4FDD\u7559\u7684\u96C6\u6210\u5206\u652F\uFF08git merge-base --is-ancestor \u9A8C\u8BC1\uFF09\u7684\u672C\u5730\u5206\u652F\u4E0E worktree\uFF0C\u4E14\u9664 a)\u3001b) \u4E24\u7C7B\u5916\uFF0C`git status --porcelain --ignored` \u8F93\u51FA\u5FC5\u987B\u4E3A\u7A7A\uFF1Aa) `!! node_modules/`\uFF08\u53CA `packages/*/node_modules/`\uFF09\u2014\u2014\u987B\u786E\u8BA4\u5C5E\u4F9D\u8D56\u5B89\u88C5\u4EA7\u7269\uFF0C\u4E14\u80FD\u7528\u4ED3\u5E93\u5185\u65E2\u6709\u547D\u4EE4\uFF08\u5982 `bun install`\uFF0C\u914D\u5408\u4ED3\u5E93\u5185 `bun.lock` \u4E0E `package.json`\uFF09\u65E0\u635F\u91CD\u5EFA\uFF1Bnode_modules \u91CC\u82E5\u6DF7\u6709\u975E\u4F9D\u8D56\u4EA7\u7269\uFF08\u4F8B\u5982\u672C\u5730\u624B\u5DE5\u653E\u7F6E\u7684\u811A\u672C\u3001\u8865\u4E01\u8FC7\u7684\u5305\u3001\u6216\u6307\u5411 worktree \u5916\u7684\u7B26\u53F7\u94FE\u63A5\uFF09\uFF0C\u5219\u8BE5\u76EE\u5F55\u6574\u4F53\u4E0D\u7B97\u53EF\u518D\u751F\uFF0C\u9700\u6309\u539F\u8DEF\u5F84\u9010\u9879\u5224\u65AD\uFF1Bb) \u88AB\u5FFD\u7565\u7684**\u53EF\u518D\u751F\u6784\u5EFA\u4EA7\u7269**\uFF08\u5982 `*.tsbuildinfo`\u3001\u6784\u5EFA/\u7F16\u8BD1\u7F13\u5B58\uFF09\u2014\u2014\u987B\u9010\u9879\u5217\u51FA\u8DEF\u5F84\uFF0C\u5E76\u7ED9\u51FA\u80FD\u91CD\u65B0\u751F\u6210\u5B83\u7684**\u4ED3\u5E93\u5185\u65E2\u6709\u547D\u4EE4**\uFF08\u5F53\u6B21\u5B9E\u9645\u6267\u884C\u901A\u8FC7\uFF1B\u6307\u4E0D\u51FA\u547D\u4EE4\u6216\u8DD1\u4E0D\u901A\u7684\u4E00\u5F8B\u4E0D\u653E\u884C\uFF09\uFF0C\u786E\u8BA4\u53EF\u7531\u8BE5\u547D\u4EE4\u65E0\u635F\u518D\u751F\u3001\u4E0D\u542B\u552F\u4E00\u7ED3\u679C\u6216\u7528\u6237\u6570\u636E\u3001\u4E14\u4E0D\u662F\u624B\u5DE5\u6539\u52A8\u8FC7\u7684\u4EA7\u7269\uFF1B\u4E0B\u5217\u4E00\u5F8B\u4E0D\u5C5E\u6B64\u7C7B\uFF1A`.env*` \u7B49\u51ED\u8BC1\u3001`data/`\u3001`nolo/`\u3001`.nolo/`\u3001\u4EFB\u4F55\u6570\u636E\u5E93/LevelDB/WAL/\u5BA1\u8BA1/\u65E5\u5FD7/\u62A5\u544A/\u5BFC\u51FA\u76EE\u5F55\u3001`artifacts/`\u3001\u624B\u5DE5\u6539\u52A8\u8FC7\u7684 `dist/`\u3001`public/` \u4E0B\u7684\u4EA7\u7269\u76EE\u5F55\uFF1B\u300C\u5DF2\u88AB gitignore\u300D\u300C\u662F\u6784\u5EFA\u4EA7\u7269\u300D\u300C\u53EF\u91CD\u65B0\u6784\u5EFA\u300D\u7B49\u672A\u7ECF\u547D\u4EE4\u6838\u5B9E\u7684\u8BF4\u6CD5\u4E0D\u6784\u6210\u653E\u884C\u7406\u7531\u3002\u6CE8\u610F `git worktree remove` \u4E0D\u4F1A\u56E0 ignored \u5185\u5BB9\u800C\u62D2\u7EDD\uFF08\u4F1A\u8FDE\u5176\u4E00\u5E76\u5220\u9664\uFF09\uFF0C\u672C\u4F8B\u5916\u6CA1\u6709\u673A\u68B0\u515C\u5E95\uFF0C\u4E0A\u8FF0\u9010\u9879\u6838\u5B9E\u662F\u552F\u4E00\u9632\u7EBF\uFF1B\u53EA\u7528\u4E0D\u5E26 --force \u7684 git worktree remove \u4E0E git branch -d\uFF0C\u7981\u6B62 -D\u3001--force\u3001rm -rf \u66FF\u4EE3\uFF1B\u2461 \u672C\u6B21\u521B\u5EFA\u3001\u5185\u5BB9\u53EA\u662F\u53EF\u518D\u751F\u4E2D\u95F4\u4EA7\u7269\uFF08\u65E5\u5FD7\u3001\u63A2\u9488\u811A\u672C\u3001\u622A\u56FE\u3001\u6784\u5EFA\u7F13\u5B58\uFF09\u7684 /tmp \u6587\u4EF6\uFF0C\u542B\u552F\u4E00\u7ED3\u679C\u6216\u7528\u6237\u6570\u636E\u7684\u4E0D\u7B97\uFF1B\u2462 \u672C\u6B21\u542F\u52A8\u3001\u6309\u5F53\u6B21\u8BB0\u5F55\u7684 PID \u6838\u5B9E\u8EAB\u4EFD\u3001\u7EC8\u6B62\u4E0D\u4E22\u672A\u4FDD\u5B58\u72B6\u6001\u7684\u540E\u53F0\u8FDB\u7A0B\u3002\u201C\u6709\u5907\u4EFD\u201D\u201C\u5728 /tmp\u201D\u201C\u5DF2\u5408\u5E76\u201D\u7B49\u672A\u7ECF\u547D\u4EE4\u6838\u5B9E\u7684\u5224\u65AD\u4E0D\u6784\u6210\u9A8C\u8BC1\uFF1B\u4EFB\u4E00\u9879\u65E0\u6CD5\u9A8C\u8BC1\uFF0C\u4E00\u5F8B\u56DE\u5230\u4E0A\u9762\u7684\u786E\u8BA4\u6D41\u7A0B\u3002\u7528\u6237\u6570\u636E\u3001\u8FDC\u7AEF/\u5E73\u53F0\u5185\u5BB9\u3001\u4ED6\u4EBA\u6216\u65E2\u6709\u7684\u6587\u4EF6\u3001\u5206\u652F\u3001stash \u6C38\u8FDC\u4E0D\u9002\u7528\u6B64\u4F8B\u5916\u3002"
95
+ "\u552F\u4E00\u4F8B\u5916\xB7\u53EF\u9A8C\u8BC1\u6062\u590D\u7684\u4EFB\u52A1\u6E05\u7406\uFF1A\u672C\u6B21\u4EFB\u52A1\u4EB2\u81EA\u521B\u5EFA/\u542F\u52A8\u3001\u4E14\u6E05\u7406\u524D\u5DF2\u7528\u5B9E\u9645\u547D\u4EE4\u9010\u9879\u9A8C\u8BC1\u300C\u8981\u5220\u7684\u5168\u90E8\u5185\u5BB9\u53E6\u6709\u5B8C\u6574\u526F\u672C\u3001\u5220\u4E86\u53EF\u65E0\u635F\u6062\u590D\u300D\u7684\u8D44\u6E90\uFF0C\u53EF\u514D\u4E8B\u524D\u6E05\u5355\u4E0E\u786E\u8BA4\uFF0C\u6E05\u7406\u540E\u5728\u6C47\u62A5\u4E2D\u9010\u9879\u5217\u660E\uFF1B\u7CBE\u786E\u5B9A\u4F4D\u4ECD\u5FC5\u987B\u3002\u4EC5\u9650\uFF1A\u2460 \u5DF2\u5B8C\u6574\u5408\u5165\u4FDD\u7559\u7684\u96C6\u6210\u5206\u652F\uFF08git merge-base --is-ancestor \u9A8C\u8BC1\uFF09\u7684\u672C\u5730\u5206\u652F\u4E0E worktree\uFF0C\u4E14\u9664 a)\u3001b)\u3001c) \u4E09\u7C7B\u5916\uFF0C`git status --porcelain --ignored` \u8F93\u51FA\u5FC5\u987B\u4E3A\u7A7A\uFF1Aa) `!! node_modules/`\uFF08\u53CA `packages/*/node_modules/`\uFF09\u2014\u2014\u987B\u786E\u8BA4\u5C5E\u4F9D\u8D56\u5B89\u88C5\u4EA7\u7269\uFF0C\u4E14\u80FD\u7528\u4ED3\u5E93\u5185\u65E2\u6709\u547D\u4EE4\uFF08\u5982 `bun install`\uFF0C\u914D\u5408\u4ED3\u5E93\u5185 `bun.lock` \u4E0E `package.json`\uFF09\u65E0\u635F\u91CD\u5EFA\uFF1Bnode_modules \u91CC\u82E5\u6DF7\u6709\u975E\u4F9D\u8D56\u4EA7\u7269\uFF08\u4F8B\u5982\u672C\u5730\u624B\u5DE5\u653E\u7F6E\u7684\u811A\u672C\u3001\u8865\u4E01\u8FC7\u7684\u5305\u3001\u6216\u6307\u5411 worktree \u5916\u7684\u7B26\u53F7\u94FE\u63A5\uFF09\uFF0C\u5219\u8BE5\u76EE\u5F55\u6574\u4F53\u4E0D\u7B97\u53EF\u518D\u751F\uFF0C\u9700\u6309\u539F\u8DEF\u5F84\u9010\u9879\u5224\u65AD\uFF1Bb) \u88AB\u5FFD\u7565\u7684**\u53EF\u518D\u751F\u6784\u5EFA\u4EA7\u7269**\uFF08\u5982 `*.tsbuildinfo`\u3001\u6784\u5EFA/\u7F16\u8BD1\u7F13\u5B58\uFF09\u2014\u2014\u987B\u9010\u9879\u5217\u51FA\u8DEF\u5F84\uFF0C\u5E76\u7ED9\u51FA\u80FD\u91CD\u65B0\u751F\u6210\u5B83\u7684**\u4ED3\u5E93\u5185\u65E2\u6709\u547D\u4EE4**\uFF08\u5F53\u6B21\u5B9E\u9645\u6267\u884C\u901A\u8FC7\uFF1B\u6307\u4E0D\u51FA\u547D\u4EE4\u6216\u8DD1\u4E0D\u901A\u7684\u4E00\u5F8B\u4E0D\u653E\u884C\uFF09\uFF0C\u786E\u8BA4\u53EF\u7531\u8BE5\u547D\u4EE4\u65E0\u635F\u518D\u751F\u3001\u4E0D\u542B\u552F\u4E00\u7ED3\u679C\u6216\u7528\u6237\u6570\u636E\u3001\u4E14\u4E0D\u662F\u624B\u5DE5\u6539\u52A8\u8FC7\u7684\u4EA7\u7269\uFF1Bc) \u5F53\u6B21\u4EFB\u52A1\u81EA\u5EFA worktree \u5185\u3001**\u672C\u6B21\u4EFB\u52A1\u4EA7\u751F**\u7684 `.nolo/spills/`\uFF08\u5DE5\u5177\u8F93\u51FA\u6EA2\u51FA\u65E5\u5FD7\u843D\u70B9\uFF0C\u7531 `resolveSpillDirectory` \u4EA7\u751F\uFF09\u2014\u2014\u5C5E\u53EF\u518D\u751F\u4E2D\u95F4\u4EA7\u7269\uFF0C\u53EF\u968F\u8BE5 worktree \u4E00\u5E76\u6E05\u7406\uFF1B\u4E0B\u5217\u4E00\u5F8B\u4E0D\u5C5E\u6B64\u7C7B\uFF1A`.env*` \u7B49\u51ED\u8BC1\u3001`data/`\u3001`nolo/`\u3001`.nolo/` \u4E2D\u9664\u672C\u6B21\u4EFB\u52A1\u4EA7\u751F\u7684 `spills/` \u5916\u7684\u5185\u5BB9\uFF08\u5982 `credentials/`\uFF09\u3001\u4EFB\u4F55\u6570\u636E\u5E93/LevelDB/WAL/\u5BA1\u8BA1/\u65E5\u5FD7/\u62A5\u544A/\u5BFC\u51FA\u76EE\u5F55\u3001`artifacts/`\u3001\u624B\u5DE5\u6539\u52A8\u8FC7\u7684 `dist/`\u3001`public/` \u4E0B\u7684\u4EA7\u7269\u76EE\u5F55\uFF1B\u300C\u5DF2\u88AB gitignore\u300D\u300C\u662F\u6784\u5EFA\u4EA7\u7269\u300D\u300C\u53EF\u91CD\u65B0\u6784\u5EFA\u300D\u7B49\u672A\u7ECF\u547D\u4EE4\u6838\u5B9E\u7684\u8BF4\u6CD5\u4E0D\u6784\u6210\u653E\u884C\u7406\u7531\u3002\u6CE8\u610F `git worktree remove` \u4E0D\u4F1A\u56E0 ignored \u5185\u5BB9\u800C\u62D2\u7EDD\uFF08\u4F1A\u8FDE\u5176\u4E00\u5E76\u5220\u9664\uFF09\uFF0C\u672C\u4F8B\u5916\u6CA1\u6709\u673A\u68B0\u515C\u5E95\uFF0C\u4E0A\u8FF0\u9010\u9879\u6838\u5B9E\u662F\u552F\u4E00\u9632\u7EBF\uFF1B\u53EA\u7528\u4E0D\u5E26 --force \u7684 git worktree remove \u4E0E git branch -d\uFF0C\u7981\u6B62 -D\u3001--force\u3001rm -rf \u66FF\u4EE3\uFF1B\u2461 \u672C\u6B21\u521B\u5EFA\u3001\u5185\u5BB9\u53EA\u662F\u53EF\u518D\u751F\u4E2D\u95F4\u4EA7\u7269\uFF08\u65E5\u5FD7\u3001\u63A2\u9488\u811A\u672C\u3001\u622A\u56FE\u3001\u6784\u5EFA\u7F13\u5B58\uFF09\u7684 /tmp \u6587\u4EF6\uFF0C\u542B\u552F\u4E00\u7ED3\u679C\u6216\u7528\u6237\u6570\u636E\u7684\u4E0D\u7B97\uFF1B\u2462 \u672C\u6B21\u542F\u52A8\u3001\u6309\u5F53\u6B21\u8BB0\u5F55\u7684 PID \u6838\u5B9E\u8EAB\u4EFD\u3001\u7EC8\u6B62\u4E0D\u4E22\u672A\u4FDD\u5B58\u72B6\u6001\u7684\u540E\u53F0\u8FDB\u7A0B\u3002\u201C\u6709\u5907\u4EFD\u201D\u201C\u5728 /tmp\u201D\u201C\u5DF2\u5408\u5E76\u201D\u7B49\u672A\u7ECF\u547D\u4EE4\u6838\u5B9E\u7684\u5224\u65AD\u4E0D\u6784\u6210\u9A8C\u8BC1\uFF1B\u4EFB\u4E00\u9879\u65E0\u6CD5\u9A8C\u8BC1\uFF0C\u4E00\u5F8B\u56DE\u5230\u4E0A\u9762\u7684\u786E\u8BA4\u6D41\u7A0B\u3002\u7528\u6237\u6570\u636E\u3001\u8FDC\u7AEF/\u5E73\u53F0\u5185\u5BB9\u3001\u4ED6\u4EBA\u6216\u65E2\u6709\u7684\u6587\u4EF6\u3001\u5206\u652F\u3001stash \u6C38\u8FDC\u4E0D\u9002\u7528\u6B64\u4F8B\u5916\u3002"
96
96
  ].join("\n");
97
97
 
98
98
  // packages/agent-runtime/credentialHygiene.ts
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  toolRegistry
3
- } from "./chunk-HKWGI3TM.js";
3
+ } from "./chunk-QVJ7PDL7.js";
4
4
  import {
5
5
  runtime_default
6
- } from "./chunk-326HCB6L.js";
6
+ } from "./chunk-33OJHC3O.js";
7
7
  import {
8
8
  canonicalizeToolNames
9
9
  } from "./chunk-AKE53VMW.js";
@@ -6,7 +6,7 @@ import {
6
6
  } from "./chunk-WACI5I6V.js";
7
7
  import {
8
8
  t
9
- } from "./chunk-CLTGWJVT.js";
9
+ } from "./chunk-E4LYPSYM.js";
10
10
 
11
11
  // packages/cli/cliApiClient.ts
12
12
  var CliApiError = class extends Error {
@@ -5,7 +5,7 @@ import {
5
5
  } from "./chunk-NBTY7YJF.js";
6
6
  import {
7
7
  resolveCliLocalRuntimeKeyCapability
8
- } from "./chunk-HKWGI3TM.js";
8
+ } from "./chunk-QVJ7PDL7.js";
9
9
  import {
10
10
  HIGH_RISK_MUTATION_TOOL_NAMES
11
11
  } from "./chunk-2Q3LOAFE.js";
@@ -5,7 +5,7 @@ import {
5
5
  inlineImageUrlsForCustomProvider,
6
6
  prepareTools,
7
7
  shouldInlineImageUrlsForAgent
8
- } from "./chunk-BLFZULEQ.js";
8
+ } from "./chunk-IVNI335J.js";
9
9
  import {
10
10
  CONFIRMATION_INPUT_KEYS,
11
11
  INVALID_TOOL_ARGS_REPLACEMENT,
@@ -14,16 +14,16 @@ import {
14
14
  performFetchRequest,
15
15
  sanitizeOutboundMessages,
16
16
  stripModelToolArgs
17
- } from "./chunk-YV2RSLM4.js";
17
+ } from "./chunk-EWAQ4DYY.js";
18
18
  import {
19
19
  findToolExecutor,
20
20
  toolDefinitionsByName
21
- } from "./chunk-HKWGI3TM.js";
21
+ } from "./chunk-QVJ7PDL7.js";
22
22
  import {
23
23
  classifyApiError,
24
24
  classifyGenerationError,
25
25
  extractErrorDiagnostics
26
- } from "./chunk-RIKSN62L.js";
26
+ } from "./chunk-4UCFQCD4.js";
27
27
  import {
28
28
  createSSEParser,
29
29
  createToolRunId,
@@ -32,7 +32,7 @@ import {
32
32
  toolRunSetPending,
33
33
  toolRunStarted,
34
34
  toolRunSucceeded
35
- } from "./chunk-C7PKPHK6.js";
35
+ } from "./chunk-SRDWWDBV.js";
36
36
  import {
37
37
  getPublicImageAgentMode
38
38
  } from "./chunk-VIDPVFP3.js";
@@ -43,17 +43,22 @@ import {
43
43
  addToolMessage,
44
44
  messageStreamEnd,
45
45
  messageStreaming,
46
+ toast,
46
47
  toolResultNeedsUserConfirmation,
47
48
  updateToolMessage
48
- } from "./chunk-326HCB6L.js";
49
+ } from "./chunk-33OJHC3O.js";
49
50
  import {
50
51
  streamAgentChatTurn
51
- } from "./chunk-ETTDZBK5.js";
52
+ } from "./chunk-6YY6MOCF.js";
52
53
  import {
53
54
  addActiveController,
55
+ getActiveDialogKey,
54
56
  removeActiveController,
55
57
  tokenUsageLiveUpdate
56
58
  } from "./chunk-OWYYDMGJ.js";
59
+ import {
60
+ require_react
61
+ } from "./chunk-YDH3FDFQ.js";
57
62
  import {
58
63
  selectCurrentServer
59
64
  } from "./chunk-HWZT5DKX.js";
@@ -120,6 +125,9 @@ import {
120
125
  import {
121
126
  asOptionalTrimmedString
122
127
  } from "./chunk-G3SUCT4W.js";
128
+ import {
129
+ __toESM
130
+ } from "./chunk-4VNS5WPM.js";
123
131
 
124
132
  // packages/integrations/openai/filterAndCleanMessages.ts
125
133
  var isValidMessagePart = (part) => {
@@ -333,6 +341,115 @@ async function persistToolMessages(dispatch, messages, options = {}) {
333
341
  }
334
342
  }
335
343
 
344
+ // packages/app/appInspector/appInspectorStore.ts
345
+ var import_react = __toESM(require_react());
346
+ var listeners = /* @__PURE__ */ new Set();
347
+ var version = 0;
348
+ var previewOpen = false;
349
+ var previewUrl = null;
350
+ var previewTarget = null;
351
+ var notify = () => {
352
+ for (const listener of listeners) {
353
+ try {
354
+ listener();
355
+ } catch {
356
+ }
357
+ }
358
+ };
359
+ var bump = () => {
360
+ version += 1;
361
+ notify();
362
+ };
363
+ function openPreviewTarget(target) {
364
+ previewOpen = true;
365
+ previewTarget = target;
366
+ if (target.kind === "dev" || target.kind === "url") {
367
+ previewUrl = target.url;
368
+ } else {
369
+ previewUrl = null;
370
+ }
371
+ bump();
372
+ }
373
+ function getPreviewTarget() {
374
+ return previewTarget;
375
+ }
376
+
377
+ // packages/app/appInspector/htmlArtifactClient.ts
378
+ async function readHtmlArtifact(id, options) {
379
+ const fetchFn = options?.fetchImpl ?? (typeof fetch !== "undefined" ? fetch : void 0);
380
+ if (!fetchFn) {
381
+ throw new Error("fetch is not available in current environment");
382
+ }
383
+ const base = options?.serverOrigin ? options.serverOrigin.replace(/\/+$/, "") : "";
384
+ const url = `${base}/api/html-artifacts`;
385
+ const headers = {
386
+ "Content-Type": "application/json"
387
+ };
388
+ if (options?.authToken) {
389
+ headers.Authorization = `Bearer ${options.authToken}`;
390
+ }
391
+ const response = await fetchFn(url, {
392
+ method: "POST",
393
+ headers,
394
+ credentials: "include",
395
+ body: JSON.stringify({
396
+ action: "read",
397
+ id
398
+ })
399
+ });
400
+ if (!response.ok) {
401
+ const errorText = await response.text().catch(() => "");
402
+ throw new Error(`\u8BFB\u53D6 HTML \u6210\u54C1\u5931\u8D25 (${response.status}): ${errorText || response.statusText}`);
403
+ }
404
+ const data = await response.json();
405
+ if (!data?.artifact) {
406
+ throw new Error("\u670D\u52A1\u7AEF\u672A\u8FD4\u56DE\u6709\u6548\u7684 HTML \u6210\u54C1\u5BF9\u8C61");
407
+ }
408
+ return data.artifact;
409
+ }
410
+
411
+ // packages/chat/messages/web/htmlArtifactEventChannel.ts
412
+ var latestExecution = 0;
413
+ async function receiveHtmlArtifactToolResult(toolName, result, dialogKey, isError = false) {
414
+ if (isError || toolName !== "createHtmlArtifact" && toolName !== "updateHtmlArtifact") return;
415
+ let data = result;
416
+ if (typeof data === "string") {
417
+ try {
418
+ data = JSON.parse(data);
419
+ } catch {
420
+ return;
421
+ }
422
+ }
423
+ if (!data || data.error) return;
424
+ data = data.rawData ?? data;
425
+ if (!data || typeof data !== "object" || data.error) return;
426
+ const artifact = data.artifact ?? data;
427
+ if (!artifact || typeof artifact !== "object") return;
428
+ const id = data.id ?? artifact.id;
429
+ const ownerDialog = data.dialogKey ?? artifact.dialogKey;
430
+ if (typeof id !== "string" || !id || ownerDialog !== dialogKey || getActiveDialogKey() !== dialogKey) return;
431
+ const execution = ++latestExecution;
432
+ const targetBeforeRead = getPreviewTarget();
433
+ try {
434
+ const latest = await readHtmlArtifact(id);
435
+ if (execution !== latestExecution || getActiveDialogKey() !== dialogKey || getPreviewTarget() !== targetBeforeRead) return;
436
+ if (latest.id !== id || latest.dialogKey !== dialogKey || !latest.html) throw new Error("\u6210\u54C1\u8BFB\u53D6\u7ED3\u679C\u4E0D\u5339\u914D");
437
+ openPreviewTarget({ kind: "artifact", artifactId: latest.id, dialogKey: latest.dialogKey, title: latest.title, html: latest.html });
438
+ } catch {
439
+ if (execution === latestExecution && getActiveDialogKey() === dialogKey) {
440
+ toast.error("\u7F51\u9875\u5DF2\u4FDD\u5B58\uFF0C\u4F46\u8BFB\u53D6\u6700\u65B0\u5185\u5BB9\u5931\u8D25\u3002\u8BF7\u5728\u7ED3\u679C\u5361\u7247\u4E2D\u91CD\u8BD5\u6253\u5F00\u3002");
441
+ }
442
+ }
443
+ }
444
+ function deliverHtmlArtifactToolResult(toolName, content, dialogKey) {
445
+ if (!dialogKey || toolName !== "createHtmlArtifact" && toolName !== "updateHtmlArtifact") {
446
+ return;
447
+ }
448
+ void receiveHtmlArtifactToolResult(toolName, content, dialogKey).catch(
449
+ (error) => console.error("[htmlArtifact] live result delivery failed", error)
450
+ );
451
+ }
452
+
336
453
  // packages/ai/chat/updateTotalUsage.ts
337
454
  function updateTotalUsage(currentUsage, newUsageChunk) {
338
455
  if (!newUsageChunk) {
@@ -762,6 +879,9 @@ var handleToolCalls = createAsyncThunk(
762
879
  const toolName = result.toolName;
763
880
  let rawResult = result.rawResult;
764
881
  let toolPayload = result.toolPayload;
882
+ if (toolPayload?.status === "succeeded") {
883
+ deliverHtmlArtifactToolResult(toolName, rawResult, dialogKey);
884
+ }
765
885
  if (toolName) {
766
886
  const completedToolMessage = {
767
887
  ...runningToolMessage,
@@ -1975,6 +2095,7 @@ ${errorText}`
1975
2095
  export {
1976
2096
  filterAndCleanMessages,
1977
2097
  persistToolMessages,
2098
+ deliverHtmlArtifactToolResult,
1978
2099
  handleToolCalls,
1979
2100
  updateTotalUsage,
1980
2101
  readStreamChunk,
@@ -4,12 +4,12 @@ import {
4
4
  isAgentSkillDisabled,
5
5
  resolveAgentSkillConfig,
6
6
  resolveUserEnabledSkills
7
- } from "./chunk-DKZJJ2NQ.js";
7
+ } from "./chunk-I5PBXF7O.js";
8
8
  import {
9
9
  resolveBuiltinSkillEntry,
10
10
  resolveBuiltinSkillPage,
11
11
  resolveSkillGraphFromRoots
12
- } from "./chunk-LEX6DEH4.js";
12
+ } from "./chunk-Y6M7KJOA.js";
13
13
  import {
14
14
  parseSkillDocProtocol
15
15
  } from "./chunk-AETZ7AD6.js";
@@ -1,13 +1,13 @@
1
1
  import {
2
2
  buildStaticUserPolicyContext,
3
3
  resolveSpaceContextPreloadPlan
4
- } from "./chunk-Q7GNBUT4.js";
4
+ } from "./chunk-NEZGPBL7.js";
5
5
  import {
6
6
  fetchReferenceContents,
7
7
  mergeReferences,
8
8
  resolveReferenceAssets,
9
9
  resolveToolsFromKeys
10
- } from "./chunk-RIKSN62L.js";
10
+ } from "./chunk-4UCFQCD4.js";
11
11
  import {
12
12
  UI_CARD_ENVELOPE_MAX_BYTES,
13
13
  getAllToolRuns,
@@ -18,14 +18,14 @@ import {
18
18
  selectSpaceContextLevel,
19
19
  selectUserTonePreset,
20
20
  uiCardFallback
21
- } from "./chunk-C7PKPHK6.js";
21
+ } from "./chunk-SRDWWDBV.js";
22
22
  import {
23
23
  resolveAgentRecommendedSkillNames,
24
24
  resolveAgentRequiredPackIds
25
- } from "./chunk-DKZJJ2NQ.js";
25
+ } from "./chunk-I5PBXF7O.js";
26
26
  import {
27
27
  getDocState
28
- } from "./chunk-D57YYGMD.js";
28
+ } from "./chunk-SQTBTTAE.js";
29
29
  import {
30
30
  resolveToolBaseUrl
31
31
  } from "./chunk-MYOH447Z.js";
@@ -37,7 +37,7 @@ import {
37
37
  } from "./chunk-A2ZMIRLN.js";
38
38
  import {
39
39
  getTableState
40
- } from "./chunk-SSK4WNJA.js";
40
+ } from "./chunk-WAECKLPA.js";
41
41
  import {
42
42
  getCurrentSpaceIdRaw,
43
43
  getViewMode
@@ -46,7 +46,7 @@ import {
46
46
  PERSONALIZATION_DIALOG_CATEGORY,
47
47
  buildPersonalizationDialogPolicyContext,
48
48
  selectAllMsgs
49
- } from "./chunk-326HCB6L.js";
49
+ } from "./chunk-33OJHC3O.js";
50
50
  import {
51
51
  selectPendingFiles
52
52
  } from "./chunk-OWYYDMGJ.js";
@@ -68,7 +68,7 @@ import {
68
68
  expandEnabledPackPromptPatches,
69
69
  expandEnabledPacks,
70
70
  resolveEffectiveEnabledPacks
71
- } from "./chunk-6OEPWZV7.js";
71
+ } from "./chunk-TPCDYNJK.js";
72
72
  import {
73
73
  projectToolMessageContent
74
74
  } from "./chunk-2WZXXAQD.js";
@@ -993,6 +993,27 @@ var buildEditingContextSummary = (state, runtimeOptions) => {
993
993
  if (targetKind === "canvas_node") {
994
994
  return buildCanvasNodeEditingContextSummary(runtimeOptions);
995
995
  }
996
+ if (targetKind === "artifact" || targetKind === "html_artifact") {
997
+ const editingTarget = runtimeOptions?.editingTarget;
998
+ const metadata = editingTarget?.metadata;
999
+ const artifactId = typeof editingTarget?.key === "string" && editingTarget.key ? editingTarget.key : typeof metadata?.artifactId === "string" ? metadata.artifactId : typeof editingTarget?.artifactId === "string" ? editingTarget.artifactId : null;
1000
+ const title = editingTarget?.title ?? (typeof metadata?.title === "string" ? metadata.title : "HTML \u7F51\u9875\u6210\u54C1");
1001
+ const dialogKey = typeof metadata?.dialogKey === "string" ? metadata.dialogKey : typeof editingTarget?.dialogKey === "string" ? editingTarget.dialogKey : null;
1002
+ return [
1003
+ "\u5F53\u524D\u7F16\u8F91\u76EE\u6807\uFF1A\u5355\u6587\u4EF6 HTML \u7F51\u9875\u6210\u54C1\uFF08Editing HTML Artifact\uFF09\u3002",
1004
+ ...artifactId ? [`- \u6210\u54C1 ID (artifactId): ${artifactId}`] : ["- \u6210\u54C1 ID: (\u65B0\u5EFA\u4E2D\u6216\u672A\u6307\u5B9A)"],
1005
+ `- \u6807\u9898: ${title}`,
1006
+ ...dialogKey ? [`- \u6240\u5C5E\u5BF9\u8BDD: ${dialogKey}`] : [],
1007
+ "",
1008
+ "\u3010\u7ED9 AI \u7684\u64CD\u4F5C\u6307\u5357 / \u975E\u7528\u6237\u539F\u8BDD\u3011",
1009
+ artifactId ? `1. \u5F53\u524D\u5BF9\u8BDD\u5DF2\u5B58\u5728\u5E76\u6B63\u5728\u67E5\u770B HTML \u6210\u54C1\uFF08ID: ${artifactId}\uFF09\u3002\u5982\u679C\u7528\u6237\u8981\u6C42\u4FEE\u6539\u3001\u8C03\u6574\u6837\u5F0F\u3001\u5B8C\u5584\u529F\u80FD\u6216\u8FED\u4EE3\u5F53\u524D\u7F51\u9875\uFF0C**\u5FC5\u987B\u5148\u4F7F\u7528 readHtmlArtifact(id: "${artifactId}") \u8BFB\u53D6\u73B0\u6709\u6E90\u7801\uFF08\u5982\u9700\uFF09\uFF0C\u518D\u8C03\u7528 updateHtmlArtifact(id: "${artifactId}", html: "...") \u66F4\u65B0\u540C\u4E00\u4E2A ID**\uFF0C\u4FDD\u6301\u539F\u6210\u54C1 ID \u7A33\u5B9A\u3002` : "1. \u5982\u679C\u7528\u6237\u8981\u6C42\u751F\u6210\u5168\u65B0\u7F51\u9875\uFF0C\u4F7F\u7528 createHtmlArtifact \u521B\u5EFA\u65B0\u6210\u54C1\u3002",
1010
+ ...artifactId ? [
1011
+ `2. **\u4E25\u7981\u65E0\u6761\u4EF6\u8C03\u7528 createHtmlArtifact \u521B\u5EFA\u65B0\u526F\u672C**\u6765\u66FF\u4EE3\u5BF9\u73B0\u6709\u6210\u54C1\u7684\u4FEE\u6539\uFF1B\u53EA\u6709\u7528\u6237\u660E\u786E\u8868\u8FBE\u8981\u53E6\u5916'\u65B0\u5EFA\u4E00\u4E2A\u72EC\u7ACB\u7F51\u9875'\u65F6\u624D\u8C03\u7528 createHtmlArtifact\u3002`,
1012
+ "3. \u7CFB\u7EDF\u4E0D\u4F1A\u9759\u9ED8\u628A create \u8F6C\u6362\u4E3A update\uFF0C\u8C03\u7528\u9519\u8BEF\u4F1A\u5BFC\u81F4\u4EA7\u751F\u5206\u53C9\u526F\u672C\u3002"
1013
+ ] : [],
1014
+ "4. \u751F\u6210/\u66F4\u65B0\u7F51\u9875\u8BF7\u4F7F\u7528 createHtmlArtifact / updateHtmlArtifact\uFF0C\u4E0D\u8981\u4F7F\u7528 createDoc \u6216\u666E\u901A\u6587\u6863\u5DE5\u5177\uFF1B\u666E\u901A\u6587\u6863\u5DE5\u5177\u4EC5\u7528\u4E8E\u77E5\u8BC6\u5E93\u4E0E\u6587\u7AE0\u3002"
1015
+ ].join("\n");
1016
+ }
996
1017
  return null;
997
1018
  };
998
1019
 
@@ -69,7 +69,7 @@ import {
69
69
  } from "./chunk-4SN6J65J.js";
70
70
  import {
71
71
  t
72
- } from "./chunk-CLTGWJVT.js";
72
+ } from "./chunk-E4LYPSYM.js";
73
73
  import {
74
74
  asNonEmptyStringArray,
75
75
  asTrimmedNonEmptyStringArray