@sentry/junior 0.225.0 → 0.227.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/dist/{agent-hooks-CRuRcOg9.js → agent-hooks-bEwEJhlg.js} +231 -17
  2. package/dist/{agent-runner-Cad1RtWn.js → agent-runner-BGDSjciH.js} +2899 -159
  3. package/dist/api/schema.d.ts +417 -15
  4. package/dist/api/schema.js +4 -4
  5. package/dist/api.js +57 -32
  6. package/dist/{app-BbSD6EtD.d.ts → app-CjRIKZb5.d.ts} +1 -1
  7. package/dist/app.d.ts +1 -1
  8. package/dist/app.js +971 -7685
  9. package/dist/{briefs-BtnkPWT5.js → briefs-BkM_ZW4B.js} +4 -4
  10. package/dist/{catalog-runtime-pv4grNNb.js → catalog-runtime-Cw9V2jpn.js} +1 -1
  11. package/dist/{checkpoint-6fkAdB3g.js → checkpoint-oZYD3-Ar.js} +77 -11
  12. package/dist/cli/chat.js +13 -13
  13. package/dist/cli/check.js +3 -3
  14. package/dist/cli/main.js +1 -1
  15. package/dist/cli/plugins.js +3 -3
  16. package/dist/cli/snapshot-create.js +3 -3
  17. package/dist/cli/upgrade.js +3 -3
  18. package/dist/{client-ihmkx60d.js → client-Pcxo3lGn.js} +2 -2
  19. package/dist/{config-DMg679BW.js → config-CYvEow1F.js} +2 -2
  20. package/dist/{context-Bplcgypl.js → context-0Et9iVSB.js} +1 -1
  21. package/dist/{conversation-Bygi39Xj.js → conversation-BnhOMfEB.js} +113 -25
  22. package/dist/{conversation-privacy-ZYy05Y3q.js → conversation-privacy-hQmyZbOC.js} +1 -1
  23. package/dist/{credential-sync-DCB2SwnQ.js → credential-sync-CUGbiiCM.js} +15 -135
  24. package/dist/{executor-B9R4cHte.js → executor-BXMlFrV6.js} +1 -1
  25. package/dist/history-nukv1YN8.d.ts +127 -0
  26. package/dist/images-8siTAUNW.js +82 -0
  27. package/dist/instrumentation.js +2 -2
  28. package/dist/{vercel-queue-DIkVcfK4.js → job-queue-AI0_QAgc.js} +61 -2
  29. package/dist/{logging-CcTvYQ8A.js → logging-BPBx6WF-.js} +1 -1
  30. package/dist/nitro.d.ts +1 -1
  31. package/dist/nitro.js +3 -4
  32. package/dist/{oauth-authorization-BS4vPJmu.js → oauth-authorization-Cq1GaLIP.js} +1 -1
  33. package/dist/{oauth-callback-server-DnlQsGBJ.js → oauth-callback-server-CnF03VYh.js} +2 -2
  34. package/dist/pending-auth-CHUjr_6d.js +59 -0
  35. package/dist/{profile-CV97YuiL.js → profile-upzC-wN1.js} +4 -4
  36. package/dist/{prompt-CL8zxsmm.js → prompt-CZIQcPHy.js} +1 -1
  37. package/dist/{registry-C8I4IejN.js → registry-DM5aMhjm.js} +2 -2
  38. package/dist/{resolve-DXVAzYa3.js → resolve-sF6Lg7Ay.js} +2 -2
  39. package/dist/{runner-Die1RJ_z.js → runner-Bu2wYpK8.js} +10 -10
  40. package/dist/{sandbox-egress-signals-BZepyVh1.js → sandbox-egress-signals-Dgerhizb.js} +1 -1
  41. package/dist/{schema-BE4uso4i.js → schema-BSiwcvjm.js} +2 -2
  42. package/dist/{skills-DUcDEgDI.js → skills-CAI5s___.js} +2 -2
  43. package/dist/{spawn-o15i3tJu.js → spawn-DRK9TBgY.js} +2 -2
  44. package/dist/{task-queue-D3PLY59C.js → task-queue-iuDAqfZg.js} +3 -4
  45. package/dist/{task-runner-BMl2aM2v.js → task-runner-S3QtH38c.js} +381 -12
  46. package/dist/{thread-state-CAR6gdAm.js → thread-state-C_arVuaN.js} +5 -5
  47. package/dist/{turn-failure-response-CZyoUMkD.js → turn-failure-response-DarwGYgC.js} +9 -10
  48. package/dist/{turn-lifecycle-DPDHKi2U.js → turn-lifecycle-CdiIejXH.js} +1 -1
  49. package/dist/{turn-session-routing-Jkmmxpp-.js → turn-session-routing-DyLGd_wU.js} +1 -1
  50. package/dist/{validation-BcGGxOa6.js → validation-BMig74Zp.js} +1 -1
  51. package/dist/{version-DYcuOFQb.js → version-lhQSfLjx.js} +1 -1
  52. package/dist/version.js +1 -1
  53. package/dist/web-authorization-r2lKYKJ2.js +162 -0
  54. package/dist/web-input-BU-Fu7iq.js +7784 -0
  55. package/dist/{reporting-window-DbUqng0P.js → web-message-id-xPI_EFSC.js} +11 -1
  56. package/dist/{work-Bm90pR9P.js → work-B9koS8sW.js} +7 -8
  57. package/dist/{worker-BvHr6JhE.js → worker-C_iJSRgG.js} +5 -6
  58. package/package.json +5 -4
  59. package/dist/execution-stats-CR9CYpyj.js +0 -373
  60. package/dist/history-yaSjGMD_.d.ts +0 -65
  61. package/dist/job-queue-D2SiTrnt.js +0 -63
  62. package/dist/short-title-3wYH3ipl.js +0 -71
  63. package/dist/stats-DawHjcTw.js +0 -2758
  64. package/dist/web-authorization-B09B8A8R.js +0 -38
  65. package/dist/web-input-CGE58TpK.js +0 -899
