@sentry/junior 0.101.0 → 0.102.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 (65) hide show
  1. package/dist/{agent-hooks-V6KU7PQN.js → agent-hooks-I4I2DHSW.js} +7 -7
  2. package/dist/api/people/schema.d.ts +13 -0
  3. package/dist/api/schema.d.ts +1 -1
  4. package/dist/api/schema.js +1 -1
  5. package/dist/api.js +14 -14
  6. package/dist/app.js +64 -53
  7. package/dist/{catalog-runtime-PFHVMHDR.js → catalog-runtime-5CVM2DOF.js} +2 -2
  8. package/dist/chat/agent/prompt.d.ts +1 -1
  9. package/dist/chat/agent-dispatch/validation.d.ts +1 -1
  10. package/dist/chat/conversation-privacy.d.ts +2 -6
  11. package/dist/chat/credentials/context.d.ts +33 -6
  12. package/dist/chat/credentials/subject.d.ts +15 -1
  13. package/dist/chat/logging.d.ts +4 -2
  14. package/dist/chat/mcp/tool-manager.d.ts +1 -1
  15. package/dist/chat/sandbox/egress/schemas.d.ts +13 -2
  16. package/dist/chat/services/context-compaction-marker.d.ts +8 -0
  17. package/dist/{chunk-XJA7BPHS.js → chunk-3OABPOHR.js} +3 -3
  18. package/dist/{chunk-EBFJOOUE.js → chunk-3UK5DFKW.js} +2 -2
  19. package/dist/{chunk-DBPLXSBK.js → chunk-4YN2ZXKB.js} +9 -1
  20. package/dist/{chunk-XVR4O24H.js → chunk-5K4N73TP.js} +4 -4
  21. package/dist/{chunk-LMJPRYHP.js → chunk-77LHNQK4.js} +32 -8
  22. package/dist/{chunk-I35CTGPO.js → chunk-AEWZ7F65.js} +41 -17
  23. package/dist/{chunk-IQIBZXGB.js → chunk-B5QS4AVO.js} +2 -2
  24. package/dist/{chunk-L2JIOAA2.js → chunk-DTUSCR2Y.js} +8 -11
  25. package/dist/{chunk-GEUUJRQF.js → chunk-E4EMFKGB.js} +1 -1
  26. package/dist/{chunk-VVIXK2BX.js → chunk-EMUZSROX.js} +2 -2
  27. package/dist/{chunk-IVXL57YF.js → chunk-EOB77KME.js} +4 -4
  28. package/dist/{chunk-PGGEOCQY.js → chunk-F4CQEUTP.js} +1 -1
  29. package/dist/{chunk-FP5N5OWZ.js → chunk-IQ36I3DF.js} +2 -2
  30. package/dist/{chunk-JSAANELJ.js → chunk-LJB2TLVT.js} +3 -3
  31. package/dist/{chunk-D5KZYS4T.js → chunk-MJSJAHBW.js} +1 -1
  32. package/dist/{chunk-VFBFK6EY.js → chunk-MR6H67P2.js} +2 -2
  33. package/dist/{chunk-5VGJJSSV.js → chunk-NSP6OGL2.js} +5 -5
  34. package/dist/{chunk-VHRM6GNH.js → chunk-QZGVPPIJ.js} +27 -3
  35. package/dist/{chunk-LVA4I4H7.js → chunk-RT5BUHR5.js} +15 -44
  36. package/dist/{chunk-A7X2FDUO.js → chunk-SHBPSE7A.js} +88 -66
  37. package/dist/{chunk-CM5EZD5F.js → chunk-UIE3R5XU.js} +1 -1
  38. package/dist/{chunk-JPQISMMJ.js → chunk-VSAFV2GI.js} +7 -6
  39. package/dist/{chunk-3ECW2K2O.js → chunk-WR7H7VLJ.js} +2 -2
  40. package/dist/{chunk-TPTJEHUE.js → chunk-X2IPNCB5.js} +61 -25
  41. package/dist/{chunk-UWGTSF5O.js → chunk-ZIX4PNBI.js} +129 -91
  42. package/dist/{chunk-PWC24W5F.js → chunk-ZSHL44IQ.js} +2 -2
  43. package/dist/cli/chat.js +21 -21
  44. package/dist/cli/check.js +3 -3
  45. package/dist/cli/plugins.js +9 -9
  46. package/dist/cli/snapshot-warmup.js +5 -5
  47. package/dist/cli/upgrade.js +85 -13
  48. package/dist/db/postgres-json.d.ts +5 -0
  49. package/dist/{db-RCZB7KNM.js → db-6QP6HY7U.js} +4 -4
  50. package/dist/{detail-4EPUMSDU.js → detail-OEIVZYXS.js} +11 -11
  51. package/dist/{detail-CD4SPJ4K.js → detail-U6IP2Z4N.js} +6 -6
  52. package/dist/instrumentation.js +2 -2
  53. package/dist/{legacy-import-VCYLWT2V.js → legacy-import-R3BMM2GH.js} +5 -5
  54. package/dist/{list-J6ROVH56.js → list-AJ6RWBOG.js} +7 -7
  55. package/dist/list-UMZKA5AI.js +121 -0
  56. package/dist/{list-7L5LY2WU.js → list-Z3CC52CZ.js} +6 -6
  57. package/dist/{plugin-conversations-JANXC4GA.js → plugin-conversations-F3IBVNFX.js} +7 -7
  58. package/dist/{profile-6NRWEKMZ.js → profile-CQMPFKED.js} +7 -7
  59. package/dist/{runner-CZIKSWGC.js → runner-C2ZTIOUD.js} +12 -12
  60. package/dist/{skills-MAZXZ2KE.js → skills-722AXRV5.js} +3 -3
  61. package/dist/{stats-Q5FRUXLY.js → stats-ZYFQFCTL.js} +5 -5
  62. package/dist/{subagent-YIINCFAS.js → subagent-X3ZWJHR4.js} +10 -10
  63. package/dist/{validation-FMEAEKCY.js → validation-EUI2UFRM.js} +3 -3
  64. package/package.json +5 -5
  65. package/dist/list-DA2ATOM4.js +0 -80
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  validatePluginEgressCredentialHooks,
3
3
  validatePluginRegistrations
