openclaw-memory-atmem 2.2.6-beta.1 → 2.2.6-beta.3

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
@@ -5,7 +5,7 @@ This npm package is the host bridge for AtMem. It is not a standalone memory eng
5
5
  Use the Python-owned installer:
6
6
 
7
7
  ```bash
8
- python -m pip install --pre --upgrade atmem==2.2.6b1
8
+ python -m pip install --pre --upgrade atmem==2.2.6b5
9
9
  atmem openclaw install
10
10
  ```
11
11
 
@@ -22,6 +22,13 @@ Existing AtMem 2.1 users run `atmem openclaw upgrade` after upgrading the Python
22
22
  package. This preserves the current memory mode and migration, verifies the new
23
23
  bridge with a self-test flight, and rolls back the bridge on failure.
24
24
 
25
+ Bridge `2.2.6-beta.3` adds Spec 007 exact task-context delivery. When the host
26
+ supplies `taskId` in hook context, the bridge requests only that governed task,
27
+ checks its byte digest, contributes it separately from recalled memory, and
28
+ confirms exposure. With no `taskId`, task delivery stays off and existing
29
+ memory-only behavior is unchanged. Guard detection is available, but this
30
+ bridge does not claim it can block OpenClaw execution.
31
+
25
32
  In shadow mode the bridge observes native-memory changes without injecting AtMem context. In active mode it exposes compatible memory search/get tools, model-semantic capture, bounded recall and native-path protection. `atmem control restore` restores the saved OpenClaw configuration and native memory.
26
33
 
27
34
  The bridge also supplies Agent Black Box hooks. It records model/tool lifecycle digests and bounded metadata—not raw prompts, responses, parameters or results—so `atmem blackbox verify RUN_ID` can check timeline integrity and observed tool-hook closure. See the [Agent Black Box guide](../../docs/agent-blackbox.md) for the exact boundary.
package/dist/index.js CHANGED
@@ -747,6 +747,20 @@ function register(api) {
747
747
  user_id: delegatedUserIdFor(ctx),
748
748
  workspace_id: workspaceIdFor(ctx),
749
749
  }, cfg.recall.timeoutMs));
750
+ const taskPrepared = ctx.taskId
751
+ ? (await callFor(ctx, "control_prepare_task_context", {
752
+ task_id: ctx.taskId,
753
+ session_id: sessionKey,
754
+ host_run_id: ctx.runId,
755
+ agent_id: agentIdFor(ctx),
756
+ workspace_id: workspaceIdFor(ctx),
757
+ }, cfg.recall.timeoutMs))
758
+ : undefined;
759
+ if (taskPrepared?.disposition === "injected" &&
760
+ (!taskPrepared.context || !taskPrepared.context_sha256 ||
761
+ `sha256:${digestText(taskPrepared.context)}` !== taskPrepared.context_sha256)) {
762
+ throw new Error("governed task context failed exact handoff digest validation");
763
+ }
750
764
  pendingPrompts.set(sessionKey, {
751
765
  text: userText,
752
766
  ts: Date.now(),
@@ -758,7 +772,18 @@ function register(api) {
758
772
  delegatedContextSha256: prepared.authority === "delegated" ? prepared.context_sha256 : undefined,
759
773
  delegatedAuthority: prepared.authority,
760
774
  delegatedResultSha256: prepared.result_sha256,
775
+ taskDeliveryId: taskPrepared?.delivery_id,
776
+ taskContextSha256: taskPrepared?.context_sha256,
761
777
  });
778
+ if (ctx.taskId) {
779
+ await recordBlackbox("task.context.prepared", undefined, ctx, {
780
+ task_id: ctx.taskId,
781
+ task_disposition: taskPrepared?.disposition ?? "withheld",
782
+ task_revision: taskPrepared?.revision,
783
+ task_context_sha256: taskPrepared?.context_sha256?.replace(/^sha256:/, ""),
784
+ task_reason_codes: taskPrepared?.reason_codes ?? [],
785
+ });
786
+ }
762
787
  if (prepared.authority === "delegated" &&
763
788
  prepared.inject &&
764
789
  (!prepared.context ||
@@ -805,8 +830,21 @@ function register(api) {
805
830
  if (prepared.inject && prepared.context) {
806
831
  api.logger.info(`${TAG} memory control plane ${prepared.mode ?? "active"} context exposed`);
807
832
  return prepared.authority === "delegated"
808
- ? { prependContext: prepared.context }
809
- : { appendContext: prepared.context };
833
+ ? {
834
+ prependContext: prepared.context,
835
+ appendContext: taskPrepared?.disposition === "injected"
836
+ ? taskPrepared.context
837
+ : undefined,
838
+ }
839
+ : {
840
+ appendContext: [
841
+ prepared.context,
842
+ taskPrepared?.disposition === "injected" ? taskPrepared.context : "",
843
+ ].filter(Boolean).join("\n\n"),
844
+ };
845
+ }
846
+ if (taskPrepared?.disposition === "injected" && taskPrepared.context) {
847
+ return { appendContext: taskPrepared.context };
810
848
  }
811
849
  return;
812
850
  }
@@ -1007,6 +1045,14 @@ function register(api) {
1007
1045
  if (cached?.exposureId) {
1008
1046
  await callFor(ctx, "control_exposure_shown", { exposure_id: cached.exposureId }, cfg.recall.timeoutMs);
1009
1047
  }
1048
+ if (cached?.taskDeliveryId) {
1049
+ await callFor(ctx, "control_task_exposure_shown", { delivery_id: cached.taskDeliveryId }, cfg.recall.timeoutMs);
1050
+ await recordBlackbox("task.context.exposed", event.runId, ctx, {
1051
+ task_id: ctx.taskId,
1052
+ task_disposition: "injected",
1053
+ task_context_sha256: cached.taskContextSha256?.replace(/^sha256:/, ""),
1054
+ });
1055
+ }
1010
1056
  if (event.success !== false) {
1011
1057
  await callFor(ctx, "control_sync_openclaw_memory", {}, cfg.recall.timeoutMs);
1012
1058
  }
@@ -128,7 +128,7 @@ export class AtmemClient {
128
128
  capabilities: {},
129
129
  clientInfo: {
130
130
  name: "openclaw-memory-atmem",
131
- version: "2.2.6-beta.1",
131
+ version: "2.2.6-beta.3",
132
132
  },
133
133
  });
134
134
  this.notify("notifications/initialized", {});
@@ -2,7 +2,7 @@
2
2
  "id": "memory-atmem",
3
3
  "name": "Memory (atmem)",
4
4
  "description": "OpenClaw bridge installed and managed by the AtMem memory control plane.",
5
- "version": "2.2.6-beta.1",
5
+ "version": "2.2.6-beta.3",
6
6
  "commandAliases": ["memory-atmem"],
7
7
  "activation": {
8
8
  "onStartup": true,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "openclaw-memory-atmem",
3
- "version": "2.2.6-beta.1",
3
+ "version": "2.2.6-beta.3",
4
4
  "description": "OpenClaw Agent Black Box and memory control-plane bridge for AtMem",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",