@sentry/junior 0.100.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 (80) hide show
  1. package/README.md +0 -1
  2. package/dist/{agent-hooks-V6KU7PQN.js → agent-hooks-I4I2DHSW.js} +7 -7
  3. package/dist/api/conversations/schema.d.ts +2 -2
  4. package/dist/api/people/schema.d.ts +13 -0
  5. package/dist/api/schema.d.ts +1 -1
  6. package/dist/api/schema.js +3 -3
  7. package/dist/api.js +16 -16
  8. package/dist/app.js +165 -104
  9. package/dist/{catalog-runtime-PFHVMHDR.js → catalog-runtime-5CVM2DOF.js} +2 -2
  10. package/dist/chat/agent/prompt.d.ts +1 -1
  11. package/dist/chat/agent/request.d.ts +1 -1
  12. package/dist/chat/agent-dispatch/validation.d.ts +1 -1
  13. package/dist/chat/conversation-privacy.d.ts +2 -6
  14. package/dist/chat/conversations/store.d.ts +1 -1
  15. package/dist/chat/credentials/context.d.ts +33 -6
  16. package/dist/chat/credentials/subject.d.ts +15 -1
  17. package/dist/chat/logging.d.ts +4 -2
  18. package/dist/chat/mcp/auth-store.d.ts +1 -0
  19. package/dist/chat/mcp/client.d.ts +2 -0
  20. package/dist/chat/mcp/oauth-provider.d.ts +4 -1
  21. package/dist/chat/mcp/oauth.d.ts +3 -1
  22. package/dist/chat/mcp/tool-manager.d.ts +3 -1
  23. package/dist/chat/sandbox/egress/schemas.d.ts +13 -2
  24. package/dist/chat/services/context-compaction-marker.d.ts +8 -0
  25. package/dist/chat/services/mcp-auth-orchestration.d.ts +1 -1
  26. package/dist/chat/services/pending-auth.d.ts +17 -9
  27. package/dist/chat/state/conversation.d.ts +7 -3
  28. package/dist/{chunk-XJA7BPHS.js → chunk-3OABPOHR.js} +3 -3
  29. package/dist/{chunk-2T7DCRAW.js → chunk-3UK5DFKW.js} +3 -3
  30. package/dist/{chunk-IDZBM3NW.js → chunk-4YN2ZXKB.js} +10 -2
  31. package/dist/{chunk-NSOCZGOH.js → chunk-5K4N73TP.js} +9 -11
  32. package/dist/{chunk-LMJPRYHP.js → chunk-77LHNQK4.js} +32 -8
  33. package/dist/{chunk-I35CTGPO.js → chunk-AEWZ7F65.js} +41 -17
  34. package/dist/{chunk-IQIBZXGB.js → chunk-B5QS4AVO.js} +2 -2
  35. package/dist/{chunk-XSBIISXS.js → chunk-DTUSCR2Y.js} +9 -12
  36. package/dist/{chunk-GEUUJRQF.js → chunk-E4EMFKGB.js} +1 -1
  37. package/dist/{chunk-VVIXK2BX.js → chunk-EMUZSROX.js} +2 -2
  38. package/dist/{chunk-IVXL57YF.js → chunk-EOB77KME.js} +4 -4
  39. package/dist/{chunk-PGGEOCQY.js → chunk-F4CQEUTP.js} +1 -1
  40. package/dist/{chunk-4AQUWWEM.js → chunk-HNIT4HXU.js} +1 -1
  41. package/dist/{chunk-MM5UFDAC.js → chunk-HYDQULR2.js} +1 -1
  42. package/dist/{chunk-FP5N5OWZ.js → chunk-IQ36I3DF.js} +2 -2
  43. package/dist/{chunk-JSAANELJ.js → chunk-LJB2TLVT.js} +3 -3
  44. package/dist/{chunk-D5KZYS4T.js → chunk-MJSJAHBW.js} +1 -1
  45. package/dist/{chunk-QSBQJ3PA.js → chunk-MR6H67P2.js} +3 -3
  46. package/dist/{chunk-VY7BT4SM.js → chunk-NSP6OGL2.js} +9 -8
  47. package/dist/{chunk-VHRM6GNH.js → chunk-QZGVPPIJ.js} +27 -3
  48. package/dist/{chunk-LVA4I4H7.js → chunk-RT5BUHR5.js} +15 -44
  49. package/dist/{chunk-A7X2FDUO.js → chunk-SHBPSE7A.js} +88 -66
  50. package/dist/{chunk-CM5EZD5F.js → chunk-UIE3R5XU.js} +1 -1
  51. package/dist/{chunk-JPQISMMJ.js → chunk-VSAFV2GI.js} +7 -6
  52. package/dist/{chunk-3ECW2K2O.js → chunk-WR7H7VLJ.js} +2 -2
  53. package/dist/{chunk-TPTJEHUE.js → chunk-X2IPNCB5.js} +61 -25
  54. package/dist/{chunk-6DTVCPLO.js → chunk-XIMUQ4IU.js} +4 -3
  55. package/dist/{chunk-45DMFMY2.js → chunk-ZIX4PNBI.js} +348 -200
  56. package/dist/{chunk-PWC24W5F.js → chunk-ZSHL44IQ.js} +2 -2
  57. package/dist/cli/chat.js +22 -22
  58. package/dist/cli/check.js +3 -3
  59. package/dist/cli/plugins.js +9 -9
  60. package/dist/cli/snapshot-warmup.js +5 -5
  61. package/dist/cli/upgrade.js +203 -14
  62. package/dist/db/postgres-json.d.ts +5 -0
  63. package/dist/{db-RCZB7KNM.js → db-6QP6HY7U.js} +4 -4
  64. package/dist/{detail-LU6COZO6.js → detail-OEIVZYXS.js} +12 -12
  65. package/dist/{detail-5SLCGT6J.js → detail-U6IP2Z4N.js} +8 -8
  66. package/dist/instrumentation.js +2 -2
  67. package/dist/{legacy-import-VCYLWT2V.js → legacy-import-R3BMM2GH.js} +5 -5
  68. package/dist/{list-KHRAWZWU.js → list-AJ6RWBOG.js} +8 -8
  69. package/dist/list-UMZKA5AI.js +121 -0
  70. package/dist/{list-4ALSU6ZW.js → list-Z3CC52CZ.js} +8 -8
  71. package/dist/{plugin-conversations-JANXC4GA.js → plugin-conversations-F3IBVNFX.js} +7 -7
  72. package/dist/{profile-3O3OVENT.js → profile-CQMPFKED.js} +8 -8
  73. package/dist/{runner-BM7D35YW.js → runner-C2ZTIOUD.js} +13 -13
  74. package/dist/{skills-MAZXZ2KE.js → skills-722AXRV5.js} +3 -3
  75. package/dist/{stats-J3YGCYDF.js → stats-ZYFQFCTL.js} +6 -6
  76. package/dist/{subagent-P7HOSMVC.js → subagent-X3ZWJHR4.js} +11 -11
  77. package/dist/{validation-FMEAEKCY.js → validation-EUI2UFRM.js} +3 -3
  78. package/package.json +6 -6
  79. package/dist/api-reference.d.ts +0 -14
  80. package/dist/list-2FI5SFV7.js +0 -80
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  getStateAdapter
3
- } from "./chunk-A7X2FDUO.js";
3
+ } from "./chunk-SHBPSE7A.js";
4
4
  import {
5
5
  logException,
6
6
  logInfo,
7
7
  logWarn
8
- } from "./chunk-I35CTGPO.js";
8
+ } from "./chunk-AEWZ7F65.js";
9
9
 
