@openclawbrain/openclaw 0.2.3 → 0.3.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.
Files changed (36) hide show
  1. package/dist/extension/index.d.ts +1 -0
  2. package/dist/extension/index.js +73 -0
  3. package/dist/extension/index.js.map +1 -0
  4. package/dist/extension/runtime-guard.d.ts +61 -0
  5. package/dist/extension/runtime-guard.js +230 -0
  6. package/dist/extension/runtime-guard.js.map +1 -0
  7. package/dist/src/cli.d.ts +8 -4
  8. package/dist/src/cli.js +501 -154
  9. package/dist/src/cli.js.map +1 -1
  10. package/dist/src/daemon.d.ts +7 -4
  11. package/dist/src/daemon.js +275 -47
  12. package/dist/src/daemon.js.map +1 -1
  13. package/dist/src/index.d.ts +150 -2
  14. package/dist/src/index.js +769 -139
  15. package/dist/src/index.js.map +1 -1
  16. package/dist/src/learning-spine.d.ts +2 -1
  17. package/dist/src/learning-spine.js +8 -0
  18. package/dist/src/learning-spine.js.map +1 -1
  19. package/dist/src/ollama-client.d.ts +46 -0
  20. package/dist/src/ollama-client.js +231 -0
  21. package/dist/src/ollama-client.js.map +1 -0
  22. package/dist/src/provider-config.d.ts +28 -0
  23. package/dist/src/provider-config.js +150 -0
  24. package/dist/src/provider-config.js.map +1 -0
  25. package/dist/src/resolve-activation-root.d.ts +3 -3
  26. package/dist/src/resolve-activation-root.js +68 -21
  27. package/dist/src/resolve-activation-root.js.map +1 -1
  28. package/dist/src/shadow-extension-proof.d.ts +40 -0
  29. package/dist/src/shadow-extension-proof.js +214 -0
  30. package/dist/src/shadow-extension-proof.js.map +1 -0
  31. package/dist/src/teacher-labeler.d.ts +50 -0
  32. package/dist/src/teacher-labeler.js +424 -0
  33. package/dist/src/teacher-labeler.js.map +1 -0
  34. package/extension/index.ts +5 -1
  35. package/extension/runtime-guard.ts +17 -2
  36. 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":"AAAA,OAAO,EACL,YAAY,EACZ,mBAAmB,EAMnB,kCAAkC,EACnC,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,2BAA2B,EAAE,MAAM,6BAA6B,CAAC;AAG1E,MAAM,cAAc,GAAG,IAAI,GAAG,CAAoB,CAAC,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC,CAAC;AACzG,MAAM,4BAA4B,GAAG,oDAAoD,CAAC;AAC1F,MAAM,uBAAuB,GAAG,wBAAwB,CAAC;AACzD,MAAM,oBAAoB,GAAG,YAAY,CAAC;AAC1C,MAAM,yBAAyB,GAAG,KAAK,CAAC;AACxC,MAAM,+BAA+B,GAAG,KAAK,CAAC;AAC9C,MAAM,iCAAiC,GAAG,KAAK,CAAC;AAChD,MAAM,gCAAgC,GAAG,GAAG,CAAC;AAC7C,MAAM,uCAAuC,GAAG,CAAC,CAAC;AAClD,MAAM,+BAA+B,GAAG,CAAC,CAAC;AAC1C,MAAM,qCAAqC,GAAG,GAAG,CAAC;AAClD,MAAM,8BAA8B,GAAG,EAAE,CAAC;AAwG1C,SAAS,uBAAuB,CAAC,KAAgC;IAC/D,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;AAClD,CAAC;AAED,SAAS,wBAAwB,CAAC,KAAyB,EAAE,SAAiB,EAAE,QAAgB;IAC9F,MAAM,QAAQ,GAAG,KAAK,IAAI,QAAQ,CAAC;IACnC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,QAAQ,IAAI,CAAC,EAAE,CAAC;QACjD,MAAM,IAAI,KAAK,CAAC,GAAG,SAAS,6BAA6B,CAAC,CAAC;IAC7D,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAyB;IACjD,MAAM,UAAU,GAAG,uBAAuB,CAAC,KAAK,CAAC,IAAI,uBAAuB,CAAC;IAC7E,OAAO,UAAU,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,QAAQ,CAAC,KAAa,EAAE,QAAgB;IAC/C,IAAI,KAAK,CAAC,MAAM,IAAI,QAAQ,EAAE,CAAC;QAC7B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,QAAQ,IAAI,CAAC,EAAE,CAAC;QAClB,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC/C,CAAC;IAED,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC;AAC3D,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAa;IACrC,OAAO,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;AAC5C,CAAC;AAED,SAAS,aAAa,CAAC,MAAyB;IAC9C,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;AAC9B,CAAC;AAED,SAAS,kBAAkB,CAAC,MAAyB;IACnD,OAAO,CAAC,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,0BAA0B,CAAC;AAClH,CAAC;AAED,SAAS,8BAA8B,CAAC,KAAa;IACnD,OAAO,KAAK;SACT,WAAW,EAAE;SACb,OAAO,CAAC,cAAc,EAAE,GAAG,CAAC;SAC5B,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;AAC9B,CAAC;AAED,SAAS,qBAAqB,CAAC,SAAiB,EAAE,eAAuB;IACvE,OAAO;QACL,eAAe;QACf,WAAW,EAAE,WAAW;QACxB,gBAAgB,EAAE,YAAY;QAC9B,aAAa,EAAE,KAAK;QACpB,cAAc,EAAE;YACd,IAAI,EAAE,SAAS;YACf,SAAS;YACT,QAAQ,EAAE,WAAW,SAAS,YAAY,eAAe,EAAE;SAC5D;KACF,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,KAAa;IACnC,OAAO,cAAc,CAAC,GAAG,CAAC,KAA0B,CAAC,CAAC;AACxD,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAa;IACzC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC9C,MAAM,aAAa,GAAG,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAC/C,IAAI,gBAAgB,IAAI,CAAC,IAAI,aAAa,GAAG,gBAAgB,EAAE,CAAC;QAC9D,OAAO,OAAO,CAAC,KAAK,CAAC,gBAAgB,EAAE,aAAa,GAAG,CAAC,CAAC,CAAC;IAC5D,CAAC;IAED,MAAM,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC7C,MAAM,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAC9C,IAAI,eAAe,IAAI,CAAC,IAAI,YAAY,GAAG,eAAe,EAAE,CAAC;QAC3D,OAAO,OAAO,CAAC,KAAK,CAAC,eAAe,EAAE,YAAY,GAAG,CAAC,CAAC,CAAC;IAC1D,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,2BAA2B,CAAC,QAAgB;IACnD,MAAM,SAAS,GAAG,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IACjD,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;QACvB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAY,CAAC;QAChD,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1B,OAAO,MAAyC,CAAC;QACnD,CAAC;QACD,IAAI,MAAM,KAAK,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAE,MAA+B,CAAC,MAAM,CAAC,EAAE,CAAC;YAC5G,OAAQ,MAAsD,CAAC,MAAM,CAAC;QACxE,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,kBAAkB,CACzB,UAAgD,EAChD,MAAmD;IAEnD,OAAO;QACL,IAAI,EAAE,8BAA8B;QACpC,SAAS,EAAE,MAAM,CAAC,qBAAqB;QACvC,YAAY,EAAE,CAAC,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,aAAa,CAAC;QACnE,YAAY,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;YAC3C,kBAAkB,EAAE,SAAS,CAAC,WAAW,CAAC,OAAO;YACjD,SAAS,EAAE,SAAS,CAAC,WAAW,CAAC,SAAS;YAC1C,WAAW,EAAE,QAAQ,CAAC,SAAS,CAAC,WAAW,EAAE,MAAM,CAAC,mBAAmB,CAAC;YACxE,aAAa,EAAE;gBACb,kBAAkB,EAAE,SAAS,CAAC,QAAQ,CAAC,kBAAkB;gBACzD,cAAc,EAAE,SAAS,CAAC,QAAQ,CAAC,cAAc;gBACjD,oBAAoB,EAAE,SAAS,CAAC,QAAQ,CAAC,YAAY,CAAC,aAAa;gBACnE,kBAAkB,EAAE,SAAS,CAAC,QAAQ,CAAC,kBAAkB;gBACzD,iBAAiB,EAAE,SAAS,CAAC,QAAQ,CAAC,iBAAiB;gBACvD,gBAAgB,EAAE,SAAS,CAAC,QAAQ,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,wBAAwB,CAAC;gBAC/F,uBAAuB,EAAE,SAAS,CAAC,QAAQ,CAAC,uBAAuB,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,wBAAwB,CAAC;gBAC7G,wBAAwB,EAAE,SAAS,CAAC,QAAQ,CAAC,wBAAwB,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,wBAAwB,CAAC;aAChH;SACF,CAAC,CAAC;KACJ,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,UAAgD,EAAE,MAAmD;IACxH,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;IACvE,OAAO;QACL,wEAAwE;QACxE,mBAAmB;QACnB,8HAA8H;QAC9H,gBAAgB,MAAM,CAAC,qBAAqB,UAAU;QACtD,kGAAkG;QAClG,0CAA0C;QAC1C,OAAO;KACR,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,SAAS,iBAAiB,CAAC,WAA+B;IACxD,OAAO,GAAG,WAAW,CAAC,SAAS,IAAI,WAAW,CAAC,OAAO,IAAI,WAAW,CAAC,SAAS,EAAE,CAAC;AACpF,CAAC;AAED,SAAS,sBAAsB,CAC7B,WAA+B,EAC/B,cAA8E,EAC9E,iBAAiF;IAEjF,MAAM,KAAK,GAAG,cAAc,CAAC,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IACtD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,iBAAiB,CAAC,GAAG,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC,IAAI,IAAI,CAAC;AACvE,CAAC;AAED,SAAS,iBAAiB,CACxB,KAA+B,EAC/B,MAAmD;IAEnD,MAAM,SAAS,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,kBAAkB,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAC1D,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAC5E,CAAC;IACF,MAAM,cAAc,GAAG,IAAI,GAAG,EAAqD,CAAC;IACpF,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAqD,CAAC;IAEvF,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,MAAM,WAAW,GAAG,uBAAuB,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;QAClE,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;YAC9B,SAAS;QACX,CAAC;QAED,IAAI,QAAQ,CAAC,kBAAkB,KAAK,IAAI,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;YAC7F,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,kBAAkB,EAAE,QAAQ,CAAC,CAAC;QAC5D,CAAC;QACD,MAAM,aAAa,GAAG,uBAAuB,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;QACtE,IAAI,aAAa,KAAK,SAAS,IAAI,QAAQ,CAAC,SAAS,KAAK,IAAI,IAAI,QAAQ,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;YAC5F,MAAM,GAAG,GAAG,GAAG,QAAQ,CAAC,SAAS,IAAI,QAAQ,CAAC,OAAO,IAAI,aAAa,EAAE,CAAC;YACzE,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBAChC,iBAAiB,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;YACvC,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,qBAAqB,CAAC,iBAAiB;SACjD,MAAM,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,KAAK,iBAAiB,CAAC;SAC/D,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;SAC/E,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE;QACnB,MAAM,QAAQ,GAAG,sBAAsB,CAAC,WAAW,EAAE,cAAc,EAAE,iBAAiB,CAAC,CAAC;QACxF,MAAM,WAAW,GAAG,uBAAuB,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QACnE,IAAI,QAAQ,KAAK,IAAI,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;YACnD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO;YACL,WAAW;YACX,QAAQ;YACR,WAAW;SACwB,CAAC;IACxC,CAAC,CAAC;SACD,MAAM,CAAC,CAAC,SAAS,EAA0C,EAAE,CAAC,SAAS,KAAK,IAAI,CAAC;SACjF,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,wBAAwB,CAAC,CAAC;AAC/C,CAAC;AAED,SAAS,2BAA2B,CAClC,UAAgD,EAChD,MAAmD;IAEnD,MAAM,QAAQ,GAAgC,EAAE,CAAC;IAEjD,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,MAAM,YAAY,GAAG,CAAC,GAAG,QAAQ,EAAE,SAAS,CAAC,CAAC;QAC9C,IAAI,WAAW,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,MAAM,GAAG,MAAM,CAAC,cAAc,EAAE,CAAC;YACrE,MAAM;QACR,CAAC;QACD,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC3B,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,wBAAwB,CAAC,SAA8D;IAC9F,OAAO,IAAI,GAAG,CAAC,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;AACxE,CAAC;AAED,SAAS,sBAAsB,CAAC,KAS/B;IACC,MAAM,qBAAqB,GAAG,kBAAkB,CAC9C;QACE,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,SAAS;QACrC,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,UAAU;QACnC,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,aAAa,IAAI,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,UAAU;KAC9E,CAAC,MAAM,CAAC,CAAC,KAAK,EAAmB,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CACpF,CAAC;IACF,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC,CAAC;IAC5F,MAAM,OAAO,GAAG,mBAAmB,CAAC;QAClC,QAAQ,EAAE,QAAQ;QAClB,eAAe,EAAE,KAAK,CAAC,eAAe;QACtC,kBAAkB,EAAE,2BAA2B,CAAC,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC;QAC5E,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,OAAO,EAAE,gBAAgB,CAAC,KAAK,CAAC,OAAO,CAAC;KACzC,CAAC,CAAC;IACH,MAAM,cAAc,GAAG,aAAa,CAClC,CAAC,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,kBAAkB,IAAI,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,MAAM,CAC9H,CAAC,KAAK,EAAmB,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAC1E,CACF,CAAC;IACF,MAAM,QAAQ,GAAiC;QAC7C,QAAQ,EAAE,YAAY,CAAC,0BAA0B;QACjD,UAAU,EAAE,WAAW,OAAO,EAAE;QAChC,OAAO;QACP,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,SAAS,EAAE,KAAK,CAAC,UAAU;QAC3B,MAAM,EAAE;YACN,YAAY,EAAE,UAAU;YACxB,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,SAAS;YAChD,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,OAAO;YAC5C,aAAa,EAAE,aAAa,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,4BAA4B,CAAC,CAAC;YACvG,UAAU,EAAE;gBACV,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC,KAAK;gBAC7B,GAAG,EAAE,KAAK,CAAC,UAAU,CAAC,GAAG;gBACzB,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC,KAAK;aAC9B;YACD,iBAAiB,EAAE,KAAK,CAAC,iBAAiB;SAC3C;QACD,cAAc;QACd,oBAAoB,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,OAAO;QACzD,SAAS,EAAE,qBAAqB,CAAC,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,SAAS,EAAE,KAAK,CAAC,eAAe,CAAC;QAC9F,OAAO,EAAE,gBAAgB,CAAC,KAAK,CAAC,OAAO,CAAC;QACxC,SAAS,EAAE;YACT,MAAM,EAAE,KAAK,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO;YACvD,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,qBAAqB;YACrB,KAAK;YACL,YAAY,EAAE,KAAK,CAAC,YAAY;SACjC;KACF,CAAC;IACF,MAAM,gBAAgB,GAAG,kCAAkC,CAAC,QAAQ,CAAC,CAAC;IACtE,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,uCAAuC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACxF,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,mCAAmC,CAC1C,MAAyC;IAEzC,MAAM,KAAK,GAAG,uBAAuB,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,oBAAoB,CAAC;IAC5E,MAAM,eAAe,GACnB,uBAAuB,CAAC,MAAM,CAAC,eAAe,CAAC,IAAI,2BAA2B,8BAA8B,CAAC,KAAK,CAAC,EAAE,CAAC;IAExH,OAAO;QACL,QAAQ,EAAE,QAAQ;QAClB,OAAO,EAAE,gBAAgB,CAAC,MAAM,CAAC,OAAO,CAAC;QACzC,KAAK;QACL,SAAS,EAAE,wBAAwB,CAAC,MAAM,CAAC,SAAS,EAAE,0BAA0B,EAAE,yBAAyB,CAAC;QAC5G,cAAc,EAAE,wBAAwB,CACtC,MAAM,CAAC,cAAc,EACrB,+BAA+B,EAC/B,+BAA+B,CAChC;QACD,gBAAgB,EAAE,wBAAwB,CACxC,MAAM,CAAC,gBAAgB,EACvB,iCAAiC,EACjC,iCAAiC,CAClC;QACD,eAAe,EAAE,wBAAwB,CACvC,MAAM,CAAC,eAAe,EACtB,gCAAgC,EAChC,gCAAgC,CACjC;QACD,qBAAqB,EAAE,wBAAwB,CAC7C,MAAM,CAAC,qBAAqB,EAC5B,sCAAsC,EACtC,uCAAuC,CACxC;QACD,wBAAwB,EAAE,wBAAwB,CAChD,MAAM,CAAC,wBAAwB,EAC/B,yCAAyC,EACzC,+BAA+B,CAChC;QACD,mBAAmB,EAAE,wBAAwB,CAC3C,MAAM,CAAC,mBAAmB,EAC1B,oCAAoC,EACpC,qCAAqC,CACtC;QACD,wBAAwB,EAAE,wBAAwB,CAChD,MAAM,CAAC,wBAAwB,EAC/B,yCAAyC,EACzC,8BAA8B,CAC/B;QACD,eAAe;QACf,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,oCAAoC,CAAC,gBAAgB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;KAChG,CAAC;AACJ,CAAC;AAED,MAAM,8BAA8B;IACL;IAA7B,YAA6B,OAAe;QAAf,YAAO,GAAP,OAAO,CAAQ;IAAG,CAAC;IAEhD,KAAK,CAAC,QAAQ,CAAC,KAA0C;QACvD,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;QAEtE,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,eAAe,EAAE;gBAC3D,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,cAAc,EAAE,kBAAkB;iBACnC;gBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACnB,KAAK,EAAE,KAAK,CAAC,KAAK;oBAClB,MAAM,EAAE,KAAK,CAAC,MAAM;oBACpB,MAAM,EAAE,KAAK;oBACb,OAAO,EAAE;wBACP,WAAW,EAAE,KAAK,CAAC,eAAe;wBAClC,WAAW,EAAE,CAAC;qBACf;iBACF,CAAC;gBACF,MAAM,EAAE,UAAU,CAAC,MAAM;aAC1B,CAAC,CAAC;YACH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,IAAI,KAAK,CAAC,sCAAsC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;YAC3E,CAAC;YAED,MAAM,MAAM,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAA4C,CAAC;YAClF,IAAI,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACvE,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAChC,CAAC;YACD,IAAI,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBACxC,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;YAC/D,CAAC;YAED,OAAO;gBACL,QAAQ,EAAE,MAAM,CAAC,QAAQ;aAC1B,CAAC;QACJ,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,OAAO,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;CACF;AAED,MAAM,UAAU,oCAAoC,CAAC,OAAO,GAAG,uBAAuB;IACpF,OAAO,IAAI,8BAA8B,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC;AACvE,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,MAAyC;IAClF,MAAM,UAAU,GAAG,mCAAmC,CAAC,MAAM,CAAC,CAAC;IAE/D,OAAO;QACL,KAAK,CAAC,KAAK,CAAC,KAA+B;YACzC,MAAM,UAAU,GAAG,iBAAiB,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;YACxD,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC5B,OAAO;oBACL,SAAS,EAAE,EAAE;oBACb,MAAM,EAAE,SAAS;oBACjB,MAAM,EAAE,8BAA8B;iBACvC,CAAC;YACJ,CAAC;YAED,MAAM,kBAAkB,GAAG,2BAA2B,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;YAC/E,IAAI,kBAAkB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACpC,OAAO;oBACL,SAAS,EAAE,EAAE;oBACb,MAAM,EAAE,SAAS;oBACjB,MAAM,EAAE,yBAAyB;iBAClC,CAAC;YACJ,CAAC;YAED,MAAM,MAAM,GAAG,WAAW,CAAC,kBAAkB,EAAE,UAAU,CAAC,CAAC;YAE3D,IAAI,CAAC;gBACH,MAAM,SAAS,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC;oBACjD,KAAK,EAAE,UAAU,CAAC,KAAK;oBACvB,MAAM;oBACN,eAAe,EAAE,UAAU,CAAC,eAAe;oBAC3C,SAAS,EAAE,UAAU,CAAC,SAAS;iBAChC,CAAC,CAAC;gBACH,IAAI,SAAS,CAAC,QAAQ,CAAC,MAAM,GAAG,UAAU,CAAC,gBAAgB,EAAE,CAAC;oBAC5D,OAAO;wBACL,SAAS,EAAE,EAAE;wBACb,MAAM,EAAE,WAAW;wBACnB,MAAM,EAAE,2BAA2B;qBACpC,CAAC;gBACJ,CAAC;gBAED,MAAM,YAAY,GAAG,2BAA2B,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;gBACrE,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAC9B,OAAO;wBACL,SAAS,EAAE,EAAE;wBACb,MAAM,EAAE,SAAS;wBACjB,MAAM,EAAE,mBAAmB;qBAC5B,CAAC;gBACJ,CAAC;gBAED,MAAM,wBAAwB,GAAG,IAAI,GAAG,CACtC,kBAAkB,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,OAAO,EAAE,SAAS,CAAU,CAAC,CAC3F,CAAC;gBACF,MAAM,YAAY,GAAG,wBAAwB,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;gBACvE,MAAM,aAAa,GAAmC,EAAE,CAAC;gBAEzD,KAAK,MAAM,KAAK,IAAI,YAAY,EAAE,CAAC;oBACjC,IAAI,aAAa,CAAC,MAAM,IAAI,UAAU,CAAC,qBAAqB,EAAE,CAAC;wBAC7D,MAAM;oBACR,CAAC;oBAED,MAAM,kBAAkB,GACtB,OAAO,KAAK,CAAC,kBAAkB,KAAK,QAAQ,IAAI,KAAK,CAAC,kBAAkB,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;wBACxF,CAAC,CAAC,KAAK,CAAC,kBAAkB,CAAC,IAAI,EAAE;wBACjC,CAAC,CAAC,IAAI,CAAC;oBACX,MAAM,IAAI,GAAG,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;oBAC9F,MAAM,OAAO,GACX,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,IAAI,gBAAgB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC;wBAC7E,CAAC,CAAC,gBAAgB,CAAC,KAAK,CAAC,OAAO,CAAC;wBACjC,CAAC,CAAC,IAAI,CAAC;oBACX,IAAI,kBAAkB,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;wBACrE,SAAS;oBACX,CAAC;oBAED,MAAM,SAAS,GAAG,wBAAwB,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;oBACnE,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;wBAC5B,SAAS;oBACX,CAAC;oBAED,MAAM,QAAQ,GAAG,sBAAsB,CAAC;wBACtC,SAAS;wBACT,IAAI;wBACJ,OAAO;wBACP,UAAU,EAAE,KAAK,CAAC,UAAU;wBAC5B,YAAY,EAAE,KAAK,CAAC,YAAY;wBAChC,UAAU,EAAE,KAAK,CAAC,qBAAqB,CAAC,KAAK;wBAC7C,iBAAiB,EAAE,KAAK,CAAC,qBAAqB,CAAC,UAAU,CAAC,YAAY;wBACtE,eAAe,EAAE,UAAU,CAAC,eAAe;qBAC5C,CAAC,CAAC;oBACH,IAAI,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;wBACvC,SAAS;oBACX,CAAC;oBAED,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;oBACnC,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAC/B,CAAC;gBAED,OAAO;oBACL,SAAS,EAAE,aAAa;oBACxB,MAAM,EAAE,IAAI;oBACZ,MAAM,EAAE,cAAc,kBAAkB,CAAC,MAAM,WAAW,aAAa,CAAC,MAAM,EAAE;iBACjF,CAAC;YACJ,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO;oBACL,SAAS,EAAE,EAAE;oBACb,MAAM,EAAE,WAAW;oBACnB,MAAM,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;iBAC/D,CAAC;YACJ,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,MAAsD;IACzF,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;QAC1E,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,0BAA0B,CAAC,MAAM,CAAC,CAAC;AAC5C,CAAC"}
