@cfio/cohort-sync 0.11.0 → 0.11.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.
package/dist/index.js CHANGED
@@ -13334,7 +13334,7 @@ function dumpCtx(ctx) {
13334
13334
  function dumpEvent(event) {
13335
13335
  return dumpCtx(event);
13336
13336
  }
13337
- var PLUGIN_VERSION = true ? "0.11.0" : "unknown";
13337
+ var PLUGIN_VERSION = true ? "0.11.2" : "unknown";
13338
13338
  function resolveGatewayToken(api) {
13339
13339
  const token = api.config?.gateway?.auth?.token;
13340
13340
  return typeof token === "string" ? token : null;
@@ -13464,9 +13464,10 @@ function initGatewayClient(port, token, cfg, resolveAgentName, logger) {
13464
13464
  return client2;
13465
13465
  }
13466
13466
  async function handleGatewayStart(event, state) {
13467
- if (!state) return;
13467
+ if (!state) {
13468
+ return;
13469
+ }
13468
13470
  const { cfg, tracker, logger, config, api } = state;
13469
- logger.debug("cohort-sync: hook: gateway_start", { port: event.port, eventKeys: Object.keys(event) });
13470
13471
  try {
13471
13472
  checkForUpdate(PLUGIN_VERSION, logger).catch(() => {
13472
13473
  });
@@ -13610,12 +13611,11 @@ function registerHookHandlers(api, logger, getState) {
13610
13611
  state.logger.debug("cohort-sync: resolve agent: result", { method: "fallback_main", resolved });
13611
13612
  return resolved;
13612
13613
  }
13613
- api.registerHook("agent_end", async (event) => {
13614
+ api.on("agent_end", async (event, ctx) => {
13614
13615
  const state = getState();
13615
13616
  if (!state) return;
13616
13617
  const { cfg, tracker, logger: log } = state;
13617
- const ctx = event.context ?? {};
13618
- log.debug("cohort-sync: hook: agent_end", { ctx: dumpCtx(ctx), success: ctx.success, error: ctx.error, durationMs: ctx.durationMs });
13618
+ log.debug("cohort-sync: hook: agent_end", { ctx: dumpCtx(ctx), success: event.success, error: event.error, durationMs: event.durationMs });
13619
13619
  const agentId = ctx.agentId ?? "main";
13620
13620
  const agentName = state.resolveAgentName(agentId);
13621
13621
  try {
@@ -13641,11 +13641,11 @@ function registerHookHandlers(api, logger, getState) {
13641
13641
  log.debug("cohort-sync: cron agent end push failed", { error: String(err) });
13642
13642
  }
13643
13643
  }
13644
- if (ctx.success === false) {
13644
+ if (event.success === false) {
13645
13645
  const entry = buildActivityEntry(agentName, "agent_end", {
13646
13646
  success: false,
13647
- error: ctx.error,
13648
- durationMs: ctx.durationMs,
13647
+ error: event.error,
13648
+ durationMs: event.durationMs,
13649
13649
  sessionKey: ctx.sessionKey
13650
13650
  });
13651
13651
  if (entry) state.activityBatch.add(entry);
@@ -13653,26 +13653,15 @@ function registerHookHandlers(api, logger, getState) {
13653
13653
  } catch (err) {
13654
13654
  log.warn(`cohort-sync: agent_end sync failed: ${String(err)}`);
13655
13655
  }
13656
- }, { name: "cohort-sync.agent_end", description: "Mark idle, push telemetry, emit activity on failure" });
13657
- api.registerHook("llm_output", async (event) => {
13656
+ });
13657
+ api.on("llm_output", async (event, ctx) => {
13658
13658
  const state = getState();
13659
13659
  if (!state) return;
13660
13660
  const { cfg, tracker, logger: log } = state;
13661
- const ctx = event.context ?? {};
13662
- const usage = ctx.usage ?? {};
13661
+ const usage = event.usage ?? {};
13663
13662
  const contextTokens = (usage.input ?? 0) + (usage.cacheRead ?? 0) + (usage.cacheWrite ?? 0);
13664
- const model = ctx.model ?? state.resolveModel(ctx.agentId ?? "main");
13663
+ const model = event.model ?? state.resolveModel(ctx.agentId ?? "main");
13665
13664
  const contextLimit = state.getModelContextLimit(model);
13666
- log.debug("cohort-sync: hook: llm_output", {
13667
- ctx: dumpCtx(ctx),
13668
- model,
13669
- tokensIn: usage.input,
13670
- tokensOut: usage.output,
13671
- cacheRead: usage.cacheRead,
13672
- cacheWrite: usage.cacheWrite,
13673
- contextTokens,
13674
- contextLimit
13675
- });
13676
13665
  const agentId = ctx.agentId ?? "main";
13677
13666
  const agentName = state.resolveAgentName(agentId);
13678
13667
  try {
@@ -13706,18 +13695,17 @@ function registerHookHandlers(api, logger, getState) {
13706
13695
  } catch (err) {
13707
13696
  log.warn(`cohort-sync: llm_output telemetry failed: ${String(err)}`);
13708
13697
  }
13709
- }, { name: "cohort-sync.llm_output", description: "Accumulate token usage, push telemetry and sessions" });
13710
- api.registerHook("after_compaction", async (event) => {
13698
+ });
13699
+ api.on("after_compaction", async (event, ctx) => {
13711
13700
  const state = getState();
13712
13701
  if (!state) return;
13713
13702
  const { cfg, tracker, logger: log } = state;
13714
- const ctx = event.context ?? {};
13715
- log.debug("cohort-sync: hook: after_compaction", { ctx: dumpCtx(ctx), messageCount: ctx.messageCount, tokenCount: ctx.tokenCount });
13703
+ log.debug("cohort-sync: hook: after_compaction", { ctx: dumpCtx(ctx), messageCount: event.messageCount, tokenCount: event.tokenCount });
13716
13704
  const agentId = ctx.agentId ?? "main";
13717
13705
  const agentName = state.resolveAgentName(agentId);
13718
13706
  try {
13719
13707
  tracker.updateFromCompaction(agentName, {
13720
- contextTokens: ctx.tokenCount ?? 0,
13708
+ contextTokens: event.tokenCount ?? 0,
13721
13709
  contextLimit: state.getModelContextLimit(state.resolveModel(agentId))
13722
13710
  });
13723
13711
  if (tracker.shouldPushTelemetry(agentName)) {
@@ -13728,20 +13716,19 @@ function registerHookHandlers(api, logger, getState) {
13728
13716
  }
13729
13717
  }
13730
13718
  const entry = buildActivityEntry(agentName, "after_compaction", {
13731
- messageCount: ctx.messageCount,
13732
- compactedCount: ctx.compactedCount,
13719
+ messageCount: event.messageCount,
13720
+ compactedCount: event.compactedCount,
13733
13721
  sessionKey: ctx.sessionKey
13734
13722
  });
13735
13723
  if (entry) state.activityBatch.add(entry);
13736
13724
  } catch (err) {
13737
13725
  log.warn(`cohort-sync: after_compaction telemetry failed: ${String(err)}`);
13738
13726
  }
13739
- }, { name: "cohort-sync.after_compaction", description: "Increment compaction count, push telemetry" });
13740
- api.registerHook("before_agent_start", async (event) => {
13727
+ });
13728
+ api.on("before_agent_start", async (event, ctx) => {
13741
13729
  const state = getState();
13742
13730
  if (!state) return;
13743
13731
  const { cfg, tracker, logger: log } = state;
13744
- const ctx = event.context ?? {};
13745
13732
  log.debug("cohort-sync: hook: before_agent_start", { ctx: dumpCtx(ctx), event: dumpEvent(event) });
13746
13733
  const agentId = ctx.agentId ?? "main";
13747
13734
  const agentName = state.resolveAgentName(agentId);
@@ -13794,17 +13781,16 @@ function registerHookHandlers(api, logger, getState) {
13794
13781
  } catch (err) {
13795
13782
  log.warn(`cohort-sync: before_agent_start telemetry failed: ${String(err)}`);
13796
13783
  }
13797
- }, { name: "cohort-sync.before_agent_start", description: "Mark working, infer sessions, populate channel bridge" });
13798
- api.registerHook("session_start", async (event) => {
13784
+ });
13785
+ api.on("session_start", async (event, ctx) => {
13799
13786
  const state = getState();
13800
13787
  if (!state) return;
13801
13788
  const { cfg, tracker, logger: log } = state;
13802
- const ctx = event.context ?? {};
13803
13789
  log.debug("cohort-sync: hook: session_start", { ctx: dumpCtx(ctx), event: dumpEvent(event) });
13804
13790
  const agentId = ctx.agentId ?? "main";
13805
13791
  const agentName = state.resolveAgentName(agentId);
13806
13792
  try {
13807
- const sessionKey = ctx.sessionId ?? String(Date.now());
13793
+ const sessionKey = event.sessionId ?? ctx.sessionId ?? String(Date.now());
13808
13794
  tracker.addSession(agentName, sessionKey);
13809
13795
  if (tracker.shouldPushSessions(agentName)) {
13810
13796
  const sessionsSnapshot = tracker.getSessionsSnapshot(agentName);
@@ -13815,23 +13801,22 @@ function registerHookHandlers(api, logger, getState) {
13815
13801
  const entry = buildActivityEntry(agentName, "session_start", {
13816
13802
  channel: parsed.channel,
13817
13803
  sessionKey,
13818
- resumedFrom: ctx.resumedFrom
13804
+ resumedFrom: event.resumedFrom
13819
13805
  });
13820
13806
  if (entry) state.activityBatch.add(entry);
13821
13807
  } catch (err) {
13822
13808
  log.warn(`cohort-sync: session_start tracking failed: ${String(err)}`);
13823
13809
  }
13824
- }, { name: "cohort-sync.session_start", description: "Track session start, push sessions" });
13825
- api.registerHook("session_end", async (event) => {
13810
+ });
13811
+ api.on("session_end", async (event, ctx) => {
13826
13812
  const state = getState();
13827
13813
  if (!state) return;
13828
13814
  const { cfg, tracker, logger: log } = state;
13829
- const ctx = event.context ?? {};
13830
13815
  log.debug("cohort-sync: hook: session_end", { ctx: dumpCtx(ctx), event: dumpEvent(event) });
13831
13816
  const agentId = ctx.agentId ?? "main";
13832
13817
  const agentName = state.resolveAgentName(agentId);
13833
13818
  try {
13834
- const sessionKey = ctx.sessionId ?? "";
13819
+ const sessionKey = event.sessionId ?? ctx.sessionId ?? "";
13835
13820
  tracker.removeSession(agentName, sessionKey);
13836
13821
  if (tracker.shouldPushSessions(agentName)) {
13837
13822
  const sessionsSnapshot = tracker.getSessionsSnapshot(agentName);
@@ -13840,26 +13825,25 @@ function registerHookHandlers(api, logger, getState) {
13840
13825
  }
13841
13826
  const entry = buildActivityEntry(agentName, "session_end", {
13842
13827
  sessionKey,
13843
- messageCount: ctx.messageCount,
13844
- durationMs: ctx.durationMs
13828
+ messageCount: event.messageCount,
13829
+ durationMs: event.durationMs
13845
13830
  });
13846
13831
  if (entry) state.activityBatch.add(entry);
13847
13832
  } catch (err) {
13848
13833
  log.warn(`cohort-sync: session_end tracking failed: ${String(err)}`);
13849
13834
  }
13850
- }, { name: "cohort-sync.session_end", description: "Remove session, push sessions" });
13851
- api.registerHook("after_tool_call", async (event) => {
13835
+ });
13836
+ api.on("after_tool_call", async (event, ctx) => {
13852
13837
  const state = getState();
13853
13838
  if (!state) return;
13854
- const ctx = event.context ?? {};
13855
- state.logger.debug("cohort-sync: hook: after_tool_call", { ctx: dumpCtx(ctx), toolName: ctx.toolName, error: ctx.error });
13839
+ state.logger.debug("cohort-sync: hook: after_tool_call", { ctx: dumpCtx(ctx), toolName: event.toolName, error: event.error });
13856
13840
  const agentName = resolveAgentFromContext(state, ctx);
13857
13841
  try {
13858
13842
  const entry = buildActivityEntry(agentName, "after_tool_call", {
13859
- toolName: ctx.toolName,
13860
- params: ctx.params,
13861
- error: ctx.error,
13862
- durationMs: ctx.durationMs,
13843
+ toolName: event.toolName,
13844
+ params: event.params,
13845
+ error: event.error,
13846
+ durationMs: event.durationMs,
13863
13847
  sessionKey: ctx.sessionKey,
13864
13848
  model: state.resolveModel(ctx.agentId ?? "main")
13865
13849
  });
@@ -13867,11 +13851,10 @@ function registerHookHandlers(api, logger, getState) {
13867
13851
  } catch (err) {
13868
13852
  state.logger.warn(`cohort-sync: after_tool_call activity failed: ${String(err)}`);
13869
13853
  }
13870
- }, { name: "cohort-sync.after_tool_call", description: "Emit activity entry for tool calls" });
13871
- api.registerHook("message_received", async (event) => {
13854
+ });
13855
+ api.on("message_received", async (event, ctx) => {
13872
13856
  const state = getState();
13873
13857
  if (!state) return;
13874
- const ctx = event.context ?? {};
13875
13858
  state.logger.debug("cohort-sync: hook: message_received raw", {
13876
13859
  ctx: dumpCtx(ctx),
13877
13860
  event: dumpEvent(event),
@@ -13884,7 +13867,7 @@ function registerHookHandlers(api, logger, getState) {
13884
13867
  channel,
13885
13868
  accountId: ctx.accountId,
13886
13869
  conversationId: ctx.conversationId,
13887
- from: ctx.from
13870
+ from: event.from
13888
13871
  });
13889
13872
  try {
13890
13873
  const entry = buildActivityEntry(agentName, "message_received", {
@@ -13894,11 +13877,10 @@ function registerHookHandlers(api, logger, getState) {
13894
13877
  } catch (err) {
13895
13878
  state.logger.warn(`cohort-sync: message_received activity failed: ${String(err)}`);
13896
13879
  }
13897
- }, { name: "cohort-sync.message_received", description: "Emit activity entry for received messages" });
13898
- api.registerHook("message_sent", async (event) => {
13880
+ });
13881
+ api.on("message_sent", async (event, ctx) => {
13899
13882
  const state = getState();
13900
13883
  if (!state) return;
13901
- const ctx = event.context ?? {};
13902
13884
  state.logger.debug("cohort-sync: hook: message_sent raw", {
13903
13885
  ctx: dumpCtx(ctx),
13904
13886
  event: dumpEvent(event),
@@ -13911,25 +13893,24 @@ function registerHookHandlers(api, logger, getState) {
13911
13893
  channel,
13912
13894
  accountId: ctx.accountId,
13913
13895
  conversationId: ctx.conversationId,
13914
- to: ctx.to,
13915
- success: ctx.success,
13916
- error: ctx.error
13896
+ to: event.to,
13897
+ success: event.success,
13898
+ error: event.error
13917
13899
  });
13918
13900
  try {
13919
13901
  const entry = buildActivityEntry(agentName, "message_sent", {
13920
13902
  channel: channel ?? "unknown",
13921
- success: ctx.success,
13922
- error: ctx.error
13903
+ success: event.success,
13904
+ error: event.error
13923
13905
  });
13924
13906
  if (entry) state.activityBatch.add(entry);
13925
13907
  } catch (err) {
13926
13908
  state.logger.warn(`cohort-sync: message_sent activity failed: ${String(err)}`);
13927
13909
  }
13928
- }, { name: "cohort-sync.message_sent", description: "Emit activity entry for sent messages" });
13929
- api.registerHook("before_compaction", async (event) => {
13910
+ });
13911
+ api.on("before_compaction", async (event, ctx) => {
13930
13912
  const state = getState();
13931
13913
  if (!state) return;
13932
- const ctx = event.context ?? {};
13933
13914
  state.logger.debug("cohort-sync: hook: before_compaction", { ctx: dumpCtx(ctx) });
13934
13915
  const agentId = ctx.agentId ?? "main";
13935
13916
  const agentName = state.resolveAgentName(agentId);
@@ -13941,25 +13922,24 @@ function registerHookHandlers(api, logger, getState) {
13941
13922
  } catch (err) {
13942
13923
  state.logger.warn(`cohort-sync: before_compaction activity failed: ${String(err)}`);
13943
13924
  }
13944
- }, { name: "cohort-sync.before_compaction", description: "Emit activity entry before compaction" });
13945
- api.registerHook("before_reset", async (event) => {
13925
+ });
13926
+ api.on("before_reset", async (event, ctx) => {
13946
13927
  const state = getState();
13947
13928
  if (!state) return;
13948
- const ctx = event.context ?? {};
13949
13929
  state.logger.debug("cohort-sync: hook: before_reset", { ctx: dumpCtx(ctx), event: dumpEvent(event) });
13950
13930
  const agentId = ctx.agentId ?? "main";
13951
13931
  const agentName = state.resolveAgentName(agentId);
13952
13932
  try {
13953
13933
  const entry = buildActivityEntry(agentName, "before_reset", {
13954
- reason: ctx.reason,
13934
+ reason: event.reason,
13955
13935
  sessionKey: ctx.sessionKey
13956
13936
  });
13957
13937
  if (entry) state.activityBatch.add(entry);
13958
13938
  } catch (err) {
13959
13939
  state.logger.warn(`cohort-sync: before_reset activity failed: ${String(err)}`);
13960
13940
  }
13961
- }, { name: "cohort-sync.before_reset", description: "Emit activity entry before reset" });
13962
- api.registerHook("gateway_stop", async () => {
13941
+ });
13942
+ api.on("gateway_stop", async (_event, _ctx) => {
13963
13943
  const state = getState();
13964
13944
  if (!state) return;
13965
13945
  const { cfg, tracker, logger: log, config } = state;
@@ -13996,7 +13976,7 @@ function registerHookHandlers(api, logger, getState) {
13996
13976
  tracker.clear();
13997
13977
  closeBridge();
13998
13978
  log.info("cohort-sync: gateway stopped, all resources cleaned up");
13999
- }, { name: "cohort-sync.gateway_stop", description: "Cleanup, final telemetry, mark unreachable" });
13979
+ });
14000
13980
  }
14001
13981
  function initializeHookState(api, cfg) {
14002
13982
  const { logger, config } = api;
@@ -14160,6 +14140,7 @@ var POCKET_GUIDE = `# Cohort Agent Guide (Pocket Version)
14160
14140
  function textResult(text, details) {
14161
14141
  return { content: [{ type: "text", text }], details: details ?? void 0 };
14162
14142
  }
14143
+ var sharedHookState = null;
14163
14144
  var plugin = {
14164
14145
  id: "cohort-sync",
14165
14146
  name: "Cohort Sync",
@@ -14182,8 +14163,7 @@ var plugin = {
14182
14163
  );
14183
14164
  return;
14184
14165
  }
14185
- let hookState = null;
14186
- registerHookHandlers(api, api.logger, () => hookState);
14166
+ registerHookHandlers(api, api.logger, () => sharedHookState);
14187
14167
  const gatewayPort = api.config?.gateway?.port ?? 18789;
14188
14168
  api.registerHook(
14189
14169
  "gateway:startup",
@@ -14191,7 +14171,11 @@ var plugin = {
14191
14171
  const event = args[0] ?? {};
14192
14172
  const port = event?.port ?? gatewayPort;
14193
14173
  api.logger.info(`cohort-sync: gateway:startup hook fired (port=${port})`);
14194
- await handleGatewayStart({ ...event, port }, hookState);
14174
+ try {
14175
+ await handleGatewayStart({ ...event, port }, sharedHookState);
14176
+ } catch (err) {
14177
+ api.logger.error(`cohort-sync: handleGatewayStart THREW: ${err instanceof Error ? err.stack : String(err)}`);
14178
+ }
14195
14179
  },
14196
14180
  {
14197
14181
  name: "cohort-sync.gateway-startup",
@@ -14438,15 +14422,17 @@ Do not attempt more comments until tomorrow.`);
14438
14422
  return;
14439
14423
  }
14440
14424
  api.logger.info(`cohort-sync: activated (api: ${apiUrl2})`);
14441
- hookState = initializeHookState(api, {
14442
- apiUrl: apiUrl2,
14443
- apiKey: apiKey2,
14444
- stateDir: svcCtx.stateDir,
14445
- agentNameMap: cfg?.agentNameMap
14446
- });
14425
+ if (!sharedHookState) {
14426
+ sharedHookState = initializeHookState(api, {
14427
+ apiUrl: apiUrl2,
14428
+ apiKey: apiKey2,
14429
+ stateDir: svcCtx.stateDir,
14430
+ agentNameMap: cfg?.agentNameMap
14431
+ });
14432
+ }
14447
14433
  },
14448
14434
  async stop() {
14449
- hookState = null;
14435
+ sharedHookState = null;
14450
14436
  closeBridge();
14451
14437
  api.logger.info("cohort-sync: service stopped");
14452
14438
  }
@@ -55,5 +55,5 @@
55
55
  }
56
56
  }
57
57
  },
58
- "version": "0.11.0"
58
+ "version": "0.11.2"
59
59
  }
package/dist/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cfio/cohort-sync",
3
- "version": "0.11.0",
3
+ "version": "0.11.2",
4
4
  "description": "OpenClaw plugin — syncs agent telemetry, sessions, and activity to the Cohort dashboard",
5
5
  "type": "module",
6
6
  "main": "index.js",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cfio/cohort-sync",
3
- "version": "0.11.0",
3
+ "version": "0.11.2",
4
4
  "description": "OpenClaw plugin — syncs agent telemetry, sessions, and activity to the Cohort dashboard",
5
5
  "license": "MIT",
6
6
  "homepage": "https://docs.cohort.bot/gateway",