nolo-cli 0.81.0-alpha.1 → 0.81.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 (161) hide show
  1. package/README.md +2 -2
  2. package/{_executeModel-L4LCNFID.js → _executeModel-JIG7MRXQ.js} +48 -48
  3. package/{action-D22U6CTH.js → action-YVYQEAAV.js} +11 -11
  4. package/{addContentAction-XAPUTGL4.js → addContentAction-O7R66HEX.js} +9 -9
  5. package/{addDialogAgentAction-M7VLLBZM.js → addDialogAgentAction-74OA7KYP.js} +8 -8
  6. package/{agentDeleteCommand-D2WHTH7S.js → agentDeleteCommand-THAZ5GQS.js} +31 -29
  7. package/{agentEmailCommands-IHSX56GO.js → agentEmailCommands-A7T7AJA4.js} +67 -63
  8. package/{agentGrantCommands-R3VQEZJR.js → agentGrantCommands-M3XFO6EN.js} +2 -2
  9. package/{agentListCommands-R2DGZMFP.js → agentListCommands-BRZFEJQM.js} +40 -32
  10. package/{agentMachineCommands-UYDID3HQ.js → agentMachineCommands-DM4N5PK3.js} +31 -29
  11. package/{agentProviderCommands-65ZC2WB4.js → agentProviderCommands-GNPTL5XR.js} +87 -0
  12. package/{agentPullCommand-N7L2CT7L.js → agentPullCommand-O5MPVJ5E.js} +3 -3
  13. package/agentRecordCommands-TTAEMNHB.js +128 -0
  14. package/{agentRunCommand-5PJF27JP.js → agentRunCommand-JVSTGVG2.js} +65 -61
  15. package/{agentRunControl-T44MESII.js → agentRunControl-WCTKX5VL.js} +2 -2
  16. package/{agentRuntimeLocal-VD4O2QFQ.js → agentRuntimeLocal-73CVIWBB.js} +27 -25
  17. package/{agentSlice-43ORUHTC.js → agentSlice-6X4JL2E3.js} +10 -10
  18. package/{appDeleteCommands-DXJA7XOZ.js → appDeleteCommands-S7CK4OYL.js} +31 -29
  19. package/{appDeployCommands-JL6XJZJE.js → appDeployCommands-U6TMS5GO.js} +31 -29
  20. package/{appDeployStatusCommands-MS2D2R6R.js → appDeployStatusCommands-DTNQJ3LJ.js} +31 -29
  21. package/{appGetCommands-BV2RDCEV.js → appGetCommands-3SHZEQD5.js} +31 -29
  22. package/{appListCommands-E2AM636N.js → appListCommands-E2ZMIUB6.js} +31 -29
  23. package/{authCommand-EVGFLAHO.js → authCommand-F4EFRRX6.js} +164 -24
  24. package/{authCommands-ILTBI6JV.js → authCommands-RGOGCPP6.js} +4 -5
  25. package/builtinSkillRegistry-FUAVTRVZ.js +33 -0
  26. package/{chatQueueReduxAdapter-F3IRDXDQ.js → chatQueueReduxAdapter-LAQEZQKE.js} +24 -24
  27. package/{chromeCommands-VOIRNJBL.js → chromeCommands-FZYAU75D.js} +1 -1
  28. package/{chromeOpsCommands-M7DPCX2T.js → chromeOpsCommands-62P2Q2YB.js} +31 -1
  29. package/{chunk-C3FZR5EC.js → chunk-2F7RJC6L.js} +1 -1
  30. package/{chunk-HQUORJTM.js → chunk-3BMYXEUW.js} +1 -1
  31. package/{chunk-3QPYFHAH.js → chunk-3DII57IT.js} +1 -1
  32. package/{chunk-KIS76A2P.js → chunk-3IIEFNGY.js} +38 -4
  33. package/{chunk-NTW5GWDM.js → chunk-3VNWWVKB.js} +2 -0
  34. package/{chunk-JQBONKAV.js → chunk-3WD6RUUJ.js} +11 -173
  35. package/{chunk-DWUCB2A3.js → chunk-42V6BK2E.js} +1 -1
  36. package/{chunk-GBPZKFYK.js → chunk-53HEEOTT.js} +4 -4
  37. package/{chunk-GEH7MMBB.js → chunk-54ADB4W7.js} +1 -1
  38. package/{chunk-5XTOKQLW.js → chunk-5UTFL4QJ.js} +6 -2
  39. package/chunk-5ZUL4CUO.js +10 -0
  40. package/{chunk-E6RGHPDR.js → chunk-6D6VBVEW.js} +4 -6
  41. package/{chunk-QNWHWBB7.js → chunk-6FVRQBRR.js} +52 -30
  42. package/{chunk-CMH2SYHX.js → chunk-6OZ36FXI.js} +2 -2
  43. package/{chunk-NRALD3CC.js → chunk-76WEAXJB.js} +49 -10
  44. package/{chunk-DFJFH53D.js → chunk-7OLPQSMQ.js} +6 -6
  45. package/{chunk-BYEJ7K2Z.js → chunk-7S4YWN7P.js} +1 -1
  46. package/{chunk-SREASRV5.js → chunk-ABQYVJBJ.js} +1 -1
  47. package/chunk-ACTMNVHM.js +93 -0
  48. package/{chunk-XWNRAIUL.js → chunk-AFUORTY4.js} +6 -16
  49. package/{chunk-WL2RKIBF.js → chunk-BLJWCTRL.js} +1 -1
  50. package/chunk-BNGW5ASC.js +344 -0
  51. package/{chunk-SZLVDREM.js → chunk-BP4XNZRM.js} +3 -3
  52. package/{chunk-2KDR4CWE.js → chunk-BYMV6QZG.js} +24 -1
  53. package/{chunk-MYU3MJCF.js → chunk-DHDMC6FO.js} +175 -7
  54. package/{chunk-4YCRJUQ2.js → chunk-ESWUWEFS.js} +10 -10
  55. package/{chunk-EXMHJN7C.js → chunk-EYAQT56M.js} +4 -3
  56. package/{chunk-CJCJF5XB.js → chunk-FDTR4QJ6.js} +4 -2
  57. package/{chunk-PYXL2CJL.js → chunk-GPCZ7UXG.js} +1 -1
  58. package/{chunk-K7AG465Q.js → chunk-GQBOR3G6.js} +4 -2
  59. package/{chunk-YFADVSZE.js → chunk-H62HCIUP.js} +6 -6
  60. package/{chunk-PZM3EENV.js → chunk-HJUYAD4A.js} +1 -1
  61. package/{chunk-3JQ2NRYU.js → chunk-HVURBGF3.js} +4 -4
  62. package/{chunk-DAIOZ3ZO.js → chunk-HWIZU4OL.js} +13 -15
  63. package/{chunk-ZVN6I33J.js → chunk-IIVGDG4I.js} +6 -5
  64. package/{chunk-UDQWGU7F.js → chunk-J4MOO56S.js} +1 -1
  65. package/{chunk-DSRXPQWA.js → chunk-JAXOVNM4.js} +43 -43
  66. package/{chunk-QQ7SX52C.js → chunk-JCIHVIVG.js} +15 -15
  67. package/{chunk-KC5FAHVS.js → chunk-JEDZAO7L.js} +1 -1
  68. package/{chunk-6XIE5ZGI.js → chunk-JPGCXHNM.js} +1 -1
  69. package/chunk-JRQFUXY7.js +1625 -0
  70. package/{chunk-J4R5XRX5.js → chunk-K4YGZD3P.js} +419 -72
  71. package/chunk-KQ4ONNQD.js +677 -0
  72. package/{chunk-RXX4GDIH.js → chunk-LS2ZANRJ.js} +1 -1
  73. package/{chunk-ODWEZBU6.js → chunk-LXF6XQDT.js} +1219 -57
  74. package/{chunk-CPSZJBLK.js → chunk-LZIWMYX4.js} +105 -26
  75. package/{chunk-BJIRLHJR.js → chunk-M2EJHDJP.js} +4 -0
  76. package/{chunk-EVBFYPDC.js → chunk-MC4XLIJ7.js} +6 -2
  77. package/{chunk-QC5LGHYP.js → chunk-OF7AQZUG.js} +10 -5
  78. package/{chunk-UJ63UXGE.js → chunk-OIVSQH2O.js} +1006 -801
  79. package/{chunk-AETZ7AD6.js → chunk-Q554LLSI.js} +1 -1
  80. package/chunk-Q5FJJ6XI.js +103 -0
  81. package/{chunk-AJHEFRGJ.js → chunk-Q67DOFOO.js} +214 -5
  82. package/{chunk-UZ6XXCVR.js → chunk-QDSINZM3.js} +15 -2
  83. package/{chunk-D6XYLSOS.js → chunk-QIAVMDHY.js} +1 -1
  84. package/{chunk-IHTVDCWH.js → chunk-R2B3MIZA.js} +3 -3
  85. package/{chunk-YWG6EMH3.js → chunk-RG6JBBX5.js} +10 -6
  86. package/{chunk-QCZX4FTW.js → chunk-SH43IESU.js} +173 -15
  87. package/{chunk-FNGAF7C4.js → chunk-SNPMM7H3.js} +137 -12
  88. package/{chunk-XKNBWXDH.js → chunk-SQQVLHMH.js} +7 -7
  89. package/{chunk-SPAQ4PVV.js → chunk-SV5IJK6K.js} +1 -1
  90. package/{chunk-KVDUCO4Q.js → chunk-TDRTS7QW.js} +16 -12
  91. package/{chunk-BJCWNHVU.js → chunk-TOP2VXOR.js} +2 -2
  92. package/{chunk-QQBO3LQW.js → chunk-TZJJ77KQ.js} +155 -795
  93. package/{chunk-4EJ5QYB5.js → chunk-UKZDAFYT.js} +1 -1
  94. package/{chunk-PGSKWZCB.js → chunk-UZGQNTVW.js} +1 -1
  95. package/{chunk-ZZCJUXUI.js → chunk-V4MJDUSR.js} +2 -2
  96. package/{chunk-JYYZCK2Z.js → chunk-V7E4PXQD.js} +1 -1
  97. package/{chunk-OZX2IPKM.js → chunk-VLTIYV3X.js} +1 -1
  98. package/{chunk-NHRQCXIQ.js → chunk-VMFTFOWF.js} +13 -3
  99. package/{chunk-E36HZARC.js → chunk-WADCY6G6.js} +3 -3
  100. package/{chunk-HH65VA5U.js → chunk-WGR3J4Q6.js} +101 -4
  101. package/{chunk-5J7W2VWW.js → chunk-WV42OMV7.js} +6 -265
  102. package/{chunk-7QHSEMMD.js → chunk-Y5HW6GM2.js} +3 -3
  103. package/{chunk-DUJWWUGV.js → chunk-YQTQQX2H.js} +1 -1
  104. package/{chunk-QPJBFU7R.js → chunk-YVIV7WT4.js} +752 -80
  105. package/{chunk-BOYUESO7.js → chunk-Z77CRGTW.js} +1 -1
  106. package/{chunk-KSHYBTYH.js → chunk-ZWUOR654.js} +932 -299
  107. package/{contentThunks-FSQPOFYG.js → contentThunks-ATLWNC2D.js} +25 -25
  108. package/{cooldownCommands-BSCH2W7P.js → cooldownCommands-REAWYVTY.js} +2 -2
  109. package/{createAgentAutomationAction-VCHDRJ6X.js → createAgentAutomationAction-QYYWTVUR.js} +25 -25
  110. package/{createDialogAction-KZM5IE4P.js → createDialogAction-7I5VGWCR.js} +28 -28
  111. package/{createPageAction-IGMXJOY3.js → createPageAction-WNURYCWU.js} +26 -26
  112. package/{dbSlice-GKGGFNOB.js → dbSlice-XVWBAGYN.js} +8 -8
  113. package/{deleteFile-LWSR674W.js → deleteFile-YG6QMJLU.js} +3 -3
  114. package/{dialogCommands-KJS57EDF.js → dialogCommands-RILHDRQ5.js} +35 -31
  115. package/{dialogSlice-YBTC3GAW.js → dialogSlice-W5BYELVR.js} +24 -24
  116. package/{docCreateCommands-MRGXJTB4.js → docCreateCommands-GSTPU7SG.js} +32 -30
  117. package/{docDeleteCommands-YCI75CBU.js → docDeleteCommands-2FC3LSUT.js} +33 -31
  118. package/{docReadCommands-JN3VHTQY.js → docReadCommands-27POBA34.js} +32 -30
  119. package/{docStore-SDPT23I6.js → docStore-7LAHBFP2.js} +9 -9
  120. package/{docUpdateCommands-7KBOENX7.js → docUpdateCommands-U4II6VCO.js} +32 -30
  121. package/{fetchMessages-DRABNDPZ.js → fetchMessages-EIU7UFFK.js} +3 -4
  122. package/{getPricing-HRMSOF3E.js → getPricing-LUSEABA6.js} +4 -4
  123. package/{handleSendMessageAction-356IDG72.js → handleSendMessageAction-SKMJMVRU.js} +24 -24
  124. package/index.js +102 -85
  125. package/{localDialogRead-PUQKFI73.js → localDialogRead-BTFJ4V2I.js} +2 -2
  126. package/{localRuntimeDb-P37ZTX55.js → localRuntimeDb-SYQGUF4U.js} +1 -1
  127. package/{machineCommands-FYIRYMDE.js → machineCommands-S2RNYKVJ.js} +64 -60
  128. package/{machineWsRunDispatch-J2FEYI4T.js → machineWsRunDispatch-JC44LBLP.js} +62 -58
  129. package/{memberThunks-KATHH3F4.js → memberThunks-QGFLFVCI.js} +9 -9
  130. package/{models-GS72DVJS.js → models-T3SG6MJ5.js} +2 -2
  131. package/{offlineMarxistsAgentCommand-GEH6SNNA.js → offlineMarxistsAgentCommand-HGXZV4XJ.js} +1 -1
  132. package/package.json +1 -1
  133. package/providerPresetApply-FG6NZ57W.js +214 -0
  134. package/providerRegistry-757OWH3O.js +31 -0
  135. package/{read-LC6HVYBN.js → read-COE3ZYR6.js} +5 -4
  136. package/{readDocTool-N3ERJHHF.js → readDocTool-5USN4A6V.js} +1 -1
  137. package/{readlineWorkspace-OWBGR7QO.js → readlineWorkspace-VZSBXUH4.js} +188 -109
  138. package/{removeDialogAgentAction-F5GPTALR.js → removeDialogAgentAction-IX3MN2ZO.js} +11 -11
  139. package/{runAgentClientLoop-DKUUFUKT.js → runAgentClientLoop-ZYENU7GH.js} +47 -47
  140. package/{runtimeDoctorCommands-CROTMULY.js → runtimeDoctorCommands-X6WDBEQX.js} +2 -2
  141. package/{setDialogExtraReferencesAction-AY4ZCF3A.js → setDialogExtraReferencesAction-X4HCPNZL.js} +9 -9
  142. package/{setPrimaryDialogAgentAction-HPMG7V3R.js → setPrimaryDialogAgentAction-4GMIQLOD.js} +11 -11
  143. package/{settingSlice-OEJA4NQO.js → settingSlice-ZQZVUPKK.js} +10 -10
  144. package/{spaceCommands-SSLCOSBH.js → spaceCommands-QB3NNEMN.js} +30 -28
  145. package/{streamAgentChatTurn-FHZZCANP.js → streamAgentChatTurn-43GPPQSN.js} +59 -58
  146. package/{switchDialogAgentAction-HMDZTZ4I.js → switchDialogAgentAction-N52LRPA3.js} +8 -8
  147. package/{tableCommands-SUNTHAYX.js → tableCommands-O6NWHFKV.js} +1 -1
  148. package/{toolApiClient-VGYUB4P5.js → toolApiClient-QVJ6HDNN.js} +2 -2
  149. package/{tools-QZJX3BIC.js → tools-SX6Y4STZ.js} +43 -43
  150. package/tuiSummaryLlmCaller-T2SHYMDZ.js +127 -0
  151. package/{updateCommands-Y363MC3L.js → updateCommands-2M74UL7P.js} +2 -2
  152. package/{updateDialogTitleAction-JJPNGTAP.js → updateDialogTitleAction-VAKA4ZNY.js} +45 -28
  153. package/agentRecordCommands-OFYTWZAA.js +0 -124
  154. package/chunk-3IT2PFHL.js +0 -611
  155. package/chunk-I42VC5KR.js +0 -15
  156. package/chunk-NG4UT4K4.js +0 -79
  157. package/codingSkills-E6KSDNSJ.js +0 -48
  158. package/tuiSummaryLlmCaller-3Z24VUWM.js +0 -116
  159. package/{chunk-3RAG2NAD.js → chunk-UKWGR5SS.js} +3 -3
  160. package/{db-VQSAOWAO.js → db-WK5MDZVN.js} +1 -1
  161. package/{localRuntimeAuthority-R5UBODT3.js → localRuntimeAuthority-6IR6BBXE.js} +3 -3
