@openclawbrain/cli 0.4.4 → 0.4.5

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 CHANGED
@@ -1,14 +1,14 @@
1
1
  # @openclawbrain/cli
2
2
 
3
- `@openclawbrain/cli@0.4.4` is the published operator CLI package for OpenClawBrain.
3
+ `@openclawbrain/cli@0.4.5` is the published operator CLI package for OpenClawBrain.
4
4
 
5
5
  Primary public flow:
6
6
 
7
7
  ```bash
8
8
  openclaw plugins install @openclawbrain/openclaw@0.4.0
9
- npx @openclawbrain/cli@0.4.4 install --openclaw-home ~/.openclaw
9
+ npx @openclawbrain/cli@0.4.5 install --openclaw-home ~/.openclaw
10
10
  openclaw gateway restart
11
- npx @openclawbrain/cli@0.4.4 status --openclaw-home ~/.openclaw --detailed
11
+ npx @openclawbrain/cli@0.4.5 status --openclaw-home ~/.openclaw --detailed
12
12
  ```
13
13
 
14
14
  Patch note for `0.4.4`: the CLI now normalizes `plugins.allow` / `plugins.entries.openclawbrain` correctly on reinstall and reports the canonical `openclawbrain` install identity in status output.
@@ -20,10 +20,10 @@ This package carries the `openclawbrain` CLI, daemon controls, import/export hel
20
20
  ## Commands
21
21
 
22
22
  ```bash
23
- npx @openclawbrain/cli@0.4.4 install --openclaw-home ~/.openclaw
24
- npx @openclawbrain/cli@0.4.4 status --openclaw-home ~/.openclaw --detailed
25
- npx @openclawbrain/cli@0.4.4 rollback --activation-root /var/openclawbrain/activation --dry-run
26
- npx @openclawbrain/cli@0.4.4 daemon status --activation-root /var/openclawbrain/activation
23
+ npx @openclawbrain/cli@0.4.5 install --openclaw-home ~/.openclaw
24
+ npx @openclawbrain/cli@0.4.5 status --openclaw-home ~/.openclaw --detailed
25
+ npx @openclawbrain/cli@0.4.5 rollback --activation-root /var/openclawbrain/activation --dry-run
26
+ npx @openclawbrain/cli@0.4.5 daemon status --activation-root /var/openclawbrain/activation
27
27
  ```
28
28
 
29
29
  If the CLI is already on your `PATH`, `openclawbrain ...` is the same command surface. The docs lead with `npx` because that is the clean-host public-registry lane that already passed on `redogfood`.
package/dist/src/cli.d.ts CHANGED
@@ -139,6 +139,7 @@ export interface WatchCommandRuntimeV1 {
139
139
  teacherLoop: ReturnType<typeof createAsyncTeacherLiveLoop>;
140
140
  localSessionTail: ReturnType<typeof createOpenClawLocalSessionTail>;
141
141
  embedder: TextEmbedder | null;
142
+ consumeBaselinePersisted: () => boolean;
142
143
  }
