@robono/server 0.21.0 → 0.22.0

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 CHANGED
@@ -1,5 +1,13 @@
1
1
  ## 0.20.1 — 2026-11-04
2
2
 
3
+ ## 0.22.0
4
+
5
+ - Automatic React + Vite setup with same-origin development and production Node servers, preserving the existing application and Vite configuration.
6
+ - Safe generated-file upgrades with original hashes, private backups, review proposals, deletion/edit protection, and verified 0.21.0 migration baselines.
7
+ - Node/Express-compatible messaging handler retaining authentication, permissions and origin checks.
8
+ - Private setup/source paths are blocked in development and production; accidental frontend imports of private generated server code fail the production build.
9
+
10
+
3
11
  ## 0.21.0
4
12
 
5
13
  - Generated CustomerMessenger accepts an existing Supabase/Firebase sign-in client directly, with a custom-account option.
package/README.md CHANGED
@@ -413,9 +413,9 @@ synchronize revocations and suspension to Robono promptly: a queued message
413
413
  cannot detect an unsynchronized change known only to your server.
414
414
 
415
415
 
416
- ## Install into an existing app (0.20+)
416
+ ## Install into an existing app (0.22+)
417
417
 
418
- Run from a Next.js App Router project with Node.js 22 or later:
418
+ Run from a Next.js App Router or React + Vite project with Node.js 22.12 or later:
419
419
 
