@scotthuang/agent-knock-knock 0.2.44 → 0.2.47

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 (49) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/README.md +148 -242
  3. package/dist/src/approval-policy.d.ts +1 -0
  4. package/dist/src/approval-policy.js +6 -0
  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 +1064 -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 +920 -0
  17. package/dist/src/claude-terminal-agent-adapter.js.map +1 -0
  18. package/dist/src/cli.js +1565 -772
  19. package/dist/src/cli.js.map +1 -1
  20. package/dist/src/codex-session-provider.d.ts +6 -32
  21. package/dist/src/codex-session-provider.js +2 -1
  22. package/dist/src/codex-session-provider.js.map +1 -1
  23. package/dist/src/codex-store-adapter.d.ts +3 -9
  24. package/dist/src/codex-store-adapter.js +5 -55
  25. package/dist/src/codex-store-adapter.js.map +1 -1
  26. package/dist/src/codex-terminal-agent-adapter.d.ts +34 -0
  27. package/dist/src/codex-terminal-agent-adapter.js +386 -0
  28. package/dist/src/codex-terminal-agent-adapter.js.map +1 -0
  29. package/dist/src/openclaw-plugin.js +60 -11
  30. package/dist/src/openclaw-plugin.js.map +1 -1
  31. package/dist/src/protocol.d.ts +1 -1
  32. package/dist/src/terminal-agent-adapter.d.ts +158 -0
  33. package/dist/src/terminal-agent-adapter.js +109 -0
  34. package/dist/src/terminal-agent-adapter.js.map +1 -0
  35. package/dist/src/terminal-agent-bridge.d.ts +114 -0
  36. package/dist/src/terminal-agent-bridge.js +487 -0
  37. package/dist/src/terminal-agent-bridge.js.map +1 -0
  38. package/dist/src/terminal-agent-registry.d.ts +7 -0
  39. package/dist/src/terminal-agent-registry.js +24 -0
  40. package/dist/src/terminal-agent-registry.js.map +1 -0
  41. package/dist/src/terminal-control-provider.d.ts +8 -6
  42. package/dist/src/terminal-control-provider.js +5 -5
  43. package/dist/src/terminal-control-provider.js.map +1 -1
  44. package/dist/src/terminal-process-source.d.ts +25 -0
  45. package/dist/src/terminal-process-source.js +77 -0
  46. package/dist/src/terminal-process-source.js.map +1 -0
  47. package/openclaw.plugin.json +7 -3
  48. package/package.json +1 -1
  49. package/templates/openclaw-skills/agent-knock-knock/SKILL.md +19 -16