10
10
  // src/chat/plugins/logging.ts
11
11
  function createPluginLogger(plugin) {
package/dist/cli/chat.js CHANGED
@@ -1,31 +1,31 @@
1
1
  import {
2
2
  createAgentRunner,
3
3
  executeAgentRun
4
- } from "../chunk-45DMFMY2.js";
5
- import "../chunk-NSOCZGOH.js";
6
- import "../chunk-6DTVCPLO.js";
7
- import "../chunk-IVXL57YF.js";
8
- import "../chunk-IQIBZXGB.js";
9
- import "../chunk-JPQISMMJ.js";
10
- import "../chunk-XJA7BPHS.js";
4
+ } from "../chunk-ZIX4PNBI.js";
5
+ import "../chunk-5K4N73TP.js";
6
+ import "../chunk-XIMUQ4IU.js";
7
+ import "../chunk-EOB77KME.js";
8
+ import "../chunk-B5QS4AVO.js";
9
+ import "../chunk-VSAFV2GI.js";
10
+ import "../chunk-3OABPOHR.js";
11
11
  import "../chunk-PDO5BLNM.js";
12
- import "../chunk-CM5EZD5F.js";
12
+ import "../chunk-UIE3R5XU.js";
13
13
  import {
14
14
  loadAppPluginSet
15
15
  } from "../chunk-Y2CM7HXH.js";
