@sentry/junior 0.207.0 → 0.208.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 (49) hide show
  1. package/dist/{agent-CmQlX68D.js → agent-BfxfHsf1.js} +17 -17
  2. package/dist/{agent-hooks-BBX9p6aG.js → agent-hooks-CuGjLjmR.js} +129 -7
  3. package/dist/{agent-runner-CQD4HKK2.js → agent-runner-Dz1PMKP0.js} +5 -5
  4. package/dist/api.js +15 -15
  5. package/dist/app.js +29 -29
  6. package/dist/{auth-pause-state-uv8on6cT.js → auth-pause-state-Bjoh8wCy.js} +6 -6
  7. package/dist/{briefs-BXEmjD9D.js → briefs-q_onrGmf.js} +2 -2
  8. package/dist/{catalog-runtime-1BZEOR8J.js → catalog-runtime-D8YUMNhb.js} +1 -1
  9. package/dist/{checkpoint-B-JO5F3c.js → checkpoint-FKMcINix.js} +6 -6
  10. package/dist/cli/chat.js +13 -13
  11. package/dist/cli/check.js +3 -3
  12. package/dist/cli/main.js +1 -1
  13. package/dist/cli/plugins.js +3 -3
  14. package/dist/cli/snapshot-create.js +3 -3
  15. package/dist/cli/upgrade.js +3 -3
  16. package/dist/{client-Bp297GA0.js → client-bRyPqwAV.js} +2 -2
  17. package/dist/{config-G2gv97R1.js → config-EtF2uEaW.js} +4 -4
  18. package/dist/{conversation-privacy-BUfel19D.js → conversation-privacy-whGaV2TG.js} +1 -1
  19. package/dist/{credential-sync-D04NWqMR.js → credential-sync-DM-EE1ey.js} +20 -20
  20. package/dist/{execution-stats-Ds4bSvam.js → execution-stats-C-f8zwMU.js} +4 -4
  21. package/dist/{executor-BZu1Ta06.js → executor-BW5qp0jC.js} +32 -3
  22. package/dist/instrumentation.js +2 -2
  23. package/dist/{job-queue-rnAPfUhP.js → job-queue-BIHNIEIX.js} +1 -1
  24. package/dist/{logging-Dx0S5k2z.js → logging-sNS84Yuu.js} +1 -1
  25. package/dist/nitro.js +3 -3
  26. package/dist/{oauth-callback-server-xGpwURIj.js → oauth-callback-server-Co6D_yXP.js} +2 -2
  27. package/dist/{pending-auth-DIZ4iZjS.js → pending-auth-CRJCt9Ux.js} +2 -2
  28. package/dist/{profile-d-fKypxo.js → profile-BfLMVhWo.js} +4 -4
  29. package/dist/{registry-CWKdLCTG.js → registry-Cyww_jnC.js} +1 -1
  30. package/dist/{resolve-BhRB1s2A.js → resolve-BApIFQXX.js} +2 -2
  31. package/dist/{runner-DNml3owD.js → runner-C9okx4GL.js} +9 -9
  32. package/dist/{sandbox-egress-signals-DUIl3-gW.js → sandbox-egress-signals-BHfx0esj.js} +1 -1
  33. package/dist/{skills-D9WesdJJ.js → skills-DhL_wXEp.js} +2 -2
  34. package/dist/{spawn-Eh_3-s0M.js → spawn-msnzfE8_.js} +2 -2
  35. package/dist/{stats-CFlUGqVA.js → stats-Cq5w_Awk.js} +6 -6
  36. package/dist/{task-queue-D8I1_5wP.js → task-queue-JfmWmpjS.js} +3 -3
  37. package/dist/{task-runner-DO79gdho.js → task-runner-Cm0gXoLH.js} +7 -7
  38. package/dist/{thread-state-DD6BA4xz.js → thread-state-lw2QwQ-y.js} +5 -5
  39. package/dist/{turn-execution-BSIHxmQJ.js → turn-execution-C7K6lQp1.js} +3 -3
  40. package/dist/{turn-lifecycle-DSBK4Ars.js → turn-lifecycle-DVlJLwB0.js} +1 -1
  41. package/dist/{usage-WRXkNOHp.js → usage-BMuAlKIW.js} +2 -2
  42. package/dist/{validation-BbHZ4r4S.js → validation-BI-r3iQA.js} +1 -1
  43. package/dist/{version-C71UcRWw.js → version-s6smK6lP.js} +1 -1
  44. package/dist/version.js +1 -1
  45. package/dist/{web-authorization-C73gJV7l.js → web-authorization-C9MxPvXX.js} +1 -1
  46. package/dist/{web-input-Ce1FcNIM.js → web-input-CwVlaLd0.js} +5 -107
  47. package/dist/{work-BEzDU_2x.js → work-BK0W1QAt.js} +9 -9
  48. package/dist/{worker-MK2ubOv-.js → worker-D-WWKHQD.js} +5 -5
  49. package/package.json +4 -4
