instar 1.3.788 → 1.3.790

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.
@@ -562,7 +562,17 @@
562
562
  /* F3 — Dashboard UX Standard: every tab's plain-language purpose line.
563
563
  One muted, readable sentence directly under the tab header telling a
564
564
  non-expert what the tab is for and what they can do here. Enforced by
565
- tests/unit/dashboard-tab-purpose.test.ts. */
565
+ tests/unit/dashboard-tab-purpose.test.ts.
566
+
567
+ F7 — CANONICAL purpose-line class. `.tab-purpose` is the shared vocabulary
568
+ every NEW tab should use for its purpose line. Three legacy variants still
569
+ exist and carry their own deliberately-distinct sizing — `.ph-intro`
570
+ (Process-Health design-system intro, larger), `.features-subtitle`, and
571
+ `.dropzone-subtitle` — all recognized by the F3 floor test. Per the spec
572
+ (docs/specs/dashboard-ux-standard.md, FD-3) F7 is soft-first: consolidating
573
+ those three into `.tab-purpose` is a tracked migration (it changes their
574
+ visual size, so it is done deliberately, not big-bang). Until then: reach
575
+ for `.tab-purpose`; do not add a fifth variant or an inline-styled line. */
566
576
  .tab-purpose {
567
577
  font-size: 13px;
568
578
  color: var(--text-dim);
@@ -2950,7 +2960,7 @@
2950
2960
  </div>
2951
2961
  <div class="file-content-panel" id="fileContentPanel">
2952
2962
  <div class="file-content-header" id="fileContentHeader" style="display:none">
2953
- <button class="files-back-btn" onclick="filesGoBack()">&larr;</button>
2963
+ <button class="files-back-btn" onclick="filesGoBack()" title="Back" aria-label="Back">&larr;</button>
2954
2964
  <div class="breadcrumbs" id="fileBreadcrumbs"></div>
2955
2965
  <div class="file-badges" id="fileBadges"></div>
2956
2966
  </div>
@@ -3229,7 +3239,7 @@
3229
3239
  Multi-spec project plans. Each project groups related pieces of work and only advances to its next round once its required checks pass.
3230
3240
  </div>
3231
3241
  <div id="projectsEmpty" style="padding:40px;text-align:center;color:var(--text-dim);display:none">
3232
- No active projects. Create one via <code>POST /projects</code> with a plan-doc path.
3242
+ No active projects yet. Ask your agent to start one from a plan document, and it'll appear here.
3233
3243
  </div>
3234
3244
  <div id="projectsList" style="display:flex;flex-direction:column;gap:12px"></div>
3235
3245
  </div>
@@ -3260,7 +3270,7 @@
3260
3270
  </div>
3261
3271
  <div id="initiativesDigest" style="display:none;padding:12px;border:1px solid var(--border);border-radius:6px;background:var(--bg-dim)"></div>
3262
3272
  <div id="initiativesEmpty" style="padding:40px;text-align:center;color:var(--text-dim);display:none">
3263
- No initiatives to display. Create one via <code>POST /initiatives</code>.
3273
+ No initiatives yet. Ask your agent to create one, and it'll appear here.
3264
3274
  </div>
3265
3275
  <div id="initiativesList" style="display:flex;flex-direction:column;gap:12px"></div>
3266
3276
  </div>
@@ -3945,7 +3955,7 @@
3945
3955
  <!-- WhatsApp QR panel (hidden by default) -->
3946
3956
  <div class="wa-qr-backdrop" id="waQrBackdrop" style="display:none" onclick="closeQrPanel()"></div>
3947
3957
  <div class="wa-qr-panel" id="waQrPanel" style="display:none">
3948
- <button class="wa-close" onclick="closeQrPanel()">&times;</button>
3958
+ <button class="wa-close" onclick="closeQrPanel()" title="Close" aria-label="Close">&times;</button>
3949
3959
  <h3>WhatsApp Connection</h3>
3950
3960
  <p id="waQrMsg">Scan this QR code with WhatsApp to connect</p>
3951
3961
  <div id="waQrContainer"></div>
@@ -7649,7 +7659,7 @@
7649
7659
 
7650
7660
  detail.innerHTML = '<div class="job-detail-header">'
7651
7661
  + '<div>'
7652
- + '<button class="back-btn" onclick="jobsGoBack()" style="display:none;margin-right:8px">&larr;</button>'
7662
+ + '<button class="back-btn" onclick="jobsGoBack()" style="display:none;margin-right:8px" title="Back" aria-label="Back">&larr;</button>'
7653
7663
  + '<h3>' + esc(displayName) + '</h3>'
7654
7664
  + '<div class="job-desc">' + esc(job.description || '') + '</div>'
7655
7665
  + '</div>'
@@ -9420,7 +9430,7 @@
9420
9430
  try {
9421
9431
  const data = await apiFetch(info.endpoint);
9422
9432
  panel.innerHTML = '<div class="cap-content-panel">' +
9423
- '<div class="cap-content-header"><span>' + esc(info.label) + '</span><button onclick="document.getElementById(\'capContentBrowser\').innerHTML=\'\'" style="border:none;background:none;color:var(--text-dim);cursor:pointer;font-size:14px">&times;</button></div>' +
9433
+ '<div class="cap-content-header"><span>' + esc(info.label) + '</span><button onclick="document.getElementById(\'capContentBrowser\').innerHTML=\'\'" style="border:none;background:none;color:var(--text-dim);cursor:pointer;font-size:14px" title="Close" aria-label="Close">&times;</button></div>' +
9424
9434
  '<div class="cap-content-body">' + renderBrowsableContent(info.renderer, data) + '</div></div>';
9425
9435
  } catch (e) {
9426
9436
  panel.innerHTML = '<div style="padding:12px;color:var(--red);font-size:12px">Failed to load: ' + esc(e.message) + '</div>';
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/commands/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAwDH,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAU3D,OAAO,EAAE,eAAe,EAAiC,MAAM,iCAAiC,CAAC;AAyBjG,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAGvD,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AA6H7D,OAAO,KAAK,EAAW,oBAAoB,EAAe,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACjG,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAgFtD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,gBAAgB,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAC1C,OAAO,CAUT;AAyID,UAAU,YAAY;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;2DACuD;IACvD,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAgmDD;;;;;;;;GAQG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,YAAY,EACpB,YAAY,EAAE,oBAAoB,GAAG,IAAI,GACxC;IACD,YAAY,EAAE,oBAAoB,GAAG,IAAI,CAAC;IAC1C,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAAC;IAC3C,QAAQ,EAAE,MAAM,CAAC;CAClB,CAqBA;AAED,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,eAAe,EACzB,cAAc,EAAE,cAAc,EAC9B,YAAY,CAAC,EAAE,YAAY,EAC3B,WAAW,CAAC,EAAE,WAAW,EACzB,WAAW,CAAC,EAAE,WAAW,EACzB,iBAAiB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,EAGvE,UAAU,CAAC,EAAE,MAAM,OAAO,8BAA8B,EAAE,WAAW,GAAG,IAAI,EAK5E,qBAAqB,CAAC,EAAE,MAAM,OAAO,gCAAgC,EAAE,kBAAkB,GAAG,IAAI,EAKhG,mBAAmB,CAAC,EAAE,MAAM,MAAM,GAAG,IAAI,GAAG,SAAS,EAQrD,oBAAoB,CAAC,EAAE,MAAM;IAC3B,YAAY,EAAE,OAAO,kBAAkB,EAAE,oBAAoB,GAAG,IAAI,CAAC;IACrE,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAAC;IAC3C,QAAQ,EAAE,MAAM,CAAC;CAClB,GAAG,IAAI,GACP,IAAI,CAonBN;AA2lBD,wBAAsB,WAAW,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAstmBtE;AAED,wBAAsB,UAAU,CAAC,OAAO,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAsDzE;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAuD5E"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/commands/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAwDH,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAU3D,OAAO,EAAE,eAAe,EAAiC,MAAM,iCAAiC,CAAC;AAyBjG,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAGvD,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AA6H7D,OAAO,KAAK,EAAW,oBAAoB,EAAe,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACjG,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAgFtD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,gBAAgB,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAC1C,OAAO,CAUT;AAyID,UAAU,YAAY;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;2DACuD;IACvD,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAgmDD;;;;;;;;GAQG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,YAAY,EACpB,YAAY,EAAE,oBAAoB,GAAG,IAAI,GACxC;IACD,YAAY,EAAE,oBAAoB,GAAG,IAAI,CAAC;IAC1C,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAAC;IAC3C,QAAQ,EAAE,MAAM,CAAC;CAClB,CAqBA;AAED,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,eAAe,EACzB,cAAc,EAAE,cAAc,EAC9B,YAAY,CAAC,EAAE,YAAY,EAC3B,WAAW,CAAC,EAAE,WAAW,EACzB,WAAW,CAAC,EAAE,WAAW,EACzB,iBAAiB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,EAGvE,UAAU,CAAC,EAAE,MAAM,OAAO,8BAA8B,EAAE,WAAW,GAAG,IAAI,EAK5E,qBAAqB,CAAC,EAAE,MAAM,OAAO,gCAAgC,EAAE,kBAAkB,GAAG,IAAI,EAKhG,mBAAmB,CAAC,EAAE,MAAM,MAAM,GAAG,IAAI,GAAG,SAAS,EAQrD,oBAAoB,CAAC,EAAE,MAAM;IAC3B,YAAY,EAAE,OAAO,kBAAkB,EAAE,oBAAoB,GAAG,IAAI,CAAC;IACrE,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAAC;IAC3C,QAAQ,EAAE,MAAM,CAAC;CAClB,GAAG,IAAI,GACP,IAAI,CAonBN;AA2lBD,wBAAsB,WAAW,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CA8tmBtE;AAED,wBAAsB,UAAU,CAAC,OAAO,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAsDzE;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAuD5E"}
@@ -3304,7 +3304,15 @@ export async function startServer(options) {
3304
3304
  // handler frees the lock within a bounded grace); only a genuine duplicate
3305
3305
  // is refused. A standby on a DIFFERENT host with its own state dir boots
3306
3306
  // freely. Override with INSTAR_ALLOW_SECOND_INSTANCE=1.
3307
- const singleInstanceLock = new SingleInstanceLock({ stateDir: config.stateDir });
3307
+ const silCfg = config.monitoring?.singleInstanceLock;
3308
+ const singleInstanceLock = new SingleInstanceLock({
3309
+ stateDir: config.stateDir,
3310
+ // Hostname-flap auto-heal (2026-07-08 wedge). Operator override wins; else
3311
+ // the dev-agent gate flips it LIVE on a development agent, DARK on the fleet
3312
+ // (mirrors resumeQueue.autoHealStaleHostLock). Fail-closed inside acquire().
3313
+ autoHealStaleHostRename: silCfg?.autoHealStaleHostRename ?? resolveDevAgentGate(undefined, config),
3314
+ staleHostRenameMs: silCfg?.staleHostRenameMs,
3315
+ });
3308
3316
  const lockResult = await singleInstanceLock.acquire();
3309
3317
  if (!lockResult.acquired) {
3310
3318
  console.error(pc.red(`Refusing to start: another instance of this agent is already running ` +