@smartmemory/compose 0.2.46-beta → 0.2.48-beta

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.
Files changed (71) hide show
  1. package/README.md +17 -0
  2. package/bin/compose.js +35 -1
  3. package/dist/assets/{App-CZNprfTP.js → App-D7E7S49Q.js} +163 -153
  4. package/dist/assets/{arc-D7Ql7gBh.js → arc-LOW60tiI.js} +1 -1
  5. package/dist/assets/{architectureDiagram-3BPJPVTR-CMzqpLWw.js → architectureDiagram-3BPJPVTR-BDY00hRy.js} +1 -1
  6. package/dist/assets/{blockDiagram-GPEHLZMM-CbW2AYzk.js → blockDiagram-GPEHLZMM-DiC_6ktq.js} +1 -1
  7. package/dist/assets/browser-DW2JlJCC.js +8 -0
  8. package/dist/assets/{c4Diagram-AAUBKEIU-C89TIEqM.js → c4Diagram-AAUBKEIU-CXZC8woU.js} +1 -1
  9. package/dist/assets/channel-Dh96pu1k.js +1 -0
  10. package/dist/assets/{chunk-2J33WTMH-jLQK9et3.js → chunk-2J33WTMH-b8Rdk4S-.js} +1 -1
  11. package/dist/assets/{chunk-4BX2VUAB-bH25OCUA.js → chunk-4BX2VUAB-BSxn03f-.js} +1 -1
  12. package/dist/assets/{chunk-55IACEB6-Dhb0bOrW.js → chunk-55IACEB6-uUk1WzZ1.js} +1 -1
  13. package/dist/assets/{chunk-727SXJPM-CBfeQuSd.js → chunk-727SXJPM-zvXhT6iZ.js} +1 -1
  14. package/dist/assets/{chunk-AQP2D5EJ-CIxa5qRv.js → chunk-AQP2D5EJ-B6GCyrIp.js} +1 -1
  15. package/dist/assets/{chunk-FMBD7UC4-CmXvjRAO.js → chunk-FMBD7UC4-DlhrqkBp.js} +1 -1
  16. package/dist/assets/{chunk-ND2GUHAM-DRs6NTTH.js → chunk-ND2GUHAM-lo_8kNzw.js} +1 -1
  17. package/dist/assets/{chunk-QZHKN3VN-BmkcOtBV.js → chunk-QZHKN3VN-on-yD-C0.js} +1 -1
  18. package/dist/assets/classDiagram-4FO5ZUOK-BCqpDcaS.js +1 -0
  19. package/dist/assets/classDiagram-v2-Q7XG4LA2-BCqpDcaS.js +1 -0
  20. package/dist/assets/{cose-bilkent-S5V4N54A-BZwhzUqa.js → cose-bilkent-S5V4N54A-DxV7Y2bU.js} +1 -1
  21. package/dist/assets/{dagre-BM42HDAG-CEHe9vzv.js → dagre-BM42HDAG-BHf9sURy.js} +1 -1
  22. package/dist/assets/{diagram-2AECGRRQ-Cq8RCIdY.js → diagram-2AECGRRQ-R9Puxzlh.js} +1 -1
  23. package/dist/assets/{diagram-5GNKFQAL-DCaYgQ-u.js → diagram-5GNKFQAL-BbjlClKx.js} +1 -1
  24. package/dist/assets/{diagram-KO2AKTUF-DehQMQAE.js → diagram-KO2AKTUF-r89Mx4m1.js} +1 -1
  25. package/dist/assets/{diagram-LMA3HP47-BUJ8pJCq.js → diagram-LMA3HP47-CstVDJZ3.js} +1 -1
  26. package/dist/assets/{diagram-OG6HWLK6-BrqALaH3.js → diagram-OG6HWLK6-xmX57FKh.js} +1 -1
  27. package/dist/assets/{erDiagram-TEJ5UH35-Cz2hnPqN.js → erDiagram-TEJ5UH35-DhLPxvrl.js} +1 -1
  28. package/dist/assets/{flowDiagram-I6XJVG4X-BpPrbE4K.js → flowDiagram-I6XJVG4X-BExoUaNm.js} +1 -1
  29. package/dist/assets/{ganttDiagram-6RSMTGT7-Dne2jtVu.js → ganttDiagram-6RSMTGT7-BEXa5a22.js} +1 -1
  30. package/dist/assets/{gitGraphDiagram-PVQCEYII-W8OpyxIG.js → gitGraphDiagram-PVQCEYII-Cbes9api.js} +1 -1
  31. package/dist/assets/{graph-viND0NdB.js → graph-BBXaecIU.js} +1 -1
  32. package/dist/assets/index-BwLfbbOu.css +1 -0
  33. package/dist/assets/{index-BVnbNZXC.js → index-DNuHtZwR.js} +22 -22
  34. package/dist/assets/{infoDiagram-5YYISTIA-4OeddgjS.js → infoDiagram-5YYISTIA-UBm4ssfm.js} +1 -1
  35. package/dist/assets/{ishikawaDiagram-YF4QCWOH-D0XwMcCq.js → ishikawaDiagram-YF4QCWOH-CksBYHCF.js} +1 -1
  36. package/dist/assets/{journeyDiagram-JHISSGLW-CO0wIeDT.js → journeyDiagram-JHISSGLW-CKHkIHky.js} +1 -1
  37. package/dist/assets/{kanban-definition-UN3LZRKU-CLU0ciYv.js → kanban-definition-UN3LZRKU-CEahMFzE.js} +1 -1
  38. package/dist/assets/{linear-BOFLe2h1.js → linear-CqLVtYRk.js} +1 -1
  39. package/dist/assets/{mindmap-definition-RKZ34NQL-ByuwlkdD.js → mindmap-definition-RKZ34NQL-C61zWt4M.js} +1 -1
  40. package/dist/assets/mobile-DwmxS_O4.js +17 -0
  41. package/dist/assets/{pieDiagram-4H26LBE5-CPm2BXke.js → pieDiagram-4H26LBE5-BIpZHyJW.js} +1 -1
  42. package/dist/assets/{quadrantDiagram-W4KKPZXB-CR3NLvwU.js → quadrantDiagram-W4KKPZXB-Db7nRbZm.js} +1 -1
  43. package/dist/assets/{requirementDiagram-4Y6WPE33-D4vpyryW.js → requirementDiagram-4Y6WPE33-BQqFCAr0.js} +1 -1
  44. package/dist/assets/{sankeyDiagram-5OEKKPKP--Clp0eo-.js → sankeyDiagram-5OEKKPKP-D-oAAMci.js} +1 -1
  45. package/dist/assets/{sequenceDiagram-3UESZ5HK-B1xrJkMo.js → sequenceDiagram-3UESZ5HK-Dc4Cp0Om.js} +1 -1
  46. package/dist/assets/{stateDiagram-AJRCARHV-D5w5yQql.js → stateDiagram-AJRCARHV-B5DkQ8Pr.js} +1 -1
  47. package/dist/assets/stateDiagram-v2-BHNVJYJU-BM1Uf6a_.js +1 -0
  48. package/dist/assets/{timeline-definition-PNZ67QCA-DxOINQqf.js → timeline-definition-PNZ67QCA-DU9Fl-FW.js} +1 -1
  49. package/dist/assets/{vennDiagram-CIIHVFJN-B3Wss4do.js → vennDiagram-CIIHVFJN-Bthz7siw.js} +1 -1
  50. package/dist/assets/{wardley-L42UT6IY-nYDkwvlu.js → wardley-L42UT6IY-nqdlFSIA.js} +1 -1
  51. package/dist/assets/{wardleyDiagram-YWT4CUSO-BMM3myEL.js → wardleyDiagram-YWT4CUSO-BJ1BC5zc.js} +1 -1
  52. package/dist/assets/{xychartDiagram-2RQKCTM6-B5ElCNMx.js → xychartDiagram-2RQKCTM6-Bib5JrbR.js} +1 -1
  53. package/dist/index.html +3 -3
  54. package/lib/cli-remote.js +533 -0
  55. package/package.json +3 -1
  56. package/server/auth-middleware.js +309 -0
  57. package/server/auth-routes.js +195 -0
  58. package/server/auth-store.js +539 -0
  59. package/server/build-routes.js +1 -1
  60. package/server/index.js +134 -7
  61. package/server/remote-utils.js +134 -0
  62. package/server/security.js +46 -1
  63. package/server/supervisor.js +7 -1
  64. package/server/vision-routes.js +1 -1
  65. package/server/vision-server.js +1 -1
  66. package/dist/assets/channel-sjm4Ncyv.js +0 -1
  67. package/dist/assets/classDiagram-4FO5ZUOK-LkIQdBsc.js +0 -1
  68. package/dist/assets/classDiagram-v2-Q7XG4LA2-LkIQdBsc.js +0 -1
  69. package/dist/assets/index-D9M5IzwO.css +0 -1
  70. package/dist/assets/mobile-B-d4crm_.js +0 -17
  71. package/dist/assets/stateDiagram-v2-BHNVJYJU-TPU-mOqi.js +0 -1
