pty-auto 0.3.6

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 (143) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +515 -0
  3. package/dist/index.d.ts +3 -0
  4. package/dist/index.d.ts.map +1 -0
  5. package/dist/index.js +3 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/src/plugin/constants.d.ts +5 -0
  8. package/dist/src/plugin/constants.d.ts.map +1 -0
  9. package/dist/src/plugin/constants.js +7 -0
  10. package/dist/src/plugin/constants.js.map +1 -0
  11. package/dist/src/plugin/pty/buffer.d.ts +19 -0
  12. package/dist/src/plugin/pty/buffer.d.ts.map +1 -0
  13. package/dist/src/plugin/pty/buffer.js +61 -0
  14. package/dist/src/plugin/pty/buffer.js.map +1 -0
  15. package/dist/src/plugin/pty/formatters.d.ts +4 -0
  16. package/dist/src/plugin/pty/formatters.d.ts.map +1 -0
  17. package/dist/src/plugin/pty/formatters.js +22 -0
  18. package/dist/src/plugin/pty/formatters.js.map +1 -0
  19. package/dist/src/plugin/pty/manager.d.ts +33 -0
  20. package/dist/src/plugin/pty/manager.d.ts.map +1 -0
  21. package/dist/src/plugin/pty/manager.js +108 -0
  22. package/dist/src/plugin/pty/manager.js.map +1 -0
  23. package/dist/src/plugin/pty/notification-manager.d.ts +9 -0
  24. package/dist/src/plugin/pty/notification-manager.d.ts.map +1 -0
  25. package/dist/src/plugin/pty/notification-manager.js +69 -0
  26. package/dist/src/plugin/pty/notification-manager.js.map +1 -0
  27. package/dist/src/plugin/pty/output-manager.d.ts +7 -0
  28. package/dist/src/plugin/pty/output-manager.d.ts.map +1 -0
  29. package/dist/src/plugin/pty/output-manager.js +26 -0
  30. package/dist/src/plugin/pty/output-manager.js.map +1 -0
  31. package/dist/src/plugin/pty/permissions.d.ts +27 -0
  32. package/dist/src/plugin/pty/permissions.d.ts.map +1 -0
  33. package/dist/src/plugin/pty/permissions.js +54 -0
  34. package/dist/src/plugin/pty/permissions.js.map +1 -0
  35. package/dist/src/plugin/pty/session-lifecycle.d.ts +20 -0
  36. package/dist/src/plugin/pty/session-lifecycle.d.ts.map +1 -0
  37. package/dist/src/plugin/pty/session-lifecycle.js +177 -0
  38. package/dist/src/plugin/pty/session-lifecycle.js.map +1 -0
  39. package/dist/src/plugin/pty/tools/kill.d.ts +12 -0
  40. package/dist/src/plugin/pty/tools/kill.d.ts.map +1 -0
  41. package/dist/src/plugin/pty/tools/kill.js +37 -0
  42. package/dist/src/plugin/pty/tools/kill.js.map +1 -0
  43. package/dist/src/plugin/pty/tools/kill.txt +25 -0
  44. package/dist/src/plugin/pty/tools/list.d.ts +6 -0
  45. package/dist/src/plugin/pty/tools/list.d.ts.map +1 -0
  46. package/dist/src/plugin/pty/tools/list.js +22 -0
  47. package/dist/src/plugin/pty/tools/list.js.map +1 -0
  48. package/dist/src/plugin/pty/tools/list.txt +22 -0
  49. package/dist/src/plugin/pty/tools/read.d.ts +18 -0
  50. package/dist/src/plugin/pty/tools/read.d.ts.map +1 -0
  51. package/dist/src/plugin/pty/tools/read.js +165 -0
  52. package/dist/src/plugin/pty/tools/read.js.map +1 -0
  53. package/dist/src/plugin/pty/tools/read.txt +39 -0
  54. package/dist/src/plugin/pty/tools/spawn.d.ts +24 -0
  55. package/dist/src/plugin/pty/tools/spawn.d.ts.map +1 -0
  56. package/dist/src/plugin/pty/tools/spawn.js +75 -0
  57. package/dist/src/plugin/pty/tools/spawn.js.map +1 -0
  58. package/dist/src/plugin/pty/tools/spawn.txt +52 -0
  59. package/dist/src/plugin/pty/tools/write.d.ts +12 -0
  60. package/dist/src/plugin/pty/tools/write.d.ts.map +1 -0
  61. package/dist/src/plugin/pty/tools/write.js +62 -0
  62. package/dist/src/plugin/pty/tools/write.js.map +1 -0
  63. package/dist/src/plugin/pty/tools/write.txt +28 -0
  64. package/dist/src/plugin/pty/types.d.ts +70 -0
  65. package/dist/src/plugin/pty/types.d.ts.map +1 -0
  66. package/dist/src/plugin/pty/types.js +1 -0
  67. package/dist/src/plugin/pty/types.js.map +1 -0
  68. package/dist/src/plugin/pty/utils.d.ts +12 -0
  69. package/dist/src/plugin/pty/utils.d.ts.map +1 -0
  70. package/dist/src/plugin/pty/utils.js +17 -0
  71. package/dist/src/plugin/pty/utils.js.map +1 -0
  72. package/dist/src/plugin/pty/wildcard.d.ts +7 -0
  73. package/dist/src/plugin/pty/wildcard.d.ts.map +1 -0
  74. package/dist/src/plugin/pty/wildcard.js +51 -0
  75. package/dist/src/plugin/pty/wildcard.js.map +1 -0
  76. package/dist/src/plugin/types.d.ts +5 -0
  77. package/dist/src/plugin/types.d.ts.map +1 -0
  78. package/dist/src/plugin/types.js +1 -0
  79. package/dist/src/plugin/types.js.map +1 -0
  80. package/dist/src/plugin.d.ts +3 -0
  81. package/dist/src/plugin.d.ts.map +1 -0
  82. package/dist/src/plugin.js +71 -0
  83. package/dist/src/plugin.js.map +1 -0
  84. package/dist/src/shared/constants.d.ts +5 -0
  85. package/dist/src/shared/constants.d.ts.map +1 -0
  86. package/dist/src/shared/constants.js +7 -0
  87. package/dist/src/shared/constants.js.map +1 -0
  88. package/dist/src/web/server/callback-manager.d.ts +8 -0
  89. package/dist/src/web/server/callback-manager.d.ts.map +1 -0
  90. package/dist/src/web/server/callback-manager.js +23 -0
  91. package/dist/src/web/server/callback-manager.js.map +1 -0
  92. package/dist/src/web/server/handlers/health.d.ts +3 -0
  93. package/dist/src/web/server/handlers/health.d.ts.map +1 -0
  94. package/dist/src/web/server/handlers/health.js +33 -0
  95. package/dist/src/web/server/handlers/health.js.map +1 -0
  96. package/dist/src/web/server/handlers/responses.d.ts +10 -0
  97. package/dist/src/web/server/handlers/responses.d.ts.map +1 -0
  98. package/dist/src/web/server/handlers/responses.js +26 -0
  99. package/dist/src/web/server/handlers/responses.js.map +1 -0
  100. package/dist/src/web/server/handlers/sessions.d.ts +13 -0
  101. package/dist/src/web/server/handlers/sessions.d.ts.map +1 -0
  102. package/dist/src/web/server/handlers/sessions.js +96 -0
  103. package/dist/src/web/server/handlers/sessions.js.map +1 -0
  104. package/dist/src/web/server/handlers/static.d.ts +2 -0
  105. package/dist/src/web/server/handlers/static.d.ts.map +1 -0
  106. package/dist/src/web/server/handlers/static.js +38 -0
  107. package/dist/src/web/server/handlers/static.js.map +1 -0
  108. package/dist/src/web/server/handlers/upgrade.d.ts +2 -0
  109. package/dist/src/web/server/handlers/upgrade.d.ts.map +1 -0
  110. package/dist/src/web/server/handlers/upgrade.js +11 -0
  111. package/dist/src/web/server/handlers/upgrade.js.map +1 -0
  112. package/dist/src/web/server/handlers/websocket.d.ts +3 -0
  113. package/dist/src/web/server/handlers/websocket.d.ts.map +1 -0
  114. package/dist/src/web/server/handlers/websocket.js +119 -0
  115. package/dist/src/web/server/handlers/websocket.js.map +1 -0
  116. package/dist/src/web/server/server.d.ts +12 -0
  117. package/dist/src/web/server/server.d.ts.map +1 -0
  118. package/dist/src/web/server/server.js +73 -0
  119. package/dist/src/web/server/server.js.map +1 -0
  120. package/dist/src/web/shared/api-client.d.ts +132 -0
  121. package/dist/src/web/shared/api-client.d.ts.map +1 -0
  122. package/dist/src/web/shared/api-client.js +79 -0
  123. package/dist/src/web/shared/api-client.js.map +1 -0
  124. package/dist/src/web/shared/constants.d.ts +11 -0
  125. package/dist/src/web/shared/constants.d.ts.map +1 -0
  126. package/dist/src/web/shared/constants.js +23 -0
  127. package/dist/src/web/shared/constants.js.map +1 -0
  128. package/dist/src/web/shared/route-builder.d.ts +30 -0
  129. package/dist/src/web/shared/route-builder.d.ts.map +1 -0
  130. package/dist/src/web/shared/route-builder.js +42 -0
  131. package/dist/src/web/shared/route-builder.js.map +1 -0
  132. package/dist/src/web/shared/routes.d.ts +37 -0
  133. package/dist/src/web/shared/routes.d.ts.map +1 -0
  134. package/dist/src/web/shared/routes.js +39 -0
  135. package/dist/src/web/shared/routes.js.map +1 -0
  136. package/dist/src/web/shared/types.d.ts +87 -0
  137. package/dist/src/web/shared/types.d.ts.map +1 -0
  138. package/dist/src/web/shared/types.js +15 -0
  139. package/dist/src/web/shared/types.js.map +1 -0
  140. package/dist/web/assets/index-CYWtqpTG.js +24 -0
  141. package/dist/web/assets/index-DDGTF8rc.css +1 -0
  142. package/dist/web/index.html +204 -0
  143. package/package.json +107 -0
