tinky-termcap 0.1.0 → 1.0.1
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/package.json +6 -2
- package/lib/TermcapContext.d.ts +0 -62
- package/lib/TermcapContext.d.ts.map +0 -1
- package/lib/TermcapContext.js +0 -103
- package/lib/TermcapContext.js.map +0 -1
- package/lib/detect.d.ts +0 -38
- package/lib/detect.d.ts.map +0 -1
- package/lib/detect.js +0 -243
- package/lib/detect.js.map +0 -1
- package/lib/index.d.ts.map +0 -1
- package/lib/index.js.map +0 -1
- package/lib/utils/detect.d.ts +0 -33
- package/lib/utils/detect.js +0 -233
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "tinky-termcap",
|
|
3
|
-
"version": "0.1
|
|
3
|
+
"version": "1.0.1",
|
|
4
4
|
"description": "Terminal capability detection for Tinky - React hooks for Kitty protocol, background color, terminal name detection",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"terminal",
|
|
@@ -44,10 +44,13 @@
|
|
|
44
44
|
"@commitlint/cli": "^20.3.0",
|
|
45
45
|
"@commitlint/config-conventional": "^20.3.0",
|
|
46
46
|
"@semantic-release/changelog": "^6.0.3",
|
|
47
|
+
"@semantic-release/commit-analyzer": "^13.0.1",
|
|
47
48
|
"@semantic-release/git": "^10.0.1",
|
|
48
|
-
"@semantic-release/github": "^12.0.
|
|
49
|
+
"@semantic-release/github": "^12.0.2",
|
|
49
50
|
"@semantic-release/npm": "^13.1.3",
|
|
51
|
+
"@semantic-release/release-notes-generator": "^14.1.0",
|
|
50
52
|
"@types/bun": "^1.3.6",
|
|
53
|
+
"conventional-changelog-conventionalcommits": "^9.1.0",
|
|
51
54
|
"@types/react": "^19.2.8",
|
|
52
55
|
"@types/react-dom": "^19.2.3",
|
|
53
56
|
"eslint": "^9.39.2",
|
|
@@ -57,6 +60,7 @@
|
|
|
57
60
|
"lint-staged": "^16.2.7",
|
|
58
61
|
"prettier": "^3.7.4",
|
|
59
62
|
"react": "^19.2.3",
|
|
63
|
+
"semantic-release": "^25.0.2",
|
|
60
64
|
"react-dom": "^19.2.3",
|
|
61
65
|
"typedoc": "^0.28.16",
|
|
62
66
|
"typedoc-plugin-markdown": "^4.9.0",
|
package/lib/TermcapContext.d.ts
DELETED
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright 2025 Google LLC
|
|
4
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
-
*/
|
|
6
|
-
import type React from "react";
|
|
7
|
-
import { type TermcapInfo } from "./detect.js";
|
|
8
|
-
/**
|
|
9
|
-
* Hook to access terminal capability information.
|
|
10
|
-
*
|
|
11
|
-
* Must be used within a `TermcapProvider`.
|
|
12
|
-
*
|
|
13
|
-
* @returns Terminal capability information
|
|
14
|
-
* @throws If used outside of TermcapProvider
|
|
15
|
-
*
|
|
16
|
-
* @example
|
|
17
|
-
* ```tsx
|
|
18
|
-
* function MyComponent() {
|
|
19
|
-
* const { isReady, backgroundColor, kittyProtocol } = useTermcap();
|
|
20
|
-
*
|
|
21
|
-
* if (!isReady) return <Text>Detecting terminal...</Text>;
|
|
22
|
-
*
|
|
23
|
-
* return (
|
|
24
|
-
* <Box>
|
|
25
|
-
* <Text>Background: {backgroundColor ?? 'unknown'}</Text>
|
|
26
|
-
* <Text>Kitty: {kittyProtocol ? 'yes' : 'no'}</Text>
|
|
27
|
-
* </Box>
|
|
28
|
-
* );
|
|
29
|
-
* }
|
|
30
|
-
* ```
|
|
31
|
-
*/
|
|
32
|
-
export declare function useTermcap(): TermcapInfo;
|
|
33
|
-
/**
|
|
34
|
-
* Props for TermcapProvider.
|
|
35
|
-
*/
|
|
36
|
-
export interface TermcapProviderProps {
|
|
37
|
-
/** Child components */
|
|
38
|
-
children: React.ReactNode;
|
|
39
|
-
/** Detection timeout in milliseconds (default: 1000) */
|
|
40
|
-
timeout?: number;
|
|
41
|
-
/** Skip detection and use provided capabilities (for testing) */
|
|
42
|
-
initialCapabilities?: TermcapInfo;
|
|
43
|
-
}
|
|
44
|
-
/**
|
|
45
|
-
* Provider component that detects and provides terminal capabilities.
|
|
46
|
-
*
|
|
47
|
-
* Performs capability detection on mount and provides results to children
|
|
48
|
-
* via the `useTermcap` hook.
|
|
49
|
-
*
|
|
50
|
-
* @example
|
|
51
|
-
* ```tsx
|
|
52
|
-
* function App() {
|
|
53
|
-
* return (
|
|
54
|
-
* <TermcapProvider>
|
|
55
|
-
* <MyTerminalApp />
|
|
56
|
-
* </TermcapProvider>
|
|
57
|
-
* );
|
|
58
|
-
* }
|
|
59
|
-
* ```
|
|
60
|
-
*/
|
|
61
|
-
export declare function TermcapProvider({ children, timeout, initialCapabilities, }: TermcapProviderProps): React.ReactElement;
|
|
62
|
-
export type { TermcapInfo };
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"TermcapContext.d.ts","sourceRoot":"","sources":["../src/TermcapContext.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,EAEL,KAAK,WAAW,EAEjB,MAAM,aAAa,CAAC;AAerB;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,UAAU,IAAI,WAAW,CAMxC;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,uBAAuB;IACvB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,wDAAwD;IACxD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,iEAAiE;IACjE,mBAAmB,CAAC,EAAE,WAAW,CAAC;CACnC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,eAAe,CAAC,EAC9B,QAAQ,EACR,OAAmC,EACnC,mBAAmB,GACpB,EAAE,oBAAoB,GAAG,KAAK,CAAC,YAAY,CA6B3C;AAED,YAAY,EAAE,WAAW,EAAE,CAAC"}
|
package/lib/TermcapContext.js
DELETED
|
@@ -1,103 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __read = (this && this.__read) || function (o, n) {
|
|
3
|
-
var m = typeof Symbol === "function" && o[Symbol.iterator];
|
|
4
|
-
if (!m) return o;
|
|
5
|
-
var i = m.call(o), r, ar = [], e;
|
|
6
|
-
try {
|
|
7
|
-
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
|
|
8
|
-
}
|
|
9
|
-
catch (error) { e = { error: error }; }
|
|
10
|
-
finally {
|
|
11
|
-
try {
|
|
12
|
-
if (r && !r.done && (m = i["return"])) m.call(i);
|
|
13
|
-
}
|
|
14
|
-
finally { if (e) throw e.error; }
|
|
15
|
-
}
|
|
16
|
-
return ar;
|
|
17
|
-
};
|
|
18
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
|
-
exports.useTermcap = useTermcap;
|
|
20
|
-
exports.TermcapProvider = TermcapProvider;
|
|
21
|
-
var jsx_runtime_1 = require("react/jsx-runtime");
|
|
22
|
-
var react_1 = require("react");
|
|
23
|
-
var detect_js_1 = require("./detect.js");
|
|
24
|
-
/**
|
|
25
|
-
* Default termcap info before detection completes.
|
|
26
|
-
*/
|
|
27
|
-
var defaultTermcapInfo = {
|
|
28
|
-
isReady: false,
|
|
29
|
-
backgroundColor: undefined,
|
|
30
|
-
terminalName: undefined,
|
|
31
|
-
kittyProtocol: false,
|
|
32
|
-
modifyOtherKeys: false,
|
|
33
|
-
};
|
|
34
|
-
var TermcapContext = (0, react_1.createContext)(undefined);
|
|
35
|
-
/**
|
|
36
|
-
* Hook to access terminal capability information.
|
|
37
|
-
*
|
|
38
|
-
* Must be used within a `TermcapProvider`.
|
|
39
|
-
*
|
|
40
|
-
* @returns Terminal capability information
|
|
41
|
-
* @throws If used outside of TermcapProvider
|
|
42
|
-
*
|
|
43
|
-
* @example
|
|
44
|
-
* ```tsx
|
|
45
|
-
* function MyComponent() {
|
|
46
|
-
* const { isReady, backgroundColor, kittyProtocol } = useTermcap();
|
|
47
|
-
*
|
|
48
|
-
* if (!isReady) return <Text>Detecting terminal...</Text>;
|
|
49
|
-
*
|
|
50
|
-
* return (
|
|
51
|
-
* <Box>
|
|
52
|
-
* <Text>Background: {backgroundColor ?? 'unknown'}</Text>
|
|
53
|
-
* <Text>Kitty: {kittyProtocol ? 'yes' : 'no'}</Text>
|
|
54
|
-
* </Box>
|
|
55
|
-
* );
|
|
56
|
-
* }
|
|
57
|
-
* ```
|
|
58
|
-
*/
|
|
59
|
-
function useTermcap() {
|
|
60
|
-
var context = (0, react_1.useContext)(TermcapContext);
|
|
61
|
-
if (!context) {
|
|
62
|
-
throw new Error("useTermcap must be used within a TermcapProvider");
|
|
63
|
-
}
|
|
64
|
-
return context;
|
|
65
|
-
}
|
|
66
|
-
/**
|
|
67
|
-
* Provider component that detects and provides terminal capabilities.
|
|
68
|
-
*
|
|
69
|
-
* Performs capability detection on mount and provides results to children
|
|
70
|
-
* via the `useTermcap` hook.
|
|
71
|
-
*
|
|
72
|
-
* @example
|
|
73
|
-
* ```tsx
|
|
74
|
-
* function App() {
|
|
75
|
-
* return (
|
|
76
|
-
* <TermcapProvider>
|
|
77
|
-
* <MyTerminalApp />
|
|
78
|
-
* </TermcapProvider>
|
|
79
|
-
* );
|
|
80
|
-
* }
|
|
81
|
-
* ```
|
|
82
|
-
*/
|
|
83
|
-
function TermcapProvider(_a) {
|
|
84
|
-
var children = _a.children, _b = _a.timeout, timeout = _b === void 0 ? detect_js_1.DEFAULT_DETECTION_TIMEOUT : _b, initialCapabilities = _a.initialCapabilities;
|
|
85
|
-
var _c = __read((0, react_1.useState)(initialCapabilities !== null && initialCapabilities !== void 0 ? initialCapabilities : defaultTermcapInfo), 2), capabilities = _c[0], setCapabilities = _c[1];
|
|
86
|
-
(0, react_1.useEffect)(function () {
|
|
87
|
-
// Skip detection if initial capabilities provided
|
|
88
|
-
if (initialCapabilities) {
|
|
89
|
-
return;
|
|
90
|
-
}
|
|
91
|
-
var mounted = true;
|
|
92
|
-
(0, detect_js_1.detectTerminalCapabilities)(timeout).then(function (result) {
|
|
93
|
-
if (mounted) {
|
|
94
|
-
setCapabilities(result);
|
|
95
|
-
}
|
|
96
|
-
});
|
|
97
|
-
return function () {
|
|
98
|
-
mounted = false;
|
|
99
|
-
};
|
|
100
|
-
}, [timeout, initialCapabilities]);
|
|
101
|
-
var value = (0, react_1.useMemo)(function () { return capabilities; }, [capabilities]);
|
|
102
|
-
return ((0, jsx_runtime_1.jsx)(TermcapContext.Provider, { value: value, children: children }));
|
|
103
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"TermcapContext.js","sourceRoot":"","sources":["../src/TermcapContext.tsx"],"names":[],"mappings":";AAOA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAChF,OAAO,EACL,0BAA0B,EAE1B,yBAAyB,GAC1B,MAAM,aAAa,CAAC;AAErB;;GAEG;AACH,MAAM,kBAAkB,GAAgB;IACtC,OAAO,EAAE,KAAK;IACd,eAAe,EAAE,SAAS;IAC1B,YAAY,EAAE,SAAS;IACvB,aAAa,EAAE,KAAK;IACpB,eAAe,EAAE,KAAK;CACvB,CAAC;AAEF,MAAM,cAAc,GAAG,aAAa,CAA0B,SAAS,CAAC,CAAC;AAEzE;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,UAAU,UAAU;IACxB,MAAM,OAAO,GAAG,UAAU,CAAC,cAAc,CAAC,CAAC;IAC3C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACtE,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAcD;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,eAAe,CAAC,EAC9B,QAAQ,EACR,OAAO,GAAG,yBAAyB,EACnC,mBAAmB,GACE;IACrB,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAC9C,mBAAmB,IAAI,kBAAkB,CAC1C,CAAC;IAEF,SAAS,CAAC,GAAG,EAAE;QACb,kDAAkD;QAClD,IAAI,mBAAmB,EAAE,CAAC;YACxB,OAAO;QACT,CAAC;QAED,IAAI,OAAO,GAAG,IAAI,CAAC;QAEnB,0BAA0B,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;YAClD,IAAI,OAAO,EAAE,CAAC;gBACZ,eAAe,CAAC,MAAM,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,OAAO,GAAG,EAAE;YACV,OAAO,GAAG,KAAK,CAAC;QAClB,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,OAAO,EAAE,mBAAmB,CAAC,CAAC,CAAC;IAEnC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,YAAY,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;IAE1D,OAAO,CACL,KAAC,cAAc,CAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,YAAG,QAAQ,GAA2B,CAC5E,CAAC;AACJ,CAAC"}
|
package/lib/detect.d.ts
DELETED
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright 2025 Google LLC
|
|
4
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
-
*/
|
|
6
|
-
/**
|
|
7
|
-
* Detected terminal capabilities.
|
|
8
|
-
*/
|
|
9
|
-
export interface TermcapInfo {
|
|
10
|
-
/** Whether detection is complete */
|
|
11
|
-
isReady: boolean;
|
|
12
|
-
/** Terminal background color in #rrggbb format, or undefined if not detected */
|
|
13
|
-
backgroundColor: string | undefined;
|
|
14
|
-
/** Terminal name/version string, or undefined if not detected */
|
|
15
|
-
terminalName: string | undefined;
|
|
16
|
-
/** Whether Kitty keyboard protocol is supported */
|
|
17
|
-
kittyProtocol: boolean;
|
|
18
|
-
/** Whether modifyOtherKeys mode is supported (level >= 2) */
|
|
19
|
-
modifyOtherKeys: boolean;
|
|
20
|
-
}
|
|
21
|
-
/**
|
|
22
|
-
* Default timeout for capability detection (in milliseconds).
|
|
23
|
-
*/
|
|
24
|
-
export declare const DEFAULT_DETECTION_TIMEOUT = 1000;
|
|
25
|
-
/**
|
|
26
|
-
* Detect terminal capabilities by querying the terminal.
|
|
27
|
-
*
|
|
28
|
-
* This sends escape sequences to query terminal features and parses responses.
|
|
29
|
-
* Should only be called once at app startup.
|
|
30
|
-
*
|
|
31
|
-
* @param timeout - Maximum time to wait for responses (default: 1000ms)
|
|
32
|
-
* @returns Promise resolving to detected capabilities
|
|
33
|
-
*/
|
|
34
|
-
export declare function detectTerminalCapabilities(timeout?: number): Promise<TermcapInfo>;
|
|
35
|
-
/**
|
|
36
|
-
* For testing purposes only - reset module state.
|
|
37
|
-
*/
|
|
38
|
-
export declare function resetForTesting(): void;
|
package/lib/detect.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"detect.d.ts","sourceRoot":"","sources":["../src/detect.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAwBH;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,oCAAoC;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,gFAAgF;IAChF,eAAe,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,iEAAiE;IACjE,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,mDAAmD;IACnD,aAAa,EAAE,OAAO,CAAC;IACvB,6DAA6D;IAC7D,eAAe,EAAE,OAAO,CAAC;CAC1B;AAuBD;;GAEG;AACH,eAAO,MAAM,yBAAyB,OAAO,CAAC;AAE9C;;;;;;;;GAQG;AACH,wBAAsB,0BAA0B,CAC9C,OAAO,GAAE,MAAkC,GAC1C,OAAO,CAAC,WAAW,CAAC,CAqHtB;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,IAAI,CAEtC"}
|
package/lib/detect.js
DELETED
|
@@ -1,243 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* @license
|
|
4
|
-
* Copyright 2025 Google LLC
|
|
5
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
6
|
-
*/
|
|
7
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
8
|
-
if (k2 === undefined) k2 = k;
|
|
9
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
10
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
11
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
12
|
-
}
|
|
13
|
-
Object.defineProperty(o, k2, desc);
|
|
14
|
-
}) : (function(o, m, k, k2) {
|
|
15
|
-
if (k2 === undefined) k2 = k;
|
|
16
|
-
o[k2] = m[k];
|
|
17
|
-
}));
|
|
18
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
19
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
20
|
-
}) : function(o, v) {
|
|
21
|
-
o["default"] = v;
|
|
22
|
-
});
|
|
23
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
24
|
-
var ownKeys = function(o) {
|
|
25
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
26
|
-
var ar = [];
|
|
27
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
28
|
-
return ar;
|
|
29
|
-
};
|
|
30
|
-
return ownKeys(o);
|
|
31
|
-
};
|
|
32
|
-
return function (mod) {
|
|
33
|
-
if (mod && mod.__esModule) return mod;
|
|
34
|
-
var result = {};
|
|
35
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
36
|
-
__setModuleDefault(result, mod);
|
|
37
|
-
return result;
|
|
38
|
-
};
|
|
39
|
-
})();
|
|
40
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
41
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
42
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
43
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
44
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
45
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
46
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
47
|
-
});
|
|
48
|
-
};
|
|
49
|
-
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
50
|
-
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
|
|
51
|
-
return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
52
|
-
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
53
|
-
function step(op) {
|
|
54
|
-
if (f) throw new TypeError("Generator is already executing.");
|
|
55
|
-
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
56
|
-
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
57
|
-
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
58
|
-
switch (op[0]) {
|
|
59
|
-
case 0: case 1: t = op; break;
|
|
60
|
-
case 4: _.label++; return { value: op[1], done: false };
|
|
61
|
-
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
62
|
-
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
63
|
-
default:
|
|
64
|
-
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
65
|
-
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
66
|
-
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
67
|
-
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
68
|
-
if (t[2]) _.ops.pop();
|
|
69
|
-
_.trys.pop(); continue;
|
|
70
|
-
}
|
|
71
|
-
op = body.call(thisArg, _);
|
|
72
|
-
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
73
|
-
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
74
|
-
}
|
|
75
|
-
};
|
|
76
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
77
|
-
exports.DEFAULT_DETECTION_TIMEOUT = void 0;
|
|
78
|
-
exports.detectTerminalCapabilities = detectTerminalCapabilities;
|
|
79
|
-
exports.resetForTesting = resetForTesting;
|
|
80
|
-
var fs = __importStar(require("node:fs"));
|
|
81
|
-
// ANSI escape sequence query strings
|
|
82
|
-
var KITTY_QUERY = "\x1b[?u";
|
|
83
|
-
var OSC_11_QUERY = "\x1b]11;?\x1b\\";
|
|
84
|
-
var TERMINAL_NAME_QUERY = "\x1b[>q";
|
|
85
|
-
var DEVICE_ATTRIBUTES_QUERY = "\x1b[c";
|
|
86
|
-
var MODIFY_OTHER_KEYS_QUERY = "\x1b[>4;?m";
|
|
87
|
-
// Response regex patterns
|
|
88
|
-
// eslint-disable-next-line no-control-regex
|
|
89
|
-
var KITTY_REGEX = /\x1b\[\?(\d+)u/;
|
|
90
|
-
// eslint-disable-next-line no-control-regex
|
|
91
|
-
var TERMINAL_NAME_REGEX = /\x1bP>\|(.+?)(\x1b\\|\x07)/;
|
|
92
|
-
// eslint-disable-next-line no-control-regex
|
|
93
|
-
var DEVICE_ATTRIBUTES_REGEX = /\x1b\[\?(\d+)(;\d+)*c/;
|
|
94
|
-
// eslint-disable-next-line no-control-regex
|
|
95
|
-
var OSC_11_REGEX = /\x1b\]11;rgb:([0-9a-fA-F]{1,4})\/([0-9a-fA-F]{1,4})\/([0-9a-fA-F]{1,4})(\x1b\\|\x07)?/;
|
|
96
|
-
// eslint-disable-next-line no-control-regex
|
|
97
|
-
var MODIFY_OTHER_KEYS_REGEX = /\x1b\[>4;(\d+)m/;
|
|
98
|
-
/**
|
|
99
|
-
* Parse RGB color from hex components to #rrggbb format.
|
|
100
|
-
*/
|
|
101
|
-
function parseColor(rHex, gHex, bHex) {
|
|
102
|
-
var parseComponent = function (hex) {
|
|
103
|
-
var val = parseInt(hex, 16);
|
|
104
|
-
if (hex.length === 1)
|
|
105
|
-
return (val / 15) * 255;
|
|
106
|
-
if (hex.length === 2)
|
|
107
|
-
return val;
|
|
108
|
-
if (hex.length === 3)
|
|
109
|
-
return (val / 4095) * 255;
|
|
110
|
-
if (hex.length === 4)
|
|
111
|
-
return (val / 65535) * 255;
|
|
112
|
-
return val;
|
|
113
|
-
};
|
|
114
|
-
var r = parseComponent(rHex);
|
|
115
|
-
var g = parseComponent(gHex);
|
|
116
|
-
var b = parseComponent(bHex);
|
|
117
|
-
var toHex = function (c) { return Math.round(c).toString(16).padStart(2, "0"); };
|
|
118
|
-
return "#".concat(toHex(r)).concat(toHex(g)).concat(toHex(b));
|
|
119
|
-
}
|
|
120
|
-
/**
|
|
121
|
-
* Default timeout for capability detection (in milliseconds).
|
|
122
|
-
*/
|
|
123
|
-
exports.DEFAULT_DETECTION_TIMEOUT = 1000;
|
|
124
|
-
/**
|
|
125
|
-
* Detect terminal capabilities by querying the terminal.
|
|
126
|
-
*
|
|
127
|
-
* This sends escape sequences to query terminal features and parses responses.
|
|
128
|
-
* Should only be called once at app startup.
|
|
129
|
-
*
|
|
130
|
-
* @param timeout - Maximum time to wait for responses (default: 1000ms)
|
|
131
|
-
* @returns Promise resolving to detected capabilities
|
|
132
|
-
*/
|
|
133
|
-
function detectTerminalCapabilities() {
|
|
134
|
-
return __awaiter(this, arguments, void 0, function (timeout) {
|
|
135
|
-
var defaultResult;
|
|
136
|
-
if (timeout === void 0) { timeout = exports.DEFAULT_DETECTION_TIMEOUT; }
|
|
137
|
-
return __generator(this, function (_a) {
|
|
138
|
-
defaultResult = {
|
|
139
|
-
isReady: true,
|
|
140
|
-
backgroundColor: undefined,
|
|
141
|
-
terminalName: undefined,
|
|
142
|
-
kittyProtocol: false,
|
|
143
|
-
modifyOtherKeys: false,
|
|
144
|
-
};
|
|
145
|
-
// Skip detection if not TTY
|
|
146
|
-
if (!process.stdin.isTTY || !process.stdout.isTTY) {
|
|
147
|
-
return [2 /*return*/, defaultResult];
|
|
148
|
-
}
|
|
149
|
-
return [2 /*return*/, new Promise(function (resolve) {
|
|
150
|
-
var originalRawMode = process.stdin.isRaw;
|
|
151
|
-
if (!originalRawMode) {
|
|
152
|
-
process.stdin.setRawMode(true);
|
|
153
|
-
}
|
|
154
|
-
var buffer = "";
|
|
155
|
-
var backgroundColor;
|
|
156
|
-
var terminalName;
|
|
157
|
-
var kittyProtocol = false;
|
|
158
|
-
var modifyOtherKeys = false;
|
|
159
|
-
var bgReceived = false;
|
|
160
|
-
var kittyReceived = false;
|
|
161
|
-
var terminalNameReceived = false;
|
|
162
|
-
var modifyOtherKeysReceived = false;
|
|
163
|
-
var deviceAttributesReceived = false;
|
|
164
|
-
var timeoutId;
|
|
165
|
-
var cleanup = function () {
|
|
166
|
-
if (timeoutId) {
|
|
167
|
-
clearTimeout(timeoutId);
|
|
168
|
-
}
|
|
169
|
-
process.stdin.removeListener("data", onData);
|
|
170
|
-
if (!originalRawMode) {
|
|
171
|
-
process.stdin.setRawMode(false);
|
|
172
|
-
}
|
|
173
|
-
resolve({
|
|
174
|
-
isReady: true,
|
|
175
|
-
backgroundColor: backgroundColor,
|
|
176
|
-
terminalName: terminalName,
|
|
177
|
-
kittyProtocol: kittyProtocol,
|
|
178
|
-
modifyOtherKeys: modifyOtherKeys,
|
|
179
|
-
});
|
|
180
|
-
};
|
|
181
|
-
timeoutId = setTimeout(cleanup, timeout);
|
|
182
|
-
var onData = function (data) {
|
|
183
|
-
buffer += data.toString();
|
|
184
|
-
// Check for background color (OSC 11 response)
|
|
185
|
-
if (!bgReceived) {
|
|
186
|
-
var match = buffer.match(OSC_11_REGEX);
|
|
187
|
-
if (match) {
|
|
188
|
-
bgReceived = true;
|
|
189
|
-
backgroundColor = parseColor(match[1], match[2], match[3]);
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
// Check for Kitty keyboard protocol support
|
|
193
|
-
if (!kittyReceived && KITTY_REGEX.test(buffer)) {
|
|
194
|
-
kittyReceived = true;
|
|
195
|
-
kittyProtocol = true;
|
|
196
|
-
}
|
|
197
|
-
// Check for modifyOtherKeys support
|
|
198
|
-
if (!modifyOtherKeysReceived) {
|
|
199
|
-
var match = buffer.match(MODIFY_OTHER_KEYS_REGEX);
|
|
200
|
-
if (match) {
|
|
201
|
-
modifyOtherKeysReceived = true;
|
|
202
|
-
var level = parseInt(match[1], 10);
|
|
203
|
-
modifyOtherKeys = level >= 2;
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
// Check for terminal name/version
|
|
207
|
-
if (!terminalNameReceived) {
|
|
208
|
-
var match = buffer.match(TERMINAL_NAME_REGEX);
|
|
209
|
-
if (match) {
|
|
210
|
-
terminalNameReceived = true;
|
|
211
|
-
terminalName = match[1];
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
// Device Attributes response acts as sentinel - finish when received
|
|
215
|
-
if (!deviceAttributesReceived) {
|
|
216
|
-
var match = buffer.match(DEVICE_ATTRIBUTES_REGEX);
|
|
217
|
-
if (match) {
|
|
218
|
-
deviceAttributesReceived = true;
|
|
219
|
-
cleanup();
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
};
|
|
223
|
-
process.stdin.on("data", onData);
|
|
224
|
-
try {
|
|
225
|
-
fs.writeSync(process.stdout.fd, KITTY_QUERY +
|
|
226
|
-
OSC_11_QUERY +
|
|
227
|
-
TERMINAL_NAME_QUERY +
|
|
228
|
-
MODIFY_OTHER_KEYS_QUERY +
|
|
229
|
-
DEVICE_ATTRIBUTES_QUERY);
|
|
230
|
-
}
|
|
231
|
-
catch (_a) {
|
|
232
|
-
cleanup();
|
|
233
|
-
}
|
|
234
|
-
})];
|
|
235
|
-
});
|
|
236
|
-
});
|
|
237
|
-
}
|
|
238
|
-
/**
|
|
239
|
-
* For testing purposes only - reset module state.
|
|
240
|
-
*/
|
|
241
|
-
function resetForTesting() {
|
|
242
|
-
// No module-level state to reset in the new design
|
|
243
|
-
}
|
package/lib/detect.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"detect.js","sourceRoot":"","sources":["../src/detect.ts"],"names":[],"mappings":"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"}
|
package/lib/index.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EACL,eAAe,EACf,UAAU,EACV,KAAK,WAAW,EAChB,KAAK,oBAAoB,GAC1B,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EACL,0BAA0B,EAC1B,yBAAyB,EACzB,eAAe,GAChB,MAAM,aAAa,CAAC"}
|
package/lib/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,mBAAmB;AACnB,OAAO,EACL,eAAe,EACf,UAAU,GAGX,MAAM,qBAAqB,CAAC;AAE7B,8CAA8C;AAC9C,OAAO,EACL,0BAA0B,EAC1B,yBAAyB,EACzB,eAAe,GAChB,MAAM,aAAa,CAAC"}
|
package/lib/utils/detect.d.ts
DELETED
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Detected terminal capabilities.
|
|
3
|
-
*/
|
|
4
|
-
export interface TermcapInfo {
|
|
5
|
-
/** Whether detection is complete */
|
|
6
|
-
isReady: boolean;
|
|
7
|
-
/** Terminal background color in #rrggbb format, or undefined if not detected */
|
|
8
|
-
backgroundColor: string | undefined;
|
|
9
|
-
/** Terminal name/version string, or undefined if not detected */
|
|
10
|
-
terminalName: string | undefined;
|
|
11
|
-
/** Whether Kitty keyboard protocol is supported */
|
|
12
|
-
kittyProtocol: boolean;
|
|
13
|
-
/** Whether modifyOtherKeys mode is supported (level >= 2) */
|
|
14
|
-
modifyOtherKeys: boolean;
|
|
15
|
-
}
|
|
16
|
-
/**
|
|
17
|
-
* Default timeout for capability detection (in milliseconds).
|
|
18
|
-
*/
|
|
19
|
-
export declare const DEFAULT_DETECTION_TIMEOUT = 1000;
|
|
20
|
-
/**
|
|
21
|
-
* Detect terminal capabilities by querying the terminal.
|
|
22
|
-
*
|
|
23
|
-
* This sends escape sequences to query terminal features and parses responses.
|
|
24
|
-
* Should only be called once at app startup.
|
|
25
|
-
*
|
|
26
|
-
* @param timeout - Maximum time to wait for responses (default: 1000ms)
|
|
27
|
-
* @returns Promise resolving to detected capabilities
|
|
28
|
-
*/
|
|
29
|
-
export declare function detectTerminalCapabilities(timeout?: number): Promise<TermcapInfo>;
|
|
30
|
-
/**
|
|
31
|
-
* For testing purposes only - reset module state.
|
|
32
|
-
*/
|
|
33
|
-
export declare function resetForTesting(): void;
|
package/lib/utils/detect.js
DELETED
|
@@ -1,233 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
-
var ownKeys = function(o) {
|
|
20
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
-
var ar = [];
|
|
22
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
-
return ar;
|
|
24
|
-
};
|
|
25
|
-
return ownKeys(o);
|
|
26
|
-
};
|
|
27
|
-
return function (mod) {
|
|
28
|
-
if (mod && mod.__esModule) return mod;
|
|
29
|
-
var result = {};
|
|
30
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
-
__setModuleDefault(result, mod);
|
|
32
|
-
return result;
|
|
33
|
-
};
|
|
34
|
-
})();
|
|
35
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
36
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
37
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
38
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
39
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
40
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
41
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
42
|
-
});
|
|
43
|
-
};
|
|
44
|
-
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
45
|
-
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
|
|
46
|
-
return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
47
|
-
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
48
|
-
function step(op) {
|
|
49
|
-
if (f) throw new TypeError("Generator is already executing.");
|
|
50
|
-
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
51
|
-
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
52
|
-
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
53
|
-
switch (op[0]) {
|
|
54
|
-
case 0: case 1: t = op; break;
|
|
55
|
-
case 4: _.label++; return { value: op[1], done: false };
|
|
56
|
-
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
57
|
-
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
58
|
-
default:
|
|
59
|
-
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
60
|
-
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
61
|
-
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
62
|
-
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
63
|
-
if (t[2]) _.ops.pop();
|
|
64
|
-
_.trys.pop(); continue;
|
|
65
|
-
}
|
|
66
|
-
op = body.call(thisArg, _);
|
|
67
|
-
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
68
|
-
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
69
|
-
}
|
|
70
|
-
};
|
|
71
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
72
|
-
exports.DEFAULT_DETECTION_TIMEOUT = void 0;
|
|
73
|
-
exports.detectTerminalCapabilities = detectTerminalCapabilities;
|
|
74
|
-
exports.resetForTesting = resetForTesting;
|
|
75
|
-
/* eslint-disable no-control-regex */
|
|
76
|
-
var fs = __importStar(require("node:fs"));
|
|
77
|
-
// ANSI escape sequence query strings
|
|
78
|
-
var KITTY_QUERY = "\x1b[?u";
|
|
79
|
-
var OSC_11_QUERY = "\x1b]11;?\x1b\\";
|
|
80
|
-
var TERMINAL_NAME_QUERY = "\x1b[>q";
|
|
81
|
-
var DEVICE_ATTRIBUTES_QUERY = "\x1b[c";
|
|
82
|
-
var MODIFY_OTHER_KEYS_QUERY = "\x1b[>4;?m";
|
|
83
|
-
// Response regex patterns
|
|
84
|
-
var KITTY_REGEX = /\x1b\[\?(\d+)u/;
|
|
85
|
-
var TERMINAL_NAME_REGEX = /\x1bP>\|(.+?)(\x1b\\|\x07)/;
|
|
86
|
-
var DEVICE_ATTRIBUTES_REGEX = /\x1b\[\?(\d+)(;\d+)*c/;
|
|
87
|
-
var OSC_11_REGEX = /\x1b\]11;rgb:([0-9a-fA-F]{1,4})\/([0-9a-fA-F]{1,4})\/([0-9a-fA-F]{1,4})(\x1b\\|\x07)?/;
|
|
88
|
-
var MODIFY_OTHER_KEYS_REGEX = /\x1b\[>4;(\d+)m/;
|
|
89
|
-
/**
|
|
90
|
-
* Parse RGB color from hex components to #rrggbb format.
|
|
91
|
-
*/
|
|
92
|
-
function parseColor(rHex, gHex, bHex) {
|
|
93
|
-
var parseComponent = function (hex) {
|
|
94
|
-
var val = parseInt(hex, 16);
|
|
95
|
-
if (hex.length === 1)
|
|
96
|
-
return (val / 15) * 255;
|
|
97
|
-
if (hex.length === 2)
|
|
98
|
-
return val;
|
|
99
|
-
if (hex.length === 3)
|
|
100
|
-
return (val / 4095) * 255;
|
|
101
|
-
if (hex.length === 4)
|
|
102
|
-
return (val / 65535) * 255;
|
|
103
|
-
return val;
|
|
104
|
-
};
|
|
105
|
-
var r = parseComponent(rHex);
|
|
106
|
-
var g = parseComponent(gHex);
|
|
107
|
-
var b = parseComponent(bHex);
|
|
108
|
-
var toHex = function (c) { return Math.round(c).toString(16).padStart(2, "0"); };
|
|
109
|
-
return "#".concat(toHex(r)).concat(toHex(g)).concat(toHex(b));
|
|
110
|
-
}
|
|
111
|
-
/**
|
|
112
|
-
* Default timeout for capability detection (in milliseconds).
|
|
113
|
-
*/
|
|
114
|
-
exports.DEFAULT_DETECTION_TIMEOUT = 1000;
|
|
115
|
-
/**
|
|
116
|
-
* Detect terminal capabilities by querying the terminal.
|
|
117
|
-
*
|
|
118
|
-
* This sends escape sequences to query terminal features and parses responses.
|
|
119
|
-
* Should only be called once at app startup.
|
|
120
|
-
*
|
|
121
|
-
* @param timeout - Maximum time to wait for responses (default: 1000ms)
|
|
122
|
-
* @returns Promise resolving to detected capabilities
|
|
123
|
-
*/
|
|
124
|
-
function detectTerminalCapabilities() {
|
|
125
|
-
return __awaiter(this, arguments, void 0, function (timeout) {
|
|
126
|
-
var defaultResult;
|
|
127
|
-
if (timeout === void 0) { timeout = exports.DEFAULT_DETECTION_TIMEOUT; }
|
|
128
|
-
return __generator(this, function (_a) {
|
|
129
|
-
defaultResult = {
|
|
130
|
-
isReady: true,
|
|
131
|
-
backgroundColor: undefined,
|
|
132
|
-
terminalName: undefined,
|
|
133
|
-
kittyProtocol: false,
|
|
134
|
-
modifyOtherKeys: false,
|
|
135
|
-
};
|
|
136
|
-
// Skip detection if not TTY
|
|
137
|
-
if (!process.stdin.isTTY || !process.stdout.isTTY) {
|
|
138
|
-
return [2 /*return*/, defaultResult];
|
|
139
|
-
}
|
|
140
|
-
return [2 /*return*/, new Promise(function (resolve) {
|
|
141
|
-
var originalRawMode = process.stdin.isRaw;
|
|
142
|
-
if (!originalRawMode) {
|
|
143
|
-
process.stdin.setRawMode(true);
|
|
144
|
-
}
|
|
145
|
-
var buffer = "";
|
|
146
|
-
var backgroundColor;
|
|
147
|
-
var terminalName;
|
|
148
|
-
var kittyProtocol = false;
|
|
149
|
-
var modifyOtherKeys = false;
|
|
150
|
-
var bgReceived = false;
|
|
151
|
-
var kittyReceived = false;
|
|
152
|
-
var terminalNameReceived = false;
|
|
153
|
-
var modifyOtherKeysReceived = false;
|
|
154
|
-
var deviceAttributesReceived = false;
|
|
155
|
-
var cleanup = function () {
|
|
156
|
-
if (timeoutId) {
|
|
157
|
-
clearTimeout(timeoutId);
|
|
158
|
-
}
|
|
159
|
-
process.stdin.removeListener("data", onData);
|
|
160
|
-
if (!originalRawMode) {
|
|
161
|
-
process.stdin.setRawMode(false);
|
|
162
|
-
}
|
|
163
|
-
resolve({
|
|
164
|
-
isReady: true,
|
|
165
|
-
backgroundColor: backgroundColor,
|
|
166
|
-
terminalName: terminalName,
|
|
167
|
-
kittyProtocol: kittyProtocol,
|
|
168
|
-
modifyOtherKeys: modifyOtherKeys,
|
|
169
|
-
});
|
|
170
|
-
};
|
|
171
|
-
var timeoutId = setTimeout(cleanup, timeout);
|
|
172
|
-
var onData = function (data) {
|
|
173
|
-
buffer += data.toString();
|
|
174
|
-
// Check for background color (OSC 11 response)
|
|
175
|
-
if (!bgReceived) {
|
|
176
|
-
var match = buffer.match(OSC_11_REGEX);
|
|
177
|
-
if (match) {
|
|
178
|
-
bgReceived = true;
|
|
179
|
-
backgroundColor = parseColor(match[1], match[2], match[3]);
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
// Check for Kitty keyboard protocol support
|
|
183
|
-
if (!kittyReceived && KITTY_REGEX.test(buffer)) {
|
|
184
|
-
kittyReceived = true;
|
|
185
|
-
kittyProtocol = true;
|
|
186
|
-
}
|
|
187
|
-
// Check for modifyOtherKeys support
|
|
188
|
-
if (!modifyOtherKeysReceived) {
|
|
189
|
-
var match = buffer.match(MODIFY_OTHER_KEYS_REGEX);
|
|
190
|
-
if (match) {
|
|
191
|
-
modifyOtherKeysReceived = true;
|
|
192
|
-
var level = parseInt(match[1], 10);
|
|
193
|
-
modifyOtherKeys = level >= 2;
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
// Check for terminal name/version
|
|
197
|
-
if (!terminalNameReceived) {
|
|
198
|
-
var match = buffer.match(TERMINAL_NAME_REGEX);
|
|
199
|
-
if (match) {
|
|
200
|
-
terminalNameReceived = true;
|
|
201
|
-
terminalName = match[1];
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
// Device Attributes response acts as sentinel - finish when received
|
|
205
|
-
if (!deviceAttributesReceived) {
|
|
206
|
-
var match = buffer.match(DEVICE_ATTRIBUTES_REGEX);
|
|
207
|
-
if (match) {
|
|
208
|
-
deviceAttributesReceived = true;
|
|
209
|
-
cleanup();
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
};
|
|
213
|
-
process.stdin.on("data", onData);
|
|
214
|
-
try {
|
|
215
|
-
fs.writeSync(process.stdout.fd, KITTY_QUERY +
|
|
216
|
-
OSC_11_QUERY +
|
|
217
|
-
TERMINAL_NAME_QUERY +
|
|
218
|
-
MODIFY_OTHER_KEYS_QUERY +
|
|
219
|
-
DEVICE_ATTRIBUTES_QUERY);
|
|
220
|
-
}
|
|
221
|
-
catch (_a) {
|
|
222
|
-
cleanup();
|
|
223
|
-
}
|
|
224
|
-
})];
|
|
225
|
-
});
|
|
226
|
-
});
|
|
227
|
-
}
|
|
228
|
-
/**
|
|
229
|
-
* For testing purposes only - reset module state.
|
|
230
|
-
*/
|
|
231
|
-
function resetForTesting() {
|
|
232
|
-
// No module-level state to reset in the new design
|
|
233
|
-
}
|