@viccy123/tapcli 1.0.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/a2ui/index.d.ts +5 -0
- package/dist/a2ui/index.d.ts.map +1 -0
- package/dist/a2ui/index.js +4 -0
- package/dist/a2ui/index.js.map +1 -0
- package/dist/a2ui/schemas.d.ts +1953 -0
- package/dist/a2ui/schemas.d.ts.map +1 -0
- package/dist/a2ui/schemas.js +107 -0
- package/dist/a2ui/schemas.js.map +1 -0
- package/dist/a2ui/surface-manager.d.ts +21 -0
- package/dist/a2ui/surface-manager.d.ts.map +1 -0
- package/dist/a2ui/surface-manager.js +71 -0
- package/dist/a2ui/surface-manager.js.map +1 -0
- package/dist/a2ui/types.d.ts +50 -0
- package/dist/a2ui/types.d.ts.map +1 -0
- package/dist/a2ui/types.js +2 -0
- package/dist/a2ui/types.js.map +1 -0
- package/dist/ai/analyzer.d.ts +19 -0
- package/dist/ai/analyzer.d.ts.map +1 -0
- package/dist/ai/analyzer.js +87 -0
- package/dist/ai/analyzer.js.map +1 -0
- package/dist/ai/index.d.ts +6 -0
- package/dist/ai/index.d.ts.map +1 -0
- package/dist/ai/index.js +4 -0
- package/dist/ai/index.js.map +1 -0
- package/dist/ai/prompts.d.ts +5 -0
- package/dist/ai/prompts.d.ts.map +1 -0
- package/dist/ai/prompts.js +81 -0
- package/dist/ai/prompts.js.map +1 -0
- package/dist/ai/ui-generator.d.ts +14 -0
- package/dist/ai/ui-generator.d.ts.map +1 -0
- package/dist/ai/ui-generator.js +172 -0
- package/dist/ai/ui-generator.js.map +1 -0
- package/dist/auth/index.d.ts +2 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +2 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/pairing.d.ts +18 -0
- package/dist/auth/pairing.d.ts.map +1 -0
- package/dist/auth/pairing.js +59 -0
- package/dist/auth/pairing.js.map +1 -0
- package/dist/config/index.d.ts +7 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +31 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/schema.d.ts +89 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +22 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +34 -0
- package/dist/index.js.map +1 -0
- package/dist/protocol/index.d.ts +3 -0
- package/dist/protocol/index.d.ts.map +1 -0
- package/dist/protocol/index.js +3 -0
- package/dist/protocol/index.js.map +1 -0
- package/dist/protocol/schemas.d.ts +77 -0
- package/dist/protocol/schemas.d.ts.map +1 -0
- package/dist/protocol/schemas.js +18 -0
- package/dist/protocol/schemas.js.map +1 -0
- package/dist/protocol/types.d.ts +74 -0
- package/dist/protocol/types.d.ts.map +1 -0
- package/dist/protocol/types.js +2 -0
- package/dist/protocol/types.js.map +1 -0
- package/dist/pty/index.d.ts +5 -0
- package/dist/pty/index.d.ts.map +1 -0
- package/dist/pty/index.js +3 -0
- package/dist/pty/index.js.map +1 -0
- package/dist/pty/session.d.ts +17 -0
- package/dist/pty/session.d.ts.map +1 -0
- package/dist/pty/session.js +71 -0
- package/dist/pty/session.js.map +1 -0
- package/dist/pty/terminal-query-interceptor.d.ts +27 -0
- package/dist/pty/terminal-query-interceptor.d.ts.map +1 -0
- package/dist/pty/terminal-query-interceptor.js +63 -0
- package/dist/pty/terminal-query-interceptor.js.map +1 -0
- package/dist/pty/types.d.ts +13 -0
- package/dist/pty/types.d.ts.map +1 -0
- package/dist/pty/types.js +2 -0
- package/dist/pty/types.js.map +1 -0
- package/dist/server.d.ts +60 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +524 -0
- package/dist/server.js.map +1 -0
- package/dist/transport/client.d.ts +26 -0
- package/dist/transport/client.d.ts.map +1 -0
- package/dist/transport/client.js +68 -0
- package/dist/transport/client.js.map +1 -0
- package/dist/transport/index.d.ts +5 -0
- package/dist/transport/index.d.ts.map +1 -0
- package/dist/transport/index.js +3 -0
- package/dist/transport/index.js.map +1 -0
- package/dist/transport/websocket.d.ts +25 -0
- package/dist/transport/websocket.d.ts.map +1 -0
- package/dist/transport/websocket.js +61 -0
- package/dist/transport/websocket.js.map +1 -0
- package/package.json +39 -0
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
export interface BaseMessage {
|
|
2
|
+
id: string;
|
|
3
|
+
type: string;
|
|
4
|
+
timestamp: number;
|
|
5
|
+
}
|
|
6
|
+
export type ClientMessage = {
|
|
7
|
+
type: 'auth';
|
|
8
|
+
token: string;
|
|
9
|
+
} | {
|
|
10
|
+
type: 'pair';
|
|
11
|
+
code: string;
|
|
12
|
+
} | {
|
|
13
|
+
type: 'start';
|
|
14
|
+
command: string;
|
|
15
|
+
cols?: number;
|
|
16
|
+
rows?: number;
|
|
17
|
+
} | {
|
|
18
|
+
type: 'input';
|
|
19
|
+
data: string;
|
|
20
|
+
} | {
|
|
21
|
+
type: 'resize';
|
|
22
|
+
cols: number;
|
|
23
|
+
rows: number;
|
|
24
|
+
} | {
|
|
25
|
+
type: 'action';
|
|
26
|
+
actionId: string;
|
|
27
|
+
data: unknown;
|
|
28
|
+
} | {
|
|
29
|
+
type: 'ping';
|
|
30
|
+
};
|
|
31
|
+
export type ServerMessage = {
|
|
32
|
+
type: 'auth_ok';
|
|
33
|
+
sessionToken: string;
|
|
34
|
+
} | {
|
|
35
|
+
type: 'pair_ok';
|
|
36
|
+
} | {
|
|
37
|
+
type: 'output';
|
|
38
|
+
seq: number;
|
|
39
|
+
data: string;
|
|
40
|
+
} | {
|
|
41
|
+
type: 'a2ui';
|
|
42
|
+
surfaceId: string;
|
|
43
|
+
payload: A2UIPayload;
|
|
44
|
+
} | {
|
|
45
|
+
type: 'a2ui_status';
|
|
46
|
+
status: 'analyzing' | 'idle';
|
|
47
|
+
} | {
|
|
48
|
+
type: 'error';
|
|
49
|
+
code: string;
|
|
50
|
+
message: string;
|
|
51
|
+
} | {
|
|
52
|
+
type: 'pong';
|
|
53
|
+
};
|
|
54
|
+
export type A2UIPayload = {
|
|
55
|
+
action: 'createSurface';
|
|
56
|
+
catalogId: string;
|
|
57
|
+
components?: A2UIComponent[];
|
|
58
|
+
} | {
|
|
59
|
+
action: 'updateComponents';
|
|
60
|
+
components: A2UIComponent[];
|
|
61
|
+
} | {
|
|
62
|
+
action: 'updateDataModel';
|
|
63
|
+
path?: string;
|
|
64
|
+
data: unknown;
|
|
65
|
+
} | {
|
|
66
|
+
action: 'deleteSurface';
|
|
67
|
+
};
|
|
68
|
+
export interface A2UIComponent {
|
|
69
|
+
readonly id: string;
|
|
70
|
+
readonly component: string;
|
|
71
|
+
readonly parentId?: string;
|
|
72
|
+
readonly properties: Record<string, unknown>;
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/protocol/types.ts"],"names":[],"mappings":"AACA,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAGD,MAAM,MAAM,aAAa,GACrB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC/B;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAChE;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC/B;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC9C;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,GACnD;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAGrB,MAAM,MAAM,aAAa,GACrB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,GACzC;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GACnB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC7C;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,WAAW,CAAA;CAAE,GACzD;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAAA;CAAE,GACrD;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAChD;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAGrB,MAAM,MAAM,WAAW,GACnB;IAAE,MAAM,EAAE,eAAe,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,aAAa,EAAE,CAAA;CAAE,GAC5E;IAAE,MAAM,EAAE,kBAAkB,CAAC;IAAC,UAAU,EAAE,aAAa,EAAE,CAAA;CAAE,GAC3D;IAAE,MAAM,EAAE,iBAAiB,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,GAC3D;IAAE,MAAM,EAAE,eAAe,CAAA;CAAE,CAAC;AAEhC,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC9C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/protocol/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { PtySession } from './session.js';
|
|
2
|
+
export type { PtySessionOptions, PtySessionEvents } from './types.js';
|
|
3
|
+
export { interceptTerminalQueries, stripTerminalQueries, processTerminalOutput, } from './terminal-query-interceptor.js';
|
|
4
|
+
export type { TerminalQueryMatch } from './terminal-query-interceptor.js';
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/pty/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,YAAY,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACtE,OAAO,EACL,wBAAwB,EACxB,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,iCAAiC,CAAC;AACzC,YAAY,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/pty/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,OAAO,EACL,wBAAwB,EACxB,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,iCAAiC,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { PtySessionOptions, PtySessionEvents } from './types.js';
|
|
2
|
+
export declare class PtySession {
|
|
3
|
+
private events;
|
|
4
|
+
readonly id: string;
|
|
5
|
+
private process;
|
|
6
|
+
private outputBuffer;
|
|
7
|
+
private maxBufferSize;
|
|
8
|
+
private currentBufferSize;
|
|
9
|
+
constructor(options: PtySessionOptions, events: PtySessionEvents);
|
|
10
|
+
private addToBuffer;
|
|
11
|
+
write(data: string | Buffer): void;
|
|
12
|
+
resize(cols: number, rows: number): void;
|
|
13
|
+
getBufferedOutput(): Buffer;
|
|
14
|
+
kill(signal?: string): void;
|
|
15
|
+
get pid(): number;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/pty/session.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAGtE,qBAAa,UAAU;IASnB,OAAO,CAAC,MAAM;IARhB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,OAAO,CAAW;IAC1B,OAAO,CAAC,YAAY,CAAgB;IACpC,OAAO,CAAC,aAAa,CAAc;IACnC,OAAO,CAAC,iBAAiB,CAAK;gBAG5B,OAAO,EAAE,iBAAiB,EAClB,MAAM,EAAE,gBAAgB;IAkClC,OAAO,CAAC,WAAW;IAmBnB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAIlC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAIxC,iBAAiB,IAAI,MAAM;IAI3B,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI;IAI3B,IAAI,GAAG,IAAI,MAAM,CAEhB;CACF"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import * as pty from 'node-pty';
|
|
2
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
3
|
+
import { processTerminalOutput } from './terminal-query-interceptor.js';
|
|
4
|
+
export class PtySession {
|
|
5
|
+
events;
|
|
6
|
+
id;
|
|
7
|
+
process;
|
|
8
|
+
outputBuffer = [];
|
|
9
|
+
maxBufferSize = 512 * 1024; // 512KB
|
|
10
|
+
currentBufferSize = 0;
|
|
11
|
+
constructor(options, events) {
|
|
12
|
+
this.events = events;
|
|
13
|
+
this.id = uuidv4();
|
|
14
|
+
const shell = options.command;
|
|
15
|
+
const args = options.args ?? [];
|
|
16
|
+
this.process = pty.spawn(shell, args, {
|
|
17
|
+
name: 'xterm-256color',
|
|
18
|
+
cols: options.cols ?? 80,
|
|
19
|
+
rows: options.rows ?? 24,
|
|
20
|
+
cwd: options.cwd ?? process.cwd(),
|
|
21
|
+
env: {
|
|
22
|
+
...process.env,
|
|
23
|
+
COLORTERM: 'truecolor',
|
|
24
|
+
...options.env,
|
|
25
|
+
},
|
|
26
|
+
});
|
|
27
|
+
this.process.onData((data) => {
|
|
28
|
+
const cleaned = processTerminalOutput(data, (response) => {
|
|
29
|
+
this.process.write(response);
|
|
30
|
+
});
|
|
31
|
+
const buffer = Buffer.from(cleaned);
|
|
32
|
+
this.addToBuffer(buffer);
|
|
33
|
+
this.events.onData(buffer);
|
|
34
|
+
});
|
|
35
|
+
this.process.onExit(({ exitCode, signal }) => {
|
|
36
|
+
// signal is 0 when process exits normally, convert to undefined
|
|
37
|
+
this.events.onExit(exitCode, signal || undefined);
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
addToBuffer(data) {
|
|
41
|
+
this.outputBuffer = [...this.outputBuffer, data];
|
|
42
|
+
this.currentBufferSize += data.length;
|
|
43
|
+
let newBuffer = this.outputBuffer;
|
|
44
|
+
let newSize = this.currentBufferSize;
|
|
45
|
+
while (newSize > this.maxBufferSize && newBuffer.length > 1) {
|
|
46
|
+
const [removed, ...rest] = newBuffer;
|
|
47
|
+
if (removed) {
|
|
48
|
+
newSize -= removed.length;
|
|
49
|
+
}
|
|
50
|
+
newBuffer = rest;
|
|
51
|
+
}
|
|
52
|
+
this.outputBuffer = newBuffer;
|
|
53
|
+
this.currentBufferSize = newSize;
|
|
54
|
+
}
|
|
55
|
+
write(data) {
|
|
56
|
+
this.process.write(typeof data === 'string' ? data : data.toString());
|
|
57
|
+
}
|
|
58
|
+
resize(cols, rows) {
|
|
59
|
+
this.process.resize(cols, rows);
|
|
60
|
+
}
|
|
61
|
+
getBufferedOutput() {
|
|
62
|
+
return Buffer.concat(this.outputBuffer);
|
|
63
|
+
}
|
|
64
|
+
kill(signal) {
|
|
65
|
+
this.process.kill(signal);
|
|
66
|
+
}
|
|
67
|
+
get pid() {
|
|
68
|
+
return this.process.pid;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/pty/session.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Terminal Query Interceptor
|
|
3
|
+
*
|
|
4
|
+
* 拦截 PTY 输出中的终端能力查询序列,立即注入响应。
|
|
5
|
+
* 消除 Crossterm 等框架因网络往返延迟导致的超时/降级渲染。
|
|
6
|
+
*
|
|
7
|
+
* 设计:无状态,不使用全局可变 RegExp。
|
|
8
|
+
* 查询序列从转发给客户端的数据中剥离,避免 xterm.dart 重复响应。
|
|
9
|
+
*/
|
|
10
|
+
export interface TerminalQueryMatch {
|
|
11
|
+
readonly query: string;
|
|
12
|
+
readonly response: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* 扫描数据中的终端查询序列,返回所有匹配的响应。
|
|
16
|
+
*/
|
|
17
|
+
export declare function interceptTerminalQueries(data: string): readonly TerminalQueryMatch[];
|
|
18
|
+
/**
|
|
19
|
+
* 从数据中剥离所有已知的终端查询序列。
|
|
20
|
+
*/
|
|
21
|
+
export declare function stripTerminalQueries(data: string): string;
|
|
22
|
+
/**
|
|
23
|
+
* 处理 PTY 输出:检测查询并通过 writeFn 写入响应。
|
|
24
|
+
* 返回剥离查询序列后的数据。
|
|
25
|
+
*/
|
|
26
|
+
export declare function processTerminalOutput(data: string, writeFn: (response: string) => void): string;
|
|
27
|
+
//# sourceMappingURL=terminal-query-interceptor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminal-query-interceptor.d.ts","sourceRoot":"","sources":["../../src/pty/terminal-query-interceptor.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAsBD;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,kBAAkB,EAAE,CAcpF;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAUzD;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,GAClC,MAAM,CAMR"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Terminal Query Interceptor
|
|
3
|
+
*
|
|
4
|
+
* 拦截 PTY 输出中的终端能力查询序列,立即注入响应。
|
|
5
|
+
* 消除 Crossterm 等框架因网络往返延迟导致的超时/降级渲染。
|
|
6
|
+
*
|
|
7
|
+
* 设计:无状态,不使用全局可变 RegExp。
|
|
8
|
+
* 查询序列从转发给客户端的数据中剥离,避免 xterm.dart 重复响应。
|
|
9
|
+
*/
|
|
10
|
+
// ESC = \x1b, CSI = \x1b[
|
|
11
|
+
// 存储 pattern source 而非 RegExp 实例,避免全局可变状态
|
|
12
|
+
const QUERY_PATTERN_DEFS = [
|
|
13
|
+
// Primary DA: \e[c or \e[0c
|
|
14
|
+
{ source: '\\x1b\\[0?c', response: '\x1b[?62;22c' },
|
|
15
|
+
// Secondary DA: \e[>c or \e[>0c
|
|
16
|
+
{ source: '\\x1b\\[>0?c', response: '\x1b[>0;0;0c' },
|
|
17
|
+
// Device Status Report: \e[5n
|
|
18
|
+
{ source: '\\x1b\\[5n', response: '\x1b[0n' },
|
|
19
|
+
// Cursor Position Report (always reports 1;1 — sufficient for capability detection)
|
|
20
|
+
{ source: '\\x1b\\[6n', response: '\x1b[1;1R' },
|
|
21
|
+
// Kitty keyboard protocol query: \e[?u → no support
|
|
22
|
+
{ source: '\\x1b\\[\\?u', response: '\x1b[?0u' },
|
|
23
|
+
];
|
|
24
|
+
/**
|
|
25
|
+
* 扫描数据中的终端查询序列,返回所有匹配的响应。
|
|
26
|
+
*/
|
|
27
|
+
export function interceptTerminalQueries(data) {
|
|
28
|
+
if (!data.includes('\x1b')) {
|
|
29
|
+
return [];
|
|
30
|
+
}
|
|
31
|
+
const matches = [];
|
|
32
|
+
for (const def of QUERY_PATTERN_DEFS) {
|
|
33
|
+
for (const m of data.matchAll(new RegExp(def.source, 'g'))) {
|
|
34
|
+
matches.push({ query: m[0], response: def.response });
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return matches;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* 从数据中剥离所有已知的终端查询序列。
|
|
41
|
+
*/
|
|
42
|
+
export function stripTerminalQueries(data) {
|
|
43
|
+
if (!data.includes('\x1b')) {
|
|
44
|
+
return data;
|
|
45
|
+
}
|
|
46
|
+
let result = data;
|
|
47
|
+
for (const def of QUERY_PATTERN_DEFS) {
|
|
48
|
+
result = result.replace(new RegExp(def.source, 'g'), '');
|
|
49
|
+
}
|
|
50
|
+
return result;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* 处理 PTY 输出:检测查询并通过 writeFn 写入响应。
|
|
54
|
+
* 返回剥离查询序列后的数据。
|
|
55
|
+
*/
|
|
56
|
+
export function processTerminalOutput(data, writeFn) {
|
|
57
|
+
const matches = interceptTerminalQueries(data);
|
|
58
|
+
for (const m of matches) {
|
|
59
|
+
writeFn(m.response);
|
|
60
|
+
}
|
|
61
|
+
return matches.length > 0 ? stripTerminalQueries(data) : data;
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=terminal-query-interceptor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminal-query-interceptor.js","sourceRoot":"","sources":["../../src/pty/terminal-query-interceptor.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAYH,0BAA0B;AAC1B,0CAA0C;AAC1C,MAAM,kBAAkB,GAA+B;IACrD,4BAA4B;IAC5B,EAAE,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,cAAc,EAAE;IACnD,gCAAgC;IAChC,EAAE,MAAM,EAAE,cAAc,EAAE,QAAQ,EAAE,cAAc,EAAE;IACpD,8BAA8B;IAC9B,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE;IAC7C,oFAAoF;IACpF,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,WAAW,EAAE;IAC/C,oDAAoD;IACpD,EAAE,MAAM,EAAE,cAAc,EAAE,QAAQ,EAAE,UAAU,EAAE;CACjD,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,wBAAwB,CAAC,IAAY;IACnD,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,OAAO,GAAyB,EAAE,CAAC;IAEzC,KAAK,MAAM,GAAG,IAAI,kBAAkB,EAAE,CAAC;QACrC,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC;YAC3D,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,MAAM,GAAG,IAAI,CAAC;IAClB,KAAK,MAAM,GAAG,IAAI,kBAAkB,EAAE,CAAC;QACrC,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;IAC3D,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CACnC,IAAY,EACZ,OAAmC;IAEnC,MAAM,OAAO,GAAG,wBAAwB,CAAC,IAAI,CAAC,CAAC;IAC/C,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IACtB,CAAC;IACD,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAChE,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface PtySessionOptions {
|
|
2
|
+
command: string;
|
|
3
|
+
args?: string[];
|
|
4
|
+
cols?: number;
|
|
5
|
+
rows?: number;
|
|
6
|
+
cwd?: string;
|
|
7
|
+
env?: Record<string, string>;
|
|
8
|
+
}
|
|
9
|
+
export interface PtySessionEvents {
|
|
10
|
+
onData: (data: Buffer) => void;
|
|
11
|
+
onExit: (code: number, signal?: number) => void;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/pty/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9B;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;CACjD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/pty/types.ts"],"names":[],"mappings":""}
|
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { type Config } from './config/index.js';
|
|
2
|
+
import type { A2UIPayload } from './protocol/types.js';
|
|
3
|
+
type DeepPartial<T> = {
|
|
4
|
+
[P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];
|
|
5
|
+
};
|
|
6
|
+
export declare class TapCLIServer {
|
|
7
|
+
private config;
|
|
8
|
+
private wsServer;
|
|
9
|
+
private pairing;
|
|
10
|
+
private surfaceManager;
|
|
11
|
+
private aiAnalyzer;
|
|
12
|
+
private uiGenerator;
|
|
13
|
+
private sessions;
|
|
14
|
+
private clientSessions;
|
|
15
|
+
private outputBuffers;
|
|
16
|
+
private outputTimers;
|
|
17
|
+
private sessionClients;
|
|
18
|
+
private surfaceSessions;
|
|
19
|
+
private pendingInputTimers;
|
|
20
|
+
private pendingFinalizeTimers;
|
|
21
|
+
private analyzingInFlight;
|
|
22
|
+
private readonly debugA2UI;
|
|
23
|
+
constructor(configOverrides?: DeepPartial<Config>);
|
|
24
|
+
private handleConnection;
|
|
25
|
+
private handleMessage;
|
|
26
|
+
private handlePair;
|
|
27
|
+
private handleAuth;
|
|
28
|
+
private handleStart;
|
|
29
|
+
private handleInput;
|
|
30
|
+
private handleResize;
|
|
31
|
+
private handleDisconnect;
|
|
32
|
+
private handleAction;
|
|
33
|
+
private cancelPendingActionTimers;
|
|
34
|
+
private dismissActiveSurface;
|
|
35
|
+
private bufferOutputForAnalysis;
|
|
36
|
+
private clearOutputBuffer;
|
|
37
|
+
private sessionHasActiveSurface;
|
|
38
|
+
private getActiveSurfaceCatalogId;
|
|
39
|
+
/**
|
|
40
|
+
* Convert user selection value to the correct PTY input bytes.
|
|
41
|
+
*
|
|
42
|
+
* CLI tools like Claude Code use terminal raw mode with interactive
|
|
43
|
+
* selectors (ink Select). They expect arrow key navigation + Enter,
|
|
44
|
+
* NOT typed numbers.
|
|
45
|
+
*
|
|
46
|
+
* - select: (N-1) Down arrows + Enter
|
|
47
|
+
* - confirm: "y" or "n" character
|
|
48
|
+
* - text: value + newline
|
|
49
|
+
*/
|
|
50
|
+
private writeActionToPty;
|
|
51
|
+
private buildPtyInput;
|
|
52
|
+
private sendA2UIStatusToSession;
|
|
53
|
+
private analyzeOutput;
|
|
54
|
+
sendA2UIToClient(clientId: string, surfaceId: string, payload: A2UIPayload): void;
|
|
55
|
+
generatePairingCode(): string;
|
|
56
|
+
getPort(): number;
|
|
57
|
+
close(): void;
|
|
58
|
+
}
|
|
59
|
+
export {};
|
|
60
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAIA,OAAO,EAAc,KAAK,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAI5D,OAAO,KAAK,EAAiB,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAWtE,KAAK,WAAW,CAAC,CAAC,IAAI;KACnB,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAChE,CAAC;AAOF,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,UAAU,CAAoB;IACtC,OAAO,CAAC,WAAW,CAAgB;IACnC,OAAO,CAAC,QAAQ,CAAsC;IACtD,OAAO,CAAC,cAAc,CAAkC;IACxD,OAAO,CAAC,aAAa,CAAkC;IACvD,OAAO,CAAC,YAAY,CAAyD;IAC7E,OAAO,CAAC,cAAc,CAAkC;IACxD,OAAO,CAAC,eAAe,CAA8C;IACrE,OAAO,CAAC,kBAAkB,CAA2D;IACrF,OAAO,CAAC,qBAAqB,CAAyD;IACtF,OAAO,CAAC,iBAAiB,CAA0B;IACnD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA4C;gBAE1D,eAAe,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC;IA6BjD,OAAO,CAAC,gBAAgB;IAIxB,OAAO,CAAC,aAAa;IAmDrB,OAAO,CAAC,UAAU;IAUlB,OAAO,CAAC,UAAU;IASlB,OAAO,CAAC,WAAW;IA4CnB,OAAO,CAAC,WAAW;IAcnB,OAAO,CAAC,YAAY;IAUpB,OAAO,CAAC,gBAAgB;IAuBxB,OAAO,CAAC,YAAY;IAgEpB,OAAO,CAAC,yBAAyB;IAkBjC,OAAO,CAAC,oBAAoB;IAmC5B,OAAO,CAAC,uBAAuB;IAyB/B,OAAO,CAAC,iBAAiB;IAazB,OAAO,CAAC,uBAAuB;IAS/B,OAAO,CAAC,yBAAyB;IAmBjC;;;;;;;;;;OAUG;IACH,OAAO,CAAC,gBAAgB;IA+GxB,OAAO,CAAC,aAAa;IA2BrB,OAAO,CAAC,uBAAuB;YASjB,aAAa;IA4D3B,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,IAAI;IAOjF,mBAAmB,IAAI,MAAM;IAI7B,OAAO,IAAI,MAAM;IAIjB,KAAK,IAAI,IAAI;CAMd"}
|