@fuzdev/fuz_app 0.111.0 → 0.112.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 (179) hide show
  1. package/dist/actions/CLAUDE.md +15 -11
  2. package/dist/actions/action_rpc.d.ts +1 -1
  3. package/dist/actions/action_rpc.d.ts.map +1 -1
  4. package/dist/actions/action_rpc.js +4 -6
  5. package/dist/actions/peer_ping.d.ts +8 -0
  6. package/dist/actions/peer_ping.d.ts.map +1 -1
  7. package/dist/actions/peer_ping.js +8 -0
  8. package/dist/actions/peer_request.d.ts +1 -1
  9. package/dist/actions/peer_request.js +1 -1
  10. package/dist/actions/perform_action.d.ts +16 -9
  11. package/dist/actions/perform_action.d.ts.map +1 -1
  12. package/dist/actions/perform_action.js +30 -21
  13. package/dist/actions/register_action_ws.d.ts +1 -1
  14. package/dist/actions/register_action_ws.d.ts.map +1 -1
  15. package/dist/actions/register_action_ws.js +88 -21
  16. package/dist/auth/CLAUDE.md +37 -7
  17. package/dist/auth/account_actions.d.ts.map +1 -1
  18. package/dist/auth/account_actions.js +10 -1
  19. package/dist/auth/account_queries.d.ts.map +1 -1
  20. package/dist/auth/account_queries.js +36 -16
  21. package/dist/auth/account_schema.d.ts +20 -0
  22. package/dist/auth/account_schema.d.ts.map +1 -1
  23. package/dist/auth/account_schema.js +22 -1
  24. package/dist/auth/actor_search_actions.d.ts +3 -3
  25. package/dist/auth/actor_search_actions.d.ts.map +1 -1
  26. package/dist/auth/actor_search_actions.js +10 -6
  27. package/dist/auth/api_token_queries.d.ts.map +1 -1
  28. package/dist/auth/api_token_queries.js +11 -5
  29. package/dist/auth/app_settings_queries.d.ts.map +1 -1
  30. package/dist/auth/app_settings_queries.js +6 -4
  31. package/dist/auth/audit_log_queries.d.ts +6 -0
  32. package/dist/auth/audit_log_queries.d.ts.map +1 -1
  33. package/dist/auth/audit_log_queries.js +11 -5
  34. package/dist/auth/cell_actions.d.ts.map +1 -1
  35. package/dist/auth/cell_actions.js +3 -8
  36. package/dist/auth/cell_audit_actions.d.ts.map +1 -1
  37. package/dist/auth/cell_audit_actions.js +1 -1
  38. package/dist/auth/cell_field_actions.js +1 -1
  39. package/dist/auth/cell_grant_actions.js +1 -1
  40. package/dist/auth/cell_item_actions.js +1 -1
  41. package/dist/auth/invite_queries.d.ts.map +1 -1
  42. package/dist/auth/invite_queries.js +10 -8
  43. package/dist/auth/role_grant_offer_ddl.d.ts +11 -0
  44. package/dist/auth/role_grant_offer_ddl.d.ts.map +1 -1
  45. package/dist/auth/role_grant_offer_ddl.js +20 -2
  46. package/dist/auth/role_grant_offer_queries.d.ts.map +1 -1
  47. package/dist/auth/role_grant_offer_queries.js +29 -15
  48. package/dist/auth/role_grant_queries.d.ts.map +1 -1
  49. package/dist/auth/role_grant_queries.js +21 -7
  50. package/dist/auth/session_queries.d.ts.map +1 -1
  51. package/dist/auth/session_queries.js +9 -4
  52. package/dist/db/CLAUDE.md +21 -2
  53. package/dist/db/cell_audit_queries.js +2 -2
  54. package/dist/db/cell_field_queries.d.ts +1 -1
  55. package/dist/db/cell_field_queries.d.ts.map +1 -1
  56. package/dist/db/cell_field_queries.js +8 -6
  57. package/dist/db/cell_grant_queries.d.ts +1 -1
  58. package/dist/db/cell_grant_queries.d.ts.map +1 -1
  59. package/dist/db/cell_grant_queries.js +12 -10
  60. package/dist/db/cell_item_queries.d.ts +1 -1
  61. package/dist/db/cell_item_queries.d.ts.map +1 -1
  62. package/dist/db/cell_item_queries.js +9 -7
  63. package/dist/db/cell_queries.d.ts +3 -3
  64. package/dist/db/cell_queries.d.ts.map +1 -1
  65. package/dist/db/cell_queries.js +6 -4
  66. package/dist/db/fact_queries.d.ts.map +1 -1
  67. package/dist/db/fact_queries.js +9 -3
  68. package/dist/db/sql_columns.d.ts +80 -3
  69. package/dist/db/sql_columns.d.ts.map +1 -1
  70. package/dist/db/sql_columns.js +91 -4
  71. package/dist/http/CLAUDE.md +3 -1
  72. package/dist/http/jsonrpc_helpers.d.ts +13 -0
  73. package/dist/http/jsonrpc_helpers.d.ts.map +1 -1
  74. package/dist/http/jsonrpc_helpers.js +13 -0
  75. package/dist/server/serve_fact_route.d.ts.map +1 -1
  76. package/dist/server/serve_fact_route.js +7 -2
  77. package/dist/testing/CLAUDE.md +53 -27
  78. package/dist/testing/admin_integration.d.ts +0 -3
  79. package/dist/testing/admin_integration.d.ts.map +1 -1
  80. package/dist/testing/admin_integration.js +0 -1
  81. package/dist/testing/adversarial_404.d.ts.map +1 -1
  82. package/dist/testing/adversarial_404.js +4 -1
  83. package/dist/testing/adversarial_input.d.ts.map +1 -1
  84. package/dist/testing/adversarial_input.js +5 -4
  85. package/dist/testing/app_server.d.ts +4 -3
  86. package/dist/testing/app_server.d.ts.map +1 -1
  87. package/dist/testing/app_server.js +11 -5
  88. package/dist/testing/attack_surface.d.ts +16 -0
  89. package/dist/testing/attack_surface.d.ts.map +1 -1
  90. package/dist/testing/attack_surface.js +36 -13
  91. package/dist/testing/audit_completeness.d.ts +0 -3
  92. package/dist/testing/audit_completeness.d.ts.map +1 -1
  93. package/dist/testing/audit_completeness.js +0 -1
  94. package/dist/testing/auth_apps.d.ts +9 -2
  95. package/dist/testing/auth_apps.d.ts.map +1 -1
  96. package/dist/testing/auth_apps.js +9 -2
  97. package/dist/testing/cross_backend/account_lifecycle.d.ts +5 -4
  98. package/dist/testing/cross_backend/account_lifecycle.d.ts.map +1 -1
  99. package/dist/testing/cross_backend/account_lifecycle.js +7 -0
  100. package/dist/testing/cross_backend/action_manifest.d.ts +19 -3
  101. package/dist/testing/cross_backend/action_manifest.d.ts.map +1 -1
  102. package/dist/testing/cross_backend/action_manifest.js +10 -4
  103. package/dist/testing/cross_backend/action_manifest_parity.d.ts +9 -3
  104. package/dist/testing/cross_backend/action_manifest_parity.d.ts.map +1 -1
  105. package/dist/testing/cross_backend/action_manifest_parity.js +6 -0
  106. package/dist/testing/cross_backend/actor_lookup.d.ts +3 -2
  107. package/dist/testing/cross_backend/actor_lookup.d.ts.map +1 -1
  108. package/dist/testing/cross_backend/body_size.d.ts +4 -2
  109. package/dist/testing/cross_backend/body_size.d.ts.map +1 -1
  110. package/dist/testing/cross_backend/body_size.js +1 -1
  111. package/dist/testing/cross_backend/cell_crud.d.ts +2 -2
  112. package/dist/testing/cross_backend/cell_crud.d.ts.map +1 -1
  113. package/dist/testing/cross_backend/cell_crud.js +10 -0
  114. package/dist/testing/cross_backend/cell_gated_create.d.ts +3 -3
  115. package/dist/testing/cross_backend/cell_gated_create.d.ts.map +1 -1
  116. package/dist/testing/cross_backend/cell_grant_role.d.ts +2 -2
  117. package/dist/testing/cross_backend/cell_grant_role.d.ts.map +1 -1
  118. package/dist/testing/cross_backend/cell_relations.d.ts +2 -2
  119. package/dist/testing/cross_backend/cell_relations.d.ts.map +1 -1
  120. package/dist/testing/cross_backend/fact_serving.d.ts +2 -2
  121. package/dist/testing/cross_backend/fact_serving.d.ts.map +1 -1
  122. package/dist/testing/cross_backend/make_cross_backend_project.d.ts +17 -2
  123. package/dist/testing/cross_backend/make_cross_backend_project.d.ts.map +1 -1
  124. package/dist/testing/cross_backend/make_cross_backend_project.js +23 -3
  125. package/dist/testing/cross_backend/origin.d.ts +4 -2
  126. package/dist/testing/cross_backend/origin.d.ts.map +1 -1
  127. package/dist/testing/cross_backend/origin.js +1 -1
  128. package/dist/testing/cross_backend/peer_ping_ws.d.ts.map +1 -1
  129. package/dist/testing/cross_backend/peer_ping_ws.js +11 -7
  130. package/dist/testing/cross_backend/query_shape.d.ts +6 -5
  131. package/dist/testing/cross_backend/query_shape.d.ts.map +1 -1
  132. package/dist/testing/cross_backend/ready.d.ts +2 -2
  133. package/dist/testing/cross_backend/ready.d.ts.map +1 -1
  134. package/dist/testing/cross_backend/role_grant_offer_enumeration.d.ts.map +1 -1
  135. package/dist/testing/cross_backend/role_grant_offer_enumeration.js +7 -1
  136. package/dist/testing/cross_backend/setup.d.ts +26 -6
  137. package/dist/testing/cross_backend/setup.d.ts.map +1 -1
  138. package/dist/testing/cross_backend/standard.d.ts +5 -1
  139. package/dist/testing/cross_backend/standard.d.ts.map +1 -1
  140. package/dist/testing/cross_backend/standard.js +1 -5
  141. package/dist/testing/cross_backend/testing_backdoor.js +1 -1
  142. package/dist/testing/cross_backend/testing_reset_actions.d.ts +5 -0
  143. package/dist/testing/cross_backend/testing_reset_actions.d.ts.map +1 -1
  144. package/dist/testing/cross_backend/token_lifetime.d.ts.map +1 -1
  145. package/dist/testing/cross_backend/token_lifetime.js +6 -0
  146. package/dist/testing/cross_backend/token_scope_surface.d.ts +2 -2
  147. package/dist/testing/cross_backend/token_scope_surface.d.ts.map +1 -1
  148. package/dist/testing/cross_backend/wire_shapes.d.ts +22 -0
  149. package/dist/testing/cross_backend/wire_shapes.d.ts.map +1 -0
  150. package/dist/testing/cross_backend/wire_shapes.js +41 -0
  151. package/dist/testing/data_exposure.d.ts +0 -3
  152. package/dist/testing/data_exposure.d.ts.map +1 -1
  153. package/dist/testing/data_exposure.js +0 -1
  154. package/dist/testing/db.d.ts +44 -7
  155. package/dist/testing/db.d.ts.map +1 -1
  156. package/dist/testing/db.js +62 -27
  157. package/dist/testing/integration.d.ts.map +1 -1
  158. package/dist/testing/integration.js +15 -2
  159. package/dist/testing/round_trip.d.ts +0 -3
  160. package/dist/testing/round_trip.d.ts.map +1 -1
  161. package/dist/testing/round_trip.js +0 -4
  162. package/dist/testing/rpc_attack_surface.js +2 -2
  163. package/dist/testing/rpc_round_trip.d.ts +0 -3
  164. package/dist/testing/rpc_round_trip.d.ts.map +1 -1
  165. package/dist/testing/rpc_round_trip.js +0 -1
  166. package/dist/testing/schema_generators.d.ts +15 -0
  167. package/dist/testing/schema_generators.d.ts.map +1 -1
  168. package/dist/testing/schema_generators.js +45 -11
  169. package/dist/testing/standard.d.ts +5 -1
  170. package/dist/testing/standard.d.ts.map +1 -1
  171. package/dist/testing/standard.js +2 -7
  172. package/dist/timestamp.d.ts +58 -0
  173. package/dist/timestamp.d.ts.map +1 -0
  174. package/dist/timestamp.js +57 -0
  175. package/dist/ui/RoleGrantOfferHistory.svelte +3 -1
  176. package/dist/ui/RoleGrantOfferHistory.svelte.d.ts.map +1 -1
  177. package/dist/ui/role_grant_offers_state.svelte.d.ts.map +1 -1
  178. package/dist/ui/role_grant_offers_state.svelte.js +6 -2
  179. package/package.json +1 -1
