@8bitbish/screenshot-service 1.2.0 → 1.2.2

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/dist/device.d.ts CHANGED
@@ -17,10 +17,16 @@ export declare const MODEL_NAMES: Record<string, string>;
17
17
  */
18
18
  export declare function getDeveloperModeStatus(python: string, udid?: string | null): Promise<boolean>;
19
19
  /**
20
- * Triggers the Developer Mode enable flow on the iPhone. The device must be
21
- * paired and trusted first. After this call the iPhone shows a system prompt
22
- * for the user to confirm + restart. Resolves when the request was sent; the
23
- * actual state change happens after the user's on-device confirmation.
20
+ * Trigger the Developer Mode setup flow on the iPhone.
21
+ *
22
+ * iOS blocks the silent enable-developer-mode AMFI call when the device has a
23
+ * passcode set (which is effectively always). So instead we call
24
+ * reveal-developer-mode, which opens Settings → Privacy & Security → Developer
25
+ * Mode on the iPhone — the user still has to toggle it and restart, but they
26
+ * don't have to navigate Settings themselves.
27
+ *
28
+ * The device must be paired and trusted first. Resolves once the Settings
29
+ * jump-to is sent. State change happens after the user's on-device action.
24
30
  */
25
31
  export declare function enableDeveloperMode(python: string, udid?: string | null): Promise<void>;
26
32
  export declare function getDeviceInfo(python: string, udid?: string | null): Promise<DeviceInfo>;
