nolo-cli 0.33.0-alpha.8 → 0.34.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (158) hide show
  1. package/{_executeModel-RI6DRQTP.js → _executeModel-BUYCXZCQ.js} +65 -65
  2. package/{action-SMLG6OTB.js → action-KMBZ3LCZ.js} +12 -12
  3. package/{addContentAction-SFO244QN.js → addContentAction-KQ44UT2U.js} +10 -10
  4. package/{addDialogAgentAction-W44ZCEHB.js → addDialogAgentAction-ILSDCMYL.js} +9 -9
  5. package/{agentDeleteCommand-F2P4PF6R.js → agentDeleteCommand-WSS2IJVM.js} +40 -39
  6. package/{agentEmailCommands-BW6ZDQ3C.js → agentEmailCommands-SHTPJTSX.js} +75 -75
  7. package/{agentListCommands-IC3GH45S.js → agentListCommands-GV6UYVAF.js} +47 -37
  8. package/{agentMachineCommands-LGYGQX75.js → agentMachineCommands-FLD7TAFH.js} +37 -36
  9. package/agentProviderCommands-65ZC2WB4.js +122 -0
  10. package/{agentPullCommand-YH5GEBK4.js → agentPullCommand-TSWAJPS2.js} +1 -1
  11. package/agentRecordCommands-57W6R7QW.js +113 -0
  12. package/{agentRunCommand-F5L6GPSK.js → agentRunCommand-HJGXSMDN.js} +78 -76
  13. package/{agentRunControl-SCIVRZWX.js → agentRunControl-GXOB47YI.js} +5 -1
  14. package/{agentRuntimeLocal-B7SHOEHJ.js → agentRuntimeLocal-G7ZV55I6.js} +33 -33
  15. package/{agentSlice-GMKJKCPY.js → agentSlice-HFR7SP3B.js} +12 -12
  16. package/agentSuperviseCommands-Q64S5SPG.js +640 -0
  17. package/{appDeleteCommands-63VCZ5CT.js → appDeleteCommands-SHHE56Y2.js} +35 -34
  18. package/{appDeployCommands-YFTG2P3K.js → appDeployCommands-WUMSO2VS.js} +35 -34
  19. package/{appDeployStatusCommands-R5ENU5CQ.js → appDeployStatusCommands-VZSVN6SR.js} +35 -34
  20. package/{appGetCommands-3CH3VMUB.js → appGetCommands-ZJ2C3A5Y.js} +35 -34
  21. package/{appListCommands-Q2HVYG7J.js → appListCommands-W33L6U5X.js} +35 -34
  22. package/{authCommand-6Y5LTMZB.js → authCommand-B2XRHNJH.js} +19 -19
  23. package/{authCommands-EAPFGNHN.js → authCommands-GWABTFMR.js} +6 -6
  24. package/{chatQueueReduxAdapter-ZRFKEKD3.js → chatQueueReduxAdapter-SYIX4ODY.js} +28 -28
  25. package/{chunk-57QJXIB6.js → chunk-23KKIMD5.js} +7 -7
  26. package/{chunk-HUCT7HID.js → chunk-2KO5QQFV.js} +2 -2
  27. package/{chunk-2UECQ7RE.js → chunk-3AOLVADY.js} +1 -1
  28. package/{chunk-PVVAWIUN.js → chunk-3LWZNEGQ.js} +1 -1
  29. package/{chunk-2GKZGZBN.js → chunk-3XZUNRYF.js} +33 -158
  30. package/{chunk-M2YMQOLC.js → chunk-4APLX2RT.js} +75 -10
  31. package/{chunk-ZHYK3N56.js → chunk-4AWH4LQA.js} +3 -1
  32. package/{chunk-3GZXL6FM.js → chunk-4DMPISV6.js} +7 -3
  33. package/chunk-4HOXB6SY.js +297 -0
  34. package/{chunk-OIQPORYI.js → chunk-64KIQZA2.js} +175 -2
  35. package/{chunk-MUCM2MZB.js → chunk-6KYCG5GW.js} +1216 -690
  36. package/chunk-6XG52ZQ6.js +146 -0
  37. package/{chunk-XFV2VK7O.js → chunk-74IQ5RRO.js} +21 -8
  38. package/{chunk-FMEVI5TG.js → chunk-7CH6U3FL.js} +1 -1
  39. package/{chunk-6FNS3SQF.js → chunk-7YDKVLAE.js} +10 -10
  40. package/{chunk-LZC5YX6P.js → chunk-AUH2LTIY.js} +7 -7
  41. package/{chunk-CLP2K7U4.js → chunk-B6H5XCT2.js} +8 -8
  42. package/{chunk-NNWHHCVP.js → chunk-BMB563Y6.js} +10 -4
  43. package/{chunk-DFUPZE6V.js → chunk-C6ELZQ7H.js} +249 -34
  44. package/{chunk-XL7BR2GE.js → chunk-DX6BP4K7.js} +285 -251
  45. package/{chunk-6HYVJV7B.js → chunk-ESHYE7WU.js} +2 -1
  46. package/{chunk-JZPBVBIY.js → chunk-FD36SCCD.js} +19 -8
  47. package/{chunk-W7J5HZI7.js → chunk-FDKEDU7R.js} +14 -14
  48. package/{chunk-AOXVOC6D.js → chunk-FGLKRJDI.js} +54 -3
  49. package/{chunk-2QTEYCR7.js → chunk-FTM4KUOZ.js} +17 -17
  50. package/{chunk-U4TRT5V4.js → chunk-GEPHJJW4.js} +1 -1
  51. package/{chunk-7YYHKBJP.js → chunk-GKHV4UH5.js} +1 -1
  52. package/{chunk-2IVEXF7P.js → chunk-GUYMR3JL.js} +6 -33
  53. package/{chunk-YDTYDA5W.js → chunk-GZRMWK5R.js} +6 -4
  54. package/{chunk-KBZCACG7.js → chunk-HDT2RB7T.js} +3 -3
  55. package/{chunk-X664KVEV.js → chunk-HHBXCRJS.js} +204 -123
  56. package/{chunk-37V5LNEQ.js → chunk-IFS5CUEH.js} +1 -1
  57. package/{chunk-WLH5BAKX.js → chunk-IIOHYLIG.js} +9 -4
  58. package/{chunk-ADLYMQB6.js → chunk-IZCHPD7T.js} +52 -3
  59. package/{chunk-ITIA6OAQ.js → chunk-IZNJDUJ4.js} +5 -5
  60. package/{chunk-X2DAEZ3X.js → chunk-J5NMOM35.js} +1 -1
  61. package/{chunk-PREQU5QV.js → chunk-JI2TIPLP.js} +1 -1
  62. package/{chunk-EGRJC4ZN.js → chunk-JIADXJYU.js} +1 -1
  63. package/{chunk-IHEC7VBF.js → chunk-K4KIFRIN.js} +1 -1
  64. package/{chunk-JCGIUBE3.js → chunk-KCBK4MDT.js} +294 -54
  65. package/{chunk-WJSW43QZ.js → chunk-L3JWI7WX.js} +0 -1
  66. package/{chunk-VOBUVWP5.js → chunk-LAUUAYLK.js} +39 -2672
  67. package/{chunk-TFPUAELY.js → chunk-LD6Y6RJY.js} +4 -4
  68. package/{chunk-NKFMFT4W.js → chunk-LQ6PUHW6.js} +4195 -2631
  69. package/chunk-M3JQWYBC.js +387 -0
  70. package/{chunk-GM6PU7B6.js → chunk-MEYIRKDN.js} +0 -1
  71. package/{chunk-JZ5AMMXU.js → chunk-MGIHZ5CJ.js} +4 -4
  72. package/chunk-MI2J67UU.js +43 -0
  73. package/{chunk-JTSGWTYZ.js → chunk-MJWX4JQO.js} +2 -2
  74. package/{chunk-Q5ITEGIN.js → chunk-N4XRDM26.js} +1 -1
  75. package/{chunk-5CS33IBL.js → chunk-NQ4N4IGO.js} +11 -12
  76. package/{chunk-ZZ2MH7LE.js → chunk-O6OSWFZQ.js} +0 -1
  77. package/{chunk-ZURFOV5J.js → chunk-OFZPJ3NT.js} +13 -4
  78. package/{chunk-CHYAYZJH.js → chunk-OSCSEJJR.js} +15 -8
  79. package/{chunk-SCUETSRP.js → chunk-PV734VZX.js} +1 -1
  80. package/{chunk-7E72JMBB.js → chunk-SMPAUSX5.js} +46 -5
  81. package/{chunk-XCCGU6QB.js → chunk-U6QQLXWI.js} +1 -1
  82. package/{chunk-NUO3QFWD.js → chunk-UNHKVD2N.js} +1 -1
  83. package/{chunk-GE6IWA5N.js → chunk-UNZDCI3O.js} +126 -1
  84. package/{chunk-CPYYM4RJ.js → chunk-V5GA74HI.js} +19 -5
  85. package/{chunk-O6W5PZXA.js → chunk-VBD7W4Q6.js} +2057 -212
  86. package/{chunk-RTJWH72P.js → chunk-VD2SO4RG.js} +4 -4
  87. package/{chunk-FXFGNOT2.js → chunk-VFVCYIRQ.js} +1 -1
  88. package/{chunk-7KNERA53.js → chunk-VSA6QAGV.js} +47 -3
  89. package/{chunk-G7E4NWFE.js → chunk-W445DPVT.js} +1 -1
  90. package/{chunk-VH2F7ZB6.js → chunk-WN5AJG5I.js} +1 -1
  91. package/{chunk-KSRFVP36.js → chunk-WRN7L5CS.js} +1 -1
  92. package/{chunk-4C7K5NXX.js → chunk-WRP5TTM6.js} +4 -84
  93. package/chunk-X2K2JSO4.js +163 -0
  94. package/{chunk-OR2HNLVO.js → chunk-X6EN3KJX.js} +279 -477
  95. package/{chunk-IL545V3E.js → chunk-XQES6LXQ.js} +2 -2
  96. package/{chunk-UK5JGQVU.js → chunk-XT73C4VH.js} +26 -21
  97. package/{chunk-RY57GLGW.js → chunk-YPREESF4.js} +42 -5
  98. package/{chunk-YBPAQV37.js → chunk-YRP7LG4R.js} +4527 -4080
  99. package/{chunk-BQXOGBFN.js → chunk-YZ2WE6CW.js} +2 -2
  100. package/{chunk-3WXRAHCG.js → chunk-ZBB3MZR3.js} +3 -3
  101. package/{cliExecutor-DW3PHGEL.js → cliExecutor-BBUVQU4L.js} +2 -2
  102. package/{clipboardy-MMBYVRLF.js → clipboardy-PRUHGPGC.js} +4 -3
  103. package/{codingSkills-DY5MINPG.js → codingSkills-H6N5EKSX.js} +3 -3
  104. package/cooldownCommands-C2SZLEEO.js +90 -0
  105. package/{createAgentAutomationAction-6SE7CQ7F.js → createAgentAutomationAction-BH3D2L2H.js} +28 -30
  106. package/{createDialogAction-AROAXAPM.js → createDialogAction-U4LDV2RW.js} +31 -33
  107. package/{createPageAction-GCO3R6GR.js → createPageAction-Q2ANG535.js} +30 -32
  108. package/{dbSlice-3SD5L5H2.js → dbSlice-PIQGICNM.js} +9 -9
  109. package/{deleteFile-XQXPBFFB.js → deleteFile-NPZ64DFN.js} +4 -4
  110. package/{dialogCommands-N26NNRRD.js → dialogCommands-C556D6WD.js} +37 -36
  111. package/{dialogSlice-JVPBOMFB.js → dialogSlice-P2VSKG2X.js} +27 -27
  112. package/dist-VODFSGNG.js +7442 -0
  113. package/{docCreateCommands-PON6FF4V.js → docCreateCommands-AAVGLQWE.js} +36 -35
  114. package/{docDeleteCommands-WWRFONDS.js → docDeleteCommands-PKMKSQD2.js} +37 -36
  115. package/{docReadCommands-S4Z275LB.js → docReadCommands-2WUH7UXC.js} +36 -35
  116. package/{docStore-WGDO3I76.js → docStore-J5UWRBB4.js} +29 -31
  117. package/{docUpdateCommands-TJQB4IJ7.js → docUpdateCommands-B2N4E5HQ.js} +38 -37
  118. package/{fetchMessages-7QRCCRYK.js → fetchMessages-CUEFN4GQ.js} +4 -4
  119. package/{getPricing-L2ENXWHV.js → getPricing-P3E2WRIH.js} +5 -5
  120. package/{handleSendMessageAction-T7AS7DDY.js → handleSendMessageAction-RRZ53YYH.js} +29 -29
  121. package/index.js +92 -77
  122. package/{localDialogRead-SLMPV5SK.js → localDialogRead-P7CHFMIC.js} +1 -1
  123. package/{localRuntimeAuthority-E3R24J4T.js → localRuntimeAuthority-S77B5QVB.js} +6 -2
  124. package/{localRuntimeDb-DDZCJFQZ.js → localRuntimeDb-N3H3HQ7G.js} +1 -1
  125. package/{machineCommands-C6CPXZRR.js → machineCommands-CWKMJG33.js} +77 -77
  126. package/{machineInfo-M6KB6HZN.js → machineInfo-66ZFUMLE.js} +1 -1
  127. package/{machineWsRunDispatch-27K2P4OP.js → machineWsRunDispatch-UYNVNX4A.js} +69 -69
  128. package/{models-OX2S5C6Q.js → models-L7S2EKPM.js} +2 -2
  129. package/package.json +1 -1
  130. package/{read-6G73BMEY.js → read-6C2XD3YZ.js} +5 -5
  131. package/{readDocTool-DK4EI2GA.js → readDocTool-Y7AB365O.js} +1 -1
  132. package/{readlineWorkspace-LBWKTPJE.js → readlineWorkspace-VYELP22P.js} +2851 -1515
  133. package/{removeDialogAgentAction-E7H557UO.js → removeDialogAgentAction-KG5WMJRZ.js} +13 -13
  134. package/{runAgentClientLoop-D2T2P36H.js → runAgentClientLoop-35GKZDOZ.js} +62 -61
  135. package/{runtimeDoctorCommands-KIKM6BIO.js → runtimeDoctorCommands-HT4O2PXL.js} +6 -6
  136. package/{setDialogExtraReferencesAction-RMMGBR5F.js → setDialogExtraReferencesAction-O2NLXMSM.js} +10 -10
  137. package/{setPrimaryDialogAgentAction-FWBKKLVA.js → setPrimaryDialogAgentAction-FYYUY7PB.js} +13 -13
  138. package/{settingSlice-73PV4KG4.js → settingSlice-GPLI6E3M.js} +11 -11
  139. package/{skillDiscovery-KLLKXPUO.js → skillDiscovery-COX56OBO.js} +3 -3
  140. package/{slateUtils-VO2FU36K.js → slateUtils-RIZES3PV.js} +1 -1
  141. package/{spaceCommands-B6LO4U5R.js → spaceCommands-AAKQM2PM.js} +223 -37
  142. package/{spaceSlice-VUAEZVDS.js → spaceSlice-NSNGR4Y2.js} +28 -30
  143. package/{streamAgentChatTurn-BBPSFMTZ.js → streamAgentChatTurn-D5IDHXMV.js} +116 -129
  144. package/{switchDialogAgentAction-US6QNL3N.js → switchDialogAgentAction-GH5P6Q3Z.js} +9 -9
  145. package/{chunk-IDAU4UFS.js → syncMapping-N6RGXGBW.js} +11 -11
  146. package/{tableCommands-QE47K72R.js → tableCommands-PQUJ55AS.js} +3 -3
  147. package/{tools-NWA3J7KE.js → tools-JQOETZP5.js} +44 -45
  148. package/{tuiSummaryLlmCaller-KC7JCJBB.js → tuiSummaryLlmCaller-LH7F2SP7.js} +18 -18
  149. package/{updateCommands-AK2RDOFR.js → updateCommands-MNDUIKN7.js} +2 -2
  150. package/{updateDialogTitleAction-TDDQ4J4L.js → updateDialogTitleAction-WOTSDSFQ.js} +31 -33
  151. package/agentRecordCommands-FCQ7ZF6C.js +0 -113
  152. package/chunk-5SBK2MTI.js +0 -528
  153. package/chunk-M3JEW6N6.js +0 -193
  154. package/chunk-OOK2ZT5F.js +0 -1800
  155. package/syncMapping-RK2MANUX.js +0 -43
  156. package/{chunk-KMSZPTM6.js → chunk-2WKUUY2E.js} +3 -3
  157. package/{chunk-CWMSB67P.js → chunk-AGGIDPCZ.js} +0 -0
  158. package/{chunk-SAQQLJZ5.js → chunk-JDSUTNYY.js} +3 -3
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  readDbRecord,
3
3
  writeAgentRecord
