@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
@@ -4,8 +4,8 @@
4
4
  * Resolution order:
5
5
  * 1. Explicit `--activation-root <path>` (passed as `explicit` arg)
6
6
  * 2. A selected OpenClaw profile home (`openclawHome` option or OPENCLAW_HOME env)
7
- * 3. Default location: ~/.openclawbrain/activation
8
- * 4. Scan ~/.openclaw-*​/extensions/openclawbrain/index.ts for hardcoded activation paths
7
+ * 3. Unpinned host auto-detect from ~/.openclawbrain/activation and installed profile hooks
8
+ * 4. Refuse clearly if host-local signals disagree or are unresolved
9
9
  * 5. Fail with a clear error message
10
10
  *
11
11
  * Exported for use by CLI commands and other agents' code.
@@ -22,9 +22,12 @@ function normalizeOptionalString(value) {
22
22
  const trimmed = value.trim();
23
23
  return trimmed.length > 0 ? trimmed : null;
24
24
  }
25
- function buildInstallSetupGuidance() {
25
+ function buildInstallGuidance() {
26
26
  return "Run: openclawbrain install --openclaw-home <path>";
27
27
  }
28
+ function buildProfilePinningGuidance() {
29
+ return "Pass --activation-root <path> to pin the brain directly, or --openclaw-home <path> (or OPENCLAW_HOME) to select one installed OpenClaw profile.";
30
+ }
28
31
  function extractActivationRootFromExtension(filePath) {
29
32
  try {
30
33
  const content = readFileSync(filePath, "utf8");
@@ -41,7 +44,7 @@ function extractActivationRootFromExtension(filePath) {
41
44
  candidate === "__ACTIVATION_" + "ROOT__") {
42
45
  return {
43
46
  activationRoot: null,
44
- diagnostic: `installed extension ${filePath} still contains the ACTIVATION_ROOT setup placeholder`
47
+ diagnostic: `installed extension ${filePath} still contains the ACTIVATION_ROOT placeholder`
45
48
  };
46
49
  }
47
50
  const resolvedCandidate = path.resolve(candidate);
@@ -71,29 +74,56 @@ function readActivationRootFromOpenClawHome(openclawHome) {
71
74
  return extractActivationRootFromExtension(extensionIndex);
72
75
  }
73
76
  /**
74
- * Scan ~/.openclaw-* directories for extension index.ts files that
75
- * contain hardcoded activation root paths.
77
+ * Scan ~/.openclaw-* directories for installed profile hooks and record
78
+ * either the pinned activation root or the reason the hook is unresolved.
76
79
  */
77
- function scanExtensionsForActivationRoot() {
80
+ function scanInstalledProfileActivationRoots() {
78
81
  const homeDir = path.resolve(getHomeDir());
79
82
  let entries;
80
83
  try {
81
84
  entries = readdirSync(homeDir);
82
85
  }
83
86
  catch {
84
- return null;
87
+ return [];
85
88
  }
89
+ const probes = [];
86
90
  for (const entry of entries) {
87
91
  if (!entry.startsWith(".openclaw-"))
88
92
  continue;
89
- const extensionIndex = path.join(homeDir, entry, "extensions", "openclawbrain", "index.ts");
93
+ const openclawHome = path.join(homeDir, entry);
94
+ const extensionIndex = path.join(openclawHome, "extensions", "openclawbrain", "index.ts");
90
95
  if (!existsSync(extensionIndex))
91
96
  continue;
92
97
  const found = extractActivationRootFromExtension(extensionIndex);
93
- if (found.activationRoot !== null)
94
- return found.activationRoot;
98
+ probes.push({
99
+ openclawHome: path.resolve(openclawHome),
100
+ extensionIndex,
101
+ activationRoot: found.activationRoot,
102
+ diagnostic: found.diagnostic
103
+ });
104
+ }
105
+ return probes.sort((left, right) => left.openclawHome.localeCompare(right.openclawHome));
106
+ }
107
+ function buildUnpinnedResolutionRefusal(input) {
108
+ const details = [];
109
+ const { defaultActivationRoot, installedProfileProbes } = input;
110
+ if (defaultActivationRoot !== null) {
111
+ details.push(` - default HOME root -> ${defaultActivationRoot}`);
112
+ }
113
+ for (const probe of installedProfileProbes) {
114
+ if (probe.activationRoot !== null) {
115
+ details.push(` - ${probe.openclawHome} -> ${probe.activationRoot}`);
116
+ continue;
117
+ }
118
+ details.push(` - ${probe.openclawHome} -> unresolved: ${probe.diagnostic ?? `installed extension ${probe.extensionIndex} is unresolved`}`);
95
119
  }
96
- return null;
120
+ return [
121
+ "Refusing to auto-select an activation root from unpinned host state.",
122
+ "Detected targets:",
123
+ ...details,
124
+ buildProfilePinningGuidance(),
125
+ buildInstallGuidance()
126
+ ].join("\n");
97
127
  }
98
128
  /**
99
129
  * Resolve the activation root path through the detection chain.
@@ -120,24 +150,41 @@ export function resolveActivationRoot(options = {}) {
120
150
  }
121
151
  const selectedActivationRootDiagnostic = selectedActivationRoot?.diagnostic ?? null;
122
152
  if (selectedActivationRootDiagnostic !== null) {
123
- throw new Error(`OpenClawBrain extension found for OpenClaw profile home ${path.resolve(selectedOpenClawHome)}, but activation root is unresolved: ${selectedActivationRootDiagnostic}. ${buildInstallSetupGuidance()}`);
153
+ throw new Error(`OpenClawBrain extension found for OpenClaw profile home ${path.resolve(selectedOpenClawHome)}, but activation root is unresolved: ${selectedActivationRootDiagnostic}. ${buildInstallGuidance()}`);
124
154
  }
125
- throw new Error(`No brain found for OpenClaw profile home ${path.resolve(selectedOpenClawHome)}. ${buildInstallSetupGuidance()}`);
155
+ throw new Error(`No brain found for OpenClaw profile home ${path.resolve(selectedOpenClawHome)}. ${buildInstallGuidance()}`);
126
156
  }
127
157
  // 3. Default location: ~/.openclawbrain/activation
128
158
  const defaultPath = path.join(getHomeDir(), ".openclawbrain", "activation");
129
- if (existsSync(defaultPath)) {
130
- return path.resolve(defaultPath);
159
+ const resolvedDefaultPath = existsSync(defaultPath) ? path.resolve(defaultPath) : null;
160
+ // 4. Scan installed profile hooks under HOME
161
+ const installedProfileProbes = scanInstalledProfileActivationRoots();
162
+ const resolvedCandidateRoots = new Set();
163
+ const hasUnresolvedInstalledProfiles = installedProfileProbes.some((probe) => probe.activationRoot === null);
164
+ if (resolvedDefaultPath !== null) {
165
+ resolvedCandidateRoots.add(resolvedDefaultPath);
131
166
  }
132
- // 4. Scan extensions
133
- const scanned = scanExtensionsForActivationRoot();
134
- if (scanned !== null) {
135
- return path.resolve(scanned);
167
+ for (const probe of installedProfileProbes) {
168
+ if (probe.activationRoot !== null) {
169
+ resolvedCandidateRoots.add(path.resolve(probe.activationRoot));
170
+ }
171
+ }
172
+ if (resolvedCandidateRoots.size === 1 && !hasUnresolvedInstalledProfiles) {
173
+ return [...resolvedCandidateRoots][0];
174
+ }
175
+ if ((resolvedCandidateRoots.size > 1 || hasUnresolvedInstalledProfiles) && installedProfileProbes.length > 0) {
176
+ if (quiet) {
177
+ return "";
178
+ }
179
+ throw new Error(buildUnpinnedResolutionRefusal({
180
+ defaultActivationRoot: resolvedDefaultPath,
181
+ installedProfileProbes
182
+ }));
136
183
  }
137
184
  // 5. Nothing found
138
185
  if (quiet) {
139
186
  return "";
140
187
  }
141
- throw new Error(`No brain found. ${buildInstallSetupGuidance()}`);
188
+ throw new Error(`No brain found. ${buildInstallGuidance()}`);
142
189
  }
143
190
  //# sourceMappingURL=resolve-activation-root.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"resolve-activation-root.js","sourceRoot":"","sources":["../../src/resolve-activation-root.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"resolve-activation-root.js","sourceRoot":"","sources":["../../src/resolve-activation-root.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,SAAS,UAAU;IACjB,OAAO,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC;AAC5D,CAAC;AAED,SAAS,uBAAuB,CAAC,KAAgC;IAC/D,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;AAC7C,CAAC;AAED,SAAS,oBAAoB;IAC3B,OAAO,mDAAmD,CAAC;AAC7D,CAAC;AAED,SAAS,2BAA2B;IAClC,OAAO,iJAAiJ,CAAC;AAC3J,CAAC;AAcD,SAAS,kCAAkC,CAAC,QAAgB;IAC1D,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC/C,MAAM,KAAK,GACT,OAAO,CAAC,KAAK,CAAC,mDAAmD,CAAC;YAClE,OAAO,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAC;QAEzD,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;YACxB,OAAO;gBACL,cAAc,EAAE,IAAI;gBACpB,UAAU,EAAE,uBAAuB,QAAQ,+CAA+C;aAC3F,CAAC;QACJ,CAAC;QAED,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAClC,IACE,SAAS,KAAK,qBAAqB;YACnC,SAAS,KAAK,eAAe,GAAG,QAAQ,EACxC,CAAC;YACD,OAAO;gBACL,cAAc,EAAE,IAAI;gBACpB,UAAU,EAAE,uBAAuB,QAAQ,iDAAiD;aAC7F,CAAC;QACJ,CAAC;QAED,MAAM,iBAAiB,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAClD,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,EAAE,CAAC;YACnC,OAAO;gBACL,cAAc,EAAE,IAAI;gBACpB,UAAU,EAAE,uBAAuB,QAAQ,sCAAsC,iBAAiB,EAAE;aACrG,CAAC;QACJ,CAAC;QAED,OAAO;YACL,cAAc,EAAE,iBAAiB;YACjC,UAAU,EAAE,IAAI;SACjB,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;YACL,cAAc,EAAE,IAAI;YACpB,UAAU,EAAE,uBAAuB,QAAQ,+BAA+B;SAC3E,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,kCAAkC,CAAC,YAAoB;IAC9D,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAC9B,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,EAC1B,YAAY,EACZ,eAAe,EACf,UAAU,CACX,CAAC;IACF,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;QAChC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,kCAAkC,CAAC,cAAc,CAAC,CAAC;AAC5D,CAAC;AASD;;;GAGG;AACH,SAAS,mCAAmC;IAC1C,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IAC3C,IAAI,OAAiB,CAAC;IACtB,IAAI,CAAC;QACH,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IACjC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,MAAM,GAA0C,EAAE,CAAC;IACzD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,YAAY,CAAC;YAAE,SAAS;QAC9C,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAC/C,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,UAAU,CAAC,CAAC;QAC1F,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC;YAAE,SAAS;QAC1C,MAAM,KAAK,GAAG,kCAAkC,CAAC,cAAc,CAAC,CAAC;QACjE,MAAM,CAAC,IAAI,CAAC;YACV,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC;YACxC,cAAc;YACd,cAAc,EAAE,KAAK,CAAC,cAAc;YACpC,UAAU,EAAE,KAAK,CAAC,UAAU;SAC7B,CAAC,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC;AAC3F,CAAC;AAED,SAAS,8BAA8B,CAAC,KAGvC;IACC,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,GAAG,KAAK,CAAC;IAEhE,IAAI,qBAAqB,KAAK,IAAI,EAAE,CAAC;QACnC,OAAO,CAAC,IAAI,CAAC,4BAA4B,qBAAqB,EAAE,CAAC,CAAC;IACpE,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,sBAAsB,EAAE,CAAC;QAC3C,IAAI,KAAK,CAAC,cAAc,KAAK,IAAI,EAAE,CAAC;YAClC,OAAO,CAAC,IAAI,CAAC,OAAO,KAAK,CAAC,YAAY,OAAO,KAAK,CAAC,cAAc,EAAE,CAAC,CAAC;YACrE,SAAS;QACX,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,OAAO,KAAK,CAAC,YAAY,mBAAmB,KAAK,CAAC,UAAU,IAAI,uBAAuB,KAAK,CAAC,cAAc,gBAAgB,EAAE,CAAC,CAAC;IAC9I,CAAC;IAED,OAAO;QACL,sEAAsE;QACtE,mBAAmB;QACnB,GAAG,OAAO;QACV,2BAA2B,EAAE;QAC7B,oBAAoB,EAAE;KACvB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAWD;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAC,UAAwC,EAAE;IAC9E,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;IAElD,mBAAmB;IACnB,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/D,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAChC,CAAC;IAED,MAAM,oBAAoB,GACxB,uBAAuB,CAAC,YAAY,CAAC,IAAI,uBAAuB,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IAE9F,8EAA8E;IAC9E,IAAI,oBAAoB,KAAK,IAAI,EAAE,CAAC;QAClC,MAAM,sBAAsB,GAAG,kCAAkC,CAAC,oBAAoB,CAAC,CAAC;QACxF,MAAM,0BAA0B,GAAG,sBAAsB,EAAE,cAAc,IAAI,IAAI,CAAC;QAClF,IAAI,0BAA0B,KAAK,IAAI,EAAE,CAAC;YACxC,OAAO,IAAI,CAAC,OAAO,CAAC,0BAA0B,CAAC,CAAC;QAClD,CAAC;QAED,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,gCAAgC,GAAG,sBAAsB,EAAE,UAAU,IAAI,IAAI,CAAC;QACpF,IAAI,gCAAgC,KAAK,IAAI,EAAE,CAAC;YAC9C,MAAM,IAAI,KAAK,CACb,2DAA2D,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC,wCAAwC,gCAAgC,KAAK,oBAAoB,EAAE,EAAE,CACnM,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,KAAK,CACb,4CAA4C,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC,KAAK,oBAAoB,EAAE,EAAE,CAC5G,CAAC;IACJ,CAAC;IAED,mDAAmD;IACnD,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,gBAAgB,EAAE,YAAY,CAAC,CAAC;IAC5E,MAAM,mBAAmB,GAAG,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAEvF,6CAA6C;IAC7C,MAAM,sBAAsB,GAAG,mCAAmC,EAAE,CAAC;IACrE,MAAM,sBAAsB,GAAG,IAAI,GAAG,EAAU,CAAC;IACjD,MAAM,8BAA8B,GAAG,sBAAsB,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,cAAc,KAAK,IAAI,CAAC,CAAC;IAE7G,IAAI,mBAAmB,KAAK,IAAI,EAAE,CAAC;QACjC,sBAAsB,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IAClD,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,sBAAsB,EAAE,CAAC;QAC3C,IAAI,KAAK,CAAC,cAAc,KAAK,IAAI,EAAE,CAAC;YAClC,sBAAsB,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC;QACjE,CAAC;IACH,CAAC;IAED,IAAI,sBAAsB,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,8BAA8B,EAAE,CAAC;QACzE,OAAO,CAAC,GAAG,sBAAsB,CAAC,CAAC,CAAC,CAAW,CAAC;IAClD,CAAC;IAED,IAAI,CAAC,sBAAsB,CAAC,IAAI,GAAG,CAAC,IAAI,8BAA8B,CAAC,IAAI,sBAAsB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7G,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,IAAI,KAAK,CACb,8BAA8B,CAAC;YAC7B,qBAAqB,EAAE,mBAAmB;YAC1C,sBAAsB;SACvB,CAAC,CACH,CAAC;IACJ,CAAC;IAED,mBAAmB;IACnB,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,IAAI,KAAK,CACb,mBAAmB,oBAAoB,EAAE,EAAE,CAC5C,CAAC;AACJ,CAAC"}
@@ -0,0 +1,40 @@
1
+ export interface InstalledExtensionPackageJson {
2
+ name?: unknown;
3
+ version?: unknown;
4
+ private?: unknown;
5
+ type?: unknown;
6
+ openclaw?: {
7
+ extensions?: unknown;
8
+ };
9
+ dependencies?: Record<string, string>;
10
+ }
11
+ export interface InstalledPluginManifest {
12
+ id?: unknown;
13
+ name?: unknown;
14
+ description?: unknown;
15
+ version?: unknown;
16
+ configSchema?: unknown;
17
+ }
18
+ export interface ShadowProfileExtensionInstall {
19
+ openclawHome: string;
20
+ extensionsDir: string;
21
+ extensionDir: string;
22
+ manifestPath: string;
23
+ packageJsonPath: string;
24
+ loaderEntryPath: string;
25
+ runtimeGuardPath: string;
26
+ manifest: InstalledPluginManifest;
27
+ packageJson: InstalledExtensionPackageJson;
28
+ configuredEntries: string[];
29
+ }
30
+ export interface ShadowProfileExtensionLoadProof extends ShadowProfileExtensionInstall {
31
+ runtimeGuardExportNames: string[];
32
+ registeredEventName: string;
33
+ registeredPriority: number | null;
34
+ probeWarning: string;
35
+ probeResult: Record<string, unknown>;
36
+ diagnosticLogPath: string;
37
+ diagnosticLogContents: string;
38
+ }
39
+ export declare function inspectInstalledOpenClawBrainExtension(openclawHome: string, extensionId?: string): ShadowProfileExtensionInstall;
40
+ export declare function proveInstalledOpenClawBrainExtensionLoad(openclawHome: string, extensionId?: string): Promise<ShadowProfileExtensionLoadProof>;
@@ -0,0 +1,214 @@
1
+ import { existsSync, readFileSync } from "node:fs";
2
+ import { homedir } from "node:os";
3
+ import path from "node:path";
4
+ import { pathToFileURL } from "node:url";
5
+ const REQUIRED_RUNTIME_GUARD_EXPORTS = [
6
+ "createBeforePromptBuildHandler",
7
+ "isActivationRootPlaceholder",
8
+ "normalizePromptBuildEvent",
9
+ "validateExtensionRegistrationApi"
10
+ ];
11
+ export function inspectInstalledOpenClawBrainExtension(openclawHome, extensionId = "openclawbrain") {
12
+ const resolvedOpenclawHome = path.resolve(openclawHome);
13
+ const extensionsDir = path.join(resolvedOpenclawHome, "extensions");
14
+ const extensionDir = path.join(extensionsDir, extensionId);
15
+ if (!existsSync(extensionsDir)) {
16
+ throw new Error(`[shadow-extension-load-proof] OpenClaw extensions dir is missing: ${extensionsDir}`);
17
+ }
18
+ if (!existsSync(extensionDir)) {
19
+ throw new Error(`[shadow-extension-load-proof] Installed extension dir is missing: ${extensionDir}`);
20
+ }
21
+ const manifestPath = path.join(extensionDir, "openclaw.plugin.json");
22
+ const packageJsonPath = path.join(extensionDir, "package.json");
23
+ const runtimeGuardPath = path.join(extensionDir, "runtime-guard.js");
24
+ if (!existsSync(manifestPath)) {
25
+ throw new Error(`[shadow-extension-load-proof] Plugin manifest missing: ${manifestPath}`);
26
+ }
27
+ if (!existsSync(packageJsonPath)) {
28
+ throw new Error(`[shadow-extension-load-proof] Package manifest missing: ${packageJsonPath}`);
29
+ }
30
+ if (!existsSync(runtimeGuardPath)) {
31
+ throw new Error(`[shadow-extension-load-proof] Installed runtime-guard.js is missing: ${runtimeGuardPath}`);
32
+ }
33
+ const manifest = readRequiredJson(manifestPath, "plugin manifest");
34
+ if (manifest.id !== extensionId) {
35
+ throw new Error(`[shadow-extension-load-proof] Plugin manifest id must be ${JSON.stringify(extensionId)} at ${manifestPath} ` +
36
+ `(received=${describeValue(manifest.id)})`);
37
+ }
38
+ if (typeof manifest.version !== "string" || manifest.version.trim().length === 0) {
39
+ throw new Error(`[shadow-extension-load-proof] Plugin manifest version must be a non-empty string at ${manifestPath}`);
40
+ }
41
+ const packageJson = readRequiredJson(packageJsonPath, "package manifest");
42
+ const configuredEntries = readConfiguredEntries(packageJson, packageJsonPath);
43
+ const loaderEntryPath = resolveLoaderEntryPath(extensionDir, configuredEntries);
44
+ if (packageJson.type !== "module") {
45
+ throw new Error(`[shadow-extension-load-proof] Installed package manifest must declare \"type\": \"module\" at ${packageJsonPath} ` +
46
+ `(received=${describeValue(packageJson.type)})`);
47
+ }
48
+ if (typeof packageJson.version === "string" &&
49
+ packageJson.version.trim().length > 0 &&
50
+ packageJson.version !== manifest.version) {
51
+ throw new Error(`[shadow-extension-load-proof] Installed package and plugin manifest versions disagree ` +
52
+ `(package=${packageJson.version}, manifest=${manifest.version})`);
53
+ }
54
+ return {
55
+ openclawHome: resolvedOpenclawHome,
56
+ extensionsDir,
57
+ extensionDir,
58
+ manifestPath,
59
+ packageJsonPath,
60
+ loaderEntryPath,
61
+ runtimeGuardPath,
62
+ manifest,
63
+ packageJson,
64
+ configuredEntries
65
+ };
66
+ }
67
+ export async function proveInstalledOpenClawBrainExtensionLoad(openclawHome, extensionId = "openclawbrain") {
68
+ const inspected = inspectInstalledOpenClawBrainExtension(openclawHome, extensionId);
69
+ const runtimeGuardModule = await importWithHelpfulError(inspected.runtimeGuardPath, "runtime-guard.js");
70
+ const runtimeGuardExportNames = Object.keys(runtimeGuardModule).sort((left, right) => left.localeCompare(right));
71
+ const missingRuntimeGuardExports = REQUIRED_RUNTIME_GUARD_EXPORTS.filter((exportName) => !runtimeGuardExportNames.includes(exportName));
72
+ if (missingRuntimeGuardExports.length > 0) {
73
+ throw new Error(`[shadow-extension-load-proof] Installed runtime-guard.js is missing required exports ` +
74
+ `${missingRuntimeGuardExports.join(", ")} at ${inspected.runtimeGuardPath}`);
75
+ }
76
+ const loaderModule = await importWithHelpfulError(inspected.loaderEntryPath, "loader entry");
77
+ if (typeof loaderModule.default !== "function") {
78
+ throw new Error(`[shadow-extension-load-proof] Installed loader entry default export must be a function at ${inspected.loaderEntryPath} ` +
79
+ `(received=${describeValue(loaderModule.default)})`);
80
+ }
81
+ const registrations = [];
82
+ loaderModule.default({
83
+ on(eventName, handler, options) {
84
+ registrations.push({
85
+ eventName,
86
+ handler,
87
+ priority: typeof options?.priority === "number" ? options.priority : null
88
+ });
89
+ }
90
+ });
91
+ if (registrations.length !== 1) {
92
+ throw new Error(`[shadow-extension-load-proof] Installed loader must register exactly one hook ` +
93
+ `(received=${registrations.length})`);
94
+ }
95
+ const registeredHook = registrations[0];
96
+ if (registeredHook.eventName !== "before_prompt_build") {
97
+ throw new Error(`[shadow-extension-load-proof] Installed loader must register before_prompt_build ` +
98
+ `(received=${JSON.stringify(registeredHook.eventName)})`);
99
+ }
100
+ if (registeredHook.priority !== 5) {
101
+ throw new Error(`[shadow-extension-load-proof] Installed loader must register before_prompt_build with priority 5 ` +
102
+ `(received=${registeredHook.priority === null ? "null" : String(registeredHook.priority)})`);
103
+ }
104
+ const warnings = [];
105
+ const originalWarn = console.warn;
106
+ console.warn = (...args) => {
107
+ warnings.push(args.map((value) => String(value)).join(" "));
108
+ };
109
+ let probeResult;
110
+ try {
111
+ probeResult = await registeredHook.handler({
112
+ messages: {
113
+ content: "not-an-array"
114
+ }
115
+ }, {});
116
+ }
117
+ finally {
118
+ console.warn = originalWarn;
119
+ }
120
+ if (!isRecord(probeResult) || Object.keys(probeResult).length !== 0) {
121
+ throw new Error(`[shadow-extension-load-proof] Malformed before_prompt_build probe must fail open with an empty object ` +
122
+ `(received=${describeValue(probeResult)})`);
123
+ }
124
+ const probeWarning = warnings.find((message) => message.includes("before_prompt_build event.messages is not an array"));
125
+ if (probeWarning === undefined) {
126
+ throw new Error(`[shadow-extension-load-proof] Installed runtime-guard did not emit the expected malformed-event diagnostic ` +
127
+ `(warnings=${warnings.length === 0 ? "none" : warnings.join(" | ")})`);
128
+ }
129
+ const diagnosticLogPath = path.join(homedir(), ".openclawbrain", "extension-errors.log");
130
+ if (!existsSync(diagnosticLogPath)) {
131
+ throw new Error(`[shadow-extension-load-proof] Installed runtime-guard did not write a local diagnostic log at ${diagnosticLogPath}`);
132
+ }
133
+ const diagnosticLogContents = readFileSync(diagnosticLogPath, "utf8");
134
+ if (!diagnosticLogContents.includes("before_prompt_build event.messages is not an array")) {
135
+ throw new Error(`[shadow-extension-load-proof] Local diagnostic log at ${diagnosticLogPath} does not contain the malformed-event failure`);
136
+ }
137
+ return {
138
+ ...inspected,
139
+ runtimeGuardExportNames,
140
+ registeredEventName: registeredHook.eventName,
141
+ registeredPriority: registeredHook.priority,
142
+ probeWarning,
143
+ probeResult,
144
+ diagnosticLogPath,
145
+ diagnosticLogContents
146
+ };
147
+ }
148
+ function readRequiredJson(filePath, label) {
149
+ let raw;
150
+ try {
151
+ raw = readFileSync(filePath, "utf8");
152
+ }
153
+ catch (error) {
154
+ const detail = error instanceof Error ? error.message : String(error);
155
+ throw new Error(`[shadow-extension-load-proof] Failed to read ${label} at ${filePath}: ${detail}`);
156
+ }
157
+ try {
158
+ return JSON.parse(raw);
159
+ }
160
+ catch (error) {
161
+ const detail = error instanceof Error ? error.message : String(error);
162
+ throw new Error(`[shadow-extension-load-proof] Failed to parse ${label} at ${filePath}: ${detail}`);
163
+ }
164
+ }
165
+ function readConfiguredEntries(packageJson, packageJsonPath) {
166
+ const extensions = packageJson.openclaw?.extensions;
167
+ if (!Array.isArray(extensions)) {
168
+ throw new Error(`[shadow-extension-load-proof] Installed package manifest must expose openclaw.extensions as a non-empty string array at ${packageJsonPath} ` +
169
+ `(received=${describeValue(extensions)})`);
170
+ }
171
+ const configuredEntries = extensions.filter((entry) => typeof entry === "string" && entry.trim().length > 0);
172
+ if (configuredEntries.length === 0) {
173
+ throw new Error(`[shadow-extension-load-proof] Installed package manifest openclaw.extensions is empty at ${packageJsonPath}`);
174
+ }
175
+ return configuredEntries;
176
+ }
177
+ function resolveLoaderEntryPath(extensionDir, configuredEntries) {
178
+ for (const configuredEntry of configuredEntries) {
179
+ const candidate = path.join(extensionDir, configuredEntry);
180
+ if (existsSync(candidate)) {
181
+ return candidate;
182
+ }
183
+ }
184
+ throw new Error(`[shadow-extension-load-proof] Installed package manifest points at missing loader entries in ${extensionDir} ` +
185
+ `(configured=${configuredEntries.join(", ")})`);
186
+ }
187
+ async function importWithHelpfulError(filePath, label) {
188
+ try {
189
+ return await import(pathToFileURL(filePath).href);
190
+ }
191
+ catch (error) {
192
+ const detail = error instanceof Error ? error.stack ?? error.message : String(error);
193
+ throw new Error(`[shadow-extension-load-proof] Installed ${label} failed to import from ${filePath}: ${detail}`);
194
+ }
195
+ }
196
+ function describeValue(value) {
197
+ if (value === null) {
198
+ return "null";
199
+ }
200
+ if (Array.isArray(value)) {
201
+ return `array(len=${value.length})`;
202
+ }
203
+ if (typeof value === "string") {
204
+ return `string(${JSON.stringify(value)})`;
205
+ }
206
+ if (typeof value === "object") {
207
+ return `object(keys=${Object.keys(value).join(",") || "none"})`;
208
+ }
209
+ return `${typeof value}(${String(value)})`;
210
+ }
211
+ function isRecord(value) {
212
+ return typeof value === "object" && value !== null;
213
+ }
214
+ //# sourceMappingURL=shadow-extension-proof.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shadow-extension-proof.js","sourceRoot":"","sources":["../../src/shadow-extension-proof.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ import { type NormalizedEventExportV1, type TeacherSupervisionArtifactV1 } from "@openclawbrain/contracts";
2
+ import type { LearningSpineServeRouteDecisionLogEntryV1 } from "@openclawbrain/pack-format";
3
+ export interface TeacherLabelerRunInputV1 {
4
+ normalizedEventExport: NormalizedEventExportV1;
5
+ observedAt: string;
6
+ staleAfterMs: number;
7
+ serveTimeDecisions?: readonly LearningSpineServeRouteDecisionLogEntryV1[];
8
+ existingArtifacts?: readonly TeacherSupervisionArtifactV1[];
9
+ }
10
+ export interface TeacherLabelerResultV1 {
11
+ artifacts: TeacherSupervisionArtifactV1[];
12
+ status: "ok" | "skipped" | "fail_open";
13
+ detail: string;
14
+ }
15
+ export interface TeacherLabeler {
16
+ label(input: TeacherLabelerRunInputV1): Promise<TeacherLabelerResultV1>;
17
+ }
18
+ export interface OllamaTeacherLabelerGenerateInputV1 {
19
+ model: string;
20
+ prompt: string;
21
+ maxOutputTokens: number;
22
+ timeoutMs: number;
23
+ }
24
+ export interface OllamaTeacherLabelerClient {
25
+ generate(input: OllamaTeacherLabelerGenerateInputV1): Promise<{
26
+ response: string;
27
+ }>;
28
+ }
29
+ export interface AsyncTeacherOllamaLabelerConfigV1 {
30
+ provider: "ollama";
31
+ baseUrl?: string;
32
+ model?: string;
33
+ timeoutMs?: number;
34
+ maxPromptChars?: number;
35
+ maxResponseChars?: number;
36
+ maxOutputTokens?: number;
37
+ maxArtifactsPerExport?: number;
38
+ maxInteractionsPerExport?: number;
39
+ maxUserMessageChars?: number;
40
+ maxContextIdsPerDecision?: number;
41
+ teacherIdentity?: string;
42
+ client?: OllamaTeacherLabelerClient;
43
+ }
44
+ export interface AsyncTeacherNoopLabelerConfigV1 {
45
+ provider: "none";
46
+ }
47
+ export type AsyncTeacherLabelerConfigV1 = AsyncTeacherNoopLabelerConfigV1 | AsyncTeacherOllamaLabelerConfigV1;
48
+ export declare function createHttpOllamaTeacherLabelerClient(baseUrl?: string): OllamaTeacherLabelerClient;
49
+ export declare function createOllamaTeacherLabeler(config: AsyncTeacherOllamaLabelerConfigV1): TeacherLabeler;
50
+ export declare function createTeacherLabeler(config: AsyncTeacherLabelerConfigV1 | null | undefined): TeacherLabeler | null;