@@ -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 setup`
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,6 +9,8 @@
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,
@@ -16,6 +18,7 @@ import {
16
18
  } from "./runtime-guard.js";
17
19
 
18
20
  const ACTIVATION_ROOT = "__ACTIVATION_ROOT__";
21
+ const EXTENSION_ENTRY_PATH = fileURLToPath(import.meta.url);
19
22
  const warnedDiagnostics = new Set<string>();
20
23
 
21
24
  function warnOnce(key: string, message: string): void {
@@ -68,6 +71,7 @@ export default function register(api: unknown) {
68
71
  "before_prompt_build",
69
72
  createBeforePromptBuildHandler({
70
73
  activationRoot: ACTIVATION_ROOT,
74
+ extensionEntryPath: EXTENSION_ENTRY_PATH,
71
75
  compileRuntimeContext,
72
76
  reportDiagnostic,
73
77
  debug: (message) => console.debug(message)
@@ -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] extension inactive: ACTIVATION_ROOT is still a setup placeholder. Run: openclawbrain setup --openclaw-home <path>"
145
+ "[openclawbrain] extension inactive: 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.2.3",
3
+ "version": "0.3.0",
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.2.3",
48
- "@openclawbrain/events": "0.2.3",
49
- "@openclawbrain/contracts": "0.2.3",
50
- "@openclawbrain/learner": "0.2.3",
51
- "@openclawbrain/pack-format": "0.2.3",
52
- "@openclawbrain/event-export": "0.2.3"
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",