4
- } from "../chunk-D5KZYS4T.js";
4
+ } from "../chunk-MJSJAHBW.js";
5
5
  import {
6
6
  pluginCatalogConfigFromPluginSet,
7
7
  pluginCliRegistrationsFromPluginSet,
@@ -13,24 +13,24 @@ import {
13
13
  import {
14
14
  setPlugins,
15
15
  validatePlugins
16
- } from "../chunk-TPTJEHUE.js";
17
- import "../chunk-FP5N5OWZ.js";
16
+ } from "../chunk-X2IPNCB5.js";
17
+ import "../chunk-IQ36I3DF.js";
18
18
  import {
19
19
  createPluginLogger
20
- } from "../chunk-PWC24W5F.js";
20
+ } from "../chunk-ZSHL44IQ.js";
21
21
  import {
22
22
  getDb
23
- } from "../chunk-VHRM6GNH.js";
23
+ } from "../chunk-QZGVPPIJ.js";
24
24
  import "../chunk-G3E7SCME.js";
25
25
  import "../chunk-4ZNGQH7C.js";
26
- import "../chunk-A7X2FDUO.js";
26
+ import "../chunk-SHBPSE7A.js";
27
27
  import "../chunk-FXFQNHRU.js";
28
- import "../chunk-LVA4I4H7.js";
28
+ import "../chunk-RT5BUHR5.js";
29
29
  import "../chunk-B7PUBQQM.js";
30
30
  import {
31
31
  pluginCatalogRuntime
32
- } from "../chunk-LMJPRYHP.js";
33
- import "../chunk-I35CTGPO.js";
32
+ } from "../chunk-77LHNQK4.js";
33
+ import "../chunk-AEWZ7F65.js";
34
34
  import "../chunk-OB42YVAE.js";
35
35
  import "../chunk-6GWA276C.js";
36
36
  import "../chunk-B3IT5END.js";
@@ -1,16 +1,16 @@
1
1
  import {
2
2
  resolveRuntimeDependencySnapshot
3
- } from "../chunk-XJA7BPHS.js";
3
+ } from "../chunk-3OABPOHR.js";
4
4
  import "../chunk-G3E7SCME.js";
5
5
  import "../chunk-4ZNGQH7C.js";
6
6
  import {
7
7
  disconnectStateAdapter
8
- } from "../chunk-A7X2FDUO.js";
9
- import "../chunk-LVA4I4H7.js";
8
+ } from "../chunk-SHBPSE7A.js";
9
+ import "../chunk-RT5BUHR5.js";
10
10
  import {
11
11
  pluginCatalogRuntime
12
- } from "../chunk-LMJPRYHP.js";
13
- import "../chunk-I35CTGPO.js";
12
+ } from "../chunk-77LHNQK4.js";
13
+ import "../chunk-AEWZ7F65.js";
14
14
  import "../chunk-OB42YVAE.js";
