nolo-cli 0.33.0-alpha.3 → 0.33.0-alpha.30

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 (148) hide show
  1. package/{_executeModel-RWPVI3YV.js → _executeModel-G2YBBSYF.js} +53 -53
  2. package/{action-SMLG6OTB.js → action-4KWNL4XI.js} +10 -10
  3. package/{addContentAction-SFO244QN.js → addContentAction-SUL5AFLY.js} +8 -8
  4. package/{addDialogAgentAction-W44ZCEHB.js → addDialogAgentAction-T645TULN.js} +7 -7
  5. package/{agentDeleteCommand-KU2RXQPP.js → agentDeleteCommand-DZPB57QC.js} +47 -43
  6. package/{agentEmailCommands-MPCMDENS.js → agentEmailCommands-5UPJMRRT.js} +79 -75
  7. package/{agentListCommands-EPD4N6FX.js → agentListCommands-FHWEJ56M.js} +47 -42
  8. package/{agentMachineCommands-AF7C3YRT.js → agentMachineCommands-FNVJTZ3J.js} +44 -40
  9. package/agentProviderCommands-65ZC2WB4.js +122 -0
  10. package/{agentPullCommand-YH5GEBK4.js → agentPullCommand-NYHSK6EW.js} +3 -3
  11. package/{agentRecordCommands-EYE6MZZG.js → agentRecordCommands-JN2L5AMM.js} +70 -66
  12. package/{agentRunCommand-LL22SGTN.js → agentRunCommand-R57HN7XZ.js} +76 -71
  13. package/{agentRuntimeLocal-JX34G47Z.js → agentRuntimeLocal-MXIGYCZW.js} +32 -29
  14. package/{agentSlice-TNMFQQOV.js → agentSlice-L3S542FP.js} +10 -10
  15. package/{appDeleteCommands-43K5VXQB.js → appDeleteCommands-LF6HKT65.js} +39 -35
  16. package/{appDeployCommands-FEEJSVDZ.js → appDeployCommands-S5M2FFQS.js} +39 -35
  17. package/{appDeployStatusCommands-H76CG45R.js → appDeployStatusCommands-AVT2B5LY.js} +39 -35
  18. package/{appGetCommands-MDZYFTYZ.js → appGetCommands-ACH4E3F4.js} +39 -35
  19. package/{appListCommands-TUJJXPWG.js → appListCommands-LKI2VES7.js} +39 -35
  20. package/{authCommand-T7UK4CWS.js → authCommand-AECKBG65.js} +21 -20
  21. package/{authCommands-EAPFGNHN.js → authCommands-W74NRPA6.js} +6 -6
  22. package/{chatQueueReduxAdapter-LVQXC4ZY.js → chatQueueReduxAdapter-WJXO2JCG.js} +23 -22
  23. package/{chunk-HDKRSRYU.js → chunk-326E2B5C.js} +289 -93
  24. package/{chunk-2UECQ7RE.js → chunk-3AOLVADY.js} +1 -1
  25. package/{chunk-M2YMQOLC.js → chunk-3CPL3LU2.js} +11 -11
  26. package/chunk-3Z32AD6X.js +22 -0
  27. package/{chunk-HUCT7HID.js → chunk-42IF53CR.js} +1 -1
  28. package/{chunk-5SBK2MTI.js → chunk-64M2WCLT.js} +23 -70
  29. package/{chunk-LOD75GOS.js → chunk-674FTH5U.js} +3751 -1557
  30. package/{chunk-AOXVOC6D.js → chunk-6O5DMZOS.js} +3 -3
  31. package/{chunk-GMXWYXAF.js → chunk-7AXGPKX5.js} +3 -3
  32. package/{chunk-FMEVI5TG.js → chunk-7CH6U3FL.js} +1 -1
  33. package/{chunk-OR2HNLVO.js → chunk-7EPNNOL4.js} +6 -6
  34. package/{chunk-DFUPZE6V.js → chunk-7SLMYTSF.js} +1 -1
  35. package/{chunk-BQXOGBFN.js → chunk-A2YCVTV6.js} +1 -1
  36. package/{chunk-UK5JGQVU.js → chunk-A3UZKNUI.js} +13 -18
  37. package/{chunk-3GZXL6FM.js → chunk-AOWETAXX.js} +1 -1
  38. package/{chunk-B2BSG6QQ.js → chunk-ASWSPCJH.js} +18 -18
  39. package/{chunk-CLP2K7U4.js → chunk-BP3FSWKY.js} +6 -6
  40. package/{chunk-IHEC7VBF.js → chunk-BW7JSRVT.js} +1 -1
  41. package/{chunk-AAGCMVFT.js → chunk-BYXLXABD.js} +495 -148
  42. package/{chunk-MPZJVZDC.js → chunk-CDSTQJIJ.js} +27 -27
  43. package/{chunk-2H3XIBY4.js → chunk-D2CTCWWG.js} +4 -82
  44. package/{chunk-OIQPORYI.js → chunk-ECHNSF4H.js} +178 -2
  45. package/{chunk-TFPUAELY.js → chunk-EIWIUEOH.js} +2 -2
  46. package/{chunk-JTSGWTYZ.js → chunk-EMKX4VZW.js} +2 -2
  47. package/{chunk-6HYVJV7B.js → chunk-ESHYE7WU.js} +2 -1
  48. package/{chunk-ZURFOV5J.js → chunk-FS5VNMPF.js} +3 -3
  49. package/{chunk-U4TRT5V4.js → chunk-GEPHJJW4.js} +1 -1
  50. package/{chunk-5CS33IBL.js → chunk-GKAQBXBO.js} +11 -12
  51. package/{chunk-M4NC7NF6.js → chunk-GMSUMWFO.js} +2 -2
  52. package/{chunk-JMPYDFHY.js → chunk-HLXJXFXN.js} +21 -8
  53. package/{chunk-I6N2UVVY.js → chunk-JZUS5GOM.js} +1 -1
  54. package/{chunk-RAZOLMJR.js → chunk-KVRWX6K7.js} +2 -2
  55. package/{chunk-VH2F7ZB6.js → chunk-L4O5JAIW.js} +1 -1
  56. package/{chunk-57QJXIB6.js → chunk-L7EJWFAP.js} +9 -9
  57. package/{chunk-DPMBNHOJ.js → chunk-LAZTMWIU.js} +1 -1
  58. package/{chunk-ADLYMQB6.js → chunk-MBUNBGBE.js} +127 -0
  59. package/{chunk-Q5ITEGIN.js → chunk-N4XRDM26.js} +1 -1
  60. package/{chunk-7E72JMBB.js → chunk-N543Q3VR.js} +57 -16
  61. package/{chunk-WHD6BG7M.js → chunk-NEG2ROC2.js} +45 -41
  62. package/{chunk-2IVEXF7P.js → chunk-NMB23CNE.js} +2 -9
  63. package/{chunk-XCCGU6QB.js → chunk-NQWDSCDT.js} +1 -1
  64. package/{chunk-FSSX3XRY.js → chunk-NTOLFNU3.js} +1 -1
  65. package/chunk-OH4Q4VVA.js +38 -0
  66. package/{chunk-37V5LNEQ.js → chunk-OOG3PQCH.js} +1 -1
  67. package/{chunk-3WXRAHCG.js → chunk-OPSKBBSX.js} +3 -3
  68. package/{chunk-AFV4FOT2.js → chunk-OQVRTSZ5.js} +4 -91
  69. package/{chunk-GTYM4HKV.js → chunk-OXLUSM42.js} +5 -5
  70. package/{chunk-YDTYDA5W.js → chunk-PAW3XFD3.js} +8 -6
  71. package/{chunk-PREQU5QV.js → chunk-PECRHVNK.js} +1 -1
  72. package/{chunk-O6GEBMIY.js → chunk-PVJS353C.js} +8861 -8608
  73. package/{chunk-JZPBVBIY.js → chunk-QTZD6HBK.js} +18 -8
  74. package/chunk-TVXJEOU2.js +78 -0
  75. package/{chunk-3VAQHAXT.js → chunk-UFMFWBSG.js} +26 -26
  76. package/{chunk-73GINUCW.js → chunk-UGWIRZO6.js} +129 -50
  77. package/{chunk-NUO3QFWD.js → chunk-UNHKVD2N.js} +1 -1
  78. package/{chunk-GE6IWA5N.js → chunk-UNZDCI3O.js} +126 -1
  79. package/chunk-UOLENXLQ.js +1132 -0
  80. package/{chunk-FXFGNOT2.js → chunk-VFVCYIRQ.js} +1 -1
  81. package/chunk-VIRTYWWE.js +97 -0
  82. package/{chunk-6SXC35F4.js → chunk-VMAK5YKS.js} +12 -12
  83. package/{chunk-ZJMME4DS.js → chunk-W6NT2FW3.js} +6 -6
  84. package/{chunk-2QTEYCR7.js → chunk-X65PIFJI.js} +17 -7
  85. package/{chunk-JZ5AMMXU.js → chunk-XBNLE3MR.js} +3 -3
  86. package/{chunk-WLH5BAKX.js → chunk-YYTTDOWA.js} +2 -2
  87. package/{chunk-X2DAEZ3X.js → chunk-ZFGAPMSF.js} +1 -1
  88. package/{chunk-IL545V3E.js → chunk-ZJVSRWOP.js} +7 -7
  89. package/{cliExecutor-DW3PHGEL.js → cliExecutor-BBUVQU4L.js} +2 -2
  90. package/{codingSkills-DY5MINPG.js → codingSkills-5VOV3JVB.js} +3 -3
  91. package/{createAgentAutomationAction-INQT23LX.js → createAgentAutomationAction-RMKFWLA3.js} +24 -23
  92. package/{createDialogAction-LDCPDI73.js → createDialogAction-BLNYPWJ6.js} +27 -26
  93. package/{createPageAction-5YXOG2M4.js → createPageAction-MSJTHWS7.js} +28 -27
  94. package/{dbSlice-3SD5L5H2.js → dbSlice-YBUD2NZB.js} +7 -7
  95. package/{deleteFile-XQXPBFFB.js → deleteFile-74VF4EAJ.js} +4 -4
  96. package/{dialogCommands-CHJO47AX.js → dialogCommands-JI6X34PB.js} +38 -34
  97. package/{dialogSlice-DOWKOILN.js → dialogSlice-MJAX2T2X.js} +23 -22
  98. package/{docCreateCommands-OVZARUFX.js → docCreateCommands-KNLITDCK.js} +40 -36
  99. package/{docDeleteCommands-E2XJ62LD.js → docDeleteCommands-6SBOU75S.js} +41 -37
  100. package/{docReadCommands-I7OSREPJ.js → docReadCommands-NX77P5X4.js} +40 -36
  101. package/{docStore-UAWSKZ2Y.js → docStore-472FHNNN.js} +25 -24
  102. package/{docUpdateCommands-X4Z26VJM.js → docUpdateCommands-IHWNHH4O.js} +43 -39
  103. package/emscripten-module-EDQBMDVK.js +576 -0
  104. package/emscripten-module-LCBQ7VWY.js +1506 -0
  105. package/emscripten-module-OFHQ7EL3.js +482 -0
  106. package/emscripten-module-XM7NDJQA.js +4536 -0
  107. package/fetchMessages-7QRCCRYK.js +1 -1
  108. package/ffi-6ZSX3QJ4.js +80 -0
  109. package/ffi-742Y76PE.js +92 -0
  110. package/ffi-AEYWSYLM.js +80 -0
  111. package/ffi-KQC27OUM.js +92 -0
  112. package/{getPricing-L2ENXWHV.js → getPricing-J4VXWR5B.js} +4 -4
  113. package/{handleSendMessageAction-C3TSDWKH.js → handleSendMessageAction-V3SKWOOV.js} +26 -25
  114. package/index.js +78 -74
  115. package/{localRuntimeAuthority-E3R24J4T.js → localRuntimeAuthority-S77B5QVB.js} +6 -2
  116. package/{localRuntimeDb-DDZCJFQZ.js → localRuntimeDb-N3H3HQ7G.js} +1 -1
  117. package/{machineCommands-BUOIYJAD.js → machineCommands-ZDULQKUU.js} +80 -76
  118. package/{machineInfo-M6KB6HZN.js → machineInfo-66ZFUMLE.js} +1 -1
  119. package/{machineWsRunDispatch-7CRWAA6O.js → machineWsRunDispatch-XX2LNRJT.js} +68 -64
  120. package/{models-OX2S5C6Q.js → models-FM7YJ47W.js} +2 -2
  121. package/module-ES6BEMUI-AFCVSBMS.js +14 -0
  122. package/module-asyncify-2EFITU5U-DEP2F2QP.js +9 -0
  123. package/package.json +1 -1
  124. package/{read-6G73BMEY.js → read-7SIURKBF.js} +5 -5
  125. package/{readDocTool-DK4EI2GA.js → readDocTool-NWQFQ4IG.js} +1 -1
  126. package/{readlineWorkspace-ZDWEASJV.js → readlineWorkspace-NXB4IBLM.js} +3886 -3344
  127. package/{removeDialogAgentAction-E7H557UO.js → removeDialogAgentAction-S3LYHK4M.js} +11 -11
  128. package/{runAgentClientLoop-U7HYA3O5.js → runAgentClientLoop-TNETRJFJ.js} +50 -49
  129. package/{runtimeDoctorCommands-KIKM6BIO.js → runtimeDoctorCommands-HT4O2PXL.js} +6 -6
  130. package/{setDialogExtraReferencesAction-RMMGBR5F.js → setDialogExtraReferencesAction-L5ET3HEX.js} +8 -8
  131. package/{setPrimaryDialogAgentAction-FWBKKLVA.js → setPrimaryDialogAgentAction-ZZJOZQEM.js} +11 -11
  132. package/{settingSlice-73PV4KG4.js → settingSlice-ZFOZPBI2.js} +9 -9
  133. package/{skillDiscovery-KLLKXPUO.js → skillDiscovery-6YSTRCQ7.js} +3 -3
  134. package/{spaceCommands-GEWZXGHM.js → spaceCommands-CAWUGXJS.js} +44 -40
  135. package/{spaceSlice-B6MOVY4N.js → spaceSlice-J5D3LTMO.js} +24 -23
  136. package/{streamAgentChatTurn-T527EQTT.js → streamAgentChatTurn-YI5O3T4X.js} +104 -114
  137. package/{switchDialogAgentAction-US6QNL3N.js → switchDialogAgentAction-ZWCYLWVK.js} +7 -7
  138. package/{tableCommands-QE47K72R.js → tableCommands-5OKD2DKN.js} +8 -8
  139. package/{tools-XMWCVMPM.js → tools-HI4U6J6S.js} +39 -38
  140. package/{tuiSummaryLlmCaller-NCAJSVSD.js → tuiSummaryLlmCaller-3RC6WWRV.js} +15 -14
  141. package/{updateCommands-AK2RDOFR.js → updateCommands-MNDUIKN7.js} +2 -2
  142. package/{updateDialogTitleAction-XPJZRJEL.js → updateDialogTitleAction-V5H4LWFR.js} +30 -29
  143. package/chunk-6PO2SYCS.js +0 -1800
  144. package/{agentGrantCommands-2LEZDADN.js → agentGrantCommands-OPIGFRDO.js} +2 -2
  145. package/{chunk-ZHYK3N56.js → chunk-G7HTVVFL.js} +3 -3
  146. package/{chunk-SAQQLJZ5.js → chunk-JDSUTNYY.js} +3 -3
  147. package/{chunk-X664KVEV.js → chunk-QM6EN2ES.js} +3 -3
  148. package/{offlineMarxistsAgentCommand-GEH6SNNA.js → offlineMarxistsAgentCommand-HDIQVGKN.js} +3 -3