@@ -4,7 +4,7 @@ import {
4
4
  } from "./chunk-KHCLMKZZ.js";
5
5
  import {
6
6
  asTrimmedNonEmptyStringArray
7
- } from "./chunk-I42VC5KR.js";
7
+ } from "./chunk-VMFTFOWF.js";
8
8
  import {
9
9
  asOptionalTrimmedString
10
10
  } from "./chunk-G3SUCT4W.js";
@@ -0,0 +1,103 @@
1
+ // packages/agent-runtime/devinOAuth.ts
2
+ import { existsSync, readFileSync } from "node:fs";
3
+ import { homedir } from "node:os";
4
+ import { join } from "node:path";
5
+ var DEVIN_CONNECT_URL = "https://server.codeium.com/exa.api_server_pb.ApiServerService/GetChatMessage";
6
+ function buildDevinAuthUrl(orgId) {
7
+ const cleanOrg = orgId?.trim();
8
+ if (cleanOrg) {
9
+ return `https://app.devin.ai/org/${encodeURIComponent(cleanOrg)}/settings/keys`;
10
+ }
11
+ return "https://app.devin.ai/settings/keys";
12
+ }
13
+ function extractDevinToken(input) {
14
+ const raw = input?.trim();
15
+ if (!raw) return null;
16
+ if (/^https?:\/\//i.test(raw)) {
17
+ try {
18
+ const url = new URL(raw);
19
+ const queryToken = url.searchParams.get("token") || url.searchParams.get("access_token") || url.searchParams.get("auth_token");
20
+ if (queryToken?.trim()) return queryToken.trim();
21
+ if (url.hash) {
22
+ const hashParams = new URLSearchParams(url.hash.replace(/^#/, ""));
23
+ const hashToken = hashParams.get("token") || hashParams.get("access_token") || hashParams.get("auth_token");
24
+ if (hashToken?.trim()) return hashToken.trim();
25
+ }
26
+ } catch {
27
+ }
28
+ }
29
+ return raw || null;
30
+ }
31
+ function parseDevinCredentialsToml(content) {
32
+ for (const line of content.split(/\r?\n/)) {
33
+ const cogMatch = line.match(/(cog_[A-Za-z0-9_-]+)/);
34
+ if (cogMatch?.[1]) {
35
+ return cogMatch[1].trim();
36
+ }
37
+ const match = line.match(
38
+ /^\s*(?:windsurf_api_key|devin_api_key|api_key|api_token|token)\s*=\s*"([^"]+)"\s*$/i
39
+ );
40
+ if (match?.[1]) {
41
+ return match[1].trim();
42
+ }
43
+ }
44
+ return null;
45
+ }
46
+ function detectLocalDevinCredentials(options) {
47
+ const baseHome = options?.homeDir || homedir();
48
+ const xdgData = process.env.XDG_DATA_HOME;
49
+ const candidateCliPaths = [
50
+ xdgData ? join(xdgData, "devin", "credentials.toml") : null,
51
+ join(baseHome, ".local", "share", "devin", "credentials.toml"),
52
+ process.env.APPDATA ? join(process.env.APPDATA, "devin", "credentials.toml") : null
53
+ ].filter((p) => Boolean(p));
54
+ for (const credPath of candidateCliPaths) {
55
+ if (existsSync(credPath)) {
56
+ try {
57
+ const content = readFileSync(credPath, "utf-8");
58
+ const token = parseDevinCredentialsToml(content);
59
+ if (token) {
60
+ return {
61
+ found: true,
62
+ token,
63
+ source: "devin-cli",
64
+ sourcePath: credPath
65
+ };
66
+ }
67
+ } catch {
68
+ }
69
+ }
70
+ }
71
+ const codeiumPath = join(baseHome, ".codeium", "config.json");
72
+ if (existsSync(codeiumPath)) {
73
+ try {
74
+ const parsed = JSON.parse(readFileSync(codeiumPath, "utf-8"));
75
+ const token = parsed.apiKey || parsed.api_key;
76
+ if (token?.trim()) {
77
+ return {
78
+ found: true,
79
+ token: token.trim(),
80
+ source: "codeium-config",
81
+ sourcePath: codeiumPath
82
+ };
83
+ }
84
+ } catch {
85
+ }
86
+ }
87
+ return { found: false };
88
+ }
89
+ function buildDevinOAuthCredential(token, now = Date.now()) {
90
+ return {
91
+ provider: "devin",
92
+ accessToken: token.trim(),
93
+ obtainedAt: now
94
+ };
95
+ }
96
+
97
+ export {
98
+ DEVIN_CONNECT_URL,
99
+ buildDevinAuthUrl,
100
+ extractDevinToken,
101
+ detectLocalDevinCredentials,
102
+ buildDevinOAuthCredential
103
+ };
@@ -19,8 +19,20 @@ var FIREWORKS_KIMI_LATEST_MODEL = "accounts/fireworks/models/kimi-latest";
19
19
  var FIREWORKS_KIMI_CURRENT_MODEL = "accounts/fireworks/models/kimi-k2p7-code";
