@scotthuang/agent-knock-knock 0.2.51 → 0.3.0-beta.2

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.
@@ -1,22 +1,73 @@
1
+ export type DoctorMode = "tmux" | "acpx" | "all";
2
+ export type DoctorReadiness = "ready" | "partially_ready" | "not_ready";
3
+ export type DoctorProbeCommand = "openclaw" | "tmux" | "acpx" | "codex" | "claude" | "cursor";
4
+ export type DoctorProbeStatus = "ok" | "not_found" | "not_executable" | "version_failed" | "timeout" | "malformed_output";
1
5
  export interface DoctorCommandCheck {
2
6
  command: string;
3
7
  available: boolean;
4
8
  version_supported?: boolean;
9
+ status?: DoctorProbeStatus;
10
+ }
11
+ export interface DoctorCommandProbe extends DoctorCommandCheck {
12
+ command: DoctorProbeCommand;
13
+ status: DoctorProbeStatus;
14
+ executable: string;
15
+ args: readonly string[];
16
+ found: boolean;
17
+ executable_ok: boolean;
18
+ duration_ms: number;
19
+ version?: string;
20
+ output?: string;
21
+ error?: string;
22
+ exit_code?: number | null;
23
+ signal?: NodeJS.Signals | null;
24
+ }
25
+ export interface DoctorProbeOptions {
26
+ /**
27
+ * Timeout for each command. Values above 30 seconds are clamped so a doctor
28
+ * run cannot become unbounded through configuration.
29
+ */
30
+ timeoutMs?: number;
31
+ env?: NodeJS.ProcessEnv;
32
+ cwd?: string;
33
+ executables?: Partial<Record<DoctorProbeCommand, string>>;
34
+ }
35
+ interface DoctorModeCapability {
36
+ available: boolean;
37
+ status: DoctorReadiness;
38
+ agents: string[];
39
+ requires: string[];
40
+ missing: string[];
41
+ }
42
+ interface DoctorTmuxCapability extends DoctorModeCapability {
43
+ recommended: true;
44
+ }
45
+ interface DoctorAcpxCapability extends DoctorModeCapability {
46
+ client: "acpx";
5
47
  }
6
48
  export interface DoctorCapabilitySummary {
7
49
  coreOk: boolean;
8
50
  transportOk: boolean;
9
- tmux: {
10
- available: boolean;
11
- recommended: true;
12
- agents: string[];
13
- requires: string[];
14
- };
15
- acp: {
16
- available: boolean;
17
- client: "acpx";
18
- agents: string[];
19
- requires: string[];
20
- };
51
+ mode: DoctorMode;
52
+ readiness: DoctorReadiness;
53
+ tmux: DoctorTmuxCapability;
54
+ acpx: DoctorAcpxCapability;
55
+ /**
56
+ * Backwards-compatible alias retained for existing CLI consumers.
57
+ */
58
+ acp: DoctorAcpxCapability;
21
59
  }