143
144
  export interface CreateWatchCommandRuntimeInputV1 {
144
145
  activationRoot: string;
package/dist/src/cli.js CHANGED
@@ -9,7 +9,7 @@ import { DEFAULT_OLLAMA_EMBEDDING_MODEL, createOllamaEmbedder } from "@openclawb
9
9
  import { ensureManagedLearnerServiceForActivationRoot, inspectManagedLearnerService, removeManagedLearnerServiceForActivationRoot, parseDaemonArgs, runDaemonCommand } from "./daemon.js";
10
10
  import { exportBrain, importBrain } from "./import-export.js";
11
11
  import { buildNormalizedEventExport } from "@openclawbrain/contracts";
12
- import { buildTeacherSupervisionArtifactsFromNormalizedEventExport, createAlwaysOnLearningRuntimeState, describeAlwaysOnLearningRuntimeState, drainAlwaysOnLearningRuntime, loadOrInitBaseline, reindexCandidatePackBuildResultWithEmbedder, materializeAlwaysOnLearningCandidatePack, persistBaseline } from "@openclawbrain/learner";
12
+ import { buildTeacherSupervisionArtifactsFromNormalizedEventExport, createAlwaysOnLearningRuntimeState, describeAlwaysOnLearningRuntimeState, drainAlwaysOnLearningRuntime, loadOrInitBaseline, reindexCandidatePackBuildResultWithEmbedder, materializeAlwaysOnLearningCandidatePack, persistBaseline } from "./local-learner.js";
13
13
  import { inspectActivationState, loadPackFromActivation, promoteCandidatePack, readLearningSpineLogEntries, stageCandidatePack } from "@openclawbrain/pack-format";
14
14
  import { resolveActivationRoot } from "./resolve-activation-root.js";
15
15
  import { describeOpenClawHomeInspection, discoverOpenClawHomes, formatOpenClawHomeLayout, formatOpenClawHomeProfileSource, inspectOpenClawHome } from "./openclaw-home-layout.js";
@@ -20,7 +20,7 @@ import { DEFAULT_WATCH_POLL_INTERVAL_SECONDS, buildNormalizedEventExportFromScan
20
20
  import { appendLearningUpdateLogs } from "./learning-spine.js";
21
21
  import { buildPassiveLearningSessionExportFromOpenClawSessionStore } from "./local-session-passive-learning.js";
22
22
  import { summarizePackVectorEmbeddingState } from "./embedding-status.js";
23
- import { buildTracedLearningStatusSurface, loadBrainStoreTracedLearningBridge, mergeTracedLearningBridgePayload, persistBrainStoreTracedLearningBridge, writeTracedLearningBridge } from "./traced-learning-bridge.js";
23
+ import { buildTracedLearningBridgePayloadFromRuntime, buildTracedLearningStatusSurface, persistTracedLearningBridgeState } from "./traced-learning-bridge.js";
24
24
  import { discoverOpenClawSessionStores, loadOpenClawSessionIndex, readOpenClawSessionFile } from "./session-store.js";
25
25
  import { readOpenClawBrainProviderDefaults, readOpenClawBrainProviderConfig, readOpenClawBrainProviderConfigFromSources, resolveOpenClawBrainProviderDefaultsPath } from "./provider-config.js";
26
26
  const OPENCLAWBRAIN_EMBEDDER_BASE_URL_ENV = "OPENCLAWBRAIN_EMBEDDER_BASE_URL";
@@ -3975,6 +3975,37 @@ function resolveServeTimeLearningRuntimeInput(activationRoot) {
3975
3975
  fallbackReason
3976
3976
  };
3977
3977
  }
3978
+ function resolveActivationInspectionPackId(inspection, slot) {
3979
+ return inspection?.[slot]?.packId ?? inspection?.pointers?.[slot]?.packId ?? null;
3980
+ }
3981
+ function resolveWatchTeacherArtifactCount(snapshot) {
3982
+ if (typeof snapshot?.teacher?.artifactCount === "number") {
3983
+ return snapshot.teacher.artifactCount;
3984
+ }
3985
+ if (typeof snapshot?.diagnostics?.emittedArtifactCount === "number") {
3986
+ return snapshot.diagnostics.emittedArtifactCount;
3987
+ }
3988
+ return 0;
3989
+ }
3990
+ function persistWatchTracedLearningBridgeSurface(input) {
3991
+ const lastMaterialization = input.snapshot?.learner?.lastMaterialization ?? null;
3992
+ const materializedPackId = lastMaterialization?.candidate?.summary?.packId ?? null;
3993
+ return persistTracedLearningBridgeState(input.activationRoot, buildTracedLearningBridgePayloadFromRuntime({
3994
+ updatedAt: input.updatedAt,
3995
+ lastMaterialization,
3996
+ teacherArtifactCount: resolveWatchTeacherArtifactCount(input.snapshot),
3997
+ serveTimeLearning: resolveServeTimeLearningRuntimeInput(input.activationRoot),
3998
+ materializedPackId,
3999
+ promoted: materializedPackId !== null &&
4000
+ resolveActivationInspectionPackId(input.inspection, "active") === materializedPackId,
4001
+ baselinePersisted: input.baselinePersisted,
4002
+ source: {
4003
+ command: "watch",
4004
+ scanRoot: input.scanRoot,
4005
+ teacherSnapshotPath: input.teacherSnapshotPath
4006
+ }
4007
+ }));
4008
+ }
3978
4009
  function runLearnCommand(parsed) {
3979
4010
  const learnStatePath = path.join(parsed.activationRoot, "learn-cli-state.json");
3980
4011
  const teacherSnapshotPath = resolveAsyncTeacherLiveLoopSnapshotPath(parsed.activationRoot);
@@ -4212,9 +4243,6 @@ function runLearnCommand(parsed) {
4212
4243
  const lastMaterialization = learnerResult.materializations.at(-1) ?? null;
4213
4244
  const plan = describeAlwaysOnLearningRuntimeState(learnerResult.state, lastMaterialization);
4214
4245
  const learningPath = summarizeLearningPathFromMaterialization(lastMaterialization);
4215
- const supervisionCount = lastMaterialization?.candidate.summary.learnedRouter.supervisionCount ?? 0;
4216
- const routerUpdateCount = lastMaterialization?.candidate.summary.learnedRouter.updateCount ?? 0;
4217
- const routerNoOpReason = lastMaterialization?.candidate.summary.learnedRouter.noOpReason ?? null;
4218
4246
  const graphEvolution = lastMaterialization?.candidate.payloads.graph.evolution;
4219
4247
  const graphSummary = graphEvolution === undefined
4220
4248
  ? null
@@ -4225,18 +4253,28 @@ function runLearnCommand(parsed) {
4225
4253
  const connectSummary = graphSummary?.connectDiagnostics === null || graphSummary?.connectDiagnostics === undefined
4226
4254
  ? ""
4227
4255
  : ` connect candidates=${graphSummary.connectDiagnostics.candidatePairCount} applied=${graphSummary.connectDiagnostics.appliedPairCount} edges=${graphSummary.connectDiagnostics.createdEdgeCount}.`;
4228
- const routingBuild = lastMaterialization?.candidate.routingBuild ?? {
4229
- learnedRoutingPath: serveTimeLearning.pgVersion === "v2" ? "policy_gradient_v2" : "policy_gradient_v1",
4230
- pgVersionRequested: serveTimeLearning.pgVersion,
4231
- pgVersionUsed: serveTimeLearning.pgVersion,
4232
- decisionLogCount: serveTimeLearning.decisionLogCount,
4233
- fallbackReason: serveTimeLearning.pgVersion === "v1" ? serveTimeLearning.fallbackReason ?? "no_serve_time_decisions" : null,
4234
- updatedBaseline: null
4235
- };
4256
+ const tracedLearningPreview = buildTracedLearningBridgePayloadFromRuntime({
4257
+ updatedAt: now,
4258
+ lastMaterialization,
4259
+ teacherArtifactCount: teacherArtifacts.length,
4260
+ serveTimeLearning,
4261
+ source: {
4262
+ command: "learn",
4263
+ exportDigest: learningExport.provenance.exportDigest,
4264
+ teacherSnapshotPath
4265
+ }
4266
+ });
4267
+ const supervisionCount = tracedLearningPreview.supervisionCount;
4268
+ const routerUpdateCount = tracedLearningPreview.routerUpdateCount;
4269
+ const routerNoOpReason = tracedLearningPreview.routerNoOpReason;
4236
4270
  const learnPathReport = {
4237
- ...routingBuild,
4238
- fallbackReason: routingBuild.fallbackReason ??
4239
- (routingBuild.pgVersionUsed === "v1" ? serveTimeLearning.fallbackReason ?? "no_serve_time_decisions" : null)
4271
+ learnedRoutingPath: lastMaterialization?.candidate.routingBuild?.learnedRoutingPath ??
4272
+ (serveTimeLearning.pgVersion === "v2" ? "policy_gradient_v2" : "policy_gradient_v1"),
4273
+ pgVersionRequested: tracedLearningPreview.pgVersionRequested,
4274
+ pgVersionUsed: tracedLearningPreview.pgVersionUsed,
4275
+ decisionLogCount: tracedLearningPreview.decisionLogCount,
4276
+ fallbackReason: tracedLearningPreview.fallbackReason,
4277
+ updatedBaseline: lastMaterialization?.candidate.routingBuild?.updatedBaseline ?? null
4240
4278
  };
4241
4279
  let promoted = false;
4242
4280
  let materializedPackId = null;
@@ -4265,6 +4303,20 @@ function runLearnCommand(parsed) {
4265
4303
  materializedPackId = candidateDescriptor.manifest.packId;
4266
4304
  promoted = true;
4267
4305
  }
4306
+ const tracedLearningPayload = buildTracedLearningBridgePayloadFromRuntime({
4307
+ updatedAt: now,
4308
+ lastMaterialization,
4309
+ teacherArtifactCount: teacherArtifacts.length,
4310
+ serveTimeLearning,
4311
+ materializedPackId,
4312
+ promoted,
4313
+ baselinePersisted,
4314
+ source: {
4315
+ command: "learn",
4316
+ exportDigest: learningExport.provenance.exportDigest,
4317
+ teacherSnapshotPath
4318
+ }
4319
+ });
4268
4320
  persistLearnCliState(learnerResult.state, now);
4269
4321
  writeJsonFile(teacherSnapshotPath, {
4270
4322
  runtimeOwner: "openclaw",
@@ -4311,31 +4363,10 @@ function runLearnCommand(parsed) {
4311
4363
  lastAppliedMaterializationJobId: lastMaterialization?.jobId ?? null
4312
4364
  }
4313
4365
  });
4314
- const tracedLearningBridge = mergeTracedLearningBridgePayload({
4315
- updatedAt: now,
4316
- routeTraceCount: lastMaterialization?.candidate.summary.learnedRouter.routeTraceCount ?? serveTimeLearning.decisionLogCount,
4317
- supervisionCount,
4318
- routerUpdateCount,
4319
- teacherArtifactCount: teacherArtifacts.length,
4320
- pgVersionRequested: learnPathReport.pgVersionRequested,
4321
- pgVersionUsed: learnPathReport.pgVersionUsed,
4322
- decisionLogCount: learnPathReport.decisionLogCount,
4323
- fallbackReason: learnPathReport.fallbackReason,
4324
- routerNoOpReason,
4325
- materializedPackId,
4326
- promoted,
4327
- baselinePersisted,
4328
- source: {
4329
- command: "learn",
4330
- exportDigest: learningExport.provenance.exportDigest,
4331
- teacherSnapshotPath
4332
- }
4333
- }, loadBrainStoreTracedLearningBridge());
4366
+ const tracedLearningBridge = persistTracedLearningBridgeState(activationRoot, tracedLearningPayload);
4334
4367
  const surfacedSupervisionCount = tracedLearningBridge.supervisionCount;
4335
4368
  const surfacedRouterUpdateCount = tracedLearningBridge.routerUpdateCount;
4336
4369
  const surfacedRouterNoOpReason = tracedLearningBridge.routerNoOpReason;
4337
- persistBrainStoreTracedLearningBridge(tracedLearningBridge);
4338
- writeTracedLearningBridge(activationRoot, tracedLearningBridge);
4339
4370
  const summaryMessage = materializedPackId === null
4340
4371
  ? `Scanned ${totalSessions} sessions, ${totalEvents} new events, no candidate materialized, no promotion.`
4341
4372
  : `Scanned ${totalSessions} sessions, ${totalEvents} new events, materialized ${materializedPackId}, promoted.${connectSummary}`;
@@ -4967,6 +4998,7 @@ export async function createWatchCommandRuntime(input) {
4967
4998
  const restoredTeacherState = loadWatchTeacherSnapshotState(teacherSnapshotPath);
4968
4999
  const log = input.log ?? watchLog;
4969
5000
  const startupWarnings = [];
5001
+ let baselinePersisted = false;
4970
5002
  mkdirSync(scanRoot, { recursive: true });
4971
5003
  mkdirSync(resolveWatchStateRoot(activationRoot), { recursive: true });
4972
5004
  log(`Watch starting — activation: ${shortenPath(activationRoot)}`);
@@ -5020,6 +5052,7 @@ export async function createWatchCommandRuntime(input) {
5020
5052
  persistUpdatedBaseline: (state) => {
5021
5053
  try {
5022
5054
  persistBaseline(activationRoot, state);
5055
+ baselinePersisted = true;
5023
5056
  }
5024
5057
  catch (error) {
5025
5058
  log(`Baseline persist failed: ${formatWatchError(error)}`);
@@ -5139,6 +5172,17 @@ export async function createWatchCommandRuntime(input) {
5139
5172
  log(replayPromotion.logLine);
5140
5173
  bootstrapSnapshot = teacherLoop.snapshot();
5141
5174
  }
5175
+ const bootstrapInspection = inspectActivationState(activationRoot, bootstrapObservedAt);
5176
+ persistWatchTracedLearningBridgeSurface({
5177
+ activationRoot,
5178
+ updatedAt: bootstrapObservedAt,
5179
+ snapshot: bootstrapSnapshot,
5180
+ inspection: bootstrapInspection,
5181
+ scanRoot,
5182
+ teacherSnapshotPath,
5183
+ baselinePersisted
5184
+ });
5185
+ baselinePersisted = false;
5142
5186
  const bootstrapCursor = localSessionTail.snapshot();
5143
5187
  persistWatchTeacherSnapshot(teacherSnapshotPath, {
5144
5188
  lastRunAt: bootstrapObservedAt,
@@ -5188,7 +5232,12 @@ export async function createWatchCommandRuntime(input) {
5188
5232
  scanner,
5189
5233
  teacherLoop,
5190
5234
  localSessionTail,
5191
- embedder: resolvedEmbedder.embedder
5235
+ embedder: resolvedEmbedder.embedder,
5236
+ consumeBaselinePersisted: () => {
5237
+ const persisted = baselinePersisted;
5238
+ baselinePersisted = false;
5239
+ return persisted;
5240
+ }
5192
5241
  };
5193
5242
  }
5194
5243
  export async function runWatchCommandPass(runtime, options = {}) {
@@ -5267,6 +5316,17 @@ export async function runWatchCommandPass(runtime, options = {}) {
5267
5316
  }
5268
5317
  }
5269
5318
  const afterInspection = inspectActivationState(runtime.activationRoot, observedAt);
5319
+ persistWatchTracedLearningBridgeSurface({
5320
+ activationRoot: runtime.activationRoot,
5321
+ updatedAt: observedAt,
5322
+ snapshot,
5323
+ inspection: afterInspection,
5324
+ scanRoot: runtime.scanRoot,
5325
+ teacherSnapshotPath: runtime.teacherSnapshotPath,
5326
+ baselinePersisted: typeof runtime.consumeBaselinePersisted === "function"
5327
+ ? runtime.consumeBaselinePersisted()
5328
+ : false
5329
+ });
5270
5330
  const lastObservedDelta = buildWatchLastObservedDelta({
5271
5331
  observedAt,
5272
5332
  localPoll,
@@ -1,7 +1,7 @@
1
1
  import { type CompileSelectionMode } from "@openclawbrain/compiler";
2
2
  import { CONTRACT_IDS, type ArtifactManifestV1, type ActivationPointerRecordV1, type ActivationPointerSlot, type RuntimeTurnBrainAttachmentPolicyV1, type ContextCompactionMode, type ContextContributionEvidenceStateV1, type CurrentProfileBrainStatusAnswerV1, type CurrentProfileActivationStateV1, type CurrentProfilePassiveLearningDeltaSummaryV1, type CurrentProfilePassiveLearningWatchStateV1, type CurrentProfileAttachmentStateV1, type CurrentProfileAttachmentProofStateV1, type CurrentProfileHookInstallStateV1, type CurrentProfileHookLoadabilityV1, type CurrentProfileHookLoadProofV1, type BrainServeHotPathTimingV1, type CurrentProfileStructuralDecisionV1, type FeedbackEventKind, type PackGraphConnectDiagnosticsV1, type PackGraphEvolutionV1, type EventSemanticSurfaceV1, type FeedbackEventV1, type KernelSurfaceValidationResultV1, type LearningBootProfile, type LearningCadence, type LearningScanPolicy, type InteractionEventV1, type NormalizedEventExportV1, type NormalizedEventV1, type PrincipalPriorityClassV1, type PrincipalRoleV1, type RouteMode, type RuntimeCompileResponseV1, type RuntimeCompileStructuralSignalsV1, type RuntimeCompileTargetV1, type RuntimeGraphPlasticityStateV1, type RuntimePlasticitySourceV1, type SparseFeedbackPolicyV1, type TeacherAuthorityV1, type TeacherSupervisionArtifactV1, type WorkspaceInjectionSurfaceV1 } from "@openclawbrain/contracts";
3
3
  import { type EventExportLaneV1 } from "@openclawbrain/event-export";
4
- import { type AdvanceAlwaysOnLearningRuntimeInput, type AlwaysOnLearningCadenceV1, type AlwaysOnLearningMaterializationJobV1, type AlwaysOnLearningRuntimePlanV1, type AlwaysOnLearningRuntimeStateV1, type BaselineStateV1, type PendingPrincipalEventV1, type PrincipalLearningCheckpointV1 } from "@openclawbrain/learner";
4
+ import { type AdvanceAlwaysOnLearningRuntimeInput, type AlwaysOnLearningCadenceV1, type AlwaysOnLearningMaterializationJobV1, type AlwaysOnLearningRuntimePlanV1, type AlwaysOnLearningRuntimeStateV1, type BaselineStateV1, type PendingPrincipalEventV1, type PrincipalLearningCheckpointV1 } from "./local-learner.js";
5
5
  import { type ActivationInspection, type ActivationObservabilityReport, type GraphEvolutionLogV1, type LearningSpineServeRouteBreadcrumbsV1, type ActivationSlotInspection, type InitHandoffState, type LearningSpineServeRouteDecisionLogEntryV1 } from "@openclawbrain/pack-format";
6
6
  export { clearOpenClawProfileRuntimeLoadProof, listOpenClawProfileRuntimeLoadProofs, recordOpenClawProfileRuntimeLoadProof, resolveAttachmentRuntimeLoadProofsPath, type OpenClawProfileRuntimeLoadProofRecordV1, type OpenClawProfileRuntimeLoadProofSetV1, type OpenClawProfileRuntimeLoadProofsV1 } from "./attachment-truth.js";
7
7
  import { type AsyncTeacherLabelerConfigV1 } from "./teacher-labeler.js";
package/dist/src/index.js CHANGED
@@ -5,7 +5,7 @@ import process from "node:process";
5
5
  import { compileRuntimeFromActivation } from "@openclawbrain/compiler";
6
6
  import { CONTRACT_IDS, buildEventSemanticSurface, buildNormalizedEventExport, canonicalJson, checksumJsonPayload, createFeedbackEvent, createInteractionEvent, sortNormalizedEvents, validateKernelSurface, validateNormalizedEventExport } from "@openclawbrain/contracts";
7
7
  import { classifyFeedbackSignalContent, describeNormalizedEventExportObservability } from "@openclawbrain/event-export";
8
- import { DEFAULT_TEACHER_SUPERVISION_STALE_AFTER_MS, advanceAlwaysOnLearningRuntime, buildTeacherSupervisionArtifactsFromNormalizedEventExport, createAlwaysOnLearningRuntimeState, describeAlwaysOnLearningRuntimeState, materializeAlwaysOnLearningCandidatePack, materializeCandidatePackFromNormalizedEventExport } from "@openclawbrain/learner";
8
+ import { DEFAULT_TEACHER_SUPERVISION_STALE_AFTER_MS, advanceAlwaysOnLearningRuntime, buildTeacherSupervisionArtifactsFromNormalizedEventExport, createAlwaysOnLearningRuntimeState, describeAlwaysOnLearningRuntimeState, materializeAlwaysOnLearningCandidatePack, materializeCandidatePackFromNormalizedEventExport } from "./local-learner.js";
9
9
  import { LEARNING_SPINE_LOG_LAYOUT, activatePack, describeActivationObservability, describeActivationTarget, describePackCompileTarget, inspectActivationState, loadPackFromActivation, promoteCandidatePack, readLearningSpineLogEntries, rollbackActivePack, stageCandidatePack } from "@openclawbrain/pack-format";
10
10
  import { inspectOpenClawBrainHookStatus, summarizeOpenClawBrainHookLoad } from "./openclaw-hook-truth.js";
11
11
  import { appendLearningUpdateLogs, appendServeTimeRouteDecisionLog } from "./learning-spine.js";
@@ -1,4 +1,4 @@
1
- import { type AlwaysOnLearningMaterializationJobV1 } from "@openclawbrain/learner";
1
+ import { type AlwaysOnLearningMaterializationJobV1 } from "./local-learner.js";
2
2
  import { type BrainServeHotPathTimingV1, type NormalizedEventExportV1, type RouteMode, type RuntimeCompileResponseV1 } from "@openclawbrain/contracts";
3
3
  import { type LearningSpinePgRouteUpdateLogEntryV1, type LearningSpineServeRouteBreadcrumbsV1, type LearningSpineServeRouteDecisionLogEntryV1, type PackDescriptor } from "@openclawbrain/pack-format";
4
4
  type CompileFailureLike = {
@@ -1,6 +1,6 @@
1
1
  import path from "node:path";
2
2
  import { rankContextBlocks } from "@openclawbrain/compiler";
3
- import { describeSparseFeedbackEventDispositions } from "@openclawbrain/learner";
3
+ import { describeSparseFeedbackEventDispositions } from "./local-learner.js";
4
4
  import { CONTRACT_IDS } from "@openclawbrain/contracts";
5
5
  import { appendLearningSpineLogEntry, buildLearningSpineLogId, loadActivationPointers, loadPack, loadPackFromActivation, readLearningSpineLogEntries } from "@openclawbrain/pack-format";
6
6
  function noteValue(notes, prefix) {