@sentry/junior 0.261.0 → 0.263.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 (71) hide show
  1. package/dist/{adapter-Bx_1B2De.js → adapter-BIacI0Bt.js} +2 -2
  2. package/dist/{admin-BAbbVgVc.js → admin-C7vUk7s9.js} +1 -1
  3. package/dist/{agent-hooks-ghyZZQqB.js → agent-hooks-CqnZfuCt.js} +126 -36
  4. package/dist/{agent-invocations-Qfz7dWgU.js → agent-invocations-CxKldAeB.js} +1 -0
  5. package/dist/{agent-runner-g110-xgg.js → agent-runner-BUBas7Yy.js} +150 -683
  6. package/dist/api/schema.d.ts +4 -0
  7. package/dist/api/schema.js +3 -3
  8. package/dist/api.js +34 -30
  9. package/dist/{app-VCiPQ65Q.d.ts → app-Bo0kB987.d.ts} +1 -1
  10. package/dist/app.d.ts +1 -1
  11. package/dist/app.js +55 -61
  12. package/dist/{assistant-reply-CQcMaWNL.js → assistant-reply-BFmjgJjD.js} +1 -1
  13. package/dist/{automation-DrpcA-SX.js → automation-CWX0qL8U.js} +1 -1
  14. package/dist/{briefs-CKcfrIQL.js → briefs-h55v5lX9.js} +4 -4
  15. package/dist/{catalog-runtime-cd60vzAB.js → catalog-runtime-Suf-aLlh.js} +1 -1
  16. package/dist/cli/chat.js +15 -17
  17. package/dist/cli/check.js +3 -3
  18. package/dist/cli/main.js +3 -3
  19. package/dist/cli/plugins.js +4 -4
  20. package/dist/cli/snapshot-create.js +4 -4
  21. package/dist/cli/upgrade.js +3 -3
  22. package/dist/{client-2i0JJpoC.js → client-DZBCBj1M.js} +2 -2
  23. package/dist/{config-C9qM41O0.js → config-Dnv8KmNs.js} +2 -2
  24. package/dist/{connections-DrtTrwkp.js → connections-Br0_xv27.js} +10 -10
  25. package/dist/{conversation-CvuKJ3tA.js → conversation-B0baEwoA.js} +2 -0
  26. package/dist/{conversation-privacy-1iTiFX1O.js → conversation-privacy-FY8yc2q3.js} +1 -1
  27. package/dist/{credential-sync-wKNQ1dYc.js → credential-sync-BvkiyWF5.js} +14 -14
  28. package/dist/{executor-Rimyj8HZ.js → executor-J9k2sp9m.js} +4 -3
  29. package/dist/{images-D1JggcVY.js → images-DV2FlEGL.js} +3 -3
  30. package/dist/instrumentation.js +2 -2
  31. package/dist/{job-queue-BjQdSqA3.js → job-queue-B4yTgklN.js} +1 -1
  32. package/dist/{logging-BLTa7R7f.js → logging-Dk_FpF36.js} +1 -1
  33. package/dist/{message-DAeP5WWW.js → message-BzseAFH1.js} +4 -3
  34. package/dist/nitro.d.ts +1 -1
  35. package/dist/nitro.js +3 -3
  36. package/dist/{oauth-callback-server-BAy1hhF1.js → oauth-callback-server-bTspTMCC.js} +2 -2
  37. package/dist/{profile-CthM2qFM.js → profile-Dq5I7TV1.js} +13 -6
  38. package/dist/{prompt-DeVax2qO.js → prompt-CxatQVaj.js} +1 -1
  39. package/dist/{registry-BnSaArNb.js → registry-BFzQFV_y.js} +1 -1
  40. package/dist/{resolve-B5eLRl0v.js → resolve-CnRHib0U.js} +4 -4
  41. package/dist/{result-Cvm0GZCv.js → result-DczfmNBa.js} +18 -12
  42. package/dist/{runner-D-pUzHbU.js → runner-CJd9Wec-.js} +11 -11
  43. package/dist/{sandbox-egress-signals-mvwGV7rl.js → sandbox-egress-signals-DUmVkOx4.js} +1 -1
  44. package/dist/{schema-OzL8Zw4H.js → schema-QidbykYl.js} +3 -3
  45. package/dist/{service-account-DWxvpSfd.js → service-account-BI2kQDrb.js} +3 -3
  46. package/dist/{service-account-Ch1uIpnR.js → service-account-x2QZXm4X.js} +3 -3
  47. package/dist/{session-stop-Boj_zpTa.js → session-stop-CtyJsnEj.js} +12 -12
  48. package/dist/{skills-BpdYCfFt.js → skills-Dbzx9-rS.js} +2 -2
  49. package/dist/{spawn-h1DJMQTf.js → spawn-D8WU99UV.js} +3 -2
  50. package/dist/store-TKg1HVKx.js +697 -0
  51. package/dist/{store-B6KqcdCQ.js → store-UlOrW6JC.js} +6 -6
  52. package/dist/{task-queue-BaDwKSYv.js → task-queue-BRB49H-J.js} +3 -3
  53. package/dist/{task-runner-BAX5li9a.js → task-runner-C575f2Dd.js} +19 -11
  54. package/dist/{tasks-uCfmlWga.js → tasks-LOItiYgL.js} +46 -66
  55. package/dist/{thread-state-BJHVIz8G.js → thread-state-IDHdZA7R.js} +5 -5
  56. package/dist/{turn-failure-response-CCC76P6-.js → turn-failure-response-h_LSXJ-M.js} +46 -20
  57. package/dist/{turn-lifecycle-pHSESVR9.js → turn-lifecycle-Cvi6Sb8Y.js} +1 -1
  58. package/dist/{turn-session-routing-BIKJZaiw.js → turn-session-routing-5Nyv4fso.js} +1 -1
  59. package/dist/{validation-B9KL_5Wc.js → validation-BeTriWC2.js} +1 -1
  60. package/dist/{version-CN9BXMW_.js → version-BQX_hLDC.js} +1 -1
  61. package/dist/version.js +1 -1
  62. package/dist/{viewer-C5xFaYVi.js → viewer-DmNRM88V.js} +4 -4
  63. package/dist/{web-input-D6eqfXYd.js → web-input-BHcGXSox.js} +97 -36
  64. package/dist/{work-C-ecZAme.js → work-DLJMV02b.js} +41 -10
  65. package/dist/{worker-BpYDqiOf.js → worker-vfG2ESg1.js} +5 -5
  66. package/migrations/0062_plugin_report_index.sql +20 -0
  67. package/migrations/0063_agent_invocation_type.sql +1 -0
  68. package/migrations/meta/0062_snapshot.json +3499 -0
  69. package/migrations/meta/0063_snapshot.json +3505 -0
  70. package/migrations/meta/_journal.json +14 -0
  71. package/package.json +4 -4
