@sentry/junior 0.145.0 → 0.147.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 (171) hide show
  1. package/dist/{agent-hooks-L7D2BDVV.js → agent-hooks-HS6VGUPM.js} +10 -10
  2. package/dist/api/conversations/detail.d.ts +1 -0
  3. package/dist/api/conversations/event-list.d.ts +1 -0
  4. package/dist/api/schema/conversation.d.ts +4 -0
  5. package/dist/api/schema.js +1 -1
  6. package/dist/api.js +26 -22
  7. package/dist/app.js +285 -290
  8. package/dist/{catalog-runtime-QLAC4Q3W.js → catalog-runtime-M6ZTPYRV.js} +5 -5
  9. package/dist/chat/agent/prompt.d.ts +0 -2
  10. package/dist/chat/agent/request.d.ts +2 -5
  11. package/dist/chat/agent/resume.d.ts +0 -3
  12. package/dist/chat/agent/sandbox.d.ts +2 -2
  13. package/dist/chat/agent/skills.d.ts +0 -1
  14. package/dist/chat/agent/tools.d.ts +0 -3
  15. package/dist/chat/agent-dispatch/types.d.ts +2 -2
  16. package/dist/chat/capabilities/jr-rpc-command.d.ts +2 -2
  17. package/dist/chat/configuration/service.d.ts +5 -2
  18. package/dist/chat/configuration/sql.d.ts +9 -0
  19. package/dist/chat/configuration/types.d.ts +17 -13
  20. package/dist/chat/conversations/history.d.ts +3 -0
  21. package/dist/chat/conversations/message-search.d.ts +32 -0
  22. package/dist/chat/conversations/projection.d.ts +10 -0
  23. package/dist/chat/conversations/sql/message-search.d.ts +4 -0
  24. package/dist/chat/conversations/tool-source.d.ts +5 -0
  25. package/dist/chat/credentials/unlink-provider.d.ts +2 -1
  26. package/dist/chat/credentials/user-token-store.d.ts +2 -0
  27. package/dist/chat/db.d.ts +2 -2
  28. package/dist/chat/event-tasks/tool-support.d.ts +2 -0
  29. package/dist/chat/identities/sql.d.ts +8 -0
  30. package/dist/chat/logging.d.ts +2 -0
  31. package/dist/chat/mcp/auth-store.d.ts +0 -2
  32. package/dist/chat/mcp/oauth.d.ts +0 -2
  33. package/dist/chat/oauth-flow.d.ts +3 -1
  34. package/dist/chat/pi/client.d.ts +2 -0
  35. package/dist/chat/plugins/credential-hooks.d.ts +2 -0
  36. package/dist/chat/prompt.d.ts +0 -2
  37. package/dist/chat/resource-events/notification.d.ts +2 -1
  38. package/dist/chat/runtime/delivered-turn-state.d.ts +1 -4
  39. package/dist/chat/runtime/thread-state.d.ts +8 -11
  40. package/dist/chat/runtime/turn-input.d.ts +4 -2
  41. package/dist/chat/runtime/turn-preparation.d.ts +2 -4
  42. package/dist/chat/sandbox/command-result.d.ts +2 -0
  43. package/dist/chat/sandbox/egress/schemas.d.ts +6 -0
  44. package/dist/chat/scheduled-tasks/tool-support.d.ts +2 -0
  45. package/dist/chat/scheduled-tasks/tools/create.d.ts +2 -0
  46. package/dist/chat/scheduled-tasks/tools/delete.d.ts +2 -0
  47. package/dist/chat/scheduled-tasks/tools/list.d.ts +2 -0
  48. package/dist/chat/scheduled-tasks/tools/run-now.d.ts +2 -0
  49. package/dist/chat/scheduled-tasks/tools/update.d.ts +2 -0
  50. package/dist/chat/services/mcp-auth-orchestration.d.ts +0 -3
  51. package/dist/chat/services/plugin-auth-orchestration.d.ts +2 -1
  52. package/dist/chat/services/provider-default-config.d.ts +2 -2
  53. package/dist/chat/services/subscribed-decision.d.ts +3 -0
  54. package/dist/chat/services/subscribed-reply-policy.d.ts +1 -0
  55. package/dist/chat/services/turn-result.d.ts +0 -3
  56. package/dist/chat/services/turn-router.d.ts +3 -0
  57. package/dist/chat/slack/assistant-thread/lifecycle.d.ts +0 -1
  58. package/dist/chat/slack/assistant-thread/title.d.ts +0 -3
  59. package/dist/chat/slack/dispatch-turn.d.ts +1 -1
  60. package/dist/chat/slack/message/attachments.d.ts +2 -0
  61. package/dist/chat/slack/message/blocks.d.ts +2 -0
  62. package/dist/chat/slack/message/content.d.ts +18 -0
  63. package/dist/chat/slack/message/identity.d.ts +7 -0
  64. package/dist/chat/slack/tools/canvas/context.d.ts +0 -10
  65. package/dist/chat/slack/tools/canvas/create.d.ts +2 -0
  66. package/dist/chat/slack/tools/canvas/edit.d.ts +2 -0
  67. package/dist/chat/slack/tools/canvas/read.d.ts +2 -0
  68. package/dist/chat/slack/tools/canvas/write.d.ts +2 -0
  69. package/dist/chat/slack/tools/channel-list-messages.d.ts +2 -0
  70. package/dist/chat/slack/tools/{conversation-search.d.ts → conversation-message-search.d.ts} +23 -14
  71. package/dist/chat/slack/tools/list/add-items.d.ts +4 -1
  72. package/dist/chat/slack/tools/list/api.d.ts +8 -1
  73. package/dist/chat/slack/tools/list/create.d.ts +2 -0
  74. package/dist/chat/slack/tools/list/get-items.d.ts +5 -3
  75. package/dist/chat/slack/tools/list/update-item.d.ts +5 -1
  76. package/dist/chat/slack/tools/message-add-reaction.d.ts +2 -0
  77. package/dist/chat/slack/tools/public-search.d.ts +2 -0
  78. package/dist/chat/slack/tools/send-files.d.ts +2 -0
  79. package/dist/chat/slack/tools/thread-read.d.ts +2 -0
  80. package/dist/chat/slack/vision-cache.d.ts +5 -0
  81. package/dist/chat/state/conversation.d.ts +4 -5
  82. package/dist/chat/task-execution/checkpoint.d.ts +1 -3
  83. package/dist/chat/task-execution/turn-cursor.d.ts +0 -9
  84. package/dist/chat/tool-support/structured-result.d.ts +1 -0
  85. package/dist/chat/tool-support/timed-out-tool-result.d.ts +11 -0
  86. package/dist/chat/tools/create-event-task.d.ts +2 -0
  87. package/dist/chat/tools/delete-event-task.d.ts +2 -0
  88. package/dist/chat/tools/handoff/tool.d.ts +2 -0
  89. package/dist/chat/tools/list-event-tasks.d.ts +2 -0
  90. package/dist/chat/tools/list-resource-event-subscriptions.d.ts +2 -0
  91. package/dist/chat/tools/runtime/report-progress.d.ts +2 -0
  92. package/dist/chat/tools/runtime/spawn-agent.d.ts +2 -0
  93. package/dist/chat/tools/{query-conversation-events.d.ts → search-conversation-events.d.ts} +5 -3
  94. package/dist/chat/tools/search-resource-event-types.d.ts +2 -0
  95. package/dist/chat/tools/search-tools.d.ts +2 -0
  96. package/dist/chat/tools/skill/load-skill.d.ts +2 -0
  97. package/dist/chat/tools/skill/search-mcp-tools.d.ts +2 -0
  98. package/dist/chat/tools/stop-watching-resources.d.ts +2 -0
  99. package/dist/chat/tools/system-time.d.ts +2 -0
  100. package/dist/chat/tools/types.d.ts +0 -6
  101. package/dist/chat/tools/update-event-task.d.ts +2 -0
  102. package/dist/chat/tools/user-lookup.d.ts +29 -0
  103. package/dist/chat/tools/watch-resource-events.d.ts +2 -0
  104. package/dist/chat/tools/web/fetch-tool.d.ts +2 -0
  105. package/dist/chat/tools/web/image-generate.d.ts +2 -0
  106. package/dist/chat/tools/web/search.d.ts +2 -0
  107. package/dist/{chunk-PJ4NMVQB.js → chunk-34GS7B6L.js} +2 -2
  108. package/dist/{chunk-2LWPFSB4.js → chunk-4LJO56OJ.js} +9 -1
  109. package/dist/{chunk-QJBDABQA.js → chunk-6H5SZR24.js} +16 -20
  110. package/dist/{chunk-LVVSIMBB.js → chunk-745QJ3ZA.js} +1 -1
  111. package/dist/{chunk-64SBYW2O.js → chunk-7A4M7PCV.js} +613 -561
  112. package/dist/{chunk-XFKIRN3Q.js → chunk-7NVJVJID.js} +4 -3
  113. package/dist/{chunk-FUBRJA5F.js → chunk-7UQIVT6G.js} +13 -6
  114. package/dist/{chunk-ZIAMN2UW.js → chunk-AIOK6LAG.js} +40 -513
  115. package/dist/{chunk-EIX2LQ6L.js → chunk-AVOCH2Z5.js} +3 -3
  116. package/dist/{chunk-GUWLDMGF.js → chunk-AVZDSUFB.js} +4 -4
  117. package/dist/{chunk-2XET6PKP.js → chunk-AYU72WO7.js} +102 -73
  118. package/dist/chunk-AZ7EAOBE.js +566 -0
  119. package/dist/{chunk-DXEQAIUV.js → chunk-CSZINQJ2.js} +1 -1
  120. package/dist/{chunk-HLOUZC5C.js → chunk-CWP5RHVX.js} +4 -4
  121. package/dist/{chunk-DS3J6WGY.js → chunk-DLDRQHG5.js} +1 -1
  122. package/dist/{chunk-27TEJTZO.js → chunk-DU74WPIC.js} +55 -37
  123. package/dist/{chunk-YD54Q45G.js → chunk-EFLJ2WJH.js} +6 -4
  124. package/dist/{chunk-CD2XFGYQ.js → chunk-GGB4WL5A.js} +1 -1
  125. package/dist/{chunk-GDV5LXRA.js → chunk-IIOOO4FQ.js} +1 -1
  126. package/dist/{chunk-SIN3MXH6.js → chunk-JUUKWRBE.js} +1 -1
  127. package/dist/{chunk-VTDMB7XX.js → chunk-K4SZAP3K.js} +1 -1
  128. package/dist/{chunk-QUG4JSZK.js → chunk-ORO3PWKQ.js} +1 -1
  129. package/dist/{chunk-RUSS62EN.js → chunk-PVNG6UMU.js} +3 -3
  130. package/dist/{chunk-I47UGQPJ.js → chunk-Q4R73I43.js} +365 -206
  131. package/dist/{chunk-JTGS3ZZE.js → chunk-RXBVB2JM.js} +1 -1
  132. package/dist/{chunk-TZRXYWRE.js → chunk-SGZO7UWH.js} +2 -2
  133. package/dist/{chunk-JLMVCNXL.js → chunk-SVHUEHUL.js} +1 -0
  134. package/dist/{chunk-B46ZMVOV.js → chunk-X5UY34KT.js} +6 -5
  135. package/dist/{chunk-5PNPQYTO.js → chunk-YBVXBNSV.js} +2 -2
  136. package/dist/{chunk-HISR3DTV.js → chunk-YEO3VX72.js} +10 -25
  137. package/dist/{chunk-ZIMRGFYL.js → chunk-YHDERDRO.js} +7 -6
  138. package/dist/{chunk-WF5HVH3M.js → chunk-YNTTROJT.js} +1 -1
  139. package/dist/{chunk-2UH3JI64.js → chunk-YSB2N563.js} +87 -34
  140. package/dist/{chunk-ZYAJMESY.js → chunk-Z4YU7Z4L.js} +3 -2
  141. package/dist/cli/chat.js +32 -32
  142. package/dist/cli/check.js +6 -6
  143. package/dist/cli/plugins.js +13 -13
  144. package/dist/cli/snapshot-create.js +9 -9
  145. package/dist/cli/upgrade.js +7 -7
  146. package/dist/db/schema/location-configurations.d.ts +127 -0
  147. package/dist/db/schema.d.ts +128 -1
  148. package/dist/{db-62PW6LM3.js → db-CSEW4RII.js} +9 -9
  149. package/dist/instrumentation.js +4 -4
  150. package/dist/nitro.js +2 -2
  151. package/dist/{oauth-callback-server-6NZNHJAM.js → oauth-callback-server-FUEV5HNG.js} +24 -24
  152. package/dist/{runner-GCRPG3GQ.js → runner-U3XHSKSH.js} +21 -41
  153. package/dist/{skills-2S3MDFIQ.js → skills-AKE6W3WI.js} +6 -6
  154. package/dist/spawn-B6GDTWJ4.js +39 -0
  155. package/dist/{validation-HAOLCJ5A.js → validation-WDTAULUF.js} +6 -6
  156. package/dist/version.js +1 -1
  157. package/dist/{work-R4XYKMUW.js → work-C3HAO2BG.js} +17 -17
  158. package/dist/{worker-U2UCVR7M.js → worker-LNP4YKBM.js} +10 -10
  159. package/migrations/0024_misty_typhoid_mary.sql +12 -0
  160. package/migrations/meta/0024_snapshot.json +2275 -0
  161. package/migrations/meta/_journal.json +7 -0
  162. package/package.json +4 -4
  163. package/dist/chat/conversations/search.d.ts +0 -24
  164. package/dist/chat/conversations/sql/search.d.ts +0 -4
  165. package/dist/chat/slack/legacy-attachments.d.ts +0 -4
  166. package/dist/chat/slack/message.d.ts +0 -12
  167. package/dist/chat/slack/tools/user-lookup.d.ts +0 -26
  168. package/dist/chat/state/artifacts.d.ts +0 -30
  169. package/dist/chat/tool-support/turn-deadline-result.d.ts +0 -3
  170. package/dist/chunk-Q6QZTTLS.js +0 -55
  171. package/dist/spawn-7WK37BTD.js +0 -39
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  pluginCatalogRuntime
3
- } from "./chunk-SIN3MXH6.js";
3
+ } from "./chunk-JUUKWRBE.js";
4
4
  import {
5
5
  logWarn
6
- } from "./chunk-2LWPFSB4.js";
6
+ } from "./chunk-4LJO56OJ.js";
7
7
  import {
8
8
  skillRoots
9
9
  } from "./chunk-H4HBKISO.js";