@@ -0,0 +1,57 @@
1
+ /**
2
+ * The canonical wire timestamp shape shared by the two spine implementations.
3
+ *
4
+ * Every timestamp that reaches the wire is second-precision UTC —
5
+ * `YYYY-MM-DDTHH:MM:SSZ`, exactly 20 characters. Timestamps read from
6
+ * Postgres get that shape from the SQL projection
7
+ * (`iso8601_timestamp_column` in `db/sql_columns.ts`, twin of
8
+ * `fuz_db::iso8601_timestamp_column`); this module is the same shape for the
9
+ * stamps minted in TS rather than read back from a row, so the two sources
10
+ * agree and the two backends serialize the same instant to the same bytes.
11
+ *
12
+ * @module
13
+ */
14
+ /**
15
+ * The canonical wire timestamp shape as a regex — second-precision UTC,
16
+ * exactly 20 characters.
17
+ *
18
+ * Lives in library code rather than a test helper so the unit suites, the db
19
+ * suites, and the cross-backend suites all pin the same pattern the server
20
+ * renders.
21
+ */
22
+ export const ISO8601_SECONDS = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z$/;
23
+ /**
24
+ * The width of one wire timestamp, in milliseconds.
25
+ *
26
+ * A wire stamp is truncated, not rounded, so the instant it names lies
27
+ * anywhere in `[stamp, stamp + ISO8601_SECOND_MS)`. A predicate that must
28
+ * not fire early against a stamp — "has this expiry passed?" — adds this to
29
+ * reach the end of the second the stamp stands for.
30
+ */
31
+ export const ISO8601_SECOND_MS = 1000;
32
+ /**
33
+ * Whether the second a wire timestamp names has not yet ended.
34
+ *
35
+ * The one in-memory expiry rule over a truncated stamp: `stamp` stands for
36
+ * `[stamp, stamp + ISO8601_SECOND_MS)`, so this admits until that whole
37
+ * second is over and can never report an expiry the server's raw-column
38
+ * `expires_at > NOW()` gate would still accept. A stamp that does not parse
39
+ * is never live.
40
+ *
41
+ * @param stamp - a second-precision wire timestamp
42
+ * @param now_ms - the current time in epoch milliseconds
43
+ * @returns `true` while `now_ms` lies before the end of `stamp`'s second
44
+ */
45
+ export const is_iso8601_seconds_live = (stamp, now_ms) => Date.parse(stamp) + ISO8601_SECOND_MS > now_ms;
46
+ /**
47
+ * Render a `Date` as the canonical second-precision UTC wire timestamp
48
+ * (`YYYY-MM-DDTHH:MM:SSZ`).
49
+ *
50
+ * Truncates rather than rounds, mirroring Postgres'
51
+ * `to_char(…, 'YYYY-MM-DD"T"HH24:MI:SS"Z"')` and the Rust spine's
52
+ * `fuz_sys::rfc3339_now`.
53
+ *
54
+ * @param date - the instant to render
55
+ * @returns the 20-character UTC timestamp
56
+ */
57
+ export const to_iso8601_seconds = (date) => `${date.toISOString().slice(0, 19)}Z`;
@@ -15,6 +15,7 @@
15
15
  import Datatable from './Datatable.svelte';