@@ -1,7 +1,7 @@
1
- import { i as getChatConfig } from "./config-C9qM41O0.js";
1
+ import { i as getChatConfig } from "./config-Dnv8KmNs.js";
2
+ import { setTimeout } from "node:timers/promises";
2
3
  import { createMemoryState } from "@chat-adapter/state-memory";
3
4
  import { createRedisState } from "@chat-adapter/state-redis";
4
- import { setTimeout } from "node:timers/promises";
5
5
  // src/chat/state/locks.ts
6
6
  const ACTIVE_LOCK_TTL_MS = 9e4;
7
7
  const MUTATION_LOCK_TTL_MS = 1e4;
@@ -1,4 +1,4 @@
1
- import { a as setUserAdminFromSql, d as getDb, n as listAdminUsersFromSql } from "./viewer-C5xFaYVi.js";
1
+ import { a as setUserAdminFromSql, d as getDb, n as listAdminUsersFromSql } from "./viewer-DmNRM88V.js";
2
2
  import { CLI_USAGE } from "./cli/run.js";
3
3
  // src/cli/admin.ts
4
4
  /**
@@ -1,21 +1,21 @@
1
1
  import { t as __exportAll } from "./rolldown-runtime-nwUcYXjP.js";
2
- import { i as completeObject, o as embedTexts } from "./client-2i0JJpoC.js";
3
- import { T as withSpan, a as extractGenAiUsageSummary, b as setSpanStatus, f as logException, m as logWarn, p as logInfo, y as setSpanAttributes, z as isRecord$1 } from "./logging-BLTa7R7f.js";
2
+ import { i as completeObject, o as embedTexts } from "./client-DZBCBj1M.js";
3
+ import { T as withSpan, a as extractGenAiUsageSummary, b as setSpanStatus, f as logException, m as logWarn, p as logInfo, y as setSpanAttributes, z as isRecord$1 } from "./logging-Dk_FpF36.js";
4
4
  import { a as getClient$1 } from "./sentry-BBUlHih9.js";
5
- import { t as canExposeConversationPayload } from "./conversation-privacy-1iTiFX1O.js";
6
- import { i as getChatConfig, n as botConfig, o as getSlackBotToken } from "./config-C9qM41O0.js";
5
+ import { t as canExposeConversationPayload } from "./conversation-privacy-FY8yc2q3.js";
6
+ import { i as getChatConfig, n as botConfig, o as getSlackBotToken } from "./config-Dnv8KmNs.js";
7
7
  import { r as defaultModelId } from "./model-profile-Bg8EoCKD.js";
8
8
  import { d as parseSlackTeamId, g as parseSlackMessageTs, i as isActorUserId, o as parseActorUserId, u as parseSlackChannelReferenceId } from "./actor-tlxzqaRe.js";
9
- import { D as hasAgentTurnUsage, M as readUserTimezone, P as saveUserTimezone, c as getConversationEventStore, d as getDb, f as getSqlExecutor, g as createSqlStore, i as resolveViewerUser, r as readActorIdentity } from "./viewer-C5xFaYVi.js";
10
- import { c as juniorIdentities, d as juniorDestinations, l as juniorUsers, s as juniorConversations } from "./agent-invocations-Qfz7dWgU.js";
11
- import { _ as juniorConversationAnnotations, b as juniorAttachments, f as juniorConversationBriefs, h as juniorConversationEvents, i as juniorWorkspaces, n as juniorSnapshots, r as juniorWorkspaceRepos, u as juniorConversationParticipants, v as juniorCodeChanges, y as juniorCodeRepositories } from "./executor-Rimyj8HZ.js";
9
+ import { D as hasAgentTurnUsage, M as readUserTimezone, P as saveUserTimezone, c as getConversationEventStore, d as getDb, f as getSqlExecutor, g as createSqlStore, i as resolveViewerUser, r as readActorIdentity } from "./viewer-DmNRM88V.js";
10
+ import { c as juniorIdentities, d as juniorDestinations, l as juniorUsers, s as juniorConversations } from "./agent-invocations-CxKldAeB.js";
11
+ import { _ as juniorConversationAnnotations, b as juniorAttachments, f as juniorConversationBriefs, h as juniorConversationEvents, i as juniorWorkspaces, n as juniorSnapshots, r as juniorWorkspaceRepos, u as juniorConversationParticipants, v as juniorCodeChanges, y as juniorCodeRepositories } from "./executor-J9k2sp9m.js";
12
12
  import { o as decodeStoredConversationEvent } from "./history-AY8rs-FR.js";
13
- import { h as credentialSubjectSchema } from "./registry-BnSaArNb.js";
13
+ import { h as credentialSubjectSchema } from "./registry-BFzQFV_y.js";
14
+ import { n as getDefaultRedisStateAdapterFor, r as getStateAdapter, s as withLock } from "./adapter-BIacI0Bt.js";
14
15
  import { i as isValidTimeZone } from "./cadence-R7Em4RjE.js";
15
- import { B as readMessageAttachments, C as conversationReportEventSchema, F as readMessageCardRefs, J as parseBriefInput, q as conversationBriefSchema, w as conversationReportMessageEventSchema } from "./conversation-CvuKJ3tA.js";
16
- import { n as briefEntriesFromReportEvents, s as generateBrief, t as BRIEF_PROMPT } from "./prompt-DeVax2qO.js";
17
- import { n as getDefaultRedisStateAdapterFor, r as getStateAdapter } from "./adapter-Bx_1B2De.js";
18
- import { E as SANDBOX_WORKSPACE_ROOT, S as runNonInteractiveCommand, l as isSandboxMissingError, n as hash, v as getVercelSandboxCredentials, y as sleep$1 } from "./profile-CthM2qFM.js";
16
+ import { B as readMessageAttachments, C as conversationReportEventSchema, F as readMessageCardRefs, J as parseBriefInput, q as conversationBriefSchema, w as conversationReportMessageEventSchema } from "./conversation-B0baEwoA.js";
17
+ import { n as briefEntriesFromReportEvents, s as generateBrief, t as BRIEF_PROMPT } from "./prompt-CxatQVaj.js";
18
+ import { D as SANDBOX_WORKSPACE_ROOT, S as runNonInteractiveCommand, l as isSandboxMissingError, n as hash, v as getVercelSandboxCredentials, y as sleep$1 } from "./profile-Dq5I7TV1.js";
19
19
  import { AsyncLocalStorage } from "node:async_hooks";
20
20
  import { z } from "zod";
21
21
  import { createHash, createHmac, randomUUID, timingSafeEqual } from "node:crypto";
@@ -157,6 +157,46 @@ function renderJuniorNativeConversationEvent(args) {
157
157
  const presentation = definition.renderEvent(definition.parse(args.content));
158
158
  return presentation === void 0 ? void 0 : conversationEventPresentationSchema.parse(presentation);
159
159
  }
160
+ // src/chat/state/cache.ts
161
+ const MAX_CACHE_KEY_LENGTH = 512;
162
+ const LOAD_WAIT_MS = 1e4;
163
+ /**
164
+ * Create a cache in the state adapter under `junior:cache:{namespace}:`.
165
+ * Entries are wrapped, so `null` and `false` values are cache hits.
166
+ */
167
+ function createCache(state, namespace) {
168
+ return { async getOrLoad(key, load, options) {
169
+ if (!key.trim()) throw new Error("Cache key is required");
170
+ if (key.length > MAX_CACHE_KEY_LENGTH) throw new Error("Cache key exceeds the maximum length");
171
+ const cacheKey = `junior:cache:${namespace}:${key}`;
172
+ const cached = async () => options?.refresh ? void 0 : await state.get(cacheKey) ?? void 0;
173
+ await state.connect();
174
+ const hit = await cached();
175
+ if (hit) return hit.value;
176
+ const attempt = await withLock(state, `${cacheKey}:load`, async () => {
177
+ const loadedMeanwhile = await cached();
178
+ if (loadedMeanwhile) return loadedMeanwhile.value;
179
+ const entry = await load();
180
+ if (entry.ttlMs !== void 0) {
181
+ if (!(entry.ttlMs > 0)) throw new Error("Cache ttlMs must be positive");
182
+ await state.set(cacheKey, { value: entry.value }, entry.ttlMs);
183
+ }
184
+ return entry.value;
185
+ }, {
186
+ keepAlive: true,
187
+ waitMs: LOAD_WAIT_MS
188
+ });
189
+ if (attempt.acquired) return attempt.value;
190
+ return (await load()).value;
191
+ } };
192
+ }
193
+ // src/chat/plugins/cache.ts
194
+ /** Create the cache scoped to one plugin. */
195
+ function createPluginCache(plugin) {
196
+ return { async getOrLoad(key, load, options) {
197
+ return await createCache(getStateAdapter(), `plugin:${plugin}`).getOrLoad(key, load, options);
198
+ } };
199
+ }
160
200
  // src/chat/slack/user.ts
