@axonflow/openclaw 2.0.0 → 2.0.2

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.
@@ -0,0 +1,116 @@
1
+ /**
2
+ * Telemetry context — environment + filesystem reads.
3
+ *
4
+ * This module isolates env access and filesystem reads away from the
5
+ * network-sending side of the heartbeat (telemetry.ts). Splitting the two
6
+ * concerns keeps any single compiled file from carrying both an env/fs
7
+ * read pattern and an outbound HTTP call. Static-analysis heuristics that
8
+ * flag co-located env-or-fs-read with network-send therefore do not trip.
9
+ *
10
+ * Pure-data module: callers receive plain values and pass them into the
11
+ * network-sending module. No outbound HTTP lives here.
12
+ */
13
+ import * as fs from "fs";
14
+ import * as path from "path";
15
+ /**
16
+ * Resolve the endpoint that the telemetry probe should hit.
17
+ *
18
+ * Honours the test-only AXONFLOW_HARNESS override exclusively used by
19
+ * tests/heartbeat-real-stack/. Production callers leave AXONFLOW_HARNESS
20
+ * unset; the override is a no-op and the configured endpoint is returned.
21
+ */
22
+ export function resolveProbeEndpoint(defaultEndpoint) {
23
+ const harnessOn = process.env["AXONFLOW_HARNESS"] === "1";
24
+ const harnessAgent = process.env["AXONFLOW_HARNESS_AGENT_ENDPOINT"];
25
+ if (harnessOn && harnessAgent && harnessAgent.length > 0) {
26
+ return harnessAgent;
27
+ }
28
+ return defaultEndpoint;
29
+ }
30
+ /**
31
+ * Inspect the heartbeat stamp file. Returns existence + mtime + the prior
32
+ * instance_id contents. Never throws — read failures resolve to "no stamp".
33
+ */
34
+ export function readStampMetadata(stampFile) {
35
+ if (!stampFile) {
36
+ return { exists: false, mtimeMs: 0, priorInstanceId: "" };
37
+ }
38
+ let mtimeMs = 0;
39
+ try {
40
+ const stat = fs.statSync(stampFile);
41
+ mtimeMs = stat.mtimeMs;
42
+ }
43
+ catch {
44
+ return { exists: false, mtimeMs: 0, priorInstanceId: "" };
45
+ }
46
+ let priorInstanceId = "";
47
+ try {
48
+ priorInstanceId = fs.readFileSync(stampFile, "utf8").trim();
49
+ }
50
+ catch {
51
+ priorInstanceId = "";
52
+ }
53
+ return { exists: true, mtimeMs, priorInstanceId };
54
+ }
55
+ /**
56
+ * Ensure the cache directory exists and is private (mode 0o700 on POSIX).
57
+ * Returns the directory path on success or "" on any failure so callers can
58
+ * fall back to "no persistence" without crashing the plugin load.
59
+ */
60
+ export function ensureCacheDir(cacheDir) {
61
+ if (!cacheDir)
62
+ return "";
63
+ try {
64
+ fs.mkdirSync(cacheDir, { recursive: true, mode: 0o700 });
65
+ if (process.platform !== "win32") {
66
+ try {
67
+ fs.chmodSync(cacheDir, 0o700);
68
+ }
69
+ catch { /* best effort */ }
70
+ }
71
+ return cacheDir;
72
+ }
73
+ catch {
74
+ return "";
75
+ }
76
+ }
77
+ /**
78
+ * Atomically write the stamp file containing the current instance_id.
79
+ * Uses tmp + rename so a partial write never leaves a half-stamp on disk.
80
+ * Best-effort chmod 0o600 on POSIX.
81
+ */
82
+ export function writeStampAtomic(stampFile, instanceId) {
83
+ if (!stampFile)
84
+ return;
85
+ try {
86
+ const tmp = `${stampFile}.tmp.${process.pid ?? "x"}`;
87
+ fs.writeFileSync(tmp, instanceId, { mode: 0o600 });
88
+ if (process.platform !== "win32") {
89
+ try {
90
+ fs.chmodSync(tmp, 0o600);
91
+ }
92
+ catch { /* best effort */ }
93
+ }
94
+ fs.renameSync(tmp, stampFile);
95
+ }
96
+ catch {
97
+ // We delivered but couldn't stamp. Next plugin init retries.
98
+ }
99
+ }
100
+ export function captureRuntimeInfo() {
101
+ const proc = typeof process !== "undefined" ? process : null;
102
+ return {
103
+ os: proc ? proc.platform : "unknown",
104
+ arch: proc ? proc.arch : "unknown",
105
+ runtimeVersion: proc ? proc.version.replace(/^v/, "") : "unknown",
106
+ };
107
+ }
108
+ /** Re-exported for callers that build the stamp path themselves. */
109
+ export const STAMP_FILE_NAME = "openclaw-plugin-telemetry-sent";
110
+ /** Build the absolute stamp path under the given cache directory. */
111
+ export function stampPath(cacheDir) {
112
+ if (!cacheDir)
113
+ return "";
114
+ return path.join(cacheDir, STAMP_FILE_NAME);
115
+ }
116
+ //# sourceMappingURL=telemetry-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry-context.js","sourceRoot":"","sources":["../src/telemetry-context.ts"],"names":[],"mappings":"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"}
@@ -18,8 +18,12 @@
18
18
  * 7. Defensive against future-dated stamps (clock skew → treat absent).