@@ -1,17 +1,12 @@
1
- import { f as logWarn } from "./logging-Dx0S5k2z.js";
2
- import { t as canExposeConversationPayload } from "./conversation-privacy-BUfel19D.js";
3
- import { s as getSlackBotToken } from "./config-G2gv97R1.js";
1
+ import { f as logWarn } from "./logging-sNS84Yuu.js";
2
+ import { s as getSlackBotToken } from "./config-EtF2uEaW.js";
4
3
  import "./context-Bplcgypl.js";
5
- import { Ft as getConversationStore, It as getDb, K as normalizeSlackConversationId } from "./agent-hooks-BBX9p6aG.js";
6
- import { n as juniorDestinations } from "./destinations-BeBiJeEM.js";
7
- import { E as juniorUsers, T as juniorIdentities, m as juniorConversationParticipants, w as juniorConversations } from "./executor-BZu1Ta06.js";
8
- import { Kt as buildDeterministicTurnId, c as parseSlackThreadId, ft as appendAndEnqueueExclusiveInboundMessage, pt as appendAndEnqueueInboundMessage } from "./stats-CFlUGqVA.js";
4
+ import { K as normalizeSlackConversationId, Wt as getConversationStore } from "./agent-hooks-CuGjLjmR.js";
5
+ import { Kt as buildDeterministicTurnId, c as parseSlackThreadId, ft as appendAndEnqueueExclusiveInboundMessage, pt as appendAndEnqueueInboundMessage } from "./stats-Cq5w_Awk.js";
9
6
  import { t as healthReportSchema } from "./reporting-schema-DosTN__Q.js";
10
7
  import { z } from "zod";
11
8
  import { createHash } from "node:crypto";
12
- import { and, eq, exists, gte, inArray, isNotNull, notExists, or } from "drizzle-orm";
13
9
  import { createWebSource, localDestinationSchema } from "@sentry/junior-plugin-api";
14
- import { alias } from "drizzle-orm/pg-core";
15
10
  import { del, get, put } from "@vercel/blob";
16
11
  //#region src/handlers/health.ts
17
12
  /** Build Junior's process health value for HTTP and reporting consumers. */
@@ -234,103 +229,6 @@ function resolveConversationDestination(args) {
234
229
  return args.existing ?? requireLocalDestination(args.conversationId);
235
230
  }
236
231
  //#endregion
