nolo-cli 0.54.0-alpha.1 → 0.54.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 (146) hide show
  1. package/{_executeModel-IVEOJ7L6.js → _executeModel-OPTKYHJA.js} +53 -48
  2. package/{action-IU6ON7ZB.js → action-ORXWW2ZG.js} +9 -9
  3. package/{addContentAction-5V5CCI3I.js → addContentAction-53BZ34AE.js} +9 -8
  4. package/{addDialogAgentAction-KF3KZZNZ.js → addDialogAgentAction-JRYUS54Y.js} +11 -10
  5. package/{agentDeleteCommand-D7AFLKQN.js → agentDeleteCommand-FJIWU2BS.js} +31 -29
  6. package/{agentEmailCommands-MXFZGF54.js → agentEmailCommands-CE32L43B.js} +62 -58
  7. package/{agentListCommands-MP732Q23.js → agentListCommands-VJNKULIK.js} +43 -34
  8. package/{agentMachineCommands-352JFJX4.js → agentMachineCommands-HCJ3WQXL.js} +31 -29
  9. package/agentRecordCommands-QFWERED4.js +119 -0
  10. package/{agentRunCommand-UUWJMH7J.js → agentRunCommand-G3GQMUNN.js} +70 -59
  11. package/{agentRunControl-4GHHSXFZ.js → agentRunControl-INKFDXDA.js} +3 -1
  12. package/{agentRuntimeLocal-KWBPJ53H.js → agentRuntimeLocal-K327ELSL.js} +31 -27
  13. package/{agentSlice-V742SNKC.js → agentSlice-ODKF4J6M.js} +9 -9
  14. package/{agentSuperviseCommands-VB6BUS5H.js → agentSuperviseCommands-5AR3DKNN.js} +2 -2
  15. package/{appDeleteCommands-GV4TF52A.js → appDeleteCommands-XUXMFDI4.js} +32 -30
  16. package/{appDeployCommands-EZMUPNSW.js → appDeployCommands-37F4GPCU.js} +32 -30
  17. package/{appDeployStatusCommands-AAGELKAN.js → appDeployStatusCommands-WSPU7TUK.js} +32 -30
  18. package/{appGetCommands-W37KDAON.js → appGetCommands-YLOBA3EM.js} +32 -30
  19. package/{appListCommands-IFDWBBNV.js → appListCommands-UD62R5ME.js} +32 -30
  20. package/{authCommand-5HM57KPL.js → authCommand-OK6HLHGS.js} +13 -13
  21. package/{authCommands-SBQVTD6V.js → authCommands-2DUIUEMT.js} +2 -2
  22. package/{chatQueueReduxAdapter-ZXXP6E4O.js → chatQueueReduxAdapter-TV2TUOQS.js} +28 -25
  23. package/{chunk-7CH6U3FL.js → chunk-2GRGFCF6.js} +2 -4
  24. package/{chunk-T27IEBNQ.js → chunk-2QDDKFG5.js} +74 -1
  25. package/{chunk-2JYSSXLY.js → chunk-2WBFJHQA.js} +5 -27
  26. package/{chunk-FZMM2KZC.js → chunk-3LKZRP7E.js} +2 -2
  27. package/{chunk-WUMYQ2FE.js → chunk-3Y2K5O2R.js} +64 -6
  28. package/{chunk-5XCW6RQG.js → chunk-3ZTR7ZO4.js} +1 -1
  29. package/{chunk-W6N3GLUU.js → chunk-5FCIPEKT.js} +327 -149
  30. package/{chunk-B54WOZ77.js → chunk-5UAYZEXO.js} +2 -2
  31. package/{chunk-5SXS7T5Q.js → chunk-6COJEAYH.js} +36 -105
  32. package/{chunk-PEMGYJNS.js → chunk-6HDYSFLO.js} +4 -6
  33. package/{chunk-6XIE5ZGI.js → chunk-6HIGYUBQ.js} +1 -1
  34. package/chunk-6IGD47IC.js +19 -0
  35. package/chunk-6YTOJY35.js +352 -0
  36. package/{chunk-6FGXGFAH.js → chunk-75MSWWUE.js} +1 -1
  37. package/{chunk-ALMVQQPG.js → chunk-7FAS3NEF.js} +17 -17
  38. package/{chunk-76UA7376.js → chunk-7NYDJAQ7.js} +20 -15
  39. package/{chunk-2T6XO4PK.js → chunk-A65UV3M5.js} +4 -4
  40. package/{chunk-V2IPBG5U.js → chunk-AA564GBL.js} +2 -2
  41. package/{chunk-SQTVMYMU.js → chunk-AUVFJGPC.js} +4 -4
  42. package/{chunk-HR5XDXYM.js → chunk-BBTN4NQD.js} +4 -4
  43. package/{chunk-CULR4XB4.js → chunk-BG7J6Y5X.js} +1 -1
  44. package/chunk-BY2FF2C4.js +526 -0
  45. package/{chunk-FA4SY4F5.js → chunk-BYEJ7K2Z.js} +1 -1
  46. package/chunk-BYXBJQAS.js +0 -0
  47. package/{chunk-3AOLVADY.js → chunk-DVINR3PL.js} +1 -1
  48. package/{chunk-DIQCV4FR.js → chunk-EA5OYZVD.js} +1 -1
  49. package/{chunk-RO2IUWZE.js → chunk-EICIFHVS.js} +1 -1
  50. package/chunk-EJE33XNR.js +19059 -0
  51. package/{chunk-M2CGG6VJ.js → chunk-EVBFYPDC.js} +1 -1
  52. package/{chunk-KHCLMKZZ.js → chunk-EY7V7REW.js} +280 -6
  53. package/{chunk-MC66ASS6.js → chunk-FJHMLRDQ.js} +12 -12
  54. package/{chunk-YFHUQLJF.js → chunk-GRFK2XP4.js} +2 -2
  55. package/{chunk-J3UALFHL.js → chunk-HJTAGT3W.js} +1 -1
  56. package/{chunk-J7KVJAUQ.js → chunk-HPW5MNDQ.js} +38 -99
  57. package/{chunk-H2G6JXTR.js → chunk-HQUORJTM.js} +1 -1
  58. package/{chunk-OYNDYVSE.js → chunk-JON2PHYT.js} +1 -1
  59. package/{chunk-RBJD33HM.js → chunk-JXIP6ZWH.js} +7 -7
  60. package/{chunk-PTHLNXGY.js → chunk-K4NISKOR.js} +46 -8
  61. package/{chunk-5Y5G76BJ.js → chunk-KLIBF3BY.js} +2 -2
  62. package/chunk-LRGKOI5Y.js +297 -0
  63. package/{chunk-OU7NGN5Y.js → chunk-MLEZPE3U.js} +2 -2
  64. package/{chunk-4RXXP6WD.js → chunk-MYMBBB6Q.js} +5 -64
  65. package/{chunk-ET7BXWAW.js → chunk-N4JKMCY3.js} +2 -2
  66. package/{chunk-45E65JER.js → chunk-NFLA6GSU.js} +4 -4
  67. package/{chunk-SVEUG45B.js → chunk-NHRQCXIQ.js} +0 -24
  68. package/{chunk-WJV3G7BM.js → chunk-NJUQBYFJ.js} +3 -1
  69. package/{chunk-LGUQHYAL.js → chunk-O5FLGN2L.js} +3 -2
  70. package/{chunk-Q24S4NDF.js → chunk-Q4XZVZPN.js} +1 -1
  71. package/{chunk-L3JWI7WX.js → chunk-QOKAKDPE.js} +15 -11
  72. package/{chunk-VM7K5EJL.js → chunk-RHMDMTDK.js} +2 -2
  73. package/{chunk-YZ2WE6CW.js → chunk-SAJSBPI2.js} +2 -2
  74. package/{chunk-WHVQA7PJ.js → chunk-SSXTSPSG.js} +27 -6
  75. package/chunk-SUEIAK5N.js +2574 -0
  76. package/{chunk-X7S7OFUX.js → chunk-SVC3GGUA.js} +6 -6
  77. package/{chunk-7UFH6THF.js → chunk-SVDMVX4G.js} +118 -2
  78. package/{chunk-ZMV5PCRS.js → chunk-SWJGJMTW.js} +1 -1
  79. package/{chunk-DQLYEGP7.js → chunk-SYYUU7EV.js} +2 -2
  80. package/{chunk-K7CNV7GI.js → chunk-TC6P4NDR.js} +7 -7
  81. package/{chunk-SUFDWBLV.js → chunk-TR4DXUYX.js} +1988 -452
  82. package/{chunk-BANYWEYY.js → chunk-TY3ADTX5.js} +1 -1
  83. package/chunk-UAD2WT54.js +64 -0
  84. package/{chunk-HCBQVVFZ.js → chunk-UGBHDMHI.js} +4 -4
  85. package/{chunk-R63FNYSI.js → chunk-UOWXD4VN.js} +851 -970
  86. package/{chunk-GBXR3CSM.js → chunk-UR66XPVF.js} +3 -3
  87. package/{chunk-6BYAXNH5.js → chunk-VZMUOPYG.js} +12 -2
  88. package/{chunk-RVHPY5PC.js → chunk-WQHGJHAL.js} +441 -2982
  89. package/chunk-XIJZOCSP.js +1766 -0
  90. package/{chunk-HHBXCRJS.js → chunk-XOJRZUPF.js} +4 -4
  91. package/{chunk-BKPUPZ6W.js → chunk-YBFJQC2M.js} +95 -778
  92. package/{chunk-MRWGHF56.js → chunk-YDH3FDFQ.js} +12 -356
  93. package/{chunk-SG65C33A.js → chunk-YLCUU3WM.js} +4 -4
  94. package/{chunk-XXZULHJ7.js → chunk-YQBXOHE6.js} +1 -1
  95. package/chunk-ZJ7UHBJS.js +89 -0
  96. package/{chunk-TNPCQNGQ.js → chunk-ZVOHVJI3.js} +4 -9
  97. package/{codingSkills-BYQI6EPT.js → codingSkills-BCQXRZOI.js} +3 -4
  98. package/contentThunks-KNI6VXLT.js +71 -0
  99. package/{createAgentAutomationAction-LE3ZYDT6.js → createAgentAutomationAction-OK4L33KF.js} +29 -25
  100. package/createDialogAction-JDSMY4AY.js +62 -0
  101. package/{createPageAction-X4C7K3OD.js → createPageAction-T7RA3HCG.js} +32 -28
  102. package/{dbSlice-FWF5F4L7.js → dbSlice-TVX6SN2T.js} +7 -7
  103. package/{deleteFile-NPZ64DFN.js → deleteFile-JYKRT7C3.js} +4 -4
  104. package/{dialogCommands-CP2U44A7.js → dialogCommands-UQZYWOOV.js} +33 -31
  105. package/{dialogSlice-2SH5636X.js → dialogSlice-TYW2G7IL.js} +28 -25
  106. package/{docCreateCommands-A2KIJSF7.js → docCreateCommands-OA6HZBWO.js} +37 -36
  107. package/{docDeleteCommands-NZ7XO4Z4.js → docDeleteCommands-KBB3YQI2.js} +34 -33
  108. package/{docReadCommands-VWVK4ZAR.js → docReadCommands-ZLMFVC67.js} +33 -32
  109. package/{docStore-J6GQYKHS.js → docStore-2URPBVCS.js} +9 -34
  110. package/{docUpdateCommands-YTUEC6PN.js → docUpdateCommands-HMH5KUON.js} +37 -36
  111. package/{fetchMessages-KZQVBXKY.js → fetchMessages-DRABNDPZ.js} +3 -3
  112. package/{getPricing-I53UFOPH.js → getPricing-RFOPUWHY.js} +4 -4
  113. package/{handleSendMessageAction-MD325XZS.js → handleSendMessageAction-GO53TY7U.js} +30 -27
  114. package/index.js +67 -67
  115. package/{localDialogRead-NQ33HBSI.js → localDialogRead-PUQKFI73.js} +1 -1
  116. package/{machineCommands-TCNZV2DC.js → machineCommands-RK6L7ZWL.js} +64 -60
  117. package/{machineWsRunDispatch-QSX5IWPH.js → machineWsRunDispatch-3X64DW2Z.js} +59 -55
  118. package/memberThunks-THZYZFSN.js +638 -0
  119. package/{models-E2CYP4IB.js → models-JVKUEER5.js} +2 -2
  120. package/package.json +2 -3
  121. package/{read-J7RVVCHH.js → read-K4JU4MQC.js} +4 -4
  122. package/{readDocTool-G2WBM4IH.js → readDocTool-LQGR6FUN.js} +1 -1
  123. package/{readlineWorkspace-N3RGX7EK.js → readlineWorkspace-XUFJV3RS.js} +1005 -437
  124. package/{removeDialogAgentAction-RMPISD42.js → removeDialogAgentAction-ECHCFB7N.js} +13 -12
  125. package/{runAgentClientLoop-R3NTOERA.js → runAgentClientLoop-24GQ2AW6.js} +51 -46
  126. package/{setDialogExtraReferencesAction-7BUTHDAL.js → setDialogExtraReferencesAction-KCVJNGMB.js} +10 -9
  127. package/{setPrimaryDialogAgentAction-WCYIBGZ4.js → setPrimaryDialogAgentAction-VDOBOMKC.js} +13 -12
  128. package/{settingSlice-7NN2MI6Y.js → settingSlice-VR2IJSXC.js} +8 -8
  129. package/{skillDiscovery-COX56OBO.js → skillDiscovery-2QTZINON.js} +3 -4
  130. package/{spaceCommands-RC7XMYQ7.js → spaceCommands-S5YJJXL7.js} +31 -29
  131. package/{streamAgentChatTurn-WLWEBWSF.js → streamAgentChatTurn-QHKP3ABO.js} +82 -70
  132. package/{switchDialogAgentAction-WGMMQHDI.js → switchDialogAgentAction-5L4UP7VI.js} +11 -10
  133. package/{tableCommands-P2TXJ3CF.js → tableCommands-R6WFRDYF.js} +1 -1
  134. package/{toolApiClient-B2MFXMEG.js → toolApiClient-53U4UDFF.js} +3 -2
  135. package/{tools-LSLDSUWU.js → tools-SSXSTC3O.js} +42 -38
  136. package/{tuiSummaryLlmCaller-TPBL4BV2.js → tuiSummaryLlmCaller-URFJHFC5.js} +19 -17
  137. package/{updateDialogTitleAction-4HJEARM7.js → updateDialogTitleAction-YFYAEW3T.js} +30 -26
  138. package/agentRecordCommands-G6EFHU3G.js +0 -115
  139. package/chunk-AETZ7AD6.js +0 -274
  140. package/chunk-DMCFF4KE.js +0 -435
  141. package/chunk-EUG45QJR.js +0 -6104
  142. package/chunk-J4Z6UI4C.js +0 -7076
  143. package/chunk-OFZPJ3NT.js +0 -114
  144. package/createDialogAction-2C6SR62D.js +0 -59
  145. package/spaceSlice-KBVKKO3M.js +0 -127
  146. package/{chunk-NQ4N4IGO.js → chunk-CS6TCJ7E.js} +3 -3
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  MODEL_LOOKUP_MAP
3
- } from "./chunk-7UFH6THF.js";
3
+ } from "./chunk-SVDMVX4G.js";
4
4
  import {
5
5
  ALL_MODELS
6
- } from "./chunk-WJV3G7BM.js";
6
+ } from "./chunk-NJUQBYFJ.js";
7
7
  import {
8
- PUBLIC_DEEPSEEK_V4_FLASH_AGENT_KEY
9
- } from "./chunk-2JYSSXLY.js";
8
+ BUILTIN_NOLO_AGENT_KEY
9
+ } from "./chunk-2WBFJHQA.js";
10
10
 
