@openclawbrain/openclaw 0.2.3 → 0.3.1
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.
- package/README.md +2 -1
- package/dist/extension/index.d.ts +1 -0
- package/dist/extension/index.js +81 -0
- package/dist/extension/index.js.map +1 -0
- package/dist/extension/runtime-guard.d.ts +61 -0
- package/dist/extension/runtime-guard.js +230 -0
- package/dist/extension/runtime-guard.js.map +1 -0
- package/dist/src/cli.d.ts +19 -9
- package/dist/src/cli.js +1464 -380
- package/dist/src/cli.js.map +1 -1
- package/dist/src/daemon.d.ts +7 -4
- package/dist/src/daemon.js +275 -47
- package/dist/src/daemon.js.map +1 -1
- package/dist/src/index.d.ts +150 -2
- package/dist/src/index.js +769 -139
- package/dist/src/index.js.map +1 -1
- package/dist/src/learning-spine.d.ts +2 -1
- package/dist/src/learning-spine.js +8 -0
- package/dist/src/learning-spine.js.map +1 -1
- package/dist/src/ollama-client.d.ts +46 -0
- package/dist/src/ollama-client.js +231 -0
- package/dist/src/ollama-client.js.map +1 -0
- package/dist/src/openclaw-home-layout.d.ts +17 -0
- package/dist/src/openclaw-home-layout.js +182 -0
- package/dist/src/openclaw-home-layout.js.map +1 -0
- package/dist/src/provider-config.d.ts +64 -0
- package/dist/src/provider-config.js +306 -0
- package/dist/src/provider-config.js.map +1 -0
- package/dist/src/resolve-activation-root.d.ts +5 -5
- package/dist/src/resolve-activation-root.js +76 -34
- package/dist/src/resolve-activation-root.js.map +1 -1
- package/dist/src/session-store.js +16 -5
- package/dist/src/session-store.js.map +1 -1
- package/dist/src/session-tail.js +14 -2
- package/dist/src/session-tail.js.map +1 -1
- package/dist/src/shadow-extension-proof.d.ts +40 -0
- package/dist/src/shadow-extension-proof.js +214 -0
- package/dist/src/shadow-extension-proof.js.map +1 -0
- package/dist/src/teacher-labeler.d.ts +50 -0
- package/dist/src/teacher-labeler.js +424 -0
- package/dist/src/teacher-labeler.js.map +1 -0
- package/extension/index.ts +22 -1
- package/extension/runtime-guard.ts +17 -2
- package/package.json +8 -7
|
@@ -0,0 +1,424 @@
|
|
|
1
|
+
import { CONTRACT_IDS, checksumJsonPayload, validateTeacherSupervisionArtifact } from "@openclawbrain/contracts";
|
|
2
|
+
import { buildNormalizedEventDedupId } from "@openclawbrain/event-export";
|
|
3
|
+
const FEEDBACK_KINDS = new Set(["correction", "teaching", "approval", "suppression"]);
|
|
4
|
+
const OLLAMA_ROUTE_DECISION_STREAM = "openclaw/learning-spine/serve-time-route-decisions";
|
|
5
|
+
const DEFAULT_OLLAMA_BASE_URL = "http://127.0.0.1:11434";
|
|
6
|
+
const DEFAULT_OLLAMA_MODEL = "qwen3.5:9b";
|
|
7
|
+
const DEFAULT_OLLAMA_TIMEOUT_MS = 2_000;
|
|
8
|
+
const DEFAULT_OLLAMA_MAX_PROMPT_CHARS = 4_000;
|
|
9
|
+
const DEFAULT_OLLAMA_MAX_RESPONSE_CHARS = 4_000;
|
|
10
|
+
const DEFAULT_OLLAMA_MAX_OUTPUT_TOKENS = 192;
|
|
11
|
+
const DEFAULT_OLLAMA_MAX_ARTIFACTS_PER_EXPORT = 2;
|
|
12
|
+
const DEFAULT_OLLAMA_MAX_INTERACTIONS = 2;
|
|
13
|
+
const DEFAULT_OLLAMA_MAX_USER_MESSAGE_CHARS = 480;
|
|
14
|
+
const DEFAULT_OLLAMA_MAX_CONTEXT_IDS = 10;
|
|
15
|
+
function normalizeOptionalString(value) {
|
|
16
|
+
if (typeof value !== "string") {
|
|
17
|
+
return undefined;
|
|
18
|
+
}
|
|
19
|
+
const trimmed = value.trim();
|
|
20
|
+
return trimmed.length > 0 ? trimmed : undefined;
|
|
21
|
+
}
|
|
22
|
+
function normalizePositiveInteger(value, fieldName, fallback) {
|
|
23
|
+
const resolved = value ?? fallback;
|
|
24
|
+
if (!Number.isInteger(resolved) || resolved <= 0) {
|
|
25
|
+
throw new Error(`${fieldName} must be a positive integer`);
|
|
26
|
+
}
|
|
27
|
+
return resolved;
|
|
28
|
+
}
|
|
29
|
+
function normalizeBaseUrl(value) {
|
|
30
|
+
const normalized = normalizeOptionalString(value) ?? DEFAULT_OLLAMA_BASE_URL;
|
|
31
|
+
return normalized.replace(/\/+$/u, "");
|
|
32
|
+
}
|
|
33
|
+
function truncate(value, maxChars) {
|
|
34
|
+
if (value.length <= maxChars) {
|
|
35
|
+
return value;
|
|
36
|
+
}
|
|
37
|
+
if (maxChars <= 1) {
|
|
38
|
+
return value.slice(0, Math.max(0, maxChars));
|
|
39
|
+
}
|
|
40
|
+
return `${value.slice(0, Math.max(0, maxChars - 3))}...`;
|
|
41
|
+
}
|
|
42
|
+
function normalizeContent(value) {
|
|
43
|
+
return value.replace(/\s+/gu, " ").trim();
|
|
44
|
+
}
|
|
45
|
+
function uniqueStrings(values) {
|
|
46
|
+
return [...new Set(values)];
|
|
47
|
+
}
|
|
48
|
+
function newestIsoTimestamp(values) {
|
|
49
|
+
return [...values].sort((left, right) => Date.parse(right) - Date.parse(left))[0] ?? "1970-01-01T00:00:00.000Z";
|
|
50
|
+
}
|
|
51
|
+
function slugifyTeacherIdentityFragment(value) {
|
|
52
|
+
return value
|
|
53
|
+
.toLowerCase()
|
|
54
|
+
.replace(/[^a-z0-9]+/gu, "-")
|
|
55
|
+
.replace(/^-+|-+$/gu, "");
|
|
56
|
+
}
|
|
57
|
+
function buildTeacherPrincipal(sessionId, teacherIdentity) {
|
|
58
|
+
return {
|
|
59
|
+
teacherIdentity,
|
|
60
|
+
teacherRole: "assistant",
|
|
61
|
+
teacherAuthority: "background",
|
|
62
|
+
priorityClass: "low",
|
|
63
|
+
principalScope: {
|
|
64
|
+
kind: "session",
|
|
65
|
+
sessionId,
|
|
66
|
+
scopeKey: `session:${sessionId}|teacher:${teacherIdentity}`
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
function isFeedbackKind(value) {
|
|
71
|
+
return FEEDBACK_KINDS.has(value);
|
|
72
|
+
}
|
|
73
|
+
function extractJsonCandidate(value) {
|
|
74
|
+
const trimmed = value.trim();
|
|
75
|
+
if (trimmed.length === 0) {
|
|
76
|
+
return null;
|
|
77
|
+
}
|
|
78
|
+
const firstObjectStart = trimmed.indexOf("{");
|
|
79
|
+
const lastObjectEnd = trimmed.lastIndexOf("}");
|
|
80
|
+
if (firstObjectStart >= 0 && lastObjectEnd > firstObjectStart) {
|
|
81
|
+
return trimmed.slice(firstObjectStart, lastObjectEnd + 1);
|
|
82
|
+
}
|
|
83
|
+
const firstArrayStart = trimmed.indexOf("[");
|
|
84
|
+
const lastArrayEnd = trimmed.lastIndexOf("]");
|
|
85
|
+
if (firstArrayStart >= 0 && lastArrayEnd > firstArrayStart) {
|
|
86
|
+
return trimmed.slice(firstArrayStart, lastArrayEnd + 1);
|
|
87
|
+
}
|
|
88
|
+
return null;
|
|
89
|
+
}
|
|
90
|
+
function parseTeacherLabelerResponse(response) {
|
|
91
|
+
const candidate = extractJsonCandidate(response);
|
|
92
|
+
if (candidate === null) {
|
|
93
|
+
return [];
|
|
94
|
+
}
|
|
95
|
+
try {
|
|
96
|
+
const parsed = JSON.parse(candidate);
|
|
97
|
+
if (Array.isArray(parsed)) {
|
|
98
|
+
return parsed;
|
|
99
|
+
}
|
|
100
|
+
if (parsed !== null && typeof parsed === "object" && Array.isArray(parsed.labels)) {
|
|
101
|
+
return parsed.labels;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
return [];
|
|
106
|
+
}
|
|
107
|
+
return [];
|
|
108
|
+
}
|
|
109
|
+
function buildPromptPayload(candidates, config) {
|
|
110
|
+
return {
|
|
111
|
+
task: "teacher_supervision_labeling",
|
|
112
|
+
maxLabels: config.maxArtifactsPerExport,
|
|
113
|
+
allowedKinds: ["correction", "teaching", "approval", "suppression"],
|
|
114
|
+
interactions: candidates.map((candidate) => ({
|
|
115
|
+
interactionEventId: candidate.interaction.eventId,
|
|
116
|
+
createdAt: candidate.interaction.createdAt,
|
|
117
|
+
userMessage: truncate(candidate.userMessage, config.maxUserMessageChars),
|
|
118
|
+
routeDecision: {
|
|
119
|
+
usedLearnedRouteFn: candidate.decision.usedLearnedRouteFn,
|
|
120
|
+
fallbackReason: candidate.decision.fallbackReason,
|
|
121
|
+
selectedContextCount: candidate.decision.actualBudget.selectedCount,
|
|
122
|
+
kernelContextCount: candidate.decision.kernelContextCount,
|
|
123
|
+
brainContextCount: candidate.decision.brainContextCount,
|
|
124
|
+
chosenContextIds: candidate.decision.chosenContextIds.slice(0, config.maxContextIdsPerDecision),
|
|
125
|
+
selectedBrainContextIds: candidate.decision.selectedBrainContextIds.slice(0, config.maxContextIdsPerDecision),
|
|
126
|
+
selectedKernelContextIds: candidate.decision.selectedKernelContextIds.slice(0, config.maxContextIdsPerDecision)
|
|
127
|
+
}
|
|
128
|
+
}))
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
function buildPrompt(candidates, config) {
|
|
132
|
+
const payload = JSON.stringify(buildPromptPayload(candidates, config));
|
|
133
|
+
return [
|
|
134
|
+
"You create background teacher supervision artifacts for OpenClawBrain.",
|
|
135
|
+
"Return JSON only.",
|
|
136
|
+
'Use this shape: {"labels":[{"interactionEventId":"...","kind":"correction|teaching|approval|suppression","content":"..."}]}.',
|
|
137
|
+
`Emit at most ${config.maxArtifactsPerExport} labels.`,
|
|
138
|
+
"Only emit concise, reusable supervision grounded in the provided interaction and route decision.",
|
|
139
|
+
"Skip empty, hedged, or duplicate labels.",
|
|
140
|
+
payload
|
|
141
|
+
].join("\n");
|
|
142
|
+
}
|
|
143
|
+
function buildCandidateKey(interaction) {
|
|
144
|
+
return `${interaction.sessionId}|${interaction.channel}|${interaction.createdAt}`;
|
|
145
|
+
}
|
|
146
|
+
function matchServeTimeDecision(interaction, exactDecisions, fallbackDecisions) {
|
|
147
|
+
const exact = exactDecisions.get(interaction.eventId);
|
|
148
|
+
if (exact !== undefined) {
|
|
149
|
+
return exact;
|
|
150
|
+
}
|
|
151
|
+
return fallbackDecisions.get(buildCandidateKey(interaction)) ?? null;
|
|
152
|
+
}
|
|
153
|
+
function collectCandidates(input, config) {
|
|
154
|
+
const decisions = [...(input.serveTimeDecisions ?? [])].sort((left, right) => Date.parse(right.recordedAt) - Date.parse(left.recordedAt));
|
|
155
|
+
const exactDecisions = new Map();
|
|
156
|
+
const fallbackDecisions = new Map();
|
|
157
|
+
for (const decision of decisions) {
|
|
158
|
+
const userMessage = normalizeOptionalString(decision.userMessage);
|
|
159
|
+
if (userMessage === undefined) {
|
|
160
|
+
continue;
|
|
161
|
+
}
|
|
162
|
+
if (decision.turnCompileEventId !== null && !exactDecisions.has(decision.turnCompileEventId)) {
|
|
163
|
+
exactDecisions.set(decision.turnCompileEventId, decision);
|
|
164
|
+
}
|
|
165
|
+
const turnCreatedAt = normalizeOptionalString(decision.turnCreatedAt);
|
|
166
|
+
if (turnCreatedAt !== undefined && decision.sessionId !== null && decision.channel !== null) {
|
|
167
|
+
const key = `${decision.sessionId}|${decision.channel}|${turnCreatedAt}`;
|
|
168
|
+
if (!fallbackDecisions.has(key)) {
|
|
169
|
+
fallbackDecisions.set(key, decision);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
return input.normalizedEventExport.interactionEvents
|
|
174
|
+
.filter((interaction) => interaction.kind === "memory_compiled")
|
|
175
|
+
.sort((left, right) => Date.parse(right.createdAt) - Date.parse(left.createdAt))
|
|
176
|
+
.map((interaction) => {
|
|
177
|
+
const decision = matchServeTimeDecision(interaction, exactDecisions, fallbackDecisions);
|
|
178
|
+
const userMessage = normalizeOptionalString(decision?.userMessage);
|
|
179
|
+
if (decision === null || userMessage === undefined) {
|
|
180
|
+
return null;
|
|
181
|
+
}
|
|
182
|
+
return {
|
|
183
|
+
interaction,
|
|
184
|
+
decision,
|
|
185
|
+
userMessage
|
|
186
|
+
};
|
|
187
|
+
})
|
|
188
|
+
.filter((candidate) => candidate !== null)
|
|
189
|
+
.slice(0, config.maxInteractionsPerExport);
|
|
190
|
+
}
|
|
191
|
+
function fitCandidatesToPromptBudget(candidates, config) {
|
|
192
|
+
const accepted = [];
|
|
193
|
+
for (const candidate of candidates) {
|
|
194
|
+
const nextAccepted = [...accepted, candidate];
|
|
195
|
+
if (buildPrompt(nextAccepted, config).length > config.maxPromptChars) {
|
|
196
|
+
break;
|
|
197
|
+
}
|
|
198
|
+
accepted.push(candidate);
|
|
199
|
+
}
|
|
200
|
+
return accepted;
|
|
201
|
+
}
|
|
202
|
+
function dedupExistingArtifactIds(artifacts) {
|
|
203
|
+
return new Set((artifacts ?? []).map((artifact) => artifact.dedupId));
|
|
204
|
+
}
|
|
205
|
+
function buildGeneratedArtifact(input) {
|
|
206
|
+
const newestSourceCreatedAt = newestIsoTimestamp([
|
|
207
|
+
input.candidate.interaction.createdAt,
|
|
208
|
+
input.candidate.decision.recordedAt,
|
|
209
|
+
input.candidate.decision.turnCreatedAt ?? input.candidate.decision.recordedAt
|
|
210
|
+
].filter((value) => typeof value === "string" && value.length > 0));
|
|
211
|
+
const ageMs = Math.max(0, Date.parse(input.observedAt) - Date.parse(newestSourceCreatedAt));
|
|
212
|
+
const dedupId = checksumJsonPayload({
|
|
213
|
+
provider: "ollama",
|
|
214
|
+
teacherIdentity: input.teacherIdentity,
|
|
215
|
+
interactionDedupId: buildNormalizedEventDedupId(input.candidate.interaction),
|
|
216
|
+
kind: input.kind,
|
|
217
|
+
content: normalizeContent(input.content)
|
|
218
|
+
});
|
|
219
|
+
const sourceEventIds = uniqueStrings([input.candidate.interaction.eventId, input.candidate.decision.turnCompileEventId ?? input.candidate.interaction.eventId].filter((value) => typeof value === "string" && value.length > 0));
|
|
220
|
+
const artifact = {
|
|
221
|
+
contract: CONTRACT_IDS.teacherSupervisionArtifact,
|
|
222
|
+
artifactId: `teacher-${dedupId}`,
|
|
223
|
+
dedupId,
|
|
224
|
+
kind: input.kind,
|
|
225
|
+
createdAt: input.observedAt,
|
|
226
|
+
source: {
|
|
227
|
+
runtimeOwner: "openclaw",
|
|
228
|
+
sessionId: input.candidate.interaction.sessionId,
|
|
229
|
+
channel: input.candidate.interaction.channel,
|
|
230
|
+
sourceStreams: uniqueStrings([input.candidate.interaction.source.stream, OLLAMA_ROUTE_DECISION_STREAM]),
|
|
231
|
+
eventRange: {
|
|
232
|
+
start: input.eventRange.start,
|
|
233
|
+
end: input.eventRange.end,
|
|
234
|
+
count: input.eventRange.count
|
|
235
|
+
},
|
|
236
|
+
eventExportDigest: input.eventExportDigest
|
|
237
|
+
},
|
|
238
|
+
sourceEventIds,
|
|
239
|
+
relatedInteractionId: input.candidate.interaction.eventId,
|
|
240
|
+
principal: buildTeacherPrincipal(input.candidate.interaction.sessionId, input.teacherIdentity),
|
|
241
|
+
content: normalizeContent(input.content),
|
|
242
|
+
freshness: {
|
|
243
|
+
status: ageMs <= input.staleAfterMs ? "fresh" : "stale",
|
|
244
|
+
observedAt: input.observedAt,
|
|
245
|
+
newestSourceCreatedAt,
|
|
246
|
+
ageMs,
|
|
247
|
+
staleAfterMs: input.staleAfterMs
|
|
248
|
+
}
|
|
249
|
+
};
|
|
250
|
+
const validationErrors = validateTeacherSupervisionArtifact(artifact);
|
|
251
|
+
if (validationErrors.length > 0) {
|
|
252
|
+
throw new Error(`ollama teacher artifact is invalid: ${validationErrors.join("; ")}`);
|
|
253
|
+
}
|
|
254
|
+
return artifact;
|
|
255
|
+
}
|
|
256
|
+
function normalizeOllamaTeacherLabelerConfig(config) {
|
|
257
|
+
const model = normalizeOptionalString(config.model) ?? DEFAULT_OLLAMA_MODEL;
|
|
258
|
+
const teacherIdentity = normalizeOptionalString(config.teacherIdentity) ?? `openclaw/teacher/ollama/${slugifyTeacherIdentityFragment(model)}`;
|
|
259
|
+
return {
|
|
260
|
+
provider: "ollama",
|
|
261
|
+
baseUrl: normalizeBaseUrl(config.baseUrl),
|
|
262
|
+
model,
|
|
263
|
+
timeoutMs: normalizePositiveInteger(config.timeoutMs, "teacherLabeler.timeoutMs", DEFAULT_OLLAMA_TIMEOUT_MS),
|
|
264
|
+
maxPromptChars: normalizePositiveInteger(config.maxPromptChars, "teacherLabeler.maxPromptChars", DEFAULT_OLLAMA_MAX_PROMPT_CHARS),
|
|
265
|
+
maxResponseChars: normalizePositiveInteger(config.maxResponseChars, "teacherLabeler.maxResponseChars", DEFAULT_OLLAMA_MAX_RESPONSE_CHARS),
|
|
266
|
+
maxOutputTokens: normalizePositiveInteger(config.maxOutputTokens, "teacherLabeler.maxOutputTokens", DEFAULT_OLLAMA_MAX_OUTPUT_TOKENS),
|
|
267
|
+
maxArtifactsPerExport: normalizePositiveInteger(config.maxArtifactsPerExport, "teacherLabeler.maxArtifactsPerExport", DEFAULT_OLLAMA_MAX_ARTIFACTS_PER_EXPORT),
|
|
268
|
+
maxInteractionsPerExport: normalizePositiveInteger(config.maxInteractionsPerExport, "teacherLabeler.maxInteractionsPerExport", DEFAULT_OLLAMA_MAX_INTERACTIONS),
|
|
269
|
+
maxUserMessageChars: normalizePositiveInteger(config.maxUserMessageChars, "teacherLabeler.maxUserMessageChars", DEFAULT_OLLAMA_MAX_USER_MESSAGE_CHARS),
|
|
270
|
+
maxContextIdsPerDecision: normalizePositiveInteger(config.maxContextIdsPerDecision, "teacherLabeler.maxContextIdsPerDecision", DEFAULT_OLLAMA_MAX_CONTEXT_IDS),
|
|
271
|
+
teacherIdentity,
|
|
272
|
+
client: config.client ?? createHttpOllamaTeacherLabelerClient(normalizeBaseUrl(config.baseUrl))
|
|
273
|
+
};
|
|
274
|
+
}
|
|
275
|
+
class HttpOllamaTeacherLabelerClient {
|
|
276
|
+
baseUrl;
|
|
277
|
+
constructor(baseUrl) {
|
|
278
|
+
this.baseUrl = baseUrl;
|
|
279
|
+
}
|
|
280
|
+
async generate(input) {
|
|
281
|
+
const controller = new AbortController();
|
|
282
|
+
const timeout = setTimeout(() => controller.abort(), input.timeoutMs);
|
|
283
|
+
try {
|
|
284
|
+
const response = await fetch(`${this.baseUrl}/api/generate`, {
|
|
285
|
+
method: "POST",
|
|
286
|
+
headers: {
|
|
287
|
+
"content-type": "application/json"
|
|
288
|
+
},
|
|
289
|
+
body: JSON.stringify({
|
|
290
|
+
model: input.model,
|
|
291
|
+
prompt: input.prompt,
|
|
292
|
+
stream: false,
|
|
293
|
+
options: {
|
|
294
|
+
num_predict: input.maxOutputTokens,
|
|
295
|
+
temperature: 0
|
|
296
|
+
}
|
|
297
|
+
}),
|
|
298
|
+
signal: controller.signal
|
|
299
|
+
});
|
|
300
|
+
if (!response.ok) {
|
|
301
|
+
throw new Error(`ollama generate failed with status ${response.status}`);
|
|
302
|
+
}
|
|
303
|
+
const parsed = (await response.json());
|
|
304
|
+
if (typeof parsed.error === "string" && parsed.error.trim().length > 0) {
|
|
305
|
+
throw new Error(parsed.error);
|
|
306
|
+
}
|
|
307
|
+
if (typeof parsed.response !== "string") {
|
|
308
|
+
throw new Error("ollama generate response field is missing");
|
|
309
|
+
}
|
|
310
|
+
return {
|
|
311
|
+
response: parsed.response
|
|
312
|
+
};
|
|
313
|
+
}
|
|
314
|
+
finally {
|
|
315
|
+
clearTimeout(timeout);
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
export function createHttpOllamaTeacherLabelerClient(baseUrl = DEFAULT_OLLAMA_BASE_URL) {
|
|
320
|
+
return new HttpOllamaTeacherLabelerClient(normalizeBaseUrl(baseUrl));
|
|
321
|
+
}
|
|
322
|
+
export function createOllamaTeacherLabeler(config) {
|
|
323
|
+
const normalized = normalizeOllamaTeacherLabelerConfig(config);
|
|
324
|
+
return {
|
|
325
|
+
async label(input) {
|
|
326
|
+
const candidates = collectCandidates(input, normalized);
|
|
327
|
+
if (candidates.length === 0) {
|
|
328
|
+
return {
|
|
329
|
+
artifacts: [],
|
|
330
|
+
status: "skipped",
|
|
331
|
+
detail: "no_matching_interaction_text"
|
|
332
|
+
};
|
|
333
|
+
}
|
|
334
|
+
const budgetedCandidates = fitCandidatesToPromptBudget(candidates, normalized);
|
|
335
|
+
if (budgetedCandidates.length === 0) {
|
|
336
|
+
return {
|
|
337
|
+
artifacts: [],
|
|
338
|
+
status: "skipped",
|
|
339
|
+
detail: "prompt_budget_exhausted"
|
|
340
|
+
};
|
|
341
|
+
}
|
|
342
|
+
const prompt = buildPrompt(budgetedCandidates, normalized);
|
|
343
|
+
try {
|
|
344
|
+
const generated = await normalized.client.generate({
|
|
345
|
+
model: normalized.model,
|
|
346
|
+
prompt,
|
|
347
|
+
maxOutputTokens: normalized.maxOutputTokens,
|
|
348
|
+
timeoutMs: normalized.timeoutMs
|
|
349
|
+
});
|
|
350
|
+
if (generated.response.length > normalized.maxResponseChars) {
|
|
351
|
+
return {
|
|
352
|
+
artifacts: [],
|
|
353
|
+
status: "fail_open",
|
|
354
|
+
detail: "response_budget_exhausted"
|
|
355
|
+
};
|
|
356
|
+
}
|
|
357
|
+
const parsedLabels = parseTeacherLabelerResponse(generated.response);
|
|
358
|
+
if (parsedLabels.length === 0) {
|
|
359
|
+
return {
|
|
360
|
+
artifacts: [],
|
|
361
|
+
status: "skipped",
|
|
362
|
+
detail: "no_labels_emitted"
|
|
363
|
+
};
|
|
364
|
+
}
|
|
365
|
+
const candidateByInteractionId = new Map(budgetedCandidates.map((candidate) => [candidate.interaction.eventId, candidate]));
|
|
366
|
+
const seenDedupIds = dedupExistingArtifactIds(input.existingArtifacts);
|
|
367
|
+
const nextArtifacts = [];
|
|
368
|
+
for (const label of parsedLabels) {
|
|
369
|
+
if (nextArtifacts.length >= normalized.maxArtifactsPerExport) {
|
|
370
|
+
break;
|
|
371
|
+
}
|
|
372
|
+
const interactionEventId = typeof label.interactionEventId === "string" && label.interactionEventId.trim().length > 0
|
|
373
|
+
? label.interactionEventId.trim()
|
|
374
|
+
: null;
|
|
375
|
+
const kind = typeof label.kind === "string" && isFeedbackKind(label.kind) ? label.kind : null;
|
|
376
|
+
const content = typeof label.content === "string" && normalizeContent(label.content).length > 0
|
|
377
|
+
? normalizeContent(label.content)
|
|
378
|
+
: null;
|
|
379
|
+
if (interactionEventId === null || kind === null || content === null) {
|
|
380
|
+
continue;
|
|
381
|
+
}
|
|
382
|
+
const candidate = candidateByInteractionId.get(interactionEventId);
|
|
383
|
+
if (candidate === undefined) {
|
|
384
|
+
continue;
|
|
385
|
+
}
|
|
386
|
+
const artifact = buildGeneratedArtifact({
|
|
387
|
+
candidate,
|
|
388
|
+
kind,
|
|
389
|
+
content,
|
|
390
|
+
observedAt: input.observedAt,
|
|
391
|
+
staleAfterMs: input.staleAfterMs,
|
|
392
|
+
eventRange: input.normalizedEventExport.range,
|
|
393
|
+
eventExportDigest: input.normalizedEventExport.provenance.exportDigest,
|
|
394
|
+
teacherIdentity: normalized.teacherIdentity
|
|
395
|
+
});
|
|
396
|
+
if (seenDedupIds.has(artifact.dedupId)) {
|
|
397
|
+
continue;
|
|
398
|
+
}
|
|
399
|
+
seenDedupIds.add(artifact.dedupId);
|
|
400
|
+
nextArtifacts.push(artifact);
|
|
401
|
+
}
|
|
402
|
+
return {
|
|
403
|
+
artifacts: nextArtifacts,
|
|
404
|
+
status: "ok",
|
|
405
|
+
detail: `candidates=${budgetedCandidates.length};labels=${nextArtifacts.length}`
|
|
406
|
+
};
|
|
407
|
+
}
|
|
408
|
+
catch (error) {
|
|
409
|
+
return {
|
|
410
|
+
artifacts: [],
|
|
411
|
+
status: "fail_open",
|
|
412
|
+
detail: error instanceof Error ? error.message : String(error)
|
|
413
|
+
};
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
};
|
|
417
|
+
}
|
|
418
|
+
export function createTeacherLabeler(config) {
|
|
419
|
+
if (config === undefined || config === null || config.provider === "none") {
|
|
420
|
+
return null;
|
|
421
|
+
}
|
|
422
|
+
return createOllamaTeacherLabeler(config);
|
|
423
|
+
}
|
|
424
|
+
//# sourceMappingURL=teacher-labeler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"teacher-labeler.js","sourceRoot":"","sources":["../../src/teacher-labeler.ts"],"names":[],"mappings":"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"}
|
package/extension/index.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* OpenClawBrain extension template — canonical, pre-built, versioned with the package.
|
|
3
3
|
*
|
|
4
|
-
* The placeholder __ACTIVATION_ROOT__ is replaced by `openclawbrain
|
|
4
|
+
* The placeholder __ACTIVATION_ROOT__ is replaced by `openclawbrain install`
|
|
5
5
|
* with the real activation root path at install time.
|
|
6
6
|
*
|
|
7
7
|
* Design constraints:
|
|
@@ -9,13 +9,17 @@
|
|
|
9
9
|
* - Compilation errors → fail-open, never breaks the session
|
|
10
10
|
* - Missing activation root → fail-open with console.warn
|
|
11
11
|
*/
|
|
12
|
+
import { fileURLToPath } from "node:url";
|
|
13
|
+
|
|
12
14
|
import { compileRuntimeContext } from "@openclawbrain/openclaw";
|
|
13
15
|
import {
|
|
14
16
|
createBeforePromptBuildHandler,
|
|
17
|
+
isActivationRootPlaceholder,
|
|
15
18
|
validateExtensionRegistrationApi
|
|
16
19
|
} from "./runtime-guard.js";
|
|
17
20
|
|
|
18
21
|
const ACTIVATION_ROOT = "__ACTIVATION_ROOT__";
|
|
22
|
+
const EXTENSION_ENTRY_PATH = fileURLToPath(import.meta.url);
|
|
19
23
|
const warnedDiagnostics = new Set<string>();
|
|
20
24
|
|
|
21
25
|
function warnOnce(key: string, message: string): void {
|
|
@@ -56,6 +60,21 @@ async function reportDiagnostic(input: { key: string; message: string; once?: bo
|
|
|
56
60
|
await appendLocalDiagnosticLog(input.message);
|
|
57
61
|
}
|
|
58
62
|
|
|
63
|
+
function announceStartupBreadcrumb(): void {
|
|
64
|
+
if (isActivationRootPlaceholder(ACTIVATION_ROOT)) {
|
|
65
|
+
warnOnce(
|
|
66
|
+
"startup-brain-not-yet-loaded",
|
|
67
|
+
"[openclawbrain] BRAIN NOT YET LOADED: install has not pinned ACTIVATION_ROOT yet. Run: openclawbrain install --openclaw-home <path>"
|
|
68
|
+
);
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
warnOnce(
|
|
73
|
+
"startup-brain-loaded",
|
|
74
|
+
`[openclawbrain] BRAIN LOADED: runtime hook registered for before_prompt_build (activationRoot=${ACTIVATION_ROOT})`
|
|
75
|
+
);
|
|
76
|
+
}
|
|
77
|
+
|
|
59
78
|
export default function register(api: unknown) {
|
|
60
79
|
const registration = validateExtensionRegistrationApi(api);
|
|
61
80
|
if (!registration.ok) {
|
|
@@ -68,12 +87,14 @@ export default function register(api: unknown) {
|
|
|
68
87
|
"before_prompt_build",
|
|
69
88
|
createBeforePromptBuildHandler({
|
|
70
89
|
activationRoot: ACTIVATION_ROOT,
|
|
90
|
+
extensionEntryPath: EXTENSION_ENTRY_PATH,
|
|
71
91
|
compileRuntimeContext,
|
|
72
92
|
reportDiagnostic,
|
|
73
93
|
debug: (message) => console.debug(message)
|
|
74
94
|
}),
|
|
75
95
|
{ priority: 5 }
|
|
76
96
|
);
|
|
97
|
+
announceStartupBreadcrumb();
|
|
77
98
|
} catch (error) {
|
|
78
99
|
const detail = error instanceof Error ? error.stack ?? error.message : String(error);
|
|
79
100
|
void reportDiagnostic({
|
|
@@ -3,6 +3,11 @@ export interface ExtensionCompileInput {
|
|
|
3
3
|
message: string;
|
|
4
4
|
sessionId?: string;
|
|
5
5
|
channel?: string;
|
|
6
|
+
_serveRouteBreadcrumbs?: {
|
|
7
|
+
invocationSurface: "installed_extension_before_prompt_build";
|
|
8
|
+
hostEvent: "before_prompt_build";
|
|
9
|
+
installedEntryPath: string;
|
|
10
|
+
};
|
|
6
11
|
}
|
|
7
12
|
|
|
8
13
|
export interface ExtensionCompileSuccess {
|
|
@@ -129,6 +134,7 @@ export function createBeforePromptBuildHandler(input: {
|
|
|
129
134
|
compileRuntimeContext: ExtensionCompileRuntimeContext;
|
|
130
135
|
reportDiagnostic: (diagnostic: ExtensionDiagnostic) => void | Promise<void>;
|
|
131
136
|
debug?: (message: string) => void;
|
|
137
|
+
extensionEntryPath?: string;
|
|
132
138
|
}): (event: unknown, ctx: unknown) => Promise<Record<string, unknown>> {
|
|
133
139
|
return async (event: unknown, _ctx: unknown) => {
|
|
134
140
|
if (isActivationRootPlaceholder(input.activationRoot)) {
|
|
@@ -136,7 +142,7 @@ export function createBeforePromptBuildHandler(input: {
|
|
|
136
142
|
key: "activation-root-placeholder",
|
|
137
143
|
once: true,
|
|
138
144
|
message:
|
|
139
|
-
"[openclawbrain]
|
|
145
|
+
"[openclawbrain] BRAIN NOT YET LOADED: ACTIVATION_ROOT is still a placeholder. Run: openclawbrain install --openclaw-home <path>"
|
|
140
146
|
});
|
|
141
147
|
return {};
|
|
142
148
|
}
|
|
@@ -156,7 +162,16 @@ export function createBeforePromptBuildHandler(input: {
|
|
|
156
162
|
activationRoot: input.activationRoot,
|
|
157
163
|
message: normalized.event.message,
|
|
158
164
|
...(normalized.event.sessionId !== undefined ? { sessionId: normalized.event.sessionId } : {}),
|
|
159
|
-
...(normalized.event.channel !== undefined ? { channel: normalized.event.channel } : {})
|
|
165
|
+
...(normalized.event.channel !== undefined ? { channel: normalized.event.channel } : {}),
|
|
166
|
+
...(input.extensionEntryPath === undefined
|
|
167
|
+
? {}
|
|
168
|
+
: {
|
|
169
|
+
_serveRouteBreadcrumbs: {
|
|
170
|
+
invocationSurface: "installed_extension_before_prompt_build" as const,
|
|
171
|
+
hostEvent: "before_prompt_build" as const,
|
|
172
|
+
installedEntryPath: input.extensionEntryPath
|
|
173
|
+
}
|
|
174
|
+
})
|
|
160
175
|
});
|
|
161
176
|
|
|
162
177
|
if (!result.ok) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@openclawbrain/openclaw",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.1",
|
|
4
4
|
"description": "Primary OpenClawBrain front door for OpenClaw attach, compile, event export, status, and rollback.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/src/index.js",
|
|
@@ -38,18 +38,19 @@
|
|
|
38
38
|
},
|
|
39
39
|
"files": [
|
|
40
40
|
"dist/src",
|
|
41
|
+
"dist/extension",
|
|
41
42
|
"extension"
|
|
42
43
|
],
|
|
43
44
|
"publishConfig": {
|
|
44
45
|
"access": "public"
|
|
45
46
|
},
|
|
46
47
|
"dependencies": {
|
|
47
|
-
"@openclawbrain/compiler": "0.
|
|
48
|
-
"@openclawbrain/
|
|
49
|
-
"@openclawbrain/
|
|
50
|
-
"@openclawbrain/learner": "0.
|
|
51
|
-
"@openclawbrain/pack-format": "0.
|
|
52
|
-
"@openclawbrain/event-export": "0.
|
|
48
|
+
"@openclawbrain/compiler": "0.3.0",
|
|
49
|
+
"@openclawbrain/contracts": "0.3.0",
|
|
50
|
+
"@openclawbrain/events": "0.3.0",
|
|
51
|
+
"@openclawbrain/learner": "0.3.0",
|
|
52
|
+
"@openclawbrain/pack-format": "0.3.0",
|
|
53
|
+
"@openclawbrain/event-export": "0.3.0"
|
|
53
54
|
},
|
|
54
55
|
"bin": {
|
|
55
56
|
"openclawbrain": "./dist/src/cli.js",
|