makefx 1.6.5 → 1.6.7

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 (3) hide show
  1. package/README.md +1 -1
  2. package/makefx.mjs +86 -26
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -61,4 +61,4 @@ IDs, or runs. Retired commands and aliases are not redirected.
61
61
 
62
62
  Run `makefx --help` or `makefx <noun> --help` for current options.
63
63
 
64
- Version: 1.6.5
64
+ Version: 1.6.7
package/makefx.mjs CHANGED
@@ -4442,7 +4442,7 @@ require_websocket_server();
4442
4442
  var wrapper_default = import_websocket.default;
4443
4443
  //#endregion
4444
4444
  //#region src/cli/version.ts
4445
- var CLI_VERSION = "1.6.5+9c81b1e6ede4";
4445
+ var CLI_VERSION = "1.6.7+0439271d1461";
4446
4446
  var CLI_VERSION_HEADER = "X-MakeFX-CLI-Version";
4447
4447
  function cliVersionHeaders() {
4448
4448
  return {
@@ -4461,6 +4461,7 @@ function cliVersionHeaders() {
4461
4461
  var GENERATION_REQUEST_TIMEOUT_MS = 3e5;
4462
4462
  var VIDEO_GENERATION_REQUEST_TIMEOUT_MS = 72e4;
4463
4463
  var VARIANT_SYNC_POLL_INTERVAL_MS = 15e3;
4464
+ var GENERATION_RECONNECT_RETRY_MS = 1e3;
4464
4465
  function getGenerationRequestTimeoutMs(mediaKind) {
4465
4466
  return mediaKind === "video" ? VIDEO_GENERATION_REQUEST_TIMEOUT_MS : GENERATION_REQUEST_TIMEOUT_MS;
4466
4467
  }
@@ -4493,6 +4494,8 @@ var WebSocketClient = class WebSocketClient {
4493
4494
  env;
4494
4495
  spaceId;
4495
4496
  connectionLoggingEnabled = false;
4497
+ disconnectRequested = false;
4498
+ generationReconnect = null;
4496
4499
  chatHandlers = /* @__PURE__ */ new Map();
4497
4500
  generateHandlers = /* @__PURE__ */ new Map();
4498
4501
  earlyTerminalVariants = /* @__PURE__ */ new Map();
@@ -4535,6 +4538,7 @@ var WebSocketClient = class WebSocketClient {
4535
4538
  * Connect to the WebSocket endpoint
4536
4539
  */
4537
4540
  async connect() {
4541
+ this.disconnectRequested = false;
4538
4542
  return new Promise((resolve, reject) => {
4539
4543
  const protocol = this.baseUrl.startsWith("https") ? "wss" : "ws";
4540
4544
  const url = `${protocol}://${this.baseUrl.replace(/^https?:\/\//, "")}/api/spaces/${this.spaceId}/ws`;
@@ -4563,7 +4567,7 @@ var WebSocketClient = class WebSocketClient {
4563
4567
  });
4564
4568
  this.ws.on("close", (code, reason) => {
4565
4569
  if (this.connectionLoggingEnabled) console.log(`[WebSocketClient] Disconnected: ${code} - ${reason}`);
4566
- this.ws = null;
4570
+ this.handleSocketClose();
4567
4571
  });
4568
4572
  });
4569
4573
  }
@@ -4571,11 +4575,35 @@ var WebSocketClient = class WebSocketClient {
4571
4575
  * Disconnect from the WebSocket
4572
4576
  */
4573
4577
  disconnect() {
4578
+ this.disconnectRequested = true;
4574
4579
  if (this.ws) {
4575
4580
  this.ws.close();
4576
4581
  this.ws = null;
4577
4582
  }
4578
4583
  }
4584
+ handleSocketClose() {
4585
+ this.ws = null;
4586
+ if (!this.disconnectRequested && this.hasPendingGenerationWaits()) this.reconnectPendingGeneration();
4587
+ }
4588
+ hasPendingGenerationWaits() {
4589
+ return this.generateHandlers.size > 0 || this.variantCompletionHandlers.size > 0;
4590
+ }
4591
+ reconnectPendingGeneration() {
4592
+ if (this.generationReconnect || this.disconnectRequested || !this.hasPendingGenerationWaits()) return;
4593
+ this.generationReconnect = this.runGenerationReconnect().finally(() => {
4594
+ this.generationReconnect = null;
4595
+ });
4596
+ }
4597
+ async runGenerationReconnect() {
4598
+ while (!this.disconnectRequested && this.hasPendingGenerationWaits()) try {
4599
+ await this.connect();
4600
+ if (this.hasPendingGenerationWaits()) this.requestSync();
4601
+ return;
4602
+ } catch {
4603
+ if (this.disconnectRequested || !this.hasPendingGenerationWaits()) return;
4604
+ await new Promise((resolve) => setTimeout(resolve, GENERATION_RECONNECT_RETRY_MS));
4605
+ }
4606
+ }
4579
4607
  /**
4580
4608
  * Set error handler
4581
4609
  */
@@ -4644,36 +4672,16 @@ var WebSocketClient = class WebSocketClient {
4644
4672
  this.onChatProgress?.(progressMsg);
4645
4673
  break;
4646
4674
  }
4647
- case "generate:started": {
4648
- const startedMsg = message;
4649
- const handler = this.generateHandlers.get(startedMsg.requestId);
4650
- if (handler) {
4651
- if (handler.onStarted) handler.onStarted(startedMsg);
4652
- this.variantCompletionHandlers.set(startedMsg.variantId, {
4653
- requestId: startedMsg.requestId,
4654
- assetId: startedMsg.assetId,
4655
- assetName: startedMsg.assetName,
4656
- onResult: handler.onResult,
4657
- reject: handler.reject,
4658
- timeout: handler.timeout
4659
- });
4660
- this.startVariantSyncPolling(startedMsg.variantId, startedMsg.requestId);
4661
- this.generateHandlers.delete(startedMsg.requestId);
4662
- const earlyTerminal = this.earlyTerminalVariants.get(startedMsg.variantId);
4663
- if (earlyTerminal) {
4664
- this.earlyTerminalVariants.delete(startedMsg.variantId);
4665
- this.handleTerminalVariant(earlyTerminal);
4666
- }
4667
- this.clearOrphanedEarlyTerminalVariants();
4668
- }
4675
+ case "generate:started":
4676
+ this.handleGenerateStarted(message);
4669
4677
  break;
4670
- }
4671
4678
  case "generate:error": {
4672
4679
  const errorMsg = message;
4673
4680
  const handler = this.generateHandlers.get(errorMsg.requestId);
4674
4681
  if (handler) {
4675
4682
  this.generateHandlers.delete(errorMsg.requestId);
4676
4683
  clearTimeout(handler.timeout);
4684
+ if (handler.syncPoll) clearInterval(handler.syncPoll);
4677
4685
  handler.reject(new Error(formatServerErrorMessage(errorMsg.code, errorMsg.error)));
4678
4686
  this.clearOrphanedEarlyTerminalVariants();
4679
4687
  }
@@ -4690,6 +4698,19 @@ var WebSocketClient = class WebSocketClient {
4690
4698
  }
4691
4699
  case "sync:state": {
4692
4700
  const syncMsg = message;
4701
+ for (const variant of syncMsg.variants) {
4702
+ if (!variant.request_id || !this.generateHandlers.has(variant.request_id)) continue;
4703
+ const asset = syncMsg.assets.find((candidate) => candidate.id === variant.asset_id);
4704
+ this.handleGenerateStarted({
4705
+ type: "generate:started",
4706
+ requestId: variant.request_id,
4707
+ variantId: variant.id,
4708
+ runId: variant.run_id ?? "",
4709
+ status: variant.status === "uploading" ? "running" : variant.status,
4710
+ assetId: variant.asset_id,
4711
+ assetName: asset?.name ?? "asset"
4712
+ });
4713
+ }
4693
4714
  for (const variant of syncMsg.variants) {
4694
4715
  const handler = this.variantCompletionHandlers.get(variant.id);
4695
4716
  if (!handler) continue;
@@ -4801,6 +4822,7 @@ var WebSocketClient = class WebSocketClient {
4801
4822
  if (generateHandler) {
4802
4823
  this.generateHandlers.delete(requestId);
4803
4824
  clearTimeout(generateHandler.timeout);
4825
+ if (generateHandler.syncPoll) clearInterval(generateHandler.syncPoll);
4804
4826
  generateHandler.reject(error);
4805
4827
  this.clearOrphanedEarlyTerminalVariants();
4806
4828
  return true;
@@ -4814,6 +4836,28 @@ var WebSocketClient = class WebSocketClient {
4814
4836
  }
4815
4837
  return false;
4816
4838
  }
4839
+ handleGenerateStarted(started) {
4840
+ const handler = this.generateHandlers.get(started.requestId);
4841
+ if (!handler) return;
4842
+ handler.onStarted?.(started);
4843
+ if (handler.syncPoll) clearInterval(handler.syncPoll);
4844
+ this.variantCompletionHandlers.set(started.variantId, {
4845
+ requestId: started.requestId,
4846
+ assetId: started.assetId,
4847
+ assetName: started.assetName,
4848
+ onResult: handler.onResult,
4849
+ reject: handler.reject,
4850
+ timeout: handler.timeout
4851
+ });
4852
+ this.generateHandlers.delete(started.requestId);
4853
+ this.startVariantSyncPolling(started.variantId, started.requestId);
4854
+ const earlyTerminal = this.earlyTerminalVariants.get(started.variantId);
4855
+ if (earlyTerminal) {
4856
+ this.earlyTerminalVariants.delete(started.variantId);
4857
+ this.handleTerminalVariant(earlyTerminal);
4858
+ }
4859
+ this.clearOrphanedEarlyTerminalVariants();
4860
+ }
4817
4861
  handleTerminalVariant(variant) {
4818
4862
  let handled = false;
4819
4863
  const handler = this.variantCompletionHandlers.get(variant.id);
@@ -4847,6 +4891,19 @@ var WebSocketClient = class WebSocketClient {
4847
4891
  if (handler?.requestId === requestId) handler.syncPoll = syncPoll;
4848
4892
  else clearInterval(syncPoll);
4849
4893
  }
4894
+ startGenerateSyncPolling(requestId) {
4895
+ const requestCurrentState = () => {
4896
+ if (!this.generateHandlers.has(requestId)) return;
4897
+ try {
4898
+ this.requestSync();
4899
+ } catch {}
4900
+ };
4901
+ requestCurrentState();
4902
+ const syncPoll = setInterval(requestCurrentState, VARIANT_SYNC_POLL_INTERVAL_MS);
4903
+ const handler = this.generateHandlers.get(requestId);
4904
+ if (handler) handler.syncPoll = syncPoll;
4905
+ else clearInterval(syncPoll);
4906
+ }
4850
4907
  hasRequestsAwaitingStarted() {
4851
4908
  return this.generateHandlers.size > 0 || this.draftRunStartsAwaitingVariant.size > 0;
4852
4909
  }
@@ -5098,8 +5155,10 @@ var WebSocketClient = class WebSocketClient {
5098
5155
  const timeoutMs = getGenerationRequestTimeoutMs(params.mediaKind);
5099
5156
  return new Promise((resolve, reject) => {
5100
5157
  const timeout = setTimeout(() => {
5101
- if (this.generateHandlers.get(requestId)) {
5158
+ const requestHandler = this.generateHandlers.get(requestId);
5159
+ if (requestHandler) {
5102
5160
  this.generateHandlers.delete(requestId);
5161
+ if (requestHandler.syncPoll) clearInterval(requestHandler.syncPoll);
5103
5162
  this.clearOrphanedEarlyTerminalVariants();
5104
5163
  reject(/* @__PURE__ */ new Error("Generate request timed out"));
5105
5164
  return;
@@ -5149,6 +5208,7 @@ var WebSocketClient = class WebSocketClient {
5149
5208
  };
5150
5209
  try {
5151
5210
  this.send(message);
5211
+ this.startGenerateSyncPolling(requestId);
5152
5212
  } catch (err) {
5153
5213
  this.generateHandlers.delete(requestId);
5154
5214
  clearTimeout(timeout);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "makefx",
3
- "version": "1.6.5",
3
+ "version": "1.6.7",
4
4
  "description": "Command-line interface for AI-assisted game asset production with Make Effects.",
5
5
  "license": "MIT",
6
6
  "type": "module",