11
11
  // packages/ai/llm/getModelContextWindow.ts
12
12
  var DEFAULT_CONTEXT_WINDOW = 256e3;
@@ -115,6 +115,42 @@ var getModelInfo = (modelName) => {
115
115
  return map.get(modelName) || map.get(modelName.toLowerCase()) || null;
116
116
  };
117
117
 
118
+ // packages/ai/token/cacheTokenFields.ts
119
+ var finiteTokenCount = (value) => {
120
+ if (typeof value !== "number" || !Number.isFinite(value)) return void 0;
121
+ return Math.max(0, Math.floor(value));
122
+ };
123
+ var readNested = (value, path) => {
124
+ let cursor = value;
125
+ for (const key of path) {
126
+ if (!cursor || typeof cursor !== "object") return void 0;
127
+ cursor = cursor[key];
128
+ }
129
+ return finiteTokenCount(cursor);
130
+ };
131
+ var firstPositive = (usage, readers) => {
132
+ for (const read of readers) {
133
+ const value = read(usage);
134
+ if (value !== void 0 && value !== 0) return value;
135
+ }
136
+ return 0;
137
+ };
138
+ var topLevel = (field) => (usage) => {
139
+ if (!usage || typeof usage !== "object") return void 0;
140
+ return finiteTokenCount(usage[field]);
141
+ };
142
+ var nested = (path) => (usage) => readNested(usage, path);
143
+ var readCacheReadInputTokens = (usage) => firstPositive(usage, [
144
+ topLevel("cache_read_input_tokens"),
145
+ topLevel("prompt_cache_hit_tokens"),
146
+ nested(["input_tokens_details", "cached_tokens"]),
147
+ nested(["prompt_tokens_details", "cached_tokens"])
148
+ ]);
149
+ var readCacheCreationInputTokens = (usage) => firstPositive(usage, [
150
+ topLevel("cache_creation_input_tokens"),
151
+ topLevel("prompt_cache_miss_tokens")
152
+ ]);
153
+
118
154
  // packages/agent-runtime/emptyAssistantRepair.ts
