nolo-cli 0.103.0-alpha.2 → 0.104.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 (40) hide show
  1. package/{_executeModel-3UCNJCQA.js → _executeModel-4W7C3ACS.js} +10 -10
  2. package/{agentEmailCommands-WLYF3JRS.js → agentEmailCommands-O2KH4G7U.js} +9 -9
  3. package/{agentListCommands-JP7S7PT2.js → agentListCommands-GUDMBDHZ.js} +2 -61
  4. package/{agentMachineCommands-HNGAR5GI.js → agentMachineCommands-5I5CCUBM.js} +1 -1
  5. package/{agentRecordCommands-SXFPW3DL.js → agentRecordCommands-RSS44XHC.js} +9 -9
  6. package/{agentRunCommand-JIQ4HY4D.js → agentRunCommand-P7VHL4ZR.js} +10 -9
  7. package/{agentSlice-SICQBMCM.js → agentSlice-6LBOYNKN.js} +1 -1
  8. package/{chatQueueReduxAdapter-HHMUDNXL.js → chatQueueReduxAdapter-WFROMKD3.js} +2 -2
  9. package/{chunk-XS5SWEDQ.js → chunk-2J5Y72GY.js} +1 -1
  10. package/{chunk-DNUUJ45N.js → chunk-3ZW5ZJMM.js} +2 -2
  11. package/{chunk-LW4VFPAY.js → chunk-4J4QNKTW.js} +46 -6
  12. package/{chunk-CUQEXCAU.js → chunk-7SOWRCQQ.js} +1 -1
  13. package/{chunk-OZGZPSEG.js → chunk-A6FMKU7M.js} +1 -1
  14. package/{chunk-4EG4QFTK.js → chunk-B6P4QKEN.js} +2 -2
  15. package/chunk-BMQ2MJUK.js +153 -0
  16. package/{chunk-RSONHHPE.js → chunk-DJWMIXDZ.js} +2 -2
  17. package/{chunk-IONPPCL5.js → chunk-EEGDMATE.js} +65 -0
  18. package/{chunk-XVZ22N6C.js → chunk-FQUHIG5X.js} +8 -8
  19. package/{chunk-TQBHNYVR.js → chunk-H66KLASO.js} +8 -8
  20. package/{chunk-F2RNI7ZR.js → chunk-ITBLTYQB.js} +4 -4
  21. package/{chunk-AGVEIAQA.js → chunk-NXUYQBDZ.js} +5 -5
  22. package/{chunk-3WLK2JQ5.js → chunk-U3JZVWIB.js} +3 -3
  23. package/{chunk-B3TVQ6PI.js → chunk-W324THOB.js} +2 -2
  24. package/{chunk-3N3W7KBB.js → chunk-YY7I6GQ3.js} +3 -3
  25. package/{contentThunks-S4S7QPSO.js → contentThunks-LXOZUD2Y.js} +3 -3
  26. package/{createAgentAutomationAction-ODGL2YGP.js → createAgentAutomationAction-M5NDEIC6.js} +3 -3
  27. package/{createDialogAction-GFKRXTK4.js → createDialogAction-TDFOINOY.js} +4 -4
  28. package/{createPageAction-FBV3OWX7.js → createPageAction-WY5ZKP2M.js} +3 -3
  29. package/{dialogSlice-LEO27SQG.js → dialogSlice-HSGREZGA.js} +2 -2
  30. package/{docStore-MNX5MHA5.js → docStore-IIS36NGG.js} +1 -1
  31. package/{handleSendMessageAction-YB6KQFJS.js → handleSendMessageAction-FEHCWMN2.js} +6 -48
  32. package/index.js +16 -16
  33. package/{machineCommands-7GVQCUAK.js → machineCommands-G5J754EH.js} +9 -9
  34. package/{machineWsRunDispatch-XA7TD7Z7.js → machineWsRunDispatch-VXYBYYKM.js} +9 -9
  35. package/package.json +1 -1
  36. package/{readlineWorkspace-WA7JNI6J.js → readlineWorkspace-TGCYJFEB.js} +25 -17
  37. package/{runAgentClientLoop-JGFQ6KIR.js → runAgentClientLoop-UY76PPZM.js} +8 -8
  38. package/{streamAgentChatTurn-XLFZ66UC.js → streamAgentChatTurn-3YVIO4KE.js} +9 -9
  39. package/{tools-NF5AB34X.js → tools-Q6IBBG33.js} +6 -6
  40. package/{updateDialogTitleAction-6MBTD4UE.js → updateDialogTitleAction-GF5T3VMK.js} +3 -3
