symbiot 0.62.0 → 0.62.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.
- package/CHANGELOG.md +4 -0
- package/home.mjs +14 -2
- package/package.json +1 -1
- package/server.mjs +2 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,10 @@
|
|
|
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.62.1
|
|
6
|
+
|
|
7
|
+
- **A phone that had Symbiot before goes to "Your computer" first.** Installing the new app over an older one kept the old app's setup, already started at "Meet Symbiot", so the phone went on to "Your AI" and asked to install Claude Code, and never offered to pair with your computer. An unfinished setup on a phone that isn't paired now opens on **Your computer** (scan the QR your computer shows, or type its address and code), once; "No computer" carries on as before. Checked on the Android emulator: 0.59.0, then 0.62.0 over it (the problem), then this over that (fixed).
|
|
8
|
+
|
|
5
9
|
## 0.62.0 — 2026-10-09
|
|
6
10
|
|
|
7
11
|
- **Your phone shows your computer's work, and you can act on it there.** Pair Symbiot's Android app (or Symbiot in Termux) with your computer and the phone gets a droplet on Home, **On <your computer>**: your tasks, what needs you, your agents' questions, the work waiting for your Approve, and what Watch found (as notifications too). Tick and add tasks, answer an agent and approve from it. "Watch on your phone" is now **Your phone**, in Settings and in Setup.
|
package/home.mjs
CHANGED
|
@@ -758,7 +758,19 @@ const ONB_STEPS_PHONE = ["computer", "welcome", "ai", "work", "agent", "apps", "
|
|
|
758
758
|
const onbSteps = (app = ANDROID_APP, phone = PHONE) => (app ? ONB_STEPS_PHONE : phone ? ONB_STEPS.filter((s) => s !== "phone") : ONB_STEPS); // (Symbiot in Termux is on the phone already)
|
|
759
759
|
// A new install (`symbiot app` the first time): setup, from its first step, "Your computer"
|
|
760
760
|
// in the Android app (it started at "welcome" there, so a phone paired by its QR showed nothing).
|
|
761
|
-
function startOnboarding() { const cf = loadConfig(); if (!cf.onboarding) { cf.onboarding = { pending: true, step: onbSteps()[0], skipped: [] }; saveConfig(cf); } return cf.onboarding; }
|
|
761
|
+
function startOnboarding() { const cf = loadConfig(); if (!cf.onboarding) { cf.onboarding = { pending: true, step: onbSteps()[0], skipped: [], ...(onbSteps()[0] === "computer" ? { computer: true } : {}) }; saveConfig(cf); } return cf.onboarding; }
|
|
762
|
+
// The phone app over an older one (a phone that had Symbiot before "Your computer"
|
|
763
|
+
// existed): its unfinished setup carried on at "Meet Symbiot", then "Your AI" asked to
|
|
764
|
+
// install Claude Code on the phone. An unfinished setup on a phone that isn't paired
|
|
765
|
+
// goes to "Your computer" first, once (computer: true): "No computer" carries on as before.
|
|
766
|
+
function phoneSetupFirst({ app = ANDROID_APP, paired = () => !!computerView().paired } = {}) {
|
|
767
|
+
if (!app) return null;
|
|
768
|
+
const cf = loadConfig(), o = cf.onboarding;
|
|
769
|
+
if (!o || !o.pending || o.computer) return o || null;
|
|
770
|
+
let isPaired = false; try { isPaired = paired(); } catch {}
|
|
771
|
+
if (!isPaired) o.step = "computer";
|
|
772
|
+
o.computer = true; saveConfig(cf); return o;
|
|
773
|
+
}
|
|
762
774
|
function onboarding({ fresh = false } = {}) {
|
|
763
775
|
const cfg = loadConfig(), o = cfg.onboarding || {}, steps = onbSteps();
|
|
764
776
|
const tryOr = (f, d) => { try { return f(); } catch { return d; } };
|
|
@@ -793,4 +805,4 @@ function setOnboarding({ step, skip, unskip, skipRest, done, restart } = {}) {
|
|
|
793
805
|
return onboarding();
|
|
794
806
|
}
|
|
795
807
|
|
|
796
|
-
export { reportIdeasAdd, reportAsk, reportDraftAnswer, workTick, waitWhy, AUTO_GRACE, STUCK_AFTER, marketingState, marketingGo, marketingDraftAnswer, marketingTask, moveToMarketing, goLane, homeState, homeContext, homeAsk, homeAnswer, homeNext, nextUp, laneNamed, NEXT_FILE, workScene, workGo, displayName, firstSteps, onboarding, setOnboarding, startOnboarding, ONB_STEPS, ONB_STEPS_PHONE, onbSteps, phoneBits };
|
|
808
|
+
export { reportIdeasAdd, reportAsk, reportDraftAnswer, workTick, waitWhy, AUTO_GRACE, STUCK_AFTER, marketingState, marketingGo, marketingDraftAnswer, marketingTask, moveToMarketing, goLane, homeState, homeContext, homeAsk, homeAnswer, homeNext, nextUp, laneNamed, NEXT_FILE, workScene, workGo, displayName, firstSteps, onboarding, setOnboarding, startOnboarding, ONB_STEPS, ONB_STEPS_PHONE, onbSteps, phoneBits , phoneSetupFirst };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "symbiot",
|
|
3
|
-
"version": "0.62.
|
|
3
|
+
"version": "0.62.1",
|
|
4
4
|
"description": "Your week, written from your real work. Reads your local git and writes it up with the AI of your choice \u2014 Claude, OpenAI, Gemini, or a local model.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
package/server.mjs
CHANGED
|
@@ -34,7 +34,7 @@ import { mindState, forget } from "./mind.mjs";
|
|
|
34
34
|
import { lanesTick, lanesState, partlyDone, orcaRelink } from "./lanes.mjs";
|
|
35
35
|
import { keepFacts, skipFacts, awaitTick, awaitingState, stopWaiting } from "./handback.mjs";
|
|
36
36
|
import { adaptState, noteUse } from "./adapt.mjs";
|
|
37
|
-
import { reportIdeasAdd, reportAsk, reportDraftAnswer, homeState, homeAsk, homeAnswer, homeNext, workScene, workGo, workTick, firstSteps, marketingState, marketingGo, marketingDraftAnswer, marketingTask, moveToMarketing, onboarding, setOnboarding, startOnboarding } from "./home.mjs";
|
|
37
|
+
import { reportIdeasAdd, reportAsk, reportDraftAnswer, homeState, homeAsk, homeAnswer, homeNext, workScene, workGo, workTick, firstSteps, marketingState, marketingGo, marketingDraftAnswer, marketingTask, moveToMarketing, onboarding, setOnboarding, startOnboarding, phoneSetupFirst } from "./home.mjs";
|
|
38
38
|
import { MARKETING_DIR, MARKETING, draftPreview, laneMedia, displayName, setDraftMedia } from "./marketing.mjs";
|
|
39
39
|
import { trays, trayMedia, setBlur, renderCapture } from "./tray.mjs";
|
|
40
40
|
import { listReports, readReport, reportImage, markAllRead } from "./reports.mjs";
|
|
@@ -242,6 +242,7 @@ async function startApp({ bin, since = 7, all = false, c = PLAIN_COLOURS } = {})
|
|
|
242
242
|
if (/[\\/]node_modules[\\/]symbiot[\\/]/.test(bin || "") && !SANDBOX && !process.env.SYMBIOT_NO_LAUNCHER) { try { installLauncher({ script: bin }); } catch {} }
|
|
243
243
|
// setup's first step: "Your computer" in the Android app, so a phone paired by its QR shows it
|
|
244
244
|
if (FRESH) { try { startOnboarding(); } catch {} }
|
|
245
|
+
try { phoneSetupFirst(); } catch {} // the phone app, over an older one: setup goes to "Your computer" first
|
|
245
246
|
// your projects: kept, and found again off the main thread, so nothing waits on a search
|
|
246
247
|
setScanOptions({ cache: true }); REPO_STATE.onChange = () => { try { homeState({ fresh: true }); } catch {} };
|
|
247
248
|
if (!SANDBOX) { refreshRevoked().catch(() => {}); setInterval(() => refreshRevoked().catch(() => {}), 6 * 3600 * 1000).unref(); } // cancelled Pro keys, about daily
|