119
155
  var EMPTY_ASSISTANT_REPAIR_PROMPT = "\u8BF7\u7ED9\u51FA\u660E\u786E\u7684\u6587\u5B57\u56DE\u7B54\u6216\u6267\u884C\u4E0B\u4E00\u6B65\uFF1A\u5982\u679C\u4EFB\u52A1\u5DF2\u5B8C\u6210\uFF0C\u8BF7\u76F4\u63A5\u603B\u7ED3\u7ED3\u679C\uFF1B\u5982\u679C\u9700\u8981\u8C03\u7528\u5DE5\u5177\uFF0C\u8BF7\u76F4\u63A5\u8F93\u51FA tool_calls\u3002\u8BF7\u5207\u52FF\u8FD4\u56DE\u7A7A\u5185\u5BB9\u3002";
120
156
  var EMPTY_ASSISTANT_FALLBACK_MESSAGE = "\u6A21\u578B\u8FDE\u7EED\u8FD4\u56DE\u7A7A\u6D88\u606F\uFF0C\u5F53\u524D\u4EFB\u52A1\u672A\u5B8C\u6210\u3002\u8BF7\u91CD\u8BD5\u5F53\u524D\u6B65\u9AA4\uFF0C\u6216\u7ED9\u51FA\u66F4\u5177\u4F53\u7684\u4FEE\u6539\u8303\u56F4\u3002";
@@ -206,11 +242,11 @@ var createProfile = (input) => ({
206
242
  }
207
243
  });
208
244
  var FLASH_PROFILE = createProfile({
209
- id: "builtin:auto:deepseek-v4-flash",
245
+ id: "builtin:auto:nolo",
210
246
  tier: "flash",
211
- legacyAgentKey: PUBLIC_DEEPSEEK_V4_FLASH_AGENT_KEY,
212
- name: "DeepSeek V4 Flash",
213
- model: "deepseek-v4-flash"
247
+ legacyAgentKey: BUILTIN_NOLO_AGENT_KEY,
248
+ name: "nolo",
249
+ model: "glm-5-3-flash"
214
250
  });