237
- //#region src/api/conversations/membership.ts
238
- /** True when the viewer is a materialized participant on this root conversation. */
239
- function conversationHasParticipantUser(userId) {
240
- const participant = getDb().select({ rootConversationId: juniorConversationParticipants.rootConversationId }).from(juniorConversationParticipants).where(and(eq(juniorConversationParticipants.rootConversationId, juniorConversations.conversationId), eq(juniorConversationParticipants.userId, userId)));
241
- return exists(participant);
242
- }
243
- /**
244
- * True when a verified primary-email user participates on this root
245
- * conversation. Used only for the actorEmail feed fallback.
246
- */
247
- function conversationHasParticipantEmail(email) {
248
- const participant = getDb().select({ rootConversationId: juniorConversationParticipants.rootConversationId }).from(juniorConversationParticipants).innerJoin(juniorUsers, eq(juniorUsers.id, juniorConversationParticipants.userId)).where(and(eq(juniorConversationParticipants.rootConversationId, juniorConversations.conversationId), eq(juniorUsers.primaryEmailNormalized, email)));
249
- return exists(participant);
250
- }
251
- /** True when one user's personal feed has archived this root after the cutoff. */
252
- function conversationArchivedForUser(userId, archivedAfter) {
253
- const archive = getDb().select({ rootConversationId: juniorConversationParticipants.rootConversationId }).from(juniorConversationParticipants).where(and(eq(juniorConversationParticipants.rootConversationId, juniorConversations.conversationId), eq(juniorConversationParticipants.userId, userId), isNotNull(juniorConversationParticipants.archivedAt), archivedAfter ? gte(juniorConversationParticipants.archivedAt, archivedAfter) : void 0));
254
- return exists(archive);
255
- }
256
- /** True when one user's personal feed has not archived this root. */
257
- function conversationNotArchivedForUser(userId) {
258
- const archive = getDb().select({ rootConversationId: juniorConversationParticipants.rootConversationId }).from(juniorConversationParticipants).where(and(eq(juniorConversationParticipants.rootConversationId, juniorConversations.conversationId), eq(juniorConversationParticipants.userId, userId), isNotNull(juniorConversationParticipants.archivedAt)));
259
- return notExists(archive);
260
- }
261
- /** True when one primary-email user's feed archived this root after the cutoff. */
262
- function conversationArchivedForEmail(email, archivedAfter) {
263
- const archive = getDb().select({ rootConversationId: juniorConversationParticipants.rootConversationId }).from(juniorConversationParticipants).innerJoin(juniorUsers, eq(juniorUsers.id, juniorConversationParticipants.userId)).where(and(eq(juniorConversationParticipants.rootConversationId, juniorConversations.conversationId), eq(juniorUsers.primaryEmailNormalized, email), isNotNull(juniorConversationParticipants.archivedAt), archivedAfter ? gte(juniorConversationParticipants.archivedAt, archivedAfter) : void 0));
264
- return exists(archive);
265
- }
266
- /** True when one primary-email user's personal feed has not archived this root. */
267
- function conversationNotArchivedForEmail(email) {
268
- const archive = getDb().select({ rootConversationId: juniorConversationParticipants.rootConversationId }).from(juniorConversationParticipants).innerJoin(juniorUsers, eq(juniorUsers.id, juniorConversationParticipants.userId)).where(and(eq(juniorConversationParticipants.rootConversationId, juniorConversations.conversationId), eq(juniorUsers.primaryEmailNormalized, email), isNotNull(juniorConversationParticipants.archivedAt)));
269
- return notExists(archive);
270
- }
271
- /** Root-actor ownership or a materialized participant row for the same person. */
272
- function viewerConversationMembership(args) {
273
- if (args.actorMatch && args.participantMatch) return or(args.actorMatch, args.participantMatch);
274
- return args.actorMatch ?? args.participantMatch;
275
- }
276
- /** Read personal archive timestamps for a bounded set of conversation roots. */
277
- async function conversationArchiveTimes(db, conversationIds, subject) {
278
- if (!subject || conversationIds.length === 0) return /* @__PURE__ */ new Map();
279
- const query = db.select({
280
- archivedAt: juniorConversationParticipants.archivedAt,
281
- rootConversationId: juniorConversationParticipants.rootConversationId
282
- }).from(juniorConversationParticipants);
283
- const rows = "userId" in subject ? await query.where(and(eq(juniorConversationParticipants.userId, subject.userId), inArray(juniorConversationParticipants.rootConversationId, [...conversationIds]), isNotNull(juniorConversationParticipants.archivedAt))) : await query.innerJoin(juniorUsers, eq(juniorUsers.id, juniorConversationParticipants.userId)).where(and(eq(juniorUsers.primaryEmailNormalized, subject.email), inArray(juniorConversationParticipants.rootConversationId, [...conversationIds]), isNotNull(juniorConversationParticipants.archivedAt)));
284
- return new Map(rows.flatMap((row) => row.archivedAt ? [[row.rootConversationId, row.archivedAt.getTime()]] : []));
285
- }
286
- /** Find which of the supplied roots include the linked viewer as a participant. */
287
- async function conversationIdsWithParticipantUser(db, conversationIds, userId) {
288
- if (conversationIds.length === 0) return /* @__PURE__ */ new Set();
289
- const rows = await db.select({ rootConversationId: juniorConversationParticipants.rootConversationId }).from(juniorConversationParticipants).where(and(eq(juniorConversationParticipants.userId, userId), inArray(juniorConversationParticipants.rootConversationId, [...conversationIds])));
290
- return new Set(rows.map((row) => row.rootConversationId));
291
- }
292
- //#endregion
293
- //#region src/api/conversations/access.ts
294
- const rootConversation = alias(juniorConversations, "access_root_conversation");
295
- const rootDestination = alias(juniorDestinations, "access_root_destination");
296
- const rootIdentity = alias(juniorIdentities, "access_root_identity");
297
- /** Resolve viewer access for a bounded set of persisted conversations. */
298
- async function readConversationAccessFromSql(db, conversationIds, viewer) {
299
- if (conversationIds.length === 0) return /* @__PURE__ */ new Map();
300
- const normalizedViewerEmail = viewer?.email.trim().toLowerCase() || void 0;
301
- const rows = await db.select({
302
- conversationId: juniorConversations.conversationId,
303
- parentConversationId: juniorConversations.parentConversationId,
304
- storedRootConversationId: juniorConversations.rootConversationId,
305
- rootConversationId: rootConversation.conversationId,
306
- rootParentConversationId: rootConversation.parentConversationId,
307
- rootRootConversationId: rootConversation.rootConversationId,
308
- visibility: rootDestination.visibility,
309
- rootEmailNormalized: rootIdentity.emailNormalized,
310
- rootEmailVerified: rootIdentity.emailVerified,
311
- rootUserId: rootIdentity.userId
312
- }).from(juniorConversations).leftJoin(rootConversation, eq(rootConversation.conversationId, juniorConversations.rootConversationId)).leftJoin(rootDestination, eq(rootDestination.id, rootConversation.destinationId)).leftJoin(rootIdentity, eq(rootIdentity.id, rootConversation.actorIdentityId)).where(inArray(juniorConversations.conversationId, [...conversationIds]));
313
- const membershipConversationIds = /* @__PURE__ */ new Set();
314
- for (const row of rows) {
315
- membershipConversationIds.add(row.conversationId);
316
- if (row.storedRootConversationId) membershipConversationIds.add(row.storedRootConversationId);
317
- }
318
- const participantRootIds = viewer !== void 0 ? await conversationIdsWithParticipantUser(db, [...membershipConversationIds], viewer.id) : /* @__PURE__ */ new Set();
319
- return new Map(rows.map((row) => {
320
- const validRootConversationId = row.rootConversationId !== null && row.rootConversationId === row.storedRootConversationId && row.rootRootConversationId === row.rootConversationId && row.rootParentConversationId === null && (row.parentConversationId !== null || row.storedRootConversationId === row.conversationId) ? row.rootConversationId ?? void 0 : void 0;
321
- const visibility = validRootConversationId === void 0 ? null : row.visibility;
322
- const isRootActor = validRootConversationId !== void 0 && viewer !== void 0 && (row.rootUserId === viewer.id || normalizedViewerEmail !== void 0 && row.rootEmailVerified === true && row.rootEmailNormalized === normalizedViewerEmail);
323
- const isMaterializedParticipant = participantRootIds.has(row.conversationId) || validRootConversationId !== void 0 && participantRootIds.has(validRootConversationId);
324
- const isParticipant = isRootActor || isMaterializedParticipant;
325
- const canViewPrivateContent = isParticipant || validRootConversationId !== void 0 && canExposeConversationPayload({ visibility: visibility ?? void 0 });
326
- return [row.conversationId, {
327
- canViewPrivateContent,
328
- isParticipant,
329
- visibility
330
- }];
331
- }));
332
- }
333
- //#endregion
334
232
  //#region src/chat/conversations/web-input.ts
