@mondaydotcomorg/z2h-shared-utils 0.3.4 → 0.4.1

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 (44) hide show
  1. package/dist/dashboardTemplateHooks.d.ts +6 -0
  2. package/dist/dashboardTemplateHooks.d.ts.map +1 -0
  3. package/dist/dashboardTemplateHooks.js +1 -0
  4. package/dist/esm/dashboardTemplateHooks.d.ts +6 -0
  5. package/dist/esm/dashboardTemplateHooks.d.ts.map +1 -0
  6. package/dist/esm/dashboardTemplateHooks.mjs +1 -0
  7. package/dist/esm/observability/events.d.ts +16 -2
  8. package/dist/esm/observability/events.d.ts.map +1 -1
  9. package/dist/esm/observability/events.mjs +17 -3
  10. package/dist/esm/observability/httpTracker.d.ts +6 -1
  11. package/dist/esm/observability/httpTracker.d.ts.map +1 -1
  12. package/dist/esm/observability/httpTracker.mjs +10 -1
  13. package/dist/esm/observability/index.d.ts +2 -3
  14. package/dist/esm/observability/index.d.ts.map +1 -1
  15. package/dist/esm/observability/index.mjs +1 -2
  16. package/dist/esm/observability/tracker.d.ts +6 -3
  17. package/dist/esm/observability/tracker.d.ts.map +1 -1
  18. package/dist/esm/observability/tracker.mjs +8 -8
  19. package/dist/esm/observability/trident.d.ts +2 -0
  20. package/dist/esm/observability/trident.d.ts.map +1 -0
  21. package/dist/esm/observability/trident.mjs +1 -0
  22. package/dist/observability/events.d.ts +16 -2
  23. package/dist/observability/events.d.ts.map +1 -1
  24. package/dist/observability/events.js +17 -2
  25. package/dist/observability/httpTracker.d.ts +6 -1
  26. package/dist/observability/httpTracker.d.ts.map +1 -1
  27. package/dist/observability/httpTracker.js +10 -1
  28. package/dist/observability/index.d.ts +2 -3
  29. package/dist/observability/index.d.ts.map +1 -1
  30. package/dist/observability/index.js +1 -2
  31. package/dist/observability/tracker.d.ts +6 -3
  32. package/dist/observability/tracker.d.ts.map +1 -1
  33. package/dist/observability/tracker.js +8 -8
  34. package/dist/observability/trident.d.ts +2 -0
  35. package/dist/observability/trident.d.ts.map +1 -0
  36. package/dist/observability/trident.js +7 -0
  37. package/package.json +11 -1
  38. package/src/dashboardTemplateHooks.ts +10 -0
  39. package/src/observability/__tests__/tracker.test.ts +2 -2
  40. package/src/observability/events.ts +17 -2
  41. package/src/observability/httpTracker.ts +18 -2
  42. package/src/observability/index.ts +2 -3
  43. package/src/observability/tracker.ts +8 -10
  44. package/src/observability/trident.ts +2 -0
@@ -0,0 +1,6 @@
1
+ export interface DashboardTemplateSetupAPI {
2
+ createBackend(handlerName: string, content: string): void;
3
+ }
4
+ export type ToFrontendConfigHook<TConfig = Record<string, unknown>> = (rawConfig: TConfig) => TConfig;
5
+ export type SetupBackendHook<TConfig = Record<string, unknown>> = (rawConfig: TConfig, setupAPI: DashboardTemplateSetupAPI) => void;
6
+ //# sourceMappingURL=dashboardTemplateHooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboardTemplateHooks.d.ts","sourceRoot":"","sources":["../src/dashboardTemplateHooks.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,yBAAyB;IACxC,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3D;AAED,MAAM,MAAM,oBAAoB,CAAC,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,KAAK,OAAO,CAAC;AAEtG,MAAM,MAAM,gBAAgB,CAAC,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAChE,SAAS,EAAE,OAAO,EAClB,QAAQ,EAAE,yBAAyB,KAChC,IAAI,CAAC"}
@@ -0,0 +1 @@
1
+
@@ -0,0 +1,6 @@
1
+ export interface DashboardTemplateSetupAPI {
2
+ createBackend(handlerName: string, content: string): void;
3
+ }
4
+ export type ToFrontendConfigHook<TConfig = Record<string, unknown>> = (rawConfig: TConfig) => TConfig;
5
+ export type SetupBackendHook<TConfig = Record<string, unknown>> = (rawConfig: TConfig, setupAPI: DashboardTemplateSetupAPI) => void;
6
+ //# sourceMappingURL=dashboardTemplateHooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboardTemplateHooks.d.ts","sourceRoot":"","sources":["../../src/dashboardTemplateHooks.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,yBAAyB;IACxC,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3D;AAED,MAAM,MAAM,oBAAoB,CAAC,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,KAAK,OAAO,CAAC;AAEtG,MAAM,MAAM,gBAAgB,CAAC,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAChE,SAAS,EAAE,OAAO,EAClB,QAAQ,EAAE,yBAAyB,KAChC,IAAI,CAAC"}
@@ -1,8 +1,8 @@
1
1
  /** BI events tracked in zth-backend-runner, grouped by domain. */