@@ -1 +1 @@
1
- {"version":3,"file":"device.d.ts","sourceRoot":"","sources":["../device.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;CACvB;AAED,sFAAsF;AACtF,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAEzE;AAED,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CA2B9C,CAAC;AAEF;;;GAGG;AACH,wBAAsB,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,GAAG,IAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CASzG;AAED;;;;;GAKG;AACH,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,GAAG,IAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAInG;AAED,wBAAsB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,GAAG,IAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAmBnG;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,GAAG,IAAW,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CA2BhH"}
1
+ {"version":3,"file":"device.d.ts","sourceRoot":"","sources":["../device.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;CACvB;AAED,sFAAsF;AACtF,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAEzE;AAED,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CA2B9C,CAAC;AAEF;;;GAGG;AACH,wBAAsB,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,GAAG,IAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CASzG;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,GAAG,IAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAInG;AAED,wBAAsB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,GAAG,IAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAmBnG;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,GAAG,IAAW,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CA2BhH"}
package/dist/device.js CHANGED
@@ -56,13 +56,19 @@ async function getDeveloperModeStatus(python, udid = null) {
56
56
  }
57
57
  }
58
58
  /**
59
- * Triggers the Developer Mode enable flow on the iPhone. The device must be
60
- * paired and trusted first. After this call the iPhone shows a system prompt
61
- * for the user to confirm + restart. Resolves when the request was sent; the
62
- * actual state change happens after the user's on-device confirmation.
59
+ * Trigger the Developer Mode setup flow on the iPhone.
60
+ *
61
+ * iOS blocks the silent enable-developer-mode AMFI call when the device has a
62
+ * passcode set (which is effectively always). So instead we call
63
+ * reveal-developer-mode, which opens Settings → Privacy & Security → Developer
64
+ * Mode on the iPhone — the user still has to toggle it and restart, but they
65
+ * don't have to navigate Settings themselves.
66
+ *
67
+ * The device must be paired and trusted first. Resolves once the Settings
68
+ * jump-to is sent. State change happens after the user's on-device action.
63
69
  */
64
70
  async function enableDeveloperMode(python, udid = null) {
65
- await execFileAsync(python, pmd3Args(udid, "amfi", "enable-developer-mode"), { timeout: 10000 });
71
+ await execFileAsync(python, pmd3Args(udid, "amfi", "reveal-developer-mode"), { timeout: 10000 });
66
72
  }
67
73
  async function getDeviceInfo(python, udid = null) {
68
74
  // usbmux list returns ALL connected devices; pick the one matching udid, else the first.
@@ -1 +1 @@
1
- {"version":3,"file":"device.js","sourceRoot":"","sources":["../device.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"device.js","sourceRoot":"","sources":["../device.ts"],"names":[],"mappings":"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"}
@@ -320,6 +320,34 @@
320
320
  font-size: 12px;
321
321
  font-weight: 500;
322
322
  }
323
+ .dev-mode-banner {
324
+ margin: 8px 0 20px;
325
+ padding: 14px 16px;
326
+ background: rgba(241, 192, 98, 0.08);
327
+ border: 1px solid rgba(241, 192, 98, 0.4);
328
+ border-radius: 10px;
329
+ color: var(--text);
330
+ }
331
+ .dev-mode-banner h4 {
332
+ margin: 0 0 6px;
333
+ color: var(--warn);
334
+ font-size: 13px;
335
+ font-weight: 600;
336
+ text-transform: uppercase;
337
+ letter-spacing: 0.06em;
338
+ }
339
+ .dev-mode-banner ol {
340
+ margin: 8px 0 0;
341
+ padding-left: 20px;
342
+ font-size: 13.5px;
343
+ color: var(--text);
344
+ }
345
+ .dev-mode-banner ol li { margin: 4px 0; color: var(--text); }
346
+ .dev-mode-banner .auto-note {
347
+ margin-top: 10px;
348
+ font-size: 12.5px;
349
+ color: var(--muted);
350
+ }
323
351
  .device-row.flash-new {
324
352
  background: rgba(61, 220, 151, 0.14);
325
353
  border-color: rgba(61, 220, 151, 0.55);
@@ -446,6 +474,17 @@
446
474
  <p class="muted" id="dm-sub">These are connected right now. Add as many as you want.</p>
447
475
  <ul class="device-list" id="device-list"></ul>
448
476
  <div class="empty-state" id="device-empty" style="display: none"></div>
477
+ <div class="dev-mode-banner" id="dev-mode-banner" style="display: none">
478
+ <h4>Developer Mode needed</h4>
479
+ <div id="dev-mode-banner-detail">Your iPhone needs Developer Mode turned on before screenshot capture will work.</div>
480
+ <ol>
481
+ <li>On your iPhone: <strong>Settings → Privacy &amp; Security → Developer Mode</strong></li>
482
+ <li>Toggle <strong>Developer Mode</strong> on</li>
483
+ <li>Tap <strong>Restart</strong> when prompted</li>
484
+ <li>After the iPhone reboots, tap <strong>Turn On</strong> and enter your passcode</li>
485
+ </ol>
486
+ <div class="auto-note"><span class="live-dot"></span> We'll detect it automatically once it's on — no need to come back here.</div>
487
+ </div>
449
488
  <div class="add-row">
450
489
  <button class="btn ghost" id="btn-add-device">+ Add another device</button>
451
490
  </div>
@@ -486,7 +525,6 @@
486
525
  let lastDevices = []; // most recent listDevices() result
487
526
  let pendingAddSnapshot = null; // Set<string> of device IDs at the moment user clicked "+ Add"
488
527
  let history = [];
489
- const devModeRequested = new Set(); // device IDs for which we've already sent enableIosDevMode
490
528
 
491
529
  function show(name, label) {
492
530
  for (const k in screens) screens[k].classList.remove('active');
@@ -564,14 +602,10 @@
564
602
  (needsDevMode ? ' needs-action' : (d.available ? '' : ' unavailable')) +
565
603
  (flashNew ? ' flash-new' : '');
566
604
 
567
- // Right side: button (dev-mode action) OR status (when unavailable for other reason) OR nothing
605
+ // Right side status text. Instructions for fixing dev-mode live in the banner below the list.
568
606
  let rightSide = '';
569
607
  if (needsDevMode) {
570
- if (devModeRequested.has(d.id)) {
571
- rightSide = `<span class="row-pending">Check your iPhone…</span>`;
572
- } else {
573
- rightSide = `<button class="row-action" data-action="enable-dev-mode">Turn on Developer Mode</button>`;
574
- }
608
+ rightSide = `<span class="row-pending">Needs Developer Mode</span>`;
575
609
  } else if (!d.available && d.unavailableReason) {
576
610
  rightSide = `<span class="status">${escapeHtml(d.unavailableReason)}</span>`;
577
611
  }
@@ -585,31 +619,6 @@
585
619
  rightSide;
586
620
 
587
621
  if (!existing) listEl.appendChild(li);
588
-
589
- // Wire the action button (idempotent — re-attached on every render)
590
- const actionBtn = li.querySelector('button.row-action');
591
- if (actionBtn) {
592
- actionBtn.onclick = () => sendEnableDevMode(d.id, actionBtn);
593
- }
594
- }
595
-
596
- async function sendEnableDevMode(deviceId, buttonEl) {
597
- buttonEl.disabled = true;
598
- buttonEl.textContent = 'Sending…';
599
- try {
600
- await window.wizard.enableIosDevMode(deviceId);
601
- devModeRequested.add(deviceId);
602
- // Re-render the row immediately so the button swaps to "Check your iPhone…"
603
- const li = $('device-list').querySelector(`[data-id="${deviceId}"]`);
604
- if (li) {
605
- const fresh = lastDevices.find(x => x.id === deviceId);
606
- if (fresh) renderDeviceRow($('device-list'), fresh, new Set());
607
- }
608
- } catch (err) {
609
- buttonEl.disabled = false;
610
- buttonEl.textContent = 'Try again';
611
- alert(`Couldn't enable Developer Mode: ${err.message || err}`);
612
- }
613
622
  }
614
623
  function escapeHtml(s) {
615
624
  return String(s).replace(/[&<>"']/g, c => ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;', "'": '&#39;' }[c]));
@@ -624,11 +633,6 @@
624
633
  async function refreshDeviceManager(justAddedIds = new Set()) {
625
634
  const devs = await window.wizard.listDevices();
626
635
  lastDevices = devs;
627
- // Clear "request sent" state for any iPhone whose Developer Mode has flipped to ON.
628
- for (const id of Array.from(devModeRequested)) {
629
- const d = devs.find(x => x.id === id);
630
- if (!d || d.developerMode === true) devModeRequested.delete(id);
631
- }
632
636
  const mine = devs.filter(d => d.platform === platform);
633
637
  const listEl = $('device-list');
634
638
  const emptyEl = $('device-empty');
@@ -650,6 +654,14 @@
650
654
  emptyEl.style.display = 'none';
651
655
  for (const d of mine) renderDeviceRow(listEl, d, justAddedIds);
652
656
  }
657
+
658
+ // Show the Developer Mode banner if any connected iPhone needs it.
659
+ const banner = $('dev-mode-banner');
660
+ if (banner) {
661
+ const needyCount = mine.filter(d => d.platform === 'ios' && d.developerMode === false).length;
662
+ banner.style.display = needyCount > 0 ? '' : 'none';
663
+ }
664
+
653
665
  return mine;
654
666
  }
655
667
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@8bitbish/screenshot-service",
3
- "version": "1.2.0",
3
+ "version": "1.2.2",
4
4
  "description": "Capture screenshots and recordings from connected iPhone and Android devices, with a built-in visual setup wizard.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",