@overdeck/desktop 0.62.0 → 0.62.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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@overdeck/desktop",
3
- "version": "0.62.0",
3
+ "version": "0.62.1",
4
4
  "description": "Overdeck Command Deck — AI agent monitoring desktop app",
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -1,2 +1,2 @@
1
- import { a as getMergeTrainConfigPayload, c as getPendingAutoMergePayload, d as postMergeTrainAssemblePayload, f as postMergeTrainConfigPayload, i as getAutoMergeProblemPayload, l as mergeTrainRouteLayer, m as postMergeTrainMergeNextPayload, n as deleteAutoMergePayload, o as getMergeTrainGenerationsPayload, p as postMergeTrainGenerationShipPayload, r as getAutoMergePolicyPayload, s as getMergeTrainQueuesPayload, t as autoMergePolicyRefusal, u as postAutoMergeSchedulePayload } from "./merge-train-DwYhNytU.js";
1
+ import { a as getMergeTrainConfigPayload, c as getPendingAutoMergePayload, d as postMergeTrainAssemblePayload, f as postMergeTrainConfigPayload, i as getAutoMergeProblemPayload, l as mergeTrainRouteLayer, m as postMergeTrainMergeNextPayload, n as deleteAutoMergePayload, o as getMergeTrainGenerationsPayload, p as postMergeTrainGenerationShipPayload, r as getAutoMergePolicyPayload, s as getMergeTrainQueuesPayload, t as autoMergePolicyRefusal, u as postAutoMergeSchedulePayload } from "./merge-train-pMKZ_hti.js";
2
2
  export { autoMergePolicyRefusal, mergeTrainRouteLayer as default, mergeTrainRouteLayer, deleteAutoMergePayload, getAutoMergePolicyPayload, getAutoMergeProblemPayload, getMergeTrainConfigPayload, getMergeTrainGenerationsPayload, getMergeTrainQueuesPayload, getPendingAutoMergePayload, postAutoMergeSchedulePayload, postMergeTrainAssemblePayload, postMergeTrainConfigPayload, postMergeTrainGenerationShipPayload, postMergeTrainMergeNextPayload };
