nolo-cli 0.114.0-alpha.1 → 0.115.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.
@@ -8,8 +8,8 @@ import {
8
8
  } from "./chunk-V7E4PXQD.js";
9
9
  import {
10
10
  runAgentCreateCommand
11
- } from "./chunk-64Y3BZLF.js";
12
- import "./chunk-NPOXQ3SY.js";
11
+ } from "./chunk-LZLZNZ4H.js";
12
+ import "./chunk-5F3OZ7L2.js";
13
13
  import "./chunk-Z5625XML.js";
14
14
  import "./chunk-EADNWBAZ.js";
15
15
  import "./chunk-SH43IESU.js";
@@ -92,7 +92,7 @@ async function defaultExecuteCli(provider, prompt, options) {
92
92
  return executeCli(provider, prompt, options);
93
93
  }
94
94
  async function forwardConnectorRunMessage(machine, message, pushMessage, executeCli, env, fetchImpl) {
95
- const { handleConnectorRunMessage } = await import("./machineWsRunDispatch-76ZNJVUF.js");
95
+ const { handleConnectorRunMessage } = await import("./machineWsRunDispatch-UJX7MT2Z.js");
96
96
  return handleConnectorRunMessage(message, pushMessage, executeCli, env, fetchImpl);
97
97
  }
98
98
  async function detectLaunchableMachineInfo() {
@@ -2,8 +2,8 @@ import {
2
2
  runAgentCreateCommand,
3
3
  runAgentReadCommand,
4
4
  runAgentUpdateCommand
5
- } from "./chunk-64Y3BZLF.js";
6
- import "./chunk-NPOXQ3SY.js";
5
+ } from "./chunk-LZLZNZ4H.js";
6
+ import "./chunk-5F3OZ7L2.js";
7
7
  import "./chunk-Z5625XML.js";
8
8
  import "./chunk-EADNWBAZ.js";
9
9
  import "./chunk-SH43IESU.js";
@@ -8,13 +8,13 @@ import {
8
8
  resolveRunSettlementNote,
9
9
  resolveWorkflowReference,
10
10
  runAgentRunCommand
11
- } from "./chunk-LIMDRZAP.js";
11
+ } from "./chunk-KEQNY22P.js";
12
12
  import "./chunk-S7Z2HMCN.js";
13
13
  import {
14
14
  parseAgentRunArgs
15
15
  } from "./chunk-V7E4PXQD.js";
16
16
  import "./chunk-ESHYE7WU.js";
17
- import "./chunk-NPOXQ3SY.js";
17
+ import "./chunk-5F3OZ7L2.js";
18
18
  import "./chunk-Z5625XML.js";
19
19
  import "./chunk-EADNWBAZ.js";
20
20
  import "./chunk-SH43IESU.js";
