starbridge 0.1.4-rc.2 → 0.1.4

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 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 phone and
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.ps1` checks the signature
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 phone yourself, ask and wait in one command:
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 my phone?" --option Yes --option No --wait
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 the phone while you're here
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 your
246
- phone. The question itself shows everywhere at once. The machine reads its lock and idle time
247
- itself and tells the server only yes or no. It works on macOS, Windows, and Linux under GNOME
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
@@ -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.2",
14658
+ version: "0.1.4",
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 phone once it has run a starbridge command. Before anything else, run `starbridge hello` once.";
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 ’. Other flags: \`--image\` (up to 4 PNG or JPEG),
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.2";
19075
+ export const VERSION = "0.1.4";
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 phone?", true))
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 the phone while here", "starbridge config presence on"]],
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 your phone or the web page (Ctrl-C skips)…");
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
- your phone; the server hears only yes or no. Off by default. machine-kind: the icon
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 } : {},
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "starbridge",
3
- "version": "0.1.4-rc.2",
3
+ "version": "0.1.4",
4
4
  "description": "Post decisions to your Starbridge devices and upload quota windows from CodexBar",
5
5
  "license": "MIT",
6
6
  "repository": {