@eyeauras/insight-cli 0.0.0-stage → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (174) hide show
  1. package/.cli-package-build.json +1 -0
  2. package/LICENSE +21 -0
  3. package/README.md +60 -2
  4. package/SKILL.md +58 -0
  5. package/dist/src/administration-results.d.ts +1 -0
  6. package/dist/src/administration-results.js +84 -0
  7. package/dist/src/administration.d.ts +14 -0
  8. package/dist/src/administration.js +134 -0
  9. package/dist/src/archive-contract.d.ts +6 -0
  10. package/dist/src/archive-contract.js +108 -0
  11. package/dist/src/archive.d.ts +12 -0
  12. package/dist/src/archive.js +116 -0
  13. package/dist/src/arguments.d.ts +14 -0
  14. package/dist/src/arguments.js +62 -0
  15. package/dist/src/artifacts.d.ts +17 -0
  16. package/dist/src/artifacts.js +115 -0
  17. package/dist/src/bin.d.ts +2 -0
  18. package/dist/src/bin.js +4 -0
  19. package/dist/src/cli.d.ts +10 -0
  20. package/dist/src/cli.js +419 -0
  21. package/dist/src/comment-effects.d.ts +3 -0
  22. package/dist/src/comment-effects.js +55 -0
  23. package/dist/src/contexts.d.ts +115 -0
  24. package/dist/src/contexts.js +1078 -0
  25. package/dist/src/coordinator.d.ts +41 -0
  26. package/dist/src/coordinator.js +160 -0
  27. package/dist/src/cross-results.d.ts +14 -0
  28. package/dist/src/cross-results.js +71 -0
  29. package/dist/src/cross.d.ts +3 -0
  30. package/dist/src/cross.js +43 -0
  31. package/dist/src/data-effects.d.ts +3 -0
  32. package/dist/src/data-effects.js +103 -0
  33. package/dist/src/debugger-results.d.ts +4 -0
  34. package/dist/src/debugger-results.js +151 -0
  35. package/dist/src/debugger-supervisor.d.ts +1 -0
  36. package/dist/src/debugger-supervisor.js +136 -0
  37. package/dist/src/debugger.d.ts +21 -0
  38. package/dist/src/debugger.js +267 -0
  39. package/dist/src/documentation-effects.d.ts +5 -0
  40. package/dist/src/documentation-effects.js +56 -0
  41. package/dist/src/extensions.d.ts +64 -0
  42. package/dist/src/extensions.js +289 -0
  43. package/dist/src/function-effects.d.ts +4 -0
  44. package/dist/src/function-effects.js +112 -0
  45. package/dist/src/ghidra.d.ts +50 -0
  46. package/dist/src/ghidra.js +468 -0
  47. package/dist/src/index.d.ts +2 -0
  48. package/dist/src/index.js +1 -0
  49. package/dist/src/initial-model.d.ts +6 -0
  50. package/dist/src/initial-model.js +85 -0
  51. package/dist/src/json.d.ts +2 -0
  52. package/dist/src/json.js +8 -0
  53. package/dist/src/lifecycle.d.ts +49 -0
  54. package/dist/src/lifecycle.js +154 -0
  55. package/dist/src/memory-inputs.d.ts +8 -0
  56. package/dist/src/memory-inputs.js +56 -0
  57. package/dist/src/merge.d.ts +29 -0
  58. package/dist/src/merge.js +66 -0
  59. package/dist/src/model.d.ts +74 -0
  60. package/dist/src/model.js +67 -0
  61. package/dist/src/mutation-effects.d.ts +4 -0
  62. package/dist/src/mutation-effects.js +321 -0
  63. package/dist/src/mutation-inputs.d.ts +2 -0
  64. package/dist/src/mutation-inputs.js +71 -0
  65. package/dist/src/mutations.d.ts +4 -0
  66. package/dist/src/mutations.js +53 -0
  67. package/dist/src/native-inputs.d.ts +28 -0
  68. package/dist/src/native-inputs.js +182 -0
  69. package/dist/src/native-queries.d.ts +2 -0
  70. package/dist/src/native-queries.js +29 -0
  71. package/dist/src/projects.d.ts +31 -0
  72. package/dist/src/projects.js +301 -0
  73. package/dist/src/prototype-cli.d.ts +8 -0
  74. package/dist/src/prototype-cli.js +155 -0
  75. package/dist/src/queries.d.ts +5 -0
  76. package/dist/src/queries.js +84 -0
  77. package/dist/src/query-policy.d.ts +6 -0
  78. package/dist/src/query-policy.js +72 -0
  79. package/dist/src/query-results.d.ts +2 -0
  80. package/dist/src/query-results.js +224 -0
  81. package/dist/src/research.d.ts +184 -0
  82. package/dist/src/research.js +808 -0
  83. package/dist/src/runtime-archives.d.ts +5 -0
  84. package/dist/src/runtime-archives.js +127 -0
  85. package/dist/src/runtime-catalog.d.ts +18 -0
  86. package/dist/src/runtime-catalog.js +27 -0
  87. package/dist/src/runtime-manager.d.ts +101 -0
  88. package/dist/src/runtime-manager.js +444 -0
  89. package/dist/src/runtime-selection.d.ts +13 -0
  90. package/dist/src/runtime-selection.js +25 -0
  91. package/dist/src/saved-materials.d.ts +12 -0
  92. package/dist/src/saved-materials.js +196 -0
  93. package/dist/src/scripts.d.ts +19 -0
  94. package/dist/src/scripts.js +79 -0
  95. package/dist/src/sdk-contracts.d.ts +13 -0
  96. package/dist/src/sdk-contracts.js +37 -0
  97. package/dist/src/sdk-files.d.ts +29 -0
  98. package/dist/src/sdk-files.js +249 -0
  99. package/dist/src/sdk.d.ts +4 -0
  100. package/dist/src/sdk.js +125 -0
  101. package/dist/src/server.d.ts +46 -0
  102. package/dist/src/server.js +460 -0
  103. package/dist/src/store.d.ts +33 -0
  104. package/dist/src/store.js +178 -0
  105. package/dist/src/sync-policy.d.ts +22 -0
  106. package/dist/src/sync-policy.js +123 -0
  107. package/dist/src/transport.d.ts +23 -0
  108. package/dist/src/transport.js +135 -0
  109. package/dist/src/ui-results.d.ts +2 -0
  110. package/dist/src/ui-results.js +80 -0
  111. package/dist/src/ui.d.ts +17 -0
  112. package/dist/src/ui.js +88 -0
  113. package/dist/src/utility.d.ts +14 -0
  114. package/dist/src/utility.js +43 -0
  115. package/dist/src/version-tracking.d.ts +57 -0
  116. package/dist/src/version-tracking.js +200 -0
  117. package/dist/src/workspace.d.ts +199 -0
  118. package/dist/src/workspace.js +564 -0
  119. package/package.json +47 -4
  120. package/references/InsightRepositoryProbe.java +55 -0
  121. package/references/administration.md +34 -0
  122. package/references/archive.md +32 -0
  123. package/references/artifacts.md +47 -0
  124. package/references/debugger.md +40 -0
  125. package/references/extensions-and-sync.md +124 -0
  126. package/references/managed-runtime.md +116 -0
  127. package/references/mutations.json +1424 -0
  128. package/references/native/InsightApplyDocumentation.java +48 -0
  129. package/references/native/InsightArchivePayloads.java +36 -0
  130. package/references/native/InsightBlockTransfer.java +57 -0
  131. package/references/native/InsightEmulation.java +93 -0
  132. package/references/native/InsightExtensions.java +36 -0
  133. package/references/native/InsightFunctionDatabases.java +98 -0
  134. package/references/native/InsightGuiMain.java +32 -0
  135. package/references/native/InsightHeadlessMain.java +10 -0
  136. package/references/native/InsightInitialImport.java +42 -0
  137. package/references/native/InsightInitialJournal.java +48 -0
  138. package/references/native/InsightInitialPublication.java +142 -0
  139. package/references/native/InsightKeytool.java +16 -0
  140. package/references/native/InsightNativeReceipt.java +31 -0
  141. package/references/native/InsightPlugins.java +34 -0
  142. package/references/native/InsightProjectFiles.java +92 -0
  143. package/references/native/InsightPublicationRecovery.java +63 -0
  144. package/references/native/InsightPythonWheels.java +31 -0
  145. package/references/native/InsightResearchQueries.java +188 -0
  146. package/references/native/InsightRuntimeDoctor.java +33 -0
  147. package/references/native/InsightSdkFiles.java +142 -0
  148. package/references/native/InsightSdkScript.java +31 -0
  149. package/references/native/InsightSdkTools.java +338 -0
  150. package/references/native/InsightSdkTypes.java +132 -0
  151. package/references/native/InsightServerAdministration.java +82 -0
  152. package/references/native/InsightServerInit.java +62 -0
  153. package/references/native/InsightServerMain.java +43 -0
  154. package/references/native/InsightServerProbe.java +29 -0
  155. package/references/native/InsightSnapshotFields.java +68 -0
  156. package/references/native/InsightSnapshotInspect.java +189 -0
  157. package/references/native/InsightSnapshotPublisher.java +123 -0
  158. package/references/native/InsightStartDebugger.java +28 -0
  159. package/references/native/InsightStopDebugger.java +20 -0
  160. package/references/native/InsightTraceInspect.java +24 -0
  161. package/references/native/InsightTraceState.java +130 -0
  162. package/references/native/InsightTraceTools.java +114 -0
  163. package/references/native/InsightVersionTracking.java +91 -0
  164. package/references/native-workflows.md +112 -0
  165. package/references/queries.json +1761 -0
  166. package/references/query-semantics.md +96 -0
  167. package/references/recovery.md +53 -0
  168. package/references/research.md +101 -0
  169. package/references/setup.md +49 -0
  170. package/runtime/GhidraMCP-7.0.0.jar +0 -0
  171. package/runtime/GhidraMCP-LICENSE +202 -0
  172. package/runtime/GhidraMCP-NOTICE +10 -0
  173. package/runtime/provenance.json +11 -0
  174. package/skills/insight-re/SKILL.md +108 -0
