humanish 0.15.3 → 0.17.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.
Files changed (48) hide show
  1. package/README.md +49 -6
  2. package/dist/concurrent-shared-world-lab.js +20 -7
  3. package/dist/concurrent-shared-world-lab.js.map +1 -1
  4. package/dist/cua-actor-lab.d.ts +101 -4
  5. package/dist/cua-actor-lab.js +456 -77
  6. package/dist/cua-actor-lab.js.map +1 -1
  7. package/dist/device-presets.d.ts +4 -4
  8. package/dist/device-presets.js +5 -5
  9. package/dist/device-presets.js.map +1 -1
  10. package/dist/index.d.ts +1 -1
  11. package/dist/index.js.map +1 -1
  12. package/dist/lab-config.d.ts +2 -2
  13. package/dist/observer-assets.js +92 -15
  14. package/dist/observer-assets.js.map +1 -1
  15. package/dist/observer-auth.d.ts +21 -0
  16. package/dist/observer-auth.js +92 -0
  17. package/dist/observer-auth.js.map +1 -0
  18. package/dist/observer-library.d.ts +19 -0
  19. package/dist/observer-library.js +189 -0
  20. package/dist/observer-library.js.map +1 -0
  21. package/dist/observer-serve.d.ts +111 -0
  22. package/dist/observer-serve.js +369 -0
  23. package/dist/observer-serve.js.map +1 -0
  24. package/dist/observer.d.ts +31 -0
  25. package/dist/observer.js +10 -5
  26. package/dist/observer.js.map +1 -1
  27. package/dist/oss-meta-lab.js +2 -4
  28. package/dist/oss-meta-lab.js.map +1 -1
  29. package/dist/program.js +242 -0
  30. package/dist/program.js.map +1 -1
  31. package/dist/run.d.ts +38 -0
  32. package/dist/run.js +71 -1
  33. package/dist/run.js.map +1 -1
  34. package/dist/serve-tunnel.d.ts +16 -0
  35. package/dist/serve-tunnel.js +104 -0
  36. package/dist/serve-tunnel.js.map +1 -0
  37. package/dist/shared-world-lab.d.ts +20 -1
  38. package/dist/shared-world-lab.js +197 -23
  39. package/dist/shared-world-lab.js.map +1 -1
  40. package/docs/architecture/observer.md +7 -0
  41. package/docs/architecture/serve.md +140 -0
  42. package/docs/assets/humanish-drawdb-hero.png +0 -0
  43. package/docs/contracts/run-bundle.md +19 -0
  44. package/docs/contracts/schemas.md +23 -1
  45. package/docs/goals/current.md +4 -3
  46. package/docs/principles/invariants-and-defaults.md +1 -0
  47. package/docs/ramp/README.md +1 -1
  48. package/package.json +1 -1
package/dist/run.js CHANGED
@@ -2462,7 +2462,7 @@ async function verifyPreparedRun(cwd, runInput, runPaths) {
2462
2462
  });
2463
2463
  const ok = checks.every((check) => check.ok);
2464
2464
  const warnings = isRunBundle(bundle)
2465
- ? [...rawScreenshotPostureWarnings(bundle), ...undeclaredSubjectStateWarnings(bundle)]
2465
+ ? [...rawScreenshotPostureWarnings(bundle), ...undeclaredSubjectStateWarnings(bundle), ...desktopGeometryWarnings(bundle)]
2466
2466
  : [];
2467
2467
  const shareSafety = isRunBundle(bundle)
2468
2468
  ? buildShareSafety({ ok, bundle, publicSafetyFindings })
@@ -3644,6 +3644,10 @@ function rawScreenshotStreamIds(bundle) {
3644
3644
  }
3645
3645
  return rawStreamIds;
3646
3646
  }