@@ -1,21 +1,21 @@
1
1
  import {
2
2
  fetchAgentContexts
3
- } from "./chunk-XS5SWEDQ.js";
3
+ } from "./chunk-2J5Y72GY.js";
4
4
  import {
5
5
  filterAndCleanMessages,
6
6
  sendOpenAICompletionsRequest
7
- } from "./chunk-AGVEIAQA.js";
7
+ } from "./chunk-NXUYQBDZ.js";
8
8
  import "./chunk-JEXVIMYZ.js";
9
- import "./chunk-RSONHHPE.js";
9
+ import "./chunk-DJWMIXDZ.js";
10
10
  import {
11
11
  generateRequestBody,
12
12
  mergeReferences,
13
13
  performFetchRequest,
14
14
  sanitizeOutboundBody
15
- } from "./chunk-3WLK2JQ5.js";
15
+ } from "./chunk-U3JZVWIB.js";
16
16
  import "./chunk-EOARMOVD.js";
17
17
  import "./chunk-HS7MLR74.js";
18
- import "./chunk-TQBHNYVR.js";
18
+ import "./chunk-H66KLASO.js";
19
19
  import "./chunk-5UTFL4QJ.js";
20
20
  import "./chunk-NF64D32W.js";
21
21
  import "./chunk-3L2WKC3W.js";
@@ -32,20 +32,20 @@ import "./chunk-FZGV4FGK.js";
32
32
  import "./chunk-MEYIRKDN.js";
33
33
  import "./chunk-63W5N6P3.js";
34
34
  import "./chunk-VF4K2QE6.js";
35
- import "./chunk-B3TVQ6PI.js";
36
- import "./chunk-DNUUJ45N.js";
37
- import "./chunk-OZGZPSEG.js";
35
+ import "./chunk-W324THOB.js";
36
+ import "./chunk-3ZW5ZJMM.js";
37
+ import "./chunk-A6FMKU7M.js";
38
38
  import "./chunk-ZJ7UHBJS.js";
39
39
  import {
40
40
  selectAllMsgs,
41
41
  selectCurrentDialogConfig,
42
42
  updateTokensAction
43
- } from "./chunk-XVZ22N6C.js";
43
+ } from "./chunk-FQUHIG5X.js";
44
44
  import "./chunk-MC4XLIJ7.js";
45
45
  import "./chunk-3BMYXEUW.js";
46
46
  import "./chunk-YYLHWIW6.js";
47
47
  import "./chunk-AGGIDPCZ.js";
48
- import "./chunk-3N3W7KBB.js";
48
+ import "./chunk-YY7I6GQ3.js";
49
49
  import "./chunk-TOP2VXOR.js";
50
50
  import "./chunk-5RGU3J7P.js";
51
51
  import "./chunk-6YTOJY35.js";
@@ -8,8 +8,8 @@ import {
8
8
  } from "./chunk-V7E4PXQD.js";
9
9
  import {
10
10
  runAgentCreateCommand
11
- } from "./chunk-CUQEXCAU.js";
12
- import "./chunk-F2RNI7ZR.js";
11
+ } from "./chunk-7SOWRCQQ.js";
12
+ import "./chunk-ITBLTYQB.js";
13
13
  import "./chunk-53HEEOTT.js";
14
14
  import "./chunk-EADNWBAZ.js";
15
15
  import "./chunk-SH43IESU.js";
@@ -30,9 +30,9 @@ import "./chunk-MP64VFGD.js";
30
30
  import "./chunk-JBTJAPUF.js";
31
31
  import "./chunk-3DII57IT.js";
32
32
  import "./chunk-ATNTHIZI.js";
33
- import "./chunk-RSONHHPE.js";
33
+ import "./chunk-DJWMIXDZ.js";
34
34
  import "./chunk-HS7MLR74.js";
35
- import "./chunk-TQBHNYVR.js";
35
+ import "./chunk-H66KLASO.js";
36
36
  import "./chunk-5UTFL4QJ.js";
37
37
  import "./chunk-NF64D32W.js";
38
38
  import "./chunk-3L2WKC3W.js";
@@ -50,16 +50,16 @@ import "./chunk-FZGV4FGK.js";
50
50
  import "./chunk-MEYIRKDN.js";
51
51
  import "./chunk-63W5N6P3.js";
52
52
  import "./chunk-VF4K2QE6.js";
53
- import "./chunk-B3TVQ6PI.js";
54
- import "./chunk-DNUUJ45N.js";
55
- import "./chunk-OZGZPSEG.js";
53
+ import "./chunk-W324THOB.js";
54
+ import "./chunk-3ZW5ZJMM.js";
55
+ import "./chunk-A6FMKU7M.js";
56
56
  import "./chunk-ZJ7UHBJS.js";
57
- import "./chunk-XVZ22N6C.js";
57
+ import "./chunk-FQUHIG5X.js";
58
58
  import "./chunk-MC4XLIJ7.js";