@@ -0,0 +1,243 @@
1
+ import { createHash } from "node:crypto";
2
+ export function parseClaudeHookInput(value) {
3
+ const input = requireObject(value, "Claude hook input");
4
+ const common = parseCommonInput(input);
5
+ const hookEventName = requireString(input.hook_event_name, "hook_event_name");
6
+ switch (hookEventName) {
7
+ case "SessionStart": {
8
+ const source = requireString(input.source, "source");
9
+ if (source !== "startup" && source !== "resume" && source !== "clear" && source !== "compact" && source !== "fork") {
10
+ throw new Error(`unsupported Claude SessionStart source: ${source}`);
11
+ }
12
+ return {
13
+ ...common,
14
+ hook_event_name: hookEventName,
15
+ source,
16
+ ...optionalStringProperty(input, "model")
17
+ };
18
+ }
19
+ case "UserPromptSubmit":
20
+ return {
21
+ ...common,
22
+ hook_event_name: hookEventName,
23
+ prompt: requireString(input.prompt, "prompt", { allowEmpty: true })
24
+ };
25
+ case "PermissionRequest":
26
+ return {
27
+ ...common,
28
+ hook_event_name: hookEventName,
29
+ tool_name: requireString(input.tool_name, "tool_name"),
30
+ tool_input: requireJsonValue(input.tool_input, "tool_input"),
31
+ ...optionalJsonArrayProperty(input, "permission_suggestions")
32
+ };
33
+ case "Stop":
34
+ return {
35
+ ...common,
36
+ hook_event_name: hookEventName,
37
+ stop_hook_active: requireBoolean(input.stop_hook_active, "stop_hook_active"),
38
+ ...optionalStringProperty(input, "last_assistant_message", { allowEmpty: true }),
39
+ ...optionalBackgroundTasksProperty(input),
40
+ ...optionalSessionCronsProperty(input)
41
+ };
42
+ case "StopFailure": {
43
+ const error = requireString(input.error, "error");
44
+ if (!CLAUDE_STOP_FAILURE_CODES.has(error)) {
45
+ throw new Error(`unsupported Claude StopFailure error: ${error}`);
46
+ }
47
+ return {
48
+ ...common,
49
+ hook_event_name: hookEventName,
50
+ error,
51
+ ...optionalJsonProperty(input, "error_details"),
52
+ ...optionalStringProperty(input, "last_assistant_message", { allowEmpty: true })
53
+ };
54
+ }
55
+ case "Notification":
56
+ return {
57
+ ...common,
58
+ hook_event_name: hookEventName,
59
+ message: requireString(input.message, "message", { allowEmpty: true }),
60
+ notification_type: requireString(input.notification_type, "notification_type"),
61
+ ...optionalStringProperty(input, "title", { allowEmpty: true })
62
+ };
63
+ default:
64
+ throw new Error(`unsupported Claude hook event: ${hookEventName}`);
65
+ }
66
+ }
67
+ export function canonicalClaudePermissionFingerprint(input) {
68
+ return createHash("sha256")
69
+ .update(canonicalJson({
70
+ version: 1,
71
+ session_id: input.session_id,
72
+ cwd: input.cwd,
73
+ permission_mode: input.permission_mode ?? null,
74
+ tool_name: input.tool_name,
75
+ tool_input: input.tool_input
76
+ }))
77
+ .digest("hex");
78
+ }
79
+ export function claudePermissionHookOutput(decision) {
80
+ return decision.behavior === "allow"
81
+ ? {
82
+ hookSpecificOutput: {
83
+ hookEventName: "PermissionRequest",
84
+ decision: { behavior: "allow" }
85
+ }
86
+ }
87
+ : {
88
+ hookSpecificOutput: {
89
+ hookEventName: "PermissionRequest",
90
+ decision: {
91
+ behavior: "deny",
92
+ message: decision.message ?? "Denied by Agent Knock Knock.",
93
+ ...(decision.interrupt === undefined ? {} : { interrupt: decision.interrupt })
94
+ }
95
+ }
96
+ };
97
+ }
98
+ export function canonicalJson(value) {
99
+ if (value === null || typeof value === "boolean" || typeof value === "string") {
100
+ return JSON.stringify(value);
101
+ }
102
+ if (typeof value === "number") {
103
+ if (!Number.isFinite(value)) {
104
+ throw new Error("canonical JSON does not support non-finite numbers");
105
+ }
106
+ return JSON.stringify(value);
107
+ }
108
+ if (Array.isArray(value)) {
109
+ return `[${value.map((entry) => canonicalJson(entry)).join(",")}]`;
110
+ }
111
+ return `{${Object.keys(value)
112
+ .sort()
113
+ .map((key) => `${JSON.stringify(key)}:${canonicalJson(value[key])}`)
114
+ .join(",")}}`;
115
+ }
116
+ function parseCommonInput(input) {
117
+ return {
118
+ session_id: requireString(input.session_id, "session_id"),
119
+ transcript_path: requireString(input.transcript_path, "transcript_path"),
120
+ cwd: requireString(input.cwd, "cwd"),
121
+ ...optionalStringProperty(input, "permission_mode"),
122
+ ...optionalJsonProperty(input, "effort"),
123
+ ...optionalStringProperty(input, "agent_id"),
124
+ ...optionalStringProperty(input, "agent_type"),
125
+ ...optionalStringProperty(input, "prompt_id")
126
+ };
127
+ }
128
+ const CLAUDE_STOP_FAILURE_CODES = new Set([
129
+ "rate_limit",
130
+ "authentication_failed",
131
+ "oauth_org_not_allowed",
132
+ "billing_error",
133
+ "invalid_request",
134
+ "model_not_found",
135
+ "server_error",
136
+ "max_output_tokens",
137
+ "unknown"
138
+ ]);
139
+ function requireObject(value, field) {
140
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
141
+ throw new Error(`${field} must be an object`);
142
+ }
143
+ return value;
144
+ }
145
+ function requireString(value, field, options = {}) {
146
+ if (typeof value !== "string" || (!options.allowEmpty && value.trim().length === 0)) {
147
+ throw new Error(`${field} must be ${options.allowEmpty ? "a string" : "a non-empty string"}`);
148
+ }
149
+ return value;
150
+ }
151
+ function requireBoolean(value, field) {
152
+ if (typeof value !== "boolean") {
153
+ throw new Error(`${field} must be a boolean`);
154
+ }
155
+ return value;
156
+ }
157
+ function requireJsonValue(value, field) {
158
+ if (value === null || typeof value === "string" || typeof value === "boolean") {
159
+ return value;
160
+ }
161
+ if (typeof value === "number") {
162
+ if (!Number.isFinite(value)) {
163
+ throw new Error(`${field} must contain only finite JSON numbers`);
164
+ }
165
+ return value;
166
+ }
167
+ if (Array.isArray(value)) {
168
+ return value.map((entry, index) => requireJsonValue(entry, `${field}[${index}]`));
169
+ }
170
+ if (value && typeof value === "object") {
171
+ const result = {};
172
+ for (const [key, entry] of Object.entries(value)) {
173
+ result[key] = requireJsonValue(entry, `${field}.${key}`);
174
+ }
175
+ return result;
176
+ }
177
+ throw new Error(`${field} must be valid JSON`);
178
+ }
179
+ function optionalStringProperty(input, key, options = {}) {
180
+ return input[key] === undefined ? {} : { [key]: requireString(input[key], key, options) };
181
+ }
182
+ function optionalJsonProperty(input, key) {
183
+ return input[key] === undefined ? {} : { [key]: requireJsonValue(input[key], key) };
184
+ }
185
+ function optionalJsonArrayProperty(input, key) {
186
+ if (input[key] === undefined) {
187
+ return {};
188
+ }
189
+ if (!Array.isArray(input[key])) {
190
+ throw new Error(`${key} must be an array`);
191
+ }
192
+ return { [key]: input[key].map((entry, index) => requireJsonValue(entry, `${key}[${index}]`)) };
193
+ }
194
+ function optionalObjectArrayProperty(input, key) {
195
+ if (input[key] === undefined) {
196
+ return {};
197
+ }
198
+ if (!Array.isArray(input[key])) {
199
+ throw new Error(`${key} must be an array`);
200
+ }
201
+ return {
202
+ [key]: input[key].map((entry, index) => {
203
+ const parsed = requireJsonValue(entry, `${key}[${index}]`);
204
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
205
+ throw new Error(`${key}[${index}] must be an object`);
206
+ }
207
+ return parsed;
208
+ })
209
+ };
210
+ }
211
+ function optionalBackgroundTasksProperty(input) {
212
+ const objects = optionalObjectArrayProperty(input, "background_tasks").background_tasks;
213
+ if (!objects) {
214
+ return {};
215
+ }
216
+ return {
217
+ background_tasks: objects.map((entry, index) => ({
218
+ ...entry,
219
+ id: requireString(entry.id, `background_tasks[${index}].id`),
220
+ type: requireString(entry.type, `background_tasks[${index}].type`),
221
+ status: requireString(entry.status, `background_tasks[${index}].status`),
222
+ description: requireString(entry.description, `background_tasks[${index}].description`, {
223
+ allowEmpty: true
224
+ })
225
+ }))
226
+ };
227
+ }
228
+ function optionalSessionCronsProperty(input) {
229
+ const objects = optionalObjectArrayProperty(input, "session_crons").session_crons;
230
+ if (!objects) {
231
+ return {};
232
+ }
233
+ return {
234
+ session_crons: objects.map((entry, index) => ({
235
+ ...entry,
236
+ id: requireString(entry.id, `session_crons[${index}].id`),
237
+ schedule: requireString(entry.schedule, `session_crons[${index}].schedule`),
238
+ recurring: requireBoolean(entry.recurring, `session_crons[${index}].recurring`),
239
+ prompt: requireString(entry.prompt, `session_crons[${index}].prompt`, { allowEmpty: true })
240
+ }))
241
+ };
242
+ }
243
+ //# sourceMappingURL=claude-hook-protocol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-hook-protocol.js","sourceRoot":"","sources":["../../src/claude-hook-protocol.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,247 @@
1
+ import { type ClaudeHookInput, type ClaudePermissionBehavior, type ClaudePermissionHookOutput, type ClaudePermissionRequestHookInput, type ClaudeStopFailureHookInput } from "./claude-hook-protocol.js";
2
+ declare const STORE_SCHEMA_VERSION = 1;
3
+ export type ClaudeHookStoreErrorCode = "INVALID_INPUT" | "SESSION_NOT_FOUND" | "SESSION_IDENTITY_MISMATCH" | "AMBIGUOUS_SESSION" | "PERMISSION_NOT_FOUND" | "PERMISSION_EXPIRED" | "PERMISSION_CONSUMED" | "PERMISSION_ALREADY_DECIDED" | "PERMISSION_FINGERPRINT_MISMATCH" | "AMBIGUOUS_PERMISSION" | "CORRUPT_STORE" | "LOCK_TIMEOUT";
4
+ export declare class ClaudeHookStoreError extends Error {
5
+ readonly code: ClaudeHookStoreErrorCode;
6
+ constructor(code: ClaudeHookStoreErrorCode, message: string);
7
+ }
8
+ export interface ClaudeStoredHookEvent {
9
+ id: string;
10
+ received_at: string;
11
+ claude_pid?: number;
12
+ turn_id?: string;
13
+ lease_id?: string;
14
+ conversation_id?: string;
15
+ message_id?: string;
16
+ input: ClaudeHookInput;
17
+ }
18
+ export interface ClaudeStoredPermissionDecision {
19
+ behavior: ClaudePermissionBehavior;
20
+ interrupt?: boolean;
21
+ decided_at: string;
22
+ }
23
+ export interface ClaudePendingPermission {
24
+ requestId: string;
25
+ nonce: string;
26
+ fingerprint: string;
27
+ eventId: string;
28
+ turnId?: string;
29
+ sessionId: string;
30
+ leaseId: string;
31
+ leaseMatchedBy: "session" | "pid";
32
+ claudePid?: number;
33
+ terminalTarget: string;
34
+ conversationId: string;
35
+ messageId: string;
36
+ cwd: string;
37
+ toolName: string;
38
+ toolInput: ClaudePermissionRequestHookInput["tool_input"];
39
+ createdAt: string;
40
+ expiresAt: string;
41
+ decision?: ClaudeStoredPermissionDecision;
42
+ consumedAt?: string;
43
+ }
44
+ export interface ClaudeHookSession {
45
+ schema_version: typeof STORE_SCHEMA_VERSION;
46
+ session_id: string;
47
+ cwd: string;
48
+ transcript_path: string;
49
+ claude_pid?: number;
50
+ created_at: string;
51
+ updated_at: string;
52
+ active_turn_id?: string;
53
+ events: ClaudeStoredHookEvent[];
54
+ permissions: ClaudePendingPermission[];
55
+ }
56
+ export interface ClaudeHookStoreOptions {
57
+ rootDir?: string;
58
+ now?: () => Date;
59
+ sleep?: (milliseconds: number) => Promise<void>;
60
+ permissionLeaseMs?: number;
61
+ randomId?: () => string;
62
+ }
63
+ export interface ClaudeHookRecordOptions {
64
+ claudePid?: number;
65
+ permissionLeaseMs?: number;
66
+ }
67
+ export interface ClaudeHookRecordResult {
68
+ event: ClaudeStoredHookEvent;
69
+ session: ClaudeHookSession;
70
+ permission?: ClaudePendingPermission;
71
+ managed: boolean;
72
+ lease?: ClaudeManagedLeaseResolution;
73
+ }
74
+ export interface ClaudeSessionIdentity {
75
+ sessionId?: string;
76
+ pid?: number;
77
+ cwd?: string;
78
+ requireUnique?: boolean;
79
+ }
80
+ export interface ActivateClaudeManagedLeaseOptions {
81
+ sessionId?: string;
82
+ pid?: number;
83
+ cwd: string;
84
+ conversationId: string;
85
+ messageId: string;
86
+ terminalTarget: string;
87
+ expiresAt?: string | Date;
88
+ }
89
+ export interface ClaudeManagedLease {
90
+ id: string;
91
+ sessionId?: string;
92
+ pid?: number;
93
+ cwd: string;
94
+ conversationId: string;
95
+ messageId: string;
96
+ terminalTarget: string;
97
+ createdAt: string;
98
+ updatedAt: string;
99
+ expiresAt: string;
100
+ releasedAt?: string;
101
+ }
102
+ export interface ClaudeManagedLeaseResolution {
103
+ lease: ClaudeManagedLease;
104
+ matchedBy: "session" | "pid" | "cwd";
105
+ authorizationEligible: boolean;
106
+ }
107
+ export interface ReleaseClaudeManagedLeaseOptions {
108
+ leaseId?: string;
109
+ conversationId?: string;
110
+ messageId?: string;
111
+ }
112
+ export type ClaudePermissionInspection = {
113
+ blocked: false;
114
+ approvable: false;
115
+ reason: string;
116
+ } | {
117
+ blocked: true;
118
+ approvable: false;
119
+ reason: string;
120
+ requestId?: string;
121
+ fingerprint?: string;
122
+ expiresAt?: string;
123
+ cwd?: string;
124
+ sessionId?: string;
125
+ conversationId?: string;
126
+ messageId?: string;
127
+ } | {
128
+ blocked: true;
129
+ approvable: true;
130
+ reason: string;
131
+ requestId: string;
132
+ fingerprint: string;
133
+ expiresAt: string;
134
+ eventId: string;
135
+ sessionId: string;
136
+ leaseId: string;
137
+ conversationId: string;
138
+ messageId: string;
139
+ cwd: string;
140
+ toolName: string;
141
+ toolInput: ClaudePermissionRequestHookInput["tool_input"];
142
+ kind: "run_command" | "tool_permission";
143
+ promptKind: "run_command" | "tool_permission";
144
+ command?: string;
145
+ };
146
+ export interface DecideClaudePermissionOptions {
147
+ sessionId: string;
148
+ requestId: string;
149
+ fingerprint: string;
150
+ conversationId: string;
151
+ messageId: string;
152
+ decision: ClaudePermissionBehavior;
153
+ interrupt?: boolean;
154
+ }
155
+ export interface ConsumeClaudePermissionOptions {
156
+ sessionId: string;
157
+ requestId: string;
158
+ fingerprint: string;
159
+ conversationId: string;
160
+ messageId: string;
161
+ }
162
+ export interface WaitForClaudePermissionDecisionOptions extends ConsumeClaudePermissionOptions {
163
+ timeoutMs?: number;
164
+ pollIntervalMs?: number;
165
+ }
166
+ export interface ClaudeConsumedPermissionDecision {
167
+ requestId: string;
168
+ fingerprint: string;
169
+ behavior: ClaudePermissionBehavior;
170
+ interrupt?: boolean;
171
+ decidedAt: string;
172
+ consumedAt: string;
173
+ hookOutput: ClaudePermissionHookOutput;
174
+ }
175
+ export interface DetectClaudeCompletionOptions extends ClaudeSessionIdentity {
176
+ startedAt: string | Date;
177
+ promptId?: string;
178
+ conversationId?: string;
179
+ messageId?: string;
180
+ }
181
+ export interface ClaudeStopFailure {
182
+ code: ClaudeStopFailureHookInput["error"];
183
+ details?: ClaudeStopFailureHookInput["error_details"];
184
+ message?: string;
185
+ eventId: string;
186
+ receivedAt: string;
187
+ promptId: string;
188
+ }
189
+ export type ClaudeCompletionInspection = {
190
+ status: "done";
191
+ reason: string;
192
+ sessionId: string;
193
+ promptId: string;
194
+ eventId: string;
195
+ timestamp: string;
196
+ text: string;
197
+ cwd: string;
198
+ } | {
199
+ status: "failed";
200
+ reason: string;
201
+ sessionId: string;
202
+ promptId: string;
203
+ failure: ClaudeStopFailure;
204
+ } | {
205
+ status: "pending" | "unknown";
206
+ reason: string;
207
+ sessionId?: string;
208
+ promptId?: string;
209
+ };
210
+ export declare function defaultClaudeHookStoreDir(): string;
211
+ export declare class ClaudeHookStore {
212
+ readonly rootDir: string;
213
+ private readonly now;
214
+ private readonly sleep;
215
+ private readonly permissionLeaseMs;
216
+ private readonly randomId;
217
+ constructor(options?: ClaudeHookStoreOptions);
218
+ activateLease(options: ActivateClaudeManagedLeaseOptions): ClaudeManagedLease;
219
+ resolveLease(inputOrIdentity: ClaudeHookInput | ClaudeSessionIdentity): ClaudeManagedLeaseResolution | undefined;
220
+ releaseLease(options: ReleaseClaudeManagedLeaseOptions): ClaudeManagedLease | undefined;
221
+ record(inputValue: ClaudeHookInput | unknown, options?: ClaudeHookRecordOptions): ClaudeHookRecordResult;
222
+ resolveSession(identity: ClaudeSessionIdentity): ClaudeHookSession | undefined;
223
+ inspectPermission(identity: ClaudeSessionIdentity): ClaudePermissionInspection;
224
+ decidePermission(options: DecideClaudePermissionOptions): ClaudeStoredPermissionDecision;
225
+ consumePermissionDecision(options: ConsumeClaudePermissionOptions): ClaudeConsumedPermissionDecision | undefined;
226
+ waitForPermissionDecision(options: WaitForClaudePermissionDecisionOptions): Promise<ClaudeConsumedPermissionDecision | undefined>;
227
+ detectCompletion(options: DetectClaudeCompletionOptions): ClaudeCompletionInspection;
228
+ private createPendingPermission;
229
+ private resolveLeaseFrom;
230
+ private readLeases;
231
+ private writeLeases;
232
+ private withLeaseLock;
233
+ private validatePermissionLease;
234
+ private permissionLeaseRemaining;
235
+ private requireSession;
236
+ private readSessionById;
237
+ private readAllSessions;
238
+ private writeSession;
239
+ private withSessionLock;
240
+ private sessionPath;
241
+ private uniqueEventId;
242
+ private uniqueNonce;
243
+ private uniqueValue;
244
+ private nowDate;
245
+ private nowIso;
246
+ }
247
+ export {};