@@ -1,9 +1,12 @@
1
1
  import {
2
2
  appendAndEnqueueInboundMessage
3
- } from "./chunk-HLOUZC5C.js";
3
+ } from "./chunk-CWP5RHVX.js";
4
4
  import {
5
- ConversationTurnLifecycleService
6
- } from "./chunk-Q6QZTTLS.js";
5
+ ConversationTurnLifecycleService,
6
+ getPersistedSandboxState,
7
+ getPersistedThreadState,
8
+ persistThreadStateById
9
+ } from "./chunk-AZ7EAOBE.js";
7
10
  import {
8
11
  AgentInvocationBusyError,
9
12
  AgentInvocationLimitError,
@@ -12,31 +15,27 @@ import {
12
15
  agentBindingSchema,
13
16
  agentInvocationSchema,
14
17
  createAgentInvocationSchema
15
- } from "./chunk-B46ZMVOV.js";
18
+ } from "./chunk-X5UY34KT.js";
16
19
  import {
17
20
  TurnInputCommitLostError,
18
- coerceThreadArtifactsState,
19
21
  failTurnRecord,
20
22
  getAssistantReplyText,
21
23
  getConversationTurnBoundaryError,
22
- getPersistedSandboxState,
23
- getPersistedThreadState,
24
24
  getTerminalAssistantMessages,
25
25
  getTurnRecord,
26
26
  isTurnInputCommitLostError,
27
27
  openConversationProjection,
28
- persistThreadStateById,
29
28
  saveTurnCheckpoint
30
- } from "./chunk-ZIAMN2UW.js";
29
+ } from "./chunk-AIOK6LAG.js";
31
30
  import {
32
31
  getConversationEventStore,
33
32
  getConversationStore,
34
33
  getSqlExecutor
35
- } from "./chunk-2UH3JI64.js";
34
+ } from "./chunk-YSB2N563.js";
36
35
  import {
37
36
  juniorAgentBindings,
38
37
  juniorAgentInvocations
39
- } from "./chunk-27TEJTZO.js";
38
+ } from "./chunk-DU74WPIC.js";
40
39
 