4
- } from "./chunk-YDTYDA5W.js";
4
+ } from "./chunk-GZRMWK5R.js";
5
5
  import {
6
6
  buildSkillSummaryMarker
7
7
  } from "./chunk-VF4K2QE6.js";
@@ -13,7 +13,7 @@ import {
13
13
  } from "./chunk-A7GB5UGH.js";
14
14
  import {
15
15
  createSpaceKey
16
- } from "./chunk-JTSGWTYZ.js";
16
+ } from "./chunk-MJWX4JQO.js";
17
17
  import {
18
18
  asTrimmedLowercaseString
19
19
  } from "./chunk-QSJ3HFEF.js";
@@ -1,3 +1,6 @@
1
+ import {
2
+ publicAgentKey
3
+ } from "./chunk-BJIRLHJR.js";
1
4
  import {
2
5
  getRuntimeServerContext,
3
6
  partitionReadServers,
@@ -7,20 +10,17 @@ import {
7
10
  scheduleExistingRecordReplication,
8
11
  shouldReplaceLocalWithRemoteRecord,
9
12
  shouldReplicateLocalRecord
10
- } from "./chunk-X664KVEV.js";
13
+ } from "./chunk-HHBXCRJS.js";
11
14
  import {
12
15
  fetchFromClientDb,
13
16
  fetchFromServer,
14
17
  isAbortError,
15
18
  isReadTimeoutError,
16
19
  logger
17
- } from "./chunk-WJSW43QZ.js";
20
+ } from "./chunk-L3JWI7WX.js";
18
21
  import {
19
22
  shouldReplaceWithNextRecord
20
23
  } from "./chunk-GBRG75BQ.js";
