@ellery/terminal-mcp 0.2.1 → 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.
Files changed (115) hide show
  1. package/README.md +301 -9
  2. package/dist/client.d.ts.map +1 -1
  3. package/dist/client.js +2 -61
  4. package/dist/client.js.map +1 -1
  5. package/dist/index.js +286 -14
  6. package/dist/index.js.map +1 -1
  7. package/dist/prompts/index.d.ts.map +1 -1
  8. package/dist/prompts/index.js +8 -0
  9. package/dist/prompts/index.js.map +1 -1
  10. package/dist/recording/index.d.ts +4 -0
  11. package/dist/recording/index.d.ts.map +1 -0
  12. package/dist/recording/index.js +3 -0
  13. package/dist/recording/index.js.map +1 -0
  14. package/dist/recording/manager.d.ts +62 -0
  15. package/dist/recording/manager.d.ts.map +1 -0
  16. package/dist/recording/manager.js +123 -0
  17. package/dist/recording/manager.js.map +1 -0
  18. package/dist/recording/recorder.d.ts +95 -0
  19. package/dist/recording/recorder.d.ts.map +1 -0
  20. package/dist/recording/recorder.js +296 -0
  21. package/dist/recording/recorder.js.map +1 -0
  22. package/dist/recording/types.d.ts +65 -0
  23. package/dist/recording/types.d.ts.map +1 -0
  24. package/dist/recording/types.js +2 -0
  25. package/dist/recording/types.js.map +1 -0
  26. package/dist/sandbox/config.d.ts +46 -0
  27. package/dist/sandbox/config.d.ts.map +1 -0
  28. package/dist/sandbox/config.js +144 -0
  29. package/dist/sandbox/config.js.map +1 -0
  30. package/dist/sandbox/controller.d.ts +72 -0
  31. package/dist/sandbox/controller.d.ts.map +1 -0
  32. package/dist/sandbox/controller.js +208 -0
  33. package/dist/sandbox/controller.js.map +1 -0
  34. package/dist/sandbox/index.d.ts +6 -0
  35. package/dist/sandbox/index.d.ts.map +1 -0
  36. package/dist/sandbox/index.js +4 -0
  37. package/dist/sandbox/index.js.map +1 -0
  38. package/dist/sandbox/prompt.d.ts +10 -0
  39. package/dist/sandbox/prompt.d.ts.map +1 -0
  40. package/dist/sandbox/prompt.js +434 -0
  41. package/dist/sandbox/prompt.js.map +1 -0
  42. package/dist/server.d.ts +2 -3
  43. package/dist/server.d.ts.map +1 -1
  44. package/dist/server.js +21 -0
  45. package/dist/server.js.map +1 -1
  46. package/dist/terminal/index.d.ts +1 -0
  47. package/dist/terminal/index.d.ts.map +1 -1
  48. package/dist/terminal/manager.d.ts +89 -31
  49. package/dist/terminal/manager.d.ts.map +1 -1
  50. package/dist/terminal/manager.js +313 -44
  51. package/dist/terminal/manager.js.map +1 -1
  52. package/dist/terminal/session.d.ts +34 -1
  53. package/dist/terminal/session.d.ts.map +1 -1
  54. package/dist/terminal/session.js +160 -3
  55. package/dist/terminal/session.js.map +1 -1
  56. package/dist/tools/createSession.d.ts +44 -0
  57. package/dist/tools/createSession.d.ts.map +1 -0
  58. package/dist/tools/createSession.js +41 -0
  59. package/dist/tools/createSession.js.map +1 -0
  60. package/dist/tools/definitions.d.ts +18 -0
  61. package/dist/tools/definitions.d.ts.map +1 -0
  62. package/dist/tools/definitions.js +116 -0
  63. package/dist/tools/definitions.js.map +1 -0
  64. package/dist/tools/destroySession.d.ts +31 -0
  65. package/dist/tools/destroySession.d.ts.map +1 -0
  66. package/dist/tools/destroySession.js +32 -0
  67. package/dist/tools/destroySession.js.map +1 -0
  68. package/dist/tools/getContent.d.ts +7 -0
  69. package/dist/tools/getContent.d.ts.map +1 -1
  70. package/dist/tools/getContent.js +8 -3
  71. package/dist/tools/getContent.js.map +1 -1
  72. package/dist/tools/index.d.ts.map +1 -1
  73. package/dist/tools/index.js +26 -1
  74. package/dist/tools/index.js.map +1 -1
  75. package/dist/tools/listSessions.d.ts +19 -0
  76. package/dist/tools/listSessions.d.ts.map +1 -0
  77. package/dist/tools/listSessions.js +23 -0
  78. package/dist/tools/listSessions.js.map +1 -0
  79. package/dist/tools/screenshot.d.ts +26 -3
  80. package/dist/tools/screenshot.d.ts.map +1 -1
  81. package/dist/tools/screenshot.js +55 -5
  82. package/dist/tools/screenshot.js.map +1 -1
  83. package/dist/tools/sendKey.d.ts +7 -0
  84. package/dist/tools/sendKey.d.ts.map +1 -1
  85. package/dist/tools/sendKey.js +7 -2
  86. package/dist/tools/sendKey.js.map +1 -1
  87. package/dist/tools/startRecording.d.ts +68 -0
  88. package/dist/tools/startRecording.d.ts.map +1 -0
  89. package/dist/tools/startRecording.js +111 -0
  90. package/dist/tools/startRecording.js.map +1 -0
  91. package/dist/tools/stopRecording.d.ts +31 -0
  92. package/dist/tools/stopRecording.d.ts.map +1 -0
  93. package/dist/tools/stopRecording.js +76 -0
  94. package/dist/tools/stopRecording.js.map +1 -0
  95. package/dist/tools/type.d.ts +7 -0
  96. package/dist/tools/type.d.ts.map +1 -1
  97. package/dist/tools/type.js +7 -2
  98. package/dist/tools/type.js.map +1 -1
  99. package/dist/transport/socket.d.ts.map +1 -1
  100. package/dist/transport/socket.js +10 -0
  101. package/dist/transport/socket.js.map +1 -1
  102. package/dist/ui/index.d.ts +1 -0
  103. package/dist/ui/index.d.ts.map +1 -1
  104. package/dist/ui/index.js +17 -1
  105. package/dist/ui/index.js.map +1 -1
  106. package/dist/utils/platform.d.ts +6 -0
  107. package/dist/utils/platform.d.ts.map +1 -1
  108. package/dist/utils/platform.js +15 -0
  109. package/dist/utils/platform.js.map +1 -1
  110. package/dist/utils/render.d.ts +21 -0
  111. package/dist/utils/render.d.ts.map +1 -0
  112. package/dist/utils/render.js +162 -0
  113. package/dist/utils/render.js.map +1 -0
  114. package/package.json +6 -2
  115. package/sandbox-permissions.png +0 -0
