flowviant 0.60.0 → 0.61.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.
package/bin/lib/fleet.mjs CHANGED
@@ -824,6 +824,7 @@ export async function runFleetDaemon() {
824
824
  // retirement — lives in work.mjs; this hands it the loop's mutable state.
825
825
  const {
826
826
  flushWorkReports,
827
+ learnPlaces,
827
828
  processWorkTurns,
828
829
  processShipJobs,
829
830
  processDiffJobs,
@@ -1549,6 +1550,10 @@ export async function runFleetDaemon() {
1549
1550
  void flushWorkReports();
1550
1551
  processMergeJobs(roster.mergeJobs);
1551
1552
  processPatchRevertJobs(roster.patchRevertJobs);
1553
+ // WHERE each live tab works, BEFORE anything measures one: the sweep below
1554
+ // and every preview check ask `placeOf`, and a tab nobody has typed into
1555
+ // yet has taught it nothing.
1556
+ learnPlaces(roster.sessionPlaces);
1552
1557
  processWorkTurns(roster.workTurnJobs);
1553
1558
  // The roster's live-session list rides along: an ENDED session's ship
1554
1559
  // must not be refused by checks whose remedies need a live tab.
package/bin/lib/work.mjs CHANGED
@@ -355,6 +355,25 @@ export function createWorkManager({ repoRoot, baseDir, baseRef, getMcpUrl, getLe
355
355
  */
356
356
  const sessionPlaces = new Map();
357
357
  const placeOf = (sessionId) => sessionPlaces.get(sessionId) ?? sessionId;
358
+ /**
359
+ * Places straight off the roster, so a tab is measured the moment it EXISTS
360
+ * rather than after somebody types into it.
361
+ *
362
+ * Learning only from turn jobs meant a tab nobody had spoken to yet was
363
+ * measured at `sessions/<id>` — a directory that does not exist for a tab
364
+ * working in the checkout — so it reported no branch, no diffstat and no
365
+ * ports, and every control reading those had nothing to render.
366
+ *
367
+ * The roster is authoritative and turn jobs still agree with it; a session
368
+ * the server does not name keeps whatever a turn taught, and failing that its
369
+ * own id, which is the pre-places default.
370
+ */
371
+ const learnPlaces = (map) => {
372
+ if (!map || typeof map !== 'object') return;
373
+ for (const [sid, place] of Object.entries(map)) {
374
+ if (typeof place === 'string' && place) sessionPlaces.set(sid, place);
375
+ }
376
+ };
358
377
  /** The DIRECTORY a session works in. Every path that used to build
359
378
  * `sessions/<id>` by hand goes through here, or a tab in the checkout gets
360
379
  * measured against a directory that does not exist. */
@@ -2617,6 +2636,7 @@ export function createWorkManager({ repoRoot, baseDir, baseRef, getMcpUrl, getLe
2617
2636
 
2618
2637
  return {
2619
2638
  flushWorkReports,
2639
+ learnPlaces,
2620
2640
  processWorkTurns,
2621
2641
  processShipJobs,
2622
2642
  processDiffJobs,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "flowviant",
3
- "version": "0.60.0",
3
+ "version": "0.61.0",
4
4
  "description": "Run your own coding CLIs as build agents for Flowviant — Claude Code, Codex or Antigravity, on your own credentials. Holds your sessions, keeps a worktree per tab, and ships branches on your word.",
5
5
  "type": "module",
6
6
  "bin": {