16
- import "../chunk-TPTJEHUE.js";
17
- import "../chunk-FP5N5OWZ.js";
18
- import "../chunk-PWC24W5F.js";
19
- import "../chunk-VHRM6GNH.js";
16
+ import "../chunk-X2IPNCB5.js";
17
+ import "../chunk-IQ36I3DF.js";
18
+ import "../chunk-ZSHL44IQ.js";
19
+ import "../chunk-QZGVPPIJ.js";
20
20
  import "../chunk-G3E7SCME.js";
21
21
  import "../chunk-4ZNGQH7C.js";
22
- import "../chunk-A7X2FDUO.js";
22
+ import "../chunk-SHBPSE7A.js";
23
23
  import "../chunk-FXFQNHRU.js";
24
- import "../chunk-LVA4I4H7.js";
24
+ import "../chunk-RT5BUHR5.js";
25
25
  import "../chunk-B7PUBQQM.js";
26
- import "../chunk-3ECW2K2O.js";
27
- import "../chunk-LMJPRYHP.js";
28
- import "../chunk-I35CTGPO.js";
26
+ import "../chunk-WR7H7VLJ.js";
27
+ import "../chunk-77LHNQK4.js";
28
+ import "../chunk-AEWZ7F65.js";
29
29
  import "../chunk-OB42YVAE.js";
30
30
  import "../chunk-6GWA276C.js";
31
31
  import "../chunk-B3IT5END.js";
@@ -153,10 +153,10 @@ async function configureLocalChatPlugins(pluginSet) {
153
153
  databaseModule
154
154
  ] = await Promise.all([
155
155
  import("../plugins-PZMDS7AT.js"),
156
- import("../agent-hooks-V6KU7PQN.js"),
157
- import("../catalog-runtime-PFHVMHDR.js"),
158
- import("../validation-FMEAEKCY.js"),
159
- import("../db-RCZB7KNM.js")
156
+ import("../agent-hooks-I4I2DHSW.js"),
157
+ import("../catalog-runtime-5CVM2DOF.js"),
158
+ import("../validation-EUI2UFRM.js"),
159
+ import("../db-6QP6HY7U.js")
160
160
  ]);
161
161
  const resolvedPluginSet = pluginSet === void 0 ? await loadLocalPluginSet() : pluginSet ?? void 0;
162
162
  const plugins = pluginsModule.pluginRuntimeRegistrationsFromPluginSet(resolvedPluginSet);