package/dist/api.js CHANGED
@@ -1,18 +1,19 @@
1
- import { d as logException, p as logWarn } from "./logging-CcTvYQ8A.js";
2
- import { _ as parseSlackMessageTs, h as parseSlackTeamId, p as parseSlackChannelId } from "./context-Bplcgypl.js";
3
- import { $ as resolveViewerUser, $t as locationFromRow, Ct as conversationArchivedForEmail, D as SANDBOX_RUNTIME, Dt as conversationNotArchivedForEmail, Et as conversationHasParticipantUser, J as withSlackRetries, Jt as getSqlExecutor, Kt as getConversationStore, Lt as listConversationAnnotations, Mt as readConversationEventPage, Nt as buildSentryConversationUrl, Ot as conversationNotArchivedForUser, Rt as listConversationAnnotationsById, S as WorkspaceValidationError, St as conversationArchiveTimes, Tt as conversationHasParticipantEmail, U as getSlackClient, Z as findUserByEmail, _ as deleteWorkspace, an as agentTurnUsageSchema, b as listWorkspaces, bt as createPluginLogger, et as updateViewerDisplayName, g as createWorkspace, j as workspaceRepoCheckoutPath, jt as readLatestConversationBrief, kt as viewerConversationMembership, on as hasAgentTurnUsage, qt as getDb, sn as resolveRootConversationId, tn as parseSessionSource, u as getPlugins, v as getWorkspace, wt as conversationArchivedForUser, x as updateWorkspace, xt as readConversationAccessFromSql } from "./agent-hooks-CRuRcOg9.js";
1
+ import { Ct as cancelHumanFacingPendingMessages, M as parseSlackThreadId, Nt as getConversation, b as readStats, k as readLiveAttachment } from "./agent-runner-BGDSjciH.js";
2
+ import { d as logException, p as logWarn } from "./logging-BPBx6WF-.js";
3
+ import { b as parseSlackMessageTs, h as parseSlackTeamId, p as parseSlackChannelId } from "./context-0Et9iVSB.js";
4
+ import { $ as resolveViewerUser, $t as getDb, At as conversationNotArchivedForUser, Ct as readConversationAccessFromSql, D as SANDBOX_RUNTIME, Dt as conversationHasParticipantEmail, Et as conversationArchivedForUser, Ft as buildSentryConversationUrl, J as withSlackRetries, Nt as readLatestConversationBrief, Ot as conversationHasParticipantUser, Pt as readConversationEventPage, Qt as getConversationStore, S as WorkspaceValidationError, St as createPluginLogger, Tt as conversationArchivedForEmail, U as getSlackClient, Ut as listConversationAnnotations, Wt as listConversationAnnotationsById, Z as findUserByEmail, _ as deleteWorkspace, b as listWorkspaces, dn as hasAgentTurnUsage, en as getSqlExecutor, et as updateViewerDisplayName, fn as resolveRootConversationId, g as createWorkspace, in as locationFromRow, j as workspaceRepoCheckoutPath, jt as viewerConversationMembership, kt as conversationNotArchivedForEmail, on as parseSessionSource, u as getPlugins, un as agentTurnUsageSchema, v as getWorkspace, wt as conversationArchiveTimes, x as updateWorkspace } from "./agent-hooks-bEwEJhlg.js";
4
5
  import { n as juniorDestinations } from "./destinations-BeBiJeEM.js";
