gipity 1.1.1 → 1.1.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.
@@ -75,7 +75,7 @@ export async function runRelaySetup(opts) {
75
75
  console.log(` ${dim('To register this computer again — for example under a different name —')}`);
76
76
  console.log(` ${dim('unregister it first, then re-run setup:')}`);
77
77
  console.log(` ${brand('gipity relay revoke')} ${dim('# unpairs this computer and removes the login service')}`);
78
- console.log(` ${brand('gipity setup')} ${dim('# register it again (asks for a new name)')}`);
78
+ console.log(` ${brand('gipity connect')} ${dim('# register it again (asks for a new name)')}`);
79
79
  console.log('');
80
80
  }
81
81
  return true;
@@ -84,14 +84,14 @@ export async function runRelaySetup(opts) {
84
84
  // `gipity claude` first-run frames it as an optional add-on it's offering.
85
85
  if (opts.mode === 'run-now') {
86
86
  console.log(` ${bold('Set up this computer as a relay')}`);
87
- console.log(` ${dim('A relay runs Claude Code (or Codex) here so you can drive it from the web (')}${brand('gipity.ai')}${dim(') on any browser.')}`);
88
- console.log(` ${dim('It uses your Claude or Codex subscription — the cheapest way to pay for tokens.')}`);
87
+ console.log(` ${dim('A relay runs your coding agent (Claude Code, Codex, or Grok) here so you can drive it from the web (')}${brand('gipity.ai')}${dim(') on any browser.')}`);
88
+ console.log(` ${dim('It uses your Claude, Codex, or Grok subscription — the cheapest way to pay for tokens.')}`);
89
89
  }
90
90
  else {
91
- console.log(` ${bold('Remote control of Claude Code')}`);
92
- console.log(` ${dim('Drive this Claude Code from the web (')}${brand('gipity.ai')}${dim(') on any browser (desktop or phone).')}`);
91
+ console.log(` ${bold('Remote control of your coding agent')}`);
92
+ console.log(` ${dim('Drive your coding agent on this computer from the web (')}${brand('gipity.ai')}${dim(') on any browser (desktop or phone).')}`);
93
93
  console.log('');
94
- console.log(` ${dim('Enable now (takes 2 seconds) or turn on later with')} ${brand('gipity setup')}`);
94
+ console.log(` ${dim('Enable now (takes 2 seconds) or turn on later with')} ${brand('gipity connect')}`);
95
95
  }
96
96
  console.log('');
97
97
  const promptText = opts.mode === 'run-now'
@@ -121,7 +121,7 @@ export async function runRelaySetup(opts) {
121
121
  }
122
122
  catch (err) {
123
123
  console.error(`\n ${clrError(`Could not create device: ${err?.message || err}`)}`);
124
- console.error(` ${dim('Skipping for now - we\'ll offer again next time. Or turn it on with `gipity setup`.')}`);
124
+ console.error(` ${dim('Skipping for now - we\'ll offer again next time. Or turn it on with `gipity connect`.')}`);
125
125
  // Deliberately DON'T persist relay_enabled here: the user SAID YES, and
126
126
  // this is a transient failure (network blip, server down). Leaving the
127
127
  // tri-state unset means onboarding re-offers on the next `gipity claude`
@@ -60,8 +60,10 @@ export function resolveCliPath() {
60
60
  /**
61
61
  * Create + persist a relay device, marking the relay opted-in. Idempotent
62
62
  * unless `force`: if this machine is already paired and `!force`, the
63
- * existing device is returned untouched (no server call). With `force`, the
64
- * old device is revoked server-side (best-effort) before re-pairing.
63
+ * existing device is returned untouched (no server call). With `force`, we
64
+ * simply re-register: the server's machine_id dedup reattaches the same
65
+ * device row and rotates its token (no pre-revoke - revoking first forced a
66
+ * NEW row and orphaned the conversations bound to the old one, issue #291).
65
67
  *
66
68
  * Throws on a bad name or if the `/remote-devices` call fails (e.g. 401 when
67
69
  * the user isn't logged in) — callers translate that into their own UX.
@@ -78,12 +80,10 @@ export async function pairDevice(opts = {}) {
78
80
  };
79
81
  }
80
82
  if (existing && opts.force) {
81
- try {
82
- await post(`/remote-devices/${encodeURIComponent(existing.guid)}/revoke`, {});
83
- }
84
- catch {
85
- // Best-effort: a stale server-side device is harmless; proceed to re-pair.
86
- }
83
+ // Re-register in place: POST /remote-devices with this machine_id
84
+ // reattaches the existing row and rotates the token, which invalidates
85
+ // the old bearer anyway - a separate revoke round-trip only detached
86
+ // the row and orphaned its conversations.
87
87
  state.clearDevice();
88
88
  }
89
89
  const name = (opts.name?.trim() || friendlyDeviceName()).trim();
@@ -8,7 +8,7 @@
8
8
  * paused: boolean,
9
9
  * }
10
10
  *
11
- * The `token` field is the raw device bearer returned by /pair/claim - it
11
+ * The `token` field is the raw device bearer returned by POST /remote-devices - it
12
12
  * never leaves this file or the Authorization header. A future chunk will
13
13
  * move it to OS keychain (macOS Keychain, libsecret, wincred); the state
14
14
  * module's public surface is designed to absorb that change.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gipity",
3
- "version": "1.1.1",
3
+ "version": "1.1.3",
4
4
  "description": "The full-stack platform tuned for AI agents. Database, storage, auth, functions, deploy, and drop-in kits - all agent-tuned. Pair with Claude Code or use standalone.",
5
5
  "bin": {
6
6
  "gipity": "dist/updater/shim.js",