@scotthuang/agent-knock-knock 0.1.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.
@@ -0,0 +1,223 @@
1
+ import { extractJsonObject } from "./protocol.js";
2
+ export function normalizeAcpxOutput({ conversationId, from, to, round, output, now = new Date() }) {
3
+ const events = [];
4
+ const lines = String(output ?? "").split(/\r?\n/);
5
+ for (const line of lines) {
6
+ const text = line.trim();
7
+ if (!text) {
8
+ continue;
9
+ }
10
+ const jsonEvent = normalizeJsonLine({ conversationId, from, to, round, text, now });
11
+ if (jsonEvent) {
12
+ events.push(jsonEvent);
13
+ continue;
14
+ }
15
+ const textEvent = normalizeTextLine({ conversationId, from, to, round, text, now });
16
+ if (textEvent) {
17
+ events.push(textEvent);
18
+ }
19
+ }
20
+ return events;
21
+ }
22
+ function normalizeJsonLine({ conversationId, from, to, round, text, now }) {
23
+ let parsed;
24
+ try {
25
+ parsed = extractJsonObject(text);
26
+ }
27
+ catch {
28
+ return null;
29
+ }
30
+ if (parsed.type && parsed.from && parsed.to && "body" in parsed) {
31
+ const event = {
32
+ event: "message",
33
+ conversationId,
34
+ round,
35
+ now,
36
+ type: parsed.type,
37
+ requires_response: parsed.requires_response,
38
+ body: typeof parsed.body === "string" ? parsed.body : JSON.stringify(parsed.body),
39
+ source: "normalized_acpx",
40
+ raw: parsed
41
+ };
42
+ return baseEvent({
43
+ ...event,
44
+ ...optionalStringField("from", parsed.from),
45
+ ...optionalStringField("to", parsed.to)
46
+ });
47
+ }
48
+ const eventName = eventNameFromJson(parsed);
49
+ if (!eventName) {
50
+ return null;
51
+ }
52
+ return baseEvent({
53
+ event: eventName,
54
+ conversationId,
55
+ from: stringOrUndefined(parsed.from) ?? from,
56
+ to: stringOrUndefined(parsed.to) ?? to,
57
+ round: numberOrUndefined(parsed.round) ?? round,
58
+ now,
59
+ status: parsed.status,
60
+ tool_name: parsed.tool_name ?? parsed.tool ?? parsed.name,
61
+ permission: parsed.permission ?? parsed.permission_name,
62
+ body: parsed.body ?? parsed.message ?? parsed.text,
63
+ source: "normalized_acpx",
64
+ raw: parsed
65
+ });
66
+ }
67
+ function normalizeTextLine({ conversationId, from, to, round, text, now }) {
68
+ const lower = text.toLowerCase();
69
+ if (isPermissionRequest(lower)) {
70
+ return baseEvent({
71
+ event: "permission_request",
72
+ conversationId,
73
+ from,
74
+ to,
75
+ round,
76
+ now,
77
+ source: "normalized_acpx",
78
+ body: text
79
+ });
80
+ }
81
+ const toolStarted = matchToolStarted(text);
82
+ if (toolStarted) {
83
+ return baseEvent({
84
+ event: "tool_call_started",
85
+ conversationId,
86
+ from,
87
+ to,
88
+ round,
89
+ now,
90
+ tool_name: toolStarted,
91
+ source: "normalized_acpx",
92
+ body: text
93
+ });
94
+ }
95
+ const toolFinished = matchToolFinished(text);
96
+ if (toolFinished) {
97
+ return baseEvent({
98
+ event: "tool_call_finished",
99
+ conversationId,
100
+ from,
101
+ to,
102
+ round,
103
+ now,
104
+ tool_name: toolFinished,
105
+ source: "normalized_acpx",
106
+ body: text
107
+ });
108
+ }
109
+ if (isAgentStatus(lower)) {
110
+ return baseEvent({
111
+ event: "agent_status",
112
+ conversationId,
113
+ from,
114
+ to,
115
+ round,
116
+ now,
117
+ status: statusFromText(lower),
118
+ source: "normalized_acpx",
119
+ body: text
120
+ });
121
+ }
122
+ return null;
123
+ }
124
+ function eventNameFromJson(parsed) {
125
+ const value = String(parsed.event ?? parsed.kind ?? "").toLowerCase();
126
+ if (["tool_call_started", "tool_call_finished", "permission_request", "agent_status"].includes(value)) {
127
+ return value;
128
+ }
129
+ if (value === "tool_call" && parsed.status === "started") {
130
+ return "tool_call_started";
131
+ }
132
+ if (value === "tool_call" && ["finished", "completed", "done"].includes(String(parsed.status))) {
133
+ return "tool_call_finished";
134
+ }
135
+ return null;
136
+ }
137
+ function isPermissionRequest(lower) {
138
+ return lower.includes("permission") && (lower.includes("request") ||
139
+ lower.includes("requires") ||
140
+ lower.includes("approve") ||
141
+ lower.includes("allow"));
142
+ }
143
+ function matchToolStarted(text) {
144
+ const patterns = [
145
+ /tool(?: call)? (?:started|starting):?\s*([A-Za-z0-9_.:-]+)/i,
146
+ /(?:running|started|starting) tool:?\s*([A-Za-z0-9_.:-]+)/i,
147
+ /tool_use(?:\.start)?:?\s*([A-Za-z0-9_.:-]+)/i
148
+ ];
149
+ return firstMatch(text, patterns);
150
+ }
151
+ function matchToolFinished(text) {
152
+ const patterns = [
153
+ /tool(?: call)? (?:finished|completed|succeeded|failed):?\s*([A-Za-z0-9_.:-]+)/i,
154
+ /(?:finished|completed|succeeded|failed) tool:?\s*([A-Za-z0-9_.:-]+)/i,
155
+ /tool_use(?:\.finish|\.end)?:?\s*([A-Za-z0-9_.:-]+)/i
156
+ ];
157
+ return firstMatch(text, patterns);
158
+ }
159
+ function firstMatch(text, patterns) {
160
+ for (const pattern of patterns) {
161
+ const match = text.match(pattern);
162
+ if (match?.[1]) {
163
+ return match[1];
164
+ }
165
+ }
166
+ return null;
167
+ }
168
+ function isAgentStatus(lower) {
169
+ return lower.includes("session") ||
170
+ lower.includes("agent") ||
171
+ lower.includes("thinking") ||
172
+ lower.includes("queued") ||
173
+ lower.includes("running") ||
174
+ lower.includes("completed") ||
175
+ lower.includes("failed") ||
176
+ lower.includes("timed out") ||
177
+ lower.includes("timeout");
178
+ }
179
+ function statusFromText(lower) {
180
+ if (lower.includes("timed out") || lower.includes("timeout")) {
181
+ return "timeout";
182
+ }
183
+ if (lower.includes("failed") || lower.includes("error")) {
184
+ return "failed";
185
+ }
186
+ if (lower.includes("completed") || lower.includes("done") || lower.includes("finished")) {
187
+ return "completed";
188
+ }
189
+ if (lower.includes("queued")) {
190
+ return "queued";
191
+ }
192
+ if (lower.includes("thinking")) {
193
+ return "thinking";
194
+ }
195
+ if (lower.includes("running")) {
196
+ return "running";
197
+ }
198
+ return "status";
199
+ }
200
+ function baseEvent({ event, conversationId, from, to, round, now, ...rest }) {
201
+ return dropUndefined({
202
+ ts: now.toISOString(),
203
+ conversation_id: conversationId,
204
+ event,
205
+ from,
206
+ to,
207
+ round,
208
+ ...dropUndefined(rest)
209
+ });
210
+ }
211
+ function dropUndefined(value) {
212
+ return Object.fromEntries(Object.entries(value).filter(([, entryValue]) => entryValue !== undefined));
213
+ }
214
+ function stringOrUndefined(value) {
215
+ return typeof value === "string" ? value : undefined;
216
+ }
217
+ function numberOrUndefined(value) {
218
+ return typeof value === "number" ? value : undefined;
219
+ }
220
+ function optionalStringField(key, value) {
221
+ return typeof value === "string" ? { [key]: value } : {};
222
+ }
223
+ //# sourceMappingURL=acpx-output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acpx-output.js","sourceRoot":"","sources":["../../src/acpx-output.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export interface BootstrapPromptOptions {
2
+ callbackCommand: string;
3
+ executorName?: string;
4
+ softLimit?: number;
5
+ hardLimit?: number;
6
+ }
7
+ export declare function claudeBootstrapPrompt(options: Omit<BootstrapPromptOptions, "executorName">): string;
8
+ export declare function executorBootstrapPrompt({ callbackCommand, executorName, softLimit, hardLimit }: BootstrapPromptOptions): string;
@@ -0,0 +1,45 @@
1
+ export function claudeBootstrapPrompt(options) {
2
+ return executorBootstrapPrompt({
3
+ executorName: "Claude Code",
4
+ ...options
5
+ });
6
+ }
7
+ export function executorBootstrapPrompt({ callbackCommand, executorName = "the coding agent", softLimit = 50, hardLimit = 100 }) {
8
+ return `You are ${executorName}, the autonomous engineering implementation agent managed by OpenClaw.
9
+
10
+ OpenClaw owns product direction, requirements interpretation, acceptance criteria, and delivery tradeoffs. Treat OpenClaw as the product manager and final product decision maker.
11
+
12
+ You own engineering execution. You may directly read and edit files, run commands, fix tests, and complete the assigned development task.
13
+
14
+ Use the fewest response-requiring rounds possible. Decide ordinary implementation details yourself when they do not affect product behavior, scope, user experience, acceptance criteria, or delivery risk.
15
+
16
+ Send question or blocked messages when:
17
+ - requirements are ambiguous or conflict
18
+ - product behavior, UX, scope, or acceptance criteria need interpretation
19
+ - an engineering problem requires a product compromise, degraded behavior, narrower scope, workaround, or changed delivery standard
20
+ - architecture, risk, permission, dependency, or environment decisions affect the final product
21
+ - you cannot continue without OpenClaw's decision
22
+
23
+ After OpenClaw answers, implement according to OpenClaw's product decision even if there are multiple engineering alternatives.
24
+
25
+ Progress reports must use type=progress and requires_response=false.
26
+
27
+ When complete, send type=done with:
28
+ - what changed
29
+ - how it was verified
30
+ - any remaining issues
31
+
32
+ Response budget:
33
+ - soft limit: ${softLimit}
34
+ - hard limit: ${hardLimit}
35
+ - after 30 response rounds, converge and choose the shortest completion path
36
+ - after 40 response rounds, finish, degrade, or provide a failure reason within 10 response rounds
37
+
38
+ Send messages back to OpenClaw by executing this command with a single structured JSON message as the final argument:
39
+
40
+ ${callbackCommand}
41
+
42
+ Replace <structured-message-json> with one shell-quoted JSON object. If the JSON contains single quotes, escape them using standard shell quoting before executing the command.
43
+ `;
44
+ }
45
+ //# sourceMappingURL=bootstrap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../src/bootstrap.ts"],"names":[],"mappings":"AAOA,MAAM,UAAU,qBAAqB,CAAC,OAAqD;IACzF,OAAO,uBAAuB,CAAC;QAC7B,YAAY,EAAE,aAAa;QAC3B,GAAG,OAAO;KACX,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,EAAE,eAAe,EAAE,YAAY,GAAG,kBAAkB,EAAE,SAAS,GAAG,EAAE,EAAE,SAAS,GAAG,GAAG,EAA0B;IACrJ,OAAO,WAAW,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;gBAyBhB,SAAS;gBACT,SAAS;;;;;;EAMvB,eAAe;;;CAGhB,CAAC;AACF,CAAC"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};