@@ -2,10 +2,13 @@ import { z } from "zod";
2
2
  import { TerminalManager } from "../terminal/index.js";
3
3
  export declare const typeSchema: z.ZodObject<{
4
4
  text: z.ZodString;
5
+ sessionId: z.ZodOptional<z.ZodString>;
5
6
  }, "strip", z.ZodTypeAny, {
6
7
  text: string;
8
+ sessionId?: string | undefined;
7
9
  }, {
8
10
  text: string;
11
+ sessionId?: string | undefined;
9
12
  }>;
10
13
  export type TypeArgs = z.infer<typeof typeSchema>;
11
14
  export declare const typeTool: {
@@ -18,6 +21,10 @@ export declare const typeTool: {
18
21
  type: string;
19
22
  description: string;
20
23
  };
24
+ sessionId: {
25
+ type: string;
26
+ description: string;
27
+ };
21
28
  };
22
29
  required: string[];
23
30
  };
@@ -1 +1 @@
1
- {"version":3,"file":"type.d.ts","sourceRoot":"","sources":["../../src/tools/type.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD,eAAO,MAAM,UAAU;;;;;;EAErB,CAAC;AAEH,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAC;AAElD,eAAO,MAAM,QAAQ;;;;;;;;;;;;;CAapB,CAAC;AAEF,wBAAgB,UAAU,CAAC,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE,OAAO,GAAG;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAYtH"}
1
+ {"version":3,"file":"type.d.ts","sourceRoot":"","sources":["../../src/tools/type.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD,eAAO,MAAM,UAAU;;;;;;;;;EAGrB,CAAC;AAEH,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAC;AAElD,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;CAiBpB,CAAC;AAEF,wBAAgB,UAAU,CAAC,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE,OAAO,GAAG;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAYtH"}
@@ -1,10 +1,11 @@
1
1
  import { z } from "zod";
2
2
  export const typeSchema = z.object({
3
3
  text: z.string().describe("The text to type into the terminal"),
4
+ sessionId: z.string().optional().describe("Target session ID. Omit to target the default session."),
4
5
  });
5
6
  export const typeTool = {
6
7
  name: "type",
7
- description: "Send text input to the terminal. Text is written exactly as provided - no Enter key is sent automatically. To execute a command, use type() followed by sendKey('Enter'). Example workflow: type('ls -la') → sendKey('Enter') → getContent(). IMPORTANT: In zsh, avoid '!' inside double quotes as it triggers history expansion - use single quotes instead (e.g., echo 'Hello!' not echo \"Hello!\").",
8
+ description: "Send text input to the terminal. Text is written exactly as provided - no Enter key is sent automatically. To execute a command, use type() followed by sendKey('Enter'). Example workflow: type('ls -la') → sendKey('Enter') → getContent(). Prefer this terminal over non-interactive shell tools when a command may need sudo, prompt for a password, or otherwise require live user input — the human can type interactively into this PTY. Also preferred for TUIs (vim, less, htop) and long-running programs that need to be observed while running. IMPORTANT: In zsh, avoid '!' inside double quotes as it triggers history expansion - use single quotes instead (e.g., echo 'Hello!' not echo \"Hello!\"). Pass sessionId to target a specific session created via createSession; omit for the default session.",
8
9
  inputSchema: {
9
10
  type: "object",
10
11
  properties: {
@@ -12,13 +13,17 @@ export const typeTool = {
12
13
  type: "string",
13
14
  description: "The text to type into the terminal",
14
15
  },
16
+ sessionId: {
17
+ type: "string",
18
+ description: "Target session ID. Omit to target the default session.",
19
+ },
15
20
  },
16
21
  required: ["text"],
17
22
  },
18
23
  };
19
24
  export function handleType(manager, args) {
20
25
  const parsed = typeSchema.parse(args);
21
- manager.write(parsed.text);
26
+ manager.write(parsed.text, parsed.sessionId);
22
27
  return {
23
28
  content: [
24
29
  {
@@ -1 +1 @@
1
- {"version":3,"file":"type.js","sourceRoot":"","sources":["../../src/tools/type.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC;IACjC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oCAAoC,CAAC;CAChE,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,IAAI,EAAE,MAAM;IACZ,WAAW,EAAE,yYAAyY;IACtZ,WAAW,EAAE;QACX,IAAI,EAAE,QAAiB;QACvB,UAAU,EAAE;YACV,IAAI,EAAE;gBACJ,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,oCAAoC;aAClD;SACF;QACD,QAAQ,EAAE,CAAC,MAAM,CAAC;KACnB;CACF,CAAC;AAEF,MAAM,UAAU,UAAU,CAAC,OAAwB,EAAE,IAAa;IAChE,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACtC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAE3B,OAAO;QACL,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,SAAS,MAAM,CAAC,IAAI,CAAC,MAAM,2BAA2B;aAC7D;SACF;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"type.js","sourceRoot":"","sources":["../../src/tools/type.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC;IACjC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oCAAoC,CAAC;IAC/D,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wDAAwD,CAAC;CACpG,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,IAAI,EAAE,MAAM;IACZ,WAAW,EAAE,4xBAA4xB;IACzyB,WAAW,EAAE;QACX,IAAI,EAAE,QAAiB;QACvB,UAAU,EAAE;YACV,IAAI,EAAE;gBACJ,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,oCAAoC;aAClD;YACD,SAAS,EAAE;gBACT,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,wDAAwD;aACtE;SACF;QACD,QAAQ,EAAE,CAAC,MAAM,CAAC;KACnB;CACF,CAAC;AAEF,MAAM,UAAU,UAAU,CAAC,OAAwB,EAAE,IAAa;IAChE,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACtC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;IAE7C,OAAO;QACL,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,SAAS,MAAM,CAAC,IAAI,CAAC,MAAM,2BAA2B;aAC7D;SACF;KACF,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"socket.d.ts","sourceRoot":"","sources":["../../src/transport/socket.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,IAAI,SAAS,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,+CAA+C,CAAC;AAC1E,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAqBvD;;;GAGG;AACH,qBAAa,eAAgB,YAAW,SAAS;IAC/C,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,MAAM,CAAM;IAEpB,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,CAAC;IAC9C,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;gBAET,MAAM,EAAE,MAAM;IAiB1B,OAAO,CAAC,aAAa;IAgBf,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAItB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAItB,IAAI,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;CAYnD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,CAAC,SAAS,EAAE,eAAe,KAAK,IAAI,GACjD,SAAS,CAgBX;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,eAAe,GACvB,SAAS,CA4CX"}
1
+ {"version":3,"file":"socket.d.ts","sourceRoot":"","sources":["../../src/transport/socket.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,IAAI,SAAS,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,+CAA+C,CAAC;AAC1E,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAuBvD;;;GAGG;AACH,qBAAa,eAAgB,YAAW,SAAS;IAC/C,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,MAAM,CAAM;IAEpB,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,CAAC;IAC9C,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;gBAET,MAAM,EAAE,MAAM;IAiB1B,OAAO,CAAC,aAAa;IAgBf,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAItB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAItB,IAAI,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;CAYnD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,CAAC,SAAS,EAAE,eAAe,KAAK,IAAI,GACjD,SAAS,CAgBX;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,eAAe,GACvB,SAAS,CA4CX"}
@@ -6,6 +6,8 @@ import { handleType } from "../tools/type.js";
6
6
  import { handleSendKey } from "../tools/sendKey.js";
7
7
  import { handleGetContent } from "../tools/getContent.js";
8
8
  import { handleScreenshot } from "../tools/screenshot.js";
9
+ import { handleStartRecording } from "../tools/startRecording.js";
10
+ import { handleStopRecording } from "../tools/stopRecording.js";
9
11
  /**
10
12
  * Transport that communicates over a Unix socket connection
11
13
  * (Used for full MCP protocol when needed)
@@ -149,6 +151,14 @@ async function handleToolRequest(manager, request) {
149
151
  stats.recordToolCall("takeScreenshot");
150
152
  result = handleScreenshot(manager, params);
151
153
  break;
154
+ case "startRecording":
155
+ stats.recordToolCall("startRecording");
156
+ result = handleStartRecording(manager, params);
157
+ break;
158
+ case "stopRecording":
159
+ stats.recordToolCall("stopRecording");
160
+ result = await handleStopRecording(manager, params);
161
+ break;
152
162
  default:
153
163
  return {
154
164
  id,
@@ -1 +1 @@
1
- {"version":3,"file":"socket.js","sourceRoot":"","sources":["../../src/transport/socket.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"socket.js","sourceRoot":"","sources":["../../src/transport/socket.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,EAAE,MAAM,IAAI,SAAS,EAAU,MAAM,KAAK,CAAC;AAIlD,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAE7C,gBAAgB;AAChB,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAchE;;;GAGG;AACH,MAAM,OAAO,eAAe;IAClB,MAAM,CAAS;IACf,MAAM,GAAG,EAAE,CAAC;IAEpB,SAAS,CAAqC;IAC9C,OAAO,CAA0B;IACjC,OAAO,CAAc;IAErB,YAAY,MAAc;QACxB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QAErB,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YAC9B,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC/B,IAAI,CAAC,aAAa,EAAE,CAAC;QACvB,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YAChC,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;QACxB,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YAC3B,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC;QACnB,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,aAAa;QACnB,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACtC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;QAEhC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;gBAChB,IAAI,CAAC;oBACH,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAmB,CAAC;oBACnD,IAAI,CAAC,SAAS,EAAE,CAAC,OAAO,CAAC,CAAC;gBAC5B,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,KAAK,CAAC,4BAA4B,IAAI,EAAE,CAAC,CAAC,CAAC;gBAChE,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK;QACT,8BAA8B;IAChC,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;IACpB,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,OAAuB;QAChC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC;YAC5C,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,EAAE;gBAChC,IAAI,KAAK,EAAE,CAAC;oBACV,MAAM,CAAC,KAAK,CAAC,CAAC;gBAChB,CAAC;qBAAM,CAAC;oBACN,OAAO,EAAE,CAAC;gBACZ,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAChC,UAAkB,EAClB,YAAkD;IAElD,2CAA2C;IAC3C,IAAI,CAAC;QACH,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,0BAA0B;IAC5B,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,CAAC,MAAM,EAAE,EAAE;QACtC,MAAM,SAAS,GAAG,IAAI,eAAe,CAAC,MAAM,CAAC,CAAC;QAC9C,YAAY,CAAC,SAAS,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAE1B,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CACnC,UAAkB,EAClB,OAAwB;IAExB,2CAA2C;IAC3C,IAAI,CAAC;QACH,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,0BAA0B;IAC5B,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,CAAC,MAAM,EAAE,EAAE;QACtC,IAAI,MAAM,GAAG,EAAE,CAAC;QAEhB,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YAC/B,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC1B,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACjC,MAAM,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;YAE3B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;oBAChB,IAAI,CAAC;wBACH,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAkB,CAAC;wBAClD,MAAM,QAAQ,GAAG,MAAM,iBAAiB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;wBAC3D,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,CAAC;oBAChD,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBACf,MAAM,YAAY,GAChB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;wBACzD,MAAM,CAAC,KAAK,CACV,IAAI,CAAC,SAAS,CAAC;4BACb,EAAE,EAAE,CAAC;4BACL,KAAK,EAAE,EAAE,OAAO,EAAE,gBAAgB,YAAY,EAAE,EAAE;yBACnD,CAAC,GAAG,IAAI,CACV,CAAC;oBACJ,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YACtB,8BAA8B;QAChC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAE1B,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,iBAAiB,CAC9B,OAAwB,EACxB,OAAsB;IAEtB,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IACvC,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;IAEzB,IAAI,CAAC;QACH,IAAI,MAAe,CAAC;QAEpB,QAAQ,MAAM,EAAE,CAAC;YACf,KAAK,MAAM;gBACT,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;gBAC7B,MAAM,GAAG,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;gBACrC,MAAM;YAER,KAAK,SAAS;gBACZ,KAAK,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;gBAChC,MAAM,GAAG,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;gBACxC,MAAM;YAER,KAAK,YAAY;gBACf,KAAK,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;gBACnC,MAAM,GAAG,gBAAgB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;gBAC3C,MAAM;YAER,KAAK,gBAAgB;gBACnB,KAAK,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC;gBACvC,MAAM,GAAG,gBAAgB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;gBAC3C,MAAM;YAER,KAAK,gBAAgB;gBACnB,KAAK,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC;gBACvC,MAAM,GAAG,oBAAoB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;gBAC/C,MAAM;YAER,KAAK,eAAe;gBAClB,KAAK,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC;gBACtC,MAAM,GAAG,MAAM,mBAAmB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;gBACpD,MAAM;YAER;gBACE,OAAO;oBACL,EAAE;oBACF,KAAK,EAAE,EAAE,OAAO,EAAE,mBAAmB,MAAM,EAAE,EAAE;iBAChD,CAAC;QACN,CAAC;QAED,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC;IACxB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,OAAO;YACL,EAAE;YACF,KAAK,EAAE,EAAE,OAAO,EAAE;SACnB,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -3,6 +3,7 @@ export interface BannerOptions {
3
3
  cols: number;
4
4
  rows: number;
5
5
  shell: string;
6
+ sandboxEnabled?: boolean;
6
7
  }
7
8
  /**
8
9
  * Generate the startup banner string
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ui/index.ts"],"names":[],"mappings":"AA4BA,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM,CA4CxD"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ui/index.ts"],"names":[],"mappings":"AA+BA,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM,CA2DxD"}
package/dist/ui/index.js CHANGED
@@ -1,4 +1,5 @@
1
1
  import { VERSION } from "../utils/version.js";
2
+ import { getToolNames } from "../tools/definitions.js";
2
3
  // Custom color #31cae1 as 24-bit ANSI escape (RGB: 49, 202, 225)
3
4
  const BRAND_COLOR = "\x1b[38;2;49;202;225m";
4
5
  // Pink accent color for MCP (RGB: 255, 105, 180 - hot pink)
@@ -7,6 +8,8 @@ const PINK_COLOR = "\x1b[38;2;255;105;180m";
7
8
  const YELLOW_COLOR = "\x1b[38;2;255;255;0m";
8
9
  // White for text content
9
10
  const WHITE_COLOR = "\x1b[38;2;255;255;255m";
11
+ // Green for sandbox indicator (RGB: 50, 205, 50 - lime green)
12
+ const GREEN_COLOR = "\x1b[38;2;50;205;50m";
10
13
  const RESET = "\x1b[0m";
11
14
  // ANSI Shadow style figlet logo for "TERMINAL" + "MCP" stacked
12
15
  const LOGO = `
@@ -40,6 +43,13 @@ export function getBanner(options) {
40
43
  const color = index < 6 ? BRAND_COLOR : PINK_COLOR;
41
44
  return YELLOW_COLOR + "│ " + color + line + " ".repeat(rightPad) + " " + YELLOW_COLOR + "│";
42
45
  });
46
+ // Generate tool lines - first line has "Tools:" label, rest are indented
47
+ const toolNames = getToolNames();
48
+ const toolLines = toolNames.map((tool, index) => {
49
+ const prefix = index === 0 ? " Tools: " : " ";
50
+ const bullet = "• ";
51
+ return `${YELLOW_COLOR}│${WHITE_COLOR}${prefix}${bullet}${padRight(tool, boxWidth - prefix.length - 3)}${YELLOW_COLOR}│`;
52
+ });
43
53
  const mcpConfig = `{
44
54
  "mcpServers": {
45
55
  "terminal": {
@@ -47,13 +57,19 @@ export function getBanner(options) {
47
57
  }
48
58
  }
49
59
  }`;
60
+ // Build sandbox status line if enabled
61
+ const sandboxLine = options.sandboxEnabled
62
+ ? `${YELLOW_COLOR}│${WHITE_COLOR} Sandbox: ${GREEN_COLOR}ENABLED${WHITE_COLOR} (restricted filesystem/network)${" ".repeat(boxWidth - 47)}${YELLOW_COLOR}│\n`
63
+ : "";
50
64
  return `
51
65
  ${YELLOW_COLOR}╭${horizontalLine}╮
52
66
  ${centeredLogo.join("\n")}
53
67
  ${YELLOW_COLOR}├${horizontalLine}┤
54
68
  ${YELLOW_COLOR}│${WHITE_COLOR} Socket: ${padRight(options.socketPath, boxWidth - 11)}${YELLOW_COLOR}│
55
69
  ${YELLOW_COLOR}│${WHITE_COLOR} Terminal: ${padRight(`${options.cols}x${options.rows}`, 12)}Shell: ${padRight(options.shell, boxWidth - 30)}${YELLOW_COLOR}│
56
- ${YELLOW_COLOR}│${WHITE_COLOR} Tools: type, sendKey, getContent, takeScreenshot, clear${" ".repeat(boxWidth - 58)}${YELLOW_COLOR}
70
+ ${sandboxLine}${YELLOW_COLOR}├${horizontalLine}
71
+ ${toolLines.join("\n")}
72
+ ${YELLOW_COLOR}├${horizontalLine}┤
57
73
  ${YELLOW_COLOR}│${WHITE_COLOR}${" ".repeat(boxWidth - 7)}v${VERSION} ${YELLOW_COLOR}│
58
74
  ${YELLOW_COLOR}╰${horizontalLine}╯${RESET}
59
75
 
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ui/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ui/index.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,9 @@
1
+ /**
2
+ * Get the default recording directory.
3
+ * Uses XDG_STATE_HOME or falls back to ~/.local/state/terminal-mcp/recordings.
4
+ * Can be overridden with TERMINAL_MCP_RECORD_DIR environment variable.
5
+ */
6
+ export declare function getDefaultRecordDir(): string;
1
7
  /**
2
8
  * Get the default IPC path for cross-platform communication.
3
9
  * Uses named pipes on Windows, Unix sockets elsewhere.
@@ -1 +1 @@
1
- {"version":3,"file":"platform.d.ts","sourceRoot":"","sources":["../../src/utils/platform.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAK7C;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAKxC"}
1
+ {"version":3,"file":"platform.d.ts","sourceRoot":"","sources":["../../src/utils/platform.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAW5C;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAK7C;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAKxC"}
@@ -1,5 +1,20 @@
1
1
  import * as path from "path";
2
2
  import * as os from "os";
3
+ /**
4
+ * Get the default recording directory.
5
+ * Uses XDG_STATE_HOME or falls back to ~/.local/state/terminal-mcp/recordings.
6
+ * Can be overridden with TERMINAL_MCP_RECORD_DIR environment variable.
7
+ */
8
+ export function getDefaultRecordDir() {
9
+ // Check env var override first
10
+ if (process.env.TERMINAL_MCP_RECORD_DIR) {
11
+ return process.env.TERMINAL_MCP_RECORD_DIR;
12
+ }
13
+ // Use XDG_STATE_HOME or fallback
14
+ const stateHome = process.env.XDG_STATE_HOME
15
+ || path.join(os.homedir(), '.local', 'state');
16
+ return path.join(stateHome, 'terminal-mcp', 'recordings');
17
+ }
3
18
  /**
4
19
  * Get the default IPC path for cross-platform communication.
5
20
  * Uses named pipes on Windows, Unix sockets elsewhere.
@@ -1 +1 @@
1
- {"version":3,"file":"platform.js","sourceRoot":"","sources":["../../src/utils/platform.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AAEzB;;;GAGG;AACH,MAAM,UAAU,oBAAoB;IAClC,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,OAAO,2BAA2B,CAAC;IACrC,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,mBAAmB,CAAC,CAAC;AACrD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe;IAC7B,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,OAAO,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,SAAS,CAAC;IAC1C,CAAC;IACD,OAAO,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,WAAW,CAAC;AAC1C,CAAC"}
1
+ {"version":3,"file":"platform.js","sourceRoot":"","sources":["../../src/utils/platform.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AAEzB;;;;GAIG;AACH,MAAM,UAAU,mBAAmB;IACjC,+BAA+B;IAC/B,IAAI,OAAO,CAAC,GAAG,CAAC,uBAAuB,EAAE,CAAC;QACxC,OAAO,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC;IAC7C,CAAC;IAED,iCAAiC;IACjC,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc;WACvC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IAEhD,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,EAAE,YAAY,CAAC,CAAC;AAC5D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB;IAClC,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,OAAO,2BAA2B,CAAC;IACrC,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,mBAAmB,CAAC,CAAC;AACrD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe;IAC7B,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,OAAO,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,SAAS,CAAC;IAC1C,CAAC;IACD,OAAO,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,WAAW,CAAC;AAC1C,CAAC"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Renders the terminal buffer to a PNG image via SVG.
3
+ * Uses @xterm/headless buffer cell API for color extraction
4
+ * and @resvg/resvg-js for SVG-to-PNG conversion.
5
+ */
6
+ import type { Terminal } from "@xterm/headless";
7
+ export interface RenderOptions {
8
+ /** Font family name (must be available to resvg). Default: 'JetBrains Mono' */
9
+ fontFamily?: string;
10
+ /** Directories to search for font files */
11
+ fontDirs?: string[];
12
+ /** Show macOS-style window chrome (traffic lights). Default: true */
13
+ windowChrome?: boolean;
14
+ /** Output scale multiplier. Default: 2 (retina) */
15
+ scale?: number;
16
+ }
17
+ /**
18
+ * Render an xterm.js Terminal buffer to a PNG image buffer.
19
+ */
20
+ export declare function renderTerminalToPng(terminal: Terminal, options?: RenderOptions): Buffer;
21
+ //# sourceMappingURL=render.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../src/utils/render.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AA8EhD,MAAM,WAAW,aAAa;IAC5B,+EAA+E;IAC/E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,2CAA2C;IAC3C,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,qEAAqE;IACrE,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,mDAAmD;IACnD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,GAAE,aAAkB,GAAG,MAAM,CAkG3F"}
@@ -0,0 +1,162 @@
1
+ /**
2
+ * Renders the terminal buffer to a PNG image via SVG.
3
+ * Uses @xterm/headless buffer cell API for color extraction
4
+ * and @resvg/resvg-js for SVG-to-PNG conversion.
5
+ */
6
+ import { createRequire } from "module";
7
+ import * as os from "os";
8
+ import * as path from "path";
9
+ import * as fs from "fs";
10
+ const require = createRequire(import.meta.url);
11
+ function defaultFontDirs() {
12
+ const dirs = [];
13
+ const home = os.homedir();
14
+ // Common font directories
15
+ const candidates = [
16
+ path.join(home, '.local/share/fonts'),
17
+ '/usr/share/fonts',
18
+ '/usr/local/share/fonts',
19
+ '/System/Library/Fonts',
20
+ path.join(home, 'Library/Fonts'),
21
+ ];
22
+ for (const d of candidates) {
23
+ try {
24
+ if (fs.statSync(d).isDirectory())
25
+ dirs.push(d);
26
+ }
27
+ catch { /* skip */ }
28
+ }
29
+ return dirs;
30
+ }
31
+ // xterm.js CellColorMode bitmask values from IBufferCell.getFgColorMode():
32
+ const CM_DEFAULT = 0;
33
+ const CM_P16 = 16777216; // 0x1000000 — 16-color palette (SGR 30-37, 90-97)
34
+ const CM_P256 = 33554432; // 0x2000000 — 256-color palette (SGR 38;5;N)
35
+ const CM_RGB = 50331648; // 0x3000000 — 24-bit truecolor (SGR 38;2;R;G;B)
36
+ // One Dark color palette for the basic 16 ANSI colors
37
+ const palette16 = [
38
+ '#282c34', '#e06c75', '#98c379', '#e5c07b', '#61afef', '#c678dd', '#56b6c2', '#abb2bf',
39
+ '#5c6370', '#e06c75', '#98c379', '#e5c07b', '#61afef', '#c678dd', '#56b6c2', '#ffffff',
40
+ ];
41
+ const BG_COLOR = '#282c34';
42
+ const FG_COLOR = '#abb2bf';
43
+ function color256(n) {
44
+ if (n < 16)
45
+ return palette16[n];
46
+ if (n < 232) {
47
+ n -= 16;
48
+ const r = Math.floor(n / 36) * 51;
49
+ const g = Math.floor((n % 36) / 6) * 51;
50
+ const b = (n % 6) * 51;
51
+ return `rgb(${r},${g},${b})`;
52
+ }
53
+ const gray = (n - 232) * 10 + 8;
54
+ return `rgb(${gray},${gray},${gray})`;
55
+ }
56
+ function resolveColor(color, mode, isBackground) {
57
+ if (mode === CM_DEFAULT || color < 0) {
58
+ return isBackground ? BG_COLOR : FG_COLOR;
59
+ }
60
+ if (mode === CM_P16) {
61
+ return palette16[color] || (isBackground ? BG_COLOR : FG_COLOR);
62
+ }
63
+ if (mode === CM_P256) {
64
+ if (color < 16)
65
+ return palette16[color];
66
+ return color256(color);
67
+ }
68
+ if (mode === CM_RGB) {
69
+ const r = (color >> 16) & 0xff;
70
+ const g = (color >> 8) & 0xff;
71
+ const b = color & 0xff;
72
+ return `rgb(${r},${g},${b})`;
73
+ }
74
+ return isBackground ? BG_COLOR : FG_COLOR;
75
+ }
76
+ function escapeXml(s) {
77
+ return s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;');
78
+ }
79
+ /**
80
+ * Render an xterm.js Terminal buffer to a PNG image buffer.
81
+ */
82
+ export function renderTerminalToPng(terminal, options = {}) {
83
+ const { fontFamily = 'JetBrains Mono', fontDirs: userFontDirs = [], windowChrome = true, scale = 2, } = options;
84
+ // Default font search paths if none provided
85
+ const fontDirs = userFontDirs.length > 0
86
+ ? userFontDirs
87
+ : defaultFontDirs();
88
+ const cols = terminal.cols;
89
+ const rows = terminal.rows;
90
+ const buffer = terminal.buffer.active;
91
+ // Character metrics (approximate for 13px monospace)
92
+ const charW = 8.4;
93
+ const charH = 17;
94
+ const padX = 16;
95
+ const padY = windowChrome ? 44 : 16;
96
+ const padBottom = 12;
97
+ const width = cols * charW + padX * 2;
98
+ const height = rows * charH + padY + padBottom;
99
+ const cornerR = 10;
100
+ // Build SVG
101
+ let svg = `<svg xmlns="http://www.w3.org/2000/svg" width="${width}" height="${height}" viewBox="0 0 ${width} ${height}">
102
+ <defs>
103
+ <style>
104
+ text { font-family: '${fontFamily}'; font-size: 13px; }
105
+ </style>
106
+ </defs>
107
+ <rect width="${width}" height="${height}" rx="${cornerR}" ry="${cornerR}" fill="${BG_COLOR}"/>`;
108
+ if (windowChrome) {
109
+ svg += `
110
+ <circle cx="20" cy="18" r="6" fill="#ff5f57"/>
111
+ <circle cx="40" cy="18" r="6" fill="#febc2e"/>
112
+ <circle cx="60" cy="18" r="6" fill="#28c840"/>`;
113
+ }
114
+ svg += '\n';
115
+ // Render each character individually at its exact grid position
116
+ // (grouping into text runs causes drift with Unicode box/block characters)
117
+ for (let y = 0; y < rows; y++) {
118
+ const line = buffer.getLine(y);
119
+ if (!line)
120
+ continue;
121
+ for (let x = 0; x < cols; x++) {
122
+ const cell = line.getCell(x);
123
+ if (!cell)
124
+ continue;
125
+ const char = cell.getChars();
126
+ if (!char || char === ' ')
127
+ continue;
128
+ const bgColor = resolveColor(cell.getBgColor(), cell.getBgColorMode(), true);
129
+ const fgColor = resolveColor(cell.getFgColor(), cell.getFgColorMode(), false);
130
+ const bold = cell.isBold() === 1;
131
+ const cx = padX + x * charW;
132
+ const cy = padY + y * charH;
133
+ // Render non-default backgrounds
134
+ if (bgColor !== BG_COLOR) {
135
+ svg += `<rect x="${cx}" y="${cy}" width="${charW}" height="${charH}" fill="${bgColor}"/>`;
136
+ }
137
+ const weight = bold ? ' font-weight="bold"' : '';
138
+ svg += `<text x="${cx}" y="${cy + charH - 4}" fill="${fgColor}"${weight}>${escapeXml(char)}</text>\n`;
139
+ }
140
+ }
141
+ svg += '</svg>';
142
+ // Convert SVG to PNG
143
+ // Dynamic import to avoid hard failure if resvg is not installed
144
+ let Resvg;
145
+ try {
146
+ Resvg = require('@resvg/resvg-js').Resvg;
147
+ }
148
+ catch {
149
+ throw new Error('PNG screenshot requires @resvg/resvg-js. Install it with: npm install @resvg/resvg-js');
150
+ }
151
+ const resvg = new Resvg(svg, {
152
+ fitTo: { mode: 'width', value: Math.round(width * scale) },
153
+ font: {
154
+ loadSystemFonts: fontDirs.length === 0,
155
+ fontDirs,
156
+ defaultFontFamily: fontFamily,
157
+ },
158
+ });
159
+ const pngData = resvg.render();
160
+ return Buffer.from(pngData.asPng());
161
+ }
162
+ //# sourceMappingURL=render.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/utils/render.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AAGzB,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAE/C,SAAS,eAAe;IACtB,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;IAE1B,0BAA0B;IAC1B,MAAM,UAAU,GAAG;QACjB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,oBAAoB,CAAC;QACrC,kBAAkB;QAClB,wBAAwB;QACxB,uBAAuB;QACvB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,eAAe,CAAC;KACjC,CAAC;IAEF,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;QAC3B,IAAI,CAAC;YACH,IAAI,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE;gBAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjD,CAAC;QAAC,MAAM,CAAC,CAAC,UAAU,CAAC,CAAC;IACxB,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,GAAG,CAAC,CAAC;AACrB,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAI,kDAAkD;AAC9E,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAG,6CAA6C;AACzE,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAI,gDAAgD;AAE5E,sDAAsD;AACtD,MAAM,SAAS,GAAG;IAChB,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS;IACtF,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS;CACvF,CAAC;AAEF,MAAM,QAAQ,GAAG,SAAS,CAAC;AAC3B,MAAM,QAAQ,GAAG,SAAS,CAAC;AAE3B,SAAS,QAAQ,CAAC,CAAS;IACzB,IAAI,CAAC,GAAG,EAAE;QAAE,OAAO,SAAS,CAAC,CAAC,CAAC,CAAC;IAChC,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC;QACZ,CAAC,IAAI,EAAE,CAAC;QACR,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC;QAClC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;QACxC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;QACvB,OAAO,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;IAC/B,CAAC;IACD,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAChC,OAAO,OAAO,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,CAAC;AACxC,CAAC;AAED,SAAS,YAAY,CAAC,KAAa,EAAE,IAAY,EAAE,YAAqB;IACtE,IAAI,IAAI,KAAK,UAAU,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QACrC,OAAO,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC;IAC5C,CAAC;IACD,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QACpB,OAAO,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IAClE,CAAC;IACD,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QACrB,IAAI,KAAK,GAAG,EAAE;YAAE,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC;QACxC,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC;IACD,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QACpB,MAAM,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;QAC/B,MAAM,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC;QAC9B,MAAM,CAAC,GAAG,KAAK,GAAG,IAAI,CAAC;QACvB,OAAO,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;IAC/B,CAAC;IACD,OAAO,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC;AAC5C,CAAC;AAED,SAAS,SAAS,CAAC,CAAS;IAC1B,OAAO,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AACtG,CAAC;AAaD;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,QAAkB,EAAE,UAAyB,EAAE;IACjF,MAAM,EACJ,UAAU,GAAG,gBAAgB,EAC7B,QAAQ,EAAE,YAAY,GAAG,EAAE,EAC3B,YAAY,GAAG,IAAI,EACnB,KAAK,GAAG,CAAC,GACV,GAAG,OAAO,CAAC;IAEZ,6CAA6C;IAC7C,MAAM,QAAQ,GAAG,YAAY,CAAC,MAAM,GAAG,CAAC;QACtC,CAAC,CAAC,YAAY;QACd,CAAC,CAAC,eAAe,EAAE,CAAC;IAEtB,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;IAC3B,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;IAC3B,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC;IAEtC,qDAAqD;IACrD,MAAM,KAAK,GAAG,GAAG,CAAC;IAClB,MAAM,KAAK,GAAG,EAAE,CAAC;IACjB,MAAM,IAAI,GAAG,EAAE,CAAC;IAChB,MAAM,IAAI,GAAG,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACpC,MAAM,SAAS,GAAG,EAAE,CAAC;IACrB,MAAM,KAAK,GAAG,IAAI,GAAG,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC;IACtC,MAAM,MAAM,GAAG,IAAI,GAAG,KAAK,GAAG,IAAI,GAAG,SAAS,CAAC;IAC/C,MAAM,OAAO,GAAG,EAAE,CAAC;IAEnB,YAAY;IACZ,IAAI,GAAG,GAAG,kDAAkD,KAAK,aAAa,MAAM,kBAAkB,KAAK,IAAI,MAAM;;;2BAG5F,UAAU;;;eAGtB,KAAK,aAAa,MAAM,SAAS,OAAO,SAAS,OAAO,WAAW,QAAQ,KAAK,CAAC;IAE9F,IAAI,YAAY,EAAE,CAAC;QACjB,GAAG,IAAI;;;+CAGoC,CAAC;IAC9C,CAAC;IACD,GAAG,IAAI,IAAI,CAAC;IAEZ,gEAAgE;IAChE,2EAA2E;IAC3E,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9B,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC/B,IAAI,CAAC,IAAI;YAAE,SAAS;QAEpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;YAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAC7B,IAAI,CAAC,IAAI;gBAAE,SAAS;YAEpB,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC7B,IAAI,CAAC,IAAI,IAAI,IAAI,KAAK,GAAG;gBAAE,SAAS;YAEpC,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,IAAI,CAAC,cAAc,EAAE,EAAE,IAAI,CAAC,CAAC;YAC7E,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,IAAI,CAAC,cAAc,EAAE,EAAE,KAAK,CAAC,CAAC;YAC9E,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YAEjC,MAAM,EAAE,GAAG,IAAI,GAAG,CAAC,GAAG,KAAK,CAAC;YAC5B,MAAM,EAAE,GAAG,IAAI,GAAG,CAAC,GAAG,KAAK,CAAC;YAE5B,iCAAiC;YACjC,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;gBACzB,GAAG,IAAI,YAAY,EAAE,QAAQ,EAAE,YAAY,KAAK,aAAa,KAAK,WAAW,OAAO,KAAK,CAAC;YAC5F,CAAC;YAED,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,EAAE,CAAC;YACjD,GAAG,IAAI,YAAY,EAAE,QAAQ,EAAE,GAAG,KAAK,GAAG,CAAC,WAAW,OAAO,IAAI,MAAM,IAAI,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC;QACxG,CAAC;IACH,CAAC;IAED,GAAG,IAAI,QAAQ,CAAC;IAEhB,qBAAqB;IACrB,iEAAiE;IACjE,IAAI,KAAU,CAAC;IACf,IAAI,CAAC;QACH,KAAK,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC,KAAK,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CACb,uFAAuF,CACxF,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,GAAG,EAAE;QAC3B,KAAK,EAAE,EAAE,IAAI,EAAE,OAAgB,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,EAAE;QACnE,IAAI,EAAE;YACJ,eAAe,EAAE,QAAQ,CAAC,MAAM,KAAK,CAAC;YACtC,QAAQ;YACR,iBAAiB,EAAE,UAAU;SAC9B;KACF,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;IAC/B,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;AACtC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ellery/terminal-mcp",
3
- "version": "0.2.1",
3
+ "version": "0.3.0",
4
4
  "description": "A headless terminal emulator exposed via MCP for AI assistants",
5
5
  "author": "Ellery Familia",
6
6
  "repository": {
@@ -22,11 +22,15 @@
22
22
  "prepare": "npm run build"
23
23
  },
24
24
  "dependencies": {
25
+ "@anthropic-ai/sandbox-runtime": "^0.0.32",
25
26
  "@modelcontextprotocol/sdk": "^1.0.0",
26
27
  "@xterm/headless": "^5.3.0",
27
- "@homebridge/node-pty-prebuilt-multiarch": "^0.13.1",
28
+ "node-pty": "^1.2.0-beta.8",
28
29
  "zod": "^3.23.0"
29
30
  },
31
+ "optionalDependencies": {
32
+ "@resvg/resvg-js": "^2.6.0"
33
+ },
30
34
  "devDependencies": {
31
35
  "@types/node": "^20.0.0",
32
36
  "tsx": "^4.0.0",
Binary file