@@ -219,7 +219,7 @@ async function getMergeTrainQueuesPayload() {
219
219
  /** PAN-1696 AC2: per-project generation chains across every tracked project. */
220
220
  async function getMergeTrainGenerationsPayload() {
221
221
  const { isMergeTrainEnabledForProject } = await import("./merge-sync-GeddtnBd.js");
222
- const { getUatGenerationsPayload } = await import("./uat-train-CuZLaq2g.js");
222
+ const { getUatGenerationsPayload } = await import("./uat-train-tiJ_fEPf.js");
223
223
  return (await Promise.allSettled(listProjectsSync().map(async ({ key, config }) => ({
224
224
  projectKey: key,
225
225
  projectName: config.name,
@@ -306,7 +306,7 @@ async function postMergeTrainAssemblePayload(payload) {
306
306
  status: 404,
307
307
  body: { error: `Unknown project key: ${projectKey}` }
308
308
  };
309
- const { runUatTrainReconcile } = await import("./uat-train-CuZLaq2g.js");
309
+ const { runUatTrainReconcile } = await import("./uat-train-tiJ_fEPf.js");
310
310
  return {
311
311
  status: 200,
312
312
  body: { projects: [{
@@ -318,7 +318,7 @@ async function postMergeTrainAssemblePayload(payload) {
318
318
  }] }
319
319
  };
320
320
  }
321
- const { runUatTrainReconcileAllProjects } = await import("./uat-train-CuZLaq2g.js");
321
+ const { runUatTrainReconcileAllProjects } = await import("./uat-train-tiJ_fEPf.js");
322
322
  return {
323
323
  status: 200,
324
324
  body: { projects: await runUatTrainReconcileAllProjects({ force: true }) }
@@ -368,7 +368,7 @@ const postMergeTrainGenerationStackRoute = HttpRouter.add("POST", "/api/merge-tr
368
368
  const authError = rejectUnsafeDashboardMutationRequest(yield* HttpServerRequest.HttpServerRequest);
369
369
  if (authError) return authError;
370
370
  const name = uatGenerationNameFromParam((yield* HttpRouter.params)["name"] ?? "");
371
- const { postUatGenerationStackPayload } = yield* Effect.promise(() => import("./uat-train-CuZLaq2g.js"));
371
+ const { postUatGenerationStackPayload } = yield* Effect.promise(() => import("./uat-train-tiJ_fEPf.js"));
372
372
  const result = yield* Effect.promise(() => postUatGenerationStackPayload(name));
373
373
  if (!result.ok) return jsonResponse({ error: result.error }, { status: result.status });
374
374
  return jsonResponse({
@@ -385,7 +385,7 @@ const postMergeTrainGenerationPromoteRoute = HttpRouter.add("POST", "/api/merge-
385
385
  const rawShipVersion = parsed.body["shipVersion"];
386
386
  if (rawShipVersion !== void 0 && (typeof rawShipVersion !== "string" || !/^\d+\.\d+\.\d+$/.test(rawShipVersion))) return jsonResponse({ error: "shipVersion must look like 48.8.0" }, { status: 400 });
387
387
  const name = uatGenerationNameFromParam((yield* HttpRouter.params)["name"] ?? "");
388
- const { postUatGenerationPromotePayload } = yield* Effect.promise(() => import("./uat-train-CuZLaq2g.js"));
388
+ const { postUatGenerationPromotePayload } = yield* Effect.promise(() => import("./uat-train-tiJ_fEPf.js"));
389
389
  const { firePostMergeLifecycle } = yield* Effect.promise(() => import("./specialists-C7M9CdDA.js"));
390
390
  const result = yield* Effect.promise(() => postUatGenerationPromotePayload(name, firePostMergeLifecycle, rawShipVersion));
391
391
  if (!result.success) return jsonResponse(result, { status: result.reason === "not-found" ? 404 : result.reason === "merge-failed" ? 500 : 409 });
@@ -726,4 +726,4 @@ const mergeTrainRouteLayer = Layer.mergeAll(getMergeTrainQueuesRoute, getMergeTr
726
726
  //#endregion
727
727
  export { getMergeTrainConfigPayload as a, getPendingAutoMergePayload as c, postMergeTrainAssemblePayload as d, postMergeTrainConfigPayload as f, getAutoMergeProblemPayload as i, mergeTrainRouteLayer as l, postMergeTrainMergeNextPayload as m, deleteAutoMergePayload as n, getMergeTrainGenerationsPayload as o, postMergeTrainGenerationShipPayload as p, getAutoMergePolicyPayload as r, getMergeTrainQueuesPayload as s, autoMergePolicyRefusal as t, postAutoMergeSchedulePayload as u };
728
728
 
729
- //# sourceMappingURL=merge-train-DwYhNytU.js.map
729
+ //# sourceMappingURL=merge-train-pMKZ_hti.js.map
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@overdeck/desktop-server",
3
- "version": "0.62.0",
3
+ "version": "0.62.1",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
@@ -395,9 +395,9 @@
395
395
  }
396
396
  },
397
397
  "node_modules/ansi-regex": {
398
- "version": "6.3.0",
399
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.3.0.tgz",
400
- "integrity": "sha512-WpDfL7NO6j7tH88IDBNVdUJxDh9nmCteAVW9dsep846XdwF4naCBK+/tGLX3KJgcpgMRXCFlTM2hKGoK9FsdrQ==",
398
+ "version": "6.4.0",
399
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.4.0.tgz",
400
+ "integrity": "sha512-KzTVk2tCWAHtYrvvvaP8bJKJq2pVinhLcGEQdtLIYPbmNGNyYe8QwNaTUYQp2J7/vIsUKt5QCqAfUkYyG9DkOw==",
401
401
  "license": "MIT",
402
402
  "engines": {
403
403
  "node": ">=12"
@@ -2006,9 +2006,9 @@
2006
2006
  "license": "ISC"
2007
2007
  },
2008
2008
  "node_modules/ws": {
2009
- "version": "8.21.3",
2010
- "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.3.tgz",
2011
- "integrity": "sha512-201TZ/kPWxoPr/OKWjquZR1SWKXcvxdH+e1xrx89b3YbmzLMFCLfnaG1HFIgWzJOEWZ7MvpK++odZufgYR50Rw==",
2009
+ "version": "8.22.0",
2010
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.22.0.tgz",
2011
+ "integrity": "sha512-Ydggc987+RO0AnWtZ/7Wq9FtNvcrL1b/RO0ud9mWjUPgDrsAAwQSF51sm2hm1XofbU/4jkpGEsLFsZZxU+1DOg==",
2012
2012
  "license": "MIT",
2013
2013
  "engines": {
2014
2014
  "node": ">=10.0.0"
@@ -2,9 +2,9 @@ export default function ansiRegex({onlyFirst = false} = {}) {
2
2
  // Valid string terminator sequences are BEL, ESC\, and 0x9c
3
3
  const ST = '(?:\\u0007|\\u001B\\u005C|\\u009C)';
4
4
 
5
- // OSC sequences only: ESC ] ... ST
6
- // The payload stops at the first terminator character rather than scanning ahead for one, so an unterminated `ESC ]` cannot rescan the rest of the input. Terminals likewise abort a control string on an unexpected ESC.
7
- const osc = `(?:\\u001B\\][^\\u0007\\u001B\\u009C]*${ST})`;
5
+ // OSC sequences only: ESC ] ... ST (or the C1 introducer 0x9d ... ST)
6
+ // The payload stops at the first terminator character rather than scanning ahead for one, so an unterminated `ESC ]` cannot rescan the rest of the input. Terminals likewise abort a control string on an unexpected ESC. The payload also stops at 0x9d so an unterminated C1 OSC cannot swallow the next one.
7
+ const osc = `(?:(?:\\u001B\\]|\\u009D)[^\\u0007\\u001B\\u009C\\u009D]*${ST})`;
8
8
 
9
9
  // CSI and related: ESC/C1, optional intermediates, optional params (supports ; and :) then final byte
10
10
  const csi = '[\\u001B\\u009B][[\\]()#;?]*(?:\\d{1,4}(?:[;:]\\d{0,4})*)?[\\dA-PR-TZcf-nq-uy=><~]';
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ansi-regex",
3
- "version": "6.3.0",
3
+ "version": "6.4.0",
4
4
  "description": "Regular expression for matching ANSI escape codes",
5
5
  "license": "MIT",
6
6
  "repository": "chalk/ansi-regex",
@@ -75,11 +75,24 @@ class WebSocket extends EventEmitter {
75
75
  this._redirects = 0;
76
76
 
77
77
  if (protocols === undefined) {
78
- protocols = [];
78
+ if (!options || options.protocols === undefined) {
79
+ protocols = [];
80
+ } else if (Array.isArray(options.protocols)) {
81
+ protocols = options.protocols;
82
+ } else {
83
+ protocols = [options.protocols];
84
+ }
79
85
  } else if (!Array.isArray(protocols)) {
80
86
  if (typeof protocols === 'object' && protocols !== null) {
81
87
  options = protocols;
82
- protocols = [];
88
+
89
+ if (options.protocols === undefined) {
90
+ protocols = [];
91
+ } else if (Array.isArray(options.protocols)) {
92
+ protocols = options.protocols;
93
+ } else {
94
+ protocols = [options.protocols];
95
+ }
83
96
  } else {
84
97
  protocols = [protocols];
85
98
  }
@@ -318,7 +331,6 @@ class WebSocket extends EventEmitter {
318
331
  return;
319
332
  }
320
333
 
321
- this._readyState = WebSocket.CLOSING;
322
334
  this._sender.close(code, data, !this._isServer, (err) => {
323
335
  //
324
336
  // This error is handled by the `'error'` listener on the socket. We only
@@ -336,6 +348,7 @@ class WebSocket extends EventEmitter {
336
348
  }
337
349
  });
338
350
 
351
+ this._readyState = WebSocket.CLOSING;
339
352
  setCloseTimer(this);
340
353
  }
341
354
 
@@ -681,6 +694,7 @@ function initAsClient(websocket, address, protocols, options) {
681
694
  socketPath: undefined,
682
695
  hostname: undefined,
683
696
  protocol: undefined,
697
+ protocols: undefined,
684
698
  timeout: undefined,
685
699
  method: 'GET',
686
700
  host: undefined,
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ws",
3
- "version": "8.21.3",
3
+ "version": "8.22.0",
4
4
  "description": "Simple to use, blazing fast and thoroughly tested websocket client and server for Node.js",
5
5
  "keywords": [
6
6
  "HyBi",
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@overdeck/desktop-server",
3
- "version": "0.62.0",
3
+ "version": "0.62.1",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@overdeck/desktop-server",
9
- "version": "0.62.0",
9
+ "version": "0.62.1",
10
10
  "dependencies": {
11
11
  "@effect/platform-node": "4.0.0-beta.73",
12
12
  "@google-cloud/speech": "7.5.0",
@@ -775,9 +775,9 @@
775
775
  }
776
776
  },
777
777
  "node_modules/ansi-regex": {
778
- "version": "6.3.0",
779
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.3.0.tgz",
780
- "integrity": "sha512-WpDfL7NO6j7tH88IDBNVdUJxDh9nmCteAVW9dsep846XdwF4naCBK+/tGLX3KJgcpgMRXCFlTM2hKGoK9FsdrQ==",
778
+ "version": "6.4.0",
779
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.4.0.tgz",
780
+ "integrity": "sha512-KzTVk2tCWAHtYrvvvaP8bJKJq2pVinhLcGEQdtLIYPbmNGNyYe8QwNaTUYQp2J7/vIsUKt5QCqAfUkYyG9DkOw==",
781
781
  "license": "MIT",
782
782
  "engines": {
783
783
  "node": ">=12"
@@ -2438,9 +2438,9 @@
2438
2438
  "license": "ISC"
2439
2439
  },
2440
2440
  "node_modules/ws": {
2441
- "version": "8.21.3",
2442
- "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.3.tgz",
2443
- "integrity": "sha512-201TZ/kPWxoPr/OKWjquZR1SWKXcvxdH+e1xrx89b3YbmzLMFCLfnaG1HFIgWzJOEWZ7MvpK++odZufgYR50Rw==",
2441
+ "version": "8.22.0",
2442
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.22.0.tgz",
2443
+ "integrity": "sha512-Ydggc987+RO0AnWtZ/7Wq9FtNvcrL1b/RO0ud9mWjUPgDrsAAwQSF51sm2hm1XofbU/4jkpGEsLFsZZxU+1DOg==",
2444
2444
  "license": "MIT",
2445
2445
  "engines": {
2446
2446
  "node": ">=10.0.0"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@overdeck/desktop-server",
3
- "version": "0.62.0",
3
+ "version": "0.62.1",
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "dependencies": {
package/server/server.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { a as __toCommonJS, n as __esmMin, o as __toESM, r as __exportAll, t as __commonJSMin } from "./rolldown-runtime-DNCzzKnI.js";
2
2
  import { $ as isAgentSessionName, An as getModelEffortLevels, B as parsePullRequestRef, Cr as init_paths, Ct as PIPELINE_MEMBERSHIP_LOADING_CODE, Dt as getDefaultTtsDaemonConfig, En as resolveModel, Er as packageRoot, Et as getDefaultDocsConfig, F as init_js_yaml, G as isAgentRole, H as COMPANION_TERMINAL_CLOSE_BODY_KEYS, Ht as TieredExecutionConfigError, I as yaml, Jt as canUseHarness, K as COMPOSER_COMMAND_MANIFEST, L as mergeConfigs, Lt as mergeTtsDaemonConfigs, Mn as init_model_capabilities, N as init_errors, Nn as modelSupportsImages, On as MODEL_CAPABILITIES, P as require_dist$1, Pn as resolveModelId, R as init_src, Rt as DEFAULT_CONFIG$1, S as FsError, Sn as computeModelOrigin, Sr as getOverdeckHome, St as AgentSnapshot, Tr as isDevMode, U as COMPANION_TERMINAL_OPEN_BODY_KEYS, Ut as init_tier_table, V as repoFromRemoteUrl, Vn as MODEL_DEPRECATIONS, Wt as resolveTieredExecutionBlock, Xn as PARENT_MODEL_REF, Xt as init_harness_policy, Yn as COMPLIANCE_MODES, Z as getHarnessBehavior, Zn as ROLE_EFFORTS, _ as updateConversationsConfig, _r as getDocsBudgetStatePath, a as getGlobalConfigPath, an as getProviderForModel, ar as LOGS_DIR, bn as RETIRED_SUB_ROLES, br as getDocsTelemetryPath, bt as resolveEffectivePullRequest, dt as PanRpcError, en as UnknownModelError, et as ContextLayerSaveRequest, ft as PanRpcGroup, gn as init_registry, gt as SystemHealthSnapshot, h as loadConfigSync, hn as defaultBackgroundAiFeatures, hr as activeDeploymentRepoRoot, ht as DomainEvent, i as getConversationsConfig, jn as hasModelCapability, k as ProcessSpawnError, m as loadConfigNoMigration, mn as init_openai_compatible_proxy, mt as EDITORS, n as clearConfigCache, nn as getBuiltInDefaultHarness, o as getOpenInEditorCommand, on as init_providers, or as OVERDECK_HOME, p as isTldrEnabled, pn as getDashScopeUpstreamBaseUrl, pr as SYNC_SOURCES, pt as WS_METHODS, q as compareIssueIds, qt as validateTieredExecutionConfig, r as getConversationSearchConfig, rn as getKimiAnthropicBaseUrl, t as init_config_yaml, tt as ContextPreviewRequest, u as init_load, vn as DEFAULT_ROLES, vr as getDocsDisableStatePath, vt as MemoryObservation, wr as isDeploymentGenerationRoot, xt as AgentRuntimeSnapshot, yn as DEFAULT_WORKHORSES, yr as getDocsIndexPath, z as isConfiguredPullRequestRepo } from "./config-yaml-eISZeFuh.js";
3
3
  import { A as init_boot_gates, D as getOverdeckDatabasePath, E as OVERDECK_MIGRATION_PATH, M as resolveBootGates, O as init_paths$1, d as dropPipelineStateMirrorTables, i as DbLive, j as isPeerDashboardProcess, k as formatBootGateState, l as TmuxLive, p as init_infra, u as dropDeadIssuesForeignKeys } from "./infra-DEg0Pwsm.js";
4
- import { d as getDashboardIdentity, f as isNonPrimaryCheckoutRoot, l as startUatTrainReconciler, m as shouldRefuseHostDashboardPort, p as readHostDashboardApiPort, u as stopUatTrainReconciler } from "./uat-train-Bik_I85J.js";
4
+ import { d as getDashboardIdentity, f as isNonPrimaryCheckoutRoot, l as startUatTrainReconciler, m as shouldRefuseHostDashboardPort, p as readHostDashboardApiPort, u as stopUatTrainReconciler } from "./uat-train-BORW2R0A.js";
5
5
  import { a as validateOrigin$1, c as jsonStringResponse, o as validateOriginHeaders, r as isTrustedOriginForHost, s as jsonResponse, t as getHeaderFromMap } from "./origin-validation-DzzAfBTF.js";
6
6
  import { c as loadConfigSync$1, n as getDashboardApiUrl, o as init_config } from "./config-Q5xnOeq2.js";
7
7
  import { a as emitActivityTts, o as emitDashboardLifecycle, r as emitActivityEntry, s as init_activity_logger, t as appendDomainEventAsync } from "./activity-logger-89A9ZC2h.js";
@@ -122,7 +122,7 @@ import { n as isRemoteAvailable, t as createFlyProviderFromConfig } from "./remo
122
122
  import { t as detectProviderEnvConflicts } from "./claude-settings-overlay-Cl8Xq_sf.js";
123
123
  import { a as projectIdFromPath, i as parentSessionIdFromPath, n as dimensionsForModel, o as sessionIdFromPath, r as openEmbeddingsDb } from "./conversations-search-EDX0ltxJ.js";
124
124
  import { r as getShipLog } from "./ship-log-DdnHsR67.js";
125
- import { l as mergeTrainRouteLayer } from "./merge-train-DwYhNytU.js";
125
+ import { l as mergeTrainRouteLayer } from "./merge-train-pMKZ_hti.js";
126
126
  import { a as resumeFlywheel, c as readFlywheelReportFile, d as FlywheelNotRunning, f as FlywheelOrphanSession, g as resolveFlywheelProjectRoot, h as readFlywheelRun, i as requestFlywheelReport, l as readFlywheelStateFile, m as deriveFlywheelStatus, n as abortFlywheel, o as startFlywheel, p as FlywheelPausedExists, r as pauseFlywheel, s as stopFlywheel, t as computeSubstrateStats, u as FlywheelAlreadyRunning } from "./substrate-stats-beoo0bT5.js";
127
127
  import { i as appendLinearMcpAuthHealthyEvent, r as appendLinearMcpAuthCallbackRelayedEvent, s as resolveLinearMcpAuthIntervention } from "./linear-mcp-auth-Bt0bIPww.js";
128
128
  import { n as getSequencerRunStatus, r as spawnSequencerAgent, t as SEQUENCER_AGENT_ID } from "./sequencer-agent-Bf_xHy-j.js";
@@ -65570,11 +65570,11 @@ async function defaultMergeGate(issueId) {
65570
65570
  return evaluateIssueMergeGate(issueId);
65571
65571
  }
65572
65572
  async function defaultPolicyRefusal() {
65573
- const { autoMergePolicyRefusal } = await import("./merge-train-2WUgME6h.js");
65573
+ const { autoMergePolicyRefusal } = await import("./merge-train-I2N9TlqX.js");
65574
65574
  return (issueId) => autoMergePolicyRefusal(issueId);
65575
65575
  }
65576
65576
  async function defaultSchedule(issueId, canSchedule) {
65577
- const [{ postAutoMergeSchedulePayload }, { scheduleAutoMergeWithResult }] = await Promise.all([import("./merge-train-2WUgME6h.js"), import("./merge-sync-GeddtnBd.js")]);
65577
+ const [{ postAutoMergeSchedulePayload }, { scheduleAutoMergeWithResult }] = await Promise.all([import("./merge-train-I2N9TlqX.js"), import("./merge-sync-GeddtnBd.js")]);
65578
65578
  return postAutoMergeSchedulePayload({ issueId }, { schedule: (input) => scheduleAutoMergeWithResult({
65579
65579
  ...input,
65580
65580
  canSchedule
@@ -29,8 +29,8 @@ var import_toml = require_toml();
29
29
  init_boot_gates();
30
30
  function getBuildInfo() {
31
31
  return {
32
- buildCommit: "a4eeac3319fef2fd78d59d71e8eb0ba969949084",
33
- builtAt: "2026-09-26T07:55:26.281Z",
32
+ buildCommit: "514884c9dd939158a164c88d0694fe94ec0ff99c",
33
+ builtAt: "2026-09-27T04:42:06.924Z",
34
34
  buildDirty: false,
35
35
  buildBranch: null
36
36
  };
@@ -3835,4 +3835,4 @@ async function postUatGenerationPromotePayload(name, firePostMerge, shipVersion)
3835
3835
  //#endregion
3836
3836
  export { postUatGenerationStackPayload as a, runUatTrainReconcileAllProjects as c, getDashboardIdentity as d, isNonPrimaryCheckoutRoot as f, postUatGenerationPromotePayload as i, startUatTrainReconciler as l, shouldRefuseHostDashboardPort as m, getUatCandidatePayload as n, resolveUatProjectRoot as o, readHostDashboardApiPort as p, getUatGenerationsPayload as r, runUatTrainReconcile as s, canStartUatTrainReconciler as t, stopUatTrainReconciler as u };
3837
3837
 
3838
- //# sourceMappingURL=uat-train-Bik_I85J.js.map
3838
+ //# sourceMappingURL=uat-train-BORW2R0A.js.map
@@ -1,2 +1,2 @@
1
- import { a as postUatGenerationStackPayload, c as runUatTrainReconcileAllProjects, i as postUatGenerationPromotePayload, l as startUatTrainReconciler, n as getUatCandidatePayload, o as resolveUatProjectRoot, r as getUatGenerationsPayload, s as runUatTrainReconcile, t as canStartUatTrainReconciler, u as stopUatTrainReconciler } from "./uat-train-Bik_I85J.js";
1
+ import { a as postUatGenerationStackPayload, c as runUatTrainReconcileAllProjects, i as postUatGenerationPromotePayload, l as startUatTrainReconciler, n as getUatCandidatePayload, o as resolveUatProjectRoot, r as getUatGenerationsPayload, s as runUatTrainReconcile, t as canStartUatTrainReconciler, u as stopUatTrainReconciler } from "./uat-train-BORW2R0A.js";
2
2
  export { canStartUatTrainReconciler, getUatCandidatePayload, getUatGenerationsPayload, postUatGenerationPromotePayload, postUatGenerationStackPayload, resolveUatProjectRoot, runUatTrainReconcile, runUatTrainReconcileAllProjects, startUatTrainReconciler, stopUatTrainReconciler };
@@ -34,20 +34,39 @@ Do not recommend GitFlow or a long-lived `develop` branch unless the user explic
34
34
 
35
35
  ## Preferred operator flow
36
36
 
37
- 1. Run:
37
+ Every stable release updates the public changelog and ends with a clean-install
38
+ check. Neither step is optional.
39
+
40
+ 1. **Update the changelog first.** Add a `<Update label="vX.Y.Z" description="YYYY-MM-DD">`
41
+ block at the top of `changelog.mdx` with the user-facing changes since the
42
+ previous tag and a compare link to the new tag. Commit it as
43
+ `docs(infra): changelog for vX.Y.Z` and push `main`. `pan release` does not
44
+ edit the changelog, and it needs a clean tree. Details: `docs/RELEASING.md`,
45
+ "Update the public changelog".
46
+ 2. Run:
38
47
  ```bash
39
48
  pan release check
40
49
  ```
41
- 2. Create a stable or canary release:
50
+ 3. Create a stable or canary release:
42
51
  ```bash
43
52
  pan release stable --version 0.7.1
44
53
  pan release canary --version 0.8.0-canary.1
45
54
  ```
46
- 3. Push intentionally:
55
+ 4. Push intentionally:
47
56
  ```bash
48
57
  git push origin main
49
58
  git push origin v0.7.1
50
59
  ```
60
+ 5. **Verify a clean install after npm shows the new version.** Run the advertised
61
+ launch command with an empty cache and an empty global prefix, so a global
62
+ install on this machine can't hide a broken package:
63
+ ```bash
64
+ T=$(mktemp -d); cd "$T"
65
+ npm_config_prefix="$T/prefix" npx --yes --cache "$T/cache" @overdeck/core@X.Y.Z --version
66
+ ```
67
+ It must print `X.Y.Z`. If npm fails (for example `reading 'edgesOut'` or
68
+ `EUNSUPPORTEDPROTOCOL`), the release is broken for every new user: fix it and
69
+ ship a patch release the same day.
51
70
 
52
71
  ## What the CLI does
53
72
 
@@ -82,6 +101,10 @@ Prerequisites that must stay true or publishing breaks:
82
101
  - **No `workspace:*` in runtime `dependencies`** — bundled workspace packages
83
102
  (e.g. `@overdeck/contracts`) belong in `devDependencies`, or consumers'
84
103
  `npm install` fails with `EUNSUPPORTEDPROTOCOL`.
104
+ - **No test frameworks in runtime `dependencies`** (`vitest`, `@effect/vitest`,
105
+ `@vitest/*`, `jest`, `@playwright/test`). 0.60.0–0.62.0 shipped `@effect/vitest`
106
+ there, and its peer graph crashed `npx @overdeck/core` with `reading 'edgesOut'`.
107
+ `scripts/lint-dist-externals.mjs` fails the build on this.
85
108
  - `publishConfig.access: "public"` on every publishable package.
86
109
 
87
110
  First-time setup for a brand-new package (npm org creation, the one-time