161
201
  const slackUserInfoSchema = z.object({
162
202
  ok: z.literal(true),
@@ -286,25 +326,49 @@ function createPluginAnnotations(args) {
286
326
  await args.db.delete(juniorConversationAnnotations).where(and(eq(juniorConversationAnnotations.conversationId, args.conversationId), eq(juniorConversationAnnotations.plugin, args.plugin), eq(juniorConversationAnnotations.kind, kind), eq(juniorConversationAnnotations.key, key)));
287
327
  },
288
328
  async list() {
289
- return (await listConversationAnnotations(args.db, args.conversationId)).filter((a) => a.plugin === args.plugin);
329
+ return (await args.db.select().from(juniorConversationAnnotations).where(and(eq(juniorConversationAnnotations.conversationId, args.conversationId), eq(juniorConversationAnnotations.plugin, args.plugin))).orderBy(desc(juniorConversationAnnotations.updatedAt))).flatMap((row) => annotationFromRow(row) ?? []);
290
330
  }
291
331
  };
292
332
  }
293
- /** Load stored annotations for one conversation, newest update first. */
333
+ /**
334
+ * Load stored annotations for one conversation, newest update first. A root
335
+ * Conversation also reads the annotations of its child Conversations.
336
+ */
294
337
  async function listConversationAnnotations(db, conversationId) {
295
338
  return (await listConversationAnnotationsById(db, [conversationId])).get(conversationId) ?? [];
296
339
  }
