@tunnelbox/dsh-tunnelbox 0.1.7 → 0.1.9

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 (2) hide show
  1. package/dist/index.mjs +132 -3
  2. package/package.json +2 -2
package/dist/index.mjs CHANGED
@@ -106,6 +106,9 @@ var zh_CN_default = {
106
106
  "agent.log.gotPermReply": "\u6536\u5230\u624B\u673A\u6743\u9650\u56DE\u590D (id={id} {reply} {version})",
107
107
  "agent.log.gotQuestionReply": "\u6536\u5230\u624B\u673A\u63D0\u95EE\u56DE\u590D (id={id} {status} {version})",
108
108
  "agent.log.handleFailed": "\u5904\u7406 {type} \u5931\u8D25: {message}",
109
+ "agent.log.msgOk": "\u62C9\u53D6\u4F1A\u8BDD\u6D88\u606F\u6210\u529F session={session} data={count} \u65B9\u5F0F={limited} win={win} ms={ms}",
110
+ "agent.log.msgFailed": "\u62C9\u53D6\u4F1A\u8BDD\u6D88\u606F\u5931\u8D25 session={session} err={err} ms={ms}",
111
+ "agent.log.msgLimitFallback": "\u5F53\u524D opencode \u4E0D\u652F\u6301 limit\uFF0C\u56DE\u9000\u5168\u91CF\u62C9\u53D6\uFF08session={session}\uFF09",
109
112
  "agent.log.httpOk": "opencode HTTP {status} {path}",
110
113
  "agent.log.pendingResent": "session.pending: \u8865\u53D1 {session} \u79EF\u538B\u8BF7\u6C42 {count} \u6761",
111
114
  "agent.log.unhandledType": "\u672A\u5904\u7406\u7684\u6D88\u606F\u7C7B\u578B: {type}",
@@ -117,6 +120,7 @@ var zh_CN_default = {
117
120
  "index.error.pairTimeout": "\u7B49\u5F85\u914D\u5BF9\u7801\u8D85\u65F6\uFF08\u4E2D\u7EE7\u672A\u54CD\u5E94\uFF09",
118
121
  "index.log.claimed": "\u5DF2\u7ED1\u5B9A\u5230\u624B\u673A\u8D26\u53F7\uFF0C\u4E4B\u540E\u624B\u673A\u4ECE\u300C\u6211\u7684\u7535\u8111\u300D\u76F4\u63A5\u8FDE\u63A5\uFF0C\u65E0\u9700\u518D\u626B\u7801",
119
122
  "index.log.connectedRelay": "\u5DF2\u8FDE\u63A5\u4E2D\u7EE7 {url}",
123
+ "index.log.loaded": "tunnelbox opencode \u63D2\u4EF6\u5DF2\u542F\u52A8\uFF08v{version}\uFF09",
120
124
  "index.log.disconnected": "\u4E0E\u4E2D\u7EE7\u65AD\u5F00\uFF0C\u6B63\u5728\u81EA\u52A8\u91CD\u8FDE\u2026",
121
125
  "index.log.exit": "\u5DF2\u9000\u51FA",
122
126
  "index.log.pairCode": "\u751F\u6210\u914D\u5BF9\u7801: {code}",
@@ -267,6 +271,9 @@ var zh_TW_default = {
267
271
  "agent.log.gotPermReply": "\u6536\u5230\u624B\u6A5F\u6B0A\u9650\u56DE\u8986 (id={id} {reply} {version})",
268
272
  "agent.log.gotQuestionReply": "\u6536\u5230\u624B\u6A5F\u63D0\u554F\u56DE\u8986 (id={id} {status} {version})",
269
273
  "agent.log.handleFailed": "\u8655\u7406 {type} \u5931\u6557: {message}",
274
+ "agent.log.msgOk": "\u53D6\u5F97\u6703\u8A71\u8A0A\u606F\u6210\u529F session={session} data={count} \u65B9\u5F0F={limited} win={win} ms={ms}",
275
+ "agent.log.msgFailed": "\u53D6\u5F97\u6703\u8A71\u8A0A\u606F\u5931\u6557 session={session} err={err} ms={ms}",
276
+ "agent.log.msgLimitFallback": "\u76EE\u524D\u7684 opencode \u4E0D\u652F\u63F4 limit\uFF0C\u6539\u70BA\u5168\u91CF\u53D6\u5F97\uFF08session={session}\uFF09",
270
277
  "agent.log.httpOk": "opencode HTTP {status} {path}",
271
278
  "agent.log.pendingResent": "session.pending: \u88DC\u767C {session} \u7A4D\u58D3\u8ACB\u6C42 {count} \u689D",
272
279
  "agent.log.unhandledType": "\u672A\u8655\u7406\u7684\u8A0A\u606F\u985E\u578B: {type}",
@@ -278,6 +285,7 @@ var zh_TW_default = {
278
285
  "index.error.pairTimeout": "\u7B49\u5F85\u914D\u5C0D\u78BC\u903E\u6642\uFF08\u4E2D\u7E7C\u672A\u56DE\u61C9\uFF09",
279
286
  "index.log.claimed": "\u5DF2\u7D81\u5B9A\u5230\u624B\u6A5F\u5E33\u865F\uFF0C\u4E4B\u5F8C\u624B\u6A5F\u76F4\u63A5\u5F9E\u300C\u6211\u7684\u96FB\u8166\u300D\u9023\u63A5\uFF0C\u4E0D\u9700\u518D\u6383\u78BC",
280
287
  "index.log.connectedRelay": "\u5DF2\u9023\u63A5\u4E2D\u7E7C {url}",
288
+ "index.log.loaded": "tunnelbox opencode \u5916\u639B\u5DF2\u555F\u52D5\uFF08v{version}\uFF09",
281
289
  "index.log.disconnected": "\u8207\u4E2D\u7E7C\u65B7\u7DDA\uFF0C\u6B63\u5728\u81EA\u52D5\u91CD\u9023\u2026",
282
290
  "index.log.exit": "\u5DF2\u9000\u51FA",
283
291
  "index.log.pairCode": "\u7522\u751F\u914D\u5C0D\u78BC: {code}",
@@ -428,6 +436,9 @@ var en_US_default = {
428
436
  "agent.log.gotPermReply": "Received permission reply from phone (id={id} {reply} {version})",
429
437
  "agent.log.gotQuestionReply": "Received question reply from phone (id={id} {status} {version})",
430
438
  "agent.log.handleFailed": "Failed to handle {type}: {message}",
439
+ "agent.log.msgOk": "session.messages OK session={session} data={count} limited={limited} win={win} ms={ms}",
440
+ "agent.log.msgFailed": "session.messages FAILED session={session} err={err} ms={ms}",
441
+ "agent.log.msgLimitFallback": "limit unsupported, fell back to full session fetch (session={session})",
431
442
  "agent.log.httpOk": "opencode HTTP {status} {path}",
432
443
  "agent.log.pendingResent": "session.pending: resent {count} pending request(s) for {session}",
433
444
  "agent.log.unhandledType": "Unhandled message type: {type}",
@@ -439,6 +450,7 @@ var en_US_default = {
439
450
  "index.error.pairTimeout": "Timed out waiting for a pairing code (the relay did not respond)",
440
451
  "index.log.claimed": "Bound to your phone account. From now on the phone connects directly from My Computers; no need to scan again",
441
452
  "index.log.connectedRelay": "Connected to relay {url}",
453
+ "index.log.loaded": "tunnelbox opencode plugin started (v{version})",
442
454
  "index.log.disconnected": "Disconnected from relay, reconnecting automatically\u2026",
443
455
  "index.log.exit": "Exited",
444
456
  "index.log.pairCode": "Generated pairing code: {code}",
@@ -589,6 +601,9 @@ var ja_JP_default = {
589
601
  "agent.log.gotPermReply": "\u643A\u5E2F\u304B\u3089\u6A29\u9650\u306E\u8FD4\u4FE1\u3092\u53D7\u4FE1 (id={id} {reply} {version})",
590
602
  "agent.log.gotQuestionReply": "\u643A\u5E2F\u304B\u3089\u8CEA\u554F\u306E\u8FD4\u4FE1\u3092\u53D7\u4FE1 (id={id} {status} {version})",
591
603
  "agent.log.handleFailed": "{type} \u306E\u51E6\u7406\u306B\u5931\u6557: {message}",
604
+ "agent.log.msgOk": "\u30BB\u30C3\u30B7\u30E7\u30F3\u30E1\u30C3\u30BB\u30FC\u30B8\u53D6\u5F97\u6210\u529F session={session} data={count} \u65B9\u5F0F={limited} win={win} ms={ms}",
605
+ "agent.log.msgFailed": "\u30BB\u30C3\u30B7\u30E7\u30F3\u30E1\u30C3\u30BB\u30FC\u30B8\u53D6\u5F97\u5931\u6557 session={session} err={err} ms={ms}",
606
+ "agent.log.msgLimitFallback": "\u3053\u306E opencode \u306F limit \u975E\u5BFE\u5FDC\u306E\u305F\u3081\u5168\u91CF\u53D6\u5F97\u306B\u30D5\u30A9\u30FC\u30EB\u30D0\u30C3\u30AF\uFF08session={session}\uFF09",
592
607
  "agent.log.httpOk": "opencode HTTP {status} {path}",
593
608
  "agent.log.pendingResent": "session.pending: {session} \u306E\u4FDD\u7559\u30EA\u30AF\u30A8\u30B9\u30C8 {count} \u4EF6\u3092\u518D\u9001",
594
609
  "agent.log.unhandledType": "\u672A\u51E6\u7406\u306E\u30E1\u30C3\u30BB\u30FC\u30B8\u30BF\u30A4\u30D7: {type}",
@@ -600,6 +615,7 @@ var ja_JP_default = {
600
615
  "index.error.pairTimeout": "\u30DA\u30A2\u30EA\u30F3\u30B0\u30B3\u30FC\u30C9\u306E\u53D6\u5F97\u304C\u30BF\u30A4\u30E0\u30A2\u30A6\u30C8\u3057\u307E\u3057\u305F\uFF08\u30EA\u30EC\u30FC\u304C\u5FDC\u7B54\u3057\u307E\u305B\u3093\uFF09",
601
616
  "index.log.claimed": "\u30B9\u30DE\u30DB\u306E\u30A2\u30AB\u30A6\u30F3\u30C8\u306B\u7D10\u4ED8\u3051\u307E\u3057\u305F\u3002\u4EE5\u964D\u306F\u300C\u30DE\u30A4 PC\u300D\u304B\u3089\u76F4\u63A5\u63A5\u7D9A\u3055\u308C\u308B\u305F\u3081\u3001\u518D\u30B9\u30AD\u30E3\u30F3\u306F\u4E0D\u8981\u3067\u3059",
602
617
  "index.log.connectedRelay": "\u30EA\u30EC\u30FC\u306B\u63A5\u7D9A\u3057\u307E\u3057\u305F {url}",
618
+ "index.log.loaded": "tunnelbox opencode \u30D7\u30E9\u30B0\u30A4\u30F3\u3092\u8D77\u52D5\u3057\u307E\u3057\u305F\uFF08v{version}\uFF09",
603
619
  "index.log.disconnected": "\u30EA\u30EC\u30FC\u304B\u3089\u5207\u65AD\u3001\u81EA\u52D5\u7684\u306B\u518D\u63A5\u7D9A\u3057\u3066\u3044\u307E\u3059\u2026",
604
620
  "index.log.exit": "\u7D42\u4E86\u3057\u307E\u3057\u305F",
605
621
  "index.log.pairCode": "\u30DA\u30A2\u30EA\u30F3\u30B0\u30B3\u30FC\u30C9\u3092\u751F\u6210: {code}",
@@ -750,6 +766,9 @@ var ko_KR_default = {
750
766
  "agent.log.gotPermReply": "\uD734\uB300\uD3F0\uC5D0\uC11C \uAD8C\uD55C \uC751\uB2F5 \uC218\uC2E0 (id={id} {reply} {version})",
751
767
  "agent.log.gotQuestionReply": "\uD734\uB300\uD3F0\uC5D0\uC11C \uC9C8\uBB38 \uC751\uB2F5 \uC218\uC2E0 (id={id} {status} {version})",
752
768
  "agent.log.handleFailed": "{type} \uCC98\uB9AC \uC2E4\uD328: {message}",
769
+ "agent.log.msgOk": "\uC138\uC158 \uBA54\uC2DC\uC9C0 \uC870\uD68C \uC131\uACF5 session={session} data={count} \uBC29\uC2DD={limited} win={win} ms={ms}",
770
+ "agent.log.msgFailed": "\uC138\uC158 \uBA54\uC2DC\uC9C0 \uC870\uD68C \uC2E4\uD328 session={session} err={err} ms={ms}",
771
+ "agent.log.msgLimitFallback": "\uC774 opencode\uB294 limit \uBBF8\uC9C0\uC6D0 \u2192 \uC804\uCCB4 \uC870\uD68C\uB85C \uD3F4\uBC31 (session={session})",
753
772
  "agent.log.httpOk": "opencode HTTP {status} {path}",
754
773
  "agent.log.pendingResent": "session.pending: {session} \uBCF4\uB958 \uC694\uCCAD {count}\uAC74 \uC7AC\uC804\uC1A1",
755
774
  "agent.log.unhandledType": "\uCC98\uB9AC\uB418\uC9C0 \uC54A\uC740 \uBA54\uC2DC\uC9C0 \uC720\uD615: {type}",
@@ -761,6 +780,7 @@ var ko_KR_default = {
761
780
  "index.error.pairTimeout": "\uD398\uC5B4\uB9C1 \uCF54\uB4DC \uB300\uAE30 \uC2DC\uAC04 \uCD08\uACFC(\uB9B4\uB808\uC774\uAC00 \uC751\uB2F5\uD558\uC9C0 \uC54A\uC74C)",
762
781
  "index.log.claimed": "\uD734\uB300\uD3F0 \uACC4\uC815\uC5D0 \uC5F0\uACB0\uB418\uC5C8\uC2B5\uB2C8\uB2E4. \uC774\uC81C \uD734\uB300\uD3F0\uC740 \u300C\uB0B4 PC\u300D\uC5D0\uC11C \uC9C1\uC811 \uC5F0\uACB0\uD558\uBA70 \uB2E4\uC2DC \uC2A4\uCE94\uD560 \uD544\uC694\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4",
763
782
  "index.log.connectedRelay": "\uB9B4\uB808\uC774\uC5D0 \uC5F0\uACB0\uB428 {url}",
783
+ "index.log.loaded": "tunnelbox opencode \uD50C\uB7EC\uADF8\uC778\uC744 \uC2DC\uC791\uD588\uC2B5\uB2C8\uB2E4\uFF08v{version}\uFF09",
764
784
  "index.log.disconnected": "\uB9B4\uB808\uC774 \uC5F0\uACB0\uC774 \uB04A\uACA8 \uC790\uB3D9\uC73C\uB85C \uC7AC\uC5F0\uACB0 \uC911\u2026",
765
785
  "index.log.exit": "\uC885\uB8CC\uB428",
766
786
  "index.log.pairCode": "\uD398\uC5B4\uB9C1 \uCF54\uB4DC \uC0DD\uC131: {code}",
@@ -911,6 +931,9 @@ var fr_FR_default = {
911
931
  "agent.log.gotPermReply": "R\xE9ponse d'autorisation re\xE7ue du t\xE9l\xE9phone (id={id} {reply} {version})",
912
932
  "agent.log.gotQuestionReply": "R\xE9ponse de question re\xE7ue du t\xE9l\xE9phone (id={id} {status} {version})",
913
933
  "agent.log.handleFailed": "\xC9chec du traitement de {type} : {message}",
934
+ "agent.log.msgOk": "R\xE9cup\xE9ration des messages OK session={session} data={count} mode={limited} win={win} ms={ms}",
935
+ "agent.log.msgFailed": "\xC9chec de la r\xE9cup\xE9ration des messages session={session} err={err} ms={ms}",
936
+ "agent.log.msgLimitFallback": "limit non pris en charge, repli sur la r\xE9cup\xE9ration compl\xE8te (session={session})",
914
937
  "agent.log.httpOk": "opencode HTTP {status} {path}",
915
938
  "agent.log.pendingResent": "session.pending : renvoi de {count} demande(s) en attente pour {session}",
916
939
  "agent.log.unhandledType": "Type de message non g\xE9r\xE9 : {type}",
@@ -922,6 +945,7 @@ var fr_FR_default = {
922
945
  "index.error.pairTimeout": "D\xE9lai d'attente du code d'appairage d\xE9pass\xE9 (le relais ne r\xE9pond pas)",
923
946
  "index.log.claimed": "Li\xE9 \xE0 votre compte t\xE9l\xE9phone. Le t\xE9l\xE9phone se connecte d\xE9sormais directement depuis \xAB Mes PC \xBB ; plus besoin de scanner",
924
947
  "index.log.connectedRelay": "Connect\xE9 au relais {url}",
948
+ "index.log.loaded": "Plugin tunnelbox opencode d\xE9marr\xE9 (v{version})",
925
949
  "index.log.disconnected": "D\xE9connect\xE9 du relais, reconnexion automatique\u2026",
926
950
  "index.log.exit": "Arr\xEAt\xE9",
927
951
  "index.log.pairCode": "Code d'appairage g\xE9n\xE9r\xE9 : {code}",
@@ -1072,6 +1096,9 @@ var de_DE_default = {
1072
1096
  "agent.log.gotPermReply": "Berechtigungsantwort vom Telefon erhalten (id={id} {reply} {version})",
1073
1097
  "agent.log.gotQuestionReply": "Frageantwort vom Telefon erhalten (id={id} {status} {version})",
1074
1098
  "agent.log.handleFailed": "Fehler beim Verarbeiten von {type}: {message}",
1099
+ "agent.log.msgOk": "Session-Nachrichten OK session={session} data={count} Modus={limited} win={win} ms={ms}",
1100
+ "agent.log.msgFailed": "Session-Nachrichten fehlgeschlagen session={session} err={err} ms={ms}",
1101
+ "agent.log.msgLimitFallback": "limit nicht unterst\xFCtzt, R\xFCckfall auf vollst\xE4ndigen Abruf (session={session})",
1075
1102
  "agent.log.httpOk": "opencode HTTP {status} {path}",
1076
1103
  "agent.log.pendingResent": "session.pending: {count} ausstehende Anfrage(n) f\xFCr {session} erneut gesendet",
1077
1104
  "agent.log.unhandledType": "Nicht behandelter Nachrichtentyp: {type}",
@@ -1083,6 +1110,7 @@ var de_DE_default = {
1083
1110
  "index.error.pairTimeout": "Zeit\xFCberschreitung beim Warten auf einen Pairing-Code (Relay antwortet nicht)",
1084
1111
  "index.log.claimed": "An Ihr Telefonkonto gebunden. Das Telefon verbindet sich nun direkt \xFCber \u201CMeine PCs\u201D; kein erneutes Scannen n\xF6tig",
1085
1112
  "index.log.connectedRelay": "Mit Relay verbunden {url}",
1113
+ "index.log.loaded": "tunnelbox-opencode-Plugin gestartet (v{version})",
1086
1114
  "index.log.disconnected": "Vom Relay getrennt, verbinde automatisch neu\u2026",
1087
1115
  "index.log.exit": "Beendet",
1088
1116
  "index.log.pairCode": "Pairing-Code erzeugt: {code}",
@@ -1233,6 +1261,9 @@ var es_ES_default = {
1233
1261
  "agent.log.gotPermReply": "Respuesta de permiso recibida del tel\xE9fono (id={id} {reply} {version})",
1234
1262
  "agent.log.gotQuestionReply": "Respuesta de pregunta recibida del tel\xE9fono (id={id} {status} {version})",
1235
1263
  "agent.log.handleFailed": "Error al procesar {type}: {message}",
1264
+ "agent.log.msgOk": "Mensajes de sesi\xF3n OK session={session} data={count} modo={limited} win={win} ms={ms}",
1265
+ "agent.log.msgFailed": "Error al obtener mensajes de sesi\xF3n session={session} err={err} ms={ms}",
1266
+ "agent.log.msgLimitFallback": "limit no compatible; se vuelve a la obtenci\xF3n completa (session={session})",
1236
1267
  "agent.log.httpOk": "opencode HTTP {status} {path}",
1237
1268
  "agent.log.pendingResent": "session.pending: reenviadas {count} solicitud(es) pendientes para {session}",
1238
1269
  "agent.log.unhandledType": "Tipo de mensaje no gestionado: {type}",
@@ -1244,6 +1275,7 @@ var es_ES_default = {
1244
1275
  "index.error.pairTimeout": "Tiempo de espera agotado al obtener el c\xF3digo de emparejamiento (el relay no responde)",
1245
1276
  "index.log.claimed": "Vinculado a su cuenta de tel\xE9fono. El tel\xE9fono se conecta ahora directamente desde \xABMis PC\xBB; no hace falta volver a escanear",
1246
1277
  "index.log.connectedRelay": "Conectado al relay {url}",
1278
+ "index.log.loaded": "Plugin tunnelbox opencode iniciado (v{version})",
1247
1279
  "index.log.disconnected": "Desconectado del relay, reconectando autom\xE1ticamente\u2026",
1248
1280
  "index.log.exit": "Salido",
1249
1281
  "index.log.pairCode": "C\xF3digo de emparejamiento generado: {code}",
@@ -1550,6 +1582,102 @@ async function printPairing(code, type, name2, lang) {
1550
1582
  console.log(" " + tt("qr.fileWritten", { path: file }));
1551
1583
  console.log("");
1552
1584
  }
1585
+ var DEFAULT_PAGE_SIZE = 50;
1586
+ var MAX_PART_TEXT = 16e3;
1587
+ var MAX_PART_ARGS = 4e3;
1588
+ var MAX_PAGE_BYTES = 15e5;
1589
+ function capStr(s, max) {
1590
+ if (s.length <= max) return s;
1591
+ return `${s.slice(0, max)}\u2026`;
1592
+ }
1593
+ function capMessage(m) {
1594
+ let parts;
1595
+ for (let i = 0; i < m.parts.length; i++) {
1596
+ const p = m.parts[i];
1597
+ const nText = typeof p.text === "string" && p.text.length > MAX_PART_TEXT ? capStr(p.text, MAX_PART_TEXT) : p.text;
1598
+ const nDelta = typeof p.delta === "string" && p.delta.length > MAX_PART_TEXT ? capStr(p.delta, MAX_PART_TEXT) : p.delta;
1599
+ const nArgs = typeof p.args === "string" && p.args.length > MAX_PART_ARGS ? capStr(p.args, MAX_PART_ARGS) : p.args;
1600
+ if (nText !== p.text || nDelta !== p.delta || nArgs !== p.args) {
1601
+ if (!parts) parts = m.parts.slice(0, i);
1602
+ parts.push({ ...p, text: nText, delta: nDelta, args: nArgs });
1603
+ } else if (parts) {
1604
+ parts.push(p);
1605
+ }
1606
+ }
1607
+ return parts ? { ...m, parts } : m;
1608
+ }
1609
+ function capMessages(messages) {
1610
+ let changed = false;
1611
+ const out = messages.map((m) => {
1612
+ const c = capMessage(m);
1613
+ if (c !== m) changed = true;
1614
+ return c;
1615
+ });
1616
+ return changed ? out : messages;
1617
+ }
1618
+ function byteLength(messages) {
1619
+ try {
1620
+ return JSON.stringify(messages).length;
1621
+ } catch {
1622
+ return messages.length * MAX_PART_TEXT * 2;
1623
+ }
1624
+ }
1625
+ function sliceWindow(full, query = {}) {
1626
+ const limit = Math.max(1, query.limit ?? DEFAULT_PAGE_SIZE);
1627
+ const maxBytes = query.maxBytes ?? MAX_PAGE_BYTES;
1628
+ let end = full.length;
1629
+ if (query.before !== void 0 && query.before !== "") {
1630
+ const idx = full.findIndex((m) => m.id === query.before);
1631
+ if (idx >= 0) end = idx;
1632
+ }
1633
+ let start = Math.max(0, end - limit);
1634
+ let messages = full.slice(start, end);
1635
+ while (messages.length > 1) {
1636
+ const capped = capMessages(messages);
1637
+ if (byteLength(capped) <= maxBytes) {
1638
+ messages = capped;
1639
+ break;
1640
+ }
1641
+ start++;
1642
+ messages = full.slice(start, end);
1643
+ }
1644
+ return { messages: capMessages(messages), hasMore: start > 0 };
1645
+ }
1646
+ var MessagesCache = class {
1647
+ ttlMs;
1648
+ maxEntries;
1649
+ store = /* @__PURE__ */ new Map();
1650
+ constructor(ttlMs = 2e3, maxEntries = 64) {
1651
+ this.ttlMs = ttlMs;
1652
+ this.maxEntries = maxEntries;
1653
+ }
1654
+ /** 命中且未过 TTL 时返回完整列表副本;否则 undefined。 */
1655
+ get(sessionID, now = Date.now()) {
1656
+ const e = this.store.get(sessionID);
1657
+ if (!e) return void 0;
1658
+ if (now - e.at > this.ttlMs) {
1659
+ this.store.delete(sessionID);
1660
+ return void 0;
1661
+ }
1662
+ return e.full;
1663
+ }
1664
+ put(sessionID, full) {
1665
+ if (this.store.size >= this.maxEntries && !this.store.has(sessionID)) {
1666
+ const oldest = this.store.keys().next().value;
1667
+ if (oldest !== void 0) this.store.delete(oldest);
1668
+ }
1669
+ this.store.set(sessionID, { full, at: Date.now() });
1670
+ }
1671
+ /** 会话内容变化(流式部件/状态/删除等)时调用,立即失效快照。 */
1672
+ invalidate(sessionID) {
1673
+ this.store.delete(sessionID);
1674
+ }
1675
+ /** 适配器重连/整体失效(如清除全部快照)。 */
1676
+ clear() {
1677
+ this.store.clear();
1678
+ }
1679
+ };
1680
+ var messagesCache = new MessagesCache();
1553
1681
 
1554
1682
  // src/bridge.ts
1555
1683
  import { installModelSelection } from "@deepseek-ai/dsh-agent";
@@ -1921,7 +2049,7 @@ function findDir(dir, name2) {
1921
2049
  }
1922
2050
 
1923
2051
  // src/bridge.ts
1924
- var VERSION = "0.2.0";
2052
+ var VERSION = true ? "0.1.9" : "0.0.0-dev";
1925
2053
  var AGENT_TYPE = "dsh";
1926
2054
  var APPROVAL_TIMEOUT_MS = 12e4;
1927
2055
  var ADAPTER_COMMANDS = [
@@ -2147,9 +2275,10 @@ ${err.stack ?? ""}`);
2147
2275
  });
2148
2276
  }
2149
2277
  async sessionMessages(env) {
2150
- const { sessionID } = env.payload;
2278
+ const { sessionID, before, limit } = env.payload;
2151
2279
  const events = await this.sessionEventsOf(sessionID);
2152
- this.reply(env, "messages", { sessionID, messages: eventsToMessages(events) });
2280
+ const messages = eventsToMessages(events);
2281
+ this.reply(env, "messages", { sessionID, ...sliceWindow(messages, { before, limit }) });
2153
2282
  }
2154
2283
  /**
2155
2284
  * 取会话事件(live 安全,不会因 "cannot prepare while it is live" 报错/丢历史):
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tunnelbox/dsh-tunnelbox",
3
- "version": "0.1.7",
3
+ "version": "0.1.9",
4
4
  "description": "tunnelbox 的 dsh 原生 Cordis 插件:手机远程驱动 DeepSeek Harness(agent/session/tools/审批/中止)",
5
5
  "type": "module",
6
6
  "main": "./dist/index.mjs",
@@ -36,7 +36,7 @@
36
36
  "@deepseek-ai/schemastery": "^3.18.1"
37
37
  },
38
38
  "devDependencies": {
39
- "@tunnelbox/core": "0.1.7",
39
+ "@tunnelbox/core": "0.1.9",
40
40
  "@types/node": "^22.0.0",
41
41
  "esbuild": "^0.24.0",
42
42
  "typescript": "^5.4.5"