@principal-ai/control-tower-core 0.2.1 → 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 (45) hide show
  1. package/dist/client/BaseClient.d.ts +23 -0
  2. package/dist/client/BaseClient.d.ts.map +1 -1
  3. package/dist/client/BaseClient.js +60 -0
  4. package/dist/client/PresenceClient.d.ts +43 -8
  5. package/dist/client/PresenceClient.d.ts.map +1 -1
  6. package/dist/client/PresenceClient.js +72 -18
  7. package/dist/generated/client-connection-auth.types.d.ts +312 -0
  8. package/dist/generated/client-connection-auth.types.d.ts.map +1 -0
  9. package/dist/generated/client-connection-auth.types.js +11 -0
  10. package/dist/generated/control-tower-execution.types.d.ts +445 -0
  11. package/dist/generated/control-tower-execution.types.d.ts.map +1 -0
  12. package/dist/generated/control-tower-execution.types.js +11 -0
  13. package/dist/index.d.ts +2 -2
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/index.js.map +6 -6
  16. package/dist/index.mjs +94 -7
  17. package/dist/index.mjs.map +6 -6
  18. package/dist/server/BaseServer.d.ts +18 -1
  19. package/dist/server/BaseServer.d.ts.map +1 -1
  20. package/dist/server/BaseServer.js +15 -1
  21. package/dist/server/ServerBuilder.d.ts +22 -1
  22. package/dist/server/ServerBuilder.d.ts.map +1 -1
  23. package/dist/server/ServerBuilder.js +24 -0
  24. package/dist/server/index.d.ts +1 -1
  25. package/dist/server/index.d.ts.map +1 -1
  26. package/dist/telemetry/EventValidationIntegration.d.ts +135 -0
  27. package/dist/telemetry/EventValidationIntegration.d.ts.map +1 -0
  28. package/dist/telemetry/EventValidationIntegration.js +253 -0
  29. package/dist/telemetry/EventValidationIntegration.test.d.ts +7 -0
  30. package/dist/telemetry/EventValidationIntegration.test.d.ts.map +1 -0
  31. package/dist/telemetry/EventValidationIntegration.test.js +322 -0
  32. package/dist/telemetry/TelemetryCapture.d.ts +268 -0
  33. package/dist/telemetry/TelemetryCapture.d.ts.map +1 -0
  34. package/dist/telemetry/TelemetryCapture.js +263 -0
  35. package/dist/telemetry/TelemetryCapture.test.d.ts +7 -0
  36. package/dist/telemetry/TelemetryCapture.test.d.ts.map +1 -0
  37. package/dist/telemetry/TelemetryCapture.test.js +396 -0
  38. package/dist/telemetry-example.d.ts +33 -0
  39. package/dist/telemetry-example.d.ts.map +1 -0
  40. package/dist/telemetry-example.js +124 -0
  41. package/dist/types/index.d.ts +1 -1
  42. package/dist/types/index.d.ts.map +1 -1
  43. package/dist/types/presence.d.ts +69 -0
  44. package/dist/types/presence.d.ts.map +1 -1
  45. package/package.json +1 -1
