camstack 1.2.162 → 1.2.164

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/cli.js CHANGED
@@ -38,7 +38,7 @@ async function runServe(args) {
38
38
  ...typeof values.data === "string" ? { data: values.data } : {}
39
39
  };
40
40
  Object.assign(process.env, buildServeEnv(opts));
41
- await import("./launcher-3GIYBFMQ.js");
41
+ await import("./launcher-BMA4X5ZT.js");
42
42
  }
43
43
 
44
44
  // src/commands/agent.ts
@@ -83,7 +83,7 @@ async function runAgent(args) {
83
83
  ...typeof values.port === "string" ? { port: values.port } : {}
84
84
  };
85
85
  Object.assign(process.env, buildAgentEnv(opts));
86
- await import("./launcher-3GIYBFMQ.js");
86
+ await import("./launcher-BMA4X5ZT.js");
87
87
  }
88
88
 
89
89
  // src/commands/setup.ts
@@ -431585,6 +431585,24 @@ var require_runner_convergence = __commonJS({
431585
431585
  }
431586
431586
  });
431587
431587
 
431588
+ // ../../server/backend/dist/core/addon/runner-serialization.js
431589
+ var require_runner_serialization = __commonJS({
431590
+ "../../server/backend/dist/core/addon/runner-serialization.js"(exports) {
431591
+ "use strict";
431592
+ Object.defineProperty(exports, "__esModule", { value: true });
431593
+ exports.createRunnerSerializer = createRunnerSerializer;
431594
+ function createRunnerSerializer() {
431595
+ const tails = /* @__PURE__ */ new Map();
431596
+ return (runnerId, converge) => {
431597
+ const previous = tails.get(runnerId) ?? Promise.resolve();
431598
+ const result = previous.then(converge, converge);
431599
+ tails.set(runnerId, result.then(() => void 0, () => void 0));
431600
+ return result;
431601
+ };
431602
+ }
431603
+ }
431604
+ });
431605
+
431588
431606
  // ../../server/backend/dist/core/addon/runner-spawn-fanout.js
