symbiot 0.51.1 → 0.51.2

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/CHANGELOG.md CHANGED
@@ -2,6 +2,18 @@
2
2
 
3
3
  What each Symbiot release brought, newest first. When Approve bumps the version, it writes that release here from the tasks it approved, worded as release notes by your connected AI (or in the tasks' own words without one). The app shows the releases newer than yours under "What's new" when it offers an update, and once more after you update.
4
4
 
5
+ ## 0.51.2 — 2026-10-07
6
+
7
+ - Replaced the Quit button with an X in the top corner, and Home warns about your AI, agent or connectors only when one is missing.
8
+ - Added a Park button so a blocked project stops starting agent runs, even when forced, until you unpark it.
9
+ - Changed the review card to say when a run is only partly done, with Answer its questions first and Approve the changes so far second.
10
+ - Added answer bubbles on Home linked to each asking project, showing its familiar name, the question and two answer buttons or your own words.
11
+ - Added a Home alert asking to see your inbox when a run awaits an emailed reply that nothing would notice.
12
+ - Added first steps at the top of Settings that tick themselves off and say whether agent runs can use your linked site.
13
+ - Added checks that flag where your company folder's files disagree on dates, leave, holidays or customer details, listed under Settings.
14
+ - Changed Home into tidy, fixed groups, with projects sortable by needs you, recent or name, and repeated handovers shown once.
15
+ - Moved Go to a small bottom-corner button, and opening a highlighted project now shows what needs you at the top.
16
+
5
17
  ## 0.51.1
6
18
 
7
19
  - **Allowing an agent's list works when the list is fine.** An exact command such as `rm -r ~/dailify/site` no longer counts as dangerous; only Bash with no command, a shell, sudo, or a wildcard `rm`/`dd`/`chmod` does. Before, one such rule refused the whole list, silently, and the agent asked you again and again.
package/README.md CHANGED
@@ -49,7 +49,7 @@ symbiot app
49
49
  Starts a tiny local server (127.0.0.1 only, protected by a token) and opens the
50
50
  visual app in your browser — in a clean, chrome-less window if you have
51
51
  Chrome/Chromium/Edge/Brave (`--app` mode), otherwise a normal tab. No Electron,
52
- no install — it's the same CLI. Press Ctrl+C (or click Quit) to stop.
52
+ no install — it's the same CLI. Press Ctrl+C (or click the X in the top corner) to stop.
53
53
 
54
54
  It opens on [the liquid](#the-liquid-a-home-that-shapes-itself-to-you); each of these parts opens from it:
55
55
 
@@ -345,6 +345,21 @@ agent made a fix and didn't tick anything), it still shows up here, with
345
345
  a `symbiot/changes-<date>` branch, and leaves your tasks as they are. It also
346
346
  lists your own uncommitted work in those repos, so check the diff first.
347
347
 
348
+ When the run behind those changes stopped partway (questions for you still
349
+ open, or work it handed to another lane not back yet), the card says so in
350
+ plain words ("Partly done: 2 questions for you, and ops is on …"), with
351
+ **Answer its questions** first and **Approve the changes so far** as the
352
+ quieter choice.
353
+
354
+ ### Park a project
355
+
356
+ A project blocked on something only you can give (a token, a sign-in) would
357
+ otherwise start its agent again with every answer, handover or Go, only to say
358
+ the same thing. **Park this project** (at the top of its tasks) or **Park** (on
359
+ its run in the Agents tab) stops its tasks starting agent runs, even Start it
360
+ anyway, until you unpark it. A run already going finishes; Go skips a parked
361
+ project and says so.
362
+
348
363
  ### Run your agent automatically
349
364
 
350
365
  Set an **agent command** in Settings (*Hand off to your agent*), and every
@@ -525,18 +540,34 @@ name: **Ferrofluid** (glossy black liquid metal, lit like a studio; the default)
525
540
  lit like a product photo). Every panel follows the look, and the typeface (Geist)
526
541
  ships with Symbiot, so it looks the same offline.
527
542
 
528
- Its droplets are what only you can do (an Approve waiting, an agent's question to
529
- you), what's new on what you watch, and the parts of the app, grouped the
530
- **P.A.R.A.** way, each group in its own part of the screen with its name over it:
531
-
532
- - **Projects** (work with an end): Tasks, Agents, Todo and what's asking you. They
533
- move the most; Agents has spheres orbiting it while an agent works. Click the
534
- **Projects** name for your projects themselves: a sphere per repo with work on it,
535
- saying what's going on there, amber when its work waits for your OK; click one for
536
- just its tasks.
537
- - **Areas** (what you keep up with): the Dashboard, your feeds, Week and Standup.
543
+ At the top, in a band of its own, is **what only you can do**: an agent's question
544
+ to you, an Approve waiting, a first step. Each is a lit lane orb with a liquid line
545
+ to its blob: the project (by the name you use for it: the `CallForge AI` folder
546
+ shows as **Dailify**, from its README), the question in a line and its two answers
547
+ as buttons, or **answer in your own words**. Answering there is the same as on the
548
+ agent's block in Agents (it's saved to its ANSWERS.md and the agent carries on),
549
+ and the blob dissolves. More than fit across go on a second page. Clicking the orb
550
+ (or **open**) opens that project with what needs you lit up and in view: its
551
+ questions and its Approve under **Needs you here** at the top of its tasks, with its
552
+ handovers that are waiting; an ops run's question on its block in Agents.
553
+
554
+ Under the band, around the core, are the parts of the app, grouped the
555
+ **P.A.R.A.** way, each group a row with its name at its start, always in the same
556
+ place and order:
557
+
558
+ - **Projects** (work with an end): Tasks, Agents and Todo. Agents has spheres
559
+ orbiting it while an agent works. Click the **Projects** name for your projects
560
+ themselves: a sphere per lane with work on it, saying what's going on there,
561
+ amber when something there needs you, in order (**Needs you** first, **Recent**,
562
+ or **A–Z**), with the quieter ones under one **more** and every ops run in one
563
+ **Agent runs** sphere; click one for its tasks. **Go** (start what's waiting)
564
+ sits small in the bottom corner, never over them.
565
+ - **Areas** (what you keep up with): the Dashboard, Week and Standup.
566
+ - **Watching** (new on what you watch): your feeds with something new.
538
567
  - **Resources** (to look things up in): Map, Drift and Settings.
539
- - **Archive** (what's done): your archived tasks. It sits still, low on the right.
568
+ - **Archive** (what's done): your archived tasks, at the end of a row.
569
+
570
+ On a narrow screen the groups find their own places around the core instead.
540
571
 
541
572
  **Click a droplet** and its part opens over the liquid; click a group's name to open
542
573
  that group. **Right-click** (or your mouse's back button) goes back one step at a
@@ -794,6 +825,16 @@ Every chat in the app — the home bar, a Dashboard card, a task — then gets t
794
825
  passages that best answer what you asked, each with the file it came from, and
795
826
  quotes and cites that file when it uses one.
796
827
 
828
+ **Where your files disagree.** Symbiot also checks the folder: each person's dated
829
+ commitments (deadlines, bookings, log entries) against the leave register, public
830
+ holidays and office days, two files giving the same leave or the same record
831
+ different dates, and each customer's renewal date, price, users, plan, health and
832
+ owner where two files say different things. No AI is asked: it reads dates,
833
+ CSV and Markdown tables, front matter and "Owner:" lines, and examples are never
834
+ used as facts. The list, most pressing first and each with its files, is under
835
+ **Settings → Knowledge folders**; it's checked again whenever a file changes, and
836
+ **Check again** does it now. It's kept in `~/.config/symbiot/checks.json`, yours only.
837
+
797
838
  - **Examples aren't facts.** Say which paths in a folder hold worked examples
798
839
  (`--examples templates/,active/`, or the second box in Settings; `templates/`
799
840
  unless you say otherwise, meaning any folder of that name). A file whose front
package/agents.mjs CHANGED
@@ -155,6 +155,7 @@ const fillHandoff = (tmpl, repoPath) => tmpl.replace(/\{dir\}/g, shSingle(repoPa
155
155
  // (blockedAgain). force starts one anyway (something changed elsewhere).
156
156
  function runHandoff(repoPath, { force = false } = {}) {
157
157
  let tmpl = handoffCmd(); if (!tmpl || !repoPath) return null;
158
+ if (isParked(repoPath)) return { blocked: true, parked: true, questions: 0, note: PARKED_NOTE }; // even forced: that's what parking is for
158
159
  let opts = {}; try { opts = JSON.parse(readSymbiot(repoPath, "handoff.json")) || {}; } catch {}
159
160
  const busy = runningHandoff(repoPath); if (busy) return { busy: true, id: busy.id || "", pid: busy.pid, auto: !!busy.auto };
160
161
  releaseHeldTasks(repoPath); // held for an agent another process started, which has since exited
@@ -175,6 +176,30 @@ function runHandoff(repoPath, { force = false } = {}) {
175
176
  noteRun(e);
176
177
  return e;
177
178
  }
179
+ // ---- a parked lane: its tasks start no runs ----------------------------------
180
+ // A lane blocked on something only the user can give (a token from Meta) ran 27
181
+ // times: every answer, handover, Go and Start it anyway started it again, to say
182
+ // the same thing. Parked (config.parked: folder paths), nothing starts an agent
183
+ // there until it's unparked; a run already going finishes.
184
+ const PARKED_NOTE = "Parked: its tasks start no agent runs until you unpark it.";
185
+ function parkedPaths() { const p = loadConfig().parked; return Array.isArray(p) ? p.filter((x) => typeof x === "string" && x) : []; }
186
+ const isParked = (path) => !!path && parkedPaths().includes(path);
187
+ function parkLane(path, on) {
188
+ path = String(path || ""); if (!path) return { error: "No project to park." };
189
+ const cfg = loadConfig(), list = parkedPaths().filter((p) => p !== path);
190
+ if (on) list.push(path);
191
+ if (list.length) cfg.parked = list; else delete cfg.parked;
192
+ saveConfig(cfg);
193
+ return { ok: true, parked: !!on };
194
+ }
195
+ // The agent the handoff command runs, when it isn't on this computer (the CLI
196
+ // was uninstalled, or PATH lost it): its name, else "". Then no task can start.
197
+ function agentMissing(tmpl = handoffCmd()) {
198
+ const words = String(tmpl || "").trim().split(/\s+/), bin = words.find((w) => !/^\w+=/.test(w)) || "";
199
+ if (!bin || /[{}"'$`]/.test(bin)) return "";
200
+ if (bin.includes("/")) return existsSync(bin.replace(/^~(?=\/)/, homedir())) ? "" : bin;
201
+ return /^[\w.+-]+$/.test(bin) && !hasCmd(bin) ? bin : "";
202
+ }
178
203
  // ---- runs from before the app started ---------------------------------------
179
204
  // HANDOFFS lives in memory, so after a restart a run that stopped on questions
180
205
  // was gone from the Agents tab, its questions with it: there was no answering
@@ -746,4 +771,4 @@ function agentsList() {
746
771
  }).concat(earlierRuns());
747
772
  }
748
773
 
749
- export { FACTS, factsOf, knownRun, withStream, workOf, HANDOFFS, HANDOFF_PROMPT, QUESTIONS_MAX, OPTIONS_SHOWN, IDEAS_SHOWN, shSingle, CLAUDE_CMD, ORCA_CLAUDE_CMD, handoffCmd, setHandoffCmd, grantAgent, grantRule, allowTool, claudeConnectors, withConnectors, linkedConnectors, connectorsLine, connectorsInfo, fillHandoff, runHandoff, blockedAgain, runningHandoff, loadRuns, earlierRuns, namedFiles, waitingFor, startWaiting, writeTasks, droppedTasks, releaseHeldTasks, startHeldTasks, detectHandoffs, orcaHandoffCmd, migrateOrcaCmd, migrateClaudeCmd, track, agentChanges, parseQuestions, suggestionTarget, skipIdea, agentQuestions, answerQuestions, agentsList };
774
+ export { FACTS, factsOf, knownRun, withStream, workOf, HANDOFFS, HANDOFF_PROMPT, QUESTIONS_MAX, OPTIONS_SHOWN, IDEAS_SHOWN, shSingle, CLAUDE_CMD, ORCA_CLAUDE_CMD, handoffCmd, setHandoffCmd, grantAgent, grantRule, allowTool, claudeConnectors, withConnectors, linkedConnectors, connectorsLine, connectorsInfo, fillHandoff, runHandoff, PARKED_NOTE, parkedPaths, isParked, parkLane, agentMissing, blockedAgain, runningHandoff, loadRuns, earlierRuns, namedFiles, waitingFor, startWaiting, writeTasks, droppedTasks, releaseHeldTasks, startHeldTasks, detectHandoffs, orcaHandoffCmd, migrateOrcaCmd, migrateClaudeCmd, track, agentChanges, parseQuestions, suggestionTarget, skipIdea, agentQuestions, answerQuestions, agentsList };