5
- import { C as juniorCodeRepositories, D as juniorIdentities, E as juniorConversations, O as juniorUsers, S as juniorCodeChanges, T as conversationReadColumns, b as juniorApiTokens, g as juniorConversationBriefs, m as juniorConversationParticipants, v as juniorConversationMetrics, y as juniorConversationEvents } from "./executor-B9R4cHte.js";
6
- import { D as createConversationBodySchema, O as createConversationMessageBodySchema, T as conversationStatsReportSchema, _ as conversationParamsSchema, a as cancelConversationPendingMessagesBodySchema, c as conversationAttachmentParamsSchema, d as conversationDetailReportSchema, g as conversationFeedSchema, h as conversationFeedQuerySchema, i as archiveConversationResponseSchema, m as conversationEventsQuerySchema, o as cancelConversationPendingMessagesResponseSchema, p as conversationEventPageSchema, r as archiveConversationBodySchema, t as acceptedConversationMessageSchema, u as conversationDetailQuerySchema, x as conversationPendingMessagesReportSchema } from "./conversation-Bygi39Xj.js";
7
- import { n as hash, t as create } from "./profile-CV97YuiL.js";
8
- import { Tt as getConversation, c as parseSlackThreadId, ht as cancelHumanFacingPendingMessages, i as readLiveAttachment, n as readStats } from "./stats-DawHjcTw.js";
9
- import { t as getCachedSnapshot } from "./resolve-DXVAzYa3.js";
10
- import { t as getVercelConversationWorkQueue } from "./vercel-queue-DIkVcfK4.js";
11
- import { S as skillReportsSchema, a as fillUtcSixHours, b as runtimeInfoReportSchema, c as trailingUtcDayWindow, d as utcDayKey, f as utcHourKey, i as fillUtcHours, l as trailingUtcHourWindow, m as pluginOperationalReportFeedSchema, n as HOUR_MS$1, o as startOfUtcHour, p as healthReportSchema, r as fillUtcDays, s as sumUtcHoursIntoSixHours, t as DAY_MS$1, u as trailingUtcSixHourWindow, y as pluginsSchema } from "./reporting-window-DbUqng0P.js";
12
- import { C as readHealthReport, a as webActorFromEmail, b as legacyWebMailboxMetadataSchema, c as formatSlackConversationRedactedLabel, d as resolveSlackConversationContextFromThreadId, f as ViewerTaskNotFoundError, g as readViewerAutomationRuns, h as readViewerAutomationExecutions, m as readConversationSourceTask, p as deleteViewerTask, r as createAndEnqueueConversation, t as appendAndEnqueueWebMessage, v as readViewerAutomations, x as createVercelAttachmentStorage, y as lookupSlackUser } from "./web-input-CGE58TpK.js";
13
- import { d as conversationActiveDaysColumn, f as conversationAggregateColumns, p as conversationRangeColumns } from "./execution-stats-CR9CYpyj.js";
14
- import { r as getWebAuthorization } from "./web-authorization-B09B8A8R.js";
15
- import { A as actorProfileReportSchema, C as createPersonalTokenBodySchema, D as personalTokenParamsSchema, F as locationDirectoryReportSchema, G as codePersonReportSchema, I as locationParamsSchema, L as activityDays$1, M as personalSpendReportSchema, O as revokePersonalTokenResponseSchema, P as locationDetailReportSchema, R as activityHours$1, T as personalTokenListSchema, W as codeOverviewReportSchema, _ as automationRunListSchema, a as workspaceBodySchema, g as automationParamsSchema, h as automationListSchema, i as deleteWorkspaceResponseSchema, j as personParamsSchema, k as actorDirectoryReportSchema, l as workspaceSchema, m as automationListQuerySchema, n as statsReportSchema, o as workspaceListSchema, q as apiErrorSchema, s as workspaceParamsSchema, u as automationExecutionListSchema, w as createdPersonalTokenSchema, z as activitySixHours$1 } from "./schema-BE4uso4i.js";
6
+ import { C as juniorCodeRepositories, D as juniorIdentities, E as juniorConversations, O as juniorUsers, S as juniorCodeChanges, T as conversationReadColumns, b as juniorApiTokens, g as juniorConversationBriefs, m as juniorConversationParticipants, v as juniorConversationMetrics, y as juniorConversationEvents } from "./executor-BXMlFrV6.js";
7
+ import { D as createConversationBodySchema, I as readMessageAttachments, L as INPUT_IMAGE_TYPES, O as createConversationMessageBodySchema, T as conversationStatsReportSchema, _ as conversationParamsSchema, a as cancelConversationPendingMessagesBodySchema, c as conversationAttachmentParamsSchema, d as conversationDetailReportSchema, g as conversationFeedSchema, h as conversationFeedQuerySchema, i as archiveConversationResponseSchema, m as conversationEventsQuerySchema, o as cancelConversationPendingMessagesResponseSchema, p as conversationEventPageSchema, r as archiveConversationBodySchema, t as acceptedConversationMessageSchema, u as conversationDetailQuerySchema, x as conversationPendingMessagesReportSchema } from "./conversation-BnhOMfEB.js";
8
+ import { n as hash, t as create } from "./profile-upzC-wN1.js";
9
+ import { t as getCachedSnapshot } from "./resolve-sF6Lg7Ay.js";
10
+ import { a as getVercelConversationWorkQueue } from "./job-queue-AI0_QAgc.js";
11
+ import { C as skillReportsSchema, a as fillUtcHours, b as pluginsSchema, c as sumUtcHoursIntoSixHours, d as trailingUtcSixHourWindow, f as utcDayKey, h as pluginOperationalReportFeedSchema, i as fillUtcDays, l as trailingUtcDayWindow, m as healthReportSchema, n as DAY_MS$1, o as fillUtcSixHours, p as utcHourKey, r as HOUR_MS$1, s as startOfUtcHour, u as trailingUtcHourWindow, x as runtimeInfoReportSchema } from "./web-message-id-xPI_EFSC.js";
12
+ import { F as createVercelAttachmentStorage, _ as readViewerAutomations, a as webActorFromEmail, b as clearSlackPendingReactions, c as getProductionSlackAdapter, d as ViewerTaskNotFoundError, f as deleteViewerTask, h as readViewerAutomationRuns, k as legacyWebMailboxMetadataSchema, l as formatSlackConversationRedactedLabel, m as readViewerAutomationExecutions, p as readConversationSourceTask, r as createAndEnqueueConversation, t as appendAndEnqueueWebMessage, u as resolveSlackConversationContextFromThreadId, x as lookupSlackUser, z as readHealthReport } from "./web-input-BU-Fu7iq.js";
13
+ import { A as conversationAggregateColumns, j as conversationRangeColumns, k as conversationActiveDaysColumn } from "./task-runner-S3QtH38c.js";
14
+ import { r as getWebAuthorization } from "./web-authorization-r2lKYKJ2.js";
15
+ import { t as decodeInputImages } from "./images-8siTAUNW.js";
16
+ import { A as actorProfileReportSchema, C as createPersonalTokenBodySchema, D as personalTokenParamsSchema, F as locationDirectoryReportSchema, G as codePersonReportSchema, I as locationParamsSchema, L as activityDays$1, M as personalSpendReportSchema, O as revokePersonalTokenResponseSchema, P as locationDetailReportSchema, R as activityHours$1, T as personalTokenListSchema, W as codeOverviewReportSchema, _ as automationRunListSchema, a as workspaceBodySchema, g as automationParamsSchema, h as automationListSchema, i as deleteWorkspaceResponseSchema, j as personParamsSchema, k as actorDirectoryReportSchema, l as workspaceSchema, m as automationListQuerySchema, n as statsReportSchema, o as workspaceListSchema, q as apiErrorSchema, s as workspaceParamsSchema, u as automationExecutionListSchema, w as createdPersonalTokenSchema, z as activitySixHours$1 } from "./schema-BSiwcvjm.js";
16
17
  import { Hono } from "hono";