15
15
  import "../chunk-6GWA276C.js";
16
16
  import "../chunk-B3IT5END.js";
@@ -4,7 +4,7 @@ import {
4
4
  recordConversationActivity,
5
5
  recordConversationExecution,
6
6
  requestConversationWork
7
- } from "../chunk-EBFJOOUE.js";
7
+ } from "../chunk-3UK5DFKW.js";
8
8
  import {
9
9
  defineJuniorPlugins,
10
10
  pluginCatalogConfigFromEnv,
@@ -18,11 +18,11 @@ import {
18
18
  import {
19
19
  addAgentTurnUsage,
20
20
  listAgentTurnSessionSummariesForConversations
21
- } from "../chunk-IVXL57YF.js";
22
- import "../chunk-IQIBZXGB.js";
21
+ } from "../chunk-EOB77KME.js";
22
+ import "../chunk-B5QS4AVO.js";
23
23
  import {
24
24
  importConversationFromLegacy
25
- } from "../chunk-JPQISMMJ.js";
25
+ } from "../chunk-VSAFV2GI.js";
26
26
  import "../chunk-PDO5BLNM.js";
27
27
  import {
28
28
  loadAppPluginSet
@@ -30,28 +30,28 @@ import {
30
30
  import {
31
31
  createPluginLogger,
32
32
  createPluginState
33
- } from "../chunk-PWC24W5F.js";
33
+ } from "../chunk-ZSHL44IQ.js";
34
34
  import {
35
35
  createJuniorSqlExecutor,
36
36
  createSqlConversationMessageStore,
37
37
  createSqlStore,
38
38
  getDb
39
- } from "../chunk-VHRM6GNH.js";
39
+ } from "../chunk-QZGVPPIJ.js";
40
40
  import {
41
41
  disconnectStateAdapter,
42
42
  getChatConfig,
43
43
  getConnectedStateContext
44
- } from "../chunk-A7X2FDUO.js";
44
+ } from "../chunk-SHBPSE7A.js";
45
45
  import "../chunk-FXFQNHRU.js";
46
- import "../chunk-LVA4I4H7.js";
46
+ import "../chunk-RT5BUHR5.js";
47
47
  import {
48
48
  parseDestination,
49
49
  sameDestination
50
50
  } from "../chunk-B7PUBQQM.js";