16
16
  import type { DatatableColumn } from './datatable.js';
17
17
  import { format_relative_time, format_datetime_local, truncate_uuid } from './ui_format.js';
18
+ import { is_iso8601_seconds_live } from '../timestamp.js';
18
19
  import type { RoleGrantOfferJson } from '../auth/role_grant_offer_schema.js';
19
20
  import { format_scope_context, resolve_scope_label, type FormatScope } from './format_scope.js';
20
21
 
@@ -47,7 +48,8 @@
47
48
  if (offer.declined_at) return 'declined';
48
49
  if (offer.retracted_at) return 'retracted';
49
50
  if (offer.superseded_at) return 'superseded';
50
- if (Date.parse(offer.expires_at) <= now) return 'expired';
51
+ // end-of-second comparison, see `RoleGrantOffersState.incoming`
52
+ if (!is_iso8601_seconds_live(offer.expires_at, now)) return 'expired';
51
53
  return 'pending';
52
54
  };
53
55
 
@@ -1 +1 @@
1
- {"version":3,"file":"RoleGrantOfferHistory.svelte.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/ui/RoleGrantOfferHistory.svelte"],"names":[],"mappings":"AAmBA,OAAO,EAA6C,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAE/F,KAAK,gBAAgB,GAAI;IACxB,oFAAoF;IACpF,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,YAAY,CAAC,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,MAAM,CAAC;IACjD;;;;OAIG;IACH,YAAY,CAAC,EAAE,WAAW,CAAC;IAC3B,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;CACvC,CAAC;AAkGH,QAAA,MAAM,qBAAqB,sDAAwC,CAAC;AACpE,KAAK,qBAAqB,GAAG,UAAU,CAAC,OAAO,qBAAqB,CAAC,CAAC;AACtE,eAAe,qBAAqB,CAAC"}
1
+ {"version":3,"file":"RoleGrantOfferHistory.svelte.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/ui/RoleGrantOfferHistory.svelte"],"names":[],"mappings":"AAoBA,OAAO,EAA6C,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAE/F,KAAK,gBAAgB,GAAI;IACxB,oFAAoF;IACpF,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,YAAY,CAAC,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,MAAM,CAAC;IACjD;;;;OAIG;IACH,YAAY,CAAC,EAAE,WAAW,CAAC;IAC3B,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;CACvC,CAAC;AAoGH,QAAA,MAAM,qBAAqB,sDAAwC,CAAC;AACpE,KAAK,qBAAqB,GAAG,UAAU,CAAC,OAAO,qBAAqB,CAAC,CAAC;AACtE,eAAe,qBAAqB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"role_grant_offers_state.svelte.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/ui/role_grant_offers_state.svelte.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"role_grant_offers_state.svelte.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/ui/role_grant_offers_state.svelte.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAIH,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAEnD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAU7E;;;;GAIG;AACH,eAAO,MAAM,+BAA+B;;;;CAAyC,CAAC;AAEtF;;;;;GAKG;AACH,MAAM,WAAW,kBAAkB;IAClC,IAAI,EAAE,MAAM,OAAO,CAAC;QAAE,MAAM,EAAE,KAAK,CAAC,kBAAkB,CAAC,CAAA;KAAE,CAAC,CAAC;IAC3D,OAAO,EAAE,CAAC,OAAO,CAAC,EAAE;QACnB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;KAChB,KAAK,OAAO,CAAC;QAAE,MAAM,EAAE,KAAK,CAAC,kBAAkB,CAAC,CAAA;KAAE,CAAC,CAAC;IACrD,MAAM,EAAE,CAAC,MAAM,EAAE;QAChB,aAAa,EAAE,MAAM,CAAC;QACtB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAC5B,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QACzB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;KACxB,KAAK,OAAO,CAAC;QAAE,KAAK,EAAE,kBAAkB,CAAA;KAAE,CAAC,CAAC;IAC7C,MAAM,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC;QACrC,aAAa,EAAE,MAAM,CAAC;QACtB,KAAK,EAAE,kBAAkB,CAAC;QAC1B,oBAAoB,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;KACpC,CAAC,CAAC;IACH,OAAO,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,KAAK,OAAO,CAAC;QAAE,EAAE,EAAE,IAAI,CAAA;KAAE,CAAC,CAAC;IAC7E,OAAO,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC;QAAE,EAAE,EAAE,IAAI,CAAA;KAAE,CAAC,CAAC;CACrD;AAED,yFAAyF;AACzF,MAAM,WAAW,0BAA0B;IAC1C,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;CAChB;AAED,qFAAqF;AACrF,MAAM,MAAM,uBAAuB,GAAG,CACrC,OAAO,EAAE,CAAC,YAAY,EAAE,0BAA0B,KAAK,IAAI,KACvD,MAAM,IAAI,CAAC;AAEhB,MAAM,WAAW,2BAA2B;IAC3C,GAAG,EAAE,kBAAkB,CAAC;IACxB,oFAAoF;IACpF,UAAU,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC;IAChC;;;OAGG;IACH,QAAQ,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC;CAC9B;AAQD,qBAAa,oBAAoB;;IAKhC,QAAQ,CAAC,IAAI,0BAAyB;IACtC,QAAQ,CAAC,YAAY,0BAAyB;IAC9C,QAAQ,CAAC,MAAM;;;;;;;;;;;;;;;;;eAAuC;IACtD,QAAQ,CAAC,MAAM,0BAAyB;IACxC,QAAQ,CAAC,OAAO,0BAAyB;IACzC,QAAQ,CAAC,OAAO,0BAAyB;IAIzC,sEAAsE;IACtE,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,kBAAkB,CAAC,CAezC;IAEH,mEAAmE;IACnE,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,kBAAkB,CAAC,CAczC;IAEH,qFAAqF;IACrF,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC,kBAAkB,CAAC,CAIxC;IAEH,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAkC;gBAErD,OAAO,EAAE,2BAA2B;IAMhD,4DAA4D;IACtD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAO5B,6DAA6D;IACvD,aAAa,CAAC,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAOjF;;;;;;OAMG;IACG,aAAa,CAAC,MAAM,EAAE;QAC3B,aAAa,EAAE,MAAM,CAAC;QACtB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAC5B,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QACzB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;KACxB,GAAG,OAAO,CAAC,kBAAkB,GAAG,SAAS,CAAC;IAQ3C,qGAAqG;IAC/F,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAa9C,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAOvE,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOrD;;;OAGG;IACH,SAAS,CAAC,YAAY,EAAE,uBAAuB,GAAG,MAAM,IAAI;IAM5D;;;;;;OAMG;IACH,kBAAkB,CAAC,YAAY,EAAE,0BAA0B,GAAG,IAAI;IAwBlE,4CAA4C;IAC5C,KAAK,IAAI,IAAI;CAwBb"}
@@ -26,6 +26,7 @@
26
26
  */