3647
+ /** Non-fatal hosted-desktop geometry disclosures, deduplicated across shared-screen streams. */
3648
+ function desktopGeometryWarnings(bundle) {
3649
+ return [...new Set(bundle.streams.flatMap((stream) => stream.desktopGeometry?.warnings ?? []))];
3650
+ }
3647
3651
  function buildShareSafety(args) {
3648
3652
  const reasons = [];
3649
3653
  if (!args.ok) {
@@ -4629,9 +4633,75 @@ function isRunStream(value) {
4629
4633
  && isRunSimulationStatus(value.status)
4630
4634
  && (value.transport === "snapshot" || value.transport === "polling" || value.transport === "sse" || value.transport === "pty" || value.transport === "app-server")
4631
4635
  && typeof value.updatedAt === "string"
4636
+ && (value.viewport === undefined || isRunViewport(value.viewport))
4637
+ && (value.desktopGeometry === undefined || isRunDesktopGeometry(value.desktopGeometry))
4638
+ && hasConsistentStreamGeometry(value)
4632
4639
  && Array.isArray(value.artifacts)
4633
4640
  && value.artifacts.every(isRunStreamArtifact);
4634
4641
  }
4642
+ function isRunViewport(value) {
4643
+ return isRecord(value)
4644
+ && isPositiveFiniteNumber(value.width)
4645
+ && isPositiveFiniteNumber(value.height)
4646
+ && (value.deviceScaleFactor === undefined || isPositiveFiniteNumber(value.deviceScaleFactor))
4647
+ && (value.isMobile === undefined || typeof value.isMobile === "boolean");
4648
+ }
4649
+ function isRunDesktopGeometry(value) {
4650
+ if (!isRecord(value) || !isRecord(value.screen) || !isMeasuredSize(value.screen.requested)) {
4651
+ return false;
4652
+ }
4653
+ const verified = value.screen.verified;
4654
+ if (verified !== undefined) {
4655
+ if (!isRecord(verified))
4656
+ return false;
4657
+ const source = verified.source;
4658
+ if (!isMeasuredSize(verified) || source !== "xdpyinfo")
4659
+ return false;
4660
+ }
4661
+ const browserWindow = value.browserWindow;
4662
+ if (browserWindow !== undefined && (!isRecord(browserWindow)
4663
+ || !isFiniteNumber(browserWindow.x)
4664
+ || !isFiniteNumber(browserWindow.y)
4665
+ || !isPositiveFiniteNumber(browserWindow.width)
4666
+ || !isPositiveFiniteNumber(browserWindow.height)
4667
+ || (browserWindow.source !== "cdp" && browserWindow.source !== "xdotool"))) {
4668
+ return false;
4669
+ }
4670
+ const viewport = value.viewport;
4671
+ if (!(viewport === undefined || (isRecord(viewport)
4672
+ && isPositiveFiniteNumber(viewport.width)
4673
+ && isPositiveFiniteNumber(viewport.height)
4674
+ && isPositiveFiniteNumber(viewport.deviceScaleFactor)
4675
+ && viewport.source === "cdp")))
4676
+ return false;
4677
+ return value.warnings === undefined || (Array.isArray(value.warnings)
4678
+ && value.warnings.every((warning) => typeof warning === "string" && warning.length > 0));
4679
+ }
4680
+ function hasConsistentStreamGeometry(value) {
4681
+ if (value.desktopGeometry === undefined)
4682
+ return true;
4683
+ if (!isRunDesktopGeometry(value.desktopGeometry))
4684
+ return false;
4685
+ const measured = value.desktopGeometry.viewport;
4686
+ if (measured === undefined)
4687
+ return value.viewport === undefined;
4688
+ if (!isRunViewport(value.viewport))
4689
+ return false;
4690
+ return value.viewport.width === measured.width
4691
+ && value.viewport.height === measured.height
4692
+ && value.viewport.deviceScaleFactor === measured.deviceScaleFactor;
4693
+ }
4694
+ function isMeasuredSize(value) {
4695
+ return isRecord(value)
4696
+ && isPositiveFiniteNumber(value.width)
4697
+ && isPositiveFiniteNumber(value.height);
4698
+ }
4699
+ function isPositiveFiniteNumber(value) {
4700
+ return isFiniteNumber(value) && value > 0;
4701
+ }
4702
+ function isFiniteNumber(value) {
4703
+ return typeof value === "number" && Number.isFinite(value);
4704
+ }
4635
4705
  function isRunStreamArtifact(value) {
4636
4706
  return isRecord(value)
4637
4707
  && typeof value.label === "string"