59
59
  import "./chunk-3BMYXEUW.js";
60
60
  import "./chunk-YYLHWIW6.js";
61
61
  import "./chunk-AGGIDPCZ.js";
62
- import "./chunk-3N3W7KBB.js";
62
+ import "./chunk-YY7I6GQ3.js";
63
63
  import "./chunk-TOP2VXOR.js";
64
64
  import "./chunk-5RGU3J7P.js";
65
65
  import "./chunk-6YTOJY35.js";
@@ -1,5 +1,6 @@
1
1
  import {
2
2
  decorateAgentsWithPublicStatusAcrossServers,
3
+ formatQuotaSummary,
3
4
  listFavoriteAgentIdsAcrossServers,
4
5
  listLocalCachedAgents,
5
6
  listRemoteAgents,
@@ -8,7 +9,7 @@ import {
8
9
  normalizeListedAgent,
9
10
  parseAgentListArgs,
10
11
  toSafeListedAgentSummary
11
- } from "./chunk-IONPPCL5.js";
12
+ } from "./chunk-EEGDMATE.js";
12
13
  import {
13
14
  buildSpaceLookup,
14
15
  getSpaceContentKeys
@@ -108,66 +109,6 @@ import "./chunk-CF7PE763.js";
108
109
  import "./chunk-G3SUCT4W.js";
109
110
  import "./chunk-4VNS5WPM.js";
110
111
 
111
- // packages/ai/agent/quotaSnapshot.ts
112
- function findTightestQuotaWindow(quota, now = Date.now()) {
113
- if (!quota || !Array.isArray(quota.windows) || quota.windows.length === 0) {
114
- return void 0;
115
- }
116
- let best;
117
- let bestScore = -Infinity;
118
- for (const w of quota.windows) {
119
- let score = 0;
120
- if (typeof w.utilization === "number" && w.utilization >= 0) {
121
- score = 500 + Math.min(w.utilization, 1) * 500;
122
- } else if (typeof w.remaining === "number" && typeof w.limit === "number" && w.limit > 0) {
123
- const util = Math.max(0, 1 - w.remaining / w.limit);
124
- score = 500 + util * 500;
125
- } else if (typeof w.resetAt === "number" && w.resetAt > now) {
126
- score = 200;
127
- } else if (typeof w.remaining === "number") {
128
- score = 100;
129
- }
130
- if (score > bestScore) {
131
- bestScore = score;
132
- best = w;
133
- }
134
- }
135
- return best ?? quota.windows[0];
136
- }
137
- function formatQuotaSummary(quota, now = Date.now()) {
138
- const tightest = findTightestQuotaWindow(quota, now);
139
- if (!tightest) return void 0;
140
- const parts = [];
141
- if (typeof tightest.utilization === "number") {
142
- const pct = Math.round(tightest.utilization * 100);
143
- parts.push(`${pct}%\u5DF2\u7528`);
144
- } else if (typeof tightest.remaining === "number") {
145
- if (typeof tightest.limit === "number") {
146
- parts.push(`${tightest.remaining}/${tightest.limit}${tightest.unit ? ` ${tightest.unit}` : ""}`);
147
- } else {
148
- parts.push(`\u4F59${tightest.remaining}${tightest.unit ? ` ${tightest.unit}` : ""}`);
149
- }
150
- }
151
- if (tightest.scope && tightest.scope !== "user" && tightest.scope !== "project" && tightest.scope !== tightest.unit) {
152
- parts.push(tightest.scope);
153
- }
154
- if (typeof tightest.resetAt === "number" && tightest.resetAt > now) {
155
- const diffSec = Math.round((tightest.resetAt - now) / 1e3);
156
- if (diffSec < 60) {
157
- parts.push(`${diffSec}s\u540E\u91CD\u7F6E`);
158
- } else if (diffSec < 3600) {
159
- parts.push(`${Math.round(diffSec / 60)}m\u540E\u91CD\u7F6E`);
160
- } else if (diffSec < 86400) {
161
- const hours = (diffSec / 3600).toFixed(1).replace(/\.0$/, "");
162
- parts.push(`${hours}h\u540E\u91CD\u7F6E`);
163
- } else {
164
- const days = (diffSec / 86400).toFixed(1).replace(/\.0$/, "");
165
- parts.push(`${days}d\u540E\u91CD\u7F6E`);
166
- }
167
- }
168
- return parts.length > 0 ? parts.join(" \xB7 ") : void 0;
169
- }
170
-
171
112
  // packages/cli/agentListCommands.ts
172
113
  async function runAgentListCommand(args, deps = {}) {
173
114
  const env = deps.env ?? process.env;
@@ -91,7 +91,7 @@ async function defaultExecuteCli(provider, prompt, options) {
91
91
  return executeCli(provider, prompt, options);
92
92
  }
93
93
  async function forwardConnectorRunMessage(machine, message, pushMessage, executeCli, env, fetchImpl) {
94
- const { handleConnectorRunMessage } = await import("./machineWsRunDispatch-XA7TD7Z7.js");
94
+ const { handleConnectorRunMessage } = await import("./machineWsRunDispatch-VXYBYYKM.js");
95
95
  return handleConnectorRunMessage(message, pushMessage, executeCli, env, fetchImpl);
96
96
  }
97
97
  async function detectLaunchableMachineInfo() {
@@ -2,8 +2,8 @@ import {
2
2
  runAgentCreateCommand,
3
3
  runAgentReadCommand,
4
4
  runAgentUpdateCommand
5
- } from "./chunk-CUQEXCAU.js";
6
- import "./chunk-F2RNI7ZR.js";
5
+ } from "./chunk-7SOWRCQQ.js";
6
+ import "./chunk-ITBLTYQB.js";
7
7
  import "./chunk-53HEEOTT.js";
8
8
  import "./chunk-EADNWBAZ.js";
9
9
  import "./chunk-SH43IESU.js";
@@ -17,9 +17,9 @@ import "./chunk-MP64VFGD.js";
17
17
  import "./chunk-JBTJAPUF.js";
18
18
  import "./chunk-3DII57IT.js";
19
19
  import "./chunk-ATNTHIZI.js";
20
- import "./chunk-RSONHHPE.js";
20
+ import "./chunk-DJWMIXDZ.js";
21
21
  import "./chunk-HS7MLR74.js";
22
- import "./chunk-TQBHNYVR.js";
22
+ import "./chunk-H66KLASO.js";
23
23
  import "./chunk-5UTFL4QJ.js";
24
24
  import "./chunk-NF64D32W.js";
25
25
  import "./chunk-3L2WKC3W.js";
@@ -37,16 +37,16 @@ import "./chunk-FZGV4FGK.js";
37
37
  import "./chunk-MEYIRKDN.js";
38
38
  import "./chunk-63W5N6P3.js";
39
39
  import "./chunk-VF4K2QE6.js";
40
- import "./chunk-B3TVQ6PI.js";
41
- import "./chunk-DNUUJ45N.js";
42
- import "./chunk-OZGZPSEG.js";
40
+ import "./chunk-W324THOB.js";
41
+ import "./chunk-3ZW5ZJMM.js";
42
+ import "./chunk-A6FMKU7M.js";
43
43
  import "./chunk-ZJ7UHBJS.js";
44
- import "./chunk-XVZ22N6C.js";
44
+ import "./chunk-FQUHIG5X.js";
45
45
  import "./chunk-MC4XLIJ7.js";
46
46
  import "./chunk-3BMYXEUW.js";
47
47
  import "./chunk-YYLHWIW6.js";
48
48
  import "./chunk-AGGIDPCZ.js";
49
- import "./chunk-3N3W7KBB.js";
49
+ import "./chunk-YY7I6GQ3.js";
50
50
  import "./chunk-TOP2VXOR.js";
51
51
  import "./chunk-5RGU3J7P.js";
52
52
  import "./chunk-6YTOJY35.js";
@@ -8,12 +8,12 @@ import {
8
8
  resolveRunSettlementNote,
9
9
  resolveWorkflowReference,
10
10
  runAgentRunCommand
11
- } from "./chunk-LW4VFPAY.js";
11
+ } from "./chunk-4J4QNKTW.js";
12
12
  import "./chunk-S7Z2HMCN.js";
13
13
  import {
14
14
  parseAgentRunArgs
15
15
  } from "./chunk-V7E4PXQD.js";
16
- import "./chunk-F2RNI7ZR.js";
16
+ import "./chunk-ITBLTYQB.js";
17
17
  import "./chunk-53HEEOTT.js";
18
18
  import "./chunk-EADNWBAZ.js";
19
19
  import "./chunk-SH43IESU.js";
@@ -30,9 +30,9 @@ import "./chunk-LTRXGFMS.js";
30
30
  import "./chunk-3DII57IT.js";
31
31
  import "./chunk-ATNTHIZI.js";
32
32
  import "./chunk-JEXVIMYZ.js";
33
- import "./chunk-RSONHHPE.js";
33
+ import "./chunk-DJWMIXDZ.js";
34
34
  import "./chunk-HS7MLR74.js";
35
- import "./chunk-TQBHNYVR.js";
35
+ import "./chunk-H66KLASO.js";
36
36
  import "./chunk-5UTFL4QJ.js";
37
37
  import "./chunk-NF64D32W.js";
38
38
  import "./chunk-3L2WKC3W.js";
@@ -45,21 +45,22 @@ import "./chunk-EYAQT56M.js";
45
45
  import "./chunk-VIDPVFP3.js";
46
46
  import "./chunk-VLTIYV3X.js";
47
47
  import "./chunk-UKZDAFYT.js";
48
+ import "./chunk-BMQ2MJUK.js";
48
49
  import "./chunk-N4G4PKQ6.js";
49
50
  import "./chunk-FZGV4FGK.js";
50
51
  import "./chunk-MEYIRKDN.js";
51
52
  import "./chunk-63W5N6P3.js";
52
53
  import "./chunk-VF4K2QE6.js";
53
- import "./chunk-B3TVQ6PI.js";
54
- import "./chunk-DNUUJ45N.js";
55
- import "./chunk-OZGZPSEG.js";
54
+ import "./chunk-W324THOB.js";
55
+ import "./chunk-3ZW5ZJMM.js";
56
+ import "./chunk-A6FMKU7M.js";
56
57
  import "./chunk-ZJ7UHBJS.js";
57
- import "./chunk-XVZ22N6C.js";
58
+ import "./chunk-FQUHIG5X.js";
58
59
  import "./chunk-MC4XLIJ7.js";
59
60
  import "./chunk-3BMYXEUW.js";
60
61
  import "./chunk-YYLHWIW6.js";
61
62
  import "./chunk-AGGIDPCZ.js";
62
- import "./chunk-3N3W7KBB.js";
63
+ import "./chunk-YY7I6GQ3.js";
63
64
  import "./chunk-TOP2VXOR.js";
64
65
  import "./chunk-5RGU3J7P.js";
65
66
  import "./chunk-6YTOJY35.js";
@@ -7,7 +7,7 @@ import {
7
7
  slice,
8
8
  streamAgentChatTurn,
9
9
  updateAgent
10
- } from "./chunk-3N3W7KBB.js";
10
+ } from "./chunk-YY7I6GQ3.js";
11
11
  import "./chunk-HVURBGF3.js";