41
40
  // src/chat/agent-invocations/work.ts
42
41
  import { z } from "zod";
@@ -461,7 +460,6 @@ function createAgentInvocationWorker(options) {
461
460
  const lifecycle = new ConversationTurnLifecycleService(
462
461
  getConversationEventStore()
463
462
  );
464
- let artifacts;
465
463
  let sandboxRef;
466
464
  let history;
467
465
  try {
@@ -500,7 +498,6 @@ function createAgentInvocationWorker(options) {
500
498
  conversationId: invocation.childConversationId
501
499
  })
502
500
  ]);
503
- artifacts = coerceThreadArtifactsState(persisted);
504
501
  sandboxRef = getPersistedSandboxState(persisted);
505
502
  history = projection.messages;
506
503
  } catch (error) {
@@ -548,23 +545,14 @@ function createAgentInvocationWorker(options) {
548
545
  reasoningLevel: invocation.reasoningLevel
549
546
  },
550
547
  state: {
551
- artifactState: artifacts,
552
548
  sandboxRef
553
549
  },
554
550
  durability: {
555
551
  onInputCommitted: acknowledge,
556
552
  shouldYield: context.shouldYield,
557
- onArtifactStateUpdated: async (nextArtifacts) => {
558
- artifacts = nextArtifacts;
559
- await persistThreadStateById(invocation.childConversationId, {
560
- artifacts,
561
- sandboxRef
562
- });
563
- },
564
553
  onSandboxRefChanged: async (nextSandboxRef) => {
565
554
  sandboxRef = nextSandboxRef;
566
555
  await persistThreadStateById(invocation.childConversationId, {
567
- artifacts,
568
556
  sandboxRef
569
557
  });
570
558
  }
@@ -620,7 +608,6 @@ function createAgentInvocationWorker(options) {
620
608
  const result = outcome.result;
621
609
  const failed = result.diagnostics.outcome !== "success";
622
610
  await persistThreadStateById(invocation.childConversationId, {
623
- artifacts: result.artifactStatePatch ? { ...artifacts, ...result.artifactStatePatch } : artifacts,
624
611
  sandboxRef: result.sandboxRef ?? sandboxRef
625
612
  });
626
613
  if (result.piMessages?.length) {
@@ -636,9 +623,7 @@ function createAgentInvocationWorker(options) {
636
623
  errorMessage: result.diagnostics.errorMessage ?? "Agent invocation failed"
637
624
  } : {},
638
625
  messages: result.piMessages,
639
- modelId: result.diagnostics.modelId,
640
626
  actor: invocation.actor,
641
- reasoningLevel: result.diagnostics.reasoningLevel,
642
627
  source: invocation.source,
643
628
  surface: "internal"
644
629
  });
@@ -4,30 +4,30 @@ import {
4
4
  isConversationScopedChannel,
5
5
  isDmChannel,
6
6
  normalizeSlackConversationId
7
- } from "./chunk-TZRXYWRE.js";
7
+ } from "./chunk-SGZO7UWH.js";
8
8
  import {
9
9
  getConversationEventStore,
10
10
  getDb
11
- } from "./chunk-2UH3JI64.js";
11
+ } from "./chunk-YSB2N563.js";
12
12
  import {
13
13
  juniorConversationAnnotations,
14
14
  juniorConversationEvents,
15
15
  juniorIdentities,
16
16
  juniorUsers
17
- } from "./chunk-27TEJTZO.js";
17
+ } from "./chunk-DU74WPIC.js";
18
18
  import {
19
19
  SANDBOX_WORKSPACE_ROOT
20
20
  } from "./chunk-EM225ITJ.js";