51
51
  import {
52
52
  pluginCatalogRuntime
53
- } from "../chunk-LMJPRYHP.js";
54
- import "../chunk-I35CTGPO.js";
53
+ } from "../chunk-77LHNQK4.js";
54
+ import "../chunk-AEWZ7F65.js";
55
55
  import {
56
56
  isRecord,
57
57
  toOptionalNumber,
@@ -450,6 +450,7 @@ var pluginStorageMigration = {
450
450
  // src/chat/plugins/migrations.ts
451
451
  import { createHash } from "crypto";
452
452
  import { readMigrationFiles as readMigrationFiles2 } from "drizzle-orm/migrator";
453
+ var LEGACY_SCHEDULER_BASELINE_HASH = "d1d2f712181dd3a0557808f0fc67fd0722691d25f4c8cfb816b77c71d19e1e42";
453
454
  function migrationTable(pluginName) {
454
455
  const label = pluginName.toLowerCase().replace(/[^a-z0-9]+/g, "_").replace(/^_+|_+$/g, "").slice(0, 32);
455
456
  const hash = createHash("sha256").update(pluginName).digest("hex").slice(0, 8);
@@ -487,7 +488,7 @@ async function legacyMigrationHashes(executor, pluginName) {
487
488
  );
488
489
  return new Set(rows.map((row) => row.checksum));
489
490
  }
490
- function adoptedMigration(migrations, legacyHashes) {
491
+ function adoptedMigration(migrations, legacyHashes, pluginName) {
491
492
  let adopted;
492
493
  for (const migration of migrations) {
493
494
  if (!legacyHashes.has(migration.hash)) {
@@ -495,7 +496,7 @@ function adoptedMigration(migrations, legacyHashes) {
495
496
  }
496
497
  adopted = migration;
497
498
  }
498
- if (!adopted && migrations.length === 1 && legacyHashes.size > 0) {
499
+ if (!adopted && pluginName === "scheduler" && legacyHashes.has(LEGACY_SCHEDULER_BASELINE_HASH)) {
499
500
  return migrations[0];
500
501
  }
501
502
  return adopted;
@@ -505,7 +506,11 @@ async function adoptLegacyMigrationState2(args) {
505
506
  args.executor,
506
507
  args.pluginName
507
508
  );
508
- const migration = adoptedMigration(args.migrations, legacyHashes);
509
+ const migration = adoptedMigration(
510
+ args.migrations,
511
+ legacyHashes,
512
+ args.pluginName
513
+ );
509
514
  if (!migration) {
510
515
  return void 0;
511
516
  }
@@ -1127,12 +1132,65 @@ import { THREAD_STATE_TTL_MS } from "chat";
1127
1132
  var AGENT_TURN_SESSION_PREFIX2 = "junior:agent_turn_session";
1128
1133
  var AGENT_TURN_SESSION_INDEX_KEY2 = `${AGENT_TURN_SESSION_PREFIX2}:index`;
1129
1134
  var AGENT_TURN_SESSION_INDEX_MAX_LENGTH = 5e3;
1135
+ var REDIS_SCAN_COUNT = 500;
1130
1136
  function conversationIndexKey(conversationId) {
1131
1137
  return `${AGENT_TURN_SESSION_PREFIX2}:conversation:${conversationId}:index`;
1132
1138
  }
1133
1139
  function sessionRecordKey(conversationId, sessionId) {
1134
1140
  return `${AGENT_TURN_SESSION_PREFIX2}:${conversationId}:${sessionId}`;
1135
1141
  }
1142
+ function logicalConversationIndexPrefix() {
1143
+ const prefix = getChatConfig().state.keyPrefix;
1144
+ return [
1145
+ ...prefix ? [prefix] : [],
1146
+ `${AGENT_TURN_SESSION_PREFIX2}:conversation:`
1147
+ ].join(":");
1148
+ }
1149
+ function conversationIdFromRedisListKey(key) {
1150
+ const marker = `:list:${logicalConversationIndexPrefix()}`;
1151
+ const markerIndex = key.indexOf(marker);
1152
+ if (markerIndex < 0 || !key.endsWith(":index")) {
1153
+ return void 0;
1154
+ }
1155
+ return toOptionalString(
1156
+ key.slice(markerIndex + marker.length, -":index".length)
1157
+ );
1158
+ }
1159
+ async function discoverRedisConversationIds(redisStateAdapter) {
1160
+ const client = redisStateAdapter?.getClient();
1161
+ if (!client) {
1162
+ return [];
1163
+ }
1164
+ const conversationIds = /* @__PURE__ */ new Set();
1165
+ const match = `*:list:${logicalConversationIndexPrefix()}*:index`;
1166
+ let cursor = "0";
1167
+ do {
1168
+ const reply = await client.sendCommand([
1169
+ "SCAN",
1170
+ cursor,
1171
+ "MATCH",
1172
+ match,
1173
+ "COUNT",
1174
+ String(REDIS_SCAN_COUNT)
1175
+ ]);
1176
+ if (!Array.isArray(reply) || reply.length !== 2 || typeof reply[0] !== "string" && typeof reply[0] !== "number" || !Array.isArray(reply[1])) {
1177
+ throw new Error(
1178
+ "Unexpected Redis SCAN response while migrating turn sessions"
1179
+ );
1180
+ }
1181
+ cursor = String(reply[0]);
1182
+ for (const key of reply[1]) {
1183
+ if (typeof key !== "string") {
1184
+ continue;
1185
+ }
1186
+ const conversationId = conversationIdFromRedisListKey(key);
1187
+ if (conversationId) {
1188
+ conversationIds.add(conversationId);
1189
+ }
1190
+ }
1191
+ } while (cursor !== "0");
1192
+ return [...conversationIds];
1193
+ }
1136
1194
  function migrateRequesterToActor(value) {
1137
1195
  if (!isRecord(value) || value.requester === void 0) {
1138
1196
  return { changed: false, value };
@@ -1191,6 +1249,11 @@ async function migrateAgentTurnSessionActor(context) {
1191
1249
  result.migrated += global.migrated;
1192
1250
  const conversations = /* @__PURE__ */ new Set();
1193
1251
  const sessions = /* @__PURE__ */ new Set();
1252
+ for (const conversationId of await discoverRedisConversationIds(
1253
+ context.redisStateAdapter
1254
+ )) {
1255
+ conversations.add(conversationId);
1256
+ }
1194
1257
  for (const value of global.values) {
1195
1258
  if (!isRecord(value)) {
1196
1259
  continue;
@@ -1212,6 +1275,15 @@ async function migrateAgentTurnSessionActor(context) {
1212
1275
  });
1213
1276
  result.scanned += conversation.values.length;
1214
1277
  result.migrated += conversation.migrated;
1278
+ for (const value of conversation.values) {
1279
+ if (!isRecord(value)) {
1280
+ continue;
1281
+ }
1282
+ const sessionId = toOptionalString(value.sessionId);
1283
+ if (sessionId) {
1284
+ sessions.add(`${conversationId}\0${sessionId}`);
1285
+ }
1286
+ }
1215
1287
  }
1216
1288
  for (const session of sessions) {
1217
1289
  const separator = session.indexOf("\0");
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Replace actual NUL characters that PostgreSQL cannot store in JSONB.
3
+ * Literal `\\u0000` text is preserved because it contains no NUL character.
4
+ */
5
+ export declare function sanitizePostgresJson<T>(value: T): T;
@@ -6,12 +6,12 @@ import {
6
6
  getConversationStore,
7
7
  getDb,
8
8
  getSqlExecutor
9
- } from "./chunk-VHRM6GNH.js";
10
- import "./chunk-A7X2FDUO.js";
9
+ } from "./chunk-QZGVPPIJ.js";
10
+ import "./chunk-SHBPSE7A.js";
11
11
  import "./chunk-FXFQNHRU.js";
12
- import "./chunk-LVA4I4H7.js";
12
+ import "./chunk-RT5BUHR5.js";
13
13
  import "./chunk-B7PUBQQM.js";
14
- import "./chunk-I35CTGPO.js";
14
+ import "./chunk-AEWZ7F65.js";
15
15
  import "./chunk-OB42YVAE.js";
16
16
  import "./chunk-6GWA276C.js";
17
17
  import "./chunk-7FBGKXPE.js";
@@ -1,30 +1,30 @@
1
1
  import {
2
2
  buildConversationDetail
3
- } from "./chunk-5VGJJSSV.js";
3
+ } from "./chunk-NSP6OGL2.js";
4
4
  import {
5
5
  readConversationRecordFromSql
6
- } from "./chunk-JSAANELJ.js";
6
+ } from "./chunk-LJB2TLVT.js";
7
7
  import {
8
8
  conversationDetailReportSchema
9
9
  } from "./chunk-HYDQULR2.js";
10
10
  import "./chunk-LVUKF5CE.js";
11
- import "./chunk-VVIXK2BX.js";
11
+ import "./chunk-EMUZSROX.js";
12
12
  import {
13
13
  listBoundedAgentTurnSessionSummariesForConversation
14
- } from "./chunk-IVXL57YF.js";
15
- import "./chunk-IQIBZXGB.js";
16
- import "./chunk-JPQISMMJ.js";
14
+ } from "./chunk-EOB77KME.js";
15
+ import "./chunk-B5QS4AVO.js";
16
+ import "./chunk-VSAFV2GI.js";
17
17
  import "./chunk-PDO5BLNM.js";
18
- import "./chunk-FP5N5OWZ.js";
19
- import "./chunk-VHRM6GNH.js";
18
+ import "./chunk-IQ36I3DF.js";
19
+ import "./chunk-QZGVPPIJ.js";
20
20
  import "./chunk-4ZNGQH7C.js";
21
- import "./chunk-A7X2FDUO.js";
21
+ import "./chunk-SHBPSE7A.js";
22
22
  import "./chunk-FXFQNHRU.js";
23
- import "./chunk-LVA4I4H7.js";
23
+ import "./chunk-RT5BUHR5.js";
24
24
  import "./chunk-B7PUBQQM.js";
25
25
  import {
26
26
  logException
27
- } from "./chunk-I35CTGPO.js";
27
+ } from "./chunk-AEWZ7F65.js";
28
28
  import "./chunk-OB42YVAE.js";
29
29
  import "./chunk-6GWA276C.js";
30
30
  import "./chunk-7FBGKXPE.js";
@@ -1,19 +1,19 @@
1
1
  import {
2
2
  readLocationDetailFromSql
3
- } from "./chunk-VFBFK6EY.js";
3
+ } from "./chunk-MR6H67P2.js";
4
4
  import "./chunk-QOZOJNSE.js";
5
- import "./chunk-PGGEOCQY.js";
5
+ import "./chunk-F4CQEUTP.js";
6
6
  import {
7
7
  locationDetailReportSchema
8
8
  } from "./chunk-HNIT4HXU.js";
9
9
  import "./chunk-HYDQULR2.js";
10
10
  import "./chunk-PDO5BLNM.js";
11
- import "./chunk-VHRM6GNH.js";
12
- import "./chunk-A7X2FDUO.js";
11
+ import "./chunk-QZGVPPIJ.js";
12
+ import "./chunk-SHBPSE7A.js";
13
13
  import "./chunk-FXFQNHRU.js";
14
- import "./chunk-LVA4I4H7.js";
14
+ import "./chunk-RT5BUHR5.js";
15
15
  import "./chunk-B7PUBQQM.js";
16
- import "./chunk-I35CTGPO.js";
16
+ import "./chunk-AEWZ7F65.js";
17
17
  import "./chunk-OB42YVAE.js";
18
18
  import "./chunk-6GWA276C.js";
19
19
  import "./chunk-7FBGKXPE.js";
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  consumePrivateTraceResultMarker
3
- } from "./chunk-CM5EZD5F.js";
3
+ } from "./chunk-UIE3R5XU.js";
4
4
  import {
5
5
  getCurrentConversationPrivacy
6
- } from "./chunk-LVA4I4H7.js";
6
+ } from "./chunk-RT5BUHR5.js";
7
7
  import "./chunk-OB42YVAE.js";
8
8
  import {
9
9
  getClient,
@@ -1,13 +1,13 @@
1
1
  import {
2
2
  ensureLegacyConversationImport,
3
3
  importConversationFromLegacy
4
- } from "./chunk-JPQISMMJ.js";
5
- import "./chunk-VHRM6GNH.js";
6
- import "./chunk-A7X2FDUO.js";
4
+ } from "./chunk-VSAFV2GI.js";
5
+ import "./chunk-QZGVPPIJ.js";
6
+ import "./chunk-SHBPSE7A.js";
7
7
  import "./chunk-FXFQNHRU.js";
8
- import "./chunk-LVA4I4H7.js";
8
+ import "./chunk-RT5BUHR5.js";
9
9
  import "./chunk-B7PUBQQM.js";
10
- import "./chunk-I35CTGPO.js";
10
+ import "./chunk-AEWZ7F65.js";
11
11
  import "./chunk-OB42YVAE.js";
12
12
  import "./chunk-6GWA276C.js";
13
13
  import "./chunk-7FBGKXPE.js";
@@ -1,19 +1,19 @@
1
1
  import {
2
2
  readConversationFeedFromSql
3
- } from "./chunk-JSAANELJ.js";
3
+ } from "./chunk-LJB2TLVT.js";
4
4
  import {
5
5
  conversationFeedSchema
6
6
  } from "./chunk-HYDQULR2.js";