20
20
  var FIREWORKS_KIMI_K2P6_MODEL = "accounts/fireworks/models/kimi-k2p6";
21
21
  var DEEPINFRA_KIMI_FALLBACK_MODEL = "moonshotai/Kimi-K2.6";
22
+ var isOllamaCloudKimiModel = (model) => model === PLATFORM_HOSTED_KIMI_K3_MODEL || model === PLATFORM_HOSTED_KIMI_K26_MODEL;
22
23
  var isFireworksKimiModel = (model) => model === FIREWORKS_KIMI_LATEST_MODEL || model === FIREWORKS_KIMI_CURRENT_MODEL || model === FIREWORKS_KIMI_K2P6_MODEL;
23
24
  var isDeepInfraKimiModel = (model) => model === DEEPINFRA_KIMI_FALLBACK_MODEL;
25
+ var isPlatformKimiProviderModel = (provider, model) => {
26
+ const normalizedProvider = asTrimmedLowercaseString(provider);
27
+ if (normalizedProvider === PLATFORM_HOSTED_KIMI_PROVIDER || normalizedProvider === LEGACY_OLLAMA_CLOUD_PROVIDER) {
28
+ return isOllamaCloudKimiModel(model);
29
+ }
30
+ return false;
31
+ };
32
+ var isPlatformManagedProvider = (provider, model) => {
33
+ const normalized = asTrimmedLowercaseString(provider);
34
+ return isNoloHostedProvider(normalized) || normalized === "deepseek" || isPlatformKimiProviderModel(normalized, model);
35
+ };
24
36
  var resolveFireworksKimiModel = (model) => {
25
37
  if (model === FIREWORKS_KIMI_LATEST_MODEL) {
26
38
  return FIREWORKS_KIMI_CURRENT_MODEL;
@@ -33,8 +45,11 @@ var PLATFORM_HOSTED_CLAUDE_SONNET_5_MODEL = "anthropic/claude-sonnet-5";
33
45
  var PLATFORM_HOSTED_CLAUDE_OPUS_5_MODEL = "anthropic/claude-opus-5";
34
46
  var PLATFORM_HOSTED_CLAUDE_FABLE_5_MODEL = "anthropic/claude-fable-5";
35
47
  var PLATFORM_HOSTED_CLAUDE_HAIKU_45_MODEL = "anthropic/claude-haiku-4-5";
48
+ var PLATFORM_HOSTED_CLAUDE_OPUS_5_5_MODEL = "anthropic/claude-opus-5-5";
49
+ var PLATFORM_HOSTED_CLAUDE_FABLE_5_1_MODEL = "anthropic/claude-fable-5-1";
36
50
  var PLATFORM_HOSTED_GROK_4_6_MODEL = "grok-4.6";
37
51
  var PLATFORM_HOSTED_GPT_6_ASTRA_MODEL = "gpt-6-astra";
52
+ var PLATFORM_HOSTED_GPT_6_LUNA_MODEL = "gpt-6-luna";
38
53
  var PLATFORM_HOSTED_GPT_56_SOL_MODEL = "gpt-5.6-sol";
39
54
  var PLATFORM_HOSTED_GPT_56_TERRA_MODEL = "gpt-5.6-terra";
40
55
  var PLATFORM_HOSTED_GPT_56_LUNA_MODEL = "gpt-5.6-luna";
@@ -50,6 +65,9 @@ var PLATFORM_HOSTED_GEMINI_FLASH_IMAGE_MODEL = "gemini-3.1-flash-image-preview";
50
65
  var PLATFORM_HOSTED_GEMINI_PRO_IMAGE_MODEL = "gemini-3-pro-image-preview";
51
66
  var PLATFORM_HOSTED_GEMINI_FLASH_LITE_IMAGE_MODEL = "gemini-3.1-flash-lite-image";
52
67
  var PLATFORM_HOSTED_OPENAI_IMAGE_MODEL = "gpt-image-2";
68
+ var PLATFORM_HOSTED_MIMO_FLASH_MODEL = "mimo-v2.6-flash";
69
+ var PLATFORM_HOSTED_MIMO_PRO_MODEL = "mimo-v2.6-pro";
70
+ var PLATFORM_HOSTED_MIMO_PRO_ULTRASPEED_MODEL = "mimo-v2.6-pro-ultraspeed";
53
71
  var PLATFORM_HOSTED_DEEPSEEK_FLASH_MODEL = "deepseek-flash";
54
72
  var PLATFORM_HOSTED_DEEPSEEK_FLASH_VISION_EXP_MODEL = "deepseek-v4-flash-vision-exp";
55
73
  var PLATFORM_HOSTED_DEEPSEEK_PRO_MODEL = "deepseek-v4-pro";
@@ -167,8 +185,10 @@ var PLATFORM_HOSTED_ROUTING_TABLE = {
167
185
  agentRunHosted: true
168
186
  },
169
187
  // Claude 系(真实模型):DeepInfra 官方 id 与平台 id 同名,无需重映射。
170
- // DeepInfra 这批模型无缓存价(rate_per_input_token_cached=null),计费侧对
171
- // 无 inputCacheHit 的 deepinfra 模型按 input 全价计(见 calculatePrice)。
188
+ // 旧批模型无缓存价(rate_per_input_token_cached=null),计费侧对无
189
+ // inputCacheHit 的模型按 input 全价计(见 calculatePrice);Fable 5.1 起
190
+ // 官方给出缓存读价(输入 1/4),在 platformHosted.ts 的 price 里带
191
+ // inputCacheHit。
172
192
  [PLATFORM_HOSTED_CLAUDE_SONNET_5_MODEL]: {
173
193
  endpoint: "https://api.deepinfra.com/v1/openai/chat/completions",
174
194
  usageProvider: "deepinfra",
@@ -201,6 +221,23 @@ var PLATFORM_HOSTED_ROUTING_TABLE = {
201
221
  wire: "chat.completions",
202
222
  agentRunHosted: true
203
223
  },
224
+ // 新一代 Claude(2026-09-24 收进广场):同 DeepInfra 通道、官方 id 直传。
225
+ [PLATFORM_HOSTED_CLAUDE_OPUS_5_5_MODEL]: {
226
+ endpoint: "https://api.deepinfra.com/v1/openai/chat/completions",
227
+ usageProvider: "deepinfra",
228
+ keyName: "deepinfra",
229
+ upstreamModelId: PLATFORM_HOSTED_CLAUDE_OPUS_5_5_MODEL,
230
+ wire: "chat.completions",
231
+ agentRunHosted: true
232
+ },
233
+ [PLATFORM_HOSTED_CLAUDE_FABLE_5_1_MODEL]: {
234
+ endpoint: "https://api.deepinfra.com/v1/openai/chat/completions",
235
+ usageProvider: "deepinfra",
236
+ keyName: "deepinfra",
237
+ upstreamModelId: PLATFORM_HOSTED_CLAUDE_FABLE_5_1_MODEL,
238
+ wire: "chat.completions",
239
+ agentRunHosted: true
240
+ },
204
241
  // GPT-6 / GPT-5.6 系(OpenAI 官方 chat.completions):
205
242
  // 平台价按短上下文价目定(长上下文档差价由平台吸收),见 platformHosted.ts。
206
243
  [PLATFORM_HOSTED_GPT_6_ASTRA_MODEL]: {
@@ -210,6 +247,17 @@ var PLATFORM_HOSTED_ROUTING_TABLE = {
210
247
  wire: "chat.completions",
211
248
  agentRunHosted: true
212
249
  },
250
+ // GPT-6 Luna(2026-09-22 随 GPT-6 Sol/Luna 上线;官方模型页
251
+ // developers.openai.com/api/docs/models/gpt-6-luna,2026-09-23 核对):
252
+ // 官方 id 即 `gpt-6-luna`,Chat Completions 与 Responses 端点均可用;
253
+ // 平台托管沿用 GPT-6 系既有 chat.completions 分流(与 astra 同线同源)。
254
+ [PLATFORM_HOSTED_GPT_6_LUNA_MODEL]: {
255
+ endpoint: "https://api.openai.com/v1/chat/completions",
256
+ usageProvider: "openai",
257
+ keyName: "openai",
258
+ wire: "chat.completions",
259
+ agentRunHosted: true
260
+ },
213
261
  [PLATFORM_HOSTED_GPT_56_SOL_MODEL]: {
214
262
  endpoint: "https://api.openai.com/v1/chat/completions",
215
263
  usageProvider: "openai",
@@ -239,6 +287,39 @@ var PLATFORM_HOSTED_ROUTING_TABLE = {
239
287
  wire: "chat.completions",
240
288
  agentRunHosted: false
241
289
  },
290
+ // MiMo V2.6 系 -> 小米官方按量计费 API(api.xiaomimimo.com,key 用 MIMO_API_KEY)。
291
+ // 模型 id 与上游一致,无 upstreamModelId(直传,不做 remap);
292
+ // wire 是 chat.completions(不是 responses 特例,走通用 hostedRoute 分支)。
293
+ //
294
+ // 上游事实(mimo.mi.com 官方文档 /api/chat/openai-api,2026-09-20 版):
295
+ // - `thinking.type` 默认 enabled;平台未显式开启思考时补 {type:"disabled"}
296
+ // (判据同时认 provider=mimo / xiaomimimo.com 端点与下面的托管模型 id);
297
+ // - 同时兼容 `max_tokens` 与 `max_completion_tokens`(实测 200 OK);文档
298
+ // 未提及 `stream_options` / `include_usage`——平台因此不请求
299
+ // include_usage,usage 由响应体自带(含 prompt_tokens_details.cached_tokens,
300
+ // 缓存命中按 inputCacheHit 价计入积分);
301
+ // - 1M 上下文 / 128K 最大输出 / 文本+图+音视频输入(全模态理解)。
302
+ [PLATFORM_HOSTED_MIMO_FLASH_MODEL]: {
303
+ endpoint: "https://api.xiaomimimo.com/v1/chat/completions",
304
+ usageProvider: "mimo",
305
+ keyName: "mimo",
306
+ wire: "chat.completions",
307
+ agentRunHosted: true
308
+ },
309
+ [PLATFORM_HOSTED_MIMO_PRO_MODEL]: {
310
+ endpoint: "https://api.xiaomimimo.com/v1/chat/completions",
311
+ usageProvider: "mimo",
312
+ keyName: "mimo",
313
+ wire: "chat.completions",
314
+ agentRunHosted: true
315
+ },
316
+ [PLATFORM_HOSTED_MIMO_PRO_ULTRASPEED_MODEL]: {
317
+ endpoint: "https://api.xiaomimimo.com/v1/chat/completions",
318
+ usageProvider: "mimo",
319
+ keyName: "mimo",
320
+ wire: "chat.completions",
321
+ agentRunHosted: true
322
+ },
242
323
  // OpenAI Image -> OpenAI Responses API
243
324
  [PLATFORM_HOSTED_OPENAI_IMAGE_MODEL]: {
244
325
  endpoint: "https://api.openai.com/v1/responses",
@@ -415,7 +496,7 @@ function buildClientVersionGateErrorDetail(decision) {
415
496
  // packages/ai/llm/platformHosted.ts
416
497
  var PLATFORM_CREDITS_PER_USD = 8;
417
498
  var toPlatformCredits = (usdPerMillion) => Number((usdPerMillion * PLATFORM_CREDITS_PER_USD).toFixed(6));
418
- var CNY_UPSTREAM_MULTIPLIER = 1.2;
499
+ var CNY_UPSTREAM_MULTIPLIER = 1.1;
419
500
  var toCnyCredits = (cnyPerMillion) => Number((cnyPerMillion * CNY_UPSTREAM_MULTIPLIER).toFixed(6));
420
501
  var PLATFORM_HOSTED_GROK_PRICE = {
421
502
  input: toPlatformCredits(2),
@@ -474,6 +555,20 @@ var PLATFORM_HOSTED_CLAUDE_HAIKU_45_PRICE = {
474
555
  output: toPlatformCredits(5)
475
556
  // 40 credits
476
557
  };
558
+ var PLATFORM_HOSTED_CLAUDE_OPUS_5_5_PRICE = {
559
+ input: toPlatformCredits(4),
560
+ // 32 credits
561
+ output: toPlatformCredits(20)
562
+ // 160 credits
563
+ };
564
+ var PLATFORM_HOSTED_CLAUDE_FABLE_5_1_PRICE = {
565
+ input: toPlatformCredits(10),
566
+ // 80 credits
567
+ inputCacheHit: toPlatformCredits(2.5),
568
+ // 20 credits(官方缓存读 = 输入 1/4)
569
+ output: toPlatformCredits(50)
570
+ // 400 credits
571
+ };
477
572
  var PLATFORM_HOSTED_GPT_6_ASTRA_PRICE = {
478
573
  input: toPlatformCredits(10),
479
574
  // 80 credits
@@ -506,6 +601,14 @@ var PLATFORM_HOSTED_GPT_56_LUNA_PRICE = {
506
601
  output: toPlatformCredits(1.2)
507
602
  // 9.6 credits
508
603
  };
604
+ var PLATFORM_HOSTED_GPT_6_LUNA_PRICE = {
605
+ input: toPlatformCredits(0.1),
606
+ // 0.8 credits
607
+ inputCacheHit: toPlatformCredits(0.01),
608
+ // 0.08 credits
609
+ output: toPlatformCredits(0.5)
610
+ // 4.0 credits
611
+ };
509
612
  var PLATFORM_HOSTED_GLM_53_FLASH_PRICE = {
510
613
  input: toPlatformCredits(0.1),
511
614
  // 0.8 credits
@@ -597,6 +700,40 @@ var createPlatformHostedGeminiImageModel = ({
597
700
  imageGenerationProfiles,
598
701
  supportsTool: false
599
702
  });
703
+ var PLATFORM_HOSTED_MIMO_MODELS = [
704
+ PLATFORM_HOSTED_MIMO_FLASH_MODEL,
705
+ PLATFORM_HOSTED_MIMO_PRO_MODEL,
706
+ PLATFORM_HOSTED_MIMO_PRO_ULTRASPEED_MODEL
707
+ ];
708
+ var isPlatformHostedMimoModel = (model) => {
709
+ const m = asTrimmedLowercaseString(model);
710
+ return PLATFORM_HOSTED_MIMO_MODELS.includes(m);
711
+ };
712
+ var isPlatformMimoProviderModel = (provider, model) => isPlatformManagedProvider(provider) && isPlatformHostedMimoModel(model);
713
+ var PLATFORM_HOSTED_MIMO_FLASH_PRICE = {
714
+ input: toCnyCredits(1),
715
+ // ¥1.00
716
+ inputCacheHit: toCnyCredits(0.02),
717
+ // ¥0.02
718
+ output: toCnyCredits(2)
719
+ // ¥2.00
720
+ };
721
+ var PLATFORM_HOSTED_MIMO_PRO_PRICE = {
722
+ input: toCnyCredits(3),
723
+ // ¥3.00
724
+ inputCacheHit: toCnyCredits(0.025),
725
+ // ¥0.025
726
+ output: toCnyCredits(6)
727
+ // ¥6.00
728
+ };
729
+ var PLATFORM_HOSTED_MIMO_PRO_ULTRASPEED_PRICE = {
730
+ input: toCnyCredits(30),
731
+ // ¥30.00
732
+ inputCacheHit: toCnyCredits(0.25),
733
+ // ¥0.25
734
+ output: toCnyCredits(60)
735
+ // ¥60.00
736
+ };
600
737
  var PLATFORM_HOSTED_DEEPSEEK_FLASH_PEAK_PRICE = {
601
738
  input: toCnyCredits(2),
602
739
  // ¥2
@@ -754,8 +891,42 @@ var platformHostedModels = [
754
891
  supportsReasoningEffort: true,
755
892
  minClientVersion: PLATFORM_HOSTED_GLM_53_FLASH_MIN_CLIENT_VERSION
756
893
  },
757
- // Claude 系(真实 DeepInfra 模型,官方 id 与平台 id 同名):无缓存价,
758
- // 计费按 input 全价(见 calculatePrice 的 deepinfra 分支)。
894
+ // MiMo V2.6 系(小米官方按量计费 API,key 用 MIMO_API_KEY):1M 上下文、
895
+ // 最大输出 128K、原生多模态输入(文本/图/音/视频)、函数调用与深度思考。
896
+ // 能力值来源:mimo.mi.com 模型列表页 + 官方模型目录(max_output_length
897
+ // 131072、context 1048576、input_modalities 含 image/audio/video),2026-09-21。
898
+ {
899
+ name: PLATFORM_HOSTED_MIMO_FLASH_MODEL,
900
+ displayName: "MiMo V2.6 Flash",
901
+ hasVision: true,
902
+ price: { ...PLATFORM_HOSTED_MIMO_FLASH_PRICE },
903
+ maxOutputTokens: 131072,
904
+ contextWindow: 1048576,
905
+ supportsTool: true,
906
+ supportsReasoningEffort: true
907
+ },
908
+ {
909
+ name: PLATFORM_HOSTED_MIMO_PRO_MODEL,
910
+ displayName: "MiMo V2.6 Pro",
911
+ hasVision: true,
912
+ price: { ...PLATFORM_HOSTED_MIMO_PRO_PRICE },
913
+ maxOutputTokens: 131072,
914
+ contextWindow: 1048576,
915
+ supportsTool: true,
916
+ supportsReasoningEffort: true
917
+ },
918
+ {
919
+ name: PLATFORM_HOSTED_MIMO_PRO_ULTRASPEED_MODEL,
920
+ displayName: "MiMo V2.6 Pro Ultraspeed",
921
+ hasVision: true,
922
+ price: { ...PLATFORM_HOSTED_MIMO_PRO_ULTRASPEED_PRICE },
923
+ maxOutputTokens: 131072,
924
+ contextWindow: 1048576,
925
+ supportsTool: true,
926
+ supportsReasoningEffort: true
927
+ },
928
+ // Claude 系(真实 DeepInfra 模型,官方 id 与平台 id 同名):旧批无缓存价,
929
+ // 计费按 input 全价(见 calculatePrice);Fable 5.1 带官方缓存读价。
759
930
  {
760
931
  name: PLATFORM_HOSTED_CLAUDE_SONNET_5_MODEL,
761
932
  displayName: "Claude Sonnet 5",
@@ -792,6 +963,26 @@ var platformHostedModels = [
792
963
  contextWindow: 2e5,
793
964
  supportsTool: false
794
965
  },
966
+ {
967
+ // Claude Opus 5.5(2026-09-22 发布):官方 1M 上下文 / 128K 输出。
968
+ name: PLATFORM_HOSTED_CLAUDE_OPUS_5_5_MODEL,
969
+ displayName: "Claude Opus 5.5",
970
+ hasVision: true,
971
+ price: { ...PLATFORM_HOSTED_CLAUDE_OPUS_5_5_PRICE },
972
+ maxOutputTokens: 128e3,
973
+ contextWindow: 1e6,
974
+ supportsTool: false
975
+ },
976
+ {
977
+ // Claude Fable 5.1:输出上限未获官方数据,沿用 Fable 5 条目口径(4092)。
978
+ name: PLATFORM_HOSTED_CLAUDE_FABLE_5_1_MODEL,
979
+ displayName: "Claude Fable 5.1",
980
+ hasVision: true,
981
+ price: { ...PLATFORM_HOSTED_CLAUDE_FABLE_5_1_PRICE },
982
+ maxOutputTokens: 4092,
983
+ contextWindow: 1e6,
984
+ supportsTool: false
985
+ },
795
986
  // GPT-6 / GPT-5.6 系:OpenAI 官方 chat.completions,平台价按短上下文价目。
796
987
  {
797
988
  name: PLATFORM_HOSTED_GPT_6_ASTRA_MODEL,
@@ -803,6 +994,19 @@ var platformHostedModels = [
803
994
  supportsTool: true,
804
995
  supportsReasoningEffort: true
805
996
  },
997
+ {
998
+ // GPT-6 Luna:官方 1.05M 上下文 / 128k 输出 / 文本+图像输入、文本输出 /
999
+ // reasoning effort none-max(默认 medium);官方 Chat Completions 端点在
1000
+ // reasoning_effort=none 时支持 function calling(与 astra 同线)。
1001
+ name: PLATFORM_HOSTED_GPT_6_LUNA_MODEL,
1002
+ displayName: "GPT-6 Luna",
1003
+ hasVision: true,
1004
+ price: { ...PLATFORM_HOSTED_GPT_6_LUNA_PRICE },
1005
+ maxOutputTokens: 128e3,
1006
+ contextWindow: 105e4,
1007
+ supportsTool: true,
1008
+ supportsReasoningEffort: true
1009
+ },
806
1010
  {
807
1011
  name: PLATFORM_HOSTED_GPT_56_SOL_MODEL,
808
1012
  displayName: "GPT-5.6 Sol",
@@ -1012,6 +1216,11 @@ export {
1012
1216
  PLATFORM_HOSTED_GLM_53_FLASH_BASETEN_PRICE,
1013
1217
  isPlatformHostedOpenAIImageModel,
1014
1218
  isPlatformHostedImageModel,
1219
+ isPlatformMimoProviderModel,
1220
+ PLATFORM_HOSTED_DEEPSEEK_FLASH_PEAK_PRICE,
1221
+ PLATFORM_HOSTED_DEEPSEEK_FLASH_OFF_PEAK_PRICE,
1222
+ PLATFORM_HOSTED_DEEPSEEK_PRO_PEAK_PRICE,
1223
+ PLATFORM_HOSTED_DEEPSEEK_PRO_OFF_PEAK_PRICE,
1015
1224
  getPlatformHostedDeepSeekV4Price,
1016
1225
  isPlatformHostedDeepseekModel,
1017
1226
  isPlatformHostedDeepSeekV4Model,
@@ -1,3 +1,7 @@
1
+ import {
2
+ BUILTIN_NOLO_AGENT_KEY
3
+ } from "./chunk-BNGW5ASC.js";
4
+
1
5
  // packages/ai/tools/agentCapabilities.ts
2
6
  var SYSTEM_AGENT_CAPABILITIES = [
3
7
  {
@@ -13,7 +17,7 @@ var SYSTEM_AGENT_CAPABILITIES = [
13
17
  label: "\u6DF1\u5EA6\u7F51\u9875\u6293\u53D6",
14
18
  description: "\u5728\u666E\u901A\u8054\u7F51\u641C\u7D22\u4E4B\u5916\uFF0C\u7528 Firecrawl \u505A\u7ED3\u6784\u5316\u641C\u7D22\u4E0E\u6574\u9875\u6293\u53D6\uFF0C\u9002\u5408\u9700\u8981\u5B8C\u6574\u6B63\u6587\u3001\u6587\u6863\u7AD9\u70B9\u6216\u7AD9\u5185\u68C0\u7D22\u7684\u573A\u666F\u3002",
15
19
  tools: ["firecrawl_search", "firecrawl_scrape"],
16
- defaultEnabled: true,
20
+ defaultEnabled: false,
17
21
  icon: "\u{1F578}\uFE0F"
18
22
  },
19
23
  {
@@ -43,8 +47,17 @@ var DEFAULT_SYSTEM_AGENT_CAPABILITIES = Object.fromEntries(
43
47
  ])
44
48
  );
45
49
 
50
+ // packages/core/init.ts
51
+ var nolotusId = "0e95801d90";
52
+ var ADMIN_IDS = /* @__PURE__ */ new Set([nolotusId]);
53
+ var isSystemAdmin = (userId) => userId != null && ADMIN_IDS.has(userId);
54
+ var noloAgentId = BUILTIN_NOLO_AGENT_KEY;
55
+
46
56
  export {
47
57
  SYSTEM_AGENT_CAPABILITIES,
48
58
  SYSTEM_AGENT_CAPABILITY_IDS,
49
- DEFAULT_SYSTEM_AGENT_CAPABILITIES
59
+ DEFAULT_SYSTEM_AGENT_CAPABILITIES,
60
+ nolotusId,
61
+ isSystemAdmin,
62
+ noloAgentId
50
63
  };
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  readDbRecord,
3
3
  writeAgentRecord
4
- } from "./chunk-NRALD3CC.js";
4
+ } from "./chunk-76WEAXJB.js";
5
5
  import {
6
6
  buildSkillSummaryMarker
7
7
  } from "./chunk-VF4K2QE6.js";
@@ -10,7 +10,7 @@ import {
10
10
  import {
11
11
  patch,
12
12
  readAndWait
13
- } from "./chunk-YFADVSZE.js";
13
+ } from "./chunk-H62HCIUP.js";
14
14
  import {
15
15
  asOptionalTrimmedString
16
16
  } from "./chunk-G3SUCT4W.js";
@@ -326,7 +326,7 @@ async function saveDocState(arg, { dispatch, getState }) {
326
326
  ).unwrap();
327
327
  if (dbSpaceId) {
328
328
  try {
329
- const { updateContentTitle } = await import("./contentThunks-FSQPOFYG.js");
329
+ const { updateContentTitle } = await import("./contentThunks-ATLWNC2D.js");
330
330
  await dispatch(
331
331
  updateContentTitle({
332
332
  spaceId: dbSpaceId,
@@ -365,7 +365,7 @@ async function saveDocState(arg, { dispatch, getState }) {
365
365
  }
366
366
  }
367
367
  async function createDocState(args, thunkApi) {
368
- const { createPageAction } = await import("./createPageAction-IGMXJOY3.js");
368
+ const { createPageAction } = await import("./createPageAction-WNURYCWU.js");
369
369
  return createPageAction(args, thunkApi);
370
370
  }
371
371
  function subscribe(listener) {
@@ -3,21 +3,21 @@ import {
3
3
  } from "./chunk-YYLHWIW6.js";
4
4
  import {
5
5
  compareAgentSelection
6
- } from "./chunk-ZVN6I33J.js";
6
+ } from "./chunk-IIVGDG4I.js";
7
7
  import {
8
8
  isAntigravityOAuthAgent
9
- } from "./chunk-PGSKWZCB.js";
9
+ } from "./chunk-UZGQNTVW.js";
10
10
  import {
11
11
  getModelAbility
12
- } from "./chunk-NG4UT4K4.js";
12
+ } from "./chunk-ACTMNVHM.js";
13
13
  import {
14
14
  isOwnedAgentKey,
15
15
  ownedAgentKey,
16
16
  publicAgentKey
17
- } from "./chunk-BJIRLHJR.js";
17
+ } from "./chunk-M2EJHDJP.js";
18
18
  import {
19
19
  fnv1a32Hex
20
- } from "./chunk-3RAG2NAD.js";
20
+ } from "./chunk-UKWGR5SS.js";
21
21
 
22
22
  // packages/ai/agent/agentBilling.ts
23
23
  function resolveBillingSource(candidate) {
@@ -420,6 +420,9 @@ function toSafeAgentSummary(record, options) {
420
420
  ...nextAvailableAt !== void 0 ? { nextAvailableAt } : {},
421
421
  ...credentialGroup !== void 0 ? { credentialGroup } : {},
422
422
  ...credentialKind !== void 0 ? { credentialKind } : {},
423
+ // 「未知 ≠ 独立」:无 credentialGroup 时显式 credentialed:false,调用方
424
+ // 不得把缺失解读成独立凭证(并发扇出守卫依赖这个区分)。
425
+ credentialed: credentialGroup !== void 0,
423
426
  updatedAt
424
427
  };
425
428
  }
@@ -446,7 +449,8 @@ var COMPACT_AGENT_SUMMARY_FIELDS = [
446
449
  // 所以通常根本不占字节。
447
450
  "nextAvailableAt",
448
451
  "credentialGroup",
449
- "credentialKind"
452
+ "credentialKind",
453
+ "credentialed"
450
454
  ];
451
455
  function omitNullishAgentSummaryFields(summary) {
452
456
  const result = {};