@@ -11,21 +11,29 @@ import {
11
11
  deleteDialog,
12
12
  resetMsgs,
13
13
  toast
14
- } from "./chunk-73GINUCW.js";
14
+ } from "./chunk-UGWIRZO6.js";
15
15
  import {
16
16
  deleteServerSyncedCredential
17
- } from "./chunk-ZJMME4DS.js";
17
+ } from "./chunk-W6NT2FW3.js";
18
18
  import {
19
19
  require_date_fns
20
20
  } from "./chunk-M76ECQRD.js";
21
- import {
22
- createFileCredentialBroker
23
- } from "./chunk-5CS33IBL.js";
24
21
  import {
25
22
  clearPendingAttachments,
26
23
  clearPendingUserInputQueue,
27
24
  require_react
28
25
  } from "./chunk-MRWGHF56.js";
26
+ import {
27
+ createFileCredentialBroker
28
+ } from "./chunk-GKAQBXBO.js";
29
+ import {
30
+ UNCATEGORIZED_ID,
31
+ addContentAction,
32
+ checkSpaceMembership,
33
+ createSpaceKey,
34
+ localSpaceAuthorityPatchStamp,
35
+ normalizeSpaceId
36
+ } from "./chunk-EMKX4VZW.js";
29
37
  import {
30
38
  toErrorMessage
31
39
  } from "./chunk-HNMXYYJR.js";