431589
431607
  var require_runner_spawn_fanout = __commonJS({
431590
431608
  "../../server/backend/dist/core/addon/runner-spawn-fanout.js"(exports) {
@@ -431692,6 +431710,7 @@ var require_addon_registry_service = __commonJS({
431692
431710
  var forked_custom_actions_js_1 = require_forked_custom_actions();
431693
431711
  var prune_misplaced_addons_js_1 = require_prune_misplaced_addons();
431694
431712
  var runner_convergence_1 = require_runner_convergence();
431713
+ var runner_serialization_1 = require_runner_serialization();
431695
431714
  var runner_spawn_fanout_js_1 = require_runner_spawn_fanout();
431696
431715
  function shouldEvictMissingOnDisk(entry, id, onDiskIds) {
431697
431716
  return entry.source === "installed" && entry.packageName !== "@camstack/system" && !onDiskIds.has(id);
@@ -434003,9 +434022,16 @@ var require_addon_registry_service = __commonJS({
434003
434022
  throw new Error(`initializeAddonGroup("${runnerId}") requires at least one addon`);
434004
434023
  }
434005
434024
  try {
434006
- await this.broker.call("$process.spawnRunner", {
434007
- runnerId,
434008
- addons
434025
+ await this.serializeRunner(runnerId, async () => {
434026
+ try {
434027
+ await this.broker.call("$process.spawnRunner", { runnerId, addons });
434028
+ } catch (err) {
434029
+ if (!/already running/i.test((0, types_1.errMsg)(err)))
434030
+ throw err;
434031
+ this.logger.info("initializeAddonGroup: runner already running \u2014 nothing to spawn", {
434032
+ meta: { runnerId, addonIds: addons.map((a) => a.addonId) }
434033
+ });
434034
+ }
434009
434035
  });
434010
434036
  } catch (err) {
434011
434037
  throw new Error(`Failed to spawn runner "${runnerId}" (${addons.length} addons): ${(0, types_1.errMsg)(err)}`, { cause: err });
@@ -434058,6 +434084,12 @@ var require_addon_registry_service = __commonJS({
434058
434084
  * a group respawns the ENTIRE group (they share a process): the operator's
434059
434085
  * "update one → respawn the whole group" invariant.
434060
434086
  */
434087
+ /**
434088
+ * One converge at a time per runner. See `runner-serialization.ts` for the
434089
+ * two live episodes this closes and why the lock inside `process-service`
434090
+ * could not.
434091
+ */
434092
+ serializeRunner = (0, runner_serialization_1.createRunnerSerializer)();
434061
434093
  async ensureForkedRunner(addonId, opts) {
434062
434094
  const entry = this.addonEntries.get(addonId);
434063
434095
  if (!entry?.declaration || !entry.addonDir) {
@@ -434068,33 +434100,35 @@ var require_addon_registry_service = __commonJS({
434068
434100
  { addonId, addonDir: entry.addonDir }
434069
434101
  ];
434070
434102
  const effectiveRestart = opts.restart && roster.length > 1 && Date.now() - (this.recentGroupRespawns.get(runnerId) ?? 0) < GROUP_RESPAWN_COALESCE_MS ? false : opts.restart;
434071
- const running = await this.listRunnerProcesses();
434072
- const plan = (0, runner_convergence_1.planRunnerConvergence)(runnerId, roster.map((r) => r.addonId), running, { restart: effectiveRestart });
434073
- for (const name of plan.stop) {
434074
- await this.broker.call("$process.stop", { name }).catch((err) => {
434075
- this.logger.warn("ensureForkedRunner: failed to stop stale runner (continuing)", {
434076
- meta: { runnerId, stale: name, error: (0, types_1.errMsg)(err) }
434103
+ return this.serializeRunner(runnerId, async () => {
434104
+ const running = await this.listRunnerProcesses();
434105
+ const plan = (0, runner_convergence_1.planRunnerConvergence)(runnerId, roster.map((r) => r.addonId), running, { restart: effectiveRestart });
434106
+ for (const name of plan.stop) {
434107
+ await this.broker.call("$process.stop", { name }).catch((err) => {
434108
+ this.logger.warn("ensureForkedRunner: failed to stop stale runner (continuing)", {
434109
+ meta: { runnerId, stale: name, error: (0, types_1.errMsg)(err) }
434110
+ });
434077
434111
  });
434078
- });
434079
- }
434080
- if (plan.action === "spawn") {
434081
- await this.broker.call("$process.spawnRunner", { runnerId, addons: roster }).catch((err) => {
434082
- if (!/already running/i.test((0, types_1.errMsg)(err)))
434083
- throw err;
434084
- });
434085
- this.recentGroupRespawns.set(runnerId, Date.now());
434086
- } else if (plan.action === "restart") {
434087
- const res = await this.broker.call("$process.restart", { name: runnerId });
434088
- if (!res.success) {
434089
- throw new Error(`Process restart failed: ${res.reason ?? "unknown"}`);
434090
434112
  }
434091
- this.recentGroupRespawns.set(runnerId, Date.now());
434092
- }
434093
- for (const { addonId: memberId } of roster) {
434094
- const memberEntry = this.addonEntries.get(memberId);
434095
- if (memberEntry)
434096
- memberEntry.initialized = true;
434097
- }
434113
+ if (plan.action === "spawn") {
434114
+ await this.broker.call("$process.spawnRunner", { runnerId, addons: roster }).catch((err) => {
434115
+ if (!/already running/i.test((0, types_1.errMsg)(err)))
434116
+ throw err;
434117
+ });
434118
+ this.recentGroupRespawns.set(runnerId, Date.now());
434119
+ } else if (plan.action === "restart") {
434120
+ const res = await this.broker.call("$process.restart", { name: runnerId });
434121
+ if (!res.success) {
434122
+ throw new Error(`Process restart failed: ${res.reason ?? "unknown"}`);
434123
+ }
434124
+ this.recentGroupRespawns.set(runnerId, Date.now());
434125
+ }
434126
+ for (const { addonId: memberId } of roster) {
434127
+ const memberEntry = this.addonEntries.get(memberId);
434128
+ if (memberEntry)
434129
+ memberEntry.initialized = true;
434130
+ }
434131
+ });
434098
434132
  }
434099
434133
  /**
434100
434134
  * Apply the custom-action catalogs a UDS child DESCRIBED in its register
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "camstack",
3
- "version": "1.2.162",
3
+ "version": "1.2.164",
4
4
  "description": "CLI tool for managing and running CamStack server",
5
5
  "keywords": [
6
6
  "camstack",