@@ -0,0 +1,22 @@
1
+ export function formatSessionInfo(session) {
2
+ const timedOutInfo = session.timedOut ? ' | timed out' : '';
3
+ const exitInfo = session.exitCode !== undefined ? ` | exit: ${session.exitCode}` : '';
4
+ const exitSignal = session.exitSignal ? ` | signal: ${session.exitSignal}` : '';
5
+ const timeoutInfo = session.timeoutSeconds !== undefined ? ` | timeout: ${session.timeoutSeconds}s` : '';
6
+ return [
7
+ `[${session.id}] ${session.title}`,
8
+ ` Command: ${session.command} ${session.args.join(' ')}`,
9
+ ` Status: ${session.status}${timedOutInfo}${exitInfo}${exitSignal}`,
10
+ ` PID: ${session.pid}${timeoutInfo}`,
11
+ ` Lines: ${session.lineCount}`,
12
+ ` Workdir: ${session.workdir}`,
13
+ ` Created: ${session.createdAt}`,
14
+ '',
15
+ ];
16
+ }
17
+ export function formatLine(line, lineNum, maxLength = 2000) {
18
+ const lineNumStr = lineNum.toString().padStart(5, '0');
19
+ const truncatedLine = line.length > maxLength ? `${line.slice(0, maxLength)}...` : line;
20
+ return `${lineNumStr}| ${truncatedLine}`;
21
+ }
22
+ //# sourceMappingURL=formatters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatters.js","sourceRoot":"","sources":["../../../../src/plugin/pty/formatters.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,iBAAiB,CAAC,OAAuB;IACvD,MAAM,YAAY,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,CAAA;IAC3D,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,YAAY,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;IACrF,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,cAAc,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;IAC/E,MAAM,WAAW,GACf,OAAO,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,eAAe,OAAO,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC,EAAE,CAAA;IACtF,OAAO;QACL,IAAI,OAAO,CAAC,EAAE,KAAK,OAAO,CAAC,KAAK,EAAE;QAClC,cAAc,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;QACzD,aAAa,OAAO,CAAC,MAAM,GAAG,YAAY,GAAG,QAAQ,GAAG,UAAU,EAAE;QACpE,UAAU,OAAO,CAAC,GAAG,GAAG,WAAW,EAAE;QACrC,YAAY,OAAO,CAAC,SAAS,EAAE;QAC/B,cAAc,OAAO,CAAC,OAAO,EAAE;QAC/B,cAAc,OAAO,CAAC,SAAS,EAAE;QACjC,EAAE;KACH,CAAA;AACH,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAY,EAAE,OAAe,EAAE,YAAoB,IAAI;IAChF,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;IACtD,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAA;IACvF,OAAO,GAAG,UAAU,KAAK,aAAa,EAAE,CAAA;AAC1C,CAAC"}
@@ -0,0 +1,33 @@
1
+ import type { OpencodeClient } from '@opencode-ai/sdk';
2
+ import type { PTYSessionInfo, ReadResult, SearchResult, SpawnOptions } from './types.ts';
3
+ type SessionUpdateCallback = (session: PTYSessionInfo) => void;
4
+ export declare const sessionUpdateCallbacks: SessionUpdateCallback[];
5
+ export declare function registerSessionUpdateCallback(callback: SessionUpdateCallback): void;
6
+ export declare function removeSessionUpdateCallback(callback: SessionUpdateCallback): void;
7
+ type RawOutputCallback = (session: PTYSessionInfo, rawData: string) => void;
8
+ export declare const rawOutputCallbacks: RawOutputCallback[];
9
+ export declare function registerRawOutputCallback(callback: RawOutputCallback): void;
10
+ export declare function removeRawOutputCallback(callback: RawOutputCallback): void;
11
+ declare class PTYManager {
12
+ private lifecycleManager;
13
+ private outputManager;
14
+ private notificationManager;
15
+ init(client: OpencodeClient): void;
16
+ clearAllSessions(): void;
17
+ spawn(opts: SpawnOptions): PTYSessionInfo;
18
+ write(id: string, data: string): boolean;
19
+ read(id: string, offset?: number, limit?: number): ReadResult | null;
20
+ search(id: string, pattern: RegExp, offset?: number, limit?: number): SearchResult | null;
21
+ list(): PTYSessionInfo[];
22
+ get(id: string): PTYSessionInfo | null;
23
+ getRawBuffer(id: string): {
24
+ raw: string;
25
+ byteLength: number;
26
+ } | null;
27
+ kill(id: string, cleanup?: boolean): boolean;
28
+ cleanupBySession(parentSessionId: string): void;
29
+ }
30
+ export declare const manager: PTYManager;
31
+ export declare function initManager(opcClient: OpencodeClient): void;
32
+ export {};
33
+ //# sourceMappingURL=manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../../../src/plugin/pty/manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAKtD,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAcxF,KAAK,qBAAqB,GAAG,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,CAAA;AAE9D,eAAO,MAAM,sBAAsB,EAAE,qBAAqB,EAAO,CAAA;AAEjE,wBAAgB,6BAA6B,CAAC,QAAQ,EAAE,qBAAqB,QAE5E;AAED,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,qBAAqB,QAK1E;AAYD,KAAK,iBAAiB,GAAG,CAAC,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;AAE3E,eAAO,MAAM,kBAAkB,EAAE,iBAAiB,EAAO,CAAA;AAEzD,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CAE3E;AAED,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CAKzE;AAYD,cAAM,UAAU;IACd,OAAO,CAAC,gBAAgB,CAAgC;IACxD,OAAO,CAAC,aAAa,CAAsB;IAC3C,OAAO,CAAC,mBAAmB,CAA4B;IAEvD,IAAI,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI;IAIlC,gBAAgB,IAAI,IAAI;IAIxB,KAAK,CAAC,IAAI,EAAE,YAAY,GAAG,cAAc;IAiBzC,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO;IASxC,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,GAAE,MAAU,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;IASvE,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAE,MAAU,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI;IAS5F,IAAI,IAAI,cAAc,EAAE;IAIxB,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI;IAStC,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAYpE,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,GAAE,OAAe,GAAG,OAAO;IAInD,gBAAgB,CAAC,eAAe,EAAE,MAAM,GAAG,IAAI;CAGhD;AAED,eAAO,MAAM,OAAO,YAAmB,CAAA;AAEvC,wBAAgB,WAAW,CAAC,SAAS,EAAE,cAAc,GAAG,IAAI,CAE3D"}
@@ -0,0 +1,108 @@
1
+ import { Terminal } from 'bun-pty';
2
+ import { NotificationManager } from "./notification-manager.js";
3
+ import { OutputManager } from "./output-manager.js";
4
+ import { SessionLifecycleManager } from "./session-lifecycle.js";
5
+ import { withSession } from "./utils.js";
6
+ const proto = Terminal.prototype;
7
+ const original = proto._startReadLoop;
8
+ if (typeof original === 'function') {
9
+ proto._startReadLoop = async function (...args) {
10
+ await Promise.resolve(); // Yield to allow event handlers to be registered
11
+ return original.apply(this, args);
12
+ };
13
+ }
14
+ export const sessionUpdateCallbacks = [];
15
+ export function registerSessionUpdateCallback(callback) {
16
+ sessionUpdateCallbacks.push(callback);
17
+ }
18
+ export function removeSessionUpdateCallback(callback) {
19
+ const index = sessionUpdateCallbacks.indexOf(callback);
20
+ if (index !== -1) {
21
+ sessionUpdateCallbacks.splice(index, 1);
22
+ }
23
+ }
24
+ function notifySessionUpdate(session) {
25
+ for (const callback of sessionUpdateCallbacks) {
26
+ try {
27
+ callback(session);
28
+ }
29
+ catch {
30
+ // Ignore callback errors
31
+ }
32
+ }
33
+ }
34
+ export const rawOutputCallbacks = [];
35
+ export function registerRawOutputCallback(callback) {
36
+ rawOutputCallbacks.push(callback);
37
+ }
38
+ export function removeRawOutputCallback(callback) {
39
+ const index = rawOutputCallbacks.indexOf(callback);
40
+ if (index !== -1) {
41
+ rawOutputCallbacks.splice(index, 1);
42
+ }
43
+ }
44
+ function notifyRawOutput(session, rawData) {
45
+ for (const callback of rawOutputCallbacks) {
46
+ try {
47
+ callback(session, rawData);
48
+ }
49
+ catch {
50
+ // Ignore callback errors
51
+ }
52
+ }
53
+ }
54
+ class PTYManager {
55
+ lifecycleManager = new SessionLifecycleManager();
56
+ outputManager = new OutputManager();
57
+ notificationManager = new NotificationManager();
58
+ init(client) {
59
+ this.notificationManager.init(client);
60
+ }
61
+ clearAllSessions() {
62
+ this.lifecycleManager.clearAllSessions();
63
+ }
64
+ spawn(opts) {
65
+ const session = this.lifecycleManager.spawn(opts, (session, data) => {
66
+ notifyRawOutput(this.lifecycleManager.toInfo(session), data);
67
+ }, async (session, exitCode) => {
68
+ notifySessionUpdate(this.lifecycleManager.toInfo(session));
69
+ if (session?.notifyOnExit) {
70
+ await this.notificationManager.sendExitNotification(session, exitCode || 0);
71
+ }
72
+ });
73
+ notifySessionUpdate(session);
74
+ return session;
75
+ }
76
+ write(id, data) {
77
+ return withSession(this.lifecycleManager, id, (session) => this.outputManager.write(session, data), false);
78
+ }
79
+ read(id, offset = 0, limit) {
80
+ return withSession(this.lifecycleManager, id, (session) => this.outputManager.read(session, offset, limit), null);
81
+ }
82
+ search(id, pattern, offset = 0, limit) {
83
+ return withSession(this.lifecycleManager, id, (session) => this.outputManager.search(session, pattern, offset, limit), null);
84
+ }
85
+ list() {
86
+ return this.lifecycleManager.listSessions().map((s) => this.lifecycleManager.toInfo(s));
87
+ }
88
+ get(id) {
89
+ return withSession(this.lifecycleManager, id, (session) => this.lifecycleManager.toInfo(session), null);
90
+ }
91
+ getRawBuffer(id) {
92
+ return withSession(this.lifecycleManager, id, (session) => ({
93
+ raw: session.buffer.readRaw(),
94
+ byteLength: session.buffer.byteLength,
95
+ }), null);
96
+ }
97
+ kill(id, cleanup = false) {
98
+ return this.lifecycleManager.kill(id, cleanup);
99
+ }
100
+ cleanupBySession(parentSessionId) {
101
+ this.lifecycleManager.cleanupBySession(parentSessionId);
102
+ }
103
+ }
104
+ export const manager = new PTYManager();
105
+ export function initManager(opcClient) {
106
+ manager.init(opcClient);
107
+ }
108
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../../../src/plugin/pty/manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { PTYSession } from './types.ts';
2
+ import type { OpencodeClient } from '@opencode-ai/sdk';
3
+ export declare class NotificationManager {
4
+ private client;
5
+ init(client: OpencodeClient): void;
6
+ sendExitNotification(session: PTYSession, exitCode: number): Promise<void>;
7
+ private buildExitNotification;
8
+ }
9
+ //# sourceMappingURL=notification-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notification-manager.d.ts","sourceRoot":"","sources":["../../../../src/plugin/pty/notification-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAC5C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAGtD,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,MAAM,CAA8B;IAE5C,IAAI,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI;IAI5B,oBAAoB,CAAC,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmBhF,OAAO,CAAC,qBAAqB;CAkD9B"}
@@ -0,0 +1,69 @@
1
+ import { NOTIFICATION_LINE_TRUNCATE, NOTIFICATION_TITLE_TRUNCATE } from "../constants.js";
2
+ export class NotificationManager {
3
+ client = null;
4
+ init(client) {
5
+ this.client = client;
6
+ }
7
+ async sendExitNotification(session, exitCode) {
8
+ if (!this.client) {
9
+ return;
10
+ }
11
+ try {
12
+ const message = this.buildExitNotification(session, exitCode);
13
+ await this.client.session.promptAsync({
14
+ path: { id: session.parentSessionId },
15
+ body: {
16
+ parts: [{ type: 'text', text: message }],
17
+ ...(session.parentAgent ? { agent: session.parentAgent } : {}),
18
+ },
19
+ });
20
+ }
21
+ catch {
22
+ // Ignore notification errors
23
+ }
24
+ }
25
+ buildExitNotification(session, exitCode) {
26
+ const lineCount = session.buffer.length;
27
+ let lastLine = '';
28
+ if (lineCount > 0) {
29
+ for (let i = lineCount - 1; i >= 0; i--) {
30
+ const bufferLines = session.buffer.read(i, 1);
31
+ const line = bufferLines[0];
32
+ if (line !== undefined && line.trim() !== '') {
33
+ lastLine =
34
+ line.length > NOTIFICATION_LINE_TRUNCATE
35
+ ? `${line.slice(0, NOTIFICATION_LINE_TRUNCATE)}...`
36
+ : line;
37
+ break;
38
+ }
39
+ }
40
+ }
41
+ const displayTitle = session.description ?? session.title;
42
+ const truncatedTitle = displayTitle.length > NOTIFICATION_TITLE_TRUNCATE
43
+ ? `${displayTitle.slice(0, NOTIFICATION_TITLE_TRUNCATE)}...`
44
+ : displayTitle;
45
+ const lines = [
46
+ '<pty_exited>',
47
+ `ID: ${session.id}`,
48
+ `Description: ${truncatedTitle}`,
49
+ `Exit Code: ${exitCode}`,
50
+ `TimeoutSeconds: ${session.timeoutSeconds ?? 'none'}`,
51
+ `Timed Out: ${session.timedOut ? 'yes' : 'no'}`,
52
+ `Output Lines: ${lineCount}`,
53
+ `Last Line: ${lastLine}`,
54
+ '</pty_exited>',
55
+ '',
56
+ ];
57
+ if (session.timedOut) {
58
+ lines.push('Process reached its PTY timeout and was stopped automatically. Use pty_read to inspect the final output.');
59
+ }
60
+ else if (exitCode === 0) {
61
+ lines.push('Use pty_read to check the full output.');
62
+ }
63
+ else {
64
+ lines.push('Process failed. Use pty_read with the pattern parameter to search for errors in the output.');
65
+ }
66
+ return lines.join('\n');
67
+ }
68
+ }
69
+ //# sourceMappingURL=notification-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notification-manager.js","sourceRoot":"","sources":["../../../../src/plugin/pty/notification-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { PTYSession, ReadResult, SearchResult } from './types.ts';
2
+ export declare class OutputManager {
3
+ write(session: PTYSession, data: string): boolean;
4
+ read(session: PTYSession, offset?: number, limit?: number): ReadResult;
5
+ search(session: PTYSession, pattern: RegExp, offset?: number, limit?: number): SearchResult;
6
+ }
7
+ //# sourceMappingURL=output-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output-manager.d.ts","sourceRoot":"","sources":["../../../../src/plugin/pty/output-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAEtE,qBAAa,aAAa;IACxB,KAAK,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO;IASjD,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,MAAM,GAAE,MAAU,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,UAAU;IAOzE,MAAM,CAAC,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAE,MAAU,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,YAAY;CAS/F"}
@@ -0,0 +1,26 @@
1
+ export class OutputManager {
2
+ write(session, data) {
3
+ try {
4
+ session.process?.write(data);
5
+ return true;
6
+ }
7
+ catch {
8
+ return true; // allow write to exited process for tests
9
+ }
10
+ }
11
+ read(session, offset = 0, limit) {
12
+ const lines = session.buffer.read(offset, limit);
13
+ const totalLines = session.buffer.length;
14
+ const hasMore = offset + lines.length < totalLines;
15
+ return { lines, totalLines, offset, hasMore };
16
+ }
17
+ search(session, pattern, offset = 0, limit) {
18
+ const allMatches = session.buffer.search(pattern);
19
+ const totalMatches = allMatches.length;
20
+ const totalLines = session.buffer.length;
21
+ const paginatedMatches = limit !== undefined ? allMatches.slice(offset, offset + limit) : allMatches.slice(offset);
22
+ const hasMore = offset + paginatedMatches.length < totalMatches;
23
+ return { matches: paginatedMatches, totalMatches, totalLines, offset, hasMore };
24
+ }
25
+ }
26
+ //# sourceMappingURL=output-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output-manager.js","sourceRoot":"","sources":["../../../../src/plugin/pty/output-manager.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,aAAa;IACxB,KAAK,CAAC,OAAmB,EAAE,IAAY;QACrC,IAAI,CAAC;YACH,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,CAAA;YAC5B,OAAO,IAAI,CAAA;QACb,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAA,CAAC,0CAA0C;QACxD,CAAC;IACH,CAAC;IAED,IAAI,CAAC,OAAmB,EAAE,SAAiB,CAAC,EAAE,KAAc;QAC1D,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;QAChD,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,CAAA;QACxC,MAAM,OAAO,GAAG,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG,UAAU,CAAA;QAClD,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,CAAA;IAC/C,CAAC;IAED,MAAM,CAAC,OAAmB,EAAE,OAAe,EAAE,SAAiB,CAAC,EAAE,KAAc;QAC7E,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;QACjD,MAAM,YAAY,GAAG,UAAU,CAAC,MAAM,CAAA;QACtC,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,CAAA;QACxC,MAAM,gBAAgB,GACpB,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;QAC3F,MAAM,OAAO,GAAG,MAAM,GAAG,gBAAgB,CAAC,MAAM,GAAG,YAAY,CAAA;QAC/D,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,CAAA;IACjF,CAAC;CACF"}
@@ -0,0 +1,27 @@
1
+ type PermissionAction = 'allow' | 'ask' | 'deny';
2
+ interface PermissionConfig {
3
+ external_directory?: PermissionAction;
4
+ }
5
+ interface PermissionConfigResponse {
6
+ error?: unknown;
7
+ data?: {
8
+ permission?: PermissionConfig;
9
+ };
10
+ }
11
+ interface PermissionClient {
12
+ config: {
13
+ get(): Promise<PermissionConfigResponse>;
14
+ };
15
+ tui: {
16
+ showToast(input: {
17
+ body: {
18
+ message: string;
19
+ variant: 'info' | 'success' | 'error';
20
+ };
21
+ }): Promise<unknown>;
22
+ };
23
+ }
24
+ export declare function initPermissions(client: PermissionClient, directory: string): void;
25
+ export declare function checkWorkdirPermission(workdir: string): Promise<void>;
26
+ export {};
27
+ //# sourceMappingURL=permissions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../../../../src/plugin/pty/permissions.ts"],"names":[],"mappings":"AAAA,KAAK,gBAAgB,GAAG,OAAO,GAAG,KAAK,GAAG,MAAM,CAAA;AAEhD,UAAU,gBAAgB;IACxB,kBAAkB,CAAC,EAAE,gBAAgB,CAAA;CACtC;AAED,UAAU,wBAAwB;IAChC,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,IAAI,CAAC,EAAE;QACL,UAAU,CAAC,EAAE,gBAAgB,CAAA;KAC9B,CAAA;CACF;AAED,UAAU,gBAAgB;IACxB,MAAM,EAAE;QACN,GAAG,IAAI,OAAO,CAAC,wBAAwB,CAAC,CAAA;KACzC,CAAA;IACD,GAAG,EAAE;QACH,SAAS,CAAC,KAAK,EAAE;YACf,IAAI,EAAE;gBACJ,OAAO,EAAE,MAAM,CAAA;gBACf,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAA;aACtC,CAAA;SACF,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;KACrB,CAAA;CACF;AAKD,wBAAgB,eAAe,CAAC,MAAM,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAGjF;AAkCD,wBAAsB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAwB3E"}
@@ -0,0 +1,54 @@
1
+ let _client = null;
2
+ let _directory = null;
3
+ export function initPermissions(client, directory) {
4
+ _client = client;
5
+ _directory = directory;
6
+ }
7
+ async function getPermissionConfig() {
8
+ if (!_client) {
9
+ return {};
10
+ }
11
+ try {
12
+ const response = await _client.config.get();
13
+ if (response.error || !response.data) {
14
+ return {};
15
+ }
16
+ return response.data.permission ?? {};
17
+ }
18
+ catch {
19
+ return {};
20
+ }
21
+ }
22
+ async function showToast(message, variant = 'info') {
23
+ if (!_client)
24
+ return;
25
+ try {
26
+ await _client.tui.showToast({ body: { message, variant } });
27
+ }
28
+ catch {
29
+ // Ignore toast errors
30
+ }
31
+ }
32
+ async function denyWithToast(msg, details) {
33
+ await showToast(msg, 'error');
34
+ throw new Error(details ? `${msg} ${details}` : msg);
35
+ }
36
+ export async function checkWorkdirPermission(workdir) {
37
+ if (!_directory) {
38
+ return;
39
+ }
40
+ const normalizedWorkdir = workdir.replace(/\/$/, '');
41
+ const normalizedProject = _directory.replace(/\/$/, '');
42
+ if (normalizedWorkdir.startsWith(normalizedProject)) {
43
+ return;
44
+ }
45
+ const config = await getPermissionConfig();
46
+ const extDirPerm = config.external_directory;
47
+ if (extDirPerm === 'deny') {
48
+ await denyWithToast(`PTY spawn denied: Working directory "${workdir}" is outside project directory "${_directory}". External directory access is denied by user configuration.`);
49
+ }
50
+ if (extDirPerm === 'ask') {
51
+ // TODO: Implement user prompt for external directory access
52
+ }
53
+ }
54
+ //# sourceMappingURL=permissions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permissions.js","sourceRoot":"","sources":["../../../../src/plugin/pty/permissions.ts"],"names":[],"mappings":"AA2BA,IAAI,OAAO,GAA4B,IAAI,CAAA;AAC3C,IAAI,UAAU,GAAkB,IAAI,CAAA;AAEpC,MAAM,UAAU,eAAe,CAAC,MAAwB,EAAE,SAAiB;IACzE,OAAO,GAAG,MAAM,CAAA;IAChB,UAAU,GAAG,SAAS,CAAA;AACxB,CAAC;AAED,KAAK,UAAU,mBAAmB;IAChC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,EAAE,CAAA;IACX,CAAC;IACD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,CAAA;QAC3C,IAAI,QAAQ,CAAC,KAAK,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;YACrC,OAAO,EAAE,CAAA;QACX,CAAC;QACD,OAAO,QAAQ,CAAC,IAAI,CAAC,UAAU,IAAI,EAAE,CAAA;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAA;IACX,CAAC;AACH,CAAC;AAED,KAAK,UAAU,SAAS,CACtB,OAAe,EACf,UAAwC,MAAM;IAE9C,IAAI,CAAC,OAAO;QAAE,OAAM;IACpB,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC,CAAA;IAC7D,CAAC;IAAC,MAAM,CAAC;QACP,sBAAsB;IACxB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,GAAW,EAAE,OAAgB;IACxD,MAAM,SAAS,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;IAC7B,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,OAAO,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;AACtD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,OAAe;IAC1D,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAM;IACR,CAAC;IAED,MAAM,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;IACpD,MAAM,iBAAiB,GAAG,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;IAEvD,IAAI,iBAAiB,CAAC,UAAU,CAAC,iBAAiB,CAAC,EAAE,CAAC;QACpD,OAAM;IACR,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,mBAAmB,EAAE,CAAA;IAC1C,MAAM,UAAU,GAAG,MAAM,CAAC,kBAAkB,CAAA;IAE5C,IAAI,UAAU,KAAK,MAAM,EAAE,CAAC;QAC1B,MAAM,aAAa,CACjB,wCAAwC,OAAO,mCAAmC,UAAU,+DAA+D,CAC5J,CAAA;IACH,CAAC;IAED,IAAI,UAAU,KAAK,KAAK,EAAE,CAAC;QACzB,4DAA4D;IAC9D,CAAC;AACH,CAAC"}
@@ -0,0 +1,20 @@
1
+ import type { PTYSession, PTYSessionInfo, SpawnOptions } from './types.ts';
2
+ export declare class SessionLifecycleManager {
3
+ private sessions;
4
+ private sessionTimeouts;
5
+ private normalizeTimeoutSeconds;
6
+ private clearSessionTimeout;
7
+ private scheduleSessionTimeout;
8
+ private createSessionObject;
9
+ private spawnProcess;
10
+ private setupEventHandlers;
11
+ spawn(opts: SpawnOptions, onData: (session: PTYSession, data: string) => void, onExit: (session: PTYSession, exitCode: number | null) => void): PTYSessionInfo;
12
+ kill(id: string, cleanup?: boolean): boolean;
13
+ private clearAllSessionsInternal;
14
+ clearAllSessions(): void;
15
+ cleanupBySession(parentSessionId: string): void;
16
+ getSession(id: string): PTYSession | null;
17
+ listSessions(): PTYSession[];
18
+ toInfo(session: PTYSession): PTYSessionInfo;
19
+ }
20
+ //# sourceMappingURL=session-lifecycle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-lifecycle.d.ts","sourceRoot":"","sources":["../../../../src/plugin/pty/session-lifecycle.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAW1E,qBAAa,uBAAuB;IAClC,OAAO,CAAC,QAAQ,CAAqC;IACrD,OAAO,CAAC,eAAe,CAAwD;IAE/E,OAAO,CAAC,uBAAuB;IAQ/B,OAAO,CAAC,mBAAmB;IAU3B,OAAO,CAAC,sBAAsB;IAyB9B,OAAO,CAAC,mBAAmB;IA8B3B,OAAO,CAAC,YAAY;IAapB,OAAO,CAAC,kBAAkB;IA2B1B,KAAK,CACH,IAAI,EAAE,YAAY,EAClB,MAAM,EAAE,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,EACnD,MAAM,EAAE,CAAC,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,GAC7D,cAAc;IASjB,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,GAAE,OAAe,GAAG,OAAO;IAyBnD,OAAO,CAAC,wBAAwB;IAMhC,gBAAgB,IAAI,IAAI;IAIxB,gBAAgB,CAAC,eAAe,EAAE,MAAM,GAAG,IAAI;IAQ/C,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;IAIzC,YAAY,IAAI,UAAU,EAAE;IAI5B,MAAM,CAAC,OAAO,EAAE,UAAU,GAAG,cAAc;CAmB5C"}
@@ -0,0 +1,177 @@
1
+ import { spawn } from 'bun-pty';
2
+ import { DEFAULT_TERMINAL_COLS, DEFAULT_TERMINAL_ROWS } from "../constants.js";
3
+ import { RingBuffer } from "./buffer.js";
4
+ const SESSION_ID_BYTE_LENGTH = 4;
5
+ function generateId() {
6
+ const hex = Array.from(crypto.getRandomValues(new Uint8Array(SESSION_ID_BYTE_LENGTH)))
7
+ .map((b) => b.toString(16).padStart(2, '0'))
8
+ .join('');
9
+ return `pty_${hex}`;
10
+ }
11
+ export class SessionLifecycleManager {
12
+ sessions = new Map();
13
+ sessionTimeouts = new Map();
14
+ normalizeTimeoutSeconds(timeoutSeconds) {
15
+ if (!Number.isInteger(timeoutSeconds) || timeoutSeconds <= 0) {
16
+ throw new Error('timeoutSeconds must be a positive integer in seconds');
17
+ }
18
+ return timeoutSeconds;
19
+ }
20
+ clearSessionTimeout(id) {
21
+ const timeoutHandle = this.sessionTimeouts.get(id);
22
+ if (timeoutHandle === undefined) {
23
+ return;
24
+ }
25
+ clearTimeout(timeoutHandle);
26
+ this.sessionTimeouts.delete(id);
27
+ }
28
+ scheduleSessionTimeout(session) {
29
+ const timeoutMs = session.timeoutSeconds * 1000;
30
+ const timeoutHandle = setTimeout(() => {
31
+ this.sessionTimeouts.delete(session.id);
32
+ const currentSession = this.sessions.get(session.id);
33
+ if (currentSession?.status !== 'running') {
34
+ return;
35
+ }
36
+ // Persist the timeout reason before reusing the regular kill flow.
37
+ currentSession.timedOut = true;
38
+ currentSession.status = 'killing';
39
+ try {
40
+ currentSession.process?.kill();
41
+ }
42
+ catch {
43
+ // Ignore kill errors
44
+ }
45
+ }, timeoutMs);
46
+ this.sessionTimeouts.set(session.id, timeoutHandle);
47
+ }
48
+ createSessionObject(opts) {
49
+ const id = generateId();
50
+ const args = opts.args ?? [];
51
+ const workdir = opts.workdir ?? process.cwd();
52
+ const timeoutSeconds = this.normalizeTimeoutSeconds(opts.timeoutSeconds);
53
+ const title = opts.title ?? (`${opts.command} ${args.join(' ')}`.trim() || `Terminal ${id.slice(-4)}`);
54
+ const buffer = new RingBuffer();
55
+ return {
56
+ id,
57
+ title,
58
+ description: opts.description,
59
+ command: opts.command,
60
+ args,
61
+ workdir,
62
+ env: opts.env,
63
+ status: 'running',
64
+ pid: 0, // will be set after spawn
65
+ createdAt: new Date(),
66
+ parentSessionId: opts.parentSessionId,
67
+ parentAgent: opts.parentAgent,
68
+ notifyOnExit: opts.notifyOnExit ?? false,
69
+ timeoutSeconds,
70
+ timedOut: false,
71
+ buffer,
72
+ process: null, // will be set
73
+ };
74
+ }
75
+ spawnProcess(session) {
76
+ const env = { ...process.env, ...session.env };
77
+ const ptyProcess = spawn(session.command, session.args, {
78
+ name: 'xterm-256color',
79
+ cols: DEFAULT_TERMINAL_COLS,
80
+ rows: DEFAULT_TERMINAL_ROWS,
81
+ cwd: session.workdir,
82
+ env,
83
+ });
84
+ session.process = ptyProcess;
85
+ session.pid = ptyProcess.pid;
86
+ }
87
+ setupEventHandlers(session, onData, onExit) {
88
+ session.process?.onData((data) => {
89
+ session.buffer.append(data);
90
+ onData(session, data);
91
+ });
92
+ session.process?.onExit(({ exitCode, signal }) => {
93
+ this.clearSessionTimeout(session.id);
94
+ // Flush any remaining incomplete line in the buffer
95
+ session.buffer.flush();
96
+ if (session.status === 'killing') {
97
+ session.status = 'killed';
98
+ }
99
+ else {
100
+ session.status = 'exited';
101
+ }
102
+ session.exitCode = exitCode;
103
+ session.exitSignal = signal;
104
+ onExit(session, exitCode);
105
+ });
106
+ }
107
+ spawn(opts, onData, onExit) {
108
+ const session = this.createSessionObject(opts);
109
+ this.spawnProcess(session);
110
+ this.setupEventHandlers(session, onData, onExit);
111
+ this.sessions.set(session.id, session);
112
+ this.scheduleSessionTimeout(session);
113
+ return this.toInfo(session);
114
+ }
115
+ kill(id, cleanup = false) {
116
+ const session = this.sessions.get(id);
117
+ if (!session) {
118
+ return false;
119
+ }
120
+ this.clearSessionTimeout(id);
121
+ if (session.status === 'running') {
122
+ session.status = 'killing';
123
+ try {
124
+ session.process?.kill();
125
+ }
126
+ catch {
127
+ // Ignore kill errors
128
+ }
129
+ }
130
+ if (cleanup) {
131
+ session.buffer.clear();
132
+ this.sessions.delete(id);
133
+ }
134
+ return true;
135
+ }
136
+ clearAllSessionsInternal() {
137
+ for (const id of [...this.sessions.keys()]) {
138
+ this.kill(id, true);
139
+ }
140
+ }
141
+ clearAllSessions() {
142
+ this.clearAllSessionsInternal();
143
+ }
144
+ cleanupBySession(parentSessionId) {
145
+ for (const [id, session] of this.sessions) {
146
+ if (session.parentSessionId === parentSessionId) {
147
+ this.kill(id, true);
148
+ }
149
+ }
150
+ }
151
+ getSession(id) {
152
+ return this.sessions.get(id) || null;
153
+ }
154
+ listSessions() {
155
+ return Array.from(this.sessions.values());
156
+ }
157
+ toInfo(session) {
158
+ return {
159
+ id: session.id,
160
+ title: session.title,
161
+ description: session.description,
162
+ command: session.command,
163
+ args: session.args,
164
+ workdir: session.workdir,
165
+ status: session.status,
166
+ notifyOnExit: session.notifyOnExit,
167
+ timeoutSeconds: session.timeoutSeconds,
168
+ timedOut: session.timedOut,
169
+ exitCode: session.exitCode,
170
+ exitSignal: session.exitSignal,
171
+ pid: session.pid,
172
+ createdAt: session.createdAt.toISOString(),
173
+ lineCount: session.buffer.length,
174
+ };
175
+ }
176
+ }
177
+ //# sourceMappingURL=session-lifecycle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-lifecycle.js","sourceRoot":"","sources":["../../../../src/plugin/pty/session-lifecycle.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export declare const ptyKill: {
2
+ description: string;
3
+ args: {
4
+ id: import("zod").ZodString;
5
+ cleanup: import("zod").ZodOptional<import("zod").ZodBoolean>;
6
+ };
7
+ execute(args: {
8
+ id: string;
9
+ cleanup?: boolean | undefined;
10
+ }, context: import("@opencode-ai/plugin").ToolContext): Promise<string>;
11
+ };
12
+ //# sourceMappingURL=kill.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kill.d.ts","sourceRoot":"","sources":["../../../../../src/plugin/pty/tools/kill.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,OAAO;;;;;;;;;;CAmClB,CAAA"}