27
27
  import { create_context } from '@fuzdev/fuz_ui/context_helpers.ts';
28
28
  import { AsyncSlot } from './async_slot.svelte.js';
29
+ import { is_iso8601_seconds_live } from '../timestamp.js';
29
30
  import { ROLE_GRANT_OFFER_ACCEPTED_NOTIFICATION_METHOD, ROLE_GRANT_OFFER_DECLINED_NOTIFICATION_METHOD, ROLE_GRANT_OFFER_RECEIVED_NOTIFICATION_METHOD, ROLE_GRANT_OFFER_RETRACTED_NOTIFICATION_METHOD, ROLE_GRANT_OFFER_SUPERSEDE_NOTIFICATION_METHOD, ROLE_GRANT_REVOKE_NOTIFICATION_METHOD } from '../auth/role_grant_offer_notifications.js';
30
31
  /**
31
32
  * Svelte context for `RoleGrantOffersState`.
@@ -60,7 +61,9 @@ export class RoleGrantOffersState {
60
61
  continue;
61
62
  if (is_terminal(o))
62
63
  continue;
63
- if (Date.parse(o.expires_at) <= now)
64
+ // end-of-second rule, so the inbox never hides an offer the server's
65
+ // raw-column `expires_at > NOW()` gate would still accept
66
+ if (!is_iso8601_seconds_live(o.expires_at, now))
64
67
  continue;
65
68
  rows.push(o);
66
69
  }
@@ -79,7 +82,8 @@ export class RoleGrantOffersState {
79
82
  continue;
80
83
  if (is_terminal(o))
81
84
  continue;
82
- if (Date.parse(o.expires_at) <= now)
85
+ // end-of-second comparison, see `incoming`
86
+ if (!is_iso8601_seconds_live(o.expires_at, now))
83
87
  continue;
84
88
  rows.push(o);
85
89
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fuzdev/fuz_app",
3
- "version": "0.111.0",
3
+ "version": "0.112.0",
4
4
  "description": "fullstack app library",
5
5
  "glyph": "🗝",
6
6
  "logo": "logo.svg",