17
18
  import path from "node:path";
18
19
  import { z } from "zod";
@@ -22,6 +23,7 @@ import { conversationSidebarAnnotationSchema, pluginUserPageContentSchema, plugi
22
23
  import { alias } from "drizzle-orm/pg-core";
23
24
  import { readFileSync } from "node:fs";
24
25
  import { HTTPException } from "hono/http-exception";
26
+ import { bodyLimit } from "hono/body-limit";
25
27
  import { zValidator } from "@hono/zod-validator";
26
28
  import { createMiddleware } from "hono/factory";
27
29
  //#region src/api/http.ts
@@ -125,11 +127,8 @@ async function archiveConversation(viewer, conversationId, body) {
125
127
  }
126
128
  //#endregion
127
129
  //#region src/api/conversations/attachments.ts
128
- function mayDisplayInline(contentType) {
129
- return contentType === "image/gif" || contentType === "image/jpeg" || contentType === "image/png" || contentType === "image/webp";
130
- }
131
130
  function contentDisposition(filename, contentType) {
132
- return `${mayDisplayInline(contentType) ? "inline" : "attachment"}; filename="${filename.replace(/[^\x20-\x7e]|["\\]/g, "_")}"; filename*=UTF-8''${encodeURIComponent(filename)}`;
131
+ return `${INPUT_IMAGE_TYPES.some((type) => type === contentType) ? "inline" : "attachment"}; filename="${filename.replace(/[^\x20-\x7e]|["\\]/g, "_")}"; filename*=UTF-8''${encodeURIComponent(filename)}`;
133
132
  }
134
133
  /** Build response headers for one conversation attachment body. */
135
134
  function conversationAttachmentHeaders(args) {
@@ -170,6 +169,14 @@ async function requireConversationAttachment(args) {
170
169
  }
171
170
  //#endregion
172
171
  //#region src/api/conversations/create.ts
172
+ /** Turn image validation failures into request errors before accepting work. */
173
+ function parseImages(images) {
174
+ try {
175
+ return decodeInputImages(images ?? []);
176
+ } catch (error) {
177
+ throwApiError(400, error instanceof Error ? error.message : "Unable to read images.");
178
+ }
179
+ }
173
180
  function actorFromViewer(viewer) {
174
181
  const normalized = viewer.email.trim().toLowerCase();
175
182
  return webActorFromEmail(normalized, {
@@ -178,15 +185,18 @@ function actorFromViewer(viewer) {
178
185
  });
179
186
  }
180
187
  /** Create a dashboard root conversation and enqueue its first message. */
181
- async function createConversationForViewer(viewer, body) {
188
+ async function createConversationForViewer(viewer, body, attachmentStorage) {
189
+ const images = parseImages(body.images);
182
190
  try {
183
191
  return await createAndEnqueueConversation({
184
192
  actor: actorFromViewer(viewer),
185
193
  idempotencyKey: body.idempotencyKey,
186
194
  message: body.message,
195
+ images,
187
196
  ...body.visibility ? { visibility: body.visibility } : void 0
188
197
  }, {
189
198
  conversationStore: getConversationStore(),
199
+ attachmentStorage,
190
200
  queue: getVercelConversationWorkQueue()
191
201
  });
192
202
  } catch (error) {
@@ -194,20 +204,23 @@ async function createConversationForViewer(viewer, body) {
194
204
  }
195
205
  }
196
206
  /** Append one dashboard message to an existing conversation. */
197
- async function appendConversationMessageForViewer(viewer, conversationId, body) {
207
+ async function appendConversationMessageForViewer(viewer, conversationId, body, attachmentStorage) {
198
208
  const conversation = await getConversationStore().get({ conversationId });
199
209
  if (!conversation) throwApiError(404, "Conversation not found.");
200
210
  const destinationPlatform = conversation.destination?.platform;
201
211
  if (!(destinationPlatform === "local" && conversationId.startsWith("local:web:") || destinationPlatform === "slack")) throwApiError(409, "Conversation does not accept web messages.");
202
212
  if (!(await readConversationAccessFromSql(getDb(), [conversationId], viewer)).get(conversationId)?.isParticipant) throwApiError(403, "Only conversation participants can add messages.");
213
+ const images = parseImages(body.images);
203
214
  try {
204
215
  return await appendAndEnqueueWebMessage({
205
216
  actor: actorFromViewer(viewer),
206
217
  conversationId,
207
218
  idempotencyKey: body.idempotencyKey,
208
- message: body.message
219
+ message: body.message,
220
+ images
209
221
  }, {
210
222
  conversationStore: getConversationStore(),
223
+ attachmentStorage,
211
224
  queue: getVercelConversationWorkQueue()
212
225
  });
213
226
  } catch (error) {
@@ -1280,6 +1293,10 @@ async function cancelConversationPendingMessagesForViewer(viewer, conversationId
1280
1293
  ...body.receivedBefore ? { receivedBeforeMs: Date.parse(body.receivedBefore) } : void 0,
1281
1294
  conversationStore: getConversationStore()
1282
1295
  });
1296
+ await clearSlackPendingReactions({
1297
+ getSlackAdapter: getProductionSlackAdapter,
1298
+ messages: result.cancelledMessages
1299
+ });
1283
1300
  return {
1284
1301
  cancelledCount: result.cancelledInboundMessageIds.length,
1285
1302
  cancelledInboundMessageIds: result.cancelledInboundMessageIds,
@@ -1334,7 +1351,8 @@ async function projectPendingMessage(message, canExposePayload) {
1334
1351
  const metadata = legacyWebMailboxMetadataSchema.safeParse(message.input.metadata);
1335
1352
  if (!metadata.success) return void 0;
1336
1353
  const text = message.input.text.trim();
1337
- if (!text) return void 0;
1354
+ const attachments = readMessageAttachments(message.input.attachments);
1355
+ if (!text && !attachments.length) return void 0;
1338
1356
  return {
1339
1357
  createdAt: isoFromMs(message.createdAtMs),
1340
1358
  delivery: message.delivery,
@@ -1345,7 +1363,8 @@ async function projectPendingMessage(message, canExposePayload) {
1345
1363
  source: "web",
1346
1364
  ...canExposePayload ? {
1347
1365
  actorIdentity: actorIdentityFromWebMetadata(metadata.data),
1348
- text
1366
+ text,
1367
+ ...attachments.length ? { attachments } : void 0
1349
1368
  } : { redacted: true }
1350
1369
  };
1351
1370
  }
@@ -1776,6 +1795,12 @@ async function readConversationStats() {
1776
1795
  /** Create the HTTP routes owned by the conversations API. */
1777
1796
  function createConversationRoutes(options) {
1778
1797
  const app = new Hono();
1798
+ const messageBodyLimit = bodyLimit({
1799
+ maxSize: 445e4,
1800
+ onError: () => {
1801
+ throwApiError(413, "Images must total 3 MB or less.");
1802
+ }
1803
+ });
1779
1804
  app.get("/", validateRequest("query", conversationFeedQuerySchema, "Invalid query parameters."), async (context) => {
1780
1805
  const { actorEmail, q, status } = context.req.valid("query");
1781
1806
  const viewer = context.get("viewer");
@@ -1787,16 +1812,16 @@ function createConversationRoutes(options) {
1787
1812
  }));
1788
1813
  });
1789
1814
  app.get("/stats", async () => jsonResponse(conversationStatsReportSchema, await readConversationStats()));
1790
- app.post("/", requireViewer, validateRequest("json", createConversationBodySchema, "Invalid request body."), async (context) => {
1815
+ app.post("/", requireViewer, messageBodyLimit, validateRequest("json", createConversationBodySchema, "Invalid request body."), async (context) => {
1791
1816
  const viewer = context.get("viewer");
1792
1817
  const body = context.req.valid("json");
1793
- return jsonResponse(acceptedConversationMessageSchema, await createConversationForViewer(viewer, body));
1818
+ return jsonResponse(acceptedConversationMessageSchema, await createConversationForViewer(viewer, body, options.attachmentStorage));
1794
1819
  });
1795
- app.post("/:conversationId/messages", requireViewer, validateRequest("param", conversationParamsSchema, "Invalid route parameters."), validateRequest("json", createConversationMessageBodySchema, "Invalid request body."), async (context) => {
1820
+ app.post("/:conversationId/messages", requireViewer, messageBodyLimit, validateRequest("param", conversationParamsSchema, "Invalid route parameters."), validateRequest("json", createConversationMessageBodySchema, "Invalid request body."), async (context) => {
1796
1821
  const viewer = context.get("viewer");
1797
1822
  const { conversationId } = context.req.valid("param");
1798
1823
  const body = context.req.valid("json");
1799
- return jsonResponse(acceptedConversationMessageSchema, await appendConversationMessageForViewer(viewer, conversationId, body));
1824
+ return jsonResponse(acceptedConversationMessageSchema, await appendConversationMessageForViewer(viewer, conversationId, body, options.attachmentStorage));
1800
1825
  });
1801
1826
  app.patch("/:conversationId/archive", requireViewer, validateRequest("param", conversationParamsSchema, "Invalid route parameters."), validateRequest("json", archiveConversationBodySchema, "Invalid request body."), async (context) => {
1802
1827
  const viewer = context.get("viewer");
@@ -3017,7 +3042,7 @@ async function readPeoplePluginReports(args) {
3017
3042
  reports: [],
3018
3043
  source: "plugins"
3019
3044
  });
3020
- const { getPluginProfileReports } = await import("./agent-hooks-CRuRcOg9.js").then((n) => n.t);
3045
+ const { getPluginProfileReports } = await import("./agent-hooks-bEwEJhlg.js").then((n) => n.t);
3021
3046
  return pluginOperationalReportFeedSchema.parse({
3022
3047
  generatedAt: new Date(nowMs).toISOString(),
3023
3048
  reports: await getPluginProfileReports({
@@ -3626,7 +3651,7 @@ function readDescriptionText(home) {
3626
3651
  }
3627
3652
  /** Read discovered skill names for authenticated runtime diagnostics. */
3628
3653
  async function readSkillReports() {
3629
- const { discoverSkills } = await import("./skills-DUcDEgDI.js").then((n) => n.o);
3654
+ const { discoverSkills } = await import("./skills-CAI5s___.js").then((n) => n.o);
3630
3655
  const skills = await discoverSkills();
3631
3656
  return skillReportsSchema.parse(skills.map((skill) => ({
3632
3657
  name: skill.name,
@@ -3635,7 +3660,7 @@ async function readSkillReports() {
3635
3660
  }
3636
3661
  /** Read safe configured plugin metadata for authenticated runtime diagnostics. */
3637
3662
  async function readPlugins() {
3638
- const { pluginCatalogRuntime } = await import("./catalog-runtime-pv4grNNb.js").then((n) => n.t);
3663
+ const { pluginCatalogRuntime } = await import("./catalog-runtime-Cw9V2jpn.js").then((n) => n.t);
3639
3664
  return pluginsSchema.parse(pluginCatalogRuntime.getProviders().map((plugin) => ({
3640
3665
  configKeys: plugin.manifest.configKeys ?? [],
3641
3666
  description: plugin.manifest.description,
@@ -3647,7 +3672,7 @@ async function readPlugins() {
3647
3672
  async function readRuntimeInfoReport() {
3648
3673
  const [{ homeDir }, { pluginCatalogRuntime }, plugins, skills] = await Promise.all([
3649
3674
  import("./package-discovery-7a9YqLhE.js").then((n) => n.r),
3650
- import("./catalog-runtime-pv4grNNb.js").then((n) => n.t),
3675
+ import("./catalog-runtime-Cw9V2jpn.js").then((n) => n.t),
3651
3676
  readPlugins(),
3652
3677
  readSkillReports()
3653
3678
  ]);
@@ -3664,7 +3689,7 @@ async function readRuntimeInfoReport() {
3664
3689
  /** Read sanitized operational summaries contributed by plugins. */
3665
3690
  async function readPluginOperationalReportFeed() {
3666
3691
  const nowMs = Date.now();
3667
- const { getPluginOperationalReports } = await import("./agent-hooks-CRuRcOg9.js").then((n) => n.t);
3692
+ const { getPluginOperationalReports } = await import("./agent-hooks-bEwEJhlg.js").then((n) => n.t);
3668
3693
  return pluginOperationalReportFeedSchema.parse({
3669
3694
  source: "plugins",
3670
3695
  generatedAt: new Date(nowMs).toISOString(),
@@ -1,5 +1,5 @@
1
1
  import { t as ConversationStore } from "./store-DoewL5mG.js";
2
- import "./history-yaSjGMD_.js";
2
+ import "./history-nukv1YN8.js";
3
3
  import { n as JuniorPluginSet } from "./plugins-BT2l4We3.js";
4
4
  import { Hono } from "hono";
5
5
  import "@earendil-works/pi-ai/compat";
package/dist/app.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { i as ModelProfileInput, n as JuniorDashboardOptions, r as createApp, t as JuniorAppOptions } from "./app-BbSD6EtD.js";
1
+ import { i as ModelProfileInput, n as JuniorDashboardOptions, r as createApp, t as JuniorAppOptions } from "./app-CjRIKZb5.js";
2
2
  import { i as defineJuniorPlugins, n as JuniorPluginSet, r as JuniorPluginSetOptions, t as JuniorPluginInput } from "./plugins-BT2l4We3.js";
3
3
  import { t as JUNIOR_VERSION } from "./version-CnXZ614E.js";
4
4
  export { JUNIOR_VERSION, JuniorAppOptions, JuniorDashboardOptions, type JuniorPluginInput, type JuniorPluginSet, type JuniorPluginSetOptions, type ModelProfileInput, createApp, defineJuniorPlugins };