335
233
  /** Store web input in a Conversation mailbox. */
336
234
  function normalizeEmail(email) {
@@ -491,4 +389,4 @@ async function appendAndEnqueueWebMessage(input, options) {
491
389
  };
492
390
  }
493
391
  //#endregion
494
- export { createVercelAttachmentStorage as C, legacyWebMailboxMetadataSchema as S, readHealthReport as T, formatSlackConversationRedactedLabel as _, webActorFromEmail as a, resolveSlackConversationContextFromThreadId as b, conversationArchivedForEmail as c, conversationHasParticipantUser as d, conversationNotArchivedForEmail as f, conversationVisibilityFromSlackChannelType as g, resolveConversationDestination as h, recordWebConversationActivity as i, conversationArchivedForUser as l, viewerConversationMembership as m, conversationTurnIdForMessage as n, readConversationAccessFromSql as o, conversationNotArchivedForUser as p, createAndEnqueueConversation as r, conversationArchiveTimes as s, appendAndEnqueueWebMessage as t, conversationHasParticipantEmail as u, resolveSlackChannelTypeFromMessage as v, GET as w, lookupSlackUser as x, resolveSlackConversationContext as y };
392
+ export { webActorFromEmail as a, formatSlackConversationRedactedLabel as c, resolveSlackConversationContextFromThreadId as d, lookupSlackUser as f, readHealthReport as g, GET as h, recordWebConversationActivity as i, resolveSlackChannelTypeFromMessage as l, createVercelAttachmentStorage as m, conversationTurnIdForMessage as n, resolveConversationDestination as o, legacyWebMailboxMetadataSchema as p, createAndEnqueueConversation as r, conversationVisibilityFromSlackChannelType as s, appendAndEnqueueWebMessage as t, resolveSlackConversationContext as u };
@@ -1,13 +1,13 @@
1
1
  import { t as __exportAll } from "./rolldown-runtime-B4FMCO8f.js";