2
2
  export declare const BackendRunnerEvents: {
3
3
  readonly invoke: {
4
- readonly succeeded: "z2h_backend_invoke_succeeded";
5
- readonly failed: "z2h_backend_invoke_failed";
4
+ readonly succeeded: "z2h.backend_invoke.success";
5
+ readonly failed: "z2h.backend_invoke.error";
6
6
  };
7
7
  readonly snowflake: {
8
8
  readonly queryExecuted: "z2h_snowflake_query_executed";
@@ -15,6 +15,16 @@ export declare const BackendRunnerEvents: {
15
15
  readonly connected: "z2h_integration_connected";
16
16
  readonly connectDeclined: "z2h_integration_connect_declined";
17
17
  };
18
+ readonly integrationOAuth: {
19
+ readonly revokeMetric: "z2h.integration_oauth.revoke";
20
+ readonly revokeFailedMetric: "z2h.integration_oauth.revoke.error";
21
+ readonly tokenRequestMetric: "z2h.integration_oauth.token_request";
22
+ };
23
+ readonly integrationToken: {
24
+ readonly decryptFailedMetric: "z2h.integration_token.decrypt_failed";
25
+ readonly unexpectedShapeMetric: "z2h.integration_token.unexpected_shape";
26
+ readonly refreshMetric: "z2h.integration_token.refresh";
27
+ };
18
28
  };
19
29
  /** Metric names emitted by `bigbrain-zth`, grouped by domain. */
20
30
  export declare const Z2hServiceEvents: {
@@ -47,4 +57,8 @@ export declare const Z2hAgentEvents: {
47
57
  readonly biEvent: "z2h_agent_tool_call";
48
58
  };
49
59
  };
60
+ /** BI events tracked in `z2h-cli`. */
61
+ export declare const Z2hCliEvents: {
62
+ readonly error: "z2h_cli_error";
63
+ };
50
64
  //# sourceMappingURL=events.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../../src/observability/events.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;CAgBtB,CAAC;AAEX,iEAAiE;AACjE,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;CAmBnB,CAAC;AAEX,oDAAoD;AACpD,eAAO,MAAM,cAAc;;;;;;;;CAQjB,CAAC"}
1
+ {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../../src/observability/events.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;CA0BtB,CAAC;AAEX,iEAAiE;AACjE,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;CAmBnB,CAAC;AAEX,oDAAoD;AACpD,eAAO,MAAM,cAAc;;;;;;;;CAQjB,CAAC;AAEX,sCAAsC;AACtC,eAAO,MAAM,YAAY;;CAEf,CAAC"}
@@ -1,8 +1,8 @@
1
1
  /** BI events tracked in zth-backend-runner, grouped by domain. */
2
2
  const BackendRunnerEvents = {
3
3
  invoke: {
4
- succeeded: 'z2h_backend_invoke_succeeded',
5
- failed: 'z2h_backend_invoke_failed',
4
+ succeeded: 'z2h.backend_invoke.success',
5
+ failed: 'z2h.backend_invoke.error',
6
6
  },
7
7
  snowflake: {
8
8
  queryExecuted: 'z2h_snowflake_query_executed',
@@ -15,6 +15,16 @@ const BackendRunnerEvents = {
15
15
  connected: 'z2h_integration_connected',
16
16
  connectDeclined: 'z2h_integration_connect_declined',
17
17
  },
18
+ integrationOAuth: {
19
+ revokeMetric: 'z2h.integration_oauth.revoke',
20
+ revokeFailedMetric: 'z2h.integration_oauth.revoke.error',
21
+ tokenRequestMetric: 'z2h.integration_oauth.token_request',
22
+ },
23
+ integrationToken: {
24
+ decryptFailedMetric: 'z2h.integration_token.decrypt_failed',
25
+ unexpectedShapeMetric: 'z2h.integration_token.unexpected_shape',
26
+ refreshMetric: 'z2h.integration_token.refresh',
27
+ },
18
28
  };
19
29
  /** Metric names emitted by `bigbrain-zth`, grouped by domain. */
20
30
  const Z2hServiceEvents = {
@@ -47,5 +57,9 @@ const Z2hAgentEvents = {
47
57
  biEvent: 'z2h_agent_tool_call',
48
58
  },
49
59
  };
60
+ /** BI events tracked in `z2h-cli`. */
61
+ const Z2hCliEvents = {
62
+ error: 'z2h_cli_error',
63
+ };
50
64
 
51
- export { BackendRunnerEvents, Z2hAgentEvents, Z2hServiceEvents };
65
+ export { BackendRunnerEvents, Z2hAgentEvents, Z2hCliEvents, Z2hServiceEvents };
@@ -3,9 +3,14 @@ export interface HttpTrackerDeps {
3
3
  source: string;
4
4
  getContext: () => Record<string, unknown>;
5
5
  }
6
+ export interface HttpTracker {
7
+ trackEvent(name: string, data: Record<string, unknown>): Promise<void>;
8
+ /** Times `fn` and sends `duration_ms` with the event. A throw skips the event and propagates. */
9
+ trackDuration<T>(name: string, fn: () => Promise<T>, data?: Record<string, unknown>): Promise<T>;
10
+ }
6
11
  /**
7
12
  * For standalone processes not running inside the Trident runtime (e.g. CLIs) — posts events
8
13
  * over HTTP instead. Errors (network, timeout) are swallowed so tracking never fails the caller.
9
14
  */
10
- export declare function createHttpTracker(deps: HttpTrackerDeps): (name: string, data: Record<string, unknown>) => Promise<void>;
15
+ export declare function createHttpTracker(deps: HttpTrackerDeps): HttpTracker;
11
16
  //# sourceMappingURL=httpTracker.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"httpTracker.d.ts","sourceRoot":"","sources":["../../../src/observability/httpTracker.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC3C;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,eAAe,IACpB,MAAM,MAAM,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAG,OAAO,CAAC,IAAI,CAAC,CAQ7F"}
1
+ {"version":3,"file":"httpTracker.d.ts","sourceRoot":"","sources":["../../../src/observability/httpTracker.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC3C;AAED,MAAM,WAAW,WAAW;IAC1B,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvE,iGAAiG;IACjG,aAAa,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;CAClG;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,eAAe,GAAG,WAAW,CAmBpE"}
@@ -3,7 +3,7 @@
3
3
  * over HTTP instead. Errors (network, timeout) are swallowed so tracking never fails the caller.
4
4
  */
5
5
  function createHttpTracker(deps) {
6
- return async function trackEvent(name, data) {
6
+ const trackEvent = async (name, data) => {
7
7
  await fetch(deps.url, {
8
8
  method: 'POST',
9
9
  headers: { 'Content-Type': 'application/json' },
@@ -11,6 +11,15 @@ function createHttpTracker(deps) {
11
11
  signal: AbortSignal.timeout(5000),
12
12
  }).catch(() => { });
13
13
  };
14
+ return {
15
+ trackEvent,
16
+ async trackDuration(name, fn, data) {
17
+ const start = Date.now();
18
+ const result = await fn();
19
+ await trackEvent(name, { ...data, duration_ms: Date.now() - start });
20
+ return result;
21
+ },
22
+ };
14
23
  }
15
24
 
16
25
  export { createHttpTracker };
@@ -1,5 +1,4 @@
1
- export { trackEvent } from './tracker';
2
1
  export { createHttpTracker } from './httpTracker';
3
- export type { HttpTrackerDeps } from './httpTracker';
4
- export { BackendRunnerEvents, Z2hServiceEvents, Z2hAgentEvents } from './events';
2
+ export type { HttpTracker, HttpTrackerDeps } from './httpTracker';
3
+ export { BackendRunnerEvents, Z2hServiceEvents, Z2hAgentEvents, Z2hCliEvents } from './events';
5
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/observability/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,YAAY,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/observability/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAClE,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC"}
@@ -1,3 +1,2 @@
1
- export { trackEvent } from './tracker.mjs';
2
1
  export { createHttpTracker } from './httpTracker.mjs';
3
- export { BackendRunnerEvents, Z2hAgentEvents, Z2hServiceEvents } from './events.mjs';
2
+ export { BackendRunnerEvents, Z2hAgentEvents, Z2hCliEvents, Z2hServiceEvents } from './events.mjs';
@@ -1,7 +1,10 @@
1
1
  /**
2
2
  * Sends a BI event via the Trident runtime's bigbrain tracker, auto-attaching the current user.
3
- * No-ops (with a warning) if `Runtime.init()` hasn't run yet — use `createHttpTracker` for
4
- * standalone processes (e.g. CLIs) that never bootstrap the Trident runtime.
3
+ * No-ops (with a warning) if `Runtime.init()` hasn't run yet.
4
+ *
5
+ * Only exposed from the `/trident` entry, never the root: importing it loads
6
+ * `@mondaydotcomorg/trident-backend-api`, which a standalone process (e.g. the CLI) doesn't
7
+ * install. Those callers stay on the root entry and use `createHttpTracker` instead.
5
8
  */
6
- export declare function trackEvent(name: string, data: Record<string, unknown>, source: string): void;
9
+ export declare function trackEvent(name: string, data: Record<string, unknown>, source: string): Promise<void>;
7
10
  //# sourceMappingURL=tracker.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tracker.d.ts","sourceRoot":"","sources":["../../../src/observability/tracker.ts"],"names":[],"mappings":"AAWA;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAW5F"}
1
+ {"version":3,"file":"tracker.d.ts","sourceRoot":"","sources":["../../../src/observability/tracker.ts"],"names":[],"mappings":"AAQA;;;;;;;GAOG;AACH,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAS3G"}
@@ -2,21 +2,21 @@ import { Api } from '@mondaydotcomorg/trident-backend-api';
2
2
 
3
3
  function getUserContext() {
4
4
  const user = Api.getPart('context')?.execution.get()?.user;
5
- if (!user) {
6
- return {};
7
- }
8
- return { user_name: user.name };
5
+ return user ? { user_name: user.name } : {};
9
6
  }
10
7
  /**
11
8
  * Sends a BI event via the Trident runtime's bigbrain tracker, auto-attaching the current user.
12
- * No-ops (with a warning) if `Runtime.init()` hasn't run yet — use `createHttpTracker` for
13
- * standalone processes (e.g. CLIs) that never bootstrap the Trident runtime.
9
+ * No-ops (with a warning) if `Runtime.init()` hasn't run yet.
10
+ *
11
+ * Only exposed from the `/trident` entry, never the root: importing it loads
12
+ * `@mondaydotcomorg/trident-backend-api`, which a standalone process (e.g. the CLI) doesn't
13
+ * install. Those callers stay on the root entry and use `createHttpTracker` instead.
14
14
  */
15
- function trackEvent(name, data, source) {
15
+ async function trackEvent(name, data, source) {
16
16
  const tracker = Api.getPart('bigbrain')?.tracker;
17
17
  if (!tracker) {
18
18
  // eslint-disable-next-line no-console
19
- console.warn('[z2h-shared-utils] trackEvent: bigbrain API part unavailable, was Runtime.init() called? Dropping event.');
19
+ console.warn('[z2h-shared-utils] trackEvent: bigbrain API part unavailable. Dropping event.');
20
20
  return;
21
21
  }
22
22
  // Call through `tracker`, not a destructured reference — sendBiEvent relies on `this` internally.
@@ -0,0 +1,2 @@
1
+ export { trackEvent } from './tracker';
2
+ //# sourceMappingURL=trident.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trident.d.ts","sourceRoot":"","sources":["../../../src/observability/trident.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC"}
@@ -0,0 +1 @@
1
+ export { trackEvent } from './tracker.mjs';
@@ -1,8 +1,8 @@
1
1
  /** BI events tracked in zth-backend-runner, grouped by domain. */
2
2
  export declare const BackendRunnerEvents: {
3
3
  readonly invoke: {
4
- readonly succeeded: "z2h_backend_invoke_succeeded";
5
- readonly failed: "z2h_backend_invoke_failed";
4
+ readonly succeeded: "z2h.backend_invoke.success";
5
+ readonly failed: "z2h.backend_invoke.error";
6
6
  };
7
7
  readonly snowflake: {
8
8
  readonly queryExecuted: "z2h_snowflake_query_executed";
@@ -15,6 +15,16 @@ export declare const BackendRunnerEvents: {
15
15
  readonly connected: "z2h_integration_connected";
16
16
  readonly connectDeclined: "z2h_integration_connect_declined";
17
17
  };
18
+ readonly integrationOAuth: {
19
+ readonly revokeMetric: "z2h.integration_oauth.revoke";
20
+ readonly revokeFailedMetric: "z2h.integration_oauth.revoke.error";
21
+ readonly tokenRequestMetric: "z2h.integration_oauth.token_request";
22
+ };
23
+ readonly integrationToken: {
24
+ readonly decryptFailedMetric: "z2h.integration_token.decrypt_failed";
25
+ readonly unexpectedShapeMetric: "z2h.integration_token.unexpected_shape";
26
+ readonly refreshMetric: "z2h.integration_token.refresh";
27
+ };
18
28
  };
19
29
  /** Metric names emitted by `bigbrain-zth`, grouped by domain. */
20
30
  export declare const Z2hServiceEvents: {
@@ -47,4 +57,8 @@ export declare const Z2hAgentEvents: {
47
57
  readonly biEvent: "z2h_agent_tool_call";
48
58
  };
49
59
  };
60
+ /** BI events tracked in `z2h-cli`. */
61
+ export declare const Z2hCliEvents: {
62
+ readonly error: "z2h_cli_error";
63
+ };
50
64
  //# sourceMappingURL=events.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/observability/events.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;CAgBtB,CAAC;AAEX,iEAAiE;AACjE,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;CAmBnB,CAAC;AAEX,oDAAoD;AACpD,eAAO,MAAM,cAAc;;;;;;;;CAQjB,CAAC"}
1
+ {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/observability/events.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;CA0BtB,CAAC;AAEX,iEAAiE;AACjE,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;CAmBnB,CAAC;AAEX,oDAAoD;AACpD,eAAO,MAAM,cAAc;;;;;;;;CAQjB,CAAC;AAEX,sCAAsC;AACtC,eAAO,MAAM,YAAY;;CAEf,CAAC"}
@@ -3,8 +3,8 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
3
3
  /** BI events tracked in zth-backend-runner, grouped by domain. */
4
4
  const BackendRunnerEvents = {
5
5
  invoke: {
6
- succeeded: 'z2h_backend_invoke_succeeded',
7
- failed: 'z2h_backend_invoke_failed',
6
+ succeeded: 'z2h.backend_invoke.success',
7
+ failed: 'z2h.backend_invoke.error',
8
8
  },
9
9
  snowflake: {
10
10
  queryExecuted: 'z2h_snowflake_query_executed',
@@ -17,6 +17,16 @@ const BackendRunnerEvents = {
17
17
  connected: 'z2h_integration_connected',
18
18
  connectDeclined: 'z2h_integration_connect_declined',
19
19
  },
20
+ integrationOAuth: {
21
+ revokeMetric: 'z2h.integration_oauth.revoke',
22
+ revokeFailedMetric: 'z2h.integration_oauth.revoke.error',
23
+ tokenRequestMetric: 'z2h.integration_oauth.token_request',
24
+ },
25
+ integrationToken: {
26
+ decryptFailedMetric: 'z2h.integration_token.decrypt_failed',
27
+ unexpectedShapeMetric: 'z2h.integration_token.unexpected_shape',
28
+ refreshMetric: 'z2h.integration_token.refresh',
29
+ },
20
30
  };
21
31
  /** Metric names emitted by `bigbrain-zth`, grouped by domain. */
22
32
  const Z2hServiceEvents = {
@@ -49,7 +59,12 @@ const Z2hAgentEvents = {
49
59
  biEvent: 'z2h_agent_tool_call',
50
60
  },
51
61
  };
62
+ /** BI events tracked in `z2h-cli`. */
63
+ const Z2hCliEvents = {
64
+ error: 'z2h_cli_error',
65
+ };
52
66
 
53
67
  exports.BackendRunnerEvents = BackendRunnerEvents;
54
68
  exports.Z2hAgentEvents = Z2hAgentEvents;
69
+ exports.Z2hCliEvents = Z2hCliEvents;
55
70
  exports.Z2hServiceEvents = Z2hServiceEvents;
@@ -3,9 +3,14 @@ export interface HttpTrackerDeps {
3
3
  source: string;
4
4
  getContext: () => Record<string, unknown>;
5
5
  }
6
+ export interface HttpTracker {
7
+ trackEvent(name: string, data: Record<string, unknown>): Promise<void>;
8
+ /** Times `fn` and sends `duration_ms` with the event. A throw skips the event and propagates. */
9
+ trackDuration<T>(name: string, fn: () => Promise<T>, data?: Record<string, unknown>): Promise<T>;
10
+ }
6
11
  /**
7
12
  * For standalone processes not running inside the Trident runtime (e.g. CLIs) — posts events
8
13
  * over HTTP instead. Errors (network, timeout) are swallowed so tracking never fails the caller.
9
14
  */
10
- export declare function createHttpTracker(deps: HttpTrackerDeps): (name: string, data: Record<string, unknown>) => Promise<void>;
15
+ export declare function createHttpTracker(deps: HttpTrackerDeps): HttpTracker;
11
16
  //# sourceMappingURL=httpTracker.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"httpTracker.d.ts","sourceRoot":"","sources":["../../src/observability/httpTracker.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC3C;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,eAAe,IACpB,MAAM,MAAM,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAG,OAAO,CAAC,IAAI,CAAC,CAQ7F"}
1
+ {"version":3,"file":"httpTracker.d.ts","sourceRoot":"","sources":["../../src/observability/httpTracker.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC3C;AAED,MAAM,WAAW,WAAW;IAC1B,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvE,iGAAiG;IACjG,aAAa,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;CAClG;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,eAAe,GAAG,WAAW,CAmBpE"}
@@ -5,7 +5,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
5
5
  * over HTTP instead. Errors (network, timeout) are swallowed so tracking never fails the caller.
6
6
  */
7
7
  function createHttpTracker(deps) {
8
- return async function trackEvent(name, data) {
8
+ const trackEvent = async (name, data) => {
9
9
  await fetch(deps.url, {
10
10
  method: 'POST',
11
11
  headers: { 'Content-Type': 'application/json' },
@@ -13,6 +13,15 @@ function createHttpTracker(deps) {
13
13
  signal: AbortSignal.timeout(5000),
14
14
  }).catch(() => { });
15
15
  };
16
+ return {
17
+ trackEvent,
18
+ async trackDuration(name, fn, data) {
19
+ const start = Date.now();
20
+ const result = await fn();
21
+ await trackEvent(name, { ...data, duration_ms: Date.now() - start });
22
+ return result;
23
+ },
24
+ };
16
25
  }
17
26
 
18
27
  exports.createHttpTracker = createHttpTracker;
@@ -1,5 +1,4 @@
1
- export { trackEvent } from './tracker';
2
1
  export { createHttpTracker } from './httpTracker';
3
- export type { HttpTrackerDeps } from './httpTracker';
4
- export { BackendRunnerEvents, Z2hServiceEvents, Z2hAgentEvents } from './events';
2
+ export type { HttpTracker, HttpTrackerDeps } from './httpTracker';
3
+ export { BackendRunnerEvents, Z2hServiceEvents, Z2hAgentEvents, Z2hCliEvents } from './events';
5
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/observability/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,YAAY,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/observability/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAClE,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC"}
@@ -1,13 +1,12 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
2
 
3
- const observability_tracker = require('./tracker.js');
4
3
  const observability_httpTracker = require('./httpTracker.js');
5
4
  const observability_events = require('./events.js');
6
5
 
7
6
 
8
7
 
9
- exports.trackEvent = observability_tracker.trackEvent;
10
8
  exports.createHttpTracker = observability_httpTracker.createHttpTracker;
11
9
  exports.BackendRunnerEvents = observability_events.BackendRunnerEvents;
12
10
  exports.Z2hAgentEvents = observability_events.Z2hAgentEvents;
11
+ exports.Z2hCliEvents = observability_events.Z2hCliEvents;
13
12
  exports.Z2hServiceEvents = observability_events.Z2hServiceEvents;
@@ -1,7 +1,10 @@
1
1
  /**
2
2
  * Sends a BI event via the Trident runtime's bigbrain tracker, auto-attaching the current user.
3
- * No-ops (with a warning) if `Runtime.init()` hasn't run yet — use `createHttpTracker` for
4
- * standalone processes (e.g. CLIs) that never bootstrap the Trident runtime.
3
+ * No-ops (with a warning) if `Runtime.init()` hasn't run yet.
4
+ *
5
+ * Only exposed from the `/trident` entry, never the root: importing it loads
6
+ * `@mondaydotcomorg/trident-backend-api`, which a standalone process (e.g. the CLI) doesn't
7
+ * install. Those callers stay on the root entry and use `createHttpTracker` instead.
5
8
  */
6
- export declare function trackEvent(name: string, data: Record<string, unknown>, source: string): void;
9
+ export declare function trackEvent(name: string, data: Record<string, unknown>, source: string): Promise<void>;
7
10
  //# sourceMappingURL=tracker.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tracker.d.ts","sourceRoot":"","sources":["../../src/observability/tracker.ts"],"names":[],"mappings":"AAWA;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAW5F"}
1
+ {"version":3,"file":"tracker.d.ts","sourceRoot":"","sources":["../../src/observability/tracker.ts"],"names":[],"mappings":"AAQA;;;;;;;GAOG;AACH,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAS3G"}
@@ -4,21 +4,21 @@ const tridentBackendApi = require('@mondaydotcomorg/trident-backend-api');
4
4
 
5
5
  function getUserContext() {
6
6
  const user = tridentBackendApi.Api.getPart('context')?.execution.get()?.user;
7
- if (!user) {
8
- return {};
9
- }
10
- return { user_name: user.name };
7
+ return user ? { user_name: user.name } : {};
11
8
  }
12
9
  /**
13
10
  * Sends a BI event via the Trident runtime's bigbrain tracker, auto-attaching the current user.
14
- * No-ops (with a warning) if `Runtime.init()` hasn't run yet — use `createHttpTracker` for
15
- * standalone processes (e.g. CLIs) that never bootstrap the Trident runtime.
11
+ * No-ops (with a warning) if `Runtime.init()` hasn't run yet.
12
+ *
13
+ * Only exposed from the `/trident` entry, never the root: importing it loads
14
+ * `@mondaydotcomorg/trident-backend-api`, which a standalone process (e.g. the CLI) doesn't
15
+ * install. Those callers stay on the root entry and use `createHttpTracker` instead.
16
16
  */
17
- function trackEvent(name, data, source) {
17
+ async function trackEvent(name, data, source) {
18
18
  const tracker = tridentBackendApi.Api.getPart('bigbrain')?.tracker;
19
19
  if (!tracker) {
20
20
  // eslint-disable-next-line no-console
21
- console.warn('[z2h-shared-utils] trackEvent: bigbrain API part unavailable, was Runtime.init() called? Dropping event.');
21
+ console.warn('[z2h-shared-utils] trackEvent: bigbrain API part unavailable. Dropping event.');
22
22
  return;
23
23
  }
24
24
  // Call through `tracker`, not a destructured reference — sendBiEvent relies on `this` internally.
@@ -0,0 +1,2 @@
1
+ export { trackEvent } from './tracker';
2
+ //# sourceMappingURL=trident.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trident.d.ts","sourceRoot":"","sources":["../../src/observability/trident.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC"}
@@ -0,0 +1,7 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
+
3
+ const observability_tracker = require('./tracker.js');
4
+
5
+
6
+
7
+ exports.trackEvent = observability_tracker.trackEvent;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mondaydotcomorg/z2h-shared-utils",
3
- "version": "0.3.4",
3
+ "version": "0.4.1",
4
4
  "main": "./dist/index.js",
5
5
  "types": "./dist/index.d.ts",
6
6
  "exports": {
@@ -14,11 +14,21 @@
14
14
  "require": "./dist/observability/index.js",
15
15
  "types": "./dist/observability/index.d.ts"
16
16
  },
17
+ "./observability/trident": {
18
+ "import": "./dist/esm/observability/trident.mjs",
19
+ "require": "./dist/observability/trident.js",
20
+ "types": "./dist/observability/trident.d.ts"
21
+ },
17
22
  "./mf-scaffold": {
18
23
  "import": "./dist/esm/mfScaffold.mjs",
19
24
  "require": "./dist/mfScaffold.js",
20
25
  "types": "./dist/mfScaffold.d.ts"
21
26
  },
27
+ "./dashboard-template-hooks": {
28
+ "import": "./dist/esm/dashboardTemplateHooks.mjs",
29
+ "require": "./dist/dashboardTemplateHooks.js",
30
+ "types": "./dist/dashboardTemplateHooks.d.ts"
31
+ },
22
32
  "./package.json": "./package.json"
23
33
  },
24
34
  "nx": {
@@ -0,0 +1,10 @@
1
+ export interface DashboardTemplateSetupAPI {
2
+ createBackend(handlerName: string, content: string): void;
3
+ }
4
+
5
+ export type ToFrontendConfigHook<TConfig = Record<string, unknown>> = (rawConfig: TConfig) => TConfig;
6
+
7
+ export type SetupBackendHook<TConfig = Record<string, unknown>> = (
8
+ rawConfig: TConfig,
9
+ setupAPI: DashboardTemplateSetupAPI
10
+ ) => void;
@@ -43,7 +43,7 @@ describe('trackEvent', () => {
43
43
  const tracker = new FakeTracker();
44
44
  mockParts({ tracker });
45
45
 
46
- trackEvent('z2h_agent_tool_call', { tool_name: 'write_file' }, 'z2h-agent');
46
+ void trackEvent('z2h_agent_tool_call', { tool_name: 'write_file' }, 'z2h-agent');
47
47
 
48
48
  expect(tracker.sent).toEqual([
49
49
  { name: 'z2h_agent_tool_call', source: 'z2h-agent', data: { tool_name: 'write_file' } },
@@ -54,7 +54,7 @@ describe('trackEvent', () => {
54
54
  const tracker = new FakeTracker();
55
55
  mockParts({ tracker, user: { name: 'Arielle' } });
56
56
 
57
- trackEvent('z2h_agent_tool_call', { tool_name: 'execute' }, 'z2h-agent');
57
+ void trackEvent('z2h_agent_tool_call', { tool_name: 'execute' }, 'z2h-agent');
58
58
 
59
59
  expect(tracker.sent[0].data).toEqual({ user_name: 'Arielle', tool_name: 'execute' });
60
60
  });
@@ -1,8 +1,8 @@
1
1
  /** BI events tracked in zth-backend-runner, grouped by domain. */
2
2
  export const BackendRunnerEvents = {
3
3
  invoke: {
4
- succeeded: 'z2h_backend_invoke_succeeded',
5
- failed: 'z2h_backend_invoke_failed',
4
+ succeeded: 'z2h.backend_invoke.success',
5
+ failed: 'z2h.backend_invoke.error',
6
6
  },
7
7
  snowflake: {
8
8
  queryExecuted: 'z2h_snowflake_query_executed',
@@ -15,6 +15,16 @@ export const BackendRunnerEvents = {
15
15
  connected: 'z2h_integration_connected',
16
16
  connectDeclined: 'z2h_integration_connect_declined',
17
17
  },
18
+ integrationOAuth: {
19
+ revokeMetric: 'z2h.integration_oauth.revoke',
20
+ revokeFailedMetric: 'z2h.integration_oauth.revoke.error',
21
+ tokenRequestMetric: 'z2h.integration_oauth.token_request',
22
+ },
23
+ integrationToken: {
24
+ decryptFailedMetric: 'z2h.integration_token.decrypt_failed',
25
+ unexpectedShapeMetric: 'z2h.integration_token.unexpected_shape',
26
+ refreshMetric: 'z2h.integration_token.refresh',
27
+ },
18
28
  } as const;
19
29
 
20
30
  /** Metric names emitted by `bigbrain-zth`, grouped by domain. */
@@ -49,3 +59,8 @@ export const Z2hAgentEvents = {
49
59
  biEvent: 'z2h_agent_tool_call',
50
60
  },
51
61
  } as const;
62
+
63
+ /** BI events tracked in `z2h-cli`. */
64
+ export const Z2hCliEvents = {
65
+ error: 'z2h_cli_error',
66
+ } as const;
@@ -4,12 +4,18 @@ export interface HttpTrackerDeps {
4
4
  getContext: () => Record<string, unknown>;
5
5
  }
6
6
 
7
+ export interface HttpTracker {
8
+ trackEvent(name: string, data: Record<string, unknown>): Promise<void>;
9
+ /** Times `fn` and sends `duration_ms` with the event. A throw skips the event and propagates. */
10
+ trackDuration<T>(name: string, fn: () => Promise<T>, data?: Record<string, unknown>): Promise<T>;
11
+ }
12
+
7
13
  /**
8
14
  * For standalone processes not running inside the Trident runtime (e.g. CLIs) — posts events
9
15
  * over HTTP instead. Errors (network, timeout) are swallowed so tracking never fails the caller.
10
16
  */
11
- export function createHttpTracker(deps: HttpTrackerDeps) {
12
- return async function trackEvent(name: string, data: Record<string, unknown>): Promise<void> {
17
+ export function createHttpTracker(deps: HttpTrackerDeps): HttpTracker {
18
+ const trackEvent = async (name: string, data: Record<string, unknown>): Promise<void> => {
13
19
  await fetch(deps.url, {
14
20
  method: 'POST',
15
21
  headers: { 'Content-Type': 'application/json' },
@@ -17,4 +23,14 @@ export function createHttpTracker(deps: HttpTrackerDeps) {
17
23
  signal: AbortSignal.timeout(5000),
18
24
  }).catch(() => {});
19
25
  };
26
+
27
+ return {
28
+ trackEvent,
29
+ async trackDuration(name, fn, data) {
30
+ const start = Date.now();
31
+ const result = await fn();
32
+ await trackEvent(name, { ...data, duration_ms: Date.now() - start });
33
+ return result;
34
+ },
35
+ };
20
36
  }
@@ -1,4 +1,3 @@
1
- export { trackEvent } from './tracker';
2
1
  export { createHttpTracker } from './httpTracker';
3
- export type { HttpTrackerDeps } from './httpTracker';
4
- export { BackendRunnerEvents, Z2hServiceEvents, Z2hAgentEvents } from './events';
2
+ export type { HttpTracker, HttpTrackerDeps } from './httpTracker';
3
+ export { BackendRunnerEvents, Z2hServiceEvents, Z2hAgentEvents, Z2hCliEvents } from './events';
@@ -3,24 +3,22 @@ import type { RawUser } from '@mondaydotcomorg/bigbrain-types';
3
3
 
4
4
  function getUserContext(): { user_name?: string } {
5
5
  const user = Api.getPart('context')?.execution.get()?.user as RawUser | undefined;
6
- if (!user) {
7
- return {};
8
- }
9
- return { user_name: user.name };
6
+ return user ? { user_name: user.name } : {};
10
7
  }
11
8
 
12
9
  /**
13
10
  * Sends a BI event via the Trident runtime's bigbrain tracker, auto-attaching the current user.
14
- * No-ops (with a warning) if `Runtime.init()` hasn't run yet — use `createHttpTracker` for
15
- * standalone processes (e.g. CLIs) that never bootstrap the Trident runtime.
11
+ * No-ops (with a warning) if `Runtime.init()` hasn't run yet.
12
+ *
13
+ * Only exposed from the `/trident` entry, never the root: importing it loads
14
+ * `@mondaydotcomorg/trident-backend-api`, which a standalone process (e.g. the CLI) doesn't
15
+ * install. Those callers stay on the root entry and use `createHttpTracker` instead.
16
16
  */
17
- export function trackEvent(name: string, data: Record<string, unknown>, source: string): void {
17
+ export async function trackEvent(name: string, data: Record<string, unknown>, source: string): Promise<void> {
18
18
  const tracker = Api.getPart('bigbrain')?.tracker;
19
19
  if (!tracker) {
20
20
  // eslint-disable-next-line no-console
21
- console.warn(
22
- '[z2h-shared-utils] trackEvent: bigbrain API part unavailable, was Runtime.init() called? Dropping event.'
23
- );
21
+ console.warn('[z2h-shared-utils] trackEvent: bigbrain API part unavailable. Dropping event.');
24
22
  return;
25
23
  }
26
24
  // Call through `tracker`, not a destructured reference — sendBiEvent relies on `this` internally.
@@ -0,0 +1,2 @@
1
+ // `@mondaydotcomorg/z2h-shared-utils/observability/trident` — helpers that require the Trident backend runtime.
2
+ export { trackEvent } from './tracker';