12
12
  import "./chunk-ONXOABJR.js";
13
13
  import "./chunk-KX6YBIHG.js";
@@ -4,12 +4,12 @@ import {
4
4
  } from "./chunk-YPREESF4.js";
5
5
  import {
6
6
  handleSendMessage
7
- } from "./chunk-XVZ22N6C.js";
7
+ } from "./chunk-FQUHIG5X.js";
8
8
  import "./chunk-MC4XLIJ7.js";
9
9
  import "./chunk-3BMYXEUW.js";
10
10
  import "./chunk-YYLHWIW6.js";
11
11
  import "./chunk-AGGIDPCZ.js";
12
- import "./chunk-3N3W7KBB.js";
12
+ import "./chunk-YY7I6GQ3.js";
13
13
  import "./chunk-TOP2VXOR.js";
14
14
  import "./chunk-5RGU3J7P.js";
15
15
  import {
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  fetchReferenceContents,
3
3
  resolveReferenceAssets
4
- } from "./chunk-3WLK2JQ5.js";
4
+ } from "./chunk-U3JZVWIB.js";
5
5
 
6
6
  // packages/ai/agent/fetchAgentContexts.ts
7
7
  async function fetchAgentContexts(references, dispatch) {
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  addContentToSpace
3
- } from "./chunk-OZGZPSEG.js";
3
+ } from "./chunk-A6FMKU7M.js";
4
4
  import {
5
5
  prepareAndPersistMessage,
6
6
  uiAskChoiceFunc,
7
7
  uiAskChoiceFunctionSchema
8
- } from "./chunk-XVZ22N6C.js";
8
+ } from "./chunk-FQUHIG5X.js";
9
9
  import {
10
10
  require_date_fns
11
11
  } from "./chunk-M76ECQRD.js";