215
251
  var AUTO_EXECUTION_PROFILES = {
216
252
  flash: FLASH_PROFILE,
@@ -223,6 +259,8 @@ var DEFAULT_AUTO_EXECUTION_PROFILE = AUTO_EXECUTION_PROFILES[DEFAULT_AUTO_EXECUT
223
259
  var resolveAutoExecutionProfile = (tier) => AUTO_EXECUTION_PROFILES[tier ?? DEFAULT_AUTO_EXECUTION_TIER] ?? DEFAULT_AUTO_EXECUTION_PROFILE;
224
260
 
225
261
  export {
262
+ readCacheReadInputTokens,
263
+ readCacheCreationInputTokens,
226
264
  DEFAULT_CONTEXT_WINDOW,
227
265
  getModelContextWindow,
228
266
  getModelInfo,
@@ -3,12 +3,12 @@ import {
3
3
  resolvePlatformChatCompletionsEndpoint,
4
4
  resolvePlatformHostedCredentialProvider,
5
5
  resolvePlatformResponsesEndpoint
6
- } from "./chunk-ET7BXWAW.js";
6
+ } from "./chunk-N4JKMCY3.js";
7
7
  import {
8
8
  CLIENT_VERSION_TOO_OLD_CODE,
9
9
  buildClientVersionGateErrorDetail,
10
10
  evaluatePlatformHostedClientVersionGate
11
- } from "./chunk-J7KVJAUQ.js";
11
+ } from "./chunk-HPW5MNDQ.js";
12
12
  import {
13
13
  asTrimmedLowercaseString
14
14
  } from "./chunk-QSJ3HFEF.js";
@@ -0,0 +1,297 @@
1
+ import {
2
+ require_react
3
+ } from "./chunk-YDH3FDFQ.js";
4
+ import {
5
+ createSpaceKey,
6
+ normalizeSpaceId
7
+ } from "./chunk-UAD2WT54.js";
8
+ import {
9
+ toTimestampMs
10
+ } from "./chunk-7NYDJAQ7.js";
11
+ import {
12
+ fetchFromServer,
13
+ getAllServers
14
+ } from "./chunk-QOKAKDPE.js";
15
+ import {
16
+ isTombstoneRecord
17
+ } from "./chunk-GBRG75BQ.js";
18
+ import {
19
+ __toESM
20
+ } from "./chunk-4VNS5WPM.js";
21
+
22
+ // packages/create/space/spaceMembershipStore.ts
23
+ var import_react = __toESM(require_react(), 1);
24
+ var createInitialState = () => ({
25
+ memberSpaces: null,
26
+ loading: false,
27
+ membershipStatus: "idle",
28
+ initialized: false
29
+ });
30
+ var state = createInitialState();
31
+ var listeners = /* @__PURE__ */ new Set();
32
+ var version = 0;
33
+ var notify = () => {
34
+ version += 1;
35
+ for (const listener of listeners) {
36
+ try {
37
+ listener();
38
+ } catch {
39
+ }
40
+ }
41
+ };
42
+ var getMembershipUpdatedAt = (space) => {
43
+ if (!space) return 0;
44
+ return toTimestampMs(
45
+ space.spaceUpdatedAt ?? space.memberUpdatedAt ?? space.updatedAt ?? space.createdAt ?? space.joinedAt
46
+ );
47
+ };
48
+ function dedupeMemberSpacesById(memberSpaces) {
49
+ const membershipMap = /* @__PURE__ */ new Map();
50
+ memberSpaces.forEach((space) => {
51
+ const prev = membershipMap.get(space.spaceId);
52
+ if (!prev || getMembershipUpdatedAt(space) >= getMembershipUpdatedAt(prev)) {
53
+ membershipMap.set(space.spaceId, space);
54
+ }
55
+ });
56
+ return Array.from(membershipMap.values());
57
+ }
58
+ function getMemberSpaces() {
59
+ return state.memberSpaces;
60
+ }
61
+ function getAllMemberSpaces() {
62
+ const memberSpaces = dedupeMemberSpacesById(state.memberSpaces || []);
63
+ return [...memberSpaces].sort((a, b) => {
64
+ return getMembershipUpdatedAt(b) - getMembershipUpdatedAt(a);
65
+ });
66
+ }
67
+ function setMemberSpaces(spaces) {
68
+ state = {
69
+ ...state,
70
+ memberSpaces: spaces,
71
+ loading: false,
72
+ error: void 0,
73
+ membershipStatus: "fresh",
74
+ initialized: true
75
+ };
76
+ notify();
77
+ }
78
+ function setMembershipLoading() {
79
+ state = { ...state, loading: true, membershipStatus: "loading" };
80
+ notify();
81
+ }
82
+ function setMembershipRejected(errorMessage, isRemoteUnavailable) {
83
+ const membershipStatus = isRemoteUnavailable ? "offline" : state.membershipStatus === "loading" ? "idle" : state.membershipStatus;
84
+ state = {
85
+ ...state,
86
+ loading: false,
87
+ error: errorMessage,
88
+ membershipStatus
89
+ };
90
+ notify();
91
+ }
92
+ function hydrateMemberSpacesFromLocal(spaces) {
93
+ if (state.memberSpaces !== null || spaces.length === 0) return;
94
+ state = {
95
+ ...state,
96
+ memberSpaces: dedupeMemberSpacesById(spaces),
97
+ loading: false
98
+ };
99
+ notify();
100
+ }
101
+ function appendRecoveredMemberships(recovered) {
102
+ if (!recovered || recovered.length === 0) return;
103
+ if (state.memberSpaces === null) {
104
+ state = {
105
+ ...state,
106
+ memberSpaces: dedupeMemberSpacesById(recovered)
107
+ };
108
+ notify();
109
+ return;
110
+ }
111
+ state = {
112
+ ...state,
113
+ memberSpaces: dedupeMemberSpacesById([
114
+ ...state.memberSpaces,
115
+ ...recovered
116
+ ]).sort((a, b) => toTimestampMs(b.joinedAt) - toTimestampMs(a.joinedAt))
117
+ };
118
+ notify();
119
+ }
120
+ function setSpaceInitialized() {
121
+ state = { ...state, initialized: true };
122
+ notify();
123
+ }
124
+ function setMembershipLoaded() {
125
+ state = { ...state, loading: false, error: void 0 };
126
+ notify();
127
+ }
128
+ function addMemberSpace(space) {
129
+ const existing = state.memberSpaces || [];
130
+ state = {
131
+ ...state,
132
+ memberSpaces: dedupeMemberSpacesById([...existing, space])
133
+ };
134
+ notify();
135
+ }
136
+ function removeMemberSpace(spaceId) {
137
+ if (!state.memberSpaces) return;
138
+ const normalized = normalizeSpaceId(spaceId);
139
+ state = {
140
+ ...state,
141
+ memberSpaces: state.memberSpaces.filter(
142
+ (s) => normalizeSpaceId(s.spaceId) !== normalized
143
+ )
144
+ };
145
+ notify();
146
+ }
147
+ function updateMemberSpaceName(spaceId, name) {
148
+ if (!state.memberSpaces || !name) return;
149
+ state = {
150
+ ...state,
151
+ memberSpaces: state.memberSpaces.map(
152
+ (space) => space.spaceId === spaceId ? { ...space, spaceName: name } : space
153
+ )
154
+ };
155
+ notify();
156
+ }
157
+
158
+ // packages/create/space/spaceAccess.ts
159
+ var resolveSpaceRemoteServers = (state2) => {
160
+ const currentServer = typeof state2?.settings?.currentServer === "string" ? state2.settings.currentServer : void 0;
161
+ const syncServers = Array.isArray(state2?.settings?.syncServers) ? state2.settings.syncServers : void 0;
162
+ return getAllServers(currentServer, syncServers);
163
+ };
164
+ var selectSpaceRemoteAuth = (state2) => ({
165
+ token: state2?.auth?.currentToken ?? null,
166
+ userId: state2?.auth?.currentUser?.userId ?? null,
167
+ servers: resolveSpaceRemoteServers(state2)
168
+ });
169
+ var spaceListsUser = (spaceData, userId) => {
170
+ if (!spaceData || isTombstoneRecord(spaceData)) return false;
171
+ if (spaceData.ownerId === userId) return true;
172
+ return Array.isArray(spaceData.members) && spaceData.members.includes(userId);
173
+ };
174
+ var membershipBelongsToUser = (membership, userId) => !membership.userId || membership.userId === userId;
175
+ var membershipFetchCache = /* @__PURE__ */ new Map();
176
+ var MEMBERSHIP_FETCH_CACHE_TTL_MS = 3e4;
177
+ async function fetchMembershipsFromServer(server, token, userId, timeoutMs) {
178
+ if (!token) return { ok: false, memberships: [] };
179
+ const controller = new AbortController();
180
+ const timeoutId = setTimeout(() => controller.abort(), timeoutMs);
181
+ try {
182
+ const response = await fetch(`${server}/rpc/getUserSpaceMemberships`, {
183
+ method: "POST",
184
+ headers: {
185
+ Authorization: `Bearer ${token}`,
186
+ "Content-Type": "application/json"
187
+ },
188
+ body: JSON.stringify({ userId }),
189
+ signal: controller.signal
190
+ });
191
+ clearTimeout(timeoutId);
192
+ if (!response.ok) {
193
+ console.error(
194
+ `Failed to fetch memberships from ${server}: ${response.statusText}`
195
+ );
196
+ return { ok: false, memberships: [] };
197
+ }
198
+ const data = await response.json();
199
+ return {
200
+ ok: true,
201
+ server,
202
+ memberships: Array.isArray(data) ? data : []
203
+ };
204
+ } catch (error) {
205
+ clearTimeout(timeoutId);
206
+ console.error(`Error fetching memberships from ${server}:`, error);
207
+ return { ok: false, memberships: [] };
208
+ }
209
+ }
210
+ var fetchRemoteUserSpaceMemberships = (server, token, userId, timeoutMs = 5e3) => {
211
+ const cacheKey = `${server}|${userId}`;
212
+ const cached = membershipFetchCache.get(cacheKey);
213
+ if (cached) return cached;
214
+ const promise = fetchMembershipsFromServer(server, token, userId, timeoutMs);
215
+ membershipFetchCache.set(cacheKey, promise);
216
+ promise.catch(() => {
217
+ }).finally(() => {
218
+ setTimeout(() => {
219
+ if (membershipFetchCache.get(cacheKey) === promise) {
220
+ membershipFetchCache.delete(cacheKey);
221
+ }
222
+ }, MEMBERSHIP_FETCH_CACHE_TTL_MS);
223
+ });
224
+ return promise;
225
+ };
226
+ var fetchRemoteSpace = async (server, token, spaceId) => {
227
+ try {
228
+ const space = await fetchFromServer(
229
+ server,
230
+ createSpaceKey.space(normalizeSpaceId(spaceId)),
231
+ token ?? void 0
232
+ );
233
+ return space && typeof space === "object" ? space : null;
234
+ } catch {
235
+ return null;
236
+ }
237
+ };
238
+ var hasActiveRemoteMembership = async (server, token, userId, spaceId) => {
239
+ const result = await fetchRemoteUserSpaceMemberships(server, token, userId);
240
+ if (!result.ok) return false;
241
+ const normalizedSpaceId = normalizeSpaceId(spaceId);
242
+ return result.memberships.some((membership) => {
243
+ const membershipSpaceId = typeof membership?.spaceId === "string" ? normalizeSpaceId(membership.spaceId) : "";
244
+ return membershipSpaceId === normalizedSpaceId && membershipBelongsToUser(membership, userId) && !isTombstoneRecord(membership);
245
+ });
246
+ };
247
+ var fetchAuthoritativeRemoteSpace = async ({
248
+ servers,
249
+ token,
250
+ userId,
251
+ spaceId
252
+ }) => {
253
+ const normalizedSpaceId = normalizeSpaceId(spaceId);
254
+ for (const server of servers) {
255
+ const space = await fetchRemoteSpace(server, token, normalizedSpaceId);
256
+ if (!space) continue;
257
+ if (!spaceListsUser(space, userId)) {
258
+ throw new Error(`Current user is not a member of space: ${normalizedSpaceId}`);
259
+ }
260
+ if (space.ownerId !== userId) {
261
+ const hasMembership = await hasActiveRemoteMembership(
262
+ server,
263
+ token,
264
+ userId,
265
+ normalizedSpaceId
266
+ );
267
+ if (!hasMembership) {
268
+ throw new Error(
269
+ `Current user has no active membership for space: ${normalizedSpaceId}`
270
+ );
271
+ }
272
+ }
273
+ return space;
274
+ }
275
+ return null;
276
+ };
277
+
278
+ export {
279
+ selectSpaceRemoteAuth,
280
+ spaceListsUser,
281
+ membershipBelongsToUser,
282
+ fetchRemoteUserSpaceMemberships,
283
+ fetchRemoteSpace,
284
+ fetchAuthoritativeRemoteSpace,
285
+ getMemberSpaces,
286
+ getAllMemberSpaces,
287
+ setMemberSpaces,
288
+ setMembershipLoading,
289
+ setMembershipRejected,
290
+ hydrateMemberSpacesFromLocal,
291
+ appendRecoveredMemberships,
292
+ setSpaceInitialized,
293
+ setMembershipLoaded,
294
+ addMemberSpace,
295
+ removeMemberSpace,
296
+ updateMemberSpaceName
297
+ };
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  clearCliLocalRuntimePreparedAgentCache
3
- } from "./chunk-W6N3GLUU.js";
3
+ } from "./chunk-5FCIPEKT.js";
4
4
  import {
5
5
  getReadableCliDb
6
6
  } from "./chunk-43CXXVJD.js";