7
- import "./chunk-VVIXK2BX.js";
7
+ import "./chunk-EMUZSROX.js";
8
8
  import "./chunk-PDO5BLNM.js";
9
- import "./chunk-FP5N5OWZ.js";
10
- import "./chunk-VHRM6GNH.js";
9
+ import "./chunk-IQ36I3DF.js";
10
+ import "./chunk-QZGVPPIJ.js";
11
11
  import "./chunk-4ZNGQH7C.js";
12
- import "./chunk-A7X2FDUO.js";
12
+ import "./chunk-SHBPSE7A.js";
13
13
  import "./chunk-FXFQNHRU.js";
14
- import "./chunk-LVA4I4H7.js";
14
+ import "./chunk-RT5BUHR5.js";
15
15
  import "./chunk-B7PUBQQM.js";
16
- import "./chunk-I35CTGPO.js";
16
+ import "./chunk-AEWZ7F65.js";
17
17
  import "./chunk-OB42YVAE.js";
18
18
  import "./chunk-6GWA276C.js";
19
19
  import "./chunk-7FBGKXPE.js";
@@ -0,0 +1,121 @@
1
+ import {
2
+ verifiedActorWhere
3
+ } from "./chunk-E4EMFKGB.js";
4
+ import {
5
+ conversationActiveDaysColumn,
6
+ conversationAggregateColumns,
7
+ conversationRangeColumns
8
+ } from "./chunk-F4CQEUTP.js";
9
+ import {
10
+ actorDirectoryReportSchema
11
+ } from "./chunk-4YN2ZXKB.js";
12
+ import "./chunk-HYDQULR2.js";
13
+ import "./chunk-PDO5BLNM.js";
14
+ import {
15
+ getDb,
16
+ juniorConversations,
17
+ juniorIdentities,
18
+ juniorUsers
19
+ } from "./chunk-QZGVPPIJ.js";
20
+ import "./chunk-SHBPSE7A.js";
21
+ import "./chunk-FXFQNHRU.js";
22
+ import "./chunk-RT5BUHR5.js";
23
+ import "./chunk-B7PUBQQM.js";
24
+ import "./chunk-AEWZ7F65.js";
25
+ import "./chunk-OB42YVAE.js";
26
+ import "./chunk-6GWA276C.js";
27
+ import "./chunk-7FBGKXPE.js";
28
+ import "./chunk-MLKGABMK.js";
29
+
30
+ // src/api/people/list.query.ts
31
+ import { and, eq, gte, sql } from "drizzle-orm";
32
+ var DIRECTORY_ACTIVITY_DAYS = 90;
33
+ function activityWindow(nowMs) {
34
+ const end = new Date(nowMs);
35
+ end.setUTCHours(0, 0, 0, 0);
36
+ const start = new Date(end);
37
+ start.setUTCDate(start.getUTCDate() - (DIRECTORY_ACTIVITY_DAYS - 1));
38
+ return { end, start };
39
+ }
40
+ function directoryActivityDays(rows, nowMs) {
41
+ const days = new Map(rows.map((row) => [row.date, row]));
42
+ const { end, start } = activityWindow(nowMs);
43
+ const items = [];
44
+ for (const cursor = new Date(start); cursor.getTime() <= end.getTime(); cursor.setUTCDate(cursor.getUTCDate() + 1)) {
45
+ const date = cursor.toISOString().slice(0, 10);
46
+ items.push(days.get(date) ?? { activePeople: 0, conversations: 0, date });
47
+ }
48
+ return items;
49
+ }
50
+ async function readPeopleListFromSql() {
51
+ const nowMs = Date.now();
52
+ const { end, start } = activityWindow(nowMs);
53
+ const activityDate = sql`TO_CHAR(
54
+ ${juniorConversations.lastActivityAt} AT TIME ZONE 'UTC',
55
+ 'YYYY-MM-DD'
56
+ )`;
57
+ const [rows, activityRows] = await Promise.all([
58
+ getDb().select({
59
+ email: juniorUsers.primaryEmailNormalized,
60
+ fullName: juniorUsers.displayName,
61
+ slackUserId: sql`MAX(${juniorIdentities.providerSubjectId})`,
62
+ slackUserName: sql`MAX(${juniorIdentities.handle})`,
63
+ activeDays: conversationActiveDaysColumn(),
64
+ ...conversationAggregateColumns(),
65
+ ...conversationRangeColumns()
66
+ }).from(juniorConversations).innerJoin(
67
+ juniorIdentities,
68
+ eq(juniorIdentities.id, juniorConversations.actorIdentityId)
69
+ ).innerJoin(juniorUsers, eq(juniorUsers.id, juniorIdentities.userId)).where(verifiedActorWhere()).groupBy(juniorUsers.primaryEmailNormalized, juniorUsers.displayName),
70
+ getDb().select({
71
+ activePeople: sql`COUNT(DISTINCT ${juniorUsers.id})::int`,
72
+ conversations: sql`COUNT(*)::int`,
73
+ date: activityDate
74
+ }).from(juniorConversations).innerJoin(
75
+ juniorIdentities,
76
+ eq(juniorIdentities.id, juniorConversations.actorIdentityId)
77
+ ).innerJoin(juniorUsers, eq(juniorUsers.id, juniorIdentities.userId)).where(
78
+ and(
79
+ verifiedActorWhere(),
80
+ gte(juniorConversations.lastActivityAt, start)
81
+ )
82
+ ).groupBy(activityDate)
83
+ ]);
84
+ const people = rows.map((row) => {
85
+ const actor = {
86
+ email: row.email,
87
+ ...row.fullName ? { fullName: row.fullName } : {},
88
+ ...row.slackUserId ? { slackUserId: row.slackUserId } : {},
89
+ ...row.slackUserName ? { slackUserName: row.slackUserName } : {}
90
+ };
91
+ return {
92
+ active: row.active,
93
+ activeDays: row.activeDays,
94
+ conversations: row.conversations,
95
+ durationMs: row.durationMs,
96
+ failed: row.failed,
97
+ firstSeenAt: row.firstSeenAt.toISOString(),
98
+ lastSeenAt: row.lastSeenAt.toISOString(),
99
+ actor,
100
+ ...row.tokens !== null ? { tokens: row.tokens } : {}
101
+ };
102
+ });
103
+ return {
104
+ activityDays: directoryActivityDays(activityRows, nowMs),
105
+ generatedAt: new Date(nowMs).toISOString(),
106
+ people: people.sort(
107
+ (left, right) => Date.parse(right.lastSeenAt) - Date.parse(left.lastSeenAt) || right.conversations - left.conversations || left.actor.email.localeCompare(right.actor.email)
108
+ ),
109
+ source: "conversation_index",
110
+ windowEnd: end.toISOString(),
111
+ windowStart: start.toISOString()
112
+ };
113
+ }
114
+
115
+ // src/api/people/list.ts
116
+ async function readPeopleList() {
117
+ return actorDirectoryReportSchema.parse(await readPeopleListFromSql());
118
+ }
119
+ export {
120
+ readPeopleList
121
+ };
@@ -1,19 +1,19 @@
1
1
  import {
2
2
  readLocationDirectoryFromSql
3
- } from "./chunk-VFBFK6EY.js";
3
+ } from "./chunk-MR6H67P2.js";
4
4
  import "./chunk-QOZOJNSE.js";
