starbridge 0.1.4-rc.2 → 0.1.4-rc.3
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/README.md +10 -8
- package/dist/starbridge.js +16 -9
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -72,7 +72,7 @@ question; steps 1 and 3 say when it asks more. A rerun repairs only what is miss
|
|
|
72
72
|
4. It installs and starts the background service, `starbridge agent`, as a systemd user unit, a
|
|
73
73
|
launchd agent, or on Windows a Scheduled Task that starts at logon without administrator
|
|
74
74
|
rights and logs to `%LOCALAPPDATA%\starbridge\agent.log`.
|
|
75
|
-
5. It uploads a first quota snapshot, then offers to send a test question to your
|
|
75
|
+
5. It uploads a first quota snapshot, then offers to send a test question to your devices and
|
|
76
76
|
prints your answer.
|
|
77
77
|
|
|
78
78
|
[Permission prompts](#permission-prompts) stay in the terminal unless you turn them on with
|
|
@@ -110,7 +110,9 @@ and asks your devices to revoke the machine. It deletes the keys only when you s
|
|
|
110
110
|
### Check a download
|
|
111
111
|
|
|
112
112
|
The scripts and `starbridge update` install a binary only if its hash is in the release's
|
|
113
|
-
`SHA256SUMS` and the release key signed `SHA256SUMS.minisig`. `install.
|
|
113
|
+
`SHA256SUMS` and the release key signed `SHA256SUMS.minisig`. `install.sh` checks the signature
|
|
114
|
+
with minisign, else OpenSSL 3, else Python 3, which every RHEL 8 has for dnf; with none of them it
|
|
115
|
+
stops and gives the command that installs minisign. `install.ps1` checks the signature
|
|
114
116
|
with minisign's own Windows build, pinned by its hash, since Windows has no Ed25519 check. The key is also in
|
|
115
117
|
[`minisign.pub`](minisign.pub):
|
|
116
118
|
|
|
@@ -170,10 +172,10 @@ starbridge ask --question "Merge #12 now?" \
|
|
|
170
172
|
- Anywhere else, the agent waits for it with `starbridge wait <id> --timeout 5m`, which exits
|
|
171
173
|
with code 2 when the time runs out.
|
|
172
174
|
|
|
173
|
-
To check the path to your
|
|
175
|
+
To check the path to your devices yourself, ask and wait in one command:
|
|
174
176
|
|
|
175
177
|
```bash
|
|
176
|
-
starbridge ask --question "Does this reach
|
|
178
|
+
starbridge ask --question "Does this reach me?" --option Yes --option No --wait
|
|
177
179
|
```
|
|
178
180
|
|
|
179
181
|
When the agent runs out of other work, `starbridge waiting <id>` shows "Waiting for you" on
|
|
@@ -232,7 +234,7 @@ To upload without the service:
|
|
|
232
234
|
starbridge quota push --provider claude --provider codex
|
|
233
235
|
```
|
|
234
236
|
|
|
235
|
-
### Quiet
|
|
237
|
+
### Quiet your other devices while you're here
|
|
236
238
|
|
|
237
239
|
On a desktop or laptop you work at, turn on presence:
|
|
238
240
|
|
|
@@ -242,9 +244,9 @@ starbridge config presence on
|
|
|
242
244
|
|
|
243
245
|
While this machine's screen is unlocked and had keyboard or mouse input in the last minute,
|
|
244
246
|
notifications on your other devices wait for the time set in Starbridge's Settings (30 s by
|
|
245
|
-
default) and come only if the question is still open, so one you answer here doesn't buzz
|
|
246
|
-
|
|
247
|
-
|
|
247
|
+
default) and come only if the question is still open, so one you answer here doesn't buzz them.
|
|
248
|
+
The question itself shows everywhere at once. The machine reads its lock and idle time itself
|
|
249
|
+
and tells the server only yes or no. It works on macOS, Windows, and Linux under GNOME
|
|
248
250
|
or X11 with `xprintidle`; a machine with no screen sends nothing.
|
|
249
251
|
|
|
250
252
|
### Permission prompts
|
package/dist/starbridge.js
CHANGED
|
@@ -14655,7 +14655,7 @@ function processAlive(pid) {
|
|
|
14655
14655
|
// package.json
|
|
14656
14656
|
var package_default = {
|
|
14657
14657
|
name: "starbridge",
|
|
14658
|
-
version: "0.1.4-rc.
|
|
14658
|
+
version: "0.1.4-rc.3",
|
|
14659
14659
|
description: "Post decisions to your Starbridge devices and upload quota windows from CodexBar",
|
|
14660
14660
|
license: "MIT",
|
|
14661
14661
|
repository: {
|
|
@@ -16129,7 +16129,7 @@ function needsHello(ctx, id) {
|
|
|
16129
16129
|
markConversation(ctx, id);
|
|
16130
16130
|
return false;
|
|
16131
16131
|
}
|
|
16132
|
-
var NUDGE = "Starbridge sends this session's permission prompts and questions to the owner's
|
|
16132
|
+
var NUDGE = "Starbridge sends this session's permission prompts and questions to the owner's devices once it has run a starbridge command. Before anything else, run `starbridge hello` once.";
|
|
16133
16133
|
function hookPreInvocation(ctx, text, opts) {
|
|
16134
16134
|
if (opts.agent !== "antigravity")
|
|
16135
16135
|
throw new UsageError(`--agent: antigravity (got ${opts.agent ?? "nothing"})`);
|
|
@@ -16544,6 +16544,12 @@ function sourceFor(input, ctx, machine) {
|
|
|
16544
16544
|
...r.sessionLinks.length > 0 ? { links: r.sessionLinks } : {}
|
|
16545
16545
|
};
|
|
16546
16546
|
}
|
|
16547
|
+
function typedBreaks(context) {
|
|
16548
|
+
if (/[\r\n]/.test(context))
|
|
16549
|
+
return context;
|
|
16550
|
+
return context.split(/(`[^`]+`)/).map((part, i) => i % 2 === 1 ? part : part.replace(/(?<!\\)\\n/g, `
|
|
16551
|
+
`)).join("");
|
|
16552
|
+
}
|
|
16547
16553
|
function buildDecision(input, ctx, machine, to) {
|
|
16548
16554
|
if (!input.question)
|
|
16549
16555
|
throw new UsageError("ask needs --question");
|
|
@@ -17738,7 +17744,8 @@ starbridge ask \\
|
|
|
17738
17744
|
\`\`\`
|
|
17739
17745
|
|
|
17740
17746
|
Quote text in single quotes, since double quotes expand \`$\` and backticks,
|
|
17741
|
-
and write apostrophes as ’.
|
|
17747
|
+
and write apostrophes as ’. Break lines inside the quotes with real line
|
|
17748
|
+
breaks, as above, never \`\\n\`: bash and zsh pass it on as typed. Other flags: \`--image\` (up to 4 PNG or JPEG),
|
|
17742
17749
|
\`--link\` (up to 4 HTTPS URLs), \`--waiting\` (only the answer unblocks you), \`--answer-in\`. \`ask\` prints the decision id (\`d_Xk3…\`) and how the
|
|
17743
17750
|
answer comes back.
|
|
17744
17751
|
|
|
@@ -19065,7 +19072,7 @@ import { configDir } from "./poller.ts";
|
|
|
19065
19072
|
|
|
19066
19073
|
/** The agent API revision this mod speaks, sent in the \`starbridge-api\` header. */
|
|
19067
19074
|
export const API = 1;
|
|
19068
|
-
export const VERSION = "0.1.4-rc.
|
|
19075
|
+
export const VERSION = "0.1.4-rc.3";
|
|
19069
19076
|
const CLIENT = \`starbridge-mod/\${VERSION}\`;
|
|
19070
19077
|
|
|
19071
19078
|
/** Event types this mod submits; others are skipped and left unconfirmed, as the API asks. */
|
|
@@ -25507,7 +25514,7 @@ async function setup(sys, opts) {
|
|
|
25507
25514
|
section(ctx, "Test");
|
|
25508
25515
|
if (upload)
|
|
25509
25516
|
await firstUpload(ctx, upload);
|
|
25510
|
-
if (machine && !opts.yes && await prompt.confirm(" Send a test decision to your
|
|
25517
|
+
if (machine && !opts.yes && await prompt.confirm(" Send a test decision to your devices?", true))
|
|
25511
25518
|
await testDecision(ctx, machine.name);
|
|
25512
25519
|
section(ctx, failed.length === 0 ? "Starbridge is set up." : `Setup is done, but ${failed.length === 1 ? "one step" : `${failed.length} steps`} failed.`);
|
|
25513
25520
|
for (const line of await otherCopies(sys))
|
|
@@ -25517,7 +25524,7 @@ async function setup(sys, opts) {
|
|
|
25517
25524
|
for (const line of commandTable([
|
|
25518
25525
|
["Check it", "starbridge status"],
|
|
25519
25526
|
...permissionsEnabled(ctx) ? [] : [["Send permission prompts", "starbridge config permissions on"]],
|
|
25520
|
-
...ctx.store.agentConfig().presence?.enabled || !["desktop", "laptop"].includes(ctx.store.agentConfig().machineKind ?? "") ? [] : [["Quiet
|
|
25527
|
+
...ctx.store.agentConfig().presence?.enabled || !["desktop", "laptop"].includes(ctx.store.agentConfig().machineKind ?? "") ? [] : [["Quiet other devices while here", "starbridge config presence on"]],
|
|
25521
25528
|
["Remove from one agent", `starbridge uninstall --agent ${one}`],
|
|
25522
25529
|
["Remove everything", "starbridge uninstall"]
|
|
25523
25530
|
]))
|
|
@@ -25809,7 +25816,7 @@ async function testDecision(ctx, name) {
|
|
|
25809
25816
|
session: ""
|
|
25810
25817
|
};
|
|
25811
25818
|
const opts = { wait: true, timeout: "10m" };
|
|
25812
|
-
ctx.out(" Sent. Answer it on
|
|
25819
|
+
ctx.out(" Sent. Answer it on any of your devices (Ctrl-C skips)…");
|
|
25813
25820
|
let id;
|
|
25814
25821
|
const asking = {
|
|
25815
25822
|
...ctx,
|
|
@@ -26342,7 +26349,7 @@ var HELP = `starbridge: post decisions to your devices, report runs, upload quot
|
|
|
26342
26349
|
starbridge plugin's permission hook exits at once. presence: while this machine's
|
|
26343
26350
|
screen is unlocked and had keyboard or mouse input in the last minute, notifications
|
|
26344
26351
|
on your other devices wait a few seconds, so a question you answer here doesn't buzz
|
|
26345
|
-
|
|
26352
|
+
them; the server hears only yes or no. Off by default. machine-kind: the icon
|
|
26346
26353
|
devices show, detected by setup.
|
|
26347
26354
|
|
|
26348
26355
|
starbridge hook permission --agent claude-code|pi|opencode|antigravity [--wait 570s]
|
|
@@ -26494,7 +26501,7 @@ async function run2(argv, ctx) {
|
|
|
26494
26501
|
const input = {
|
|
26495
26502
|
...fromJson,
|
|
26496
26503
|
...v.question !== undefined ? { question: v.question } : {},
|
|
26497
|
-
...v.context !== undefined ? { context: v.context } : {},
|
|
26504
|
+
...v.context !== undefined ? { context: typedBreaks(v.context) } : {},
|
|
26498
26505
|
...v["context-file"] !== undefined ? { context: readText5(v["context-file"]) } : {},
|
|
26499
26506
|
...v.option !== undefined ? { options: v.option } : {},
|
|
26500
26507
|
...v.recommended !== undefined ? { recommended: v.recommended } : {},
|