21
21
  import {
22
22
  getStateAdapter
23
- } from "./chunk-QUG4JSZK.js";
23
+ } from "./chunk-ORO3PWKQ.js";
24
24
  import {
25
25
  botConfig,
26
26
  completeObject,
27
27
  embedTexts,
28
28
  getSlackBotToken,
29
29
  standardModelId
30
- } from "./chunk-XFKIRN3Q.js";
30
+ } from "./chunk-7NVJVJID.js";
31
31
  import {
32
32
  isActorUserId,
33
33
  parseActorUserId
@@ -42,7 +42,7 @@ import {
42
42
  logInfo,
43
43
  logWarn,
44
44
  normalizeIdentityEmail
45
- } from "./chunk-2LWPFSB4.js";
45
+ } from "./chunk-4LJO56OJ.js";
46
46
 
47
47
  // src/chat/plugins/agent-hooks.ts
48
48
  import {
@@ -280,6 +280,7 @@ function createPluginModel(pluginName, options = {}, runtime = {}) {
280
280
  ...input.system !== void 0 ? { system: input.system } : {},
281
281
  ...input.maxTokens !== void 0 ? { maxTokens: input.maxTokens } : {},
282
282
  signal: runtime.signal,
283
+ promptName: `${pluginName}.structured_completion`,
283
284
  metadata: {
284
285
  pluginName,
285
286
  pluginModelRole: "structured"
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  pluginCatalogRuntime
3
- } from "./chunk-SIN3MXH6.js";
3
+ } from "./chunk-JUUKWRBE.js";
4
4
 
5
5
  // src/chat/plugins/validation.ts
6
6
  import { isDeepStrictEqual } from "util";
@@ -5,12 +5,12 @@ import {
5
5
  juniorConversations,
6
6
  juniorIdentities,
7
7
  juniorUsers
8
- } from "./chunk-27TEJTZO.js";
8
+ } from "./chunk-DU74WPIC.js";
9
9
  import {
10
10
  TURN_REASONING_LEVELS,
11
11
  getChatConfig,
12
12
  modelProfileSchema
13
- } from "./chunk-XFKIRN3Q.js";
13
+ } from "./chunk-7NVJVJID.js";
14
14
  import {
15
15
  juniorDestinations
16
16
  } from "./chunk-VFUK3X5B.js";
@@ -20,7 +20,7 @@ import {
20
20
  } from "./chunk-F3B2YJ76.js";
21
21
  import {
22
22
  normalizeIdentityEmail
23
- } from "./chunk-2LWPFSB4.js";
23
+ } from "./chunk-4LJO56OJ.js";
24
24
 
25
25
  // src/chat/conversations/sql/store.ts
26
26
  import { randomUUID as randomUUID2 } from "crypto";
@@ -104,7 +104,7 @@ async function existingIdentity(executor, identity) {
104
104
  );
105
105
  return rows[0];
106
106
  }