package/dist/index.mjs CHANGED
@@ -5485,6 +5485,7 @@ class BaseClient extends TypedEventEmitter {
5485
5485
  reconnectTimer = null;
5486
5486
  lastConnectionUrl = null;
5487
5487
  lastToken = null;
5488
+ pendingRequests = new Map;
5488
5489
  constructor(config) {
5489
5490
  super();
5490
5491
  this.config = config;
@@ -5656,6 +5657,34 @@ class BaseClient extends TypedEventEmitter {
5656
5657
  };
5657
5658
  await this.transport.send(message);
5658
5659
  }
5660
+ async request(type, payload, timeoutMs = 5000) {
5661
+ if (this.connectionState !== "connected") {
5662
+ throw new Error("Client must be connected to send requests");
5663
+ }
5664
+ const id = this.generateId();
5665
+ const message = {
5666
+ id,
5667
+ type,
5668
+ payload,
5669
+ timestamp: Date.now()
5670
+ };
5671
+ return new Promise((resolve, reject) => {
5672
+ const timeout = setTimeout(() => {
5673
+ this.pendingRequests.delete(id);
5674
+ reject(new Error(`Request '${type}' timed out after ${timeoutMs}ms`));
5675
+ }, timeoutMs);
5676
+ this.pendingRequests.set(id, {
5677
+ resolve,
5678
+ reject,
5679
+ timeout
5680
+ });
5681
+ this.transport.send(message).catch((error) => {
5682
+ this.pendingRequests.delete(id);
5683
+ clearTimeout(timeout);
5684
+ reject(error);
5685
+ });
5686
+ });
5687
+ }
5659
5688
  getConnectionState() {
5660
5689
  return this.connectionState;
5661
5690
  }
@@ -5672,6 +5701,13 @@ class BaseClient extends TypedEventEmitter {
5672
5701
  return this.userId;
5673
5702
  }
5674
5703
  async handleMessage(message) {
5704
+ if (message.id && this.pendingRequests.has(message.id)) {
5705
+ const pending = this.pendingRequests.get(message.id);
5706
+ clearTimeout(pending.timeout);
5707
+ this.pendingRequests.delete(message.id);
5708
+ pending.resolve(message.payload);
5709
+ return;
5710
+ }
5675
5711
  try {
5676
5712
  switch (message.type) {
5677
5713
  case "auth_result":
@@ -5874,13 +5910,46 @@ class PresenceClient extends TypedEventEmitter {
5874
5910
  }
5875
5911
  }
5876
5912
  async getOnlineUsers() {
5877
- throw new Error("getOnlineUsers() requires a REST API endpoint. " + "Implement this method based on your server API.");
5913
+ const response = await this.client.request("presence:get_users", {});
5914
+ return response.users;
5878
5915
  }
5879
- async setStatus(status, message) {
5880
- throw new Error("setStatus() requires a REST API endpoint. " + "Implement this method based on your server API.");
5916
+ async getUserPresence(userId) {
5917
+ const response = await this.client.request("presence:get_user", { userId });
5918
+ return response.user;
5919
+ }
5920
+ async getRepoUsers(owner, repo) {
5921
+ const response = await this.client.request("presence:get_repo_users", { owner, repo });
5922
+ return response.users;
5923
+ }
5924
+ async setStatus(status, statusMessage) {
5925
+ const response = await this.client.request("presence:set_status", { status, statusMessage });
5926
+ if (!response.success) {
5927
+ throw new Error(response.error || "Failed to set status");
5928
+ }
5881
5929
  }
5882
5930
  async setVisibility(visible) {
5883
- throw new Error("setVisibility() requires a REST API endpoint. " + "Implement this method based on your server API.");
5931
+ const response = await this.client.request("presence:set_visibility", { visible });
5932
+ if (!response.success) {
5933
+ throw new Error(response.error || "Failed to set visibility");
5934
+ }
5935
+ }
5936
+ async reportRepoOpened(repoId, branch) {
5937
+ const response = await this.client.request("presence:repo_open", { repoId, branch });
5938
+ if (!response.success) {
5939
+ throw new Error(response.error || "Failed to report repo opened");
5940
+ }
5941
+ }
5942
+ async reportRepoClosed(repoId) {
5943
+ const response = await this.client.request("presence:repo_close", { repoId });
5944
+ if (!response.success) {
5945
+ throw new Error(response.error || "Failed to report repo closed");
5946
+ }
5947
+ }
5948
+ async reportRepoFocused(repoId) {
5949
+ const response = await this.client.request("presence:repo_focus", { repoId });
5950
+ if (!response.success) {
5951
+ throw new Error(response.error || "Failed to report repo focused");
5952
+ }
5884
5953
  }
5885
5954
  getClient() {
5886
5955
  return this.client;
@@ -6491,11 +6560,23 @@ class BaseServer extends TypedEventEmitter {
6491
6560
  timestamp: Date.now()
6492
6561
  });
6493
6562
  break;
6494
- default:
6563
+ default: {
6564
+ if (this.config.customMessageHandler) {
6565
+ const sendResponse = async (response) => {
6566
+ await this.sendToClient(clientId, {
6567
+ id: message.id,
6568
+ ...response
6569
+ });
6570
+ };
6571
+ const handled = await this.config.customMessageHandler(clientId, message, sendResponse);
6572
+ if (handled)
6573
+ break;
6574
+ }
6495
6575
  await this.sendToClient(clientId, {
6496
6576
  type: "error",
6497
6577
  error: `Unknown message type: ${message.type}`
6498
6578
  });
6579
+ }
6499
6580
  }
6500
6581
  } catch (error) {
6501
6582
  await this.sendToClient(clientId, {
@@ -6823,6 +6904,7 @@ class ServerBuilder {
6823
6904
  webSocketPath;
6824
6905
  webSocketServer;
6825
6906
  experimentalFeatures;
6907
+ customMessageHandler;
6826
6908
  withTransport(transport) {
6827
6909
  this.transport = transport;
6828
6910
  return this;
@@ -6867,6 +6949,10 @@ class ServerBuilder {
6867
6949
  this.experimentalFeatures = features;
6868
6950
  return this;
6869
6951
  }
6952
+ withCustomMessageHandler(handler) {
6953
+ this.customMessageHandler = handler;
6954
+ return this;
6955
+ }
6870
6956
  build() {
6871
6957
  if (!this.transport) {
6872
6958
  throw new Error("Transport adapter is required");
@@ -6896,7 +6982,8 @@ class ServerBuilder {
6896
6982
  enableBroadcast: false,
6897
6983
  warnOnExperimentalUse: true,
6898
6984
  trackUsageMetrics: false
6899
- }
6985
+ },
6986
+ customMessageHandler: this.customMessageHandler
6900
6987
  };
6901
6988
  const server = new BaseServer(config);
6902
6989
  if (this.roomManager.constructor.name === "DefaultRoomManager") {
@@ -6970,4 +7057,4 @@ export {
6970
7057
  BaseClient
6971
7058
  };
6972
7059
 
6973
- //# debugId=AC1FE1DD89B6DDC464756E2164756E21
7060
+ //# debugId=A1A2F55B1633C22A64756E2164756E21