@@ -27,7 +27,7 @@ import {
27
27
  resolveLocalUserId,
28
28
  t,
29
29
  toolLabel
30
- } from "./chunk-F2RNI7ZR.js";
30
+ } from "./chunk-ITBLTYQB.js";
31
31
  import {
32
32
  createRunActivityTracker,
33
33
  popSingleQueueMessage,
@@ -64,7 +64,7 @@ import {
64
64
  } from "./chunk-LTRXGFMS.js";
65
65
  import {
66
66
  formatAgentListCard
67
- } from "./chunk-TQBHNYVR.js";
67
+ } from "./chunk-H66KLASO.js";
68
68
  import {
69
69
  isTransientFetchError
70
70
  } from "./chunk-5UTFL4QJ.js";
@@ -80,16 +80,19 @@ import {
80
80
  formatStopRunCard,
81
81
  isAgentRunTerminalStatus
82
82
  } from "./chunk-3VNWWVKB.js";
83
+ import {
84
+ extractGoogleValidationLink
85
+ } from "./chunk-BMQ2MJUK.js";
83
86
  import {
84
87
  buildMemorySubjectsForAgent,
85
88
  chooseMemoryOwners,
86
89
  loadMemoryCandidatesFromDb,
87
90
  resolveAgentMemoryPolicy
88
- } from "./chunk-DNUUJ45N.js";
91
+ } from "./chunk-3ZW5ZJMM.js";
89
92
  import {
90
93
  API_REPORTED_COST_MULTIPLIER,
91
94
  parseUiAskChoiceContent
92
- } from "./chunk-XVZ22N6C.js";
95
+ } from "./chunk-FQUHIG5X.js";
93
96
  import {
94
97
  isOAuthApiKeyRef
95
98
  } from "./chunk-YYLHWIW6.js";
