nolo-cli 0.96.0-alpha.1 → 0.96.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (181) hide show
  1. package/README.md +1 -1
  2. package/{_executeModel-AUQRMRWL.js → _executeModel-GWF37P7J.js} +68 -63
  3. package/{action-YVYQEAAV.js → action-GI44T4DR.js} +10 -10
  4. package/{addContentAction-O7R66HEX.js → addContentAction-B2DRF7P6.js} +9 -9
  5. package/{addDialogAgentAction-74OA7KYP.js → addDialogAgentAction-T3I7IXPK.js} +15 -17
  6. package/{agentDeleteCommand-4BAHJRU3.js → agentDeleteCommand-5SHJMUF7.js} +47 -43
  7. package/{agentEmailCommands-QISOY7Y6.js → agentEmailCommands-YC7RFNYN.js} +90 -82
  8. package/{agentListCommands-U46ODMQU.js → agentListCommands-O4DSVOHQ.js} +78 -82
  9. package/{agentMachineCommands-EHV2KM2C.js → agentMachineCommands-ZSQCK3SA.js} +42 -38
  10. package/{agentProviderCommands-GNPTL5XR.js → agentProviderCommands-EMZCM6VA.js} +1 -1
  11. package/{agentPullCommand-O5MPVJ5E.js → agentPullCommand-HF4A42D4.js} +1 -1
  12. package/agentRecordCommands-MUG5QMN7.js +136 -0
  13. package/{agentRunCommand-K4CLMA6B.js → agentRunCommand-5EBSIN74.js} +90 -80
  14. package/{agentRunControl-XLGD3UZ5.js → agentRunControl-5T64LM2M.js} +2 -2
  15. package/{agentRuntimeLocal-O4HPUJA4.js → agentRuntimeLocal-KTWDCVYZ.js} +44 -36
  16. package/{agentSlice-ZYT2OUR3.js → agentSlice-QA6WAKNE.js} +11 -11
  17. package/{appDeleteCommands-R5BBTKQK.js → appDeleteCommands-JPPKN55V.js} +42 -38
  18. package/{appDeployCommands-ZJIXOJWD.js → appDeployCommands-QU5PW23S.js} +42 -38
  19. package/{appDeployStatusCommands-B3R2ZTBF.js → appDeployStatusCommands-QVAJTRSP.js} +42 -38
  20. package/{appGetCommands-2AQSOV2A.js → appGetCommands-LT3KDTHJ.js} +42 -38
  21. package/{appListCommands-HCIJGZFY.js → appListCommands-V37HIWKN.js} +42 -38
  22. package/{authCommand-F4EFRRX6.js → authCommand-2YPMMIJN.js} +117 -23
  23. package/{authCommands-RGOGCPP6.js → authCommands-FFDS4FVX.js} +7 -5
  24. package/{builtinSkillRegistry-FUAVTRVZ.js → builtinSkillRegistry-CALVIJTX.js} +6 -5
  25. package/{chatQueueReduxAdapter-Q5V4YJVI.js → chatQueueReduxAdapter-YYIRKWPD.js} +30 -29
  26. package/{chromeCommands-FZYAU75D.js → chromeCommands-K27J4OVZ.js} +124 -28
  27. package/{chromeOpsCommands-62P2Q2YB.js → chromeOpsCommands-IXRLN57H.js} +4 -3
  28. package/{chunk-6OZ36FXI.js → chunk-27ONFIEY.js} +22 -4
  29. package/{chunk-JEDZAO7L.js → chunk-2SYTUTLI.js} +257 -37
  30. package/{chunk-OIVSQH2O.js → chunk-3BXNTXYI.js} +299 -5
  31. package/{chunk-BLJWCTRL.js → chunk-45LEXXBA.js} +1 -1
  32. package/{chunk-EYAQT56M.js → chunk-4DPP773Q.js} +2 -2
  33. package/chunk-4LCOCOR5.js +50 -0
  34. package/{chunk-2GRGFCF6.js → chunk-4VJAC32I.js} +2 -1
  35. package/{chunk-LLT642J4.js → chunk-4W65H3KF.js} +24 -5
  36. package/{chunk-MC4XLIJ7.js → chunk-523DITKR.js} +1 -1
  37. package/chunk-5G7QSEFG.js +13349 -0
  38. package/{chunk-E4MARS3Q.js → chunk-5GVBDNTO.js} +1 -1
  39. package/chunk-5J3PYNUP.js +255 -0
  40. package/chunk-5MMAK75Q.js +15 -0
  41. package/{chunk-JPGCXHNM.js → chunk-5OA5HMTL.js} +1 -1
  42. package/{chunk-42V6BK2E.js → chunk-62IL3KQV.js} +4 -34
  43. package/{chunk-6YTOJY35.js → chunk-6D2JFXLY.js} +35 -0
  44. package/{chunk-3BMYXEUW.js → chunk-6O4IK4V2.js} +1 -1
  45. package/{chunk-WADCY6G6.js → chunk-6ZWMH6TJ.js} +111 -41
  46. package/{chunk-ABQYVJBJ.js → chunk-7CHC4W22.js} +1 -1
  47. package/{chunk-YQTQQX2H.js → chunk-7IJ3GSRH.js} +1 -1
  48. package/{chunk-GQBOR3G6.js → chunk-7KVZ5LDQ.js} +2 -2
  49. package/{chunk-OA6Q2A4I.js → chunk-A7RSPKU6.js} +98 -22
  50. package/chunk-ALY3N3HU.js +7600 -0
  51. package/{chunk-Q554LLSI.js → chunk-AUDNYVRC.js} +1 -1
  52. package/{chunk-GPCZ7UXG.js → chunk-AZRHIN5B.js} +1 -1
  53. package/chunk-BMQ2MJUK.js +153 -0
  54. package/{chunk-3IIEFNGY.js → chunk-C53ZG23R.js} +2 -2
  55. package/chunk-CHOZJMJS.js +78 -0
  56. package/{chunk-HJUYAD4A.js → chunk-CPUFH46E.js} +8 -8
  57. package/{chunk-LS2ZANRJ.js → chunk-CTUQJVQM.js} +1 -1
  58. package/{chunk-BP4XNZRM.js → chunk-CU3QB4HW.js} +3 -3
  59. package/{chunk-ACTMNVHM.js → chunk-CYSYR67N.js} +1 -1
  60. package/{chunk-KQ4ONNQD.js → chunk-DAWDCRIG.js} +82 -8
  61. package/{chunk-VLTIYV3X.js → chunk-DCLMZ5TX.js} +4 -4
  62. package/{chunk-UKZDAFYT.js → chunk-DSSTTEKI.js} +6 -10
  63. package/{chunk-HVURBGF3.js → chunk-ESRMFY7G.js} +2 -2
  64. package/{chunk-TRV2MIDW.js → chunk-EXAJ6DCR.js} +1 -0
  65. package/{chunk-ZLR5JN3E.js → chunk-FKBRWL4E.js} +7 -7
  66. package/{chunk-XOVEWFLK.js → chunk-G3BCMDJB.js} +100 -100
  67. package/chunk-GMZLP5DV.js +82 -0
  68. package/{chunk-FDTR4QJ6.js → chunk-H6A6X4EK.js} +32 -1
  69. package/{chunk-DVINR3PL.js → chunk-HDLLCBRF.js} +1 -1
  70. package/{chunk-ONXOABJR.js → chunk-HNGRBWYF.js} +3 -0
  71. package/{chunk-IAO6JBYW.js → chunk-HP2HV7RZ.js} +171 -14
  72. package/{chunk-H62HCIUP.js → chunk-HYZIYH2H.js} +11 -10
  73. package/{chunk-NTW5GWDM.js → chunk-I3QNET24.js} +32 -17
  74. package/{chunk-WV42OMV7.js → chunk-IAESIMK7.js} +4 -4
  75. package/{chunk-JRQFUXY7.js → chunk-KCDUTE5V.js} +96 -19
  76. package/{chunk-XRWZB6CF.js → chunk-KLTTJFH2.js} +23 -76
  77. package/{chunk-IIVGDG4I.js → chunk-LNPYTNMG.js} +8 -4
  78. package/{chunk-AFDS2CVM.js → chunk-MDMTFGJ2.js} +15 -20
  79. package/{chunk-4MY4GLIW.js → chunk-MN3RHOFX.js} +969 -1090
  80. package/{chunk-7S4YWN7P.js → chunk-MX574M24.js} +1 -1
  81. package/{chunk-FZGV4FGK.js → chunk-NUHHBEJC.js} +378 -187
  82. package/{chunk-53HEEOTT.js → chunk-O26PCYLS.js} +80 -13
  83. package/{chunk-3DII57IT.js → chunk-O2OWEFII.js} +1 -1
  84. package/chunk-OCZKATRC.js +129 -0
  85. package/{chunk-6D6VBVEW.js → chunk-OTEMQQZI.js} +80 -14
  86. package/chunk-P6GMCCAT.js +870 -0
  87. package/{chunk-CPH3W5A7.js → chunk-Q4GP72HX.js} +94 -3
  88. package/{chunk-DHDMC6FO.js → chunk-QKUMVP3O.js} +11 -6
  89. package/{chunk-76WEAXJB.js → chunk-QXWGM7NK.js} +18 -15
  90. package/{chunk-JOHSKZQX.js → chunk-R2TEASHZ.js} +865 -207
  91. package/{chunk-Z77CRGTW.js → chunk-R4SQ3LGW.js} +1 -1
  92. package/{chunk-V4MJDUSR.js → chunk-RSEEDUMS.js} +2 -2
  93. package/{chunk-UZGQNTVW.js → chunk-S5XGT6GB.js} +5 -3
  94. package/{chunk-QIAVMDHY.js → chunk-SDAPKV2N.js} +4 -4
  95. package/{chunk-SNPMM7H3.js → chunk-SN2U5EE7.js} +13 -13
  96. package/{chunk-AFUORTY4.js → chunk-SONWNI3L.js} +21 -21
  97. package/{chunk-A6G32FNX.js → chunk-SYAMDUAL.js} +13 -13
  98. package/{chunk-BYMV6QZG.js → chunk-TNIX77YM.js} +4 -0
  99. package/{chunk-OF7AQZUG.js → chunk-TU5NE4U3.js} +9 -84
  100. package/{chunk-EGSKXKR5.js → chunk-TWROMK2A.js} +1 -1
  101. package/chunk-TY3TIUJK.js +89 -0
  102. package/chunk-UNYJU5L6.js +780 -0
  103. package/{chunk-J4MOO56S.js → chunk-UQNS32WZ.js} +10 -2
  104. package/chunk-VIWDGTDA.js +8 -0
  105. package/chunk-VJVNU77E.js +83 -0
  106. package/{chunk-MMPXJXHT.js → chunk-VKEMMN62.js} +584 -480
  107. package/{chunk-ZXKVPF4K.js → chunk-W5HY3V6I.js} +236 -36
  108. package/{chunk-JAXOVNM4.js → chunk-WILHZY7K.js} +45 -45
  109. package/{chunk-UKWGR5SS.js → chunk-WIWM4FE3.js} +187 -398
  110. package/{chunk-BGSLKVCP.js → chunk-XAAUXO27.js} +6 -7
  111. package/{chunk-O6OSWFZQ.js → chunk-XUWRURDF.js} +6 -0
  112. package/{chunk-Q67DOFOO.js → chunk-Y3PMXGLH.js} +2 -0
  113. package/{chunk-SH43IESU.js → chunk-YUNJN43V.js} +44 -9
  114. package/{chunk-BZWBEHGD.js → chunk-YYMTXN25.js} +66 -38
  115. package/{chunk-TOP2VXOR.js → chunk-Z4CSIXYP.js} +2 -2
  116. package/{chunk-DEUUPHOO.js → chunk-ZGESTNDD.js} +77 -17
  117. package/{chunk-2F7RJC6L.js → chunk-ZOVKKMF6.js} +1 -1
  118. package/chunk-ZRAU6T47.js +56 -0
  119. package/commandRegistry-JPJBZMSB.js +833 -0
  120. package/{contentThunks-PT23JWJX.js → contentThunks-S5S6Y7FH.js} +32 -30
  121. package/{cooldownCommands-REAWYVTY.js → cooldownCommands-ZLEPIB4A.js} +2 -2
  122. package/{createAgentAutomationAction-N27SYTLU.js → createAgentAutomationAction-E3V23HF4.js} +32 -30
  123. package/{createDialogAction-XZPLHD5G.js → createDialogAction-PS2N7OCP.js} +36 -33
  124. package/{createPageAction-KHVJQ3CS.js → createPageAction-6XUY3KXJ.js} +38 -36
  125. package/{chunk-3SJQXXGY.js → cursorProvider-YGGNMVWX.js} +2560 -9879
  126. package/{dbSlice-XVWBAGYN.js → dbSlice-DQ32LYTJ.js} +8 -8
  127. package/{deleteFile-YG6QMJLU.js → deleteFile-NX6QHCWZ.js} +3 -3
  128. package/{dialogCommands-ZUWW5UT6.js → dialogCommands-3YXLYO2W.js} +45 -41
  129. package/{dialogSlice-3YH242HS.js → dialogSlice-NTZ5GT5B.js} +36 -29
  130. package/{dist-VODFSGNG.js → dist-NJC2W7I4.js} +61 -54
  131. package/{docCreateCommands-Q6FADDSJ.js → docCreateCommands-4JSMQDST.js} +44 -40
  132. package/{docDeleteCommands-ZKIH54PZ.js → docDeleteCommands-3KTE3KP6.js} +44 -40
  133. package/{docReadCommands-7BZT2QTW.js → docReadCommands-54BL4OYN.js} +43 -39
  134. package/{docStore-YSZRNUUD.js → docStore-QE6H3LDC.js} +11 -10
  135. package/{docUpdateCommands-WJXWTRL7.js → docUpdateCommands-BMBPTW5U.js} +44 -40
  136. package/{fetchMessages-EIU7UFFK.js → fetchMessages-67MEFPZR.js} +2 -2
  137. package/{getPricing-LUSEABA6.js → getPricing-NMMFT3YI.js} +3 -3
  138. package/{handleSendMessageAction-KJO2QDBM.js → handleSendMessageAction-34BJIBML.js} +91 -83
  139. package/index.js +87 -884
  140. package/{localDialogRead-BTFJ4V2I.js → localDialogRead-EBRS242U.js} +2 -2
  141. package/{localRuntimeAuthority-6IR6BBXE.js → localRuntimeAuthority-5W6IJRAD.js} +6 -6
  142. package/{localRuntimeDb-SYQGUF4U.js → localRuntimeDb-3LRMNLCM.js} +1 -1
  143. package/{machineCommands-QC4TD7GJ.js → machineCommands-KBMEZDL3.js} +85 -77
  144. package/{machineWsRunDispatch-XUOIAXO7.js → machineWsRunDispatch-FRANXJZJ.js} +82 -74
  145. package/{memberThunks-QGFLFVCI.js → memberThunks-5ZXPR63F.js} +9 -9
  146. package/{models-T3SG6MJ5.js → models-ZPU5EDF4.js} +2 -2
  147. package/oauthTokenStore-ITEB663N.js +23 -0
  148. package/package.json +1 -1
  149. package/pdf-U6KSUEZZ.js +26435 -0
  150. package/processSpawn-SOAV3FEV.js +11 -0
  151. package/profileConfig-ZGOFORWV.js +43 -0
  152. package/{providerPresetApply-FG6NZ57W.js → providerPresetApply-76AVU3HD.js} +7 -7
  153. package/{providerRegistry-757OWH3O.js → providerRegistry-Z62NC45X.js} +11 -7
  154. package/{read-COE3ZYR6.js → read-EPTJRAEF.js} +5 -5
  155. package/{readDocTool-5USN4A6V.js → readDocTool-W4NDXNEX.js} +5 -3
  156. package/{readlineWorkspace-74TXXSLO.js → readlineWorkspace-P7WDR4NG.js} +2450 -2022
  157. package/{removeDialogAgentAction-IX3MN2ZO.js → removeDialogAgentAction-BVAWQKXE.js} +17 -19
  158. package/{runAgentClientLoop-37BXJD62.js → runAgentClientLoop-5OQN64SG.js} +62 -58
  159. package/{runtimeDoctorCommands-X6WDBEQX.js → runtimeDoctorCommands-3USD722U.js} +3 -3
  160. package/runtimeModeArgs-2Y7BALTO.js +31 -0
  161. package/{setDialogExtraReferencesAction-X4HCPNZL.js → setDialogExtraReferencesAction-LYY45IAD.js} +12 -11
  162. package/{setPrimaryDialogAgentAction-4GMIQLOD.js → setPrimaryDialogAgentAction-73IL7DLU.js} +18 -20
  163. package/{settingSlice-ZQZVUPKK.js → settingSlice-Q6EKL7EQ.js} +9 -9
  164. package/{skillDiscovery-CYUCJMAG.js → skillDiscovery-ZBU76COE.js} +3 -3
  165. package/{spaceCommands-P3ONT6LL.js → spaceCommands-W7B34E7K.js} +44 -40
  166. package/{streamAgentChatTurn-FGXQXALU.js → streamAgentChatTurn-7AX7XVHL.js} +184 -91
  167. package/{switchDialogAgentAction-N52LRPA3.js → switchDialogAgentAction-UUXDSQ6X.js} +15 -17
  168. package/{tableCommands-O6NWHFKV.js → tableCommands-G7RV3RU3.js} +4 -4
  169. package/{toolApiClient-QVJ6HDNN.js → toolApiClient-INIQCPGY.js} +3 -3
  170. package/{tools-R5UF2KZO.js → tools-357446VN.js} +55 -51
  171. package/{tuiSummaryLlmCaller-T2SHYMDZ.js → tuiSummaryLlmCaller-74NRRLVW.js} +18 -16
  172. package/{updateCommands-2M74UL7P.js → updateCommands-4EHDLF5J.js} +3 -3
  173. package/{updateDialogTitleAction-RTADGV7A.js → updateDialogTitleAction-A2OK52IY.js} +81 -43
  174. package/agentRecordCommands-SIPURU2S.js +0 -128
  175. package/chunk-FOWEGIMF.js +0 -18881
  176. package/chunk-M76ECQRD.js +0 -13658
  177. package/chunk-Q5FJJ6XI.js +0 -103
  178. package/chunk-S7Z2HMCN.js +0 -25
  179. package/{chunk-VMFTFOWF.js → chunk-3AH7LNUB.js} +7 -7
  180. package/{chunk-X7HHHIOZ.js → chunk-Y6ROFCZO.js} +0 -0
  181. package/{db-WK5MDZVN.js → db-VQSAOWAO.js} +1 -1
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-KHCLMKZZ.js";
4
4
  import {
5
5
  buildSkillDiscoveryLayer
6
- } from "./chunk-DVINR3PL.js";
6
+ } from "./chunk-HDLLCBRF.js";
7
7
 
