@hexclave/shared 1.0.9 → 1.0.11

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 (86) hide show
  1. package/dist/ai/unified-prompts/reminders.js +1 -0
  2. package/dist/ai/unified-prompts/reminders.js.map +1 -1
  3. package/dist/ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt.d.ts.map +1 -1
  4. package/dist/ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt.js +10 -2
  5. package/dist/ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt.js.map +1 -1
  6. package/dist/config/schema.d.ts +175 -175
  7. package/dist/config-rendering.d.ts.map +1 -1
  8. package/dist/config-rendering.js +7 -2
  9. package/dist/config-rendering.js.map +1 -1
  10. package/dist/esm/ai/unified-prompts/reminders.js +1 -0
  11. package/dist/esm/ai/unified-prompts/reminders.js.map +1 -1
  12. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt.d.ts.map +1 -1
  13. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt.js +10 -2
  14. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt.js.map +1 -1
  15. package/dist/esm/config/schema.d.ts +175 -175
  16. package/dist/esm/config-rendering.d.ts.map +1 -1
  17. package/dist/esm/config-rendering.js +7 -2
  18. package/dist/esm/config-rendering.js.map +1 -1
  19. package/dist/esm/hexclave-config-file.d.ts.map +1 -1
  20. package/dist/esm/hexclave-config-file.js +2 -1
  21. package/dist/esm/hexclave-config-file.js.map +1 -1
  22. package/dist/esm/interface/admin-interface.d.ts +9 -1
  23. package/dist/esm/interface/admin-interface.d.ts.map +1 -1
  24. package/dist/esm/interface/admin-interface.js +32 -2
  25. package/dist/esm/interface/admin-interface.js.map +1 -1
  26. package/dist/esm/interface/admin-metrics.d.ts +123 -7
  27. package/dist/esm/interface/admin-metrics.d.ts.map +1 -1
  28. package/dist/esm/interface/admin-metrics.js +21 -2
  29. package/dist/esm/interface/admin-metrics.js.map +1 -1
  30. package/dist/esm/interface/conversations.d.ts +27 -27
  31. package/dist/esm/interface/crud/current-user.d.ts +6 -6
  32. package/dist/esm/interface/crud/email-outbox.d.ts +228 -228
  33. package/dist/esm/interface/crud/invoices.d.ts +2 -2
  34. package/dist/esm/interface/crud/project-api-keys.d.ts +2 -2
  35. package/dist/esm/interface/crud/projects.d.ts +99 -99
  36. package/dist/esm/interface/crud/team-member-profiles.d.ts +16 -16
  37. package/dist/esm/interface/crud/users.d.ts +2 -2
  38. package/dist/esm/schema-fields.d.ts.map +1 -1
  39. package/dist/esm/schema-fields.js +1 -1
  40. package/dist/esm/schema-fields.js.map +1 -1
  41. package/dist/esm/sessions.d.ts +10 -0
  42. package/dist/esm/sessions.d.ts.map +1 -1
  43. package/dist/esm/sessions.js +20 -2
  44. package/dist/esm/sessions.js.map +1 -1
  45. package/dist/esm/sessions.test.d.ts +1 -0
  46. package/dist/esm/sessions.test.js +178 -0
  47. package/dist/esm/sessions.test.js.map +1 -0
  48. package/dist/hexclave-config-file.d.ts.map +1 -1
  49. package/dist/hexclave-config-file.js +2 -1
  50. package/dist/hexclave-config-file.js.map +1 -1
  51. package/dist/interface/admin-interface.d.ts +9 -1
  52. package/dist/interface/admin-interface.d.ts.map +1 -1
  53. package/dist/interface/admin-interface.js +32 -2
  54. package/dist/interface/admin-interface.js.map +1 -1
  55. package/dist/interface/admin-metrics.d.ts +123 -7
  56. package/dist/interface/admin-metrics.d.ts.map +1 -1
  57. package/dist/interface/admin-metrics.js +22 -1
  58. package/dist/interface/admin-metrics.js.map +1 -1
  59. package/dist/interface/conversations.d.ts +27 -27
  60. package/dist/interface/crud/current-user.d.ts +6 -6
  61. package/dist/interface/crud/email-outbox.d.ts +228 -228
  62. package/dist/interface/crud/invoices.d.ts +2 -2
  63. package/dist/interface/crud/project-api-keys.d.ts +2 -2
  64. package/dist/interface/crud/projects.d.ts +99 -99
  65. package/dist/interface/crud/team-member-profiles.d.ts +16 -16
  66. package/dist/interface/crud/users.d.ts +2 -2
  67. package/dist/schema-fields.d.ts.map +1 -1
  68. package/dist/schema-fields.js +1 -1
  69. package/dist/schema-fields.js.map +1 -1
  70. package/dist/sessions.d.ts +10 -0
  71. package/dist/sessions.d.ts.map +1 -1
  72. package/dist/sessions.js +20 -2
  73. package/dist/sessions.js.map +1 -1
  74. package/dist/sessions.test.d.ts +1 -0
  75. package/dist/sessions.test.js +178 -0
  76. package/dist/sessions.test.js.map +1 -0
  77. package/package.json +1 -1
  78. package/src/ai/unified-prompts/reminders.ts +1 -0
  79. package/src/ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt.ts +10 -2
  80. package/src/config-rendering.ts +11 -2
  81. package/src/hexclave-config-file.ts +7 -1
  82. package/src/interface/admin-interface.ts +49 -2
  83. package/src/interface/admin-metrics.ts +33 -2
  84. package/src/schema-fields.ts +4 -1
  85. package/src/sessions.test.ts +147 -0
  86. package/src/sessions.ts +26 -0
