Index: frontend/node_modules/sisteransi/src/index.js
===================================================================
--- frontend/node_modules/sisteransi/src/index.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/sisteransi/src/index.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,58 @@
+'use strict';
+
+const ESC = '\x1B';
+const CSI = `${ESC}[`;
+const beep = '\u0007';
+
+const cursor = {
+  to(x, y) {
+    if (!y) return `${CSI}${x + 1}G`;
+    return `${CSI}${y + 1};${x + 1}H`;
+  },
+  move(x, y) {
+    let ret = '';
+
+    if (x < 0) ret += `${CSI}${-x}D`;
+    else if (x > 0) ret += `${CSI}${x}C`;
+
+    if (y < 0) ret += `${CSI}${-y}A`;
+    else if (y > 0) ret += `${CSI}${y}B`;
+
+    return ret;
+  },
+  up: (count = 1) => `${CSI}${count}A`,
+  down: (count = 1) => `${CSI}${count}B`,
+  forward: (count = 1) => `${CSI}${count}C`,
+  backward: (count = 1) => `${CSI}${count}D`,
+  nextLine: (count = 1) => `${CSI}E`.repeat(count),
+  prevLine: (count = 1) => `${CSI}F`.repeat(count),
+  left: `${CSI}G`,
+  hide: `${CSI}?25l`,
+  show: `${CSI}?25h`,
+  save: `${ESC}7`,
+  restore: `${ESC}8`
+}
+
+const scroll = {
+  up: (count = 1) => `${CSI}S`.repeat(count),
+  down: (count = 1) => `${CSI}T`.repeat(count)
+}
+
+const erase = {
+  screen: `${CSI}2J`,
+  up: (count = 1) => `${CSI}1J`.repeat(count),
+  down: (count = 1) => `${CSI}J`.repeat(count),
+  line: `${CSI}2K`,
+  lineEnd: `${CSI}K`,
+  lineStart: `${CSI}1K`,
+  lines(count) {
+    let clear = '';
+    for (let i = 0; i < count; i++)
+      clear += this.line + (i < count - 1 ? cursor.up() : '');
+    if (count)
+      clear += cursor.left;
+    return clear;
+  }
+}
+
+module.exports = { cursor, scroll, erase, beep };
Index: frontend/node_modules/sisteransi/src/sisteransi.d.ts
===================================================================
--- frontend/node_modules/sisteransi/src/sisteransi.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/sisteransi/src/sisteransi.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,35 @@
+export const beep: string;
+export const clear: string;
+
+export namespace cursor {
+    export const left: string;
+    export const hide: string;
+    export const show: string;
+    export const save: string;
+    export const restore: string;
+
+    export function to(x: number, y?: number): string;
+    export function move(x: number, y: number): string;
+    export function up(count?: number): string;
+    export function down(count?: number): string;
+    export function forward(count?: number): string;
+    export function backward(count?: number): string;
+    export function nextLine(count?: number): string;
+    export function prevLine(count?: number): string;
+}
+
+export namespace scroll {
+    export function up(count?: number): string;
+    export function down(count?: number): string;
+}
+
+export namespace erase {
+    export const screen: string;
+    export const line: string;
+    export const lineEnd: string;
+    export const lineStart: string;
+
+    export function up(count?: number): string;
+    export function down(count?: number): string;
+    export function lines(count: number): string;
+}