8
8
  // packages/agent-runtime/skillDiscovery.ts
9
9
  import { existsSync, readFileSync, readdirSync, statSync } from "node:fs";
@@ -0,0 +1,255 @@
1
+ // packages/ai/tools/chromeConnectorTools.ts
2
+ var CHROME_CONNECTOR_TOOL_NAMES = [
3
+ "browser_list_tabs",
4
+ "browser_open_tab",
5
+ "browser_close_tab",
6
+ "browser_read_page",
7
+ "browser_click_element",
8
+ "browser_type",
9
+ "browser_press",
10
+ "browser_scroll",
11
+ "browser_screenshot",
12
+ "browser_read_console",
13
+ "browser_read_network"
14
+ ];
15
+ var CHROME_CONNECTOR_LEGACY_TOOL_ALIASES = {
16
+ chrome_list_tabs: "browser_list_tabs",
17
+ chrome_open_tab: "browser_open_tab",
18
+ chrome_close_tab: "browser_close_tab",
19
+ chrome_read_page: "browser_read_page",
20
+ chrome_click: "browser_click_element",
21
+ chrome_type: "browser_type",
22
+ chrome_press: "browser_press",
23
+ chrome_scroll: "browser_scroll",
24
+ chrome_screenshot: "browser_screenshot",
25
+ chrome_read_console: "browser_read_console",
26
+ chrome_read_network: "browser_read_network"
27
+ };
28
+ var CHROME_CONNECTOR_LEGACY_TOOL_NAMES = Object.keys(
29
+ CHROME_CONNECTOR_LEGACY_TOOL_ALIASES
30
+ );
31
+ var CHROME_CONNECTOR_ACCEPTED_TOOL_NAMES = [
32
+ ...CHROME_CONNECTOR_TOOL_NAMES,
33
+ ...CHROME_CONNECTOR_LEGACY_TOOL_NAMES
34
+ ];
35
+ function resolveChromeConnectorToolName(name) {
36
+ if (CHROME_CONNECTOR_TOOL_NAMES.includes(name)) {
37
+ return name;
38
+ }
39
+ return CHROME_CONNECTOR_LEGACY_TOOL_ALIASES[name];
40
+ }
41
+ function canonicalizeChromeConnectorToolNames(toolNames) {
42
+ const out = [];
43
+ for (const name of toolNames ?? []) {
44
+ const resolved = typeof name === "string" ? resolveChromeConnectorToolName(name) : void 0;
45
+ if (resolved && !out.includes(resolved)) out.push(resolved);
46
+ }
47
+ return out;
48
+ }
49
+ var CONNECTOR_TARGET_PROPERTY = {
50
+ type: "string",
51
+ description: "Reserved and ignored for now; future multi-provider targeting."
52
+ };
53
+ var CHROME_CONNECTOR_READ_TOOL_NAMES = [
54
+ "browser_list_tabs",
55
+ "browser_read_page",
56
+ "browser_screenshot",
57
+ "browser_read_console",
58
+ "browser_read_network"
59
+ ];
60
+ var getChromeConnectorToolBehavior = (name) => CHROME_CONNECTOR_READ_TOOL_NAMES.includes(resolveChromeConnectorToolName(name)) ? "data" : "action";
61
+ var getChromeConnectorToolDefaultConsent = (name) => CHROME_CONNECTOR_READ_TOOL_NAMES.includes(resolveChromeConnectorToolName(name)) ? "auto" : "ask";
62
+ function baseSchema(name, description, properties, required = []) {
63
+ return {
64
+ name,
65
+ description,
66
+ parameters: {
67
+ type: "object",
68
+ properties: { ...properties, target: CONNECTOR_TARGET_PROPERTY },
69
+ required
70
+ }
71
+ };
72
+ }
73
+ var tabId = {
74
+ type: "string",
75
+ description: "Browser tab id returned by browser_list_tabs or browser_open_tab."
76
+ };
77
+ var elementRef = {
78
+ type: "string",
79
+ description: "Revision-scoped ref like 1a2b3c4d-e2, copied verbatim from browser_read_page; preferred over selector when available."
80
+ };
81
+ var selector = {
82
+ type: "string",
83
+ description: "CSS selector for the visible page element to operate on; fallback when no elementRef is available."
84
+ };
85
+ var chromeListTabsFunctionSchema = baseSchema(
86
+ "browser_list_tabs",
87
+ "List controllable browser tabs from the user's browser profile through the Nolo Browser Connector.",
88
+ {}
89
+ );
90
+ var chromeOpenTabFunctionSchema = baseSchema(
91
+ "browser_open_tab",
92
+ "Open a URL in the user's browser (Chrome or Firefox) through the Nolo Browser Connector.",
93
+ {
94
+ url: {
95
+ type: "string",
96
+ description: "HTTP or HTTPS URL to open in the browser."
97
+ },
98
+ active: {
99
+ type: "boolean",
100
+ description: "Whether to focus the new browser tab. Defaults to true."
101
+ }
102
+ },
103
+ ["url"]
104
+ );
105
+ var chromeCloseTabFunctionSchema = baseSchema(
106
+ "browser_close_tab",
107
+ "Close a browser tab through the Nolo Browser Connector. Prefer closing the tabs your own run opened with browser_open_tab, and ask the user before closing a tab they are using. Pinned tabs are refused (TAB_PINNED); unknown tab ids fail (TAB_NOT_FOUND).",
108
+ {
109
+ tabId
110
+ },
111
+ ["tabId"]
112
+ );
113
+ var chromeReadPageFunctionSchema = baseSchema(
114
+ "browser_read_page",
115
+ "Read a compact view of a browser tab: visible text (hard cap 6000 chars) plus short-lived elementRefs (hard cap 35) and a pageRevision. Reuse those refs for browser_click_element and browser_type instead of guessing selectors; use region to focus a big page. Does not read cookies or profile databases.",
116
+ {
117
+ tabId,
118
+ region: {
119
+ type: "string",
120
+ description: "Optional CSS selector limiting the read to part of the page."
121
+ },
122
+ maxChars: {
123
+ type: "number",
124
+ description: "Optional text character budget; the connector clamps it to a hard maximum."
125
+ },
126
+ detail: {
127
+ type: "string",
128
+ enum: ["compact", "full"],
129
+ description: "compact (default) returns budgeted text; full raises the budget and adds capped HTML."
130
+ }
131
+ },
132
+ ["tabId"]
133
+ );
134
+ var chromeClickFunctionSchema = baseSchema(
135
+ "browser_click_element",
136
+ "Click a visible element in a browser tab by elementRef from browser_read_page, or by CSS selector. Controls whose name indicates an irreversible external action (payment, send, delete, publish, permission change) are refused with SENSITIVE_ACTION_REQUIRES_CONFIRMATION: this desktop runtime has no approval channel, so name the control and ask the user to activate it themselves.",
137
+ {
138
+ tabId,
139
+ elementRef,
140
+ selector
141
+ },
142
+ ["tabId"]
143
+ );
144
+ var chromeTypeFunctionSchema = baseSchema(
145
+ "browser_type",
146
+ "Type text into a browser page element identified by elementRef from browser_read_page or by CSS selector. Typing into a control whose name indicates an irreversible external action is refused with SENSITIVE_ACTION_REQUIRES_CONFIRMATION, same as clicking it.",
147
+ {
148
+ tabId,
149
+ elementRef,
150
+ selector,
151
+ text: {
152
+ type: "string",
153
+ description: "Text to type into the selected element."
154
+ },
155
+ clearFirst: {
156
+ type: "boolean",
157
+ description: "Whether to clear the field before typing. Defaults to true."
158
+ }
159
+ },
160
+ ["tabId", "text"]
161
+ );
162
+ var chromePressFunctionSchema = baseSchema(
163
+ "browser_press",
164
+ "Send a keyboard key or shortcut to a browser tab. Enter-like keys are refused with SENSITIVE_ACTION_REQUIRES_CONFIRMATION when the focused control is an irreversible action.",
165
+ {
166
+ tabId,
167
+ key: {
168
+ type: "string",
169
+ description: "Key or shortcut, for example Enter, Escape, ArrowDown, or Meta+L."
170
+ }
171
+ },
172
+ ["tabId", "key"]
173
+ );
174
+ var chromeScrollFunctionSchema = baseSchema(
175
+ "browser_scroll",
176
+ "Scroll a browser tab by pixel deltas.",
177
+ {
178
+ tabId,
179
+ deltaX: {
180
+ type: "number",
181
+ description: "Horizontal scroll delta in pixels."
182
+ },
183
+ deltaY: {
184
+ type: "number",
185
+ description: "Vertical scroll delta in pixels."
186
+ }
187
+ },
188
+ ["tabId"]
189
+ );
190
+ var chromeScreenshotFunctionSchema = baseSchema(
191
+ "browser_screenshot",
192
+ "Capture a screenshot from a browser tab through the Nolo Browser Connector.",
193
+ {
194
+ tabId,
195
+ fullPage: {
196
+ type: "boolean",
197
+ description: "Whether to capture the full page. Defaults to false."
198
+ }
199
+ },
200
+ ["tabId"]
201
+ );
202
+ var chromeReadConsoleFunctionSchema = baseSchema(
203
+ "browser_read_console",
204
+ "Read recent console messages from a browser tab using debugger-backed connector state.",
205
+ {
206
+ tabId,
207
+ limit: {
208
+ type: "number",
209
+ description: "Maximum number of recent console messages to return."
210
+ }
211
+ },
212
+ ["tabId"]
213
+ );
214
+ var chromeReadNetworkFunctionSchema = baseSchema(
215
+ "browser_read_network",
216
+ "Read a deduplicated recent network summary from a browser tab using debugger-backed connector state. Static assets are filtered unless includeAssets is set.",
217
+ {
218
+ tabId,
219
+ limit: {
220
+ type: "number",
221
+ description: "Maximum number of recent network entries to return."
222
+ },
223
+ includeAssets: {
224
+ type: "boolean",
225
+ description: "Include images, CSS, fonts and other static assets. Defaults to false."
226
+ }
227
+ },
228
+ ["tabId"]
229
+ );
230
+ var chromeConnectorToolSchemas = [
231
+ chromeListTabsFunctionSchema,
232
+ chromeOpenTabFunctionSchema,
233
+ chromeCloseTabFunctionSchema,
234
+ chromeReadPageFunctionSchema,
235
+ chromeClickFunctionSchema,
236
+ chromeTypeFunctionSchema,
237
+ chromePressFunctionSchema,
238
+ chromeScrollFunctionSchema,
239
+ chromeScreenshotFunctionSchema,
240
+ chromeReadConsoleFunctionSchema,
241
+ chromeReadNetworkFunctionSchema
242
+ ];
243
+ async function chromeConnectorUnavailableFunc() {
244
+ throw new Error("Browser connector tools are only executable in the Nolo desktop local runtime.");
245
+ }
246
+
247
+ export {
248
+ CHROME_CONNECTOR_LEGACY_TOOL_ALIASES,
249
+ CHROME_CONNECTOR_ACCEPTED_TOOL_NAMES,
250
+ canonicalizeChromeConnectorToolNames,
251
+ getChromeConnectorToolBehavior,
252
+ getChromeConnectorToolDefaultConsent,
253
+ chromeConnectorToolSchemas,
254
+ chromeConnectorUnavailableFunc
255
+ };
@@ -0,0 +1,15 @@
1
+ import {
2
+ compactWhitespace
3
+ } from "./chunk-DWLEOOGR.js";
4
+
5
+ // packages/core/clipCompactText.ts
6
+ function clipCompactText(value, max, ellipsis = "...") {
7
+ const compact = compactWhitespace(value);
8
+ if (compact.length <= max) return compact;
9
+ if (max <= ellipsis.length) return compact.slice(0, max);
10
+ return `${compact.slice(0, max - ellipsis.length)}${ellipsis}`;
11
+ }
12
+
13
+ export {
14
+ clipCompactText
15
+ };
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  buildSkillDocMarkdown
3
- } from "./chunk-Q554LLSI.js";
3
+ } from "./chunk-AUDNYVRC.js";
4
4
 