297
- /** Load stored annotations for a bounded set of conversations. */
340
+ /**
341
+ * Load stored annotations for a bounded set of conversations, newest update
342
+ * first. Child agents save annotations in their own Conversation, but people
343
+ * see the root Conversation. So a root also reads the annotations of every
344
+ * Conversation in its tree. The newest annotation wins for each object.
345
+ */
298
346
  async function listConversationAnnotationsById(db, conversationIds) {
299
347
  const byConversation = /* @__PURE__ */ new Map();
300
348
  if (conversationIds.length === 0) return byConversation;
301
- const rows = await db.select().from(juniorConversationAnnotations).where(inArray(juniorConversationAnnotations.conversationId, [...conversationIds])).orderBy(desc(juniorConversationAnnotations.updatedAt));
302
- for (const row of rows) {
349
+ const requested = new Set(conversationIds);
350
+ const rows = await db.select({
351
+ annotation: juniorConversationAnnotations,
352
+ rootConversationId: juniorConversations.rootConversationId
353
+ }).from(juniorConversationAnnotations).innerJoin(juniorConversations, eq(juniorConversations.conversationId, juniorConversationAnnotations.conversationId)).where(or(inArray(juniorConversationAnnotations.conversationId, [...requested]), inArray(juniorConversations.rootConversationId, [...requested]))).orderBy(desc(juniorConversationAnnotations.updatedAt));
354
+ const seen = /* @__PURE__ */ new Set();
355
+ for (const { annotation: row, rootConversationId } of rows) {
303
356
  const annotation = annotationFromRow(row);
304
357
  if (!annotation) continue;
305
- const current = byConversation.get(row.conversationId);
306
- if (current) current.push(annotation);
307
- else byConversation.set(row.conversationId, [annotation]);
358
+ for (const owner of /* @__PURE__ */ new Set([row.conversationId, rootConversationId])) {
359
+ if (!owner || !requested.has(owner)) continue;
360
+ const objectKey = JSON.stringify([
361
+ owner,
362
+ row.plugin,
363
+ row.kind,
364
+ row.key
365
+ ]);
366
+ if (seen.has(objectKey)) continue;
367
+ seen.add(objectKey);
368
+ const current = byConversation.get(owner);
369
+ if (current) current.push(annotation);
370
+ else byConversation.set(owner, [annotation]);
371
+ }
308
372
  }
309
373
  return byConversation;
310
374
  }
@@ -753,6 +817,7 @@ function reportEventData(args) {
753
817
  role: data.role,
754
818
  ...data.meta?.source === "web" || data.meta?.source === "slack" ? { source: data.meta.source } : void 0,
755
819
  ...actorIdentity ? { actorIdentity } : void 0,
820
+ ...typeof data.meta?.agentInvocationId === "string" ? { agentInvocationId: data.meta.agentInvocationId } : void 0,
756
821
  eventObjectType: objectTypeSchema.safeParse(data.meta?.eventObjectType).data,
757
822
  ...typeof data.meta?.eventType === "string" ? { eventType: data.meta.eventType } : void 0,
758
823
  ...typeof data.meta?.explicitMention === "boolean" ? { explicitMention: data.meta.explicitMention } : void 0,
@@ -1767,6 +1832,27 @@ function createPluginState(plugin, adapter) {
1767
1832
  }
1768
1833
  };
1769
1834
  }