package/src/sessions.ts CHANGED
@@ -124,6 +124,14 @@ export class InternalSession {
124
124
  if (ofTokens.refreshToken) {
125
125
  return `refresh-${ofTokens.refreshToken}`;
126
126
  } else if (ofTokens.accessToken) {
127
+ // Access-only sessions (no refresh token) are keyed by the underlying session's `refresh_token_id`, not the
128
+ // access token string: access tokens get re-minted frequently, and keying by the raw token would spawn a new
129
+ // session (and cold-invalidate every session-scoped cache) on each refresh. Falls back to the raw token if
130
+ // the JWT can't be decoded.
131
+ const refreshTokenId = decodeAccessTokenIfValid(ofTokens.accessToken)?.refresh_token_id;
132
+ if (refreshTokenId) {
133
+ return `access-session-${refreshTokenId}`;
134
+ }
127
135
  return `access-${ofTokens.accessToken}`;
128
136
  } else {
129
137
  return "not-logged-in";
@@ -210,6 +218,24 @@ export class InternalSession {
210
218
  return accessToken ? { accessToken, refreshToken: this._refreshToken } : null;
211
219
  }
212
220
 
221
+ /**
222
+ * Installs a freshly obtained token pair's access token into this session in place, keeping the session object
223
+ * (and therefore every session-scoped cache) stable instead of constructing a new InternalSession. No-op if the
224
+ * session is invalid, the access token can't be decoded, it's unchanged, or the pair doesn't map to this session
225
+ * (so a foreign token can never be written into this object's cache); never clears an existing token.
226
+ */
227
+ updateAccessToken(tokens: { accessToken: string | null, refreshToken: string | null }) {
228
+ if (this._knownToBeInvalid.get()) return;
229
+ if (!tokens.accessToken) return;
230
+ const newAccessToken = AccessToken.createIfValid(tokens.accessToken);
231
+ if (!newAccessToken) return;
232
+ // Self-enforce the "a session never changes which session it belongs to" invariant: only install a token pair
233
+ // that maps to this same session key (validated against the incoming pair, not this session's existing tokens).
234
+ if (InternalSession.calculateSessionKey(tokens) !== this.sessionKey) return;
235
+ if (this._accessToken.get()?.token === newAccessToken.token) return;
236
+ this._accessToken.set(newAccessToken);
237
+ }
238
+
213
239
  /**
214
240
  * Manually mark the access token as expired, even if the date on its payload may still be valid.
215
241
  *