5
5
  // packages/cli/docPageHelpers.ts
6
6
  import { readFileSync } from "node:fs";
@@ -1,8 +1,9 @@
1
1
  import {
2
- mergeAvailabilityDeadline
3
- } from "./chunk-FDTR4QJ6.js";
2
+ mergeAvailabilityDeadline,
3
+ resolveCredentialKeyWithFallback
4
+ } from "./chunk-H6A6X4EK.js";
4
5
 
5
- // packages/cli/credentialAvailability.ts
6
+ // packages/agent-runtime/credentialAvailability.ts
6
7
  import { homedir } from "node:os";
7
8
  import { join } from "node:path";
8
9
  import { mkdir, readFile, rename, writeFile } from "node:fs/promises";
@@ -13,36 +14,6 @@ function resolveNoloHome(env = process.env) {
13
14
  function resolveCredentialAvailabilityPath(env = process.env) {
14
15
  return join(resolveNoloHome(env), FILE_NAME);
15
16
  }
16
- function resolveCredentialKey(agent) {
17
- if (!agent || typeof agent !== "object") return void 0;
18
- for (const field of ["apiKeyRef", "credentialRef"]) {
19
- const value = agent[field];
20
- if (typeof value === "string") {
21
- const trimmed = value.trim();
22
- if (trimmed) return trimmed;
23
- }
24
- }
25
- return void 0;
26
- }
27
- function resolveCredentialKeyWithFallback(agent) {
28
- const byRef = resolveCredentialKey(agent);
29
- if (byRef) return byRef;
30
- if (!agent || typeof agent !== "object") return void 0;
31
- const endpoint = agent.customProviderUrl;
32
- if (typeof endpoint === "string") {
33
- const trimmed = endpoint.trim();
34
- if (trimmed) {
35
- try {
36
- const origin = new URL(trimmed).origin;
37
- if (origin && origin !== "null") return `custom-endpoint:${origin}`;
38
- } catch {
39
- }
40
- }
41
- }
42
- const key = agent.key;
43
- if (typeof key === "string" && key.trim()) return `custom-agent:${key.trim()}`;
44
- return void 0;
45
- }
46
17
  function parseFile(raw) {
47
18
  const parsed = JSON.parse(raw);
48
19
  if (!parsed || typeof parsed !== "object") return { entries: {} };
@@ -155,7 +126,6 @@ function applyCredentialAvailability(agents, credentialAvailability) {
155
126
  }
156
127
 
157
128
  export {
158
- resolveCredentialKeyWithFallback,
159
129
  readCredentialAvailability,
160
130
  readCredentialEntry,
161
131
  markCredentialUnavailable,
@@ -21,6 +21,8 @@ var createEmptyDialogRuntimeState = () => ({
21
21
  activeControllers: {},
22
22
  pendingRawData: {},
23
23
  loopStopReason: null,
24
+ turnPhase: null,
25
+ turnPhaseTurnId: null,
24
26
  pendingUserInputQueue: []
25
27
  });
26
28
  var activeDialogKey = null;
@@ -67,6 +69,8 @@ function resetDialogRuntimeSessionState(dialogKey) {
67
69
  const runtime = ensureDialogRuntimeState(dialogKey);
68
70
  runtime.tokens = createEmptyTokenStats();
69
71
  runtime.loopStopReason = null;
72
+ runtime.turnPhase = null;
73
+ runtime.turnPhaseTurnId = null;
70
74
  runtime.pendingUserInputQueue = [];
71
75
  notify();
72
76
  }
@@ -114,6 +118,26 @@ function setLoopStopReason(payload) {
114
118
  notify();
115
119
  return action("dialogRuntime/setLoopStopReason", payload);
116
120
  }
121
+ function claimDialogTurnPhase(payload) {
122
+ const runtime = ensureDialogRuntimeState(payload.dialogKey);
123
+ runtime.turnPhaseTurnId = payload.turnId;
124
+ runtime.turnPhase = null;
125
+ notify();
126
+ return action("dialogRuntime/claimDialogTurnPhase", payload);
127
+ }
128
+ function setDialogTurnPhase(payload) {
129
+ const runtime = ensureDialogRuntimeState(payload.dialogKey);
130
+ if (typeof payload.turnId === "string" && runtime.turnPhaseTurnId !== null && runtime.turnPhaseTurnId !== payload.turnId) {
131
+ return action("dialogRuntime/setDialogTurnPhase:rejected", payload);
132
+ }
133
+ runtime.turnPhase = payload.phase;
134
+ runtime.turnPhaseTurnId = payload.phase === null ? null : payload.turnId ?? null;
135
+ notify();
136
+ return action("dialogRuntime/setDialogTurnPhase", payload);
137
+ }
138
+ function clearDialogTurnPhase(payload = {}) {
139
+ return setDialogTurnPhase({ phase: null, dialogKey: payload.dialogKey, turnId: payload.turnId });
140
+ }
117
141
  function clearDialogRuntimeState(payload) {
118
142
  delete runtimeByKey[payload.dialogKey];
119
143
  notify();
@@ -258,6 +282,9 @@ function getPendingUserInputQueue(dialogKey) {
258
282
  function getLoopStopReason(dialogKey) {
259
283
  return getDialogRuntimeState(dialogKey).loopStopReason;
260
284
  }
285
+ function getDialogTurnPhase(dialogKey) {
286
+ return getDialogRuntimeState(dialogKey).turnPhase;
287
+ }
261
288
  var selectDialogRuntimeByKey = (_state, dialogKey) => getDialogRuntimeState(dialogKey);
262
289
  var selectPendingFiles = (_state, dialogKey) => getPendingFiles(dialogKey);
263
290
  var selectActiveControllers = (_state, dialogKey) => getActiveControllers(dialogKey);
@@ -293,6 +320,10 @@ function useLoopStopReason(dialogKey) {
293
320
  (0, import_react.useSyncExternalStore)(subscribe, getSnapshot, getSnapshot);
294
321
  return getLoopStopReason(dialogKey);
295
322
  }
323
+ function useDialogTurnPhase(dialogKey) {
324
+ (0, import_react.useSyncExternalStore)(subscribe, getSnapshot, getSnapshot);
325
+ return getDialogTurnPhase(dialogKey);
326
+ }
296
327
  function useDialogRuntimeTokens(dialogKey) {
297
328
  (0, import_react.useSyncExternalStore)(subscribe, getSnapshot, getSnapshot);
298
329
  return getDialogRuntimeTokens(dialogKey);
@@ -316,6 +347,9 @@ export {
316
347
  removePendingFile,
317
348
  clearPendingAttachments,
318
349
  setLoopStopReason,
350
+ claimDialogTurnPhase,
351
+ setDialogTurnPhase,
352
+ clearDialogTurnPhase,
319
353
  clearDialogRuntimeState,
320
354
  addActiveController,
321
355
  removeActiveController,
@@ -346,6 +380,7 @@ export {
346
380
  useActiveControllers,
347
381
  usePendingUserInputQueue,
348
382
  useLoopStopReason,
383
+ useDialogTurnPhase,
349
384
  useDialogRuntimeTokens,
350
385
  useCurrentDialogKey,
351
386
  useDialogConfigError
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  dialogMessageKey
3
- } from "./chunk-VMFTFOWF.js";
3
+ } from "./chunk-3AH7LNUB.js";
4
4
  import {
5
5
  asOptionalFiniteNumber
6
6
  } from "./chunk-WWC7I6TA.js";
@@ -1,18 +1,15 @@
1
1
  import {
2
2
  estimateTokenCount
3
3
  } from "./chunk-PSCNXBYA.js";
4
- import {
5
- compactWhitespace
6
- } from "./chunk-DWLEOOGR.js";
7
4
  import {
8
5
  addContentAction
9
- } from "./chunk-V4MJDUSR.js";
6
+ } from "./chunk-RSEEDUMS.js";
10
7
  import {
11
8
  upload
12
- } from "./chunk-H62HCIUP.js";
9
+ } from "./chunk-HYZIYH2H.js";
13
10
  import {
14
11
  getRuntimeServerContext
15
- } from "./chunk-UKWGR5SS.js";
12
+ } from "./chunk-WIWM4FE3.js";
16
13
  import {
17
14
  API_ENDPOINTS
18
15
  } from "./chunk-LCBAMY2M.js";
@@ -367,6 +364,7 @@ var truncateToolOutputForContext = (text, contextWindow) => {
367
364
  // packages/ai/context/planCompression.ts
368
365
  var MIN_COMPRESS_COUNT = 5;
369
366
  var ACTIVE_SUMMARY_TAIL_KEEP_COUNT = 2;
367
+ var COMPACTION_RETENTION_CUSHION_RATIO = 0.18;
370
368
  var MIN_TRIGGER_PENDING_COUNT = MIN_COMPRESS_COUNT + ACTIVE_SUMMARY_TAIL_KEEP_COUNT;
371
369
  var getMessageTokenCount = (msg) => {
372
370
  const content = serializeMessageContent(msg.content) || "";
@@ -409,13 +407,14 @@ var normalizeContextUsageRatio = (value) => {
409
407
  const ratio = value > 1 ? value / 100 : value;
410
408
  return ratio >= 0 && ratio <= 1 ? ratio : void 0;
411
409
  };
412
- var emptyPlan = (startIndex) => ({
410
+ var emptyPlan = (startIndex, diagnostics) => ({
413
411
  shouldCompress: false,
414
412
  compressCount: 0,
415
413
  msgsToCompress: [],
416
414
  msgsToKeep: [],
417
415
  newSummarizedBeforeId: void 0,
418
- startIndex
416
+ startIndex,
417
+ ...diagnostics ? { diagnostics } : {}
419
418
  });
420
419
  function findPendingMessages(allMsgs, summarizedBeforeId) {
421
420
  let startIndex = 0;
@@ -464,15 +463,42 @@ function calculateCompressCount(pendingMsgs, rawMessageBudget, opts) {
464
463
  }
465
464
  return pendingMsgs.length - keepCount;
466
465
  }
466
+ function resolveEffectiveCompactionBudgets(args) {
467
+ const {
468
+ contextWindow,
469
+ triggerRatio,
470
+ historyBudget,
471
+ rawMessageBudget,
472
+ summaryTokens,
473
+ cushionRatio = COMPACTION_RETENTION_CUSHION_RATIO
474
+ } = args;
475
+ const maxRetainedRatio = Math.max(
476
+ 0.2,
477
+ Number((triggerRatio - cushionRatio).toFixed(4))
478
+ );
479
+ const maxRetainedHistoryBudget = Math.floor(contextWindow * maxRetainedRatio);
480
+ const effectiveHistoryBudget = Math.min(historyBudget, maxRetainedHistoryBudget);
481
+ const effectiveRawMessageBudget = Math.min(
482
+ rawMessageBudget,
483
+ Math.max(0, effectiveHistoryBudget - summaryTokens)
484
+ );
485
+ return {
486
+ effectiveHistoryBudget,
487
+ effectiveRawMessageBudget,
488
+ maxRetainedRatio
489
+ };
490
+ }
467
491
  function guardToolChainBoundary(pendingMsgs, compressCount) {
468
492
  let count = compressCount;
469
- while (count > 0 && count < pendingMsgs.length && pendingMsgs[count].role === "tool") {
470
- count--;
493
+ while (count < pendingMsgs.length && pendingMsgs[count].role === "tool") {
494
+ count++;
471
495
  }
472
- if (count > 0) {
473
- const lastCompressed = pendingMsgs[count - 1];
474
- if (hasOpenEndedToolCall(lastCompressed)) {
496
+ while (count > 0 && hasOpenEndedToolCall(pendingMsgs[count - 1])) {
497
+ if (count < pendingMsgs.length && pendingMsgs[count].role === "tool") {
498
+ count++;
499
+ } else {
475
500
  count--;
501
+ break;
476
502
  }
477
503
  }
478
504
  return count;
@@ -489,7 +515,20 @@ function planCompression(input) {
489
515
  coldResume
490
516
  } = input;
491
517
  const { pendingMsgs, startIndex } = findPendingMessages(allMsgs, summarizedBeforeId);
492
- if (pendingMsgs.length === 0) return emptyPlan(startIndex);
518
+ if (pendingMsgs.length === 0) {
519
+ return emptyPlan(startIndex, {
520
+ pendingMsgCount: 0,
521
+ totalUsed: estimateTokenCount(summary || ""),
522
+ historyBudget: 0,
523
+ triggerRatio: resolveCompressionTriggerRatio(contextWindow),
524
+ realUsageRatio: normalizeContextUsageRatio(realContextUsagePercent),
525
+ triggeredByRealUsage: false,
526
+ triggeredByEstimate: false,
527
+ triggeredByColdResume: false,
528
+ shouldRunActiveSummary: false,
529
+ emptyReason: "no-pending"
530
+ });
531
+ }
493
532
  const summaryTokens = estimateTokenCount(summary || "");
494
533
  const pendingTokens = pendingMsgs.reduce((sum, msg) => sum + getMessageTokenCount(msg), 0);
495
534
  const totalUsed = summaryTokens + pendingTokens;
@@ -517,14 +556,47 @@ function planCompression(input) {
517
556
  coldResume,
518
557
  lastMsg: pendingMsgs[pendingMsgs.length - 1]
519
558
  });
520
- if (!trigger) return emptyPlan(startIndex);
521
- let compressCount = calculateCompressCount(pendingMsgs, rawMessageBudget, {
522
- keepTailCount: shouldRunActiveSummary || triggeredByRealUsage || triggeredByColdResume,
559
+ const diagnostics = {
560
+ pendingMsgCount: pendingMsgs.length,
523
561
  totalUsed,
524
- historyBudget
562
+ historyBudget,
563
+ triggerRatio,
564
+ realUsageRatio: normalizeContextUsageRatio(realContextUsagePercent),
565
+ triggeredByRealUsage,
566
+ triggeredByEstimate: normalizeContextUsageRatio(realContextUsagePercent) === void 0 && totalUsed >= historyBudget,
567
+ triggeredByColdResume,
568
+ shouldRunActiveSummary
569
+ };
570
+ if (!trigger) {
571
+ return emptyPlan(startIndex, {
572
+ ...diagnostics,
573
+ emptyReason: "not-triggered"
574
+ });
575
+ }
576
+ const { effectiveHistoryBudget, effectiveRawMessageBudget } = resolveEffectiveCompactionBudgets({
577
+ contextWindow,
578
+ triggerRatio,
579
+ historyBudget,
580
+ rawMessageBudget,
581
+ summaryTokens
525
582
  });
583
+ let compressCount = calculateCompressCount(
584
+ pendingMsgs,
585
+ effectiveRawMessageBudget,
586
+ {
587
+ keepTailCount: shouldRunActiveSummary || triggeredByRealUsage || triggeredByColdResume,
588
+ totalUsed,
589
+ historyBudget: effectiveHistoryBudget
590
+ }
591
+ );
526
592
  compressCount = guardToolChainBoundary(pendingMsgs, compressCount);
527
- if (compressCount < MIN_COMPRESS_COUNT) return emptyPlan(startIndex);
593
+ if (compressCount < MIN_COMPRESS_COUNT) {
594
+ return emptyPlan(startIndex, {
595
+ ...diagnostics,
596
+ compressCount,
597
+ emptyReason: "below-min-compress-count"
598
+ });
599
+ }
528
600
  const msgsToCompress = pendingMsgs.slice(0, compressCount);
529
601
  const msgsToKeep = pendingMsgs.slice(compressCount);
530
602
  const newSummarizedBeforeId = msgsToCompress[msgsToCompress.length - 1].id;
@@ -534,12 +606,13 @@ function planCompression(input) {
534
606
  msgsToCompress,
535
607
  msgsToKeep,
536
608
  newSummarizedBeforeId,
537
- startIndex
609
+ startIndex,
610
+ diagnostics: { ...diagnostics, compressCount }
538
611
  };
539
612
  }
540
613
 
541
614
  // packages/ai/context/compactionShared.ts
542
- var COMPACTION_SUMMARY_SCHEMA_VERSION = 1;
615
+ var COMPACTION_SUMMARY_SCHEMA_VERSION = 2;
543
616
  var COMPACTION_SUMMARY_SYSTEM_PROMPT = `\u4F60\u662F\u5BF9\u8BDD\u4E0A\u4E0B\u6587\u538B\u7F29\u5668\u3002\u6839\u636E\u3010\u73B0\u6709\u8BB0\u5FC6\u3011\u548C\u3010\u65B0\u589E\u5BF9\u8BDD\u3011\uFF0C\u8F93\u51FA\u53EF\u66FF\u4EE3\u539F\u59CB\u6D88\u606F\u7684\u4E8B\u5B9E\u6027\u8981\u70B9\uFF0C\u4F9B\u540E\u7EED\u5BF9\u8BDD\u76F4\u63A5\u4F7F\u7528\u3002
544
617
 
545
618
  \u4E25\u683C\u53EA\u8F93\u51FA\u4E0B\u9762\u4E09\u90E8\u5206\uFF0C\u6807\u9898\u5FC5\u987B\u5B8C\u5168\u4E00\u81F4\uFF1A
@@ -552,10 +625,16 @@ var COMPACTION_SUMMARY_SYSTEM_PROMPT = `\u4F60\u662F\u5BF9\u8BDD\u4E0A\u4E0B\u65
552
625
 
553
626
  \u8981\u6C42\uFF1A
554
627
  1) \u4F7F\u7528\u5BF9\u8BDD\u4E3B\u8BED\u8A00\uFF1B\u6DF7\u5408\u8BED\u8A00\u65F6\u4F18\u5148\u7528\u6237\u4E3B\u8981\u8BED\u8A00\uFF1B\u4E13\u6709\u540D\u8BCD\u3001\u6587\u4EF6\u8DEF\u5F84\u3001\u6807\u8BC6\u7B26\u3001\u547D\u4EE4\u4FDD\u7559\u539F\u6587\uFF0C\u4E0D\u8981\u7FFB\u8BD1\u6216\u8F6C\u8FF0\u3002
555
- 2) \u5173\u952E\u4E8B\u5B9E\u6863\u6848\u53EA\u4FDD\u7559\u4E4B\u540E\u7EE7\u7EED\u5BF9\u8BDD\u4ECD\u6709\u4EF7\u503C\u7684\u4FE1\u606F\uFF1A\u7528\u6237\u76EE\u6807/\u504F\u597D\u3001\u7EA6\u675F\u3001\u6280\u672F\u6808\u3001\u786E\u5B9A\u7684\u6587\u4EF6\u8DEF\u5F84\u3001\u6838\u5FC3\u51B3\u7B56\u3001\u672A\u5B8C\u6210\u5F85\u529E\u3002\u4FDD\u7559\u786E\u5207\u503C\uFF08\u7AEF\u53E3\u53F7\u3001\u7248\u672C\u53F7\u3001\u8DEF\u5F84\u3001\u53D8\u91CF\u540D\u3001\u9519\u8BEF\u4FE1\u606F\u539F\u6587\uFF09\uFF0C\u4E0D\u8981\u6982\u62EC\u6210"\u67D0\u4E2A\u7AEF\u53E3"\u6216"\u67D0\u4E2A\u6587\u4EF6"\u6216"\u67D0\u62A5\u9519"\u3002
628
+ 2) \u5173\u952E\u4E8B\u5B9E\u6863\u6848\u7684**\u524D\u4E24\u9879\u56FA\u5B9A\u662F**\uFF1A
629
+ - \u300C\u539F\u59CB\u76EE\u6807\u300D\uFF1A\u7528\u6237\u6700\u521D\u4E3A\u4EC0\u4E48\u5F00\u8FD9\u6BB5\u5BF9\u8BDD\uFF08\u5C3D\u91CF\u4FDD\u7559\u4ED6\u7684\u539F\u8BDD\u4E0E\u7528\u8BCD\uFF0C\u4E0D\u8981\u6539\u5199\u6210\u4EFB\u52A1\u6E05\u5355\uFF09\u3002
630
+ \u589E\u91CF\u66F4\u65B0\u65F6\u6CBF\u7528\u3010\u73B0\u6709\u8BB0\u5FC6\u3011\u91CC\u5DF2\u6709\u7684\u300C\u539F\u59CB\u76EE\u6807\u300D\uFF0C\u4E0D\u8981\u88AB\u65B0\u589E\u5BF9\u8BDD\u6539\u5199\u2014\u2014\u5B83\u662F\u7A33\u5B9A\u5B57\u6BB5\uFF1B
631
+ \u4EC5\u5F53\u65B0\u5BF9\u8BDD\u660E\u786E\u8868\u660E\u539F\u6587\u6709\u4E8B\u5B9E\u6027\u9519\u8BEF\u65F6\u624D\u4FEE\u6B63\uFF0C\u5E76\u5728\u300C\u76EE\u6807\u6F14\u5316\u300D\u91CC\u6CE8\u660E\u3002
632
+ - \u300C\u76EE\u6807\u6F14\u5316\u300D\uFF1A\u82E5\u4E2D\u9014\u8F6C\u5411\uFF0C\u5199\u6E05\u8F6C\u5411\u4E86\u4EC0\u4E48\u3001\u56E0\u4E3A\u4EC0\u4E48\uFF1B\u6CA1\u6709\u8F6C\u5411\u5C31\u5199\u300C\u65E0\u8F6C\u5411\u300D\u6216\u7701\u7565\u8FD9\u4E00\u9879\uFF0C\u4E0D\u8981\u786C\u51D1\u3002
633
+ \u88AB\u540E\u7EED\u5DE5\u4F5C\u53D6\u4EE3\u7684\u662F"\u65B9\u6848"\uFF0C\u4E0D\u662F"\u7528\u6237\u7684\u521D\u59CB\u610F\u56FE"\u2014\u2014\u521D\u59CB\u610F\u56FE\u4E0D\u5F97\u7701\u7565\u3002
634
+ \u5176\u540E\u624D\u662F\uFF1A\u7528\u6237\u504F\u597D\u3001\u7EA6\u675F\u3001\u6280\u672F\u6808\u3001\u786E\u5B9A\u7684\u6587\u4EF6\u8DEF\u5F84\u3001\u6838\u5FC3\u51B3\u7B56\u3001\u672A\u5B8C\u6210\u5F85\u529E\u3002\u4FDD\u7559\u786E\u5207\u503C\uFF08\u7AEF\u53E3\u53F7\u3001\u7248\u672C\u53F7\u3001\u8DEF\u5F84\u3001\u53D8\u91CF\u540D\u3001\u9519\u8BEF\u4FE1\u606F\u539F\u6587\uFF09\uFF0C\u4E0D\u8981\u6982\u62EC\u6210"\u67D0\u4E2A\u7AEF\u53E3"\u6216"\u67D0\u4E2A\u6587\u4EF6"\u6216"\u67D0\u62A5\u9519"\u3002
556
635
  3) \u5BF9\u8BDD\u8FDB\u5C55\u4E0E\u5F85\u529E\u4EE5\u7B2C\u4E00\u4EBA\u79F0\u7EED\u4F5C\u7B14\u8BB0\u7684\u53E3\u543B\u5199\uFF08"\u6211\u505A\u4E86\u2026""\u7528\u6237\u8981\u6C42\u2026""\u4E0B\u4E00\u6B65\u6211\u9700\u8981\u2026"\uFF09\uFF0C\u4E0D\u8981\u5199\u6210\u7B2C\u4E09\u65B9\u89C2\u5BDF\u62A5\u544A\u3002\u5148\u6781\u7B80\u6982\u62EC\u65E7\u4E0A\u4E0B\u6587\uFF0C\u518D\u66F4\u8BE6\u7EC6\u8BB0\u5F55\u6700\u8FD1\u8FDB\u5C55\u3001\u7ED3\u8BBA\u3001\u5206\u6B67\u4E0E\u4E0B\u4E00\u6B65\u3002\u5BF9\u4E8E\u58F0\u79F0\u5DF2\u5B8C\u6210\u4F46\u5C1A\u672A\u9A8C\u8BC1\u7684\u5DE5\u4F5C\uFF08\u5982\u5DE5\u5177\u8C03\u7528\u8FD4\u56DE\u6210\u529F\u4F46\u7ED3\u679C\u672A\u4EBA\u5DE5\u786E\u8BA4\uFF09\uFF0C\u660E\u786E\u6807\u6CE8"\uFF08\u5F85\u9A8C\u8BC1\uFF09"\u2014\u2014\u4E0D\u8981\u9ED8\u8BA4\u4FE1\u4EFB\u5DE5\u5177\u8FD4\u56DE\u503C\u3002
557
636
  4) \u6587\u4EF6\u64CD\u4F5C\u6E05\u5355\uFF1A\u5217\u51FA\u672C\u6B21\u538B\u7F29\u8303\u56F4\u5185\u8BFB\u53D6\u3001\u5199\u5165\u3001\u7F16\u8F91\u8FC7\u7684\u6587\u4EF6\u8DEF\u5F84\u53CA\u64CD\u4F5C\u7C7B\u578B\uFF08\u5982: - \u8BFB\u53D6: path/to/file\uFF1B\u82E5\u672A\u6D89\u53CA\u6587\u4EF6\u64CD\u4F5C\u5199"\u65E0"\uFF09\u3002
558
- 5) \u5FFD\u7565\u5BD2\u6684\u3001\u91CD\u590D\u5C1D\u8BD5\u3001\u5DF2\u653E\u5F03\u65B9\u6848\u548C\u65E0\u4EF7\u503C\u5E9F\u8BDD\u3002
637
+ 5) \u5FFD\u7565\u5BD2\u6684\u3001\u91CD\u590D\u5C1D\u8BD5\u548C\u65E0\u4EF7\u503C\u5E9F\u8BDD\uFF1B**\u5DF2\u653E\u5F03\u7684\u65B9\u6848/\u5C1D\u8BD5**\u53EF\u4EE5\u7701\u7565\uFF0C\u4F46\u7528\u6237\u5F53\u521D\u7684\u610F\u56FE\u4E0E\u7406\u7531\u4E0D\u53EF\u7701\u7565\uFF08\u89C1\u7B2C 2 \u6761\uFF09\u3002
559
638
  6) \u4E0D\u8981\u7F16\u9020\u672A\u51FA\u73B0\u7684\u4FE1\u606F\uFF1B\u4E0D\u8981\u5F00\u573A\u767D\u3001\u7ED3\u675F\u8BED\u3001markdown \u4EE3\u7801\u5757\u6216\u989D\u5916\u7AE0\u8282\uFF1B\u4E0D\u8981\u8C03\u7528\u4EFB\u4F55\u5DE5\u5177\u3002`;
560
639
  function formatMessageContentFallback(msg) {
561
640
  const content = serializeMessageContent(msg.content);
@@ -691,14 +770,6 @@ function formatCompactionMetricsLog(metrics) {
691
770
  return `[Compaction] reason=${metrics.reason} compressed=${metrics.compressedCount}->${metrics.retainedCount} msgs, tokens=${totalBefore}->${totalAfter} (ratio=${ratio})${llmInfo}`;
692
771
  }
693
772
 
694
- // packages/core/clipCompactText.ts
695
- function clipCompactText(value, max, ellipsis = "...") {
696
- const compact = compactWhitespace(value);
697
- if (compact.length <= max) return compact;
698
- if (max <= ellipsis.length) return compact.slice(0, max);
699
- return `${compact.slice(0, max - ellipsis.length)}${ellipsis}`;
700
- }
701
-
702
773
  // packages/ai/token/providerCallTiming.ts
703
774
  var defaultNow = () => {
704
775
  const perf = globalThis.performance;
@@ -770,7 +841,14 @@ var isMeaningfulResponsesOutput = (event) => {
770
841
  };
771
842
 
772
843
  export {
773
- clipCompactText,
844
+ normalizeTimingMs,
845
+ createProviderCallTimingTracker,
846
+ observeMeaningfulProviderResponseAt,
847
+ observeMeaningfulProviderResponse,
848
+ finalizeProviderCallTiming,
849
+ withProviderCallTimingFields,
850
+ isMeaningfulChatCompletionOutput,
851
+ isMeaningfulResponsesOutput,
774
852
  planContextUsage,
775
853
  buildDatabaseFileContentUrl,
776
854
  serializeMessageContent,
@@ -784,13 +862,5 @@ export {
784
862
  formatFileOperationsFromMessages,
785
863
  formatMessagesForSummaryWithTruncation,
786
864
  buildCompactionMetricsFromPlan,
787
- formatCompactionMetricsLog,
788
- normalizeTimingMs,
789
- createProviderCallTimingTracker,
790
- observeMeaningfulProviderResponseAt,
791
- observeMeaningfulProviderResponse,
792
- finalizeProviderCallTiming,
793
- withProviderCallTimingFields,
794
- isMeaningfulChatCompletionOutput,
795
- isMeaningfulResponsesOutput
865
+ formatCompactionMetricsLog
796
866
  };