@scotthuang/agent-knock-knock 0.2.46 → 0.2.48

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 (44) hide show
  1. package/CHANGELOG.md +39 -0
  2. package/README.md +93 -55
  3. package/dist/src/approval-policy.d.ts +3 -1
  4. package/dist/src/approval-policy.js +18 -4
  5. package/dist/src/approval-policy.js.map +1 -1
  6. package/dist/src/claude-hook-installer.d.ts +65 -0
  7. package/dist/src/claude-hook-installer.js +410 -0
  8. package/dist/src/claude-hook-installer.js.map +1 -0
  9. package/dist/src/claude-hook-protocol.d.ts +89 -0
  10. package/dist/src/claude-hook-protocol.js +243 -0
  11. package/dist/src/claude-hook-protocol.js.map +1 -0
  12. package/dist/src/claude-hook-store.d.ts +247 -0
  13. package/dist/src/claude-hook-store.js +1075 -0
  14. package/dist/src/claude-hook-store.js.map +1 -0
  15. package/dist/src/claude-terminal-agent-adapter.d.ts +47 -0
  16. package/dist/src/claude-terminal-agent-adapter.js +935 -0
  17. package/dist/src/claude-terminal-agent-adapter.js.map +1 -0
  18. package/dist/src/cli.js +2065 -316
  19. package/dist/src/cli.js.map +1 -1
  20. package/dist/src/openclaw-plugin-helpers.d.ts +49 -0
  21. package/dist/src/openclaw-plugin-helpers.js +246 -0
  22. package/dist/src/openclaw-plugin-helpers.js.map +1 -0
  23. package/dist/src/openclaw-plugin.js +98 -275
  24. package/dist/src/openclaw-plugin.js.map +1 -1
  25. package/dist/src/runtime-log.js +54 -2
  26. package/dist/src/runtime-log.js.map +1 -1
  27. package/dist/src/store.js +432 -12
  28. package/dist/src/store.js.map +1 -1
  29. package/dist/src/terminal-agent-adapter.d.ts +37 -0
  30. package/dist/src/terminal-agent-adapter.js.map +1 -1
  31. package/dist/src/terminal-agent-bridge.d.ts +51 -4
  32. package/dist/src/terminal-agent-bridge.js +326 -43
  33. package/dist/src/terminal-agent-bridge.js.map +1 -1
  34. package/dist/src/terminal-agent-registry.js +3 -1
  35. package/dist/src/terminal-agent-registry.js.map +1 -1
  36. package/dist/src/terminal-control-provider.d.ts +3 -1
  37. package/dist/src/terminal-control-provider.js +41 -37
  38. package/dist/src/terminal-control-provider.js.map +1 -1
  39. package/dist/src/terminal-process-source.d.ts +12 -3
  40. package/dist/src/terminal-process-source.js +37 -6
  41. package/dist/src/terminal-process-source.js.map +1 -1
  42. package/openclaw.plugin.json +5 -5
  43. package/package.json +10 -5
  44. package/templates/openclaw-skills/agent-knock-knock/SKILL.md +19 -30