package/README.md CHANGED
@@ -133,6 +133,23 @@ compose tracker sync # reconcile op-log against remote provider
133
133
 
134
134
  See [docs/configuration.md](docs/configuration.md) for the full `tracker` config reference.
135
135
 
136
+ ## Remote access (mobile PWA from anywhere)
137
+
138
+ The mobile cockpit at `/m` can be reached from outside localhost — bring your own tunnel, compose handles auth and pairing:
139
+
140
+ ```bash
141
+ npm run build # remote serves the built PWA from the API server
142
+ COMPOSE_REMOTE_AUTH=enabled compose start --host=0.0.0.0
143
+ compose remote pair --public-host=https://your-tunnel-host # prints a QR — scan it with your phone
144
+ compose remote status # bind, devices, tunnel reachability
145
+ ```
146
+
147
+ How it works: binding beyond `127.0.0.1` refuses to start unless `COMPOSE_REMOTE_AUTH=enabled` is set. In remote mode every request needs a credential — there is deliberately **no IP-based trust** (tunnel daemons connect from loopback). Phones pair once via QR (5-minute single-use code) and stay authenticated for 30 days through rotating refresh tokens + 15-minute access JWTs; reuse of a rotated refresh token revokes the device. Devices are listable and revocable (`compose remote list|revoke`, or the cockpit's "Pair mobile" modal). Only port 4001 needs to be exposed — agent-server traffic is proxied through it.
148
+
149
+ Tunnel layer is yours: Tailscale (serve/funnel), Cloudflare Tunnel, or a reverse proxy on your own VPS+domain all work — the last is the most reliable from restrictive networks (e.g. mainland China, where `trycloudflare.com`/ngrok domains are commonly blocked; plain TLS on 443 to an unremarkable domain travels best). Pair the device *before* traveling: pairing needs a live round-trip, while an already-paired phone only needs refresh.
150
+
151
+ `compose remote rotate-secret --yes` invalidates every paired device (post-leak hammer).
152
+
136
153
  ## Documentation
137
154
 
138
155
  Topic-scoped reference:
package/bin/compose.js CHANGED
@@ -109,6 +109,7 @@ if (!cmd || cmd === '--help' || cmd === '-h') {
109
109
  console.log('')
110
110
  console.log('Commands:')
111
111
  console.log(' start Start the compose app (UI + API) for this project')
112
+ console.log(' remote Manage remote access: pair, list, revoke, status')
112
113
  console.log(' new Kickoff a product (research, brainstorm, roadmap, scaffold)')
113
114
  console.log(' import Scan existing project and generate structured analysis')
114
115
  console.log(' feature Add a single feature (folder, design seed, ROADMAP entry)')
@@ -2345,16 +2346,49 @@ if (cmd === 'build') {
2345
2346
  process.exit(1)
2346
2347
  }
2347
2348
 
2349
+ // --host=<addr> forwards COMPOSE_HOST to the supervisor → api-server child.
2350
+ // supervisor.js already threads COMPOSE_HOST to api-server only; agent-server
2351
+ // stays 127.0.0.1 always (see supervisor.js ~line 146).
2352
+ const hostFlagIdx = args.findIndex((a) => a.startsWith('--host='))
2353
+ const startEnv = { ...process.env, COMPOSE_TARGET: targetRoot }
2354
+ if (hostFlagIdx !== -1) {
2355
+ startEnv.COMPOSE_HOST = args[hostFlagIdx].slice('--host='.length)
2356
+ }
2357
+
2348
2358
  const child = spawn('node', [join(PACKAGE_ROOT, 'server', 'supervisor.js')], {
2349
2359
  stdio: 'inherit',
2350
2360
  cwd: PACKAGE_ROOT,
2351
- env: { ...process.env, COMPOSE_TARGET: targetRoot },
2361
+ env: startEnv,
2352
2362
  })
2353
2363
  child.on('error', (err) => {
2354
2364
  console.error(`Failed to start compose: ${err.message}`)
2355
2365
  process.exit(1)
2356
2366
  })
2357
2367
  child.on('exit', (code) => process.exit(code ?? 0))
2368
+ } else if (cmd === 'remote') {
2369
+ // ---------------------------------------------------------------------------
2370
+ // compose remote — remote access management (COMP-MOBILE-REMOTE S03)
2371
+ // ---------------------------------------------------------------------------
2372
+ const { runRemoteCommand } = await import('../lib/cli-remote.js')
2373
+ const { root: remoteCwd } = resolveCwdWithWorkspace(args)
2374
+
2375
+ await runRemoteCommand(args, {
2376
+ port: resolvePort(),
2377
+ token: process.env.COMPOSE_API_TOKEN,
2378
+ cwd: remoteCwd,
2379
+ lines: { push: (l) => console.log(l) },
2380
+ // qr and poll use defaults (qrcode-terminal + setTimeout)
2381
+ }).catch((err) => {
2382
+ // Errors already printed to output; only exit non-zero
2383
+ if (
2384
+ err.message !== 'COMPOSE_API_TOKEN not set' &&
2385
+ err.message !== '--yes required' &&
2386
+ err.message !== 'Missing device-id'
2387
+ ) {
2388
+ console.error(`remote: ${err.message}`)
2389
+ }
2390
+ process.exit(1)
2391
+ })
2358
2392
  } else if (cmd === 'ideabox') {
2359
2393
  // ---------------------------------------------------------------------------
2360
2394
  // compose ideabox — idea management CLI