@@ -0,0 +1,5 @@
1
+ import type { RuntimeArtifact } from './runtime-catalog.js';
2
+ export declare function fileSha256(path: string): Promise<string>;
3
+ export declare function archiveName(name: string): string;
4
+ export declare function extractArchive(file: string, destination: string, format: 'tgz' | 'zip'): Promise<void>;
5
+ export declare function cacheArtifact(artifact: RuntimeArtifact, cache: string, fetcher: typeof fetch, signal: AbortSignal, offline?: boolean): Promise<string>;
@@ -0,0 +1,127 @@
1
+ import { createHash, randomUUID } from 'node:crypto';
2
+ import { createReadStream, createWriteStream } from 'node:fs';
3
+ import { mkdir, open, rename, rm, stat } from 'node:fs/promises';
4
+ import { dirname, join, posix } from 'node:path';
5
+ import { pipeline } from 'node:stream/promises';
6
+ import * as tar from 'tar';
7
+ import * as zip from 'yauzl';
8
+ import { fail } from './model.js';
9
+ export async function fileSha256(path) { const hash = createHash('sha256'); for await (const chunk of createReadStream(path))
10
+ hash.update(chunk); return hash.digest('hex'); }
11
+ export function archiveName(name) {
12
+ if (!name || name.includes('\\') || name.includes('\0') || name.startsWith('/') || /^[a-zA-Z]:/.test(name) || name.split('/').includes('..'))
13
+ fail('invalid', 'Runtime archive contains an unsafe path.');
14
+ return name.replace(/^(\.\/)+/, '');
15
+ }
16
+ export async function extractArchive(file, destination, format) {
17
+ await mkdir(destination, { recursive: true, mode: 0o700 });
18
+ let count = 0, bytes = 0;
19
+ const bound = (name, size) => { archiveName(name); if (++count > 100000 || !Number.isSafeInteger(size) || size < 0 || (bytes += size) > 8 * 1024 ** 3)
20
+ fail('limit', 'Runtime archive exceeds extraction bounds.'); };
21
+ if (format === 'tgz') {
22
+ let unsafe;
23
+ await tar.t({ file, strict: true, filter: (path, entry) => {
24
+ try {
25
+ if (!('type' in entry))
26
+ fail('invalid', 'Unsupported runtime archive metadata.');
27
+ bound(path, entry.size);
28
+ if (!['File', 'Directory', 'SymbolicLink', 'Link', 'OldFile', 'ContiguousFile'].includes(entry.type))
29
+ fail('invalid', 'Unsupported runtime archive entry.');
30
+ if (entry.type === 'SymbolicLink' || entry.type === 'Link') {
31
+ const target = entry.linkpath;
32
+ if (typeof target !== 'string')
33
+ fail('invalid', 'Runtime archive link omitted its target.');
34
+ if (target.startsWith('/') || target.includes('\\') || /^[a-zA-Z]:/.test(target))
35
+ fail('invalid', 'Runtime archive link escapes extraction storage.');
36
+ const joined = posix.normalize(entry.type === 'Link' ? target : posix.join(posix.dirname(path), target));
37
+ archiveName(joined);
38
+ }
39
+ return true;
40
+ }
41
+ catch (error) {
42
+ unsafe ??= error;
43
+ return false;
44
+ }
45
+ } });
46
+ if (unsafe)
47
+ throw unsafe;
48
+ await tar.x({ file, cwd: destination, strict: true, preserveOwner: false, noChmod: false });
49
+ return;
50
+ }
51
+ const archive = await new Promise((ok, bad) => zip.open(file, { lazyEntries: true, strictFileNames: true }, (e, z) => e ? bad(e) : ok(z)));
52
+ await new Promise((ok, bad) => {
53
+ const failed = (e) => { archive.close(); bad(e); };
54
+ archive.on('error', failed);
55
+ archive.on('end', ok);
56
+ archive.on('entry', (entry) => {
57
+ void (async () => {
58
+ bound(entry.fileName, entry.uncompressedSize);
59
+ const mode = entry.externalFileAttributes >>> 16, type = mode & 0o170000;
60
+ if (type && type !== 0o100000 && type !== 0o040000)
61
+ fail('invalid', 'Runtime zip may contain only files and directories.');
62
+ const path = join(destination, entry.fileName);
63
+ if (entry.fileName.endsWith('/'))
64
+ await mkdir(path, { recursive: true, mode: 0o700 });
65
+ else {
66
+ await mkdir(dirname(path), { recursive: true, mode: 0o700 });
67
+ const stream = await new Promise((ok, bad) => archive.openReadStream(entry, (e, s) => e ? bad(e) : ok(s)));
68
+ await pipeline(stream, createWriteStream(path, { flags: 'wx', mode: mode & 0o111 ? 0o755 : 0o644 }));
69
+ }
70
+ archive.readEntry();
71
+ })().catch(failed);
72
+ });
73
+ archive.readEntry();
74
+ });
75
+ }
76
+ export async function cacheArtifact(artifact, cache, fetcher, signal, offline = false) {
77
+ await mkdir(cache, { recursive: true, mode: 0o700 });
78
+ const path = join(cache, artifact.sha256 + '.' + artifact.format);
79
+ try {
80
+ if ((await stat(path)).isFile() && await fileSha256(path) === artifact.sha256)
81
+ return path;
82
+ fail('binding', 'Cached runtime archive failed its SHA256 check; remove the corrupt cache entry before retrying.');
83
+ }
84
+ catch (error) {
85
+ if (error.code !== 'ENOENT')
86
+ throw error;
87
+ }
88
+ if (offline)
89
+ fail('configuration', 'Required runtime archive is not cached; run ghidra download before using --offline.', { artifact: artifact.name, sha256: artifact.sha256 });
90
+ const temporary = path + '.partial-' + randomUUID();
91
+ try {
92
+ let headers = {};
93
+ if (artifact.url.startsWith('https://ghcr.io/v2/homebrew/core/ghidra/')) {
94
+ const response = await fetcher('https://ghcr.io/token?service=ghcr.io&scope=repository:homebrew/core/ghidra:pull', { signal, redirect: 'error' });
95
+ if (!response.ok)
96
+ fail('download', 'Anonymous runtime registry authorization failed.');
97
+ const value = await response.json();
98
+ if (!value.token || value.token.length > 8192)
99
+ fail('download', 'Invalid anonymous runtime registry token.');
100
+ headers = { Authorization: 'Bearer ' + value.token };
101
+ }
102
+ const response = await fetcher(artifact.url, { signal, headers });
103
+ if (!response.ok || !response.body)
104
+ fail('download', 'Pinned runtime download failed.', { artifact: artifact.name, status: response.status });
105
+ let size = 0;
106
+ const hash = createHash('sha256'), handle = await open(temporary, 'wx', 0o600);
107
+ try {
108
+ for await (const chunk of response.body) {
109
+ if ((size += chunk.byteLength) > 2 * 1024 ** 3)
110
+ fail('limit', 'Runtime download exceeds two GiB.');
111
+ hash.update(chunk);
112
+ await handle.writeFile(chunk);
113
+ }
114
+ await handle.sync();
115
+ }
116
+ finally {
117
+ await handle.close();
118
+ }
119
+ if (hash.digest('hex') !== artifact.sha256)
120
+ fail('binding', 'Downloaded runtime archive failed its pinned SHA256 check.');
121
+ await rename(temporary, path);
122
+ return path;
123
+ }
124
+ finally {
125
+ await rm(temporary, { force: true });
126
+ }
127
+ }
@@ -0,0 +1,18 @@
1
+ export interface RuntimeArtifact {
2
+ name: string;
3
+ url: string;
4
+ sha256: string;
5
+ format: 'zip' | 'tgz';
6
+ root: string;
7
+ license: string;
8
+ }
9
+ export declare const ghidraArchive: RuntimeArtifact;
10
+ export declare function runtimeCatalog(platform?: string, arch?: string, kernel?: string): {
11
+ schema: number;
12
+ ghidraVersion: string;
13
+ javaVersion: string;
14
+ platform: string;
15
+ architecture: string;
16
+ ghidra: RuntimeArtifact;
17
+ java: RuntimeArtifact;
18
+ };
@@ -0,0 +1,27 @@
1
+ import { release } from 'node:os';
2
+ import { fail } from './model.js';
3
+ const github = 'https://github.com/';
4
+ export const ghidraArchive = { name: 'ghidra-12.1.2', url: github + 'NationalSecurityAgency/ghidra/releases/download/Ghidra_12.1.2_build/ghidra_12.1.2_PUBLIC_20260605.zip', sha256: 'b62e81a0390618466c019c60d8c2f796ced2509c4c1aea4a37644a77272cf99d', format: 'zip', root: 'ghidra_12.1.2_PUBLIC', license: 'Apache-2.0 and included third-party licenses' };
5
+ const bottles = { arm64_sonoma: '40f68357d6b62a08429c36228907c995e3449283b6d2e08ba5a4e30b53a09725', arm64_sequoia: '90aa942184fca2337ad0a123f818f37372ea642e8e69e969d45cc144a6f26fdf', arm64_tahoe: '079007d8a3a477c8d5901e6596947612d86c8641956424a2bcb71ecd798bedcc', sonoma: 'e30f8c84b64331f87f6ef1890cbdded6672bb7fcc8b674794ac93e4b3e62ad2b' };
6
+ const jdks = {
7
+ 'darwin-arm64': ['aarch64_mac', '6ebcf221c9b41507b14c098e93c6ead6440b8d9bd154f8ec666c4c73abbdb201'],
8
+ 'darwin-x64': ['x64_mac', '34180eb03e6d207c388cce3da668f6cc7cd7508c185c24782fadac2c9c0e66f9'],
9
+ 'linux-x64': ['x64_linux', '4b2220e232a97997b436ca6ab15cbf70171ecff52958a46159dfa5a8c44ca4de'],
10
+ 'win32-x64': ['x64_windows', 'd3625e7cadf23787ea540229544b6e2ab494b3b54da1801879e583e1dfee0a64'],
11
+ };
12
+ export function runtimeCatalog(platform = process.platform, arch = process.arch, kernel = release()) {
13
+ const jdk = jdks[platform + '-' + arch];
14
+ if (!jdk)
15
+ fail('configuration', 'No verified managed runtime for this OS/architecture; use an external compatible Ghidra installation.');
16
+ const windows = platform === 'win32', format = windows ? 'zip' : 'tgz', extension = windows ? 'zip' : 'tar.gz';
17
+ const java = { name: 'temurin-21.0.11+10-' + platform + '-' + arch, url: github + 'adoptium/temurin21-binaries/releases/download/jdk-21.0.11%2B10/OpenJDK21U-jdk_' + jdk[0] + '_hotspot_21.0.11_10.' + extension, sha256: jdk[1], format, root: 'jdk-21.0.11+10' + (platform === 'darwin' ? '.jdk/Contents/Home' : ''), license: 'GPL-2.0 WITH Classpath-exception-2.0; included legal notices' };
18
+ let ghidra = ghidraArchive;
19
+ if (platform === 'darwin') {
20
+ const major = Number(kernel.split('.')[0]);
21
+ if (major < 23)
22
+ fail('configuration', 'Managed macOS runtimes require macOS 14 or newer.');
23
+ const tag = arch === 'x64' ? 'sonoma' : major >= 25 ? 'arm64_tahoe' : major >= 24 ? 'arm64_sequoia' : 'arm64_sonoma', hash = bottles[tag];
24
+ ghidra = { name: 'ghidra-12.1.2-' + tag, url: 'https://ghcr.io/v2/homebrew/core/ghidra/blobs/sha256:' + hash, sha256: hash, format: 'tgz', root: 'ghidra/12.1.2/libexec', license: ghidraArchive.license };
25
+ }
26
+ return { schema: 1, ghidraVersion: '12.1.2', javaVersion: '21.0.11+10', platform, architecture: arch, ghidra, java };
27
+ }
@@ -0,0 +1,101 @@
1
+ import { type CommandContext, type CommandDefinition } from '@eyeauras/cli-factory';
2
+ export declare function runtimeWrite(path: string, value: unknown): Promise<void>;
3
+ /** Passive, conservative inventory: a reused PID blocks deletion; it never grants kill authority. */
4
+ export declare function runtimeProcesses(directory: string): Promise<Record<string, unknown>[]>;
5
+ export declare function externalGhidra(path: string): Promise<string>;
6
+ export declare class RuntimeManager {
7
+ private readonly c;
8
+ readonly directory: string;
9
+ readonly root: string;
10
+ constructor(c: CommandContext);
11
+ status(): Promise<{
12
+ missing: string[];
13
+ capabilities: {
14
+ headless: boolean;
15
+ decompiler: boolean;
16
+ gui: boolean;
17
+ debugger: {
18
+ backend: string;
19
+ requires: string;
20
+ checkedBy: string;
21
+ } | {
22
+ backend: string;
23
+ checkedBy: string;
24
+ requires?: undefined;
25
+ };
26
+ };
27
+ server: {
28
+ pid?: unknown;
29
+ mode: string;
30
+ state: string;
31
+ };
32
+ processes: Record<string, unknown>[];
33
+ installations: {
34
+ id: string;
35
+ selected: boolean;
36
+ ghidraVersion: unknown;
37
+ verifiedAt: unknown;
38
+ }[];
39
+ retainedStages: string[];
40
+ lastCheck: any;
41
+ storage: {
42
+ runtime: string;
43
+ research: string;
44
+ materials: string;
45
+ };
46
+ installation?: string | undefined;
47
+ fingerprint?: string | undefined;
48
+ state: string;
49
+ mode: string;
50
+ recommended: string;
51
+ ghidraVersion: string | undefined;
52
+ java: string | undefined;
53
+ ghidraHome: string | undefined;
54
+ }>;
55
+ download(offline?: boolean): Promise<{
56
+ state: string;
57
+ ghidraVersion: string;
58
+ javaVersion: string;
59
+ items: {
60
+ name: string;
61
+ path: string;
62
+ sha256: string;
63
+ license: string;
64
+ }[];
65
+ }>;
66
+ private archive;
67
+ private cleanupProbes;
68
+ install(o: Record<string, unknown>): Promise<{
69
+ checks: string[];
70
+ schema: 1;
71
+ mode: "managed" | "external";
72
+ id?: string;
73
+ ghidraHome: string;
74
+ java: string;
75
+ fingerprint: string;
76
+ selectedAt: string;
77
+ uninstalledAt?: string;
78
+ state: string;
79
+ }>;
80
+ uninstall(purgeCache?: boolean): Promise<{
81
+ state: string;
82
+ mode: "external" | "managed";
83
+ externalInstallationPreserved: boolean;
84
+ researchPreserved: boolean;
85
+ materialsPreserved: boolean;
86
+ cachePreserved: boolean;
87
+ }>;
88
+ private probe;
89
+ doctor(): Promise<{
90
+ state: string;
91
+ fingerprint: string;
92
+ ghidraVersion: string;
93
+ checkedAt: string;
94
+ headless: unknown;
95
+ decompiler: unknown;
96
+ server: boolean;
97
+ debugger: Record<string, unknown>;
98
+ diagnostics: string;
99
+ }>;
100
+ }
101
+ export declare function runtimeCommands(exclusive: <T>(c: CommandContext, action: () => Promise<T>, quiescent?: boolean) => Promise<T>): CommandDefinition[];