@@ -217,7 +217,7 @@ function newRunConversationId() {
217
217
  async function prepareLocalChatRun(io, pluginSet) {
218
218
  defaultStateAdapterForLocalChat();
219
219
  await configureLocalChatPlugins(pluginSet);
220
- const { runLocalAgentTurn } = await import("../runner-BM7D35YW.js");
220
+ const { runLocalAgentTurn } = await import("../runner-C2ZTIOUD.js");
221
221
  const deps = {
222
222
  agentRunner: createAgentRunner(executeAgentRun),
223
223
  deliverReply: async (reply) => {
package/dist/cli/check.js CHANGED
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  parseSkillFile
3
- } from "../chunk-3ECW2K2O.js";
3
+ } from "../chunk-WR7H7VLJ.js";
4
4
  import {
5
5
  parseInlinePluginManifest,
6
6
  parsePluginManifest
7
- } from "../chunk-LMJPRYHP.js";
8
- import "../chunk-I35CTGPO.js";
7
+ } from "../chunk-77LHNQK4.js";
8
+ import "../chunk-AEWZ7F65.js";
9
9
  import "../chunk-OB42YVAE.js";
10
10
  import "../chunk-6GWA276C.js";
11
11
  import "../chunk-B3IT5END.js";
@@ -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-2T7DCRAW.js";
7
+ } from "../chunk-3UK5DFKW.js";
8
8
  import {
9
9
  defineJuniorPlugins,
10
10
  pluginCatalogConfigFromEnv,
@@ -14,15 +14,15 @@ import {
14
14
  import {
15
15
  JUNIOR_THREAD_STATE_TTL_MS,
16
16
  coerceThreadConversationState
17
- } from "../chunk-6DTVCPLO.js";
17
+ } from "../chunk-XIMUQ4IU.js";
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
  }
@@ -1122,12 +1127,196 @@ var redisConversationStateMigration = {
1122
1127
  run: migrateRedisConversationState
1123
1128
  };
1124
1129
 