420
420
  ```sh
421
421
  npx --package @robono/server robono-messenger-install --origin https://your-company.com --company "Your company"
@@ -445,3 +445,31 @@ The checklist distinguishes files, package installation, configured permission c
445
445
  Supabase uses the official client's `auth.getUser(token)` on the server. Firebase uses the official Admin client's `verifyIdToken(token, true)`, including revocation/disabled-account checks. Exported `supabaseMessengerAuthentication` and `firebaseMessengerAuthentication` accept your configured provider clients; no provider secrets belong in client code. Continue checking app-specific suspension and memberships in `authorize`.
446
446
 
447
447
  Notifications remain a separate credential step: website origin/chat path for browsers; APNs key, Team ID, Key ID and Bundle ID for iPhone; app `google-services.json` and a privately uploaded FCM service account for Android. Upload private notification credentials in Robono's setup screen. Chat can work before alerts are configured. You still need real background alert checks.
448
+
449
+
450
+ ### React + Vite
451
+
452
+ The installer preserves your Vite configuration, application entry points and existing package commands. Generated client files are under `src/robono/client` (or `robono/client` in a project without `src`). Private server files live under `.robono/server`, outside the frontend source. The supplied runner blocks private setup/server files in development; the production build rejects frontend imports of those files.
453
+
454
+ ```sh
455
+ npm --prefix .robono run dev
456
+ npm --prefix .robono run build
457
+ npm --prefix .robono start
458
+ ```
459
+
460
+ The development runner starts your existing Vite site and `/api/robono` together on loopback. Open its printed address; `/robono-preview` is the fictional two-person preview. Restart after editing server code. Existing Vite plugins and the configured build output directory are retained. Custom Vite roots need a manual connection. Supply `ROBONO_DEV_PORT` if the configured development port is occupied.
461
+
462
+ Production serves the built website and the same authenticated messaging route from one Node process. Deploy on a Node host with HTTPS; static-only hosting cannot execute private account checks. Configure `PORT`, optional `HOST`, `ROBONO_PUBLIC_ORIGIN`, `ROBONO_ALLOWED_ORIGINS`, `ROBONO_API_KEY` and provider credentials on that host. The runner reads private root `.env.local` / `.env` files locally; it never writes them. Never put private keys in `VITE_` variables. Existing Vite Supabase public URL/key variables are accepted for identity verification. Production never serves the preview or setup/source directories.
463
+
464
+ Other Node/Express applications can import `createMessengerNodeHandler` from `@robono/server/node`. Mount it before body parsers, passing a configured `getMessenger` and exact public origin; it returns whether it handled `/api/robono`. It preserves the existing authentication, permission, origin and notification-helper checks. JSON request bodies are capped at 256 KiB; attachment bytes use the existing signed-upload flow. The ready-made website server is also exported as `createMessengerWebsiteServer` and serves only a dedicated built frontend directory.
465
+
466
+ ### Safe upgrades
467
+
468
+ ```sh
469
+ npx --package @robono/server robono-messenger-install --upgrade --dry-run
470
+ npx --package @robono/server robono-messenger-install --upgrade
471
+ ```
472
+
473
+ The installer records the hashes of generated files. Upgrades replace verified unchanged files, back up replacements privately under `.robono/backups`, and preserve customer edits and deletions. A changed file needing review gets a proposed version under `.robono/updates`; `.robono/upgrade-report.json` lists exact paths and reasons, without file contents or secrets. Permission changes are never guessed or merged automatically. Apply reviewed changes yourself and run the upgrade again. Pending review uses exit code 2; command/install errors use exit code 1.
474
+
475
+ Installations from 0.21.0 are compared against bundled copies of that published generator. Older files that cannot be verified are preserved for review. An installation that did not save its company name needs `--company` with its existing name. Package commands are reconstructed, never executed from metadata. `--resume` finishes interrupted dependencies; it does not replace integration code. Keep `.robono/setup.json` with your project for future comparisons. The upgrade checks for edits made after planning before it writes files.
package/SBOM.spdx.json CHANGED
@@ -2,22 +2,22 @@
2
2
  "spdxVersion": "SPDX-2.3",
3
3
  "dataLicense": "CC0-1.0",
4
4
  "SPDXID": "SPDXRef-DOCUMENT",
5
- "name": "@robono/server@0.21.0",
6
- "documentNamespace": "http://spdx.org/spdxdocs/@robono%2fserver-0.21.0-***",
5
+ "name": "@robono/server@0.22.0",
6
+ "documentNamespace": "http://spdx.org/spdxdocs/@robono%2fserver-0.22.0-***",
7
7
  "creationInfo": {
8
- "created": "2026-11-04T06:35:24.267Z",
8
+ "created": "2026-11-04T07:21:06.992Z",
9
9
  "creators": [
10
10
  "Tool: npm/cli-11.6.2"
11
11
  ]
12
12
  },
13
13
  "documentDescribes": [
14
- "SPDXRef-Package-robono.server-0.21.0"
14
+ "SPDXRef-Package-robono.server-0.22.0"
15
15
  ],
16
16
  "packages": [
17
17
  {
18
18
  "name": "@robono/server",
19
- "SPDXID": "SPDXRef-Package-robono.server-0.21.0",
20
- "versionInfo": "0.21.0",
19
+ "SPDXID": "SPDXRef-Package-robono.server-0.22.0",
20
+ "versionInfo": "0.22.0",
21
21
  "packageFileName": "",
22
22
  "description": "Provider-neutral server SDK for the Robono Bridge API.",
23
23
  "primaryPackagePurpose": "LIBRARY",
@@ -29,7 +29,7 @@
29
29
  {
30
30
  "referenceCategory": "PACKAGE-MANAGER",
31
31
  "referenceType": "purl",
32
- "referenceLocator": "pkg:npm/%40robono/server@0.21.0"
32
+ "referenceLocator": "pkg:npm/%40robono/server@0.22.0"
33
33
  }
34
34
  ]
35
35
  },
@@ -175,12 +175,12 @@
175
175
  "relationships": [
176
176
  {
177
177
  "spdxElementId": "SPDXRef-DOCUMENT",
178
- "relatedSpdxElement": "SPDXRef-Package-robono.server-0.21.0",
178
+ "relatedSpdxElement": "SPDXRef-Package-robono.server-0.22.0",
179
179
  "relationshipType": "DESCRIBES"
180
180
  },
181
181
  {
182
182
  "spdxElementId": "SPDXRef-Package-cross-spawn-7.0.6",
183
- "relatedSpdxElement": "SPDXRef-Package-robono.server-0.21.0",
183
+ "relatedSpdxElement": "SPDXRef-Package-robono.server-0.22.0",
184
184
  "relationshipType": "DEPENDENCY_OF"
185
185
  },
186
186
  {
@@ -2,13 +2,14 @@
2
2
  import { createInterface } from 'node:readline/promises';
3
3
  import { stdin, stdout } from 'node:process';
4
4
  import { planMessengerInstallation, planMessengerInstallationResume, applyMessengerInstallation, messengerInstallationChecklist } from './messenger-install.js';
5
+ import { planMessengerUpgrade } from './messenger-upgrade.js';
5
6
  import { checkRobonoMessengerSetup } from './messenger-check.js';
6
7
  const args = process.argv.slice(2), values = {}, flags = new Set();
7
8
  let prompt;
8
9
  try {
9
10
  for (let i = 0; i < args.length; i++) {
10
11
  const arg = args[i];
11
- if (['--help', '--yes', '--dry-run', '--no-install', '--check', '--json', '--resume'].includes(arg)) {
12
+ if (['--help', '--yes', '--dry-run', '--no-install', '--check', '--json', '--resume', '--upgrade'].includes(arg)) {
12
13
  flags.add(arg);
13
14
  continue;
14
15
  }
@@ -18,15 +19,19 @@ try {
18
19
  }
19
20
  if (flags.has('--help')) {
20
21
  console.log(`robono-messenger-install [--project .] [--server-project ../server] [--auth supabase|firebase|custom] --origin https://your-company.com --company "Your company"