1835
+ // src/chat/tools/execution/plugin-tool-denied-error.ts
1836
+ const PLUGIN_DENIAL_INSTRUCTIONS = [
1837
+ "This action was blocked by policy and was not executed.",
1838
+ "Do not retry it or reach the same result through a workaround or another tool.",
1839
+ "Stop and explain what was blocked and why."
1840
+ ].join("\n");
1841
+ /** Expected tool failure when a plugin hook refuses a tool call by policy. */
1842
+ var PluginToolDeniedError = class extends Error {
1843
+ constructor(reason) {
1844
+ super(`${PLUGIN_DENIAL_INSTRUCTIONS}\nReason: ${reason}`);
1845
+ this.name = "PluginToolDeniedError";
1846
+ }
1847
+ };
1848
+ // src/chat/tools/execution/tool-input-error.ts
1849
+ /** Thrown when a tool fails due to invalid model/user input, not a system error. */
1850
+ var ToolInputError = class extends Error {
1851
+ constructor(message, options) {
1852
+ super(message, options);
1853
+ this.name = "ToolInputError";
1854
+ }
1855
+ };
1770
1856
  // src/chat/dashboard-link.ts
1771
1857
  let dashboardConversationLinkOptions;
1772
1858
  function withHttps(host) {
@@ -3369,7 +3455,6 @@ function coreTaskRegistrations() {
3369
3455
  }
3370
3456
  // src/chat/plugins/agent-hooks.ts
3371
3457
  var agent_hooks_exports = /* @__PURE__ */ __exportAll({
3372
- PluginHookDeniedError: () => PluginHookDeniedError,
3373
3458
  applyPluginFormatMarkdown: () => applyPluginFormatMarkdown,
3374
3459
  createPluginHookRunner: () => createPluginHookRunner,
3375
3460
  getPluginApiRoutes: () => getPluginApiRoutes,
@@ -3384,13 +3469,6 @@ var agent_hooks_exports = /* @__PURE__ */ __exportAll({
3384
3469
  setPlugins: () => setPlugins,
3385
3470
  validatePlugins: () => validatePlugins
3386
3471
  });
3387
- /** Signal that a plugin intentionally denied a tool execution. */
3388
- var PluginHookDeniedError = class extends Error {
3389
- constructor(message) {
3390
- super(message);
3391
- this.name = "PluginHookDeniedError";
3392
- }
3393
- };
3394
3472
  let registeredPlugins = [];
3395
3473
  const PLUGIN_NAME_RE = /^[a-z][a-z0-9-]*$/;
3396
3474
  const PLUGIN_TASK_NAME_RE = /^[a-z][A-Za-z0-9]*$/;
@@ -3423,6 +3501,7 @@ function basePluginContext(plugin) {
3423
3501
  const name = plugin.manifest.name;
3424
3502
  return {
3425
3503
  plugin: { name },
3504
+ cache: createPluginCache(name),
3426
3505
  log: createPluginLogger(name),
3427
3506
  db: getDb()
3428
3507
  };
@@ -3783,9 +3862,17 @@ function getPluginTools(context, sandbox = createSandboxCapability(context.works
3783
3862
  });
3784
3863
  }
3785
3864
  },
3786
- workspaces: { async findByRepository(input) {
3787
- return await listWorkspaceNamesByRepository(getDb(), input);
3788
- } }
3865
+ workspaces: {
3866
+ async active() {
3867
+ const id = context.workspaces?.activeWorkspaceId();
3868
+ if (!id) return void 0;
3869
+ const workspace = await getWorkspace(getDb(), id);
3870
+ return workspace ? { name: workspace.name } : {};
3871
+ },
3872
+ async findByRepository(input) {
3873
+ return await listWorkspaceNamesByRepository(getDb(), input);
3874
+ }
3875
+ }
3789
3876
  };
3790
3877
  let pluginContext;
3791
3878
  switch (context.source.kind) {
@@ -4309,7 +4396,7 @@ function createPluginHookRunner(input = {}) {
4309
4396
  const hook = plugin.hooks?.beforeToolExecute;
4310
4397
  if (!hook) continue;
4311
4398
  let replacement;
4312
- let denied;
4399
+ let blocked;
4313
4400
  await hook({
4314
4401
  ...basePluginContext(plugin),
4315
4402
  actor: input.actor,
@@ -4328,15 +4415,18 @@ function createPluginHookRunner(input = {}) {
4328
4415
  }
4329
4416
  },
4330
4417
  decision: {
4331
- deny(message) {
4332
- denied = message;
4418
+ deny(reason) {
4419
+ blocked = new PluginToolDeniedError(reason);
4420
+ },
4421
+ redirect(message) {
4422
+ blocked = new ToolInputError(message);
4333
4423
  },
4334
4424
  replaceInput(input) {
4335
4425
  replacement = input;
4336
4426
  }
4337
4427
  }
4338
4428
  });
4339
- if (denied) throw new PluginHookDeniedError(denied);
4429
+ if (blocked) throw blocked;
4340
4430
  if (replacement !== void 0) {
4341
4431
  if (!isRecord(replacement)) throw new Error(`Plugin "${pluginName}" replaced tool input with a non-object value`);
4342
4432
  nextInput = { ...replacement };
@@ -4349,4 +4439,4 @@ function createPluginHookRunner(input = {}) {
4349
4439
  }
4350
4440
  };
4351
4441
  }
4352
- export { bindSlackDirectCredentialSubject as $, authenticationUnlinkedEvent as $t, getWorkspaceSnapshotBuilder as A, conversationIsMemberRoot as At, STOP_WATCHING_TOOL_NAME as B, readAttachmentVisionSummary as Bt, WorkspaceValidationError as C, createPluginModel as Ct, setWorkspaceSnapshotBuild as D, conversationArchivedForEmail as Dt, setWorkspaceSnapshot as E, conversationArchiveTimes as Et, isSlackMessageTurn as F, readLatestConversationBrief as Ft, createWatch as G, listConversationAnnotations as Gt, cancelWatch as H, resolveRootVisibility as Ht, slackMessageTurnDisabledReason as I, readConversationEventPage as It, getWatch as J, resolveUserTimezone as Jt, deliverWatch as K, listConversationAnnotationsById as Kt, RESOURCE_SUBSCRIPTION_DEFAULT_TTL_MS as L, buildSentryConversationUrl as Lt, workspaceRepoCheckoutPath as M, conversationNotArchivedForUser as Mt, resolveChannelCapabilities as N, viewerConversationMembership as Nt, SANDBOX_RUNTIME as O, conversationArchivedForUser as Ot, getSlackToolContext as P, createPluginConversationEvents as Pt, bindScheduledAutomationCredentialSubject as Q, authenticationLinkedEvent as Qt, RESOURCE_SUBSCRIPTION_MAX_TTL_MS as R, getSlackFileId as Rt, updateWorkspace as S, createPluginEmbedder as St, loadSnapshotsForProfile as T, readConversationAccessFromSql as Tt, collectEventMatchKeys as U, saveObjectAnnotations as Ut, cancelSubscriptions as V, recordSlackAttachment as Vt, createTimerWatch as W, createPluginAnnotations as Wt, takeDueTimerWatches as X, JUNIOR_NATIVE_EVENT_NAMESPACE as Xt, listWatches as Y, lookupSlackUser as Yt, bindEventAutomationCredentialSubject as Z, agentsInstructionsUpdatedEvent as Zt, deleteWorkspace as _, getDashboardConversationLink as _t, getPluginRoutes as a, downloadPrivateSlackFile as at, listWorkspaces as b, setDashboardConversationLinkOptions as bt, getPluginTools as c, getSlackClient as ct, setPlugins as d, normalizeSlackConversationId as dt, conversationNoteEvent as en, verifyEventAutomationCredentialSubject as et, validatePlugins as f, runWithSlackInstallationToken as ft, createWorkspace as g, JUNIOR_THREAD_STATE_TTL_MS as gt, setBriefsConfig as h, runWithWorkspaceTeamId as ht, getPluginApiRoutes as i, SlackActionError as it, tryWorkspaceRepoCheckoutPath as j, conversationNotArchivedForEmail as jt, deleteWorkspaceSnapshotBuilders as k, conversationHasParticipantUser as kt, getPluginUserPromptContributions as l, isConversationScopedChannel as lt, registration_exports as m, getWorkspaceTeamId as mt, applyPluginFormatMarkdown as n, verifySlackDirectCredentialSubject as nt, getPluginSlackConversationLink as o, getFilePermalink as ot, coreTaskRegistrations as p, withSlackRetries as pt, findMatchingWatches as q, defaultTimezone as qt, createPluginHookRunner as r, verifyTimerWatchCredentialSubject as rt, getPluginSystemPromptContributions as s, getHeaderString as st, agent_hooks_exports as t, verifyScheduledAutomationCredentialSubject as tt, getPlugins as u, isDmChannel as ut, getWorkspace as v, getDashboardObjectIconLink as vt, invalidateReadySnapshot as w, createPluginLogger as wt, listWorkspacesByRepository as x, createPluginState as xt, getWorkspaceByName as y, getDashboardTaskLink as yt, RESOURCE_WATCH_TOOL_SOURCE as z, matchSlackAttachments as zt };
4442
+ export { bindSlackDirectCredentialSubject as $, createCache as $t, getWorkspaceSnapshotBuilder as A, conversationArchivedForUser as At, STOP_WATCHING_TOOL_NAME as B, getSlackFileId as Bt, WorkspaceValidationError as C, createPluginState as Ct, setWorkspaceSnapshotBuild as D, readConversationAccessFromSql as Dt, setWorkspaceSnapshot as E, createPluginLogger as Et, isSlackMessageTurn as F, viewerConversationMembership as Ft, createWatch as G, saveObjectAnnotations as Gt, cancelWatch as H, readAttachmentVisionSummary as Ht, slackMessageTurnDisabledReason as I, createPluginConversationEvents as It, getWatch as J, listConversationAnnotationsById as Jt, deliverWatch as K, createPluginAnnotations as Kt, RESOURCE_SUBSCRIPTION_DEFAULT_TTL_MS as L, readLatestConversationBrief as Lt, workspaceRepoCheckoutPath as M, conversationIsMemberRoot as Mt, resolveChannelCapabilities as N, conversationNotArchivedForEmail as Nt, SANDBOX_RUNTIME as O, conversationArchiveTimes as Ot, getSlackToolContext as P, conversationNotArchivedForUser as Pt, bindScheduledAutomationCredentialSubject as Q, createPluginCache as Qt, RESOURCE_SUBSCRIPTION_MAX_TTL_MS as R, readConversationEventPage as Rt, updateWorkspace as S, PluginToolDeniedError as St, loadSnapshotsForProfile as T, createPluginModel as Tt, collectEventMatchKeys as U, recordSlackAttachment as Ut, cancelSubscriptions as V, matchSlackAttachments as Vt, createTimerWatch as W, resolveRootVisibility as Wt, takeDueTimerWatches as X, resolveUserTimezone as Xt, listWatches as Y, defaultTimezone as Yt, bindEventAutomationCredentialSubject as Z, lookupSlackUser as Zt, deleteWorkspace as _, getDashboardConversationLink as _t, getPluginRoutes as a, downloadPrivateSlackFile as at, listWorkspaces as b, setDashboardConversationLinkOptions as bt, getPluginTools as c, getSlackClient as ct, setPlugins as d, normalizeSlackConversationId as dt, JUNIOR_NATIVE_EVENT_NAMESPACE as en, verifyEventAutomationCredentialSubject as et, validatePlugins as f, runWithSlackInstallationToken as ft, createWorkspace as g, JUNIOR_THREAD_STATE_TTL_MS as gt, setBriefsConfig as h, runWithWorkspaceTeamId as ht, getPluginApiRoutes as i, conversationNoteEvent as in, SlackActionError as it, tryWorkspaceRepoCheckoutPath as j, conversationHasParticipantUser as jt, deleteWorkspaceSnapshotBuilders as k, conversationArchivedForEmail as kt, getPluginUserPromptContributions as l, isConversationScopedChannel as lt, registration_exports as m, getWorkspaceTeamId as mt, applyPluginFormatMarkdown as n, authenticationLinkedEvent as nn, verifySlackDirectCredentialSubject as nt, getPluginSlackConversationLink as o, getFilePermalink as ot, coreTaskRegistrations as p, withSlackRetries as pt, findMatchingWatches as q, listConversationAnnotations as qt, createPluginHookRunner as r, authenticationUnlinkedEvent as rn, verifyTimerWatchCredentialSubject as rt, getPluginSystemPromptContributions as s, getHeaderString as st, agent_hooks_exports as t, agentsInstructionsUpdatedEvent as tn, verifyScheduledAutomationCredentialSubject as tt, getPlugins as u, isDmChannel as ut, getWorkspace as v, getDashboardObjectIconLink as vt, invalidateReadySnapshot as w, createPluginEmbedder as wt, listWorkspacesByRepository as x, ToolInputError as xt, getWorkspaceByName as y, getDashboardTaskLink as yt, RESOURCE_WATCH_TOOL_SOURCE as z, buildSentryConversationUrl as zt };
@@ -155,6 +155,7 @@ const juniorAgentInvocations = pgTable("junior_agent_invocations", {
155
155
  source: jsonb("source_json").$type().notNull(),
156
156
  destination: jsonb("destination_json").$type().notNull(),
157
157
  destinationVisibility: text("destination_visibility").$type(),
158
+ agentType: text("agent_type").$type(),
158
159
  modelProfile: text("model_profile").$type(),
159
160
  reasoningLevel: text("reasoning_level").$type(),
160
161
  parentToolCallId: text("parent_tool_call_id"),