5
- import "./chunk-PGGEOCQY.js";
5
+ import "./chunk-F4CQEUTP.js";
6
6
  import {
7
7
  locationDirectoryReportSchema
8
8
  } from "./chunk-HNIT4HXU.js";
9
9
  import "./chunk-HYDQULR2.js";
10
10
  import "./chunk-PDO5BLNM.js";
11
- import "./chunk-VHRM6GNH.js";
12
- import "./chunk-A7X2FDUO.js";
11
+ import "./chunk-QZGVPPIJ.js";
12
+ import "./chunk-SHBPSE7A.js";
13
13
  import "./chunk-FXFQNHRU.js";
14
- import "./chunk-LVA4I4H7.js";
14
+ import "./chunk-RT5BUHR5.js";
15
15
  import "./chunk-B7PUBQQM.js";
16
- import "./chunk-I35CTGPO.js";
16
+ import "./chunk-AEWZ7F65.js";
17
17
  import "./chunk-OB42YVAE.js";
18
18
  import "./chunk-6GWA276C.js";
19
19
  import "./chunk-7FBGKXPE.js";
@@ -1,15 +1,15 @@
1
1
  import {
2
2
  readConversationFeedFromSql
3
- } from "./chunk-JSAANELJ.js";
4
- import "./chunk-VVIXK2BX.js";
5
- import "./chunk-FP5N5OWZ.js";
6
- import "./chunk-VHRM6GNH.js";
3
+ } from "./chunk-LJB2TLVT.js";
4
+ import "./chunk-EMUZSROX.js";
5
+ import "./chunk-IQ36I3DF.js";
6
+ import "./chunk-QZGVPPIJ.js";
7
7
  import "./chunk-4ZNGQH7C.js";