@@ -386,6 +389,24 @@ function styleCliText(text, style, enabled = resolveCliColorEnabled()) {
386
389
  function dimCliText(text, enabled = resolveCliColorEnabled()) {
387
390
  return styleCliText(text, "dim", enabled);
388
391
  }
392
+ var OSC8_OPEN = "\x1B]8;;";
393
+ var OSC8_CLOSE = "\x1B\\";
394
+ function sanitizeHyperlinkLabel(label) {
395
+ return label.replace(/[\u0000-\u001f\u007f]/g, "");
396
+ }
397
+ function resolveCliHyperlinkEnabled(env = process.env, isTTY = Boolean(process.stdout.isTTY)) {
398
+ const setting = asTrimmedLowercaseString(env.NOLO_CLI_HYPERLINKS);
399
+ if (setting === "0" || setting === "false" || setting === "off") return false;
400
+ if (setting === "1" || setting === "true" || setting === "on") return true;
401
+ return isTTY;
402
+ }
403
+ function formatCliHyperlink(url, label, enabled = resolveCliHyperlinkEnabled()) {
404
+ if (!url) return label;
405
+ const safeLabel = sanitizeHyperlinkLabel(label);
406
+ if (!enabled) return `${safeLabel} (${url})`;
407
+ if (!safeLabel) return url;
408
+ return `${OSC8_OPEN}${url}${OSC8_CLOSE}${safeLabel}${OSC8_OPEN}${OSC8_CLOSE}`;
409
+ }
389
410
 
390
411
  // node_modules/ansi-regex/index.js
391
412
  function ansiRegex({ onlyFirst = false } = {}) {
@@ -620,8 +641,12 @@ function stringWidth(input, options = {}) {
620
641
 
621
642
  // packages/cli/tui/tuiAnsi.ts
622
643
  var ANSI_ESCAPE_REGEX = /\x1b\[[\x30-\x3f]*[\x20-\x2f]*[\x40-\x7e]/g;
644
+ var OSC8_HYPERLINK_REGEX = /\x1b\]8;;[^\x1b]*\x1b\\/g;
623
645
  var ALL_ANSI_ESCAPE_REGEX = ansiRegex();
624
646
  var FIRST_ANSI_ESCAPE_REGEX = ansiRegex({ onlyFirst: true });
647
+ function stripOsc8Hyperlinks(text) {
648
+ return text.replace(OSC8_HYPERLINK_REGEX, "");
649
+ }
625
650
  function stripAnsi2(text) {
626
651
  return text.replace(ANSI_ESCAPE_REGEX, "").replace(ALL_ANSI_ESCAPE_REGEX, "");
627
652
  }
@@ -783,6 +808,7 @@ function visibleWidth(str) {
783
808
  }
784
809
  function truncateAnsi(text, maxWidth) {
785
810
  if (maxWidth <= 0) return "";
811
+ text = stripOsc8Hyperlinks(text);
786
812
  if (visibleWidth(text) <= maxWidth) return text;
787
813
  let width = 0;
788
814
  let out = "";
@@ -823,7 +849,7 @@ function countPhysicalLines(text, columns) {
823
849
  const lines = text.split("\n");
824
850
  let total = 0;
825
851
  for (const line of lines) {
826
- const width = displayWidth(line);
852
+ const width = visibleWidth(stripOsc8Hyperlinks(line));
827
853
  total += Math.max(1, Math.ceil(width / columns));
828
854
  }
829
855
  return Math.max(total, 1);
@@ -10760,7 +10786,21 @@ var SERVER_FALLBACK_HINT = "or use --server to run on the server explicitly.";
10760
10786
  function buildAuthFailure(ctx) {
10761
10787
  const platformNoToken = ctx.where === "server chat proxy" && isAuthNoTokenBody(ctx.message);
10762
10788
  const fix = platformNoToken ? `This install is not logged in \u2014 run \`nolo login\`, or set AUTH_TOKEN / NOLO_SERVER` : ctx.where === "server chat proxy" ? `Check the agent's provider/api-key settings on nolo.chat` : `Fix the local credential/config and retry`;
10763
- return `${RUN_UNAVAILABLE_PREFIX} (${ctx.where} returned HTTP ${ctx.status}, auth rejected). Detail: ${ctx.message} ${NO_FALLBACK} ${fix}, ${SERVER_FALLBACK_HINT}.
10789
+ const { url: validationUrl, text: validationText } = extractGoogleValidationLink(ctx.message);
10790
+ const validationLabel = validationText || "Verify your account";
10791
+ const validationHint = validationUrl ? `
10792
+ \u24D8 This provider requires a one-time account verification. Open this link in a browser signed into that account, then retry:
10793
+ ${formatCliHyperlink(
10794
+ validationUrl,
10795
+ validationLabel
10796
+ )}` + // A 200-char Google url wraps on a narrow terminal, and a wrapped link
10797
+ // loses its hit area in several terminals — so even when the clickable
10798
+ // form is available, the raw url still gets its own copyable line. (In
10799
+ // the disabled path `label (url)` already carries it.)
10800
+ (resolveCliHyperlinkEnabled() ? `
10801
+ \u6216\u590D\u5236\u6B64\u94FE\u63A5: ${validationUrl}` : "") : "";
10802
+ return `${RUN_UNAVAILABLE_PREFIX} (${ctx.where} returned HTTP ${ctx.status}, auth rejected).${validationHint ? `${validationHint}
10803
+ ` : " "}Detail: ${ctx.message} ${NO_FALLBACK} ${fix}, ${SERVER_FALLBACK_HINT}.
10764
10804
  `;
10765
10805
  }
10766
10806
  function isAuthNoTokenBody(message) {
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  clearCliLocalRuntimePreparedAgentCache
3
- } from "./chunk-F2RNI7ZR.js";
3
+ } from "./chunk-ITBLTYQB.js";
4
4
  import {
5
5
  getReadableCliDb
6
6
  } from "./chunk-LS2ZANRJ.js";
@@ -9,7 +9,7 @@ import {
9
9
  initReactI18next,
10
10
  instance,
11
11
  toast
12
- } from "./chunk-XVZ22N6C.js";
12
+ } from "./chunk-FQUHIG5X.js";
13
13
  import {
14
14
  require_date_fns
15
15
  } from "./chunk-M76ECQRD.js";
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  createCliLocalRuntimeAdapter,
3
3
  summarizeEndpoint
4
- } from "./chunk-F2RNI7ZR.js";
4
+ } from "./chunk-ITBLTYQB.js";
5
5
  import {
6
6
  clipMultilineText
7
- } from "./chunk-TQBHNYVR.js";
7
+ } from "./chunk-H66KLASO.js";
8
8
  import {
9
9
  runLocalAgentTurn
10
10
  } from "./chunk-6VFARHZW.js";
@@ -0,0 +1,153 @@
1
+ import {
2
+ isRecord
3
+ } from "./chunk-KUG52IAP.js";
4
+
5
+ // packages/core/chat/validationUrl.ts
6
+ function safeUrl(raw) {
7
+ if (typeof raw !== "string") return void 0;
8
+ const trimmed = raw.trim();
9
+ if (!/^https?:\/\//i.test(trimmed)) return void 0;
10
+ try {
11
+ const parsed = new URL(trimmed);
12
+ if (parsed.protocol !== "http:" && parsed.protocol !== "https:") {
13
+ return void 0;
14
+ }
15
+ return parsed.href;
16
+ } catch {
17
+ return void 0;
18
+ }
19
+ }
20
+ function scanValidationDetails(details) {
21
+ if (!Array.isArray(details)) return {};
22
+ let url;
23
+ let text;
24
+ let learnMoreUrl;
25
+ for (const detail of details) {
26
+ if (url && learnMoreUrl) break;
27
+ if (!isRecord(detail)) continue;
28
+ const metadata = isRecord(detail.metadata) ? detail.metadata : void 0;
29
+ if (metadata) {
30
+ url = url ?? safeUrl(metadata.validation_url);
31
+ text = text ?? (typeof metadata.validation_url_link_text === "string" ? metadata.validation_url_link_text : void 0);
32
+ learnMoreUrl = learnMoreUrl ?? safeUrl(metadata.validation_learn_more_url);
33
+ }
34
+ const links = Array.isArray(detail.links) ? detail.links : [];
35
+ for (const link of links) {
36
+ if (!isRecord(link)) continue;
37
+ const linkUrl = safeUrl(link.url);
38
+ if (!linkUrl) continue;
39
+ const desc = typeof link.description === "string" ? link.description : "";
40
+ if (!url && /verify|continue/i.test(desc)) {
41
+ url = linkUrl;
42
+ text = text ?? desc;
43
+ } else if (!learnMoreUrl && /learn more/i.test(desc)) {
44
+ learnMoreUrl = linkUrl;
45
+ }
46
+ }
47
+ }
48
+ return { url, text, learnMoreUrl };
49
+ }
50
+ function unescapeJsonString(text) {
51
+ return text.replace(
52
+ /\\(["\\/nrtbf]|u[0-9a-fA-F]{4})/g,
53
+ (_match, esc) => {
54
+ switch (esc[0]) {
55
+ case "n":
56
+ return "\n";
57
+ case "r":
58
+ return "\r";
59
+ case "t":
60
+ return " ";
61
+ case "b":
62
+ return "\b";
63
+ case "f":
64
+ return "\f";
65
+ case "u":
66
+ return String.fromCharCode(parseInt(esc.slice(1), 16));
67
+ default:
68
+ return esc;
69
+ }
70
+ }
71
+ );
72
+ }
73
+ function sliceBalancedJsonObject(text) {
74
+ const start = text.indexOf("{");
75
+ if (start < 0) return void 0;
76
+ let depth = 0;
77
+ let inString = false;
78
+ let escaped = false;
79
+ for (let i = start; i < text.length; i += 1) {
80
+ const ch = text[i];
81
+ if (inString) {
82
+ if (escaped) escaped = false;
83
+ else if (ch === "\\") escaped = true;
84
+ else if (ch === '"') inString = false;
85
+ continue;
86
+ }
87
+ if (ch === '"') inString = true;
88
+ else if (ch === "{") depth += 1;
89
+ else if (ch === "}") {
90
+ depth -= 1;
91
+ if (depth === 0) return text.slice(start, i + 1);
92
+ }
93
+ }
94
+ return void 0;
95
+ }
96
+ function parseBalancedJson(text) {
97
+ const slice = sliceBalancedJsonObject(text);
98
+ if (!slice) return void 0;
99
+ try {
100
+ return JSON.parse(slice);
101
+ } catch {
102
+ return void 0;
103
+ }
104
+ }
105
+ function findValidationInParsed(parsed, depth = 0) {
106
+ if (depth > 3 || !isRecord(parsed)) return {};
107
+ const err = isRecord(parsed.error) ? parsed.error : parsed;
108
+ const fromDetails = scanValidationDetails(isRecord(err) ? err.details : void 0);
109
+ if (fromDetails.url) return fromDetails;
110
+ const nested = isRecord(err) ? err.message : void 0;
111
+ if (typeof nested === "string" && nested.trim().startsWith("{")) {
112
+ try {
113
+ const reparsed = findValidationInParsed(JSON.parse(nested), depth + 1);
114
+ if (reparsed.url) return reparsed;
115
+ } catch {
116
+ }
117
+ }
118
+ return {};
119
+ }
120
+ function stripTerminalControlChars(raw) {
121
+ return raw.replace(/[\u0000-\u001f\u007f]/g, "");
122
+ }
123
+ function regexValidationFallback(text) {
124
+ const urlMatch = text.match(
125
+ /validation_url[^h]{0,10}(https?:\/\/[^\s"\\]+)/i
126
+ );
127
+ if (!urlMatch) return {};
128
+ const textMatch = text.match(
129
+ /validation_url_link_text[^A-Za-z]{0,10}([^"\\\n]{1,60})/i
130
+ );
131
+ return {
132
+ // safeUrl first (normalizes C0 into %XX); fall back to stripping controls
133
+ // so a truncated-but-real link is still emitted rather than dropped.
134
+ url: safeUrl(urlMatch[1]) ?? stripTerminalControlChars(urlMatch[1]),
135
+ text: textMatch?.[1] ? stripTerminalControlChars(textMatch[1].trim()) || void 0 : void 0
136
+ };
137
+ }
138
+ function extractGoogleValidationLink(errorText) {
139
+ for (const candidate of [
140
+ parseBalancedJson(errorText),
141
+ parseBalancedJson(unescapeJsonString(errorText))
142
+ ]) {
143
+ if (candidate === void 0) continue;
144
+ const found = findValidationInParsed(candidate);
145
+ if (found.url) return found;
146
+ }
147
+ return regexValidationFallback(errorText);
148
+ }
149
+
150
+ export {
151
+ scanValidationDetails,
152
+ extractGoogleValidationLink
153
+ };
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  toolRegistry
3
- } from "./chunk-TQBHNYVR.js";
3
+ } from "./chunk-H66KLASO.js";
4
4
  import {
5
5
  i18n_default
6
- } from "./chunk-XVZ22N6C.js";
6
+ } from "./chunk-FQUHIG5X.js";
7
7
  import {
8
8
  canonicalizeToolNames
9
9
  } from "./chunk-O6OSWFZQ.js";