@@ -33,18 +41,10 @@ import {
33
41
  isSystemAdmin,
34
42
  selectRemoteServer,
35
43
  selectRemoteSyncServers
36
- } from "./chunk-CLP2K7U4.js";
44
+ } from "./chunk-BP3FSWKY.js";
37
45
  import {
38
46
  asRecordOrEmpty
39
47
  } from "./chunk-KX6YBIHG.js";
40
- import {
41
- UNCATEGORIZED_ID,
42
- addContentAction,
43
- checkSpaceMembership,
44
- createSpaceKey,
45
- localSpaceAuthorityPatchStamp,
46
- normalizeSpaceId
47
- } from "./chunk-JTSGWTYZ.js";
48
48
  import {
49
49
  patch,
50
50
  read,
@@ -57,7 +57,7 @@ import {
57
57
  uploadFileAction,
58
58
  upsertSSREntity,
59
59
  write
60
- } from "./chunk-57QJXIB6.js";
60
+ } from "./chunk-L7EJWFAP.js";
61
61
  import {
62
62
  DB_PREFIX,
63
63
  SEPARATOR,
@@ -86,7 +86,10 @@ import {
86
86
  } from "./chunk-I42VC5KR.js";
87
87
  import {
88
88
  readAction
89
- } from "./chunk-UK5JGQVU.js";
89
+ } from "./chunk-A3UZKNUI.js";
90
+ import {
91
+ extractUserId
92
+ } from "./chunk-BJIRLHJR.js";
90
93
  import {
91
94
  DEVICE_LOCAL_OWNER_ID,
92
95
  asyncThunkCreator,
@@ -102,7 +105,7 @@ import {
102
105
  scheduleWriteReplication,
103
106
  selectIdentityUserId,
104
107
  selectRuntimeSnapshot
105
- } from "./chunk-X664KVEV.js";
108
+ } from "./chunk-QM6EN2ES.js";
106
109
  import {
107
110
  createClientLogger,
108
111
  fetchFromServer,
@@ -114,18 +117,15 @@ import {
114
117
  buildTombstoneRecord,
115
118
  isTombstoneRecord
116
119
  } from "./chunk-GBRG75BQ.js";
120
+ import {
121
+ isRecord
122
+ } from "./chunk-KUG52IAP.js";
117
123
  import {
118
124
  asTrimmedString
119
125
  } from "./chunk-3EUW3WEO.js";
120
126
  import {
121
127
  asOptionalPositiveFiniteNumber
122
128
  } from "./chunk-U6VC4MU4.js";
123
- import {
124
- extractUserId
125
- } from "./chunk-BJIRLHJR.js";
126
- import {
127
- isRecord
128
- } from "./chunk-KUG52IAP.js";
129
129
  import {
130
130
  API_ENDPOINTS,
131
131
  API_VERSION
@@ -6257,11 +6257,11 @@ var ENTITY_DELETE_STRATEGIES = {
6257
6257
  await dispatch(deleteTable({ dbKey: key })).unwrap();
6258
6258
  },
6259
6259
  file: async (key, { thunkAPI }) => {
6260
- const { deleteFileAction } = await import("./deleteFile-XQXPBFFB.js");
6260
+ const { deleteFileAction } = await import("./deleteFile-74VF4EAJ.js");
6261
6261
  await deleteFileAction(key, thunkAPI);
6262
6262
  },
6263
6263
  image: async (key, { thunkAPI }) => {
6264
- const { deleteFileAction } = await import("./deleteFile-XQXPBFFB.js");
6264
+ const { deleteFileAction } = await import("./deleteFile-74VF4EAJ.js");
6265
6265
  await deleteFileAction(key, thunkAPI);
6266
6266
  },
6267
6267
  agent: async (key, { dispatch, userId, sourceServerOrigin }) => {
@@ -9686,7 +9686,7 @@ var fetchSpaceAction = async (input, thunkAPI) => {
9686
9686
  const spaceKey = createSpaceKey.space(spaceId);
9687
9687
  const readSpace = async (dbKey) => {
9688
9688
  try {
9689
- const { read: read2, readAndWait: readAndWait2 } = await import("./dbSlice-3SD5L5H2.js");
9689
+ const { read: read2, readAndWait: readAndWait2 } = await import("./dbSlice-YBUD2NZB.js");
9690
9690
  if (fresh) {
9691
9691
  return await dispatch(readAndWait2(dbKey)).unwrap();
9692
9692
  }
@@ -10100,7 +10100,7 @@ var spaceSlice = createSliceWithThunks3({
10100
10100
  markDialogRead: create.asyncThunk(
10101
10101
  async (payload, thunkAPI) => {
10102
10102
  if (payload.dialogKey) {
10103
- const { patch: patch2 } = await import("./dbSlice-3SD5L5H2.js");
10103
+ const { patch: patch2 } = await import("./dbSlice-YBUD2NZB.js");
10104
10104
  try {
10105
10105
  await thunkAPI.dispatch(
10106
10106
  patch2({ dbKey: payload.dialogKey, changes: { unreadAt: null } })
@@ -1,87 +1,12 @@
1
1
  import {
2
2
  MODEL_LOOKUP_MAP
3
- } from "./chunk-DFUPZE6V.js";
3
+ } from "./chunk-7SLMYTSF.js";
4
4
  import {
5
5
  ALL_MODELS
6
- } from "./chunk-2QTEYCR7.js";
6
+ } from "./chunk-X65PIFJI.js";
7
7
  import {
8
- PUBLIC_DEEPSEEK_V4_FLASH_AGENT_KEY,
9
- builtinAgentCatalogEntryById,
10
- builtinRuntimeFallbackEntries,
11
- isBuiltinPlatformAgentKey
12
- } from "./chunk-UK5JGQVU.js";
13
- import {
14
- parsePublicAgentId,
15
- publicAgentKey
16
- } from "./chunk-BJIRLHJR.js";
17
-
18
- // packages/agent-runtime/builtinPlatformAgentConfigs.ts
19
- function buildConfig(e) {
20
- const key = publicAgentKey(e.id);
21
- const rawRecord = {
22
- dbKey: key,
23
- isPublic: true,
24
- provider: e.provider,
25
- model: e.model,
26
- apiSource: e.apiSource ?? "platform",
27
- useServerProxy: e.useServerProxy ?? true
28
- };
29
- if (e.hasImageOutput) rawRecord.hasImageOutput = true;
30
- if (e.imageModel) rawRecord.imageModel = e.imageModel;
31
- if (e.imageWorkflow) rawRecord.imageWorkflow = e.imageWorkflow;
32
- if (e.imageConfig) rawRecord.imageConfig = e.imageConfig;
33
- return {
34
- key,
35
- name: e.name,
36
- provider: e.provider,
37
- model: e.model,
38
- apiSource: e.apiSource ?? "platform",
39
- useServerProxy: e.useServerProxy ?? true,
40
- rawRecord
41
- };
42
- }
43
- var BUILTIN_PLATFORM_AGENT_CONFIGS = Object.fromEntries(
44
- builtinRuntimeFallbackEntries().map((e) => [publicAgentKey(e.id), buildConfig(e)])
45
- );
46
- function resolveBuiltinPlatformAgentConfig(agentRef) {
47
- return BUILTIN_PLATFORM_AGENT_CONFIGS[agentRef] ?? null;
48
- }
49
- function resolveBuiltinPlatformAgentRecord(agentRef) {
50
- const config = resolveBuiltinPlatformAgentConfig(agentRef);
51
- if (!config) return null;
52
- return {
53
- ...config.rawRecord,
54
- dbKey: agentRef,
55
- ...config.name ? { name: config.name } : {}
56
- };
57
- }
58
- function resolveBuiltinAgentRuntimeFields(agentKey) {
59
- if (!isBuiltinPlatformAgentKey(agentKey)) return null;
60
- const entry = builtinAgentCatalogEntryById(parsePublicAgentId(agentKey));
61
- if (!entry) return null;
62
- return { provider: entry.provider, model: entry.model };
63
- }
64
- function applyBuiltinAgentRuntimeOverride(agentKey, record) {
65
- const fields = resolveBuiltinAgentRuntimeFields(agentKey);
66
- if (!fields) return record;
67
- const current = record;
68
- const rawNeedsOverride = current.rawRecord != null && (current.rawRecord.provider !== fields.provider || current.rawRecord.model !== fields.model);
69
- if (current.provider === fields.provider && current.model === fields.model && !rawNeedsOverride) {
70
- return record;
71
- }
72
- return {
73
- ...record,
74
- provider: fields.provider,
75
- model: fields.model,
76
- ...current.rawRecord ? {
77
- rawRecord: {
78
- ...current.rawRecord,
79
- provider: fields.provider,
80
- model: fields.model
81
- }
82
- } : {}
83
- };
84
- }
8
+ PUBLIC_DEEPSEEK_V4_FLASH_AGENT_KEY
9
+ } from "./chunk-A3UZKNUI.js";
85
10
 
86
11
  // packages/ai/llm/getModelContextWindow.ts
87
12
  var DEFAULT_CONTEXT_WINDOW = 256e3;
@@ -228,9 +153,6 @@ var DEFAULT_AUTO_EXECUTION_PROFILE = AUTO_EXECUTION_PROFILES[DEFAULT_AUTO_EXECUT
228
153
  var resolveAutoExecutionProfile = (tier) => AUTO_EXECUTION_PROFILES[tier ?? DEFAULT_AUTO_EXECUTION_TIER] ?? DEFAULT_AUTO_EXECUTION_PROFILE;
229
154
 
230
155
  export {
231
- resolveBuiltinPlatformAgentConfig,
232
- resolveBuiltinPlatformAgentRecord,
233
- applyBuiltinAgentRuntimeOverride,
234
156
  DEFAULT_CONTEXT_WINDOW,
235
157
  getModelContextWindow,
236
158
  getModelInfo,
@@ -1,16 +1,125 @@
1
+ import {
2
+ findModelConfig,
3
+ getProviderByModelName
4
+ } from "./chunk-7SLMYTSF.js";
1
5
  import {
2
6
  asOptionalFiniteNumber
3
7
  } from "./chunk-WWC7I6TA.js";
4
8
  import {
5
- asTrimmedString
6
- } from "./chunk-3EUW3WEO.js";
9
+ asTrimmedLowercaseString
10
+ } from "./chunk-QSJ3HFEF.js";
7
11
  import {
8
12
  isRecord
9
13
  } from "./chunk-KUG52IAP.js";
14
+ import {
15
+ asTrimmedString
16
+ } from "./chunk-3EUW3WEO.js";
10
17
  import {
11
18
  asOptionalTrimmedString
12
19
  } from "./chunk-G3SUCT4W.js";
13
20
 
21
+ // packages/ai/llm/agentCapabilities.ts
22
+ var ANTIGRAVITY_EFFORT_SUFFIXES = [
23
+ "-tiered",
24
+ "-extra-low",
25
+ "-low",
26
+ "-medium",
27
+ "-high"
28
+ ];
29
+ function stripEffortSuffix(model) {
30
+ for (const suffix of ANTIGRAVITY_EFFORT_SUFFIXES) {
31
+ if (model.endsWith(suffix) && model.length > suffix.length) {
32
+ return model.slice(0, -suffix.length);
33
+ }
34
+ }
35
+ return model;
36
+ }
37
+ function stripPreviewSuffix(model) {
38
+ const suffix = "-preview";
39
+ if (model.endsWith(suffix) && model.length > suffix.length) {
40
+ return model.slice(0, -suffix.length);
41
+ }
42
+ return model;
43
+ }
44
+ var lookupKnownModelVision = (provider, model) => {
45
+ if (!model) return void 0;
46
+ const candidates = [model];
47
+ const strippedEffort = stripEffortSuffix(model);
48
+ if (strippedEffort !== model) candidates.push(strippedEffort);
49
+ const strippedPreview = stripPreviewSuffix(model);
50
+ if (strippedPreview !== model) candidates.push(strippedPreview);
51
+ for (const candidate of candidates) {
52
+ if (provider && provider !== "custom") {
53
+ const direct = findModelConfig(provider, candidate);
54
+ if (direct && typeof direct.hasVision === "boolean") return direct.hasVision;
55
+ }
56
+ const detected = getProviderByModelName(candidate);
57
+ if (detected) {
58
+ const found = findModelConfig(detected, candidate)?.hasVision;
59
+ if (found !== void 0) return found;
60
+ }
61
+ if (candidate.includes("/")) {
62
+ const slash = candidate.indexOf("/");
63
+ const modelProvider = candidate.slice(0, slash).toLowerCase();
64
+ const modelName = candidate.slice(slash + 1);
65
+ const nested = findModelConfig(modelProvider, modelName);
66
+ if (nested && typeof nested.hasVision === "boolean") return nested.hasVision;
67
+ }
68
+ }
69
+ return void 0;
70
+ };
71
+ var resolveAgentImageInputSupport = (agent) => {
72
+ if (!agent) return true;
73
+ const provider = asTrimmedLowercaseString(agent.provider) || null;
74
+ const model = asOptionalTrimmedString(agent.model) ?? "";
75
+ const catalogHasVision = lookupKnownModelVision(
76
+ provider,
77
+ model
78
+ );
79
+ if (catalogHasVision !== void 0) {
80
+ return catalogHasVision;
81
+ }
82
+ if (typeof agent.hasVision === "boolean") {
83
+ return agent.hasVision;
84
+ }
85
+ return true;
86
+ };
87
+
88
+ // packages/ai/agent/imagePreprocessing.ts
89
+ function extractImageUrlsFromMessages(messages) {
90
+ const urls = [];
91
+ for (const msg of messages) {
92
+ if (!Array.isArray(msg.content)) continue;
93
+ for (const part of msg.content) {
94
+ if (part && typeof part === "object" && part.type === "image_url" && part.image_url && typeof part.image_url.url === "string" && part.image_url.url.trim()) {
95
+ urls.push(part.image_url.url);
96
+ }
97
+ }
98
+ }
99
+ return urls;
100
+ }
101
+ function hasImageInRuntimeMessages(messages) {
102
+ return extractImageUrlsFromMessages(messages).length > 0;
103
+ }
104
+ var IMAGE_OMITTED_PLACEHOLDER = "[Image content omitted: model does not support image input]";
105
+ function stripImagePartsFromContent(content) {
106
+ if (!Array.isArray(content)) return content;
107
+ const filtered = content.filter((part) => part?.type !== "image_url");
108
+ if (filtered.length === 0) return IMAGE_OMITTED_PLACEHOLDER;
109
+ return filtered;
110
+ }
111
+ function stripImagePartsFromMessages(messages) {
112
+ return messages.map((msg) => ({
113
+ ...msg,
114
+ content: stripImagePartsFromContent(msg.content)
115
+ }));
116
+ }
117
+ async function stripImagePartsForTextOnlyAgent(messages, agentConfig) {
118
+ const supportsVision = resolveAgentImageInputSupport(agentConfig);
119
+ const hasImages = hasImageInRuntimeMessages(messages);
120
+ return { messages: !supportsVision && hasImages ? stripImagePartsFromMessages(messages) : messages };
121
+ }
122
+
14
123
  // packages/agent-runtime/agentRecordConfig.ts
15
124
  function stringField(record, key) {
16
125
  const value = record[key];
@@ -97,6 +206,63 @@ function resolveAgentRuntimeConfigFromRecord(key, record) {
97
206
  };
98
207
  }
99
208
 
209
+ // packages/ai/agent/toolOutputPolicy.ts
210
+ var MAX_HISTORICAL_TOOL_CONTENT_CHARS = 1600;
211
+ var MAX_IN_TURN_TOOL_CONTENT_CHARS = 4e3;
212
+ var FRESH_TOOL_OUTPUT_MAX_CHARS = 32e3;
213
+ var DEFAULT_TOOL_OUTPUT_PROFILE = {
214
+ maxChars: MAX_IN_TURN_TOOL_CONTENT_CHARS,
215
+ headRatio: 0.5
216
+ };
217
+ var TOOL_OUTPUT_PROFILES = {
218
+ readFile: { maxChars: 4800, headRatio: 0.68, historicalMaxChars: 4800 },
219
+ read_file: { maxChars: 4800, headRatio: 0.68, historicalMaxChars: 4800 },
220
+ readWorkspaceFile: { maxChars: 4800, headRatio: 0.68, historicalMaxChars: 4800 },
221
+ searchFiles: { maxChars: 3600, headRatio: 0.78 },
222
+ search_files: { maxChars: 3600, headRatio: 0.78 },
223
+ listFiles: { maxChars: 2800, headRatio: 0.85 },
224
+ globFiles: { maxChars: 2800, headRatio: 0.85 },
225
+ execShell: { maxChars: 4e3, headRatio: 0.35 },
226
+ runCommand: { maxChars: 4e3, headRatio: 0.35 },
227
+ launchProcess: { maxChars: 2800, headRatio: 0.35 },
228
+ editFile: { maxChars: 2800, headRatio: 0.62 },
229
+ writeFile: { maxChars: 2400, headRatio: 0.62 },
230
+ readPastedText: { maxChars: 4800, headRatio: 0.5, historicalMaxChars: 4800 }
231
+ };
232
+ function resolveToolOutputProfile(toolName) {
233
+ return (toolName ? TOOL_OUTPUT_PROFILES[toolName] : void 0) ?? DEFAULT_TOOL_OUTPUT_PROFILE;
234
+ }
235
+ function resolveHistoricalToolContentCap(toolName, historicalMaxChars) {
236
+ const profile = toolName ? TOOL_OUTPUT_PROFILES[toolName] : void 0;
237
+ return profile?.historicalMaxChars !== void 0 ? Math.max(historicalMaxChars, profile.historicalMaxChars) : historicalMaxChars;
238
+ }
239
+ function projectToolMessageContent(input) {
240
+ const { content, isFresh, toolName, historicalMaxChars } = input;
241
+ if (isFresh) {
242
+ if (content.length <= FRESH_TOOL_OUTPUT_MAX_CHARS) return content;
243
+ return clipToolText(
244
+ content,
245
+ FRESH_TOOL_OUTPUT_MAX_CHARS,
246
+ resolveToolOutputProfile(toolName).headRatio,
247
+ `
248
+ \u2026[\u622A\u65AD\uFF0C\u539F\u59CB\u957F\u5EA6 ${content.length} \u5B57\u7B26]`
249
+ );
250
+ }
251
+ const cap = resolveHistoricalToolContentCap(toolName, historicalMaxChars);
252
+ if (content.length <= cap) return content;
253
+ return content.slice(0, cap) + `
254
+ \u2026[\u622A\u65AD\uFF0C\u539F\u59CB\u957F\u5EA6 ${content.length} \u5B57\u7B26]`;
255
+ }
256
+ function clipToolText(content, maxChars, headRatio, marker = "\n\n[... tool output middle omitted; head/tail preserved ...]\n\n") {
257
+ const normalized = content.replace(/\r\n/g, "\n").trim();
258
+ if (normalized.length <= maxChars) return normalized;
259
+ if (maxChars <= marker.length + 2) return normalized.slice(0, maxChars);
260
+ const available = maxChars - marker.length;
261
+ const headChars = Math.max(1, Math.floor(available * headRatio));
262
+ const tailChars = Math.max(1, available - headChars);
263
+ return `${normalized.slice(0, headChars)}${marker}${normalized.slice(-tailChars)}`;
264
+ }
265
+
100
266
  // packages/agent-runtime/desktopRequestSnapshot.ts
101
267
  var DESKTOP_AGENT_CONFIG_SNAPSHOT_STRING_FIELDS = [
102
268
  "name",
@@ -376,6 +542,16 @@ function assertDesktopAgentRuntimeTurnBodyHasNoRawSecrets(body) {
376
542
  }
377
543
 
378
544
  export {
545
+ resolveAgentImageInputSupport,
546
+ hasImageInRuntimeMessages,
547
+ stripImagePartsFromMessages,
548
+ stripImagePartsForTextOnlyAgent,
549
+ MAX_HISTORICAL_TOOL_CONTENT_CHARS,
550
+ FRESH_TOOL_OUTPUT_MAX_CHARS,
551
+ resolveToolOutputProfile,
552
+ resolveHistoricalToolContentCap,
553
+ projectToolMessageContent,
554
+ clipToolText,
379
555
  resolveAgentRuntimeConfigFromRecord,
380
556
  buildDesktopAgentRuntimeAgentConfigSnapshot,
381
557
  buildDesktopAgentRuntimeDialogHistorySnapshot,
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  selectCurrentServer,
3
3
  selectRemoteServers
4
- } from "./chunk-CLP2K7U4.js";
4
+ } from "./chunk-BP3FSWKY.js";
5
5
  import {
6
6
  createUserKey,
7
7
  extractAgentInfo,
@@ -16,7 +16,7 @@ import {
16
16
  noloWriteRequest,
17
17
  selectIdentityUser,
18
18
  selectIdentityUserId
19
- } from "./chunk-X664KVEV.js";
19
+ } from "./chunk-QM6EN2ES.js";
20
20
  import {
21
21
  normalizeTimeFields
22
22
  } from "./chunk-WJSW43QZ.js";
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  patch,
3
3
  read
4
- } from "./chunk-57QJXIB6.js";
4
+ } from "./chunk-L7EJWFAP.js";
5
5
  import {
6
6
  DEVICE_LOCAL_OWNER_ID,
7
7
  isDeviceLocalSpaceBody,
8
8
  selectIdentityUserId
9
- } from "./chunk-X664KVEV.js";
9
+ } from "./chunk-QM6EN2ES.js";
10
10
 
11
11
  // packages/create/space/spaceKeys.ts
12
12
  var SEPARATOR = "-";
@@ -66,7 +66,8 @@ function detectRuntimeCapabilities(options = {}) {
66
66
  // packages/connector-experimental/machineInfo.ts
67
67
  var CONNECTOR_VERSION = "0.1.0-experimental";
68
68
  function defaultMachineIdPath() {
69
- return join2(homedir(), ".nolo", "machine-id");
69
+ const noloHome = process.env.NOLO_HOME?.trim();
70
+ return noloHome ? join2(noloHome, "machine-id") : join2(homedir(), ".nolo", "machine-id");
70
71
  }
71
72
  function resolveMachineId(path = defaultMachineIdPath()) {
72
73
  try {
@@ -1,9 +1,9 @@
1
- import {
2
- buildSkillDiscoveryLayer
3
- } from "./chunk-2UECQ7RE.js";
4
1
  import {
5
2
  load
6
3
  } from "./chunk-KHCLMKZZ.js";
4
+ import {
5
+ buildSkillDiscoveryLayer
6
+ } from "./chunk-3AOLVADY.js";
7
7
 
8
8
  // packages/agent-runtime/skillDiscovery.ts
9
9
  import { existsSync, readFileSync, readdirSync, statSync } from "node:fs";
@@ -194,7 +194,7 @@ function readCliAuthorityDriver(env) {
194
194
  function resolveCliAuthorityRunDir(options = {}) {
195
195
  return path.join(resolveNoloHome({
196
196
  ...options,
197
- env: options.env ?? {}
197
+ env: options.env ?? process.env
198
198
  }), "run");
199
199
  }
200
200
  function hashString(value) {
@@ -1,18 +1,18 @@
1
1
  import {
2
2
  getCredentialsDir
3
- } from "./chunk-JZPBVBIY.js";
3
+ } from "./chunk-QTZD6HBK.js";
4
4
  import {
5
5
  asNonEmptyStringArray
6
6
  } from "./chunk-I42VC5KR.js";
7
+ import {
8
+ isRecord
9
+ } from "./chunk-KUG52IAP.js";
7
10
  import {
8
11
  asTrimmedString
9
12
  } from "./chunk-3EUW3WEO.js";
10
13
  import {
11
14
  asOptionalPositiveFiniteNumber
12
15
  } from "./chunk-U6VC4MU4.js";
13
- import {
14
- isRecord
15
- } from "./chunk-KUG52IAP.js";
16
16
 
17
17
  // packages/agent-runtime/fileCredentialBroker.ts
18
18
  import {
@@ -23,7 +23,6 @@ import {
23
23
  unlinkSync,
24
24
  writeFileSync
25
25
  } from "node:fs";
26
- import { homedir } from "node:os";
27
26
  import { join } from "node:path";
28
27
 
29
28
  // packages/agent-runtime/credentialBroker.ts
@@ -39,7 +38,7 @@ function assertCredentialRef(ref) {
39
38
  }
40
39
 
41
40
  // packages/agent-runtime/fileCredentialBroker.ts
42
- function getApiKeyCredentialsDir(homeDir = homedir()) {
41
+ function getApiKeyCredentialsDir(homeDir) {
43
42
  return join(getCredentialsDir(homeDir), "keys");
44
43
  }
45
44
  function credentialRefToFileName(ref) {
@@ -49,7 +48,7 @@ function credentialRefToFileName(ref) {
49
48
  }
50
49
  return `${safe}.json`;
51
50
  }
52
- function getApiKeyCredentialPath(ref, homeDir = homedir()) {
51
+ function getApiKeyCredentialPath(ref, homeDir) {
53
52
  return join(getApiKeyCredentialsDir(homeDir), credentialRefToFileName(ref));
54
53
  }
55
54
  function ensurePrivateDir(dir) {
@@ -66,7 +65,7 @@ function writePrivateFile(path, body) {
66
65
  } catch {
67
66
  }
68
67
  }
69
- function readApiKeyCredential(ref, homeDir = homedir()) {
68
+ function readApiKeyCredential(ref, homeDir) {
70
69
  const path = getApiKeyCredentialPath(ref, homeDir);
71
70
  if (!existsSync(path)) return null;
72
71
  try {
@@ -78,7 +77,7 @@ function readApiKeyCredential(ref, homeDir = homedir()) {
78
77
  return null;
79
78
  }
80
79
  }
81
- function writeApiKeyCredential(ref, secret, homeDir = homedir(), now = Date.now()) {
80
+ function writeApiKeyCredential(ref, secret, homeDir, now = Date.now()) {
82
81
  const trimmedSecret = secret.trim();
83
82
  if (!trimmedSecret) {
84
83
  throw new Error("Cannot store an empty credential secret.");
@@ -94,17 +93,17 @@ function writeApiKeyCredential(ref, secret, homeDir = homedir(), now = Date.now(
94
93
  writePrivateFile(path, `${JSON.stringify(payload, null, 2)}
95
94
  `);
96
95
  }
97
- function removeApiKeyCredential(ref, homeDir = homedir()) {
96
+ function removeApiKeyCredential(ref, homeDir) {
98
97
  assertCredentialRef(ref);
99
98
  const path = getApiKeyCredentialPath(ref, homeDir);
100
99
  if (!existsSync(path)) return;
101
100
  unlinkSync(path);
102
101
  }
103
- function hasApiKeyCredential(ref, homeDir = homedir()) {
102
+ function hasApiKeyCredential(ref, homeDir) {
104
103
  return readApiKeyCredential(ref, homeDir) !== null;
105
104
  }
106
105
  function createFileCredentialBroker(options = {}) {
107
- const homeDir = options.homeDir ?? homedir();
106
+ const homeDir = options.homeDir;
108
107
  const now = options.now ?? Date.now;
109
108
  return {
110
109
  get(ref) {
@@ -1,13 +1,13 @@
1
1
  import {
2
2
  i18n_default,
3
3
  toolRegistry
4
- } from "./chunk-HDKRSRYU.js";
4
+ } from "./chunk-326E2B5C.js";
5
5
  import {
6
6
  canonicalizeToolNames
7
7
  } from "./chunk-ZZ2MH7LE.js";
8
8
  import {
9
9
  isNoloHostedProvider
10
- } from "./chunk-OR2HNLVO.js";
10
+ } from "./chunk-7EPNNOL4.js";
11
11
  import {
12
12
  asTrimmedLowercaseString
13
13
  } from "./chunk-QSJ3HFEF.js";
@@ -1,6 +1,9 @@
1
+ import {
2
+ clearCliLocalRuntimePreparedAgentCache
3
+ } from "./chunk-PVJS353C.js";
1
4
  import {
2
5
  getReadableCliDb
3
- } from "./chunk-NUO3QFWD.js";
6
+ } from "./chunk-UNHKVD2N.js";
4
7
  import {
5
8
  buildCreatedAgentRecord,
6
9
  buildUpdatedAgentRecord,
@@ -9,10 +12,7 @@ import {
9
12
  resolveAgentRecordFromHybridStore,
10
13
  sanitizeAgentRecordForCliOutput,
11
14
  writeAgentRecord
12
- } from "./chunk-YDTYDA5W.js";
13
- import {
14
- clearCliLocalRuntimePreparedAgentCache
15
- } from "./chunk-O6GEBMIY.js";
15
+ } from "./chunk-PAW3XFD3.js";
16
16
  import {
17
17
  resolveCliAgentKeyInput
18
18
  } from "./chunk-EKLRRZIN.js";
@@ -94,7 +94,7 @@ async function runAgentUpdateCommand(args, deps = {}) {
94
94
  }
95
95
  if (!parsed) {
96
96
  output.write(
97
- "Usage: nolo agent update <agent> [--model <id>] [--cli-provider <provider>] [--api-source <source>] [--max-concurrent <n>] [--expires-at <iso>] [--prompt <text> | --prompt-file <path> | --prompt-doc <pageKey>] [--tools <json>] [--copy-provider-from <agent>] [--field key=value]\n".replace("[--field key=value]", `[--handle <name>] [--field key=value] (e.g. --field disabledTools='["exa_search"]' to disable default tools)`)
97
+ "Usage: nolo agent update <agent> [--model <id>] [--cli-provider <provider>] [--api-source <source>] [--max-concurrent <n>] [--expires-at <iso>] [--prompt <text> | --prompt-file <path> | --prompt-doc <pageKey>] [--tools <json>] [--copy-provider-from <agent>] [--name <name>] [--custom-provider-url <url>] [--api-key <key>|--provider-api-key <key>] [--field key=value]\n".replace("[--field key=value]", `[--handle <name>] [--field key=value] (e.g. --field disabledTools='["exa_search"]' to disable default tools)`)
98
98
  );
99
99
  return args[0] ? 0 : 1;
100
100
  }
@@ -167,7 +167,7 @@ async function runAgentCreateCommand(args, deps = {}) {
167
167
  }
168
168
  if (!parsed) {
169
169
  output.write(
170
- "Usage: nolo agent create <agent> [--model <id>] [--cli-provider <provider>] [--api-source <source>] [--max-concurrent <n>] [--expires-at <iso>] [--prompt <text> | --prompt-file <path> | --prompt-doc <pageKey>] [--tools <json>] [--copy-provider-from <agent>] [--name <name>] [--custom-provider-url <url>] [--provider-api-key <key>] [--field key=value]\n".replace("[--field key=value]", "[--handle <name>] [--field key=value]")
170
+ "Usage: nolo agent create <agent> [--model <id>] [--cli-provider <provider>] [--api-source <source>] [--max-concurrent <n>] [--expires-at <iso>] [--prompt <text> | --prompt-file <path> | --prompt-doc <pageKey>] [--tools <json>] [--copy-provider-from <agent>] [--name <name>] [--custom-provider-url <url>] [--api-key <key>|--provider-api-key <key>] [--verify] [--field key=value]\n".replace("[--field key=value]", "[--handle <name>] [--field key=value]")
171
171
  );
172
172
  return args[0] ? 0 : 1;
173
173
  }
@@ -210,12 +210,25 @@ async function runAgentCreateCommand(args, deps = {}) {
210
210
  serverOrigin: built.serverUrl
211
211
  });
212
212
  clearCliLocalRuntimePreparedAgentCache();
213
+ let verifyResult;
214
+ if (parsed.verify) {
215
+ const { verifyCustomProvider } = await import("./agentProviderCommands-65ZC2WB4.js");
216
+ const rec = built.nextRecord;
217
+ verifyResult = await verifyCustomProvider({
218
+ providerUrl: rec.customProviderUrl,
219
+ apiKey: rec.apiKey,
220
+ model: rec.model,
221
+ prompt: parsed.verifyPrompt,
222
+ fetchImpl
223
+ });
224
+ }
213
225
  output.write(JSON.stringify({
214
226
  ok: true,
215
227
  agentKey: built.agentKey,
216
228
  baseUrl: built.serverUrl,
217
229
  updates: sanitizeAgentRecordForCliOutput(built.updates),
218
- record: sanitizeAgentRecordForCliOutput(built.nextRecord)
230
+ record: sanitizeAgentRecordForCliOutput(built.nextRecord),
231
+ ...verifyResult ? { verify: verifyResult } : {}
219
232
  }, null, 2));
220
233
  output.write("\n");
221
234
  return 0;