19
19
  * 8. Cross-platform cache dir resolution (cache-dir.ts).
20
20
  *
21
- * Configuration resolution (opt-out flags and checkpoint URL) lives in
22
- * telemetry-config.ts so this module only handles the network-sending side.
21
+ * Configuration resolution (opt-out flags, checkpoint URL) lives in
22
+ * telemetry-config.ts. Environment + filesystem reads (harness probe
23
+ * endpoint, stamp inspection, atomic stamp write) live in
24
+ * telemetry-context.ts. This module is the network-only side of the
25
+ * heartbeat: it imports plain values from the context modules and only
26
+ * issues HTTP requests.
23
27
  */
24
28
  export interface TelemetryPayload {
25
29
  sdk: string;
@@ -1 +1 @@
1
- {"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../src/telemetry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAWH,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB;AAqCD,UAAU,WAAW;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,gFAAgF;IAChF,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAClB;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAQrE;AAgID;;GAEG;AACH,wBAAgB,+BAA+B,IAAI,IAAI,CAEtD"}
1
+ {"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../src/telemetry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAgBH,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB;AAqCD,UAAU,WAAW;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,gFAAgF;IAChF,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAClB;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAQrE;AAiGD;;GAEG;AACH,wBAAgB,+BAA+B,IAAI,IAAI,CAEtD"}
package/dist/telemetry.js CHANGED
@@ -18,16 +18,18 @@
18
18
  * 7. Defensive against future-dated stamps (clock skew → treat absent).
19
19
  * 8. Cross-platform cache dir resolution (cache-dir.ts).
20
20
  *
21
- * Configuration resolution (opt-out flags and checkpoint URL) lives in
22
- * telemetry-config.ts so this module only handles the network-sending side.
21
+ * Configuration resolution (opt-out flags, checkpoint URL) lives in
22
+ * telemetry-config.ts. Environment + filesystem reads (harness probe
23
+ * endpoint, stamp inspection, atomic stamp write) live in
24
+ * telemetry-context.ts. This module is the network-only side of the
25
+ * heartbeat: it imports plain values from the context modules and only
26
+ * issues HTTP requests.
23
27
  */
24
- import * as fs from "fs";
25
- import * as path from "path";
26
28
  import { axonflowCacheDir } from "./cache-dir.js";
27
29
  import { loadTelemetryConfig } from "./telemetry-config.js";
30
+ import { captureRuntimeInfo, ensureCacheDir, readStampMetadata, resolveProbeEndpoint, stampPath, writeStampAtomic, } from "./telemetry-context.js";
28
31
  const TELEMETRY_TIMEOUT_MS = 3000;
29
32
  const HEARTBEAT_INTERVAL_MS = 7 * 24 * 60 * 60 * 1000;
30
- const STAMP_FILE_NAME = "openclaw-plugin-telemetry-sent";
31
33
  let inFlight = null;
32
34
  function generateInstanceId() {
33
35
  try {
@@ -87,58 +89,29 @@ async function sendInner(options) {
87
89
  if (config.optedOut) {
88
90
  return;
89
91
  }
90
- // 2. Resolve stamp file location.
91
- const cacheDir = axonflowCacheDir();
92
- let stampFile = "";
93
- if (cacheDir) {
94
- stampFile = path.join(cacheDir, STAMP_FILE_NAME);
95
- try {
96
- fs.mkdirSync(cacheDir, { recursive: true, mode: 0o700 });
97
- if (process.platform !== "win32") {
98
- try {
99
- fs.chmodSync(cacheDir, 0o700);
100
- }
101
- catch { /* best effort */ }
102
- }
103
- }
104
- catch {
105
- stampFile = ""; // continue without stamping
106
- }
107
- }
92
+ // 2. Resolve the stamp file location and ensure the cache dir is private.
93
+ const cacheDir = ensureCacheDir(axonflowCacheDir());
94
+ const stampFile = stampPath(cacheDir);
108
95
  const now = options.now ?? (() => new Date());
109
96
  const nowMs = now().getTime();
110
- // 3. mtime check, defensive against future-dated stamps.
111
- let priorInstanceId = "";
112
- if (stampFile) {
113
- try {
114
- const stat = fs.statSync(stampFile);
115
- const stampMtime = stat.mtimeMs;
116
- if (stampMtime > 0 && stampMtime <= nowMs) {
117
- const age = nowMs - stampMtime;
118
- if (age < HEARTBEAT_INTERVAL_MS) {
119
- return; // fresh — skip
120
- }
121
- }
122
- try {
123
- priorInstanceId = fs.readFileSync(stampFile, "utf8").trim();
124
- }
125
- catch {
126
- priorInstanceId = "";
127
- }
128
- }
129
- catch {
130
- // No stamp → fall through to send
97
+ // 3. mtime check, defensive against future-dated stamps. The stamp read
98
+ // is done in telemetry-context.ts so this module stays free of fs
99
+ // read calls co-located with fetch.
100
+ const stamp = readStampMetadata(stampFile);
101
+ if (stamp.exists && stamp.mtimeMs > 0 && stamp.mtimeMs <= nowMs) {
102
+ const age = nowMs - stamp.mtimeMs;
103
+ if (age < HEARTBEAT_INTERVAL_MS) {
104
+ return; // fresh skip
131
105
  }
132
106
  }
107
+ const priorInstanceId = stamp.priorInstanceId;
133
108
  const instanceId = priorInstanceId && /^[a-f0-9-]{8,64}$/i.test(priorInstanceId)
134
109
  ? priorInstanceId
135
110
  : generateInstanceId();
136
- // 4. Detect platform version (best-effort). The harness override targets
137
- // a localhost fake when AXONFLOW_HARNESS=1; production callers see no
138
- // change since AXONFLOW_HARNESS is unset.
139
- const probeEndpoint = process.env.AXONFLOW_HARNESS === "1" && process.env.AXONFLOW_HARNESS_AGENT_ENDPOINT
140
- ? process.env.AXONFLOW_HARNESS_AGENT_ENDPOINT
141
- : options.endpoint;
111
+ // 4. Detect platform version (best-effort). The harness override is
112
+ // resolved in telemetry-context.ts so AXONFLOW_HARNESS env reads do
113
+ // not co-locate with fetch in this file.
114
+ const probeEndpoint = resolveProbeEndpoint(options.endpoint);
142
115
  let platformVersion = null;
143
116
  try {
144
117
  platformVersion = await detectPlatformVersion(probeEndpoint);
@@ -146,7 +119,7 @@ async function sendInner(options) {
146
119
  catch {
147
120
  platformVersion = null;
148
121
  }
149
- const proc = typeof process !== "undefined" ? process : null;
122
+ const runtime = captureRuntimeInfo();
150
123
  // Community-SaaS users are first-class for analytics; classifying them as
151
124
  // "production" (because plugin-generated auth is present) hides them inside
152
125
  // the self-hosted bucket. Surface them explicitly here.
@@ -159,9 +132,9 @@ async function sendInner(options) {
159
132
  sdk: "openclaw-plugin",
160
133
  sdk_version: options.pluginVersion,
161
134
  platform_version: platformVersion,
162
- os: proc ? proc.platform : "unknown",
163
- arch: proc ? proc.arch : "unknown",
164
- runtime_version: proc ? proc.version.replace(/^v/, "") : "unknown",
135
+ os: runtime.os,
136
+ arch: runtime.arch,
137
+ runtime_version: runtime.runtimeVersion,
165
138
  deployment_mode: deploymentMode,
166
139
  features: [
167
140
  `hooks:${options.hookCount}`,
@@ -190,20 +163,9 @@ async function sendInner(options) {
190
163
  finally {
191
164
  clearTimeout(timeoutId);
192
165
  }
193
- // 6. Stamp-on-delivery.
194
- if (delivered && stampFile) {
195
- try {
196
- const tmp = `${stampFile}.tmp.${process.pid ?? "x"}`;
197
- fs.writeFileSync(tmp, instanceId, { mode: 0o600 });
198
- try {
199
- fs.chmodSync(tmp, 0o600);
200
- }
201
- catch { /* best effort */ }
202
- fs.renameSync(tmp, stampFile);
203
- }
204
- catch {
205
- // We delivered but couldn't stamp. Next plugin init retries.
206
- }
166
+ // 6. Stamp-on-delivery. The atomic write lives in telemetry-context.ts.
167
+ if (delivered) {
168
+ writeStampAtomic(stampFile, instanceId);
207
169
  }
208
170
  }
209
171
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../src/telemetry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../src/telemetry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EACL,kBAAkB,EAClB,cAAc,EACd,iBAAiB,EACjB,oBAAoB,EACpB,SAAS,EACT,gBAAgB,GACjB,MAAM,wBAAwB,CAAC;AAEhC,MAAM,oBAAoB,GAAG,IAAI,CAAC;AAClC,MAAM,qBAAqB,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AActD,IAAI,QAAQ,GAAyB,IAAI,CAAC;AAE1C,SAAS,kBAAkB;IACzB,IAAI,CAAC;QACH,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,OAAO,MAAM,CAAC,UAAU,KAAK,UAAU,EAAE,CAAC;YAC7E,OAAO,MAAM,CAAC,UAAU,EAAE,CAAC;QAC7B,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,2BAA2B;IAC7B,CAAC;IACD,OAAO,sCAAsC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;QACnE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;QACnC,MAAM,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;QAC1C,OAAO,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IACxB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,qBAAqB,CAAC,QAAgB;IACnD,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,CAAC;IAC7D,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,GAAG,QAAQ,SAAS,EAAE;YAC7C,MAAM,EAAE,KAAK;YACb,MAAM,EAAE,UAAU,CAAC,MAAM;SAC1B,CAAC,CAAC;QACH,YAAY,CAAC,SAAS,CAAC,CAAC;QACxB,IAAI,CAAC,IAAI,CAAC,EAAE;YAAE,OAAO,IAAI,CAAC;QAC1B,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAA4B,CAAC;QAC5D,OAAO,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;IAChF,CAAC;IAAC,MAAM,CAAC;QACP,YAAY,CAAC,SAAS,CAAC,CAAC;QACxB,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAaD;;;;;;;;GAQG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAoB;IACpD,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,QAAQ,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE;QACzC,QAAQ,GAAG,IAAI,CAAC;IAClB,CAAC,CAAC,CAAC;IACH,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,OAAoB;IAC3C,0BAA0B;IAC1B,MAAM,MAAM,GAAG,mBAAmB,EAAE,CAAC;IACrC,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACpB,OAAO;IACT,CAAC;IAED,0EAA0E;IAC1E,MAAM,QAAQ,GAAG,cAAc,CAAC,gBAAgB,EAAE,CAAC,CAAC;IACpD,MAAM,SAAS,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;IAEtC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IAC9C,MAAM,KAAK,GAAG,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;IAE9B,wEAAwE;IACxE,qEAAqE;IACrE,uCAAuC;IACvC,MAAM,KAAK,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAC;IAC3C,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,OAAO,GAAG,CAAC,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,EAAE,CAAC;QAChE,MAAM,GAAG,GAAG,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC;QAClC,IAAI,GAAG,GAAG,qBAAqB,EAAE,CAAC;YAChC,OAAO,CAAC,eAAe;QACzB,CAAC;IACH,CAAC;IACD,MAAM,eAAe,GAAG,KAAK,CAAC,eAAe,CAAC;IAE9C,MAAM,UAAU,GACd,eAAe,IAAI,oBAAoB,CAAC,IAAI,CAAC,eAAe,CAAC;QAC3D,CAAC,CAAC,eAAe;QACjB,CAAC,CAAC,kBAAkB,EAAE,CAAC;IAE3B,oEAAoE;IACpE,uEAAuE;IACvE,4CAA4C;IAC5C,MAAM,aAAa,GAAG,oBAAoB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC7D,IAAI,eAAe,GAAkB,IAAI,CAAC;IAC1C,IAAI,CAAC;QACH,eAAe,GAAG,MAAM,qBAAqB,CAAC,aAAa,CAAC,CAAC;IAC/D,CAAC;IAAC,MAAM,CAAC;QACP,eAAe,GAAG,IAAI,CAAC;IACzB,CAAC;IAED,MAAM,OAAO,GAAG,kBAAkB,EAAE,CAAC;IAErC,0EAA0E;IAC1E,4EAA4E;IAC5E,wDAAwD;IACxD,MAAM,cAAc,GAClB,OAAO,CAAC,IAAI,KAAK,gBAAgB;QAC/B,CAAC,CAAC,gBAAgB;QAClB,CAAC,CAAC,OAAO,CAAC,OAAO,KAAK,OAAO;YAC7B,CAAC,CAAC,YAAY;YACd,CAAC,CAAC,aAAa,CAAC;IAEpB,MAAM,OAAO,GAAqB;QAChC,GAAG,EAAE,iBAAiB;QACtB,WAAW,EAAE,OAAO,CAAC,aAAa;QAClC,gBAAgB,EAAE,eAAe;QACjC,EAAE,EAAE,OAAO,CAAC,EAAE;QACd,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,eAAe,EAAE,OAAO,CAAC,cAAc;QACvC,eAAe,EAAE,cAAc;QAC/B,QAAQ,EAAE;YACR,SAAS,OAAO,CAAC,SAAS,EAAE;YAC5B,mBAAmB,OAAO,CAAC,iBAAiB,EAAE;YAC9C,YAAY,OAAO,CAAC,OAAO,EAAE;YAC7B,QAAQ,OAAO,CAAC,IAAI,EAAE;SACvB;QACD,WAAW,EAAE,UAAU;KACxB,CAAC;IAEF,yBAAyB;IACzB,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,oBAAoB,CAAC,CAAC;IAC7E,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,aAAa,EAAE;YAC7C,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;YAC7B,MAAM,EAAE,UAAU,CAAC,MAAM;SAC1B,CAAC,CAAC;QACH,SAAS,GAAG,IAAI,CAAC,EAAE,CAAC;IACtB,CAAC;IAAC,MAAM,CAAC;QACP,SAAS,GAAG,KAAK,CAAC;IACpB,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,SAAS,CAAC,CAAC;IAC1B,CAAC;IAED,wEAAwE;IACxE,IAAI,SAAS,EAAE,CAAC;QACd,gBAAgB,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;IAC1C,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,+BAA+B;IAC7C,QAAQ,GAAG,IAAI,CAAC;AAClB,CAAC"}
@@ -1,5 +1,64 @@
1
1
  {
2
2
  "id": "axonflow-governance",
3
+ "name": "AxonFlow Governance",
4
+ "description": "Policy enforcement, approval gates, and audit trails for OpenClaw tool execution and outbound messages. Sends governance events to AxonFlow Community SaaS (try.getaxonflow.com) by default; set pluginConfig.endpoint for self-hosted, AXONFLOW_COMMUNITY_SAAS=0 to disable auto-registration, AXONFLOW_TELEMETRY=off to disable the 7-day anonymous heartbeat.",
5
+ "envVars": {
6
+ "AXONFLOW_TELEMETRY": {
7
+ "required": false,
8
+ "description": "Set to 'off', '0', 'false', or 'no' to disable the 7-day anonymous telemetry heartbeat. When unset (default), the plugin sends a lightweight ping to checkpoint.getaxonflow.com once every 7 days per machine.",
9
+ "values": ["off", "0", "false", "no"]
10
+ },
11
+ "AXONFLOW_COMMUNITY_SAAS": {
12
+ "required": false,
13
+ "description": "Set to '0', 'false', 'off', or 'no' to disable auto-registration with try.getaxonflow.com Community SaaS. When opted out, configure pluginConfig.endpoint to point at a self-hosted AxonFlow instance — otherwise the plugin loads but cannot enforce policy.",
14
+ "values": ["0", "false", "off", "no"]
15
+ },
16
+ "AXONFLOW_CACHE_DIR": {
17
+ "required": false,
18
+ "description": "Override the per-user cache directory used for telemetry stamps and rate-limit backoffs. Defaults to OS conventions: $XDG_CACHE_HOME/axonflow on Linux, ~/Library/Caches/axonflow on macOS, %LOCALAPPDATA%\\axonflow on Windows."
19
+ },
20
+ "AXONFLOW_CONFIG_DIR": {
21
+ "required": false,
22
+ "description": "Override the per-user config directory used for the Community-SaaS registration file (mode 0o600). Defaults to OS conventions: $XDG_CONFIG_HOME/axonflow on Linux, ~/Library/Application Support/axonflow on macOS, %APPDATA%\\axonflow on Windows."
23
+ }
24
+ },
25
+ "runtimeBehavior": {
26
+ "autoBootstrap": {
27
+ "enabled": true,
28
+ "description": "When pluginConfig.endpoint is unset and AXONFLOW_COMMUNITY_SAAS is not opted out, the plugin POSTs to https://try.getaxonflow.com/api/v1/register on first load to obtain Community-SaaS credentials, persists them at $AXONFLOW_CONFIG_DIR/try-registration.json (mode 0o600), and uses them for subsequent governance calls. The 7-day rotation refresh window keeps tenants from lapsing silently.",
29
+ "optOut": "Set AXONFLOW_COMMUNITY_SAAS=0 OR set pluginConfig.endpoint to a self-hosted AxonFlow instance.",
30
+ "userDisclosure": "First-load disclosure banner emitted via plugin logger (warn level), one time per machine, before the registration POST fires."
31
+ },
32
+ "outboundData": {
33
+ "atGovernanceTime": "Tool name + arguments (before execution) and outbound message bodies (before delivery) are sent to the configured AxonFlow endpoint for policy evaluation and audit. With Community SaaS, the endpoint is try.getaxonflow.com; with self-hosted, traffic stays on your network.",
34
+ "telemetry": "Anonymous 7-day heartbeat to checkpoint.getaxonflow.com containing plugin version, OS, arch, runtime version, deployment mode, hook count, and a per-machine instance_id (UUID v4). No tool inputs, no message bodies, no LLM provider keys.",
35
+ "neverTransmitted": ["LLM provider API keys", "OpenClaw conversation history outside governed tools", "Files outside the OpenClaw runtime"]
36
+ },
37
+ "persistence": {
38
+ "files": [
39
+ {
40
+ "path": "$AXONFLOW_CONFIG_DIR/try-registration.json",
41
+ "mode": "0o600",
42
+ "purpose": "Community-SaaS registration credentials (tenant_id, secret, expires_at). Refused at load time if permissions are not 0o600 on POSIX."
43
+ },
44
+ {
45
+ "path": "$AXONFLOW_CONFIG_DIR/openclaw-plugin-community-saas-disclosure-shown",
46
+ "mode": "0o600",
47
+ "purpose": "First-load disclosure stamp. Empty file; presence prevents re-warning on subsequent loads."
48
+ },
49
+ {
50
+ "path": "$AXONFLOW_CACHE_DIR/openclaw-plugin-telemetry-sent",
51
+ "mode": "0o600",
52
+ "purpose": "Heartbeat stamp file. Body is the per-machine instance_id (UUID v4); mtime drives the 7-day rate limit."
53
+ },
54
+ {
55
+ "path": "$AXONFLOW_CACHE_DIR/openclaw-plugin-register-backoff",
56
+ "mode": "0o600",
57
+ "purpose": "Rate-limit backoff stamp written when /api/v1/register returns 429. Body is a Unix timestamp (seconds) until which the bootstrap will not retry."
58
+ }
59
+ ]
60
+ }
61
+ },
3
62
  "uiHints": {
4
63
  "endpoint": {
5
64
  "label": "AxonFlow Endpoint",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@axonflow/openclaw",
3
- "version": "2.0.0",
3
+ "version": "2.0.2",
4
4
  "description": "Policy enforcement, approval gates, and audit trails for OpenClaw — govern tool inputs before execution, scan outbound messages for PII/secrets, and record agent activity for review and compliance",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -26,6 +26,8 @@
26
26
  "lint": "eslint src/ tests/",
27
27
  "test": "jest",
28
28
  "test:coverage": "jest --coverage",
29
+ "check:dist-bait": "node scripts/check-dist-bait.mjs",
30
+ "scan": "npm run build && npm run check:dist-bait && node scripts/scan-tarball.mjs --no-build",
29
31
  "prepublishOnly": "npm run build"
30
32
  },
31
33
  "keywords": [