@@ -1388,6 +1388,11 @@ var TOOL_LABELS = {
1388
1388
  function toolLabel(name) {
1389
1389
  return TOOL_LABELS[name]?.[currentLocale] ?? name;
1390
1390
  }
1391
+ function toolLabelVariants(name) {
1392
+ const entry = TOOL_LABELS[name];
1393
+ if (!entry) return [name];
1394
+ return [...new Set(Object.values(entry))];
1395
+ }
1391
1396
  function agentRunCardLabels() {
1392
1397
  return {
1393
1398
  runStatus: t("runStatusLabel"),
@@ -13566,6 +13571,7 @@ export {
13566
13571
  dailyWelcomeTip,
13567
13572
  t,
13568
13573
  toolLabel,
13574
+ toolLabelVariants,
13569
13575
  agentRunCardLabels,
13570
13576
  createCliLocalRuntimeAdapter
13571
13577
  };
@@ -29,8 +29,9 @@ import {
29
29
  resolveFileWriteGateEnabled,
30
30
  resolveLocalUserId,
31
31
  t,
32
- toolLabel
33
- } from "./chunk-NPOXQ3SY.js";
32
+ toolLabel,
33
+ toolLabelVariants
34
+ } from "./chunk-5F3OZ7L2.js";
34
35
  import {
35
36
  createRunActivityTracker,
36
37
  popSingleQueueMessage,
@@ -8222,12 +8223,79 @@ function normalizeListLine(line) {
8222
8223
  }
8223
8224
  return line;
8224
8225
  }
8226
+ var TOOL_TREE_HEADER_RE = /^•\s+(.+?)\s+\((\d+)\)$/;
8227
+ var TOOL_TREE_LEAF_RE = /^([├└]──\s+)(.*?)\s{2}(✓|✗|!)(?:\s+(.*))?$/;
8228
+ var TOOL_SINGLE_RE = /^▸\s+(.+?)(?:\s+·\s+(.*?))?(?:\s{2}(✓|✗|!)(?:\s+(.*))?)$/;
8229
+ function plainToolLine(line) {
8230
+ return stripAnsi2(line);
8231
+ }
8232
+ var TOOL_TREE_GROUP_LABELS = new Set(
8233
+ ["execShell", "readFile", "fetchWebpage", "exa_search"].flatMap(toolLabelVariants)
8234
+ );
8235
+ function isKnownToolGroupLabel(label) {
8236
+ return TOOL_TREE_GROUP_LABELS.has(label);
8237
+ }
8238
+ function toolTreeHeaderMatch(line) {
8239
+ const match = plainToolLine(line).match(TOOL_TREE_HEADER_RE);
8240
+ return match && isKnownToolGroupLabel(match[1]) ? match : null;
8241
+ }
8242
+ function isToolTreeHeaderLine(line) {
8243
+ return toolTreeHeaderMatch(line) !== null;
8244
+ }
8245
+ function isToolTreeLeafLine(line) {
8246
+ return TOOL_TREE_LEAF_RE.test(plainToolLine(line));
8247
+ }
8248
+ function isToolSingleLine(line) {
8249
+ return TOOL_SINGLE_RE.test(plainToolLine(line));
8250
+ }
8251
+ function isToolGroupBoundary(cur, next) {
8252
+ return isToolTreeLeafLine(cur) && isToolTreeHeaderLine(next);
8253
+ }
8254
+ function statusColorSeq(marker, brightness) {
8255
+ if (marker === "\u2713") return colorSeq("success", brightness);
8256
+ if (marker === "\u2717") return colorSeq("danger", brightness);
8257
+ return colorSeq("warning", brightness);
8258
+ }
8259
+ function styleTuiToolLine(line, brightness) {
8260
+ const plain = plainToolLine(line);
8261
+ const chrome = colorSeq("chrome", brightness);
8262
+ const muted = colorSeq("muted", brightness);
8263
+ const header = toolTreeHeaderMatch(plain);
8264
+ if (header) {
8265
+ return `${chrome}\u2022${STYLE.reset} ${STYLE.bold}${muted}${header[1]}${STYLE.reset} ${chrome}${STYLE.dim}(${header[2]})${STYLE.reset}`;
8266
+ }
8267
+ const leaf = plain.match(TOOL_TREE_LEAF_RE);
8268
+ if (leaf) {
8269
+ const [, connector, detail, marker, statusDetail] = leaf;
8270
+ let rendered = `${chrome}${connector}${STYLE.reset}${chrome}${detail}${STYLE.reset}`;
8271
+ rendered += ` ${statusColorSeq(marker, brightness)}${marker}${STYLE.reset}`;
8272
+ if (statusDetail) {
8273
+ const metaSeq = marker === "\u2713" ? chrome : statusColorSeq(marker, brightness);
8274
+ rendered += ` ${metaSeq}${STYLE.dim}${statusDetail}${STYLE.reset}`;
8275
+ }
8276
+ return rendered;
8277
+ }
8278
+ const single = plain.match(TOOL_SINGLE_RE);
8279
+ if (single) {
8280
+ const [, label, detail, marker, statusDetail] = single;
8281
+ let rendered = `${chrome}\u25B8${STYLE.reset} ${STYLE.bold}${muted}${label}${STYLE.reset}`;
8282
+ if (detail) rendered += ` ${chrome}\xB7 ${detail}${STYLE.reset}`;
8283
+ rendered += ` ${statusColorSeq(marker, brightness)}${marker}${STYLE.reset}`;
8284
+ if (statusDetail) {
8285
+ const metaSeq = marker === "\u2713" ? chrome : statusColorSeq(marker, brightness);
8286
+ rendered += ` ${metaSeq}${STYLE.dim}${statusDetail}${STYLE.reset}`;
8287
+ }
8288
+ return rendered;
8289
+ }
8290
+ return null;
8291
+ }
8225
8292
  function isPolishListLikeLine(line) {
8226
- return LIST_LIKE_RE_FOR_GUARD.test(normalizeListLine(line));
8293
+ return LIST_LIKE_RE_FOR_GUARD.test(normalizeListLine(plainToolLine(line)));
8227
8294
  }
8228
- var LIST_LIKE_RE_FOR_GUARD = /^\s*(?:•|☐|☑|\d+\.)\s|^\s*[\u2460-\u2473]|^\s*[├└]──\s/;
8295
+ var LIST_LIKE_RE_FOR_GUARD = /^\s*(?:•|☐|☑|\d+\.)\s|^\s*[\u2460-\u2473]|^\s*[├└]──\s|^\s*▸\s/;
8229
8296
  function polishBreathInsertsBlankBetween(cur, next) {
8230
8297
  if (cur === "" || next === "") return false;
8298
+ if (isToolGroupBoundary(cur, next)) return true;
8231
8299
  return isPolishListLikeLine(cur) !== isPolishListLikeLine(next);
8232
8300
  }
8233
8301
  function convertMarkdownTablesForTerminal(text) {
@@ -8297,16 +8365,14 @@ function polishAssistantStructure(text, options = {}) {
8297
8365
  return line;
8298
8366
  });
8299
8367
  const afterHeading = maskedLines.join("\n").replace(/([^\n])\n(#{1,3} )/g, "$1\n\n$2").replace(/^(#{1,3} .+)\n(?!\n)/gm, "$1\n\n").replace(/\n{4,}/g, "\n\n\n");
8300
- const LIST_LIKE = /^\s*(?:•|☐|☑|\d+\.)\s|^\s*[\u2460-\u2473]|^\s*[├└]──\s/;
8301
8368
  const headingLines = afterHeading.split("\n");
8302
8369
  const breathed = [];
8303
8370
  for (let i = 0; i < headingLines.length; i++) {
8304
8371
  breathed.push(headingLines[i]);
8305
8372
  const cur = headingLines[i];
8306
8373
  const next = headingLines[i + 1];
8307
- if (cur === "" || next === void 0 || next === "") continue;
8308
- if (LIST_LIKE.test(cur) === LIST_LIKE.test(next)) continue;
8309
- breathed.push("");
8374
+ if (next === void 0) continue;
8375
+ if (polishBreathInsertsBlankBetween(cur, next)) breathed.push("");
8310
8376
  }
8311
8377
  const polishedMasked = breathed.join("\n");
8312
8378
  const polished = polishedMasked.replace(
@@ -8316,6 +8382,8 @@ function polishAssistantStructure(text, options = {}) {
8316
8382
  return options.trimEdges === false ? polished : polished.trim();
8317
8383
  }
8318
8384
  function styleRichMarkdownLine(line, brightness) {
8385
+ const toolLine = styleTuiToolLine(line, brightness);
8386
+ if (toolLine !== null) return toolLine;
8319
8387
  const heading = line.match(/^(#{1,3})\s+(.+)$/);
8320
8388
  if (heading) {
8321
8389
  const level = heading[1].length;
@@ -8467,16 +8535,23 @@ function emitFormattedAssistantBlock(write, text, trailingNewline = false) {
8467
8535
  }
8468
8536
  function classifyStreamLine(line) {
8469
8537
  if (line === "") return "blank";
8470
- if (TASK_LIST_RE.test(line) || UNORDERED_LIST_RE.test(line) || ORDERED_LIST_RE.test(line) || /^\s*(?:•|☐|☑)\s/.test(line) || /^\s*[\u2460-\u2473]/.test(line)) {
8538
+ const plain = plainToolLine(line);
8539
+ if (isToolTreeHeaderLine(plain)) return "tool-header";
8540
+ if (isToolTreeLeafLine(plain)) return "tool-leaf";
8541
+ if (isToolSingleLine(plain)) return "tool";
8542
+ if (TASK_LIST_RE.test(plain) || UNORDERED_LIST_RE.test(plain) || ORDERED_LIST_RE.test(plain) || /^\s*(?:•|☐|☑)\s/.test(plain) || /^\s*[\u2460-\u2473]/.test(plain)) {
8471
8543
  return "list";
8472
8544
  }
8545
+ if (isPolishListLikeLine(plain)) return "list";
8473
8546
  return "prose";
8474
8547
  }
8548
+ function isStreamListLike(kind) {
8549
+ return kind === "list" || kind === "tool-header" || kind === "tool-leaf" || kind === "tool";
8550
+ }
8475
8551
  function needsListProseBreath(prev, next) {
8476
8552
  if (prev === null || prev === "blank" || next === "blank") return false;
8477
- const prevList = prev === "list";
8478
- const nextList = next === "list";
8479
- return prevList !== nextList;
8553
+ if (prev === "tool-leaf" && next === "tool-header") return true;
8554
+ return isStreamListLike(prev) !== isStreamListLike(next);
8480
8555
  }
8481
8556
  function createRenderAwareStreamWriter(args) {
8482
8557
  const brightness = resolveTuiBrightness();
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  clearCliLocalRuntimePreparedAgentCache
3
- } from "./chunk-NPOXQ3SY.js";
3
+ } from "./chunk-5F3OZ7L2.js";
4
4
  import {
5
5
  getReadableCliDb
6
6
  } from "./chunk-LS2ZANRJ.js";
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  createCliLocalRuntimeAdapter,
3
3
  summarizeEndpoint
4
- } from "./chunk-NPOXQ3SY.js";
4
+ } from "./chunk-5F3OZ7L2.js";
5
5
  import {
6
6
  clipMultilineText
7
7
  } from "./chunk-2MMIOYAF.js";
package/index.js CHANGED
@@ -127,7 +127,7 @@ function createDaemonShortcutCommand(path, description, command2) {
127
127
  // packages/cli/agentInternalCommandEntries.ts
128
128
  function getAgentInternalCommandEntries() {
129
129
  const createAgentRunCommand = (path, description) => createContextCommand(path, description, async (args2, ctx) => {
130
- const { runAgentRunCommand } = await import("./agentRunCommand-4756YTCG.js");
130
+ const { runAgentRunCommand } = await import("./agentRunCommand-GOP4T77I.js");
131
131
  return runAgentRunCommand(args2, {
132
132
  env: ctx.env,
133
133
  scriptDir: ctx.scriptDir,
@@ -143,7 +143,7 @@ function getAgentInternalCommandEntries() {
143
143
  return runAgentListCommand(args2, deps);
144
144
  }),
145
145
  createEnvCommand(["agent", "create"], "Create a new agent", async (args2, deps) => {
146
- const { runAgentCreateCommand } = await import("./agentRecordCommands-WW6WH62F.js");
146
+ const { runAgentCreateCommand } = await import("./agentRecordCommands-LZ4G5INZ.js");
147
147
  return runAgentCreateCommand(args2, deps);
148
148
  }),
149
149
  createEnvCommand(["agent", "models"], "List models available on an OpenAI-compatible provider", async (args2, deps) => {
@@ -159,7 +159,7 @@ function getAgentInternalCommandEntries() {
159
159
  return runAgentPullCommand(args2, deps);
160
160
  }),
161
161
  createEnvCommand(["agent", "read"], "Read a single agent", async (args2, deps) => {
162
- const { runAgentReadCommand } = await import("./agentRecordCommands-WW6WH62F.js");
162
+ const { runAgentReadCommand } = await import("./agentRecordCommands-LZ4G5INZ.js");
163
163
  return runAgentReadCommand(args2, deps);
164
164
  }),
165
165
  createAgentRunCommand(["agent", "run"], "Run an agent"),
@@ -188,26 +188,26 @@ function getAgentInternalCommandEntries() {
188
188
  return runSetupOfflineMarxistsAgentCommand(args2, deps);
189
189
  }),
190
190
  createEnvCommand(["agent", "update"], "Update agent fields", async (args2, deps) => {
191
- const { runAgentUpdateCommand } = await import("./agentRecordCommands-WW6WH62F.js");
191
+ const { runAgentUpdateCommand } = await import("./agentRecordCommands-LZ4G5INZ.js");
192
192
  return runAgentUpdateCommand(args2, deps);
193
193
  }),
194
194
  createEnvCommand(["agent", "email", "provision"], "Provision a controlled inbox for an agent", async (args2, deps) => {
195
- const { runAgentEmailProvisionCommand } = await import("./agentEmailCommands-Q6CP5PXX.js");
195
+ const { runAgentEmailProvisionCommand } = await import("./agentEmailCommands-M26R6BO4.js");
196
196
  return runAgentEmailProvisionCommand(args2, deps);
197
197
  }),
198
198
  createEnvCommand(["agent", "email", "bind"], "Bind an existing email address to an agent", async (args2, deps) => {
199
- const { runAgentEmailBindCommand } = await import("./agentEmailCommands-Q6CP5PXX.js");
199
+ const { runAgentEmailBindCommand } = await import("./agentEmailCommands-M26R6BO4.js");
200
200
  return runAgentEmailBindCommand(args2, deps);
201
201
  }),
202
202
  createEnvCommand(["agent", "email", "transfer"], "Transfer an email identity from one agent to another (cross-account)", async (args2, deps) => {
203
- const { runAgentEmailTransferCommand } = await import("./agentEmailCommands-Q6CP5PXX.js");
203
+ const { runAgentEmailTransferCommand } = await import("./agentEmailCommands-M26R6BO4.js");
204
204
  return runAgentEmailTransferCommand(args2, deps);
205
205
  }),
206
206
  createEnvCommand(
207
207
  ["agent", "email", "create-and-provision"],
208
208
  "Create an agent and provision its controlled inbox",
209
209
  async (args2, deps) => {
210
- const { runAgentEmailCreateAndProvisionCommand } = await import("./agentEmailCommands-Q6CP5PXX.js");
210
+ const { runAgentEmailCreateAndProvisionCommand } = await import("./agentEmailCommands-M26R6BO4.js");
211
211
  return runAgentEmailCreateAndProvisionCommand(args2, deps);
212
212
  }
213
213
  ),
@@ -228,15 +228,15 @@ function getAgentInternalCommandEntries() {
228
228
  return runAgentRevokeGrantCommand(args2, deps);
229
229
  }),
230
230
  createEnvCommand(["agent", "bind-current"], "Bind an agent to this machine", async (args2, deps) => {
231
- const { runAgentBindCurrentCommand } = await import("./agentMachineCommands-EGUQJDAB.js");
231
+ const { runAgentBindCurrentCommand } = await import("./agentMachineCommands-ZFEQOZG3.js");
232
232
  return runAgentBindCurrentCommand(args2, deps);
233
233
  }),
234
234
  createEnvCommand(["agent", "smoke-current"], "Smoke test a bound agent through this machine", async (args2, deps) => {
235
- const { runAgentSmokeCurrentCommand } = await import("./agentMachineCommands-EGUQJDAB.js");
235
+ const { runAgentSmokeCurrentCommand } = await import("./agentMachineCommands-ZFEQOZG3.js");
236
236
  return runAgentSmokeCurrentCommand(args2, deps);
237
237
  }),
238
238
  createEnvCommand(["agent", "runtime-doctor"], "Diagnose current machine runtime compatibility", async (args2, deps) => {
239
- const { runAgentRuntimeDoctorCommand } = await import("./agentMachineCommands-EGUQJDAB.js");
239
+ const { runAgentRuntimeDoctorCommand } = await import("./agentMachineCommands-ZFEQOZG3.js");
240
240
  return runAgentRuntimeDoctorCommand(args2, deps);
241
241
  }),
242
242
  createAgentRunCommand(["agent", "chat"], "Chat with an agent")
@@ -488,15 +488,15 @@ function getSystemInternalCommandEntries(renderHelpText2) {
488
488
  return runWhoamiCommand({ args: args2, env: ctx.env });
489
489
  }),
490
490
  createEntrypointEnvCommand(["connect"], "Send machine heartbeats or hold a connector websocket", async (args2, deps) => {
491
- const { runMachineConnectCommand } = await import("./machineCommands-AJBXJ6PZ.js");
491
+ const { runMachineConnectCommand } = await import("./machineCommands-N3XF6SYH.js");
492
492
  return runMachineConnectCommand(args2, deps);
493
493
  }),
494
494
  createDaemonShortcutCommand(["daemon"], "Run the connector daemon shortcut", async (args2, deps) => {
495
- const { runMachineConnectCommand } = await import("./machineCommands-AJBXJ6PZ.js");
495
+ const { runMachineConnectCommand } = await import("./machineCommands-N3XF6SYH.js");
496
496
  return runMachineConnectCommand(args2, deps);
497
497
  }),
498
498
  createEnvCommand(["machine", "status"], "List machines registered to the current profile", async (args2, deps) => {
499
- const { runMachineStatusCommand } = await import("./machineCommands-AJBXJ6PZ.js");
499
+ const { runMachineStatusCommand } = await import("./machineCommands-N3XF6SYH.js");
500
500
  return runMachineStatusCommand(args2, deps);
501
501
  }),
502
502
  createEnvCommand(["doctor", "runtime"], "Diagnose local-first agent runtime selection", async (args2, deps) => {
@@ -892,7 +892,7 @@ async function runScript(script, forwardedArgs, env) {
892
892
  return proc.exited;
893
893
  }
894
894
  async function launchTuiWorkspace(args2) {
895
- const { startTuiWorkspace } = await import("./readlineWorkspace-XNH5GMSV.js");
895
+ const { startTuiWorkspace } = await import("./readlineWorkspace-FFZEUHR4.js");
896
896
  const { createTuiSummaryLlmCaller } = await import("./tuiSummaryLlmCaller-UFGFOIIW.js");
897
897
  return startTuiWorkspace({
898
898
  ...args2,
@@ -2,7 +2,7 @@ import {
2
2
  buildMachinePermissionPromptBlock,
3
3
  handleConnectorRunMessage,
4
4
  resolveMachineRunPermissionPolicy
5
- } from "./chunk-B6KVZJEQ.js";
5
+ } from "./chunk-NGEWETHC.js";
6
6
  import {
7
7
  isConnectorWebSocketAuthError,
8
8
  isConnectorWebSocketRetryableError,
@@ -11,7 +11,7 @@ import {
11
11
  import {
12
12
  detectMachineInfo
13
13
  } from "./chunk-ESHYE7WU.js";
14
- import "./chunk-NPOXQ3SY.js";
14
+ import "./chunk-5F3OZ7L2.js";
15
15
  import "./chunk-Z5625XML.js";
16
16
  import "./chunk-EADNWBAZ.js";
17
17
  import "./chunk-SH43IESU.js";
@@ -11,8 +11,8 @@ import {
11
11
  runtimeWorkspacePermissionPolicy,
12
12
  scopePermissionPolicyToRuntimeWorkspace,
13
13
  summarizeAgentConfigForLogs
14
- } from "./chunk-B6KVZJEQ.js";
15
- import "./chunk-NPOXQ3SY.js";
14
+ } from "./chunk-NGEWETHC.js";
15
+ import "./chunk-5F3OZ7L2.js";
16
16
  import "./chunk-Z5625XML.js";
17
17
  import "./chunk-EADNWBAZ.js";
18
18
  import "./chunk-SH43IESU.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nolo-cli",
3
- "version": "0.114.0-alpha.1",
3
+ "version": "0.115.0-alpha.1",
4
4
  "type": "module",
5
5
  "description": "Agent-first terminal workspace for Nolo",
6
6
  "bin": {
@@ -72,7 +72,7 @@ import {
72
72
  wrapTextToLines,
73
73
  wrapTranscriptLine,
74
74
  wrapTranscriptLineWithLayout
75
- } from "./chunk-LIMDRZAP.js";
75
+ } from "./chunk-KEQNY22P.js";
76
76
  import "./chunk-S7Z2HMCN.js";
77
77
  import "./chunk-V7E4PXQD.js";
78
78
  import "./chunk-ESHYE7WU.js";
@@ -98,7 +98,7 @@ import {
98
98
  readTimestamp,
99
99
  setCliLocale,
100
100
  t
101
- } from "./chunk-NPOXQ3SY.js";
101
+ } from "./chunk-5F3OZ7L2.js";
102
102
  import "./chunk-Z5625XML.js";
103
103
  import "./chunk-EADNWBAZ.js";
104
104
  import "./chunk-SH43IESU.js";