2
- import { A as createAgentInvocationSchema, M as AgentInvocationLimitError, O as agentBindingSchema, Q as AuthorizationFlowDisabledError, f as PluginCredentialFailureError, j as AgentInvocationBusyError, k as agentInvocationSchema } from "./agent-CmQlX68D.js";
3
- import { Ft as getConversationStore, Lt as getSqlExecutor, Nt as getConversationEventStore } from "./agent-hooks-BBX9p6aG.js";
4
- import { f as juniorAgentBindings, p as juniorAgentInvocations } from "./executor-BZu1Ta06.js";
5
- import { B as openConversationProjection, o as failTurnRecord, r as saveTurnCheckpoint, s as getTurnRecord, xt as getTerminalAssistantMessages } from "./checkpoint-B-JO5F3c.js";
6
- import { pt as appendAndEnqueueInboundMessage } from "./stats-CFlUGqVA.js";
7
- import { _ as isTurnInputCommitLostError, h as getConversationTurnBoundaryError, p as TurnInputCommitLostError, s as getAssistantReplyText } from "./pending-auth-DIZ4iZjS.js";
8
- import { t as ConversationTurnLifecycleService } from "./turn-lifecycle-DSBK4Ars.js";
9
- import { n as executeTurn, t as AgentRunError } from "./turn-execution-BSIHxmQJ.js";
10
- import { n as getPersistedSandboxState, o as persistThreadStateById, r as getPersistedThreadState } from "./thread-state-DD6BA4xz.js";
2
+ import { A as createAgentInvocationSchema, M as AgentInvocationLimitError, O as agentBindingSchema, Q as AuthorizationFlowDisabledError, f as PluginCredentialFailureError, j as AgentInvocationBusyError, k as agentInvocationSchema } from "./agent-BfxfHsf1.js";
3
+ import { Ht as getConversationEventStore, Kt as getSqlExecutor, Wt as getConversationStore } from "./agent-hooks-CuGjLjmR.js";
4
+ import { f as juniorAgentBindings, p as juniorAgentInvocations } from "./executor-BW5qp0jC.js";
5
+ import { B as openConversationProjection, o as failTurnRecord, r as saveTurnCheckpoint, s as getTurnRecord, xt as getTerminalAssistantMessages } from "./checkpoint-FKMcINix.js";
6
+ import { pt as appendAndEnqueueInboundMessage } from "./stats-Cq5w_Awk.js";
7
+ import { _ as isTurnInputCommitLostError, h as getConversationTurnBoundaryError, p as TurnInputCommitLostError, s as getAssistantReplyText } from "./pending-auth-CRJCt9Ux.js";
8
+ import { t as ConversationTurnLifecycleService } from "./turn-lifecycle-DVlJLwB0.js";
9
+ import { n as executeTurn, t as AgentRunError } from "./turn-execution-C7K6lQp1.js";
10
+ import { n as getPersistedSandboxState, o as persistThreadStateById, r as getPersistedThreadState } from "./thread-state-lw2QwQ-y.js";
11
11
  import { z } from "zod";