@@ -0,0 +1,410 @@
1
+ import { randomBytes } from "node:crypto";
2
+ import fs from "node:fs";
3
+ import os from "node:os";
4
+ import path from "node:path";
5
+ export const CLAUDE_HOOK_EVENT_NAMES = [
6
+ "SessionStart",
7
+ "UserPromptSubmit",
8
+ "PermissionRequest",
9
+ "Stop",
10
+ "StopFailure",
11
+ "Notification"
12
+ ];
13
+ const HOOK_ARGUMENTS = ["claude-hook"];
14
+ const PERMISSION_STATUS_MESSAGE = "Waiting for Agent Knock Knock approval...";
15
+ const HOOK_DEFINITIONS = [
16
+ {
17
+ event: "SessionStart",
18
+ matcher: "startup|resume|clear|compact|fork",
19
+ timeout: 10
20
+ },
21
+ { event: "UserPromptSubmit", timeout: 10 },
22
+ { event: "PermissionRequest", matcher: "*", timeout: 600, statusMessage: PERMISSION_STATUS_MESSAGE },
23
+ { event: "Stop", timeout: 10 },
24
+ {
25
+ event: "StopFailure",
26
+ matcher: "rate_limit|authentication_failed|oauth_org_not_allowed|billing_error|invalid_request|model_not_found|server_error|max_output_tokens|unknown",
27
+ timeout: 10
28
+ },
29
+ {
30
+ event: "Notification",
31
+ matcher: "permission_prompt|idle_prompt|agent_needs_input|agent_completed",
32
+ timeout: 10
33
+ }
34
+ ];
35
+ /** Returns Claude Code's user settings path without reading it. */
36
+ export function defaultClaudeSettingsPath() {
37
+ return path.join(os.homedir(), ".claude", "settings.json");
38
+ }
39
+ /**
40
+ * Reads only Tokenjuice launcher provenance from Claude's trusted user settings.
41
+ * Invalid, missing, non-executable, or relative launchers are ignored so approval
42
+ * normalization fails closed without exposing settings contents.
43
+ */
44
+ export function loadTrustedClaudeTokenjuiceLaunchers(settingsPath = defaultClaudeSettingsPath()) {
45
+ let settings;
46
+ try {
47
+ settings = readSettings(path.resolve(settingsPath));
48
+ }
49
+ catch {
50
+ return [];
51
+ }
52
+ return extractClaudeTokenjuiceLaunchers(settings).flatMap((launcher) => {
53
+ try {
54
+ fs.accessSync(launcher, fs.constants.X_OK);
55
+ return [{
56
+ configuredPath: launcher,
57
+ canonicalPath: fs.realpathSync(launcher)
58
+ }];
59
+ }
60
+ catch {
61
+ return [];
62
+ }
63
+ }).filter((launcher, index, values) => values.findIndex((candidate) => candidate.configuredPath === launcher.configuredPath &&
64
+ candidate.canonicalPath === launcher.canonicalPath) === index);
65
+ }
66
+ export function extractClaudeTokenjuiceLaunchers(settingsValue) {
67
+ if (!isObject(settingsValue) || !isObject(settingsValue.hooks)) {
68
+ return [];
69
+ }
70
+ const groups = settingsValue.hooks.PreToolUse;
71
+ if (!Array.isArray(groups)) {
72
+ return [];
73
+ }
74
+ const launchers = [];
75
+ for (const group of groups) {
76
+ if (!isObject(group) || group.matcher !== "Bash" || !Array.isArray(group.hooks)) {
77
+ continue;
78
+ }
79
+ for (const handler of group.hooks) {
80
+ if (!isObject(handler) || handler.type !== "command" || typeof handler.command !== "string") {
81
+ continue;
82
+ }
83
+ const tokens = tokenizeShellWords(handler.command);
84
+ if (!tokens) {
85
+ continue;
86
+ }
87
+ const subcommandIndex = tokens.indexOf("claude-code-pre-tool-use");
88
+ if (subcommandIndex < 1) {
89
+ continue;
90
+ }
91
+ let launcher;
92
+ for (let index = subcommandIndex + 1; index < tokens.length; index += 1) {
93
+ if (tokens[index] === "--wrap-launcher") {
94
+ launcher = tokens[index + 1];
95
+ break;
96
+ }
97
+ if (tokens[index].startsWith("--wrap-launcher=")) {
98
+ launcher = tokens[index].slice("--wrap-launcher=".length);
99
+ break;
100
+ }
101
+ }
102
+ if (launcher && path.isAbsolute(launcher)) {
103
+ launchers.push(path.normalize(launcher));
104
+ }
105
+ }
106
+ }
107
+ return launchers.filter((launcher, index) => launchers.indexOf(launcher) === index);
108
+ }
109
+ /**
110
+ * Adds AKK matcher groups without mutating the supplied settings object.
111
+ * Existing groups and sibling handlers are retained byte-for-byte when the
112
+ * result is serialized, apart from JSON's normal formatting.
113
+ */
114
+ export function mergeClaudeHookSettings(settingsValue, executablePathValue) {
115
+ const executablePath = requireAbsoluteExecutable(executablePathValue);
116
+ const settings = requireObject(settingsValue, "Claude settings");
117
+ const existingHooksValue = settings.hooks;
118
+ const existingHooks = existingHooksValue === undefined
119
+ ? {}
120
+ : requireObject(existingHooksValue, "Claude settings hooks");
121
+ const mergedSettings = { ...settings };
122
+ const mergedHooks = { ...existingHooks };
123
+ const addedEvents = [];
124
+ const existingEvents = [];
125
+ const warnings = [];
126
+ for (const definition of HOOK_DEFINITIONS) {
127
+ const groupsValue = existingHooks[definition.event];
128
+ if (groupsValue !== undefined && !Array.isArray(groupsValue)) {
129
+ throw new Error(`Claude settings hooks.${definition.event} must be an array`);
130
+ }
131
+ const groups = groupsValue === undefined ? [] : groupsValue;
132
+ const inspection = inspectEventGroups(groups, definition, executablePath);
133
+ warnings.push(...inspection.warnings);
134
+ if (inspection.hasExactHandler) {
135
+ existingEvents.push(definition.event);
136
+ continue;
137
+ }
138
+ mergedHooks[definition.event] = [
139
+ ...groups,
140
+ createMatcherGroup(definition, executablePath)
141
+ ];
142
+ addedEvents.push(definition.event);
143
+ }
144
+ mergedSettings.hooks = mergedHooks;
145
+ return {
146
+ settings: mergedSettings,
147
+ changed: addedEvents.length > 0,
148
+ addedEvents,
149
+ existingEvents,
150
+ warnings
151
+ };
152
+ }
153
+ /**
154
+ * Safely installs Claude Code user hooks. This function does not log settings
155
+ * contents and its result contains only paths, event names, counts, and
156
+ * non-sensitive warnings.
157
+ */
158
+ export function installClaudeHooks(options) {
159
+ const executablePath = requireAbsoluteExecutable(options.executablePath);
160
+ const settingsPath = path.resolve(options.settingsPath ?? defaultClaudeSettingsPath());
161
+ const dryRun = options.dryRun === true;
162
+ const exists = fs.existsSync(settingsPath);
163
+ const settings = exists ? readSettings(settingsPath) : {};
164
+ const merged = mergeClaudeHookSettings(settings, executablePath);
165
+ let backupPath;
166
+ if (merged.changed && !dryRun) {
167
+ const parentDirectory = path.dirname(settingsPath);
168
+ fs.mkdirSync(parentDirectory, { recursive: true, mode: 0o700 });
169
+ if (exists) {
170
+ backupPath = createBackup(settingsPath, options.now ?? (() => new Date()));
171
+ }
172
+ atomicWriteJson(settingsPath, merged.settings);
173
+ }
174
+ return {
175
+ settingsPath,
176
+ changed: merged.changed,
177
+ written: merged.changed && !dryRun,
178
+ dryRun,
179
+ created: !exists && merged.changed && !dryRun,
180
+ ...(backupPath === undefined ? {} : { backupPath }),
181
+ addedEvents: merged.addedEvents,
182
+ existingEvents: merged.existingEvents,
183
+ warnings: merged.warnings,
184
+ summary: {
185
+ addedCount: merged.addedEvents.length,
186
+ existingCount: merged.existingEvents.length,
187
+ warningCount: merged.warnings.length
188
+ }
189
+ };
190
+ }
191
+ /** Compatibility-friendly explicit name for callers wiring an install command. */
192
+ export const installClaudeHookSettings = installClaudeHooks;
193
+ function createMatcherGroup(definition, executablePath) {
194
+ const handler = {
195
+ type: "command",
196
+ command: executablePath,
197
+ args: [...HOOK_ARGUMENTS],
198
+ timeout: definition.timeout,
199
+ ...(definition.statusMessage === undefined ? {} : { statusMessage: definition.statusMessage })
200
+ };
201
+ return {
202
+ ...(definition.matcher === undefined ? {} : { matcher: definition.matcher }),
203
+ hooks: [handler]
204
+ };
205
+ }
206
+ function inspectEventGroups(groups, definition, executablePath) {
207
+ let hasExactHandler = false;
208
+ let hasDifferentArguments = false;
209
+ let exactHandlerNeedsReview = false;
210
+ for (const groupValue of groups) {
211
+ if (!isObject(groupValue) || !Array.isArray(groupValue.hooks)) {
212
+ continue;
213
+ }
214
+ for (const handlerValue of groupValue.hooks) {
215
+ if (!isObject(handlerValue) || handlerValue.command !== executablePath) {
216
+ continue;
217
+ }
218
+ if (!isExactHookArguments(handlerValue.args)) {
219
+ hasDifferentArguments = true;
220
+ continue;
221
+ }
222
+ hasExactHandler = true;
223
+ if (!handlerMatchesDefinition(handlerValue, groupValue, definition)) {
224
+ exactHandlerNeedsReview = true;
225
+ }
226
+ }
227
+ }
228
+ const warnings = [];
229
+ if (hasDifferentArguments) {
230
+ warnings.push(`${definition.event} contains a handler for the AKK executable with different arguments; it was preserved.`);
231
+ }
232
+ if (exactHandlerNeedsReview) {
233
+ warnings.push(`${definition.event} already contains the AKK claude-hook handler with non-recommended options; it was preserved.`);
234
+ }
235
+ return { hasExactHandler, warnings };
236
+ }
237
+ function handlerMatchesDefinition(handler, group, definition) {
238
+ const matcherMatches = definition.matcher === undefined
239
+ ? group.matcher === undefined
240
+ : group.matcher === definition.matcher;
241
+ const statusMatches = definition.statusMessage === undefined
242
+ ? true
243
+ : handler.statusMessage === definition.statusMessage;
244
+ return handler.type === "command" &&
245
+ handler.timeout === definition.timeout &&
246
+ matcherMatches &&
247
+ statusMatches;
248
+ }
249
+ function isExactHookArguments(value) {
250
+ return Array.isArray(value) && value.length === 1 && value[0] === HOOK_ARGUMENTS[0];
251
+ }
252
+ function tokenizeShellWords(command) {
253
+ const tokens = [];
254
+ let token = "";
255
+ let quote;
256
+ let escaped = false;
257
+ let started = false;
258
+ for (const character of command.trim()) {
259
+ if (escaped) {
260
+ token += character;
261
+ escaped = false;
262
+ started = true;
263
+ continue;
264
+ }
265
+ if (character === "\\" && quote !== "'") {
266
+ escaped = true;
267
+ started = true;
268
+ continue;
269
+ }
270
+ if (quote) {
271
+ if (character === quote) {
272
+ quote = undefined;
273
+ }
274
+ else {
275
+ token += character;
276
+ }
277
+ started = true;
278
+ continue;
279
+ }
280
+ if (character === "'" || character === '"') {
281
+ quote = character;
282
+ started = true;
283
+ continue;
284
+ }
285
+ if (/\s/u.test(character)) {
286
+ if (started) {
287
+ tokens.push(token);
288
+ token = "";
289
+ started = false;
290
+ }
291
+ continue;
292
+ }
293
+ token += character;
294
+ started = true;
295
+ }
296
+ if (escaped || quote) {
297
+ return undefined;
298
+ }
299
+ if (started) {
300
+ tokens.push(token);
301
+ }
302
+ return tokens;
303
+ }
304
+ function readSettings(settingsPath) {
305
+ const stat = fs.lstatSync(settingsPath);
306
+ if (stat.isSymbolicLink()) {
307
+ throw new Error(`Refusing to replace symbolic-link Claude settings: ${settingsPath}`);
308
+ }
309
+ if (!stat.isFile()) {
310
+ throw new Error(`Claude settings path is not a regular file: ${settingsPath}`);
311
+ }
312
+ let value;
313
+ try {
314
+ value = JSON.parse(fs.readFileSync(settingsPath, "utf8"));
315
+ }
316
+ catch {
317
+ throw new Error(`Claude settings JSON is invalid: ${settingsPath}`);
318
+ }
319
+ return requireObject(value, "Claude settings");
320
+ }
321
+ function createBackup(settingsPath, now) {
322
+ const date = now();
323
+ if (!(date instanceof Date) || !Number.isFinite(date.getTime())) {
324
+ throw new Error("Claude hook installer clock returned an invalid date");
325
+ }
326
+ const timestamp = date.toISOString().replace(/[:.]/gu, "-");
327
+ let suffix = 0;
328
+ while (true) {
329
+ const candidate = `${settingsPath}.bak.${timestamp}${suffix === 0 ? "" : `.${suffix}`}`;
330
+ let descriptor;
331
+ try {
332
+ descriptor = fs.openSync(candidate, "wx", 0o600);
333
+ fs.writeFileSync(descriptor, fs.readFileSync(settingsPath));
334
+ fs.fsyncSync(descriptor);
335
+ fs.closeSync(descriptor);
336
+ descriptor = undefined;
337
+ return candidate;
338
+ }
339
+ catch (error) {
340
+ if (descriptor !== undefined) {
341
+ fs.closeSync(descriptor);
342
+ fs.rmSync(candidate, { force: true });
343
+ }
344
+ if (isFileExistsError(error)) {
345
+ suffix += 1;
346
+ continue;
347
+ }
348
+ throw error;
349
+ }
350
+ }
351
+ }
352
+ function atomicWriteJson(filePath, value) {
353
+ const parentDirectory = path.dirname(filePath);
354
+ const temporaryPath = `${filePath}.${process.pid}.${randomBytes(8).toString("hex")}.tmp`;
355
+ let descriptor;
356
+ try {
357
+ descriptor = fs.openSync(temporaryPath, "wx", 0o600);
358
+ fs.writeFileSync(descriptor, `${JSON.stringify(value, null, 2)}\n`, "utf8");
359
+ fs.fsyncSync(descriptor);
360
+ fs.closeSync(descriptor);
361
+ descriptor = undefined;
362
+ fs.renameSync(temporaryPath, filePath);
363
+ fs.chmodSync(filePath, 0o600);
364
+ fsyncDirectory(parentDirectory);
365
+ }
366
+ finally {
367
+ if (descriptor !== undefined) {
368
+ fs.closeSync(descriptor);
369
+ }
370
+ fs.rmSync(temporaryPath, { force: true });
371
+ }
372
+ }
373
+ function fsyncDirectory(directoryPath) {
374
+ let descriptor;
375
+ try {
376
+ descriptor = fs.openSync(directoryPath, "r");
377
+ fs.fsyncSync(descriptor);
378
+ }
379
+ catch {
380
+ // Some filesystems do not support syncing directories. The rename is
381
+ // still atomic, and the original settings remain available as a backup.
382
+ }
383
+ finally {
384
+ if (descriptor !== undefined) {
385
+ fs.closeSync(descriptor);
386
+ }
387
+ }
388
+ }
389
+ function requireAbsoluteExecutable(value) {
390
+ if (typeof value !== "string" || value.trim().length === 0 || value.includes("\0")) {
391
+ throw new Error("Claude hook executable path must be a non-empty absolute path");
392
+ }
393
+ if (!path.isAbsolute(value)) {
394
+ throw new Error("Claude hook executable path must be absolute");
395
+ }
396
+ return path.normalize(value);
397
+ }
398
+ function requireObject(value, label) {
399
+ if (!isObject(value)) {
400
+ throw new Error(`${label} must be a JSON object`);
401
+ }
402
+ return value;
403
+ }
404
+ function isObject(value) {
405
+ return value !== null && typeof value === "object" && !Array.isArray(value);
406
+ }
407
+ function isFileExistsError(error) {
408
+ return isObject(error) && error.code === "EEXIST";
409
+ }
410
+ //# sourceMappingURL=claude-hook-installer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-hook-installer.js","sourceRoot":"","sources":["../../src/claude-hook-installer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,89 @@
1
+ export type ClaudeHookEventName = "SessionStart" | "UserPromptSubmit" | "PermissionRequest" | "Stop" | "StopFailure" | "Notification";
2
+ export type ClaudeJsonValue = null | boolean | number | string | ClaudeJsonValue[] | {
3
+ [key: string]: ClaudeJsonValue;
4
+ };
5
+ export type ClaudeJsonObject = {
6
+ [key: string]: ClaudeJsonValue;
7
+ };
8
+ export interface ClaudeHookInputBase {
9
+ session_id: string;
10
+ transcript_path: string;
11
+ cwd: string;
12
+ permission_mode?: string;
13
+ effort?: ClaudeJsonValue;
14
+ agent_id?: string;
15
+ agent_type?: string;
16
+ /** Present in recent Claude Code hook payloads and useful for exact turn correlation. */
17
+ prompt_id?: string;
18
+ }
19
+ export interface ClaudeSessionStartHookInput extends ClaudeHookInputBase {
20
+ hook_event_name: "SessionStart";
21
+ source: "startup" | "resume" | "clear" | "compact" | "fork";
22
+ model?: string;
23
+ }
24
+ export interface ClaudeUserPromptSubmitHookInput extends ClaudeHookInputBase {
25
+ hook_event_name: "UserPromptSubmit";
26
+ prompt: string;
27
+ }
28
+ export interface ClaudePermissionRequestHookInput extends ClaudeHookInputBase {
29
+ hook_event_name: "PermissionRequest";
30
+ tool_name: string;
31
+ tool_input: ClaudeJsonValue;
32
+ permission_suggestions?: ClaudeJsonValue[];
33
+ }
34
+ export interface ClaudeBackgroundTaskSummary extends ClaudeJsonObject {
35
+ id: string;
36
+ type: string;
37
+ status: string;
38
+ description: string;
39
+ }
40
+ export interface ClaudeSessionCronSummary extends ClaudeJsonObject {
41
+ id: string;
42
+ schedule: string;
43
+ recurring: boolean;
44
+ prompt: string;
45
+ }
46
+ export interface ClaudeStopHookInput extends ClaudeHookInputBase {
47
+ hook_event_name: "Stop";
48
+ stop_hook_active: boolean;
49
+ last_assistant_message?: string;
50
+ /** Undefined is intentionally distinct from an observed empty array. */
51
+ background_tasks?: ClaudeBackgroundTaskSummary[];
52
+ /** Undefined is intentionally distinct from an observed empty array. */
53
+ session_crons?: ClaudeSessionCronSummary[];
54
+ }
55
+ export type ClaudeStopFailureCode = "rate_limit" | "authentication_failed" | "oauth_org_not_allowed" | "billing_error" | "invalid_request" | "model_not_found" | "server_error" | "max_output_tokens" | "unknown";
56
+ export interface ClaudeStopFailureHookInput extends ClaudeHookInputBase {
57
+ hook_event_name: "StopFailure";
58
+ error: ClaudeStopFailureCode;
59
+ error_details?: ClaudeJsonValue;
60
+ last_assistant_message?: string;
61
+ }
62
+ export interface ClaudeNotificationHookInput extends ClaudeHookInputBase {
63
+ hook_event_name: "Notification";
64
+ message: string;
65
+ title?: string;
66
+ notification_type: string;
67
+ }
68
+ export type ClaudeHookInput = ClaudeSessionStartHookInput | ClaudeUserPromptSubmitHookInput | ClaudePermissionRequestHookInput | ClaudeStopHookInput | ClaudeStopFailureHookInput | ClaudeNotificationHookInput;
69
+ export type ClaudePermissionBehavior = "allow" | "deny";
70
+ export type ClaudePermissionHookOutput = {
71
+ hookSpecificOutput: {
72
+ hookEventName: "PermissionRequest";
73
+ decision: {
74
+ behavior: "allow";
75
+ } | {
76
+ behavior: "deny";
77
+ message: string;
78
+ interrupt?: boolean;
79
+ };
80
+ };
81
+ };
82
+ export declare function parseClaudeHookInput(value: unknown): ClaudeHookInput;
83
+ export declare function canonicalClaudePermissionFingerprint(input: ClaudePermissionRequestHookInput): string;
84
+ export declare function claudePermissionHookOutput(decision: {
85
+ behavior: ClaudePermissionBehavior;
86
+ interrupt?: boolean;
87
+ message?: string;
88
+ }): ClaudePermissionHookOutput;
89
+ export declare function canonicalJson(value: ClaudeJsonValue): string;