pairpod-bot 0.2.0 → 0.3.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.
package/dist/docker.js CHANGED
@@ -59,6 +59,7 @@ export async function attachExec(containerName, cmd, cols, rows) {
59
59
  const duplex = new Duplex({
60
60
  read() { },
61
61
  write(chunk, _enc, cb) { raw.write(chunk); cb(); },
62
+ destroy(err, cb) { raw.destroy(); cb(err); },
62
63
  });
63
64
  let buf = Buffer.alloc(0);
64
65
  raw.on("data", (chunk) => {
@@ -72,6 +73,8 @@ export async function attachExec(containerName, cmd, cols, rows) {
72
73
  }
73
74
  });
74
75
  raw.on("end", () => duplex.push(null));
76
+ raw.on("close", () => { if (!duplex.destroyed)
77
+ duplex.destroy(); });
75
78
  raw.on("error", (e) => duplex.destroy(e));
76
79
  return {
77
80
  stream: duplex,
@@ -1 +1 @@
1
- {"version":3,"file":"docker.js","sourceRoot":"","sources":["../src/docker.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"docker.js","sourceRoot":"","sources":["../src/docker.ts"],"names":[],"mappings":"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"}
@@ -72,7 +72,7 @@
72
72
  flex: 1;
73
73
  min-width: 0;
74
74
  resize: none;
75
- max-height: 120px;
75
+ max-height: 300px;
76
76
  padding: 8px 10px;
77
77
  font-family: ui-monospace, Menlo, monospace;
78
78
  font-size: clamp(14px, 3.4vw, 16px);
@@ -291,7 +291,9 @@
291
291
  }
292
292
 
293
293
  function send(data) {
294
- if (ws && ws.readyState === WebSocket.OPEN) ws.send(data);
294
+ if (!ws || ws.readyState !== WebSocket.OPEN) return false;
295
+ ws.send(data);
296
+ return true;
295
297
  }
296
298
 
297
299
  let lastCols = 0;
@@ -351,27 +353,31 @@
351
353
 
352
354
  function autoGrow() {
353
355
  input.style.height = "auto";
354
- input.style.height = Math.min(input.scrollHeight, 120) + "px";
356
+ input.style.height = Math.min(input.scrollHeight, 300) + "px";
355
357
  }
356
358
 
357
359
  function submitInput() {
358
360
  const text = input.value;
359
- input.value = "";
360
- autoGrow();
361
- input.focus();
361
+ // Don't clear the box until the text is actually on the wire — otherwise a closed
362
+ // socket silently eats the prompt.
362
363
  if (text.length === 0) {
363
364
  send("\r");
364
365
  return;
365
366
  }
366
367
  // When the app accepts bracketed paste, wrap the text so embedded newlines stay
367
368
  // literal (otherwise each \n submits a line). Send Enter separately to submit.
368
- // The 80ms gap lets the app finish ingesting the text before the Enter registers.
369
- if (bracketOn) {
370
- send("\x1b[200~" + text + "\x1b[201~");
371
- } else {
372
- send(text);
369
+ // Delay before Enter scales with length: a large paste takes longer to land than a short one.
370
+ const sent = bracketOn
371
+ ? send("\x1b[200~" + text + "\x1b[201~")
372
+ : send(text);
373
+ if (!sent) {
374
+ toast("Not connected — text kept, reconnecting…");
375
+ return;
373
376
  }
374
- setTimeout(() => send("\r"), 80);
377
+ input.value = "";
378
+ autoGrow();
379
+ input.focus();
380
+ setTimeout(() => send("\r"), Math.min(120 + Math.floor(text.length / 25), 1500));
375
381
  }
376
382
 
377
383
  function insertNewline() {
@@ -459,7 +465,7 @@
459
465
  let pinchFont = 0;
460
466
  let lpTimer = null;
461
467
  let selectMode = false;
462
- let selAnchorRow = 0;
468
+ let selAnchor = null;
463
469
  let touchStartX = 0;
464
470
  let touchStartY = 0;
465
471
  let touchMoved = false;
@@ -478,11 +484,20 @@
478
484
  toastTimer = setTimeout(() => t.classList.remove("show"), 1300);
479
485
  }
480
486
 
481
- function rowFromY(y) {
487
+ function cellFromXY(x, y) {
482
488
  const rect = termEl.getBoundingClientRect();
483
489
  const cellH = Math.max(1, (termEl.clientHeight - 8) / term.rows);
484
- const inView = Math.max(0, Math.min(term.rows - 1, Math.floor((y - rect.top - 4) / cellH)));
485
- return term.buffer.active.viewportY + inView;
490
+ const cellW = Math.max(1, (termEl.clientWidth - 8) / term.cols);
491
+ const col = Math.max(0, Math.min(term.cols - 1, Math.floor((x - rect.left - 4) / cellW)));
492
+ const vrow = Math.max(0, Math.min(term.rows - 1, Math.floor((y - rect.top - 4) / cellH)));
493
+ return { col, row: term.buffer.active.viewportY + vrow };
494
+ }
495
+
496
+ function selectBetween(a, b) {
497
+ const ai = a.row * term.cols + a.col;
498
+ const bi = b.row * term.cols + b.col;
499
+ const start = ai <= bi ? a : b;
500
+ term.select(start.col, start.row, Math.abs(bi - ai) + 1);
486
501
  }
487
502
 
488
503
  function copySelection() {
@@ -515,8 +530,8 @@
515
530
  lpTimer = setTimeout(() => {
516
531
  selectMode = true;
517
532
  term.clearSelection();
518
- selAnchorRow = rowFromY(touchStartY);
519
- term.selectLines(selAnchorRow, selAnchorRow);
533
+ selAnchor = cellFromXY(touchStartX, touchStartY);
534
+ selectBetween(selAnchor, selAnchor);
520
535
  if (navigator.vibrate) navigator.vibrate(15);
521
536
  toast("Select mode — drag, release to copy");
522
537
  }, 400);
@@ -532,8 +547,7 @@
532
547
  const y = e.touches[0].clientY;
533
548
  if (selectMode) {
534
549
  e.preventDefault();
535
- const r = rowFromY(y);
536
- term.selectLines(Math.min(selAnchorRow, r), Math.max(selAnchorRow, r));
550
+ selectBetween(selAnchor, cellFromXY(e.touches[0].clientX, y));
537
551
  return;
538
552
  }
539
553
  if (!touchMoved && Math.hypot(e.touches[0].clientX - touchStartX, y - touchStartY) > 10) {
@@ -565,7 +579,22 @@
565
579
  }
566
580
  }, { passive: true });
567
581
 
582
+ // App mouse-mode makes xterm swallow drag-to-select; reclaim it (Shift+drag = native chars).
583
+ let mouseSelAnchor = null;
584
+ termEl.addEventListener("mousedown", (e) => {
585
+ if (!mouseOn || e.button !== 0 || e.shiftKey) return;
586
+ e.preventDefault();
587
+ e.stopPropagation();
588
+ mouseSelAnchor = cellFromXY(e.clientX, e.clientY);
589
+ term.clearSelection();
590
+ }, true);
591
+ termEl.addEventListener("mousemove", (e) => {
592
+ if (mouseSelAnchor === null) return;
593
+ e.preventDefault();
594
+ selectBetween(mouseSelAnchor, cellFromXY(e.clientX, e.clientY));
595
+ }, true);
568
596
  termEl.addEventListener("mouseup", () => {
597
+ mouseSelAnchor = null;
569
598
  if (Date.now() - lastTouchEnd < 700) return;
570
599
  if (term.hasSelection()) copySelection();
571
600
  else input.focus();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pairpod-bot",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "type": "module",
5
5
  "license": "MIT",
6
6
  "description": "pairpod bot + mini-app server (installed as a dependency of the pairpod CLI).",