21
- Detects Next.js App Router or Expo 55–56, places files, and installs matching packages.
22
+ Detects Next.js App Router, React + Vite or Expo 55–56, places files, and installs matching packages.
22
23
  Expo also needs a separate Next.js server and a static app.json. Existing application screens and .env files are preserved.
23
24
  --dry-run lists the exact files and commands without changing anything.
24
25
  --yes applies that plan without an interactive prompt. --no-install writes files only.
25
26
  --resume finishes package installation using your saved setup, preserving all existing integration code.
27
+ --upgrade updates unchanged generated files, backs them up, and saves proposals for edited files. Use --dry-run first to review.
28
+ React + Vite includes a Node server: npm --prefix .robono run dev / build / start. No Next.js server is needed.
26
29
  --check shows one setup checklist; set the three ROBONO_* test variables to include live checks. --json prints a shareable checklist.
27
30
  The development-only /robono-preview route uses fictional people and never sends messages outside the page.`);
28
31
  }
29
32
  else if (flags.has('--check')) {
33
+ if (flags.has('--upgrade') || flags.has('--resume'))
34
+ throw Error('Choose --check, --upgrade or --resume separately.');
30
35
  let checks = await messengerInstallationChecklist(values['--project'] ?? '.');
31
36
  const endpoint = process.env.ROBONO_MESSENGER_URL, origin = process.env.ROBONO_WEBSITE_ORIGIN, accessToken = process.env.ROBONO_TEST_USER_TOKEN;
32
37
  if (endpoint && origin && accessToken) {
@@ -52,17 +57,22 @@ The development-only /robono-preview route uses fictional people and never sends
52
57
  const ask = async (key, label) => values[key] ?? (prompt ? (await prompt.question(label + ': ')).trim() : undefined);
53
58
  if (flags.has('--resume') && (flags.has('--no-install') || Object.keys(values).some(key => key !== '--project')))
54
59
  throw Error('Use --resume with your existing --project only. It preserves the saved setup.');
55
- const origin = flags.has('--resume') ? undefined : await ask('--origin', 'Website/server origin (for example https://your-company.com)'), companyName = flags.has('--resume') ? undefined : await ask('--company', 'Company name');
56
- if (!flags.has('--resume') && (!origin || !companyName))
60
+ const existing = flags.has('--resume') || flags.has('--upgrade');
61
+ if (flags.has('--resume') && flags.has('--upgrade'))
62
+ throw Error('Choose --resume or --upgrade.');
63
+ if (flags.has('--upgrade') && Object.keys(values).some(key => !['--project', '--company'].includes(key)))
64
+ throw Error('Upgrade uses the saved installation. Only --project and a missing legacy --company may be supplied.');
65
+ const origin = existing ? undefined : await ask('--origin', 'Website/server origin (for example https://your-company.com)'), companyName = existing ? undefined : await ask('--company', 'Company name');
66
+ if (!existing && (!origin || !companyName))
57
67
  throw Error('Supply --origin and --company, or run interactively.');
58
68
  const auth = values['--auth'];
59
69
  if (auth && !['custom', 'supabase', 'firebase'].includes(auth))
60
70
  throw Error('Choose custom, supabase or firebase.');
61
- const plan = flags.has('--resume') ? await planMessengerInstallationResume(values['--project'] ?? '.') : await planMessengerInstallation({ project: values['--project'] ?? '.', origin: origin, companyName: companyName, ...(values['--server-project'] ? { serverProject: values['--server-project'] } : {}), ...(auth ? { auth: auth } : {}) });
71
+ const plan = flags.has('--upgrade') ? await planMessengerUpgrade(values['--project'] ?? '.', values['--company'] ? { companyName: values['--company'] } : {}) : flags.has('--resume') ? await planMessengerInstallationResume(values['--project'] ?? '.') : await planMessengerInstallation({ project: values['--project'] ?? '.', origin: origin, companyName: companyName, ...(values['--server-project'] ? { serverProject: values['--server-project'] } : {}), ...(auth ? { auth: auth } : {}) });
62
72
  for (const file of plan.files)
63
73
  console.log('Create: ' + file.path);
64
74
  for (const file of plan.replacements)
65
- console.log('Merge missing Expo plugins: ' + file.path + ' (original saved in .robono)');
75
+ console.log('Update: ' + file.path);
66
76
  for (const command of plan.commands)
67
77
  console.log(`Install in ${command.cwd}: ${command.command} ${command.args.join(' ')}`);
68
78
  for (const note of plan.notes)
@@ -71,6 +81,13 @@ The development-only /robono-preview route uses fictional people and never sends
71
81
  if (!flags.has('--yes') && (!prompt || !/^y(es)?$/i.test((await prompt.question('Apply this plan? [y/N] ')).trim())))
72
82
  throw Error('Nothing changed. Use --yes to apply the displayed plan.');
73
83
  await applyMessengerInstallation(plan, !flags.has('--no-install'));
84
+ if ('upgradeReport' in plan) {
85
+ const report = plan.upgradeReport;
86
+ if (report.conflicts.length) {
87
+ console.log('Your edited files were preserved. Review .robono/upgrade-report.json before treating the upgrade as complete.');
88
+ process.exitCode = 2;
89
+ }
90
+ }
74
91
  console.log('Integration files are ready. Open .robono/SETUP.md. Add CustomerMessenger to your screen; its optional setupChecks button checks your current login without copied tokens. Run --check for the local checklist. Nothing was deployed.');
75
92
  }
76
93
  }
@@ -1 +1 @@
1
- {"version":3,"file":"messenger-install-cli.js","sourceRoot":"","sources":["../src/messenger-install-cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"messenger-install-cli.js","sourceRoot":"","sources":["../src/messenger-install-cli.ts"],"names":[],"mappings":"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"}
@@ -25,10 +25,20 @@ export interface MessengerInstallPlan {
25
25
  notes: string[];
26
26
  setupFile?: string;
27
27
  }
28
+ export declare const messengerInstallerVersion = "0.22.0";
29
+ export declare const generatedHash: (content: string) => string;
30
+ export declare function generatedKey(file: string, client: string, server: string): string;
31
+ export declare function exists(file: string): Promise<boolean>;
32
+ export declare function safePath(file: string): Promise<void>;
33
+ export declare function readMessengerSetup(file: string): Promise<{
34
+ text: string;
35
+ setup: any;
36
+ }>;
28
37
  export declare function planMessengerInstallation(options: MessengerInstallOptions): Promise<MessengerInstallPlan>;
38
+ export declare function buildMessengerInstallation(options: MessengerInstallOptions, mode: 'new' | 'resume' | 'upgrade'): Promise<MessengerInstallPlan>;
29
39
  /** Reconstruct trusted package commands; never execute commands from saved metadata. */
30
40
  export declare function planMessengerInstallationResume(directory: string): Promise<MessengerInstallPlan>;
31
- /** Preflight all files; exclusive writes and rollback avoid overwriting customer work. */
41
+ /** Preflight, exclusive installer lock, atomic replacements and recoverable rollback. */
32
42
  export declare function applyMessengerInstallation(plan: MessengerInstallPlan, install?: boolean): Promise<void>;
33
43
  export declare function messengerInstallationChecklist(directory: string): Promise<{
34
44
  name: string;
@@ -1 +1 @@
1
- {"version":3,"file":"messenger-install.d.ts","sourceRoot":"","sources":["../src/messenger-install.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,uBAAuB;IAAE,OAAO,EAAC,MAAM,CAAC;IAAA,aAAa,CAAC,EAAC,MAAM,CAAC;IAAA,MAAM,EAAC,MAAM,CAAC;IAAA,WAAW,EAAC,MAAM,CAAC;IAAA,IAAI,CAAC,EAAC,QAAQ,GAAC,UAAU,GAAC,UAAU,CAAA;CAAC;AAErJ,MAAM,WAAW,oBAAoB;IAAE,QAAQ,EAAC,KAAK,GAAC,MAAM,CAAC;IAAA,IAAI,EAAC,QAAQ,GAAC,UAAU,GAAC,UAAU,CAAC;IAAA,KAAK,EAAC;QAAC,IAAI,EAAC,MAAM,CAAC;QAAA,OAAO,EAAC,MAAM,CAAA;KAAC,EAAE,CAAC;IAAA,YAAY,EAAC;QAAC,IAAI,EAAC,MAAM,CAAC;QAAA,MAAM,EAAC,MAAM,CAAC;QAAA,KAAK,EAAC,MAAM,CAAA;KAAC,EAAE,CAAC;IAAA,QAAQ,EAAC;QAAC,GAAG,EAAC,MAAM,CAAC;QAAA,OAAO,EAAC,MAAM,CAAC;QAAA,IAAI,EAAC,MAAM,EAAE,CAAA;KAAC,EAAE,CAAC;IAAA,KAAK,EAAC,MAAM,EAAE,CAAC;IAAA,SAAS,CAAC,EAAC,MAAM,CAAA;CAAC;AA6BpR,wBAAsB,yBAAyB,CAAC,OAAO,EAAC,uBAAuB,GAAE,OAAO,CAAC,oBAAoB,CAAC,CAE7G;AAkED,wFAAwF;AACxF,wBAAsB,+BAA+B,CAAC,SAAS,EAAC,MAAM,GAAE,OAAO,CAAC,oBAAoB,CAAC,CAYpG;AACD,0FAA0F;AAC1F,wBAAsB,0BAA0B,CAAC,IAAI,EAAC,oBAAoB,EAAC,OAAO,UAAK,iBAatF;AACD,wBAAsB,8BAA8B,CAAC,SAAS,EAAC,MAAM;;;;KAmBpE"}
1
+ {"version":3,"file":"messenger-install.d.ts","sourceRoot":"","sources":["../src/messenger-install.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,uBAAuB;IAAE,OAAO,EAAC,MAAM,CAAC;IAAA,aAAa,CAAC,EAAC,MAAM,CAAC;IAAA,MAAM,EAAC,MAAM,CAAC;IAAA,WAAW,EAAC,MAAM,CAAC;IAAA,IAAI,CAAC,EAAC,QAAQ,GAAC,UAAU,GAAC,UAAU,CAAA;CAAC;AAErJ,MAAM,WAAW,oBAAoB;IAAE,QAAQ,EAAC,KAAK,GAAC,MAAM,CAAC;IAAA,IAAI,EAAC,QAAQ,GAAC,UAAU,GAAC,UAAU,CAAC;IAAA,KAAK,EAAC;QAAC,IAAI,EAAC,MAAM,CAAC;QAAA,OAAO,EAAC,MAAM,CAAA;KAAC,EAAE,CAAC;IAAA,YAAY,EAAC;QAAC,IAAI,EAAC,MAAM,CAAC;QAAA,MAAM,EAAC,MAAM,CAAC;QAAA,KAAK,EAAC,MAAM,CAAA;KAAC,EAAE,CAAC;IAAA,QAAQ,EAAC;QAAC,GAAG,EAAC,MAAM,CAAC;QAAA,OAAO,EAAC,MAAM,CAAC;QAAA,IAAI,EAAC,MAAM,EAAE,CAAA;KAAC,EAAE,CAAC;IAAA,KAAK,EAAC,MAAM,EAAE,CAAC;IAAA,SAAS,CAAC,EAAC,MAAM,CAAA;CAAC;AACpR,eAAO,MAAM,yBAAyB,WAAS,CAAC;AAChD,eAAO,MAAM,aAAa,GAAE,SAAQ,MAAM,WAAqD,CAAC;AAChG,wBAAgB,YAAY,CAAC,IAAI,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,UAInE;AAOD,wBAAsB,MAAM,CAAC,IAAI,EAAC,MAAM,oBAAqH;AAO7J,wBAAsB,QAAQ,CAAC,IAAI,EAAC,MAAM,iBAGzC;AACD,wBAAsB,kBAAkB,CAAC,IAAI,EAAC,MAAM;;;GAMnD;AAkBD,wBAAsB,yBAAyB,CAAC,OAAO,EAAC,uBAAuB,GAAE,OAAO,CAAC,oBAAoB,CAAC,CAE7G;AACD,wBAAsB,0BAA0B,CAAC,OAAO,EAAC,uBAAuB,EAAC,IAAI,EAAC,KAAK,GAAC,QAAQ,GAAC,SAAS,GAAE,OAAO,CAAC,oBAAoB,CAAC,CAqE5I;AACD,wFAAwF;AACxF,wBAAsB,+BAA+B,CAAC,SAAS,EAAC,MAAM,GAAE,OAAO,CAAC,oBAAoB,CAAC,CAYpG;AAaD,yFAAyF;AACzF,wBAAsB,0BAA0B,CAAC,IAAI,EAAC,oBAAoB,EAAC,OAAO,UAAK,iBAoCtF;AACD,wBAAsB,8BAA8B,CAAC,SAAS,EAAC,MAAM;;;;KAoBpE"}