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 +12 -0
- package/README.md +53 -12
- package/agents.mjs +26 -1
- package/checks.mjs +651 -0
- package/home.mjs +120 -30
- package/knowledge.mjs +1 -1
- package/lanes.mjs +40 -6
- package/package.json +4 -3
- package/post.mjs +13 -8
- package/server.mjs +19 -7
- package/tasks.mjs +11 -1
- package/ui.mjs +405 -88
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
|
|
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
|
-
|
|
529
|
-
you
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
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
|
|
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 };
|