107
- async function upsertIdentity(executor, identity, nowMs = Date.now()) {
107
+ async function upsertIdentityRecord(executor, identity, linkedUserId, nowMs) {
108
108
  const emailNormalized = normalizeIdentityEmail(identity.email);
109
109
  const email = emailNormalized ? identity.email?.trim() || emailNormalized : void 0;
110
110
  const existing = await existingIdentity(executor, identity);
@@ -119,7 +119,13 @@ async function upsertIdentity(executor, identity, nowMs = Date.now()) {
119
119
  if (existing?.userId && verifiedUserId && existing.userId !== verifiedUserId) {
120
120
  throw new Error("Identity verified email conflicts with linked user");
121
121
  }
122
- const userId = existing?.userId ?? verifiedUserId;
122
+ if (linkedUserId && verifiedUserId && linkedUserId !== verifiedUserId) {
123
+ throw new Error("Linked identity conflicts with verified email user");
124
+ }
125
+ if (existing?.userId && linkedUserId && existing.userId !== linkedUserId) {
126
+ throw new Error("Identity conflicts with linked user");
127
+ }
128
+ const userId = existing?.userId ?? linkedUserId ?? verifiedUserId;
123
129
  const rows = await executor.db().insert(juniorIdentities).values({
124
130
  id: randomUUID(),
125
131
  userId: userId ?? null,
@@ -145,21 +151,27 @@ async function upsertIdentity(executor, identity, nowMs = Date.now()) {
145
151
  set: {
146
152
  kind: sql`excluded.kind`,
147
153
  userId: sql`coalesce(${juniorIdentities.userId}, excluded.user_id)`,
148
- displayName: sql`coalesce(${juniorIdentities.displayName}, excluded.display_name)`,
149
- handle: sql`coalesce(${juniorIdentities.handle}, excluded.handle)`,
154
+ displayName: linkedUserId ? sql`coalesce(excluded.display_name, ${juniorIdentities.displayName})` : sql`coalesce(${juniorIdentities.displayName}, excluded.display_name)`,
155
+ handle: linkedUserId ? sql`coalesce(excluded.handle, ${juniorIdentities.handle})` : sql`coalesce(${juniorIdentities.handle}, excluded.handle)`,
150
156
  email: sql`case when ${juniorIdentities.emailVerified} then coalesce(${juniorIdentities.email}, excluded.email) when excluded.email_verified then excluded.email else coalesce(${juniorIdentities.email}, excluded.email) end`,
151
157
  emailNormalized: sql`case when ${juniorIdentities.emailVerified} then coalesce(${juniorIdentities.emailNormalized}, excluded.email_normalized) when excluded.email_verified then excluded.email_normalized else coalesce(${juniorIdentities.emailNormalized}, excluded.email_normalized) end`,
152
158
  emailVerified: sql`${juniorIdentities.emailVerified} OR excluded.email_verified`,
153
159
  avatarUrl: sql`coalesce(${juniorIdentities.avatarUrl}, excluded.avatar_url)`,
154
160
  metadata: sql`coalesce(${juniorIdentities.metadata}, excluded.metadata_json)`,
155
161
  updatedAt: sql`excluded.updated_at`
156
- }
162
+ },
163
+ ...linkedUserId ? {
164
+ setWhere: sql`${juniorIdentities.userId} IS NULL OR ${juniorIdentities.userId} = excluded.user_id`
165
+ } : {}
157
166
  }).returning({
158
167
  id: juniorIdentities.id,
159
168
  userId: juniorIdentities.userId
160
169
  });
161
170
  const row = rows[0];
162
171
  if (!row) {
172
+ if (linkedUserId) {
173
+ throw new Error("Identity conflicts with linked user");
174
+ }
163
175
  throw new Error("Identity upsert returned no row");
164
176
  }
165
177
  return {
@@ -167,6 +179,32 @@ async function upsertIdentity(executor, identity, nowMs = Date.now()) {
167
179
  ...row.userId ? { userId: row.userId } : {}
168
180
  };
169
181
  }
182
+ async function upsertIdentity(executor, identity, nowMs = Date.now()) {
183
+ return await upsertIdentityRecord(executor, identity, void 0, nowMs);
184
+ }
185
+ async function upsertLinkedIdentity(executor, userId, identity, nowMs = Date.now()) {
186
+ return await upsertIdentityRecord(executor, identity, userId, nowMs);
187
+ }
188
+ async function deleteProviderIdentityForSlackUser(executor, slackTeamId, slackUserId, provider, providerSubjectId) {
189
+ const slackRows = await executor.db().select({ userId: juniorIdentities.userId }).from(juniorIdentities).where(
190
+ and(
191
+ eq(juniorIdentities.kind, "user"),
192
+ eq(juniorIdentities.provider, "slack"),
193
+ eq(juniorIdentities.providerTenantId, slackTeamId),
194
+ eq(juniorIdentities.providerSubjectId, slackUserId)
195
+ )
196
+ ).limit(1);
197
+ const userId = slackRows[0]?.userId;
198
+ if (!userId) return;
199
+ await executor.db().delete(juniorIdentities).where(
200
+ and(
201
+ eq(juniorIdentities.userId, userId),
202
+ eq(juniorIdentities.provider, provider),
203
+ eq(juniorIdentities.providerTenantId, ""),
204
+ eq(juniorIdentities.providerSubjectId, providerSubjectId)
205
+ )
206
+ );
207
+ }
170
208
 
171
209
  // src/chat/source.ts
172
210
  import { sourceSchema } from "@sentry/junior-plugin-api";
@@ -1120,6 +1158,7 @@ var turnRoutedEventDataSchema = z3.object({
1120
1158
  turnId: z3.string().min(1),
1121
1159
  modelProfile: modelProfileSchema,
1122
1160
  modelId: z3.string().min(1),
1161
+ costUsd: z3.number().finite().nonnegative().optional(),
1123
1162
  reasoningLevel: z3.enum(TURN_REASONING_LEVELS),
1124
1163
  confidence: z3.number().min(0).max(1).optional(),
1125
1164
  source: z3.enum(["configured", "inherited", "router"])
@@ -1601,22 +1640,44 @@ function createSqlConversationEventStore(executor) {
1601
1640
  return new SqlConversationEventStore(executor);
1602
1641
  }
1603
1642
 
1604
- // src/chat/conversations/sql/search.ts
1643
+ // src/chat/conversations/sql/message-search.ts
1605
1644
  import { and as and5, desc as desc3, eq as eq5, isNull as isNull2, ne, sql as sql5 } from "drizzle-orm";
1606
- var SqlConversationSearchStore = class {
1645
+ var EXCERPT_WITHOUT_QUERY_CHARS = 240;
1646
+ var SqlConversationMessageSearchStore = class {
1607
1647
  constructor(executor) {
1608
1648
  this.executor = executor;
1609
1649
  }
1610
1650
  executor;
1611
1651
  async search(args) {
1612
1652
  const db = this.executor.db();
1613
- const tsquery = sql5`websearch_to_tsquery('english', ${args.query})`;
1653
+ const query = args.filters.query?.trim() || void 0;
1614
1654
  const text = sql5`${juniorConversationEvents.payload}->>'text'`;
1615
- const rank = sql5`ts_rank_cd(to_tsvector('english', ${text}), ${tsquery})`;
1616
- const excerpt = sql5`ts_headline('english', ${text}, ${tsquery}, 'MaxFragments=2, MinWords=8, MaxWords=40, FragmentDelimiter=" … ", StartSel=**, StopSel=**')`;
1617
1655
  const role = sql5`${juniorConversationEvents.payload}->>'role'`;
1618
1656
  const messageId = sql5`${juniorConversationEvents.payload}->>'messageId'`;
1657
+ const tsquery = query ? sql5`websearch_to_tsquery('english', ${query})` : void 0;
1658
+ const rank = tsquery ? sql5`ts_rank_cd(to_tsvector('english', ${text}), ${tsquery})` : sql5`1`;
1659
+ const excerpt = tsquery ? sql5`ts_headline('english', ${text}, ${tsquery}, 'MaxFragments=2, MinWords=8, MaxWords=40, FragmentDelimiter=" … ", StartSel=**, StopSel=**')` : sql5`left(${text}, ${EXCERPT_WITHOUT_QUERY_CHARS})`;
1660
+ const conditions = [
1661
+ eq5(juniorConversations.source, "slack"),
1662
+ isNull2(juniorConversations.parentConversationId),
1663
+ isNull2(juniorConversations.transcriptPurgedAt),
1664
+ ne(juniorConversations.conversationId, args.currentConversationId),
1665
+ eq5(juniorDestinations.provider, args.scope.provider),
1666
+ eq5(juniorDestinations.providerTenantId, args.scope.providerTenantId),
1667
+ eq5(juniorDestinations.visibility, "public"),
1668
+ eq5(juniorConversationEvents.type, "message"),
1669
+ sql5`${role} in ('user', 'assistant')`
1670
+ ];
1671
+ if (tsquery) {
1672
+ conditions.push(sql5`to_tsvector('english', ${text}) @@ ${tsquery}`);
1673
+ }
1674
+ if (args.filters.channelId) {
1675
+ conditions.push(
1676
+ eq5(juniorDestinations.providerDestinationId, args.filters.channelId)
1677
+ );
1678
+ }
1619
1679
  const bestPerConversation = db.selectDistinctOn([juniorConversations.conversationId], {
1680
+ channelName: juniorDestinations.displayName,
1620
1681
  conversationId: juniorConversations.conversationId,
1621
1682
  excerpt: excerpt.as("excerpt"),
1622
1683
  lastActivityAt: juniorConversations.lastActivityAt,
@@ -1634,27 +1695,15 @@ var SqlConversationSearchStore = class {
1634
1695
  ).innerJoin(
1635
1696
  juniorDestinations,
1636
1697
  eq5(juniorDestinations.id, juniorConversations.destinationId)
1637
- ).where(
1638
- and5(
1639
- eq5(juniorConversations.source, "slack"),
1640
- isNull2(juniorConversations.parentConversationId),
1641
- isNull2(juniorConversations.transcriptPurgedAt),
1642
- ne(juniorConversations.conversationId, args.currentConversationId),
1643
- eq5(juniorDestinations.provider, args.scope.provider),
1644
- eq5(juniorDestinations.providerTenantId, args.scope.providerTenantId),
1645
- eq5(juniorDestinations.visibility, "public"),
1646
- eq5(juniorConversationEvents.type, "message"),
1647
- sql5`${role} in ('user', 'assistant')`,
1648
- sql5`to_tsvector('english', ${text}) @@ ${tsquery}`
1649
- )
1650
- ).orderBy(
1698
+ ).where(and5(...conditions)).orderBy(
1651
1699
  juniorConversations.conversationId,
1652
1700
  desc3(rank),
1653
1701
  desc3(juniorConversationEvents.createdAt)
1654
1702
  ).as("best_conversation_matches");
1655
1703
  const rows = await db.select().from(bestPerConversation).orderBy(
1656
1704
  desc3(bestPerConversation.rank),
1657
- desc3(bestPerConversation.lastActivityAt)
1705
+ desc3(bestPerConversation.lastActivityAt),
1706
+ desc3(bestPerConversation.messageCreatedAt)
1658
1707
  ).limit(args.limit);
1659
1708
  return rows.map((row) => ({
1660
1709
  conversationId: row.conversationId,
@@ -1662,12 +1711,13 @@ var SqlConversationSearchStore = class {
1662
1711
  messageCreatedAtMs: row.messageCreatedAt.getTime(),
1663
1712
  messageId: row.messageId,
1664
1713
  providerDestinationId: row.providerDestinationId,
1665
- role: row.role
1714
+ role: row.role,
1715
+ ...row.channelName ? { channelName: row.channelName } : {}
1666
1716
  }));
1667
1717
  }
1668
1718
  };
1669
- function createSqlConversationSearchStore(executor) {
1670
- return new SqlConversationSearchStore(executor);
1719
+ function createSqlConversationMessageSearchStore(executor) {
1720
+ return new SqlConversationMessageSearchStore(executor);
1671
1721
  }
1672
1722
 
1673
1723
  // src/chat/db.ts
@@ -1699,7 +1749,7 @@ function getSqlExecutor() {
1699
1749
  db,
1700
1750
  store: createSqlStore(db),
1701
1751
  eventStore: createSqlConversationEventStore(db),
1702
- searchStore: createSqlConversationSearchStore(db)
1752
+ searchStore: createSqlConversationMessageSearchStore(db)
1703
1753
  };
1704
1754
  }
1705
1755
  return current.db;
@@ -1715,7 +1765,7 @@ function getConversationEventStore() {
1715
1765
  getSqlExecutor();
1716
1766
  return current.eventStore;
1717
1767
  }
1718
- function getConversationSearchStore() {
1768
+ function getConversationMessageSearchStore() {
1719
1769
  getSqlExecutor();
1720
1770
  return current.searchStore;
1721
1771
  }
@@ -1730,6 +1780,9 @@ export {
1730
1780
  parseDestination,
1731
1781
  requireSlackDestination,
1732
1782
  sameDestination,
1783
+ upsertIdentity,
1784
+ upsertLinkedIdentity,
1785
+ deleteProviderIdentityForSlackUser,
1733
1786
  parseSessionSource,
1734
1787
  bindProviderConversation,
1735
1788
  locationFromRow,
@@ -1748,6 +1801,6 @@ export {
1748
1801
  getDb,
1749
1802
  getConversationStore,
1750
1803
  getConversationEventStore,
1751
- getConversationSearchStore,
1804
+ getConversationMessageSearchStore,
1752
1805
  closeDb
1753
1806
  };
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  botConfig
3
- } from "./chunk-XFKIRN3Q.js";
3
+ } from "./chunk-7NVJVJID.js";
4
4
  import {
5
5
  logWarn
6
- } from "./chunk-2LWPFSB4.js";
6
+ } from "./chunk-4LJO56OJ.js";
7
7
 
8
8
  // src/chat/services/short-title.ts
9
9
  var SHORT_TITLE_MAX_LENGTH = 60;
@@ -33,6 +33,7 @@ async function generateShortTitle(args) {
33
33
  const result = await args.completeText({
34
34
  modelId: botConfig.fastModelId,
35
35
  temperature: 0,
36
+ promptName: `junior.${args.kind}_title`,
36
37
  messages: [
37
38
  {
38
39
  role: "user",
package/dist/cli/chat.js CHANGED
@@ -1,48 +1,48 @@
1
1
  import {
2
2
  createAgentRunner,
3
3
  executeAgentRun
4
- } from "../chunk-64SBYW2O.js";
5
- import "../chunk-B46ZMVOV.js";
4
+ } from "../chunk-7A4M7PCV.js";
5
+ import "../chunk-X5UY34KT.js";
6
6
  import "../chunk-DIB4GX3G.js";
7
- import "../chunk-I47UGQPJ.js";
7
+ import "../chunk-Q4R73I43.js";
8
8
  import "../chunk-R776HKPK.js";
9
- import "../chunk-FUBRJA5F.js";
10
- import "../chunk-VTDMB7XX.js";
11
- import "../chunk-ZIAMN2UW.js";
9
+ import "../chunk-7UQIVT6G.js";
10
+ import "../chunk-K4SZAP3K.js";
11
+ import "../chunk-AIOK6LAG.js";
12
12
  import "../chunk-3Y47VMHV.js";
13
13
  import "../chunk-HUO3UTAQ.js";
14
14
  import "../chunk-5IDFPCON.js";
15
- import "../chunk-GUWLDMGF.js";
16
- import "../chunk-YD54Q45G.js";
17
- import "../chunk-DXEQAIUV.js";
18
- import "../chunk-ZYAJMESY.js";
15
+ import "../chunk-AVZDSUFB.js";
16
+ import "../chunk-EFLJ2WJH.js";
17
+ import "../chunk-CSZINQJ2.js";
18
+ import "../chunk-Z4YU7Z4L.js";
19
19
  import "../chunk-HLXXQI5Q.js";
20
20
  import "../chunk-PDO5BLNM.js";
21
21
  import "../chunk-UIE3R5XU.js";
22
22
  import {
23
23
  loadAppPluginSet
24
24
  } from "../chunk-Y2CM7HXH.js";
25
- import "../chunk-ZIMRGFYL.js";
26
- import "../chunk-TZRXYWRE.js";
27
- import "../chunk-2UH3JI64.js";
28
- import "../chunk-27TEJTZO.js";
25
+ import "../chunk-YHDERDRO.js";
26
+ import "../chunk-SGZO7UWH.js";
27
+ import "../chunk-YSB2N563.js";
28
+ import "../chunk-DU74WPIC.js";
29
29
  import "../chunk-EM225ITJ.js";
30
- import "../chunk-QUG4JSZK.js";
31
- import "../chunk-XFKIRN3Q.js";
30
+ import "../chunk-ORO3PWKQ.js";
31
+ import "../chunk-7NVJVJID.js";
32
32
  import "../chunk-VFUK3X5B.js";
33
- import "../chunk-JTGS3ZZE.js";
34
- import "../chunk-5PNPQYTO.js";
35
- import "../chunk-SIN3MXH6.js";
36
- import "../chunk-CD2XFGYQ.js";
33
+ import "../chunk-RXBVB2JM.js";
34
+ import "../chunk-YBVXBNSV.js";
35
+ import "../chunk-JUUKWRBE.js";
36
+ import "../chunk-GGB4WL5A.js";
37
37
  import "../chunk-RUIXF3YQ.js";
38
38
  import "../chunk-HZF5P5UN.js";
39
39
  import "../chunk-F3B2YJ76.js";
40
- import "../chunk-2LWPFSB4.js";
40
+ import "../chunk-4LJO56OJ.js";
41
41
  import "../chunk-6GWA276C.js";
42
42
  import "../chunk-OOUNJNMR.js";
43
43
  import "../chunk-H4HBKISO.js";
44
- import "../chunk-DS3J6WGY.js";
45
- import "../chunk-GDV5LXRA.js";
44
+ import "../chunk-DLDRQHG5.js";
45
+ import "../chunk-IIOOO4FQ.js";
46
46
  import "../chunk-MLKGABMK.js";
47
47
 
48
48
  // src/cli/chat.ts
@@ -165,10 +165,10 @@ async function configureLocalChatPlugins(pluginSet) {
165
165
  databaseModule
166
166
  ] = await Promise.all([
167
167
  import("../plugins-HW4VWW6G.js"),
168
- import("../agent-hooks-L7D2BDVV.js"),
169
- import("../catalog-runtime-QLAC4Q3W.js"),
170
- import("../validation-HAOLCJ5A.js"),
171
- import("../db-62PW6LM3.js")
168
+ import("../agent-hooks-HS6VGUPM.js"),
169
+ import("../catalog-runtime-M6ZTPYRV.js"),
170
+ import("../validation-WDTAULUF.js"),
171
+ import("../db-CSEW4RII.js")
172
172
  ]);
173
173
  const resolvedPluginSet = pluginSet === void 0 ? await loadLocalPluginSet() : pluginSet ?? void 0;
174
174
  const plugins = pluginsModule.pluginRuntimeRegistrationsFromPluginSet(resolvedPluginSet);
@@ -234,14 +234,14 @@ async function prepareLocalChatRun(io, pluginSet) {
234
234
  await configureLocalChatPlugins(pluginSet);
235
235
  const { setExperimentalFeatures } = await import("../experimental-HH6OM6UH.js");
236
236
  setExperimentalFeatures({ subagents: true });
237
- const { runLocalAgentTurn } = await import("../runner-GCRPG3GQ.js");
238
- const { startLocalOAuthCallbackServer } = await import("../oauth-callback-server-6NZNHJAM.js");
237
+ const { runLocalAgentTurn } = await import("../runner-U3XHSKSH.js");
238
+ const { startLocalOAuthCallbackServer } = await import("../oauth-callback-server-FUEV5HNG.js");
239
239
  const { createLocalOAuthState } = await import("../oauth-relay-3ZU72UGL.js");
240
240
  const { createLocalSandboxEgressSignalTransport } = await import("../sandbox-egress-signals-EKPAVWQL.js");
241
- const { bindSpawnAgent } = await import("../spawn-7WK37BTD.js");
242
- const { createAgentInvocationWorker, routeAgentInvocationWork } = await import("../work-R4XYKMUW.js");
241
+ const { bindSpawnAgent } = await import("../spawn-B6GDTWJ4.js");
242
+ const { createAgentInvocationWorker, routeAgentInvocationWork } = await import("../work-C3HAO2BG.js");
243
243
  const { createLocalConversationWork } = await import("../conversation-work-KATFHLG3.js");
244
- const { processConversationWork } = await import("../worker-U2UCVR7M.js");
244
+ const { processConversationWork } = await import("../worker-LNP4YKBM.js");
245
245
  let agentRunner;
246
246
  const localConversationWork = createLocalConversationWork(async (message) => {
247
247
  if (!agentRunner) {
package/dist/cli/check.js CHANGED
@@ -1,15 +1,15 @@
1
1
  import {
2
2
  parseSkillFile
3
- } from "../chunk-5PNPQYTO.js";
4
- import "../chunk-SIN3MXH6.js";
3
+ } from "../chunk-YBVXBNSV.js";
4
+ import "../chunk-JUUKWRBE.js";
5
5
  import {
6
6
  parseInlinePluginManifest,
7
7
  parsePluginManifest
8
- } from "../chunk-CD2XFGYQ.js";
8
+ } from "../chunk-GGB4WL5A.js";
9
9
  import "../chunk-RUIXF3YQ.js";
10
10
  import "../chunk-HZF5P5UN.js";
11
11
  import "../chunk-F3B2YJ76.js";
12
- import "../chunk-2LWPFSB4.js";
12
+ import "../chunk-4LJO56OJ.js";
13
13
  import "../chunk-6GWA276C.js";
14
14
  import "../chunk-OOUNJNMR.js";
15
15
  import "../chunk-H4HBKISO.js";
@@ -17,8 +17,8 @@ import {
17
17
  JUNIOR_CONVERSATION_WORK_CALLBACK_ROUTE,
18
18
  JUNIOR_HEARTBEAT_ROUTE,
19
19
  LEGACY_JUNIOR_CONVERSATION_WORK_FUNCTION
20
- } from "../chunk-DS3J6WGY.js";
21
- import "../chunk-GDV5LXRA.js";
20
+ } from "../chunk-DLDRQHG5.js";
21
+ import "../chunk-IIOOO4FQ.js";
22
22
  import "../chunk-MLKGABMK.js";
23
23
 
24
24
  // src/cli/check.ts
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  validatePluginEgressCredentialHooks,
3
3
  validatePluginRegistrations
4
- } from "../chunk-WF5HVH3M.js";
4
+ } from "../chunk-YNTTROJT.js";
5
5
  import {
6
6
  pluginCatalogConfigFromPluginSet,
7
7
  pluginCliRegistrationsFromPluginSet,
@@ -14,30 +14,30 @@ import {
14
14
  createPluginLogger,
15
15
  setPlugins,
16
16
  validatePlugins
17
- } from "../chunk-ZIMRGFYL.js";
18
- import "../chunk-TZRXYWRE.js";
17
+ } from "../chunk-YHDERDRO.js";
18
+ import "../chunk-SGZO7UWH.js";
19
19
  import {
20
20
  getDb
21
- } from "../chunk-2UH3JI64.js";
22
- import "../chunk-27TEJTZO.js";
21
+ } from "../chunk-YSB2N563.js";
22
+ import "../chunk-DU74WPIC.js";
23
23
  import "../chunk-EM225ITJ.js";
24
- import "../chunk-QUG4JSZK.js";
25
- import "../chunk-XFKIRN3Q.js";
24
+ import "../chunk-ORO3PWKQ.js";
25
+ import "../chunk-7NVJVJID.js";
26
26
  import "../chunk-VFUK3X5B.js";
27
- import "../chunk-JTGS3ZZE.js";
27
+ import "../chunk-RXBVB2JM.js";
28
28
  import {
29
29
  pluginCatalogRuntime
30
- } from "../chunk-SIN3MXH6.js";
31
- import "../chunk-CD2XFGYQ.js";
30
+ } from "../chunk-JUUKWRBE.js";
31
+ import "../chunk-GGB4WL5A.js";
32
32
  import "../chunk-RUIXF3YQ.js";
33
33
  import "../chunk-HZF5P5UN.js";
34
34
  import "../chunk-F3B2YJ76.js";
35
- import "../chunk-2LWPFSB4.js";
35
+ import "../chunk-4LJO56OJ.js";
36
36
  import "../chunk-6GWA276C.js";
37
37
  import "../chunk-OOUNJNMR.js";
38
38
  import "../chunk-H4HBKISO.js";
39
- import "../chunk-DS3J6WGY.js";
40
- import "../chunk-GDV5LXRA.js";
39
+ import "../chunk-DLDRQHG5.js";
40
+ import "../chunk-IIOOO4FQ.js";
41
41
  import "../chunk-MLKGABMK.js";
42
42
 
43
43
  // src/cli/plugins.ts