1130
+ // src/cli/upgrade/migrations/agent-turn-session-actor.ts
1131
+ import { THREAD_STATE_TTL_MS } from "chat";
1132
+ var AGENT_TURN_SESSION_PREFIX2 = "junior:agent_turn_session";
1133
+ var AGENT_TURN_SESSION_INDEX_KEY2 = `${AGENT_TURN_SESSION_PREFIX2}:index`;
1134
+ var AGENT_TURN_SESSION_INDEX_MAX_LENGTH = 5e3;
1135
+ var REDIS_SCAN_COUNT = 500;
1136
+ function conversationIndexKey(conversationId) {
1137
+ return `${AGENT_TURN_SESSION_PREFIX2}:conversation:${conversationId}:index`;
1138
+ }
1139
+ function sessionRecordKey(conversationId, sessionId) {
1140
+ return `${AGENT_TURN_SESSION_PREFIX2}:${conversationId}:${sessionId}`;
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
+ }
1194
+ function migrateRequesterToActor(value) {
1195
+ if (!isRecord(value) || value.requester === void 0) {
1196
+ return { changed: false, value };
1197
+ }
1198
+ const { requester, ...record } = value;
1199
+ return {
1200
+ changed: true,
1201
+ value: {
1202
+ ...record,
1203
+ ...record.actor === void 0 ? { actor: requester } : {}
1204
+ }
1205
+ };
1206
+ }
1207
+ async function rewriteList(args) {
1208
+ const values = await args.stateAdapter.getList(args.key);
1209
+ const migrated = values.map(migrateRequesterToActor);
1210
+ const changed = migrated.filter((entry) => entry.changed).length;
1211
+ if (changed === 0) {
1212
+ return { migrated: 0, values };
1213
+ }
1214
+ await args.stateAdapter.delete(args.key);
1215
+ for (const entry of migrated) {
1216
+ await args.stateAdapter.appendToList(args.key, entry.value, {
1217
+ ...args.maxLength !== void 0 ? { maxLength: args.maxLength } : {},
1218
+ ttlMs: THREAD_STATE_TTL_MS
1219
+ });
1220
+ }
1221
+ return { migrated: changed, values: migrated.map((entry) => entry.value) };
1222
+ }
1223
+ async function migrateSessionRecord(args) {
1224
+ const key = sessionRecordKey(args.conversationId, args.sessionId);
1225
+ const existing = await args.stateAdapter.get(key);
1226
+ if (existing === void 0) {
1227
+ return "missing";
1228
+ }
1229
+ const migrated = migrateRequesterToActor(existing);
1230
+ if (!migrated.changed) {
1231
+ return "existing";
1232
+ }
1233
+ await args.stateAdapter.set(key, migrated.value, THREAD_STATE_TTL_MS);
1234
+ return "migrated";
1235
+ }
1236
+ async function migrateAgentTurnSessionActor(context) {
1237
+ const result = {
1238
+ existing: 0,
1239
+ migrated: 0,
1240
+ missing: 0,
1241
+ scanned: 0
1242
+ };
1243
+ const global = await rewriteList({
1244
+ key: AGENT_TURN_SESSION_INDEX_KEY2,
1245
+ maxLength: AGENT_TURN_SESSION_INDEX_MAX_LENGTH,
1246
+ stateAdapter: context.stateAdapter
1247
+ });
1248
+ result.scanned += global.values.length;
1249
+ result.migrated += global.migrated;
1250
+ const conversations = /* @__PURE__ */ new Set();
1251
+ const sessions = /* @__PURE__ */ new Set();
1252
+ for (const conversationId of await discoverRedisConversationIds(
1253
+ context.redisStateAdapter
1254
+ )) {
1255
+ conversations.add(conversationId);
1256
+ }
1257
+ for (const value of global.values) {
1258
+ if (!isRecord(value)) {
1259
+ continue;
1260
+ }
1261
+ const conversationId = toOptionalString(value.conversationId);
1262
+ const sessionId = toOptionalString(value.sessionId);
1263
+ if (!conversationId) {
1264
+ continue;
1265
+ }
1266
+ conversations.add(conversationId);
1267
+ if (sessionId) {
1268
+ sessions.add(`${conversationId}\0${sessionId}`);
1269
+ }
1270
+ }
1271
+ for (const conversationId of conversations) {
1272
+ const conversation = await rewriteList({
1273
+ key: conversationIndexKey(conversationId),
1274
+ stateAdapter: context.stateAdapter
1275
+ });
1276
+ result.scanned += conversation.values.length;
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
+ }
1287
+ }
1288
+ for (const session of sessions) {
1289
+ const separator = session.indexOf("\0");
1290
+ const conversationId = session.slice(0, separator);
1291
+ const sessionId = session.slice(separator + 1);
1292
+ result.scanned += 1;
1293
+ const status = await migrateSessionRecord({
1294
+ conversationId,
1295
+ sessionId,
1296
+ stateAdapter: context.stateAdapter
1297
+ });
1298
+ if (status === "migrated") {
1299
+ result.migrated += 1;
1300
+ } else if (status === "existing") {
1301
+ result.existing += 1;
1302
+ } else {
1303
+ result.missing += 1;
1304
+ }
1305
+ }
1306
+ return result;
1307
+ }
1308
+ var agentTurnSessionActorMigration = {
1309
+ name: "migrate-agent-turn-session-requester-to-actor",
1310
+ run: migrateAgentTurnSessionActor
1311
+ };
1312
+
1125
1313
  // src/cli/upgrade.ts
1126
1314
  var DEFAULT_IO = {
1127
1315
  info: console.log
1128
1316
  };
1129
1317
  var localPluginLoader = createJiti(import.meta.url, { moduleCache: false });
1130
1318
  var MIGRATIONS = [
1319
+ agentTurnSessionActorMigration,
1131
1320
  redisConversationStateMigration,
1132
1321
  coreSqlSchemaMigration,
1133
1322
  sqlConversationMigration,
@@ -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-VY7BT4SM.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
- } from "./chunk-MM5UFDAC.js";
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-QSBQJ3PA.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
- } from "./chunk-4AQUWWEM.js";
9
- import "./chunk-MM5UFDAC.js";
8
+ } from "./chunk-HNIT4HXU.js";
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
- } from "./chunk-MM5UFDAC.js";
7
- import "./chunk-VVIXK2BX.js";
6
+ } from "./chunk-HYDQULR2.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";