8
- import "./chunk-A7X2FDUO.js";
8
+ import "./chunk-SHBPSE7A.js";
9
9
  import "./chunk-FXFQNHRU.js";
10
- import "./chunk-LVA4I4H7.js";
10
+ import "./chunk-RT5BUHR5.js";
11
11
  import "./chunk-B7PUBQQM.js";
12
- import "./chunk-I35CTGPO.js";
12
+ import "./chunk-AEWZ7F65.js";
13
13
  import "./chunk-OB42YVAE.js";
14
14
  import "./chunk-6GWA276C.js";
15
15
  import "./chunk-7FBGKXPE.js";
@@ -11,14 +11,14 @@ import {
11
11
  recentActorRows,
12
12
  statsItems,
13
13
  verifiedActorWhere
14
- } from "./chunk-GEUUJRQF.js";
14
+ } from "./chunk-E4EMFKGB.js";
15
15
  import {
16
16
  conversationActiveDaysColumn,
17
17
  conversationAggregateColumns
18
- } from "./chunk-PGGEOCQY.js";
18
+ } from "./chunk-F4CQEUTP.js";
19
19
  import {
20
20
  actorProfileReportSchema
21
- } from "./chunk-DBPLXSBK.js";
21
+ } from "./chunk-4YN2ZXKB.js";
22
22
  import "./chunk-HYDQULR2.js";
23
23
  import "./chunk-PDO5BLNM.js";
24
24
  import {
@@ -26,14 +26,14 @@ import {
26
26
  juniorConversations,
27
27
  juniorIdentities,
28
28
  juniorUsers
29
- } from "./chunk-VHRM6GNH.js";
30
- import "./chunk-A7X2FDUO.js";
29
+ } from "./chunk-QZGVPPIJ.js";
30
+ import "./chunk-SHBPSE7A.js";
31
31
  import {
32
32
  juniorDestinations
33
33
  } from "./chunk-FXFQNHRU.js";
34
- import "./chunk-LVA4I4H7.js";
34
+ import "./chunk-RT5BUHR5.js";
35
35
  import "./chunk-B7PUBQQM.js";
36
- import "./chunk-I35CTGPO.js";
36
+ import "./chunk-AEWZ7F65.js";
37
37
  import "./chunk-OB42YVAE.js";
38
38
  import "./chunk-6GWA276C.js";
39
39
  import "./chunk-7FBGKXPE.js";