flowviant 0.107.0 → 0.108.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.
@@ -25,7 +25,7 @@ export const COMMANDS = [
25
25
  name: 'start',
26
26
  usesCheckout: true,
27
27
  usage: 'flowviant [start] [--project <name|id>]',
28
- summary: "Serve this repo's project: run agents and Workbench tabs here. Plain `flowviant` does the same.",
28
+ summary: "Serve this repo's project: run agents and Terminal tabs here. Plain `flowviant` does the same.",
29
29
  details: [
30
30
  'Run it inside the repository you connected. The first run in a new repo asks you to approve this computer.',
31
31
  '--project <name|id> serve that stored project instead of the one this repo is bound to',
package/bin/lib/fleet.mjs CHANGED
@@ -628,7 +628,7 @@ export async function runFleetDaemon({ afterLock = null } = {}) {
628
628
  // polling, and saying "machine online" over a daemon the server hands
629
629
  // nothing would contradict the standby line printed a moment earlier.
630
630
  if (holderState !== 'standby')
631
- info('Machine online. Open a tab in Flowviant → Workbench to start working.');
631
+ info('Machine online. Open a tab in Flowviant → Terminal to start working.');
632
632
  }
633
633
  // Heartbeat so a quiet daemon visibly stays alive. Gated on REAL work —
634
634
  // it was once gated on `roster.agents`, which the server sends permanently
@@ -83,6 +83,6 @@ export async function runMcpCommand(args = []) {
83
83
  console.log('');
84
84
  console.log('Then, in any Claude session: "file a task in Flowviant for …".');
85
85
  console.log('Tasks land as drafts on the board — nothing runs until you open');
86
- console.log('a session tab in the Workbench and type in it.');
86
+ console.log('a session tab in the Terminal and type in it.');
87
87
  console.log('');
88
88
  }
@@ -61,7 +61,13 @@ export function mergeOutward({
61
61
  if (current === base) {
62
62
  const dirty = String(git(['status', '--porcelain', '--untracked-files=no'], repoRoot)).trim();
63
63
  if (dirty) {
64
- throw new Error(`this repository has no remote, so the merge lands on ${base} in ${repoRoot} itself, and that checkout has uncommitted changes. Commit or stash them, then approve again.`);
64
+ // THE PERSON'S FIX (0.108.0): nothing on the branch is wrong, so the
65
+ // agent merge path reports `fix: 'person'` and the server queues no
66
+ // resolve turn — the agent cannot commit somebody's checkout.
67
+ throw Object.assign(
68
+ new Error(`this repository has no remote, so the merge lands on ${base} in ${repoRoot} itself, and that checkout has uncommitted changes. Commit or stash them, then approve again.`),
69
+ { fix: 'person' }
70
+ );
65
71
  }
66
72
  git(['merge', '--ff-only', merged], repoRoot);
67
73
  } else {
@@ -214,6 +214,7 @@ export function createWorkAgentMerges({
214
214
  await report({
215
215
  agentId,
216
216
  ok: false,
217
+ fix: 'person',
217
218
  detail: ghDown.missing
218
219
  ? 'this project merges through pull requests, and the GitHub CLI (gh) is not installed on this machine'
219
220
  : `this project merges through pull requests, and gh is not signed in here: ${ghDown.error}`,
@@ -225,6 +226,7 @@ export function createWorkAgentMerges({
225
226
  await report({
226
227
  agentId,
227
228
  ok: false,
229
+ fix: 'person',
228
230
  detail: `this agent is on the base branch (${prBase}) — there is nothing to open a pull request from`,
229
231
  });
230
232
  return;
@@ -271,7 +273,9 @@ export function createWorkAgentMerges({
271
273
  // token in its userinfo — so this one line is the only place on the
272
274
  // agent merge path that can leak a credential into a stored,
273
275
  // team-visible `mergeError`.
274
- await report({ agentId, ok: false, detail: envScrub(ghFirstLine(e)) });
276
+ // A refused push is the remote or its login (no `origin`, a
277
+ // credential, a protected ref) — the person's to fix, not the branch.
278
+ await report({ agentId, ok: false, fix: 'person', detail: envScrub(ghFirstLine(e)) });
275
279
  return;
276
280
  }
277
281
  const pr = ensureOpenPr(head, prBase, { cwd: repoRoot });
@@ -279,6 +283,7 @@ export function createWorkAgentMerges({
279
283
  await report({
280
284
  agentId,
281
285
  ok: false,
286
+ fix: 'person',
282
287
  detail: `the open pull request for ${head} targets ${pr.wrongBase}, not ${prBase} — retarget or close it, then approve again`,
283
288
  });
284
289
  return;
@@ -344,6 +349,11 @@ export function createWorkAgentMerges({
344
349
  await report({
345
350
  agentId,
346
351
  ok: false,
352
+ // WHOSE FIX IT IS (0.108.0), when the merge said: a refusal about
353
+ // the person's side (`shipMerge.mjs`'s dirty checkout) queues no
354
+ // resolve turn on the server. A conflict says nothing, and the
355
+ // agent resolves it in its worktree as before.
356
+ ...(e?.fix === 'person' ? { fix: 'person' } : {}),
347
357
  detail: envScrub(String(e?.message || e)).slice(0, 2000),
348
358
  });
349
359
  return;
@@ -329,7 +329,7 @@ export function createWorkSessionTurns({
329
329
  // mcpFor throw this used to crash into every turn.
330
330
  await settleWorkTurn(job.id, {
331
331
  ok: false,
332
- answer: `this session runs on ${rt.unsupported}, which cannot drive a Workbench tab on this machine — open a new tab`,
332
+ answer: `this session runs on ${rt.unsupported}, which cannot drive a Terminal tab on this machine — open a new tab`,
333
333
  });
334
334
  return;
335
335
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "flowviant",
3
- "version": "0.107.0",
3
+ "version": "0.108.1",
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": {