@@ -12,7 +12,7 @@ import {
12
12
  resolveAgentRecordFromHybridStore,
13
13
  sanitizeAgentRecordForCliOutput,
14
14
  writeAgentRecord
15
- } from "./chunk-DQLYEGP7.js";
15
+ } from "./chunk-SYYUU7EV.js";
16
16
  import {
17
17
  resolveCliAgentKeyInput
18
18
  } from "./chunk-EKLRRZIN.js";
@@ -1,72 +1,15 @@
1
+ import {
2
+ createSpaceKey
3
+ } from "./chunk-UAD2WT54.js";
1
4
  import {
2
5
  patch,
3
6
  read
4
- } from "./chunk-76UA7376.js";
7
+ } from "./chunk-7NYDJAQ7.js";
5
8
  import {
6
9
  DEVICE_LOCAL_OWNER_ID,
7
10
  isDeviceLocalSpaceBody,
8
11
  selectIdentityUserId
9
- } from "./chunk-HHBXCRJS.js";
10
-
11
- // packages/create/space/spaceKeys.ts
12
- var SEPARATOR = "-";
13
- var SPACE_PREFIX = "space";
14
- var SPACE_PREFIX_WITH_SEPARATOR = `${SPACE_PREFIX}${SEPARATOR}`;
15
- var normalizeSpaceId = (spaceId) => {
16
- if (!spaceId) return spaceId;
17
- return spaceId.startsWith(SPACE_PREFIX_WITH_SEPARATOR) ? spaceId.slice(SPACE_PREFIX_WITH_SEPARATOR.length) : spaceId;
18
- };
19
- var createSpaceKey = {
20
- // 空间基础信息的key
21
- space: (spaceId) => {
22
- return [SPACE_PREFIX, normalizeSpaceId(spaceId)].join(SEPARATOR);
23
- },
24
- // 空间成员的key
25
- member: (userId, spaceId) => {
26
- return [SPACE_PREFIX, "member", userId, normalizeSpaceId(spaceId)].join(
27
- SEPARATOR
28
- );
29
- },
30
- // 查询用户所在的所有空间的范围
31
- memberRange: (userId) => {
32
- return {
33
- start: [SPACE_PREFIX, "member", userId, ""].join(SEPARATOR),
34
- end: [SPACE_PREFIX, "member", userId, "\uFFFF"].join(SEPARATOR)
35
- };
36
- },
37
- /**
38
- * 预留:未来若出现“按用户、按空间、且必须跨设备同步”的空间级偏好,
39
- * 统一使用这个 key family。当前产品主链不要依赖它。
40
- */
41
- setting: (userId, spaceId) => {
42
- return [SPACE_PREFIX, "setting", userId, normalizeSpaceId(spaceId)].join(
43
- SEPARATOR
44
- );
45
- },
46
- /**
47
- * 预留:未来如确实需要批量读取空间级远端偏好,再使用这个范围。
48
- */
49
- settingRange: (userId) => {
50
- return {
51
- start: [SPACE_PREFIX, "setting", userId, ""].join(SEPARATOR),
52
- end: [SPACE_PREFIX, "setting", userId, "\uFFFF"].join(SEPARATOR)
53
- };
54
- },
55
- // 从成员key中提取空间key
56
- // 成员 key 格式: space-member-{userId}-{spaceId}
57
- // userId 是单段(无连字符),spaceId 是 ULID(无连字符)
58
- spaceFromMember: (memberKey) => {
59
- const parts = memberKey.split(SEPARATOR);
60
- if (parts.length < 4) return "";
61
- const spaceId = parts[parts.length - 1];
62
- return [SPACE_PREFIX, spaceId].join(SEPARATOR);
63
- },
64
- // 从成员key中提取空间ID
65
- spaceIdFromMember: (memberKey) => {
66
- const parts = memberKey.split(SEPARATOR);
67
- return parts.length >= 4 ? parts[parts.length - 1] : "";
68
- }
69
- };
12
+ } from "./chunk-XOJRZUPF.js";
70
13
 
71
14
  // packages/create/space/utils/permissions.ts
72
15
  var checkSpaceMembership = (spaceData, userId) => {
@@ -163,8 +106,6 @@ var addContentAction = async (input, thunkAPI) => {
163
106
  };
164
107
 
165
108
  export {
166
- normalizeSpaceId,
167
- createSpaceKey,
168
109
  checkSpaceMembership,
169
110
  localSpaceAuthorityPatchStamp,
170
111
  UNCATEGORIZED_ID,
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  getModelConfig
3
- } from "./chunk-7UFH6THF.js";
3
+ } from "./chunk-SVDMVX4G.js";
4
4
  import {
5
5
  isPlatformHostedDeepseekModel,
6
6
  isPlatformHostedOpenAIImageModel,
7
7
  resolvePlatformHostedRouting
8
- } from "./chunk-J7KVJAUQ.js";
8
+ } from "./chunk-HPW5MNDQ.js";
9
9
  import {
10
10
  asTrimmedLowercaseString
11
11
  } from "./chunk-QSJ3HFEF.js";
@@ -11,7 +11,7 @@ import {
11
11
  getAntigravityUserAgent,
12
12
  normalizeAntigravityTokenPayload,
13
13
  refreshAntigravityToken
14
- } from "./chunk-CULR4XB4.js";
14
+ } from "./chunk-BG7J6Y5X.js";
15
15
  import {
16
16
  writeOAuthCredential
17
17
  } from "./chunk-FD36SCCD.js";
@@ -21,12 +21,12 @@ import {
21
21
  import {
22
22
  asOptionalFiniteNumber
23
23
  } from "./chunk-WWC7I6TA.js";
24
- import {
25
- isRecord
26
- } from "./chunk-KUG52IAP.js";
27
24
  import {
28
25
  asTrimmedString
29
26
  } from "./chunk-3EUW3WEO.js";
27
+ import {
28
+ isRecord
29
+ } from "./chunk-KUG52IAP.js";
30
30
 
31
31
  // packages/cli/oauth/callback-server.ts
32
32
  import { createServer } from "node:http";
@@ -2393,29 +2393,6 @@ var require_rambda = __commonJS({
2393
2393
  }
2394
2394
  });
2395
2395
 
2396
- // packages/create/types.ts
2397
- var DataType = /* @__PURE__ */ ((DataType2) => {
2398
- DataType2["AGENT"] = "agent";
2399
- DataType2["DOC"] = "page";
2400
- DataType2["DIALOG"] = "dialog";
2401
- DataType2["NOTIFICATION"] = "notification";
2402
- DataType2["MSG"] = "msg";
2403
- DataType2["TOKEN"] = "token";
2404
- DataType2["SPACE"] = "space";
2405
- DataType2["TRANSACTION"] = "transaction";
2406
- DataType2["SETTING"] = "setting";
2407
- DataType2["TASK"] = "task";
2408
- DataType2["AGENT_AUTOMATION"] = "agent-automation";
2409
- DataType2["TABLE"] = "table";
2410
- DataType2["TABLE_ROW"] = "table_row";
2411
- DataType2["FILE"] = "file";
2412
- DataType2["IMAGE"] = "image";
2413
- DataType2["APP"] = "app";
2414
- DataType2["EMAIL"] = "email";
2415
- DataType2["Category"] = "category";
2416
- return DataType2;
2417
- })(DataType || {});
2418
-
2419
2396
  // packages/core/toTrimmedString.ts
2420
2397
  function toTrimmedString(value) {
2421
2398
  return typeof value === "string" ? value.trim() : value == null ? "" : String(value).trim();
@@ -3192,7 +3169,6 @@ var sanitizeShareData = (data) => {
3192
3169
  };
3193
3170
 
3194
3171
  export {
3195
- DataType,
3196
3172
  ulid,
3197
3173
  toTrimmedString,
3198
3174
  toNonEmptyString,
@@ -4,7 +4,7 @@ import {
4
4
  openrouterModels,
5
5
  platformHostedModels,
6
6
  zaiModels
7
- } from "./chunk-J7KVJAUQ.js";
7
+ } from "./chunk-HPW5MNDQ.js";
8
8
 
9
9
  // packages/ai/llm/modelAbility.ts
10
10
  var MODEL_ABILITY_TABLE = {
@@ -24,6 +24,8 @@ var MODEL_ABILITY_TABLE = {
24
24
  "claude-sonnet-5": { passAt1: 54, benchmarkScore: 53 },
25
25
  "deepseek-v4-flash": { passAt1: 53 },
26
26
  "gemini-3.7-flash": { passAt1: 58, benchmarkScore: 65, writingScore: 88 },
27
+ // TODO(benchmark): gemini-3.8-flash 官方基准快照未出,暂沿用 3.7 分数占位,确认后更新。
28
+ "gemini-3.8-flash": { passAt1: 58, benchmarkScore: 65, writingScore: 88 },
27
29
  "muse-spark-1.1": { passAt1: 53 },
28
30
  "gpt-5.4": { passAt1: 52 },
29
31
  "gemini-3.6-flash": { passAt1: 49, benchmarkScore: 50 },
@@ -22,13 +22,14 @@ var CODE_WORK_DISCIPLINE_BODY = `## \u6548\u7387\u4F18\u5148\uFF08\u7701 token\u
22
22
  - **\u5EFA\u8BAE\u6C47\u62A5**\uFF1A\u4EA4\u4ED8\u65F6\u628A\u8FC7\u7A0B\u4E2D\u53D1\u73B0\u7684**\u4EFB\u4F55\u503C\u5F97\u7528\u6237\u77E5\u9053\u7684\u4E8B**\u90FD\u5217\u51FA\u6765\uFF08\u9884\u5B58\u65E0\u5173\u6539\u52A8\u3001\u65E2\u6709\u6D4B\u8BD5\u9694\u79BB\u95EE\u9898\u3001\u6F5C\u5728\u98CE\u9669\u3001\u540E\u7EED\u53EF\u4F18\u5316\u70B9\u3001\u9700\u7528\u6237\u51B3\u7B56\u7684\u4E8B\u9879\uFF09\uFF0C\u4E0D\u8981\u53EA\u62A5\u300C\u505A\u5B8C\u4E86\u300D\u3002
23
23
 
24
24
  ## Review \u7EAA\u5F8B\uFF08commit \u524D\u786C\u95E8\uFF09
25
- - \u9664 \u22642 \u6B65\u96F6\u903B\u8F91\u98CE\u9669\u7684\u673A\u68B0\u6539\u52A8\uFF08\u9519\u522B\u5B57/\u683C\u5F0F/CSS \u5FAE\u8C03\uFF09\u5916\uFF0C\u6240\u6709\u4EE3\u7801\u53D8\u66F4 commit \u524D\u5FC5\u987B\u5148\u6D3E**\u5176\u4ED6 agent**\uFF08\u4E0D\u540C\u6A21\u578B\u5BB6\u65CF\u4F18\u5148\uFF09review \u5DE5\u4F5C\u533A diff\uFF08\`git diff\`\uFF0C\u672A\u63D0\u4EA4\u7684\u6539\u52A8\uFF09\u3002reviewer \u4E0D\u53EF\u662F\u672C\u6B21\u6539\u52A8\u7684\u4F5C\u8005\uFF08\u7F16\u6392\u8005\u4EE5\u81EA\u8EAB agent \u8EAB\u4EFD\u6D3E\u51FA\u7684\u5168\u65B0\u5B9E\u4F8B\u4E0D\u5171\u4EAB\u7F16\u6392\u8005\u4E0A\u4E0B\u6587\uFF0C\u4E0E\u4F5C\u8005\u8DE8\u6A21\u578B\u5BB6\u65CF\u65F6\u4E0D\u7B97\u300C\u81EA\u5DF1\u300D\uFF0C\u8DE8\u5BB6\u65CF\u4F18\u5148\u975E\u5F3A\u5236\uFF09\u3002\u65E0 review \u4E0D commit\u2014\u2014\u8FD9\u662F\u786C\u95E8\uFF0C\u4E0D\u662F\u5EFA\u8BAE\u3002
25
+ - **\u9636\u6BB5\u5212\u5206**\uFF1A\u4E25\u683C\u533A\u5206\u300C\u5B9E\u73B0/\u6784\u5EFA/\u5B89\u88C5/\u7528\u6237\u6D4B\u8BD5/\u6839\u636E\u53CD\u9988\u8FED\u4EE3\u300D\u4E0E\u300C\u51C6\u5907\u63D0\u4EA4/\u5408\u5E76\u300D\u9636\u6BB5\u3002UI/\u524D\u7AEF\u53CA\u5176\u4ED6\u9700\u7528\u6237\u9A8C\u6536\u7684\u4EFB\u52A1\uFF0C\u5728\u5B9E\u73B0\u9636\u6BB5\u4E0D\u5F97\u89E6\u53D1\u6216\u7B49\u5F85\u6700\u7EC8\u72EC\u7ACB review\uFF0C\u5E94\u5148\u4EA4\u4ED8\u53EF\u6D4B\u8BD5\u4EA7\u7269\u7B49\u5F85\u7528\u6237\u53CD\u9988\u3002
26
+ - \u6700\u7EC8 review \u4EC5\u5728\u7528\u6237\u660E\u786E\u786E\u8BA4\u51C6\u5907\u63D0\u4EA4/\u5408\u5E76\u65F6\u8FDB\u884C\u3002\u9664 \u22642 \u6B65\u96F6\u903B\u8F91\u98CE\u9669\u7684\u673A\u68B0\u6539\u52A8\uFF08\u9519\u522B\u5B57/\u683C\u5F0F/CSS \u5FAE\u8C03\uFF09\u5916\uFF0C\u6240\u6709\u4EE3\u7801\u53D8\u66F4 commit \u524D\u5FC5\u987B\u5148\u6D3E**\u5176\u4ED6 agent**\uFF08\u4E0D\u540C\u6A21\u578B\u5BB6\u65CF\u4F18\u5148\uFF09review \u5DE5\u4F5C\u533A diff\uFF08\`git diff\`\uFF0C\u672A\u63D0\u4EA4\u7684\u6539\u52A8\uFF09\u3002reviewer \u4E0D\u53EF\u662F\u672C\u6B21\u6539\u52A8\u7684\u4F5C\u8005\uFF08\u7F16\u6392\u8005\u4EE5\u81EA\u8EAB agent \u8EAB\u4EFD\u6D3E\u51FA\u7684\u5168\u65B0\u5B9E\u4F8B\u4E0D\u5171\u4EAB\u7F16\u6392\u8005\u4E0A\u4E0B\u6587\uFF0C\u4E0E\u4F5C\u8005\u8DE8\u6A21\u578B\u5BB6\u65CF\u65F6\u4E0D\u7B97\u300C\u81EA\u5DF1\u300D\uFF0C\u8DE8\u5BB6\u65CF\u4F18\u5148\u975E\u5F3A\u5236\uFF09\u3002\u65E0 review \u4E0D commit\u2014\u2014\u8FD9\u662F\u786C\u95E8\uFF0C\u4E0D\u662F\u5EFA\u8BAE\u3002
26
27
  - \u6D3E\u53D1\u8D70 \`startAgentRun(agentKey, task, { ephemeral: true })\`\uFF08web/\u684C\u9762\u7AEF\u6CA1\u6709 nolo CLI\uFF0C\u6240\u6709 host \u90FD\u6709\u8FD9\u4E2A\u5DE5\u5177\uFF09\u3002ephemeral \u8BA9 review \u5B8C\u6210\u540E\u4E0D\u7559 dialog \u8BB0\u5F55\u3002
27
28
  - task \u91CC\u5FC5\u987B\u5199\u660E\u5BA1\u67E5\u5BF9\u8C61\uFF08\`git diff\` \u770B\u5DE5\u4F5C\u533A\u6539\u52A8\uFF0C\u6216 \`git diff alpha...HEAD\` \u770B\u5DF2\u63D0\u4EA4\u6539\u52A8\uFF09\uFF0C\u5426\u5219 reviewer \u4E0D\u77E5\u9053\u5BA1\u4EC0\u4E48\u3002
28
29
  - \u6309\u89D2\u8272\u52A0\u8F7D\u5BF9\u5E94 skill\uFF1Areviewer \u5148 \`loadSkill("coding-review")\` \u62FF\u901A\u7528\u6D41\u7A0B\uFF0C\u518D\u6309\u89D2\u8272 \`loadSkill("coding-review-<role>")\` \u62FF\u68C0\u67E5\u9879\u3002\u89D2\u8272\u6E05\u5355\uFF1Acode-quality\uFF08**\u5FC5\u8DD1**\uFF09/ architecture\uFF08**\u5355\u72EC\u6D3E\u53D1**\uFF0C\u4E2D\u7EA7\u4EE5\u4E0A\u95EE\u9898\uFF09/ security\uFF08\u6309\u9700 + \u5B89\u5168\u654F\u611F\u89E6\u53D1\u5FC5\u8DD1\uFF09/ frontend-ux\uFF08\u6D89\u53CA UI \u65F6\uFF09/ backend-data\uFF08\u6D89\u53CA server \u65F6\uFF09\u3002\u89D2\u8272\u5207\u5272\u7684\u76EE\u7684\u662F\u6CE8\u610F\u529B\u9694\u79BB\u2014\u2014\u6BCF\u4E2A\u89D2\u8272\u53EA\u76EF\u81EA\u5DF1\u7684\u68C0\u67E5\u9762\uFF0C\u6309\u9700\u542F\u7528\uFF0C\u907F\u514D\u4E00\u4E2A reviewer \u80CC\u6240\u6709\u89D2\u8272\u5BFC\u81F4\u6CE8\u610F\u529B\u7A00\u91CA\u3002
29
30
  - Verdict \u6807\u51C6\uFF1AAPPROVE\uFF08\u65E0 CRITICAL \u6216 HIGH\uFF09\u2192 \u53EF commit\uFF1BWARNING\uFF08\u4EC5 HIGH\uFF09\u2192 \u62A5\u544A owner \u51B3\u5B9A\uFF1BBLOCK\uFF08\u6709 CRITICAL\uFF09\u2192 \u5FC5\u987B\u5148\u4FEE\u3002
30
31
  - review \u53EF\u80FD\u591A\u8F6E\u6536\u655B\uFF08\u6709 finding\u2192\u4FEE\u2192\u518D\u5BA1\u2192\u76F4\u5230 APPROVE\uFF09\u3002\u6BCF\u8F6E review \u662F\u65E0\u4E0A\u4E0B\u6587\u7684\u2014\u2014reviewer \u53EA\u770B\u5F53\u524D\u5DE5\u4F5C\u533A diff\uFF0C\u4E0D\u5E26\u4E0A\u4E00\u8F6E finding \u8BB0\u5FC6\u3002
31
- - **\u81EA\u52A8 review \u5FAA\u73AF**\uFF1A\u4EFB\u52A1\u5B8C\u6210\u540E**\u81EA\u52A8\u8FDB\u5165 review \u5FAA\u73AF**\uFF0C\u4E0D\u8981\u505C\u5728\u300C\u6539\u5B8C\u4EA4\u4ED8\u300D\u5C31\u7B49\u8C03\u7528\u65B9\u3002\u6D41\u7A0B\uFF1A\u6539\u5B8C \u2192 \u6D3E reviewer \u5BA1\u5DE5\u4F5C\u533A diff \u2192 \u82E5\u51FA finding \u5C31\u4FEE\u590D \u2192 \u590D\u5BA1 \u2192 \u76F4\u5230 APPROVE \u624D\u63D0\u4EA4\u3002\u9664\u975E\u8C03\u7528\u65B9\u660E\u786E\u8BF4\u300C\u53EA\u6539\u4E0D\u5BA1\u300D\uFF0C\u5426\u5219\u9ED8\u8BA4\u8D70\u5B8C\u6574\u5FAA\u73AF\u3002
32
+ - **\u63D0\u4EA4\u524D review \u5FAA\u73AF**\uFF1A\u7528\u6237\u660E\u786E\u786E\u8BA4\u51C6\u5907\u63D0\u4EA4\u540E\u8FDB\u5165 review \u5FAA\u73AF\uFF0C\u6D41\u7A0B\uFF1A\u6D3E reviewer \u5BA1\u5DE5\u4F5C\u533A diff \u2192 \u82E5\u51FA finding \u5C31\u4FEE\u590D \u2192 \u590D\u5BA1 \u2192 \u76F4\u5230 APPROVE \u624D\u63D0\u4EA4\u3002\u5B89\u5168\u5BA1\u8BA1\u6216\u7528\u6237\u660E\u786E\u8981\u6C42\u7684\u53EA\u8BFB review \u53EF\u63D0\u524D\u505A\uFF0C\u4F46\u4E0D\u5F97\u963B\u585E\u7528\u6237\u6D4B\u8BD5\u3002\u9664\u975E\u8C03\u7528\u65B9\u660E\u786E\u8BF4\u300C\u53EA\u6539\u4E0D\u5BA1\u300D\u6216\u7528\u6237\u660E\u786E\u8DF3\u8FC7\uFF0C\u5426\u5219\u63D0\u4EA4\u524D\u5FC5\u987B\u8D70\u5B8C\u6574\u5FAA\u73AF\u3002
32
33
  - \u82E5\u5904\u4E8E\u5355 Agent \u72EC\u5360\u73AF\u5883\u3001\u5176\u4ED6 agent \u4E0D\u53EF\u8FBE\u3001\u6216\u7528\u6237\u660E\u786E\u8981\u6C42\u76F4\u63A5\u63D0\u4EA4\uFF0C\u5141\u8BB8\u5E26\u539F\u56E0\u8DF3\u8FC7\uFF08commit message \u6CE8\u660E [no-review: \u539F\u56E0]\uFF09\uFF0C\u4F46\u9ED8\u8BA4\u5FC5\u987B\u6D3E review\u3002`;
33
34
  var buildCodeWorkDiscipline = (heading) => `# ${heading}
34
35
 
@@ -2,7 +2,7 @@ import {
2
2
  deleteDbRecord,
3
3
  queryUserRecords,
4
4
  readDbRecord
5
- } from "./chunk-DQLYEGP7.js";
5
+ } from "./chunk-SYYUU7EV.js";
6
6
  import {
7
7
  mergeAndDedupUserData
8
8
  } from "./chunk-KQHGZWSV.js";
@@ -20,12 +20,6 @@ var isDevelopment = !isProduction;
20
20
  var getIsDesktopApp = () => (typeof process !== "undefined" ? process.env?.NOLO_DESKTOP : processEnv?.NOLO_DESKTOP) === "1" || typeof window !== "undefined" && window.__NOLO_DESKTOP__ === true;
21
21
  var isDesktopApp = getIsDesktopApp();
22
22
 
23
- // packages/core/abortError.ts
24
- function isAbortError(error) {
25
- if (!error || typeof error !== "object") return false;
26
- return error.name === "AbortError";
27
- }
28
-
29
23
  // packages/core/clientLogger.ts
30
24
  var LOG_LEVELS = {
31
25
  debug: 10,
@@ -51,12 +45,16 @@ var serializeValue = (value, seen = /* @__PURE__ */ new WeakSet()) => {
51
45
  return "[Circular]";
52
46
  }
53
47
  seen.add(value);
54
- if (Array.isArray(value)) {
55
- return value.map((item) => serializeValue(item, seen));
48
+ try {
49
+ if (Array.isArray(value)) {
50
+ return value.map((item) => serializeValue(item, seen));
51
+ }
52
+ return Object.fromEntries(
53
+ Object.entries(value).map(([key, item]) => [key, serializeValue(item, seen)])
54
+ );
55
+ } finally {
56
+ seen.delete(value);
56
57
  }
57
- return Object.fromEntries(
58
- Object.entries(value).map(([key, item]) => [key, serializeValue(item, seen)])
59
- );
60
58
  };
61
59
  var getLogLevel = () => {
62
60
  const configured = typeof process !== "undefined" && typeof process.env?.NOLO_LOG_LEVEL === "string" ? process.env.NOLO_LOG_LEVEL : "info";
@@ -107,6 +105,12 @@ var createClientLogger = (name, parentFields = {}) => {
107
105
  };
108
106
  };
109
107
 
108
+ // packages/core/abortError.ts
109
+ function isAbortError(error) {
110
+ if (!error || typeof error !== "object") return false;
111
+ return error.name === "AbortError";
112
+ }
113
+
110
114
  // packages/app/utils/retryFetch.ts
111
115
  var TRANSIENT_READ_RETRY_STATUSES = /* @__PURE__ */ new Set([502, 503, 504]);
112
116
  var DEFAULT_RETRY_DELAYS_MS = [300, 1e3];