22
- export declare function evaluateDoctorCapabilities(checks: readonly DoctorCommandCheck[]): DoctorCapabilitySummary;
60
+ export declare const DOCTOR_PROBE_COMMANDS: readonly DoctorProbeCommand[];
61
+ /**
62
+ * Run a bounded, non-interactive version probe for one doctor dependency.
63
+ *
64
+ * This deliberately does not invoke a shell. Successful process execution is
65
+ * not enough: the output must also contain a recognizable version.
66
+ */
67
+ export declare function probeDoctorCommand(command: DoctorProbeCommand, options?: DoctorProbeOptions): DoctorCommandProbe;
68
+ /**
69
+ * Probe every external command used by the tmux and ACPX execution modes.
70
+ */
71
+ export declare function runDoctorCapabilityProbes(options?: DoctorProbeOptions, mode?: DoctorMode): DoctorCommandProbe[];
72
+ export declare function evaluateDoctorCapabilities(checks: readonly DoctorCommandCheck[], mode?: DoctorMode): DoctorCapabilitySummary;
73
+ export {};
@@ -1,29 +1,258 @@
1
- export function evaluateDoctorCapabilities(checks) {
1
+ import { spawnSync } from "node:child_process";
2
+ const DEFAULT_PROBE_TIMEOUT_MS = 3_000;
3
+ const MAX_PROBE_TIMEOUT_MS = 30_000;
4
+ const MAX_PROBE_BUFFER_BYTES = 64 * 1024;
5
+ const MAX_REPORTED_OUTPUT_CHARS = 2_000;
6
+ const PROBE_ARGUMENTS = {
7
+ openclaw: ["--version"],
8
+ tmux: ["-V"],
9
+ acpx: ["--version"],
10
+ codex: ["--version"],
11
+ claude: ["--version"],
12
+ cursor: ["--version"]
13
+ };
14
+ const DEFAULT_PROBE_EXECUTABLES = {
15
+ openclaw: "openclaw",
16
+ tmux: "tmux",
17
+ acpx: "acpx",
18
+ codex: "codex",
19
+ claude: "claude",
20
+ // ACPX's built-in Cursor adapter launches `cursor-agent acp`. The desktop
21
+ // `cursor` shim may exist while no ACP-capable Cursor agent is available.
22
+ cursor: "cursor-agent"
23
+ };
24
+ export const DOCTOR_PROBE_COMMANDS = Object.freeze(Object.keys(PROBE_ARGUMENTS));
25
+ const MODE_PROBE_COMMANDS = {
26
+ tmux: ["openclaw", "tmux", "codex", "claude"],
27
+ acpx: ["openclaw", "acpx", "codex", "claude", "cursor"],
28
+ all: DOCTOR_PROBE_COMMANDS
29
+ };
30
+ /**
31
+ * Run a bounded, non-interactive version probe for one doctor dependency.
32
+ *
33
+ * This deliberately does not invoke a shell. Successful process execution is
34
+ * not enough: the output must also contain a recognizable version.
35
+ */
36
+ export function probeDoctorCommand(command, options = {}) {
37
+ const executable = options.executables?.[command] ?? DEFAULT_PROBE_EXECUTABLES[command];
38
+ const args = PROBE_ARGUMENTS[command];
39
+ const timeoutMs = boundedTimeout(options.timeoutMs);
40
+ const startedAt = Date.now();
41
+ const result = spawnSync(executable, args, {
42
+ cwd: options.cwd,
43
+ env: {
44
+ ...process.env,
45
+ CI: "1",
46
+ NO_COLOR: "1",
47
+ FORCE_COLOR: "0",
48
+ TERM: "dumb",
49
+ PAGER: "cat",
50
+ GIT_PAGER: "cat",
51
+ ...options.env
52
+ },
53
+ encoding: "utf8",
54
+ stdio: ["ignore", "pipe", "pipe"],
55
+ timeout: timeoutMs,
56
+ killSignal: "SIGKILL",
57
+ maxBuffer: MAX_PROBE_BUFFER_BYTES,
58
+ windowsHide: true
59
+ });
60
+ const durationMs = Date.now() - startedAt;
61
+ const output = cleanProbeOutput([result.stdout, result.stderr].filter(Boolean).join("\n"));
62
+ const processError = result.error;
63
+ if (processError) {
64
+ const status = classifySpawnError(processError);
65
+ return buildProbeResult({
66
+ command,
67
+ executable,
68
+ args,
69
+ status,
70
+ durationMs,
71
+ output,
72
+ error: processError.message,
73
+ exitCode: result.status,
74
+ signal: result.signal
75
+ });
76
+ }
77
+ if (result.status !== 0) {
78
+ return buildProbeResult({
79
+ command,
80
+ executable,
81
+ args,
82
+ status: "version_failed",
83
+ durationMs,
84
+ output,
85
+ error: output || `${command} version probe exited with status ${result.status}`,
86
+ exitCode: result.status,
87
+ signal: result.signal
88
+ });
89
+ }
90
+ const version = parseVersion(output);
91
+ if (!version) {
92
+ return buildProbeResult({
93
+ command,
94
+ executable,
95
+ args,
96
+ status: "malformed_output",
97
+ durationMs,
98
+ output,
99
+ error: `${command} version probe did not return a recognizable version`,
100
+ exitCode: result.status,
101
+ signal: result.signal
102
+ });
103
+ }
104
+ return buildProbeResult({
105
+ command,
106
+ executable,
107
+ args,
108
+ status: "ok",
109
+ durationMs,
110
+ output,
111
+ version,
112
+ exitCode: result.status,
113
+ signal: result.signal
114
+ });
115
+ }
116
+ /**
117
+ * Probe every external command used by the tmux and ACPX execution modes.
118
+ */
119
+ export function runDoctorCapabilityProbes(options = {}, mode = "all") {
120
+ return MODE_PROBE_COMMANDS[mode].map((command) => probeDoctorCommand(command, options));
121
+ }
122
+ export function evaluateDoctorCapabilities(checks, mode = "all") {
2
123
  const checkByCommand = new Map(checks.map((check) => [check.command, check]));
3
124
  const nodeCheck = checkByCommand.get("node");
4
- const coreOk = nodeCheck?.available === true &&
5
- nodeCheck.version_supported === true &&
6
- checkByCommand.get("openclaw")?.available === true;
125
+ const nodeOk = isUsable(nodeCheck) &&
126
+ nodeCheck?.version_supported === true;
127
+ const openclawOk = isUsable(checkByCommand.get("openclaw"));
128
+ const coreOk = nodeOk && openclawOk;
129
+ const missingCore = [
130
+ ...(!nodeOk ? ["node"] : []),
131
+ ...(!openclawOk ? ["openclaw"] : [])
132
+ ];
7
133
  const availableAgents = ["codex", "claude", "cursor"]
8
- .filter((agent) => checkByCommand.get(agent)?.available === true);
134
+ .filter((agent) => isUsable(checkByCommand.get(agent)));
9
135
  const tmuxAgents = availableAgents.filter((agent) => agent !== "cursor");
136
+ const tmuxTransportOk = isUsable(checkByCommand.get("tmux"));
137
+ const acpxTransportOk = isUsable(checkByCommand.get("acpx"));
10
138
  const tmux = {
11
- available: checkByCommand.get("tmux")?.available === true && tmuxAgents.length > 0,
139
+ available: tmuxTransportOk && tmuxAgents.length > 0,
140
+ status: readinessFromParts([coreOk, tmuxTransportOk, tmuxAgents.length > 0]),
12
141
  recommended: true,
13
142
  agents: tmuxAgents,
14
- requires: ["tmux", "codex or claude"]
143
+ requires: ["node", "openclaw", "tmux", "codex or claude"],
144
+ missing: [
145
+ ...missingCore,
146
+ ...(!tmuxTransportOk ? ["tmux"] : []),
147
+ ...(tmuxAgents.length === 0 ? ["codex or claude"] : [])
148
+ ]
15
149
  };
16
- const acp = {
17
- available: checkByCommand.get("acpx")?.available === true && availableAgents.length > 0,
150
+ const acpx = {
151
+ available: acpxTransportOk && availableAgents.length > 0,
152
+ status: readinessFromParts([coreOk, acpxTransportOk, availableAgents.length > 0]),
18
153
  client: "acpx",
19
154
  agents: availableAgents,
20
- requires: ["acpx", "codex, claude, or cursor"]
155
+ requires: ["node", "openclaw", "acpx", "codex, claude, or cursor"],
156
+ missing: [
157
+ ...missingCore,
158
+ ...(!acpxTransportOk ? ["acpx"] : []),
159
+ ...(availableAgents.length === 0 ? ["codex, claude, or cursor"] : [])
160
+ ]
21
161
  };
22
162
  return {
23
163
  coreOk,
24
- transportOk: tmux.available || acp.available,
164
+ transportOk: tmux.available || acpx.available,
165
+ mode,
166
+ readiness: selectedReadiness(mode, tmux.status, acpx.status),
25
167
  tmux,
26
- acp
168
+ acpx,
169
+ acp: acpx
170
+ };
171
+ }
172
+ function buildProbeResult({ command, executable, args, status, durationMs, version, output, error, exitCode, signal }) {
173
+ return {
174
+ command,
175
+ executable,
176
+ args,
177
+ status,
178
+ available: status === "ok",
179
+ found: status !== "not_found",
180
+ executable_ok: !["not_found", "not_executable"].includes(status),
181
+ duration_ms: durationMs,
182
+ ...(version ? { version } : {}),
183
+ ...(output ? { output } : {}),
184
+ ...(error ? { error } : {}),
185
+ ...(exitCode !== undefined ? { exit_code: exitCode } : {}),
186
+ ...(signal !== undefined ? { signal } : {})
27
187
  };
28
188
  }
189
+ function classifySpawnError(error) {
190
+ if (error.code === "ENOENT" || error.code === "ENOTDIR") {
191
+ return "not_found";
192
+ }
193
+ if (error.code === "EACCES" ||
194
+ error.code === "EPERM" ||
195
+ error.code === "EISDIR" ||
196
+ error.code === "ENOEXEC") {
197
+ return "not_executable";
198
+ }
199
+ if (error.code === "ETIMEDOUT") {
200
+ return "timeout";
201
+ }
202
+ return "version_failed";
203
+ }
204
+ function cleanProbeOutput(value) {
205
+ const cleaned = value
206
+ .replace(/\u001B\[[0-?]*[ -/]*[@-~]/g, "")
207
+ .replace(/\r/g, "")
208
+ .trim();
209
+ if (!cleaned) {
210
+ return undefined;
211
+ }
212
+ return cleaned.slice(0, MAX_REPORTED_OUTPUT_CHARS);
213
+ }
214
+ function parseVersion(output) {
215
+ if (!output) {
216
+ return undefined;
217
+ }
218
+ const match = output.match(/(?:^|[^0-9A-Za-z])v?(\d+\.\d+(?:\.\d+)?(?:[-+][0-9A-Za-z.-]+|[A-Za-z]\d*)?)(?=$|[^0-9A-Za-z])/m);
219
+ return match?.[1];
220
+ }
221
+ function boundedTimeout(value) {
222
+ if (value === undefined) {
223
+ return DEFAULT_PROBE_TIMEOUT_MS;
224
+ }
225
+ if (!Number.isFinite(value) || value <= 0) {
226
+ throw new RangeError("doctor probe timeoutMs must be a positive finite number");
227
+ }
228
+ return Math.min(Math.ceil(value), MAX_PROBE_TIMEOUT_MS);
229
+ }
230
+ function isUsable(check) {
231
+ return check?.available === true && (check.status === undefined || check.status === "ok");
232
+ }
233
+ function readinessFromParts(parts) {
234
+ const readyParts = parts.filter(Boolean).length;
235
+ if (readyParts === parts.length) {
236
+ return "ready";
237
+ }
238
+ return readyParts === 0 ? "not_ready" : "partially_ready";
239
+ }
240
+ function selectedReadiness(mode, tmux, acpx) {
241
+ if (mode === "tmux") {
242
+ return tmux;
243
+ }
244
+ if (mode === "acpx") {
245
+ return acpx;
246
+ }
247
+ // "all" inspects both execution modes, but the product only requires one
248
+ // usable transport. Per-mode status still shows which optional mode needs
249
+ // attention.
250
+ if (tmux === "ready" || acpx === "ready") {
251
+ return "ready";
252
+ }
253
+ if (tmux === "not_ready" && acpx === "not_ready") {
254
+ return "not_ready";
255
+ }
256
+ return "partially_ready";
257
+ }
29
258
  //# sourceMappingURL=doctor-capabilities.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"doctor-capabilities.js","sourceRoot":"","sources":["../../src/doctor-capabilities.ts"],"names":[],"mappings":"AAuBA,MAAM,UAAU,0BAA0B,CACxC,MAAqC;IAErC,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IAC9E,MAAM,SAAS,GAAG,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC7C,MAAM,MAAM,GAAG,SAAS,EAAE,SAAS,KAAK,IAAI;QAC1C,SAAS,CAAC,iBAAiB,KAAK,IAAI;QACpC,cAAc,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,SAAS,KAAK,IAAI,CAAC;IACrD,MAAM,eAAe,GAAG,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC;SAClD,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,SAAS,KAAK,IAAI,CAAC,CAAC;IACpE,MAAM,UAAU,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC;IACzE,MAAM,IAAI,GAAG;QACX,SAAS,EAAE,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,SAAS,KAAK,IAAI,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC;QAClF,WAAW,EAAE,IAAa;QAC1B,MAAM,EAAE,UAAU;QAClB,QAAQ,EAAE,CAAC,MAAM,EAAE,iBAAiB,CAAC;KACtC,CAAC;IACF,MAAM,GAAG,GAAG;QACV,SAAS,EAAE,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,SAAS,KAAK,IAAI,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC;QACvF,MAAM,EAAE,MAAe;QACvB,MAAM,EAAE,eAAe;QACvB,QAAQ,EAAE,CAAC,MAAM,EAAE,0BAA0B,CAAC;KAC/C,CAAC;IACF,OAAO;QACL,MAAM;QACN,WAAW,EAAE,IAAI,CAAC,SAAS,IAAI,GAAG,CAAC,SAAS;QAC5C,IAAI;QACJ,GAAG;KACJ,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"doctor-capabilities.js","sourceRoot":"","sources":["../../src/doctor-capabilities.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ export type OpenClawDiagnosticStatus = "ok" | "failed" | "missing" | "invalid" | "unreachable";
2
+ export interface OpenClawDiagnosticCheck {
3
+ name: "config" | "plugin_entry" | "plugin_installed" | "plugin_enabled" | "plugin_runtime" | "skill" | "workspace" | "gateway";
4
+ ok: boolean;
5
+ status: OpenClawDiagnosticStatus;
6
+ detail: string;
7
+ remediation?: string[];
8
+ }
9
+ export interface OpenClawChainDiagnostics {
10
+ ready: boolean;
11
+ package_ready: boolean;
12
+ gateway_ready: boolean;
13
+ default_agent?: "codex" | "claude" | "cursor";
14
+ workspace?: string;
15
+ checks: OpenClawDiagnosticCheck[];
16
+ }
17
+ export interface OpenClawChainDiagnosticOptions {
18
+ openclawBin: string;
19
+ workspace?: string;
20
+ timeoutMs?: number;
21
+ env?: NodeJS.ProcessEnv;
22
+ cwd?: string;
23
+ }
24
+ /**
25
+ * Verify the complete OpenClaw-side AKK chain without returning config values
26
+ * other than the explicitly non-secret workspace path.
27
+ */
28
+ export declare function runOpenClawChainDiagnostics(options: OpenClawChainDiagnosticOptions): OpenClawChainDiagnostics;