12
12
  import { createHash } from "node:crypto";
13
13
  import { and, asc, count, eq, inArray } from "drizzle-orm";
@@ -1,10 +1,10 @@
1
1
  import { t as __exportAll } from "./rolldown-runtime-B4FMCO8f.js";
2
- import { b as isProviderRetryError } from "./client-Bp297GA0.js";
3
- import { S as withLogContext, d as logInfo, f as logWarn, u as logException } from "./logging-Dx0S5k2z.js";
4
- import { a as getChatConfig } from "./config-G2gv97R1.js";
5
- import { At as recordConversationRetry, Bt as isFinalAttempt, Ct as drainConversationMailbox, Et as getConversationWorkState, Ft as startConversationWork, Nt as requestAnotherSlice, St as deadLetterAttempt, Vt as isInvalidConversationRecordError, _t as clearConsumedConversationWake, bt as completeConversationWork, dt as ackMessages, gt as checkInConversationWork, jt as releaseConversationWork, kt as recordAttemptFailure, mt as beginConversationResume, wt as ensureConversationWake, xt as countPendingConversationMessages, yt as completeConversationStop } from "./stats-CFlUGqVA.js";
2
+ import { b as isProviderRetryError } from "./client-bRyPqwAV.js";
3
+ import { S as withLogContext, d as logInfo, f as logWarn, u as logException } from "./logging-sNS84Yuu.js";
4
+ import { a as getChatConfig } from "./config-EtF2uEaW.js";
5
+ import { At as recordConversationRetry, Bt as isFinalAttempt, Ct as drainConversationMailbox, Et as getConversationWorkState, Ft as startConversationWork, Nt as requestAnotherSlice, St as deadLetterAttempt, Vt as isInvalidConversationRecordError, _t as clearConsumedConversationWake, bt as completeConversationWork, dt as ackMessages, gt as checkInConversationWork, jt as releaseConversationWork, kt as recordAttemptFailure, mt as beginConversationResume, wt as ensureConversationWake, xt as countPendingConversationMessages, yt as completeConversationStop } from "./stats-Cq5w_Awk.js";
6
6
  import { c as ConversationQueueMessageRejectedError } from "./vercel-queue-DIkVcfK4.js";
7
- import { a as getTurnRequestDeadline } from "./job-queue-rnAPfUhP.js";
7
+ import { a as getTurnRequestDeadline } from "./job-queue-BIHNIEIX.js";
8
8
  //#region src/chat/task-execution/worker.ts
9
9
  var worker_exports = /* @__PURE__ */ __exportAll({
10
10
  CONVERSATION_WORK_DEFER_DELAY_MS: () => CONVERSATION_WORK_DEFER_DELAY_MS,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sentry/junior",
3
- "version": "0.207.0",
3
+ "version": "0.208.0",
4
4
  "private": false,
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -85,7 +85,7 @@
85
85
  "pg": "^8.16.3",
86
86
  "yaml": "^2.9.0",
87
87
  "zod": "^4.5.4",
88
- "@sentry/junior-plugin-api": "0.207.0"
88
+ "@sentry/junior-plugin-api": "0.208.0"
89
89
  },
90
90
  "devDependencies": {
91
91
  "@emnapi/core": "^1.10.0",
@@ -104,9 +104,9 @@
104
104
  "typescript": "^6.0.3",
105
105
  "vercel": "^54.4.0",
106
106
  "vitest": "^4.1.7",
107
+ "@sentry/junior-github": "0.208.0",
107
108
  "@sentry/junior-testing": "0.0.0",
108
- "@sentry/junior-github": "0.207.0",
109
- "@sentry/junior-memory": "0.207.0"
109
+ "@sentry/junior-memory": "0.208.0"
110
110
  },
111
111
  "scripts": {
112
112
  "build": "tsdown",