21
- import {
22
- publicAgentKey
23
- } from "./chunk-BJIRLHJR.js";
24
24
  import {
25
25
  NOLO_CLUSTER_SERVERS,
26
26
  normalizeKnownServerOrigin
@@ -92,10 +92,25 @@ var BUILTIN_AGENT_CATALOG = [
92
92
  model: "deepseek-v4-pro",
93
93
  runtimeFallback: true
94
94
  },
95
+ {
96
+ id: "01GLM52DIPB00000000I3E2MY",
97
+ group: "public",
98
+ name: "GLM 5.3",
99
+ provider: "nolo",
100
+ model: "glm-5.3",
101
+ runtimeFallback: true
102
+ },
103
+ {
104
+ id: "01GLMFLASHPB00000000BT20BC",
105
+ group: "public",
106
+ name: "GLM 5.3 Flash",
107
+ provider: "nolo",
108
+ model: "glm-5-3-flash",
109
+ runtimeFallback: true
110
+ },
95
111
  {
96
112
  id: "01KIMIK26OLLAMA0000000001",
97
113
  // 已下架的公共入口:保留 internal catalog entry 仅用于旧 Agent 记录的运行时兼容。
98
- // 旧 nolo/kimi-k2.6 请求由 platformHosted 路由到 OpenRouter qwen/qwen3.8-27b。
99
114
  group: "internal",
100
115
  name: "Kimi K2.6\uFF08\u517C\u5BB9\uFF09",
101
116
  provider: "nolo",
@@ -172,16 +187,6 @@ var BUILTIN_AGENT_CATALOG = [
172
187
  model: "gemini-3.7-flash",
173
188
  runtimeFallback: true
174
189
  },
175
- {
176
- id: "01QWEN37FLASH000000000001",
177
- // 内部图片预处理器(imagePreprocessing.ts),不是广场商品:只需运行时兜底
178
- // 拿到 provider/model,不应被 seed 写库、上架或计费。
179
- group: "internal",
180
- name: "Qwen 3.7 Flash",
181
- provider: "nolo",
182
- model: "qwen3.7-flash",
183
- runtimeFallback: true
184
- },
185
190
  {
186
191
  id: "01GPTIMG2GEN00000000SSEBOS",
187
192
  group: "public",
@@ -268,10 +273,10 @@ var PUBLIC_DEEPSEEK_V4_FLASH_AGENT_ID = entry("01DSV4FLASHPB00000000JFPFD").id;
268
273
  var PUBLIC_DEEPSEEK_V4_FLASH_AGENT_KEY = publicAgentKey(PUBLIC_DEEPSEEK_V4_FLASH_AGENT_ID);
269
274
  var PUBLIC_DEEPSEEK_V4_PRO_AGENT_ID = entry("01DSV4PRONPB00000001VIR3EK").id;
270
275
  var PUBLIC_DEEPSEEK_V4_PRO_AGENT_KEY = publicAgentKey(PUBLIC_DEEPSEEK_V4_PRO_AGENT_ID);
276
+ var PUBLIC_GLM_53_FLASH_AGENT_ID = entry("01GLMFLASHPB00000000BT20BC").id;
277
+ var PUBLIC_GLM_53_FLASH_AGENT_KEY = publicAgentKey(PUBLIC_GLM_53_FLASH_AGENT_ID);
271
278
  var PUBLIC_KIMI_K26_IMAGE_AGENT_ID = entry("01KIMIK26OLLAMA0000000001").id;
272
279
  var PUBLIC_KIMI_K26_IMAGE_AGENT_KEY = publicAgentKey(PUBLIC_KIMI_K26_IMAGE_AGENT_ID);
273
- var PUBLIC_QWEN_37_FLASH_AGENT_ID = entry("01QWEN37FLASH000000000001").id;
274
- var PUBLIC_QWEN_37_FLASH_AGENT_KEY = publicAgentKey(PUBLIC_QWEN_37_FLASH_AGENT_ID);
275
280
  var PUBLIC_GPT_IMAGE_2_GENERATOR_AGENT_ID = entry("01GPTIMG2GEN00000000SSEBOS").id;
276
281
  var PUBLIC_GPT_IMAGE_2_GENERATOR_AGENT_KEY = publicAgentKey(PUBLIC_GPT_IMAGE_2_GENERATOR_AGENT_ID);
277
282
  var PUBLIC_GPT_IMAGE_2_EDITOR_AGENT_ID = entry("01GPTIMG2EDT00000001R4R4H4").id;
@@ -285,7 +290,8 @@ var DEFAULT_CODE_PLANNER_EXECUTOR_CANDIDATE_KEYS = [
285
290
  ];
286
291
  var SYSTEM_BUILTIN_TRUSTED_AGENT_KEYS = [
287
292
  PUBLIC_DEEPSEEK_V4_FLASH_AGENT_KEY,
288
- PUBLIC_DEEPSEEK_V4_PRO_AGENT_KEY
293
+ PUBLIC_DEEPSEEK_V4_PRO_AGENT_KEY,
294
+ PUBLIC_GLM_53_FLASH_AGENT_KEY
289
295
  ];
290
296
  var SYSTEM_BUILTIN_TRUSTED_AGENT_KEY_SET = new Set(
291
297
  SYSTEM_BUILTIN_TRUSTED_AGENT_KEYS
@@ -706,17 +712,16 @@ var readAction = async (payload, thunkApi) => {
706
712
  };
707
713
 
708
714
  export {
715
+ readRequestManager,
709
716
  builtinAgentCatalogEntryById,
710
717
  builtinRuntimeFallbackEntries,
711
718
  BUILTIN_NOLO_AGENT_KEY,
712
719
  BUILTIN_NOLO_AGENT_NAME,
713
720
  BUILTIN_NOLO_AGENT_MODEL,
714
721
  PUBLIC_DEEPSEEK_V4_FLASH_AGENT_KEY,
715
- PUBLIC_QWEN_37_FLASH_AGENT_KEY,
716
722
  DEFAULT_CODE_PLANNER_EXECUTOR_CANDIDATE_KEYS,
717
723
  isSystemBuiltinTrustedAgentKey,
718
724
  isBuiltinPlatformAgentKey,
719
- readRequestManager,
720
725
  resolveAgentReadServers,
721
726
  readAction
722
727
  };
@@ -79,12 +79,28 @@ function reduceChatQueue(state, event) {
79
79
  queue: [...state.queue, req]
80
80
  };
81
81
  }
82
+ case "steer": {
83
+ const req = createTurnRequest(event.text);
84
+ if (!req.text.trim() && req.event.kind === "user") {
85
+ return state;
86
+ }
87
+ return {
88
+ ...state,
89
+ queue: [req, ...state.queue]
90
+ };
91
+ }
82
92
  case "dequeue":
83
93
  if (state.queue.length === 0) return state;
84
94
  return {
85
95
  ...state,
86
96
  queue: state.queue.slice(1)
87
97
  };
98
+ case "recall-last":
99
+ if (state.queue.length === 0) return state;
100
+ return {
101
+ ...state,
102
+ queue: state.queue.slice(0, -1)
103
+ };
88
104
  case "clear":
89
105
  if (state.queue.length === 0 && state.lastDrainError === null) return state;
90
106
  return {
@@ -117,7 +133,8 @@ function shouldDrainAfterTurnEnd(state, cleanTurnEnd) {
117
133
  return cleanTurnEnd && !state.running && !state.drainPaused && state.queue.length > 0;
118
134
  }
119
135
  function applyChatQueueEvent(state, event) {
120
- const prevQueueLen = state.queue.length;
136
+ const prevQueue = state.queue;
137
+ const prevQueueLen = prevQueue.length;
121
138
  const prevRunning = state.running;
122
139
  const prevPaused = state.drainPaused;
123
140
  const next = reduceChatQueue(state, event);
@@ -131,10 +148,30 @@ function applyChatQueueEvent(state, event) {
131
148
  if (next.drainPaused !== prevPaused) {
132
149
  outgoing.push({ type: "drain-paused-changed", paused: next.drainPaused });
133
150
  }
134
- if (event.type === "turn-end" && !event.aborted && event.ok) {
135
- if (shouldDrainAfterTurnEnd(next, true)) {
136
- const head = next.queue[0];
137
- outgoing.push({ type: "drain-ready", text: head.text, request: head });
151
+ if (event.type === "recall-last" && prevQueueLen > 0) {
152
+ const last = prevQueue[prevQueueLen - 1];
153
+ outgoing.push({ type: "recalled-to-draft", text: last.text, request: last });
154
+ }
155
+ if (event.type === "steer" && next.running && next.queue.length > prevQueueLen) {
156
+ const head = next.queue[0];
157
+ if (head) {
158
+ outgoing.push({ type: "steer-ready", text: head.text, request: head });
159
+ }
160
+ }
161
+ if (event.type === "turn-end") {
162
+ if (event.aborted && prevQueueLen > 0) {
163
+ const first = prevQueue[0];
164
+ outgoing.push({
165
+ type: "aborted-draft-refill",
166
+ text: first.text,
167
+ request: first,
168
+ abortedRequests: [...prevQueue]
169
+ });
170
+ } else if (!event.aborted && event.ok) {
171
+ if (shouldDrainAfterTurnEnd(next, true)) {
172
+ const head = next.queue[0];
173
+ outgoing.push({ type: "drain-ready", text: head.text, request: head });
174
+ }
138
175
  }
139
176
  }
140
177
  return { state: next, outgoing };