@sentry/junior 0.235.0 → 0.236.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/{agent-hooks-DS7k0ZWY.js → agent-hooks-Da_H0jHv.js} +8 -8
  2. package/dist/{agent-runner-BlDI1zV2.js → agent-runner-uP7QRc4c.js} +353 -117
  3. package/dist/api/schema.d.ts +223 -2
  4. package/dist/api/schema.js +5 -4
  5. package/dist/api.d.ts +8 -2
  6. package/dist/api.js +404 -47
  7. package/dist/{app-pGsR__aT.d.ts → app-MEd7wbF0.d.ts} +82 -48
  8. package/dist/app.d.ts +3 -3
  9. package/dist/app.js +162 -119
  10. package/dist/{types-Du-HbEun.js → automation-B9Kc1gcf.js} +304 -33
  11. package/dist/{briefs-C3jhszOz.js → briefs-DrjBPQFy.js} +4 -4
  12. package/dist/{catalog-runtime-B9u_3-GW.js → catalog-runtime-C7339Cfm.js} +1 -1
  13. package/dist/{checkpoint-DLcJ5mKL.js → checkpoint-DaD7_Gsb.js} +16 -9
  14. package/dist/cli/chat.d.ts +1 -1
  15. package/dist/cli/chat.js +14 -14
  16. package/dist/cli/check.js +4 -4
  17. package/dist/cli/main.js +1 -1
  18. package/dist/cli/plugins.d.ts +1 -1
  19. package/dist/cli/plugins.js +4 -4
  20. package/dist/cli/snapshot-create.js +3 -3
  21. package/dist/cli/upgrade.d.ts +1 -1
  22. package/dist/cli/upgrade.js +5 -5
  23. package/dist/{client-BSnNHO0R.js → client-Ch9Hg9NU.js} +2 -2
  24. package/dist/{config-Bmw4xTPK.js → config-JR9wke1W.js} +57 -17
  25. package/dist/{conversation-C_aYrISI.js → conversation-9Fxa1Zbq.js} +13 -1
  26. package/dist/{conversation-privacy-BV2dtba2.js → conversation-privacy-au02dyZK.js} +1 -1
  27. package/dist/{credential-sync-CukzQJ1x.js → credential-sync-BWTA3LnL.js} +14 -14
  28. package/dist/{executor-B9ksWZCv.js → executor-BW9XWgUQ.js} +38 -6
  29. package/dist/{images-CEXcQ0Id.js → images-BdG7zcNf.js} +3 -3
  30. package/dist/instrumentation.js +2 -2
  31. package/dist/{job-queue-CY1L2YRn.js → job-queue-BqXd0ZPV.js} +1 -1
  32. package/dist/{logging-F--48Q7Q.js → logging-B4sKwmCG.js} +1 -1
  33. package/dist/nitro.d.ts +2 -2
  34. package/dist/nitro.js +5 -5
  35. package/dist/{oauth-authorization-LasSG3Qc.js → oauth-authorization-BjRN99dc.js} +1 -1
  36. package/dist/{oauth-callback-server-D07ZzVMs.js → oauth-callback-server-B_1p98Mb.js} +2 -2
  37. package/dist/{pending-auth-DrG9Mkje.js → pending-auth-WqF4Gh8Z.js} +1 -1
  38. package/dist/{plugins-BT2l4We3.d.ts → plugins-CjfUP5gJ.d.ts} +1 -0
  39. package/dist/{profile-DZ2DUdd1.js → profile-BamYnmhO.js} +4 -4
  40. package/dist/{prompt-BM_5mAU3.js → prompt-Ctwy6hSI.js} +1 -1
  41. package/dist/queue-B5SnqRln.d.ts +25 -0
  42. package/dist/{registry-_JLY0x7b.js → registry-CXNv9fDX.js} +38 -2
  43. package/dist/{resolve-Cuoj3MML.js → resolve-C9ETkt4T.js} +2 -2
  44. package/dist/{runner-BfelmbMv.js → runner-DnBGVRnW.js} +9 -9
  45. package/dist/{sandbox-egress-signals-D5QUIO7Z.js → sandbox-egress-signals-DwJ7Boi_.js} +1 -1
  46. package/dist/{schema-CrdDxGbx.js → schema-CJiqDc5r.js} +3 -2
  47. package/dist/{skills-DAegjk5Y.js → skills-Dd8O9Aav.js} +3 -3
  48. package/dist/{spawn-DCfV7zGK.js → spawn-DFdRspSD.js} +2 -2
  49. package/dist/{task-queue-GcuFtzor.js → task-queue-DGQEOk1A.js} +16 -10
  50. package/dist/{task-runner-B0-P_3aq.js → task-runner-C5XCIDSF.js} +9 -9
  51. package/dist/{thread-state-TezcEhuH.js → thread-state-D3E29wZk.js} +5 -5
  52. package/dist/{turn-failure-response-Drhj_-t4.js → turn-failure-response-TDoj0aZz.js} +8 -8
  53. package/dist/{turn-lifecycle-BpIW3zOx.js → turn-lifecycle-DOnU45p7.js} +1 -1
  54. package/dist/{turn-session-routing-Dg8GDgyc.js → turn-session-routing-DbpZZoin.js} +1 -1
  55. package/dist/{validation-DAkYeKDT.js → validation-B9lMbisx.js} +1 -1
  56. package/dist/{version-9CB4Z-J4.js → version-CWkIGcLU.js} +1 -1
  57. package/dist/version.js +1 -1
  58. package/dist/{web-authorization-Cu33voNg.js → web-authorization-PPaoj2ns.js} +6 -6
  59. package/dist/{web-input-B3k0J7WB.js → web-input-CfNxXtHm.js} +86 -34
  60. package/dist/web-message-id-xPI_EFSC.js +239 -0
  61. package/dist/{work-PmkvcY9l.js → work-DNaoFrEe.js} +7 -7
  62. package/dist/{worker-COcaq2J6.js → worker-xeJLxYwm.js} +5 -5
  63. package/migrations/0045_conversation_forks.sql +3 -0
  64. package/migrations/0046_automation_versions.sql +71 -0
  65. package/migrations/meta/0045_snapshot.json +3503 -0
  66. package/migrations/meta/0046_snapshot.json +3707 -0
  67. package/migrations/meta/_journal.json +15 -1
  68. package/package.json +4 -4
  69. package/dist/web-message-id-CVVCTWUb.js +0 -464
  70. package/dist/{package-discovery-7a9YqLhE.js → package-discovery-BVvSnQBB.js} +1 -1
  71. package/dist/{plugin-module-BKGOXca2.js → plugin-module-CVvEUSMH.js} +1 -1
@@ -1,5 +1,5 @@
1
1
  import { z } from "zod";
2
- import { actorUserIdSchema, destinationVisibilitySchema, eventMatchSchema, eventTypeSchema, slackDestinationSchema, taskOutcomeSchema } from "@sentry/junior-plugin-api";
2
+ import { actorUserIdSchema, destinationVisibilitySchema, eventMatchSchema, eventTypeSchema, pluginEventTypeSchema, slackDestinationSchema, taskOutcomeSchema } from "@sentry/junior-plugin-api";
3
3
  //#region src/chat/task-outcomes-schema.ts
4
4
  const taskMessageDestinationInputSchema = z.enum(["current_conversation", "task_creator"]).describe("Where to send the message. Use current_conversation for posts, digests, summaries, and channel reminders. Use task_creator only when the user asks for a direct reminder or notification.");
5
5
  /** Input accepted by task authoring tools before a user becomes a DM Destination. */
@@ -7,37 +7,6 @@ const taskOutcomeInputSchema = z.object({
7
7
  action: z.literal("send_message"),
8
8
  destination: taskMessageDestinationInputSchema
9
9
  }).strict();
10
- /** Validate the persisted Slack creator identity for an event automation. */
11
- const eventAutomationPrincipalSchema = z.object({
12
- slackUserId: actorUserIdSchema,
13
- fullName: z.string().optional(),
14
- userName: z.string().optional()
15
- }).strict();
16
- /** Validate one persisted event-automation selector and its presentation metadata. */
17
- const eventAutomationTriggerSchema = z.object({
18
- events: z.array(eventTypeSchema).min(1),
19
- label: z.string().min(1),
20
- match: eventMatchSchema.optional(),
21
- namespace: z.string().min(1),
22
- identifier: z.string().min(1).max(300),
23
- resourceType: z.string().min(1)
24
- }).strict();
25
- /** Event automations target a Slack channel or DM, never a message thread. */
26
- const eventAutomationDestinationSchema = slackDestinationSchema.omit({ threadTs: true });
27
- const eventAutomationOutcomeSchema = taskOutcomeSchema.extend({ destination: eventAutomationDestinationSchema });
28
- /** Validate one persisted event automation. */
29
- const eventAutomationSchema = z.object({
30
- id: z.string().min(1),
31
- createdAtMs: z.number().finite(),
32
- createdBy: eventAutomationPrincipalSchema,
33
- credentialMode: z.enum(["system", "creator"]),
34
- destination: eventAutomationDestinationSchema,
35
- destinationVisibility: destinationVisibilitySchema,
36
- /** Explicit visible effects after successful work. An empty list is silent. */
37
- outcomes: z.array(eventAutomationOutcomeSchema).max(5),
38
- task: z.object({ text: z.string().min(1) }).strict(),
39
- trigger: eventAutomationTriggerSchema
40
- }).strict();
41
10
  //#endregion
42
11
  //#region src/chat/scheduled-automations/cadence.ts
43
12
  const FORMATTERS = /* @__PURE__ */ new Map();
@@ -290,6 +259,7 @@ function getNextRunAtMs(task, scheduledForMs, afterMs = scheduledForMs) {
290
259
  const localDateSchema = z.string().regex(/^\d{4}-\d{2}-\d{2}$/, "Use a local date in YYYY-MM-DD format.");
291
260
  const localTimeSchema = z.string().regex(/^([01]\d|2[0-3]):[0-5]\d$/, "Use local time in HH:MM format.");
292
261
  const timezoneSchema = z.string().min(1).max(80).describe("IANA timezone, for example America/Los_Angeles. Omit or use null for the scheduler default.").nullable().optional();
262
+ /** Weekday names in `Date#getDay` order. */
293
263
  const weekdaySchema = z.enum([
294
264
  "sunday",
295
265
  "monday",
@@ -491,10 +461,46 @@ function compileScheduleIntent(args) {
491
461
  }
492
462
  };
493
463
  }
464
+ /** Validate the persisted Slack creator identity for an event automation. */
465
+ const eventAutomationPrincipalSchema = z.object({
466
+ slackUserId: actorUserIdSchema,
467
+ fullName: z.string().optional(),
468
+ userName: z.string().optional()
469
+ }).strict();
470
+ /** Validate one persisted event-automation selector and its presentation metadata. */
471
+ const eventAutomationTriggerSchema = z.object({
472
+ events: z.array(eventTypeSchema).min(1),
473
+ label: z.string().min(1),
474
+ match: eventMatchSchema.optional(),
475
+ namespace: z.string().min(1),
476
+ identifier: z.string().min(1).max(300),
477
+ resourceType: z.string().min(1)
478
+ }).strict();
479
+ /** Event automations target a Slack channel or DM, never a message thread. */
480
+ const eventAutomationDestinationSchema = slackDestinationSchema.omit({ threadTs: true });
481
+ const eventAutomationOutcomeSchema = taskOutcomeSchema.extend({ destination: eventAutomationDestinationSchema });
482
+ /** Validate one persisted event automation. */
483
+ const eventAutomationSchema = z.object({
484
+ id: z.string().min(1),
485
+ createdAtMs: z.number().finite(),
486
+ createdBy: eventAutomationPrincipalSchema,
487
+ credentialMode: z.enum(["system", "creator"]),
488
+ destination: eventAutomationDestinationSchema,
489
+ destinationVisibility: destinationVisibilitySchema,
490
+ /** Explicit visible effects after successful work. An empty list is silent. */
491
+ outcomes: z.array(eventAutomationOutcomeSchema).max(5),
492
+ task: z.object({ text: z.string().min(1) }).strict(),
493
+ trigger: eventAutomationTriggerSchema
494
+ }).strict();
494
495
  //#endregion
495
496
  //#region src/chat/automations/edit-schema.ts
496
497
  const automationTitleSchema = z.string().trim().min(1).max(60);
497
498
  const automationInstructionSchema = z.string().trim().min(1).max(4e3);
499
+ /**
500
+ * Instruction input for agent tools. An Automation runs later without the
501
+ * request around it, so the instruction must name each person exactly.
502
+ */
503
+ const automationInstructionToolSchema = automationInstructionSchema.describe("Work to perform when the Automation runs. It runs later without this conversation, so write it to stand alone: name each person with their Slack mention, such as <@U123>, instead of me, my, or you. Preserve the user's scope, targets, and constraints. Do not add permissions or side effects the user did not request.");
498
504
  const automationEditFieldsSchema = z.object({
499
505
  title: automationTitleSchema.optional(),
500
506
  instruction: automationInstructionSchema.optional(),
@@ -618,4 +624,269 @@ const SCHEDULED_AUTOMATION_SYSTEM_ACTOR = Object.freeze({
618
624
  name: "scheduled-automation"
619
625
  });
620
626
  //#endregion
621
- export { automationTitleSchema as a, ScheduleIntentError as c, getFirstRunAtMs as d, getNextRunAtMs as f, taskOutcomeInputSchema as g, eventAutomationTriggerSchema as h, automationInstructionSchema as i, compileScheduleIntent as l, eventAutomationSchema as m, scheduledAutomationSchema as n, eventAutomationEditSchema as o, getZonedDateTimeParts as p, scheduledRunSchema as r, scheduledAutomationEditSchema as s, SCHEDULED_AUTOMATION_SYSTEM_ACTOR as t, scheduleIntentSchema as u };
627
+ //#region src/api/schema/automation.ts
628
+ const automationDestinationSchema = z.object({
629
+ channelId: z.string().min(1),
630
+ label: z.string().min(1),
631
+ teamId: z.string().min(1),
632
+ visibility: z.enum(["private", "public"])
633
+ }).strict();
634
+ /** Automation run counts for the dashboard range control (24h/7d/30d/90d). */
635
+ const automationRunWindowsSchema = z.object({
636
+ 1: z.number().int().nonnegative(),
637
+ 7: z.number().int().nonnegative(),
638
+ 30: z.number().int().nonnegative(),
639
+ 90: z.number().int().nonnegative()
640
+ }).strict();
641
+ const automationSummaryBaseSchema = z.object({
642
+ credentialMode: z.enum(["creator", "system"]),
643
+ createdAt: z.string().datetime(),
644
+ createdBy: z.string().min(1),
645
+ createdByAvatarUrl: z.string().url().optional(),
646
+ createdByEmail: z.string().trim().email().optional(),
647
+ destination: automationDestinationSchema,
648
+ id: z.string().min(1),
649
+ instruction: z.string().min(1),
650
+ lastConversationId: z.string().min(1).optional(),
651
+ lastRunAt: z.string().datetime().optional(),
652
+ lastRunStatus: z.enum([
653
+ "blocked",
654
+ "completed",
655
+ "failed"
656
+ ]).optional(),
657
+ ownedByViewer: z.boolean(),
658
+ runs: automationRunWindowsSchema,
659
+ outcomes: z.array(taskOutcomeSchema).max(5),
660
+ /** Short display title; falls back from instruction when unset. */
661
+ title: z.string().min(1),
662
+ totalRuns: z.number().int().nonnegative()
663
+ });
664
+ const scheduledAutomationSummarySchema = automationSummaryBaseSchema.extend({
665
+ kind: z.literal("scheduled"),
666
+ nextRunAt: z.string().datetime().optional(),
667
+ schedule: z.string().min(1),
668
+ timezone: z.string().min(1),
669
+ statusReason: z.string().optional(),
670
+ status: z.enum([
671
+ "active",
672
+ "blocked",
673
+ "paused",
674
+ "completed"
675
+ ])
676
+ }).strict();
677
+ const eventAutomationSummarySchema = automationSummaryBaseSchema.extend({
678
+ events: z.array(z.string().min(1)).min(1),
679
+ match: eventMatchSchema.optional(),
680
+ kind: z.literal("event"),
681
+ resource: z.string().min(1),
682
+ source: z.string().min(1),
683
+ triggerAvailable: z.boolean(),
684
+ status: z.enum(["active", "paused"])
685
+ }).strict();
686
+ const automationSummarySchema = z.discriminatedUnion("kind", [scheduledAutomationSummarySchema, eventAutomationSummarySchema]);
687
+ /** UTC day (`YYYY-MM-DD`) or hour (`YYYY-MM-DDTHH`) execution bucket key. */
688
+ const automationMetricBucketSchema = z.string().regex(/^\d{4}-\d{2}-\d{2}(T\d{2})?$/);
689
+ /** One UTC day/hour of completed automation executions stacked by automation type. */
690
+ const automationExecutionDaySchema = z.object({
691
+ /** Linked conversation spend for executions in this bucket. */
692
+ costUsd: z.number().finite().nonnegative(),
693
+ date: automationMetricBucketSchema,
694
+ event: z.number().int().nonnegative(),
695
+ scheduled: z.number().int().nonnegative()
696
+ }).strict();
697
+ const automationListQuerySchema = z.object({
698
+ q: z.string().trim().max(200).optional(),
699
+ scope: z.enum([
700
+ "all",
701
+ "mine",
702
+ "public",
703
+ "attention"
704
+ ]).default("all"),
705
+ type: z.enum([
706
+ "all",
707
+ "scheduled",
708
+ "event"
709
+ ]).default("all"),
710
+ state: z.enum([
711
+ "all",
712
+ "active",
713
+ "blocked",
714
+ "paused",
715
+ "completed",
716
+ "unavailable"
717
+ ]).default("all"),
718
+ creator: z.string().max(300).optional(),
719
+ destination: z.string().max(300).optional(),
720
+ sort: z.enum([
721
+ "newest",
722
+ "oldest",
723
+ "title"
724
+ ]).default("newest"),
725
+ page: z.coerce.number().int().min(1).max(1e6).default(1),
726
+ pageSize: z.coerce.number().int().min(1).max(100).default(25)
727
+ }).strict();
728
+ const automationFilterOptionSchema = z.object({
729
+ value: z.string(),
730
+ label: z.string()
731
+ }).strict();
732
+ const automationListSchema = z.object({
733
+ executionDays: z.array(automationExecutionDaySchema),
734
+ executionHours: z.array(automationExecutionDaySchema).optional(),
735
+ executionSixHours: z.array(automationExecutionDaySchema).optional(),
736
+ automations: z.array(automationSummarySchema),
737
+ total: z.number().int().nonnegative(),
738
+ page: z.number().int().positive(),
739
+ pageSize: z.number().int().positive(),
740
+ counts: z.object({
741
+ all: z.number().int().nonnegative(),
742
+ mine: z.number().int().nonnegative(),
743
+ public: z.number().int().nonnegative(),
744
+ private: z.number().int().nonnegative()
745
+ }).strict(),
746
+ creators: z.array(automationFilterOptionSchema),
747
+ destinations: z.array(automationFilterOptionSchema)
748
+ }).strict();
749
+ const automationParamsSchema = z.object({
750
+ id: z.string().min(1),
751
+ kind: z.enum(["scheduled", "event"])
752
+ }).strict();
753
+ const automationExecutionStatusSchema = z.enum([
754
+ "blocked",
755
+ "completed",
756
+ "failed"
757
+ ]);
758
+ const automationExecutionSchema = z.object({
759
+ conversationId: z.string().min(1).optional(),
760
+ /** Estimated model cost for the linked conversation, when known. */
761
+ costUsd: z.number().finite().nonnegative().optional(),
762
+ /** Cumulative conversation runtime in milliseconds, when known. */
763
+ durationMs: z.number().finite().nonnegative().optional(),
764
+ executedAt: z.string().datetime(),
765
+ executionId: z.string().min(1),
766
+ status: automationExecutionStatusSchema,
767
+ title: z.string().min(1).optional(),
768
+ /** Cumulative conversation token total, when known. */
769
+ totalTokens: z.number().int().nonnegative().optional()
770
+ }).strict();
771
+ /** One UTC day/hour of terminal executions for a single automation, stacked by status. */
772
+ const automationExecutionStatusDaySchema = z.object({
773
+ blocked: z.number().int().nonnegative(),
774
+ completed: z.number().int().nonnegative(),
775
+ date: automationMetricBucketSchema,
776
+ failed: z.number().int().nonnegative()
777
+ }).strict();
778
+ const automationExecutionListSchema = z.object({
779
+ executionDays: z.array(automationExecutionStatusDaySchema),
780
+ executionHours: z.array(automationExecutionStatusDaySchema).optional(),
781
+ executionSixHours: z.array(automationExecutionStatusDaySchema).optional(),
782
+ executions: z.array(automationExecutionSchema),
783
+ automation: automationSummarySchema,
784
+ truncated: z.boolean()
785
+ }).strict();
786
+ const automationRunSchema = automationExecutionSchema.extend({
787
+ kind: z.enum(["scheduled", "event"]),
788
+ automationId: z.string().min(1),
789
+ automationTitle: z.string().min(1)
790
+ }).strict();
791
+ const automationRunListSchema = z.object({
792
+ runs: z.array(automationRunSchema),
793
+ truncated: z.boolean()
794
+ }).strict();
795
+ const automationDefinitionFields = {
796
+ title: z.string().nullable(),
797
+ instruction: z.string()
798
+ };
799
+ const automationVersionFields = {
800
+ version: z.number().int().positive(),
801
+ createdAt: z.string().datetime(),
802
+ /** Null for versions saved by the upgrade, because the editor is unknown. */
803
+ editedBy: eventAutomationPrincipalSchema.nullable()
804
+ };
805
+ /** One saved Automation definition. Newer versions have larger numbers. */
806
+ const automationVersionSchema = z.discriminatedUnion("kind", [z.object({
807
+ ...automationVersionFields,
808
+ kind: z.literal("scheduled"),
809
+ definition: scheduledAutomationSchema.pick({
810
+ credentialMode: true,
811
+ destination: true,
812
+ outcomes: true,
813
+ schedule: true
814
+ }).extend(automationDefinitionFields).strict()
815
+ }).strict(), z.object({
816
+ ...automationVersionFields,
817
+ kind: z.literal("event"),
818
+ definition: eventAutomationSchema.pick({
819
+ credentialMode: true,
820
+ destination: true,
821
+ outcomes: true,
822
+ trigger: true
823
+ }).extend(automationDefinitionFields).strict()
824
+ }).strict()]);
825
+ /** Newest versions first. */
826
+ const automationVersionListSchema = z.object({
827
+ versions: z.array(automationVersionSchema),
828
+ /** Newest version that matches the current definition. Null when none match. */
829
+ activeVersion: z.number().int().positive().nullable(),
830
+ truncated: z.boolean()
831
+ }).strict();
832
+ const automationVersionParamsSchema = automationParamsSchema.extend({ version: z.coerce.number().int().positive() }).strict();
833
+ const automationRevisionSchema = z.string().regex(/^[a-f0-9]{64}$/);
834
+ /** Make a saved version active. The revision is the edit read revision. */
835
+ const automationVersionActivateSchema = z.object({ revision: automationRevisionSchema }).strict();
836
+ /** Pause and resume do not start work. */
837
+ const automationLifecycleSchema = z.object({
838
+ action: z.enum(["pause", "resume"]),
839
+ revision: automationRevisionSchema
840
+ }).strict();
841
+ const automationEditBaseSchema = scheduledAutomationSchema.pick({
842
+ destination: true,
843
+ createdBy: true
844
+ }).extend({
845
+ id: z.string().min(1),
846
+ revision: automationRevisionSchema,
847
+ title: z.string().nullable(),
848
+ instruction: z.string(),
849
+ credentialMode: z.enum(["system", "creator"]),
850
+ outcomes: z.array(taskOutcomeSchema).max(5),
851
+ /** Creator-only rules apply when false. */
852
+ ownedByViewer: z.boolean()
853
+ });
854
+ /** Edit values for owners and public readers. Read schemas also retain legacy values. */
855
+ const automationEditSchema = z.discriminatedUnion("kind", [automationEditBaseSchema.merge(scheduledAutomationSchema.pick({ schedule: true })).extend({
856
+ kind: z.literal("scheduled"),
857
+ nextRunAtMs: z.number().optional(),
858
+ status: z.enum([
859
+ "active",
860
+ "blocked",
861
+ "paused",
862
+ "completed"
863
+ ])
864
+ }).strict(), automationEditBaseSchema.extend({
865
+ kind: z.literal("event"),
866
+ trigger: eventAutomationTriggerSchema,
867
+ triggerAvailable: z.boolean(),
868
+ status: z.enum(["active", "paused"])
869
+ }).strict()]);
870
+ /** Partial edits require the revision returned by the edit read. */
871
+ const automationUpdateSchema = z.discriminatedUnion("kind", [scheduledAutomationEditSchema.omit({ status: true }).extend({
872
+ kind: z.literal("scheduled"),
873
+ revision: automationRevisionSchema
874
+ }).strict(), eventAutomationEditSchema.extend({
875
+ kind: z.literal("event"),
876
+ revision: automationRevisionSchema
877
+ }).strict()]);
878
+ const automationEditErrorSchema = z.object({
879
+ error: z.string(),
880
+ code: z.enum([
881
+ "invalid_edit",
882
+ "conflict",
883
+ "not_found"
884
+ ]),
885
+ fields: z.record(z.string(), z.array(z.string())).optional()
886
+ }).strict();
887
+ /** Catalog metadata only; callbacks and provider connections stay on the server. */
888
+ const automationEventCatalogSchema = z.array(pluginEventTypeSchema.safeExtend({ namespace: z.string() }));
889
+ const automationScheduleIntentSchema = scheduleIntentSchema;
890
+ const automationSchedulePreviewSchema = scheduledAutomationSchema.pick({ schedule: true }).extend({ nextRunAtMs: z.number() }).strict();
891
+ //#endregion
892
+ export { eventAutomationSchema as A, eventAutomationSummarySchema as C, scheduledRunSchema as D, scheduledAutomationSchema as E, getFirstRunAtMs as F, getNextRunAtMs as I, getZonedDateTimeParts as L, compileScheduleIntent as M, scheduleIntentSchema as N, automationInstructionToolSchema as O, weekdaySchema as P, taskOutcomeInputSchema as R, automationVersionSchema as S, SCHEDULED_AUTOMATION_SYSTEM_ACTOR as T, automationSummarySchema as _, automationExecutionSchema as a, automationVersionListSchema as b, automationLifecycleSchema as c, automationParamsSchema as d, automationRunListSchema as f, automationSchedulePreviewSchema as g, automationScheduleIntentSchema as h, automationExecutionListSchema as i, ScheduleIntentError as j, automationTitleSchema as k, automationListQuerySchema as l, automationRunWindowsSchema as m, automationEditSchema as n, automationExecutionStatusDaySchema as o, automationRunSchema as p, automationEventCatalogSchema as r, automationExecutionStatusSchema as s, automationEditErrorSchema as t, automationListSchema as u, automationUpdateSchema as v, scheduledAutomationSummarySchema as w, automationVersionParamsSchema as x, automationVersionActivateSchema as y };
@@ -1,7 +1,7 @@
1
- import { r as completeObject } from "./client-BSnNHO0R.js";
1
+ import { r as completeObject } from "./client-Ch9Hg9NU.js";
2
2
  import { r as defaultModelId } from "./model-profile-BwU8mqwD.js";
3
- import { P as briefCodeChangeSchema, R as parseBriefInput, d as conversationDetailReportSchema, p as conversationEventPageSchema } from "./conversation-C_aYrISI.js";
4
- import { n as briefEntriesFromReportEvents, s as generateBrief, t as BRIEF_PROMPT } from "./prompt-BM_5mAU3.js";
3
+ import { B as parseBriefInput, I as briefCodeChangeSchema, d as conversationDetailReportSchema, p as conversationEventPageSchema } from "./conversation-9Fxa1Zbq.js";
4
+ import { n as briefEntriesFromReportEvents, s as generateBrief, t as BRIEF_PROMPT } from "./prompt-Ctwy6hSI.js";
5
5
  import { CLI_USAGE } from "./cli/run.js";
6
6
  import path from "node:path";
7
7
  import { z } from "zod";
@@ -269,7 +269,7 @@ async function parseRunOptions(argv) {
269
269
  * `DATABASE_URL` at import, and `briefs pull` must work with only a token.
270
270
  */
271
271
  async function configuredDefaultModelId() {
272
- const { botConfig } = await import("./config-Bmw4xTPK.js").then((n) => n.r);
272
+ const { botConfig } = await import("./config-JR9wke1W.js").then((n) => n.r);
273
273
  return defaultModelId(botConfig);
274
274
  }
275
275
  function apiUrl(baseUrl, pathname) {
@@ -1,5 +1,5 @@
1
1
  import { t as __exportAll } from "./rolldown-runtime-B4FMCO8f.js";
2
- import { t as createPluginCatalogRuntime } from "./registry-_JLY0x7b.js";
2
+ import { t as createPluginCatalogRuntime } from "./registry-CXNv9fDX.js";
3
3
  //#region src/chat/plugins/catalog-runtime.ts
4
4
  var catalog_runtime_exports = /* @__PURE__ */ __exportAll({ pluginCatalogRuntime: () => pluginCatalogRuntime });
5
5
  const pluginCatalogRuntime = createPluginCatalogRuntime();
@@ -1,10 +1,10 @@
1
- import { d as unwrapCurrentInstruction, f as escapeXml, i as completeText, o as resolveGatewayModel } from "./client-BSnNHO0R.js";
2
- import { d as logException, o as getActiveTraceId, p as logWarn, t as buildTurnFailureResponse, v as setSpanAttributes } from "./logging-F--48Q7Q.js";
3
- import { n as botConfig } from "./config-Bmw4xTPK.js";
1
+ import { d as unwrapCurrentInstruction, f as escapeXml, i as completeText, o as resolveGatewayModel } from "./client-Ch9Hg9NU.js";
2
+ import { d as logException, o as getActiveTraceId, p as logWarn, t as buildTurnFailureResponse, v as setSpanAttributes } from "./logging-B4sKwmCG.js";
3
+ import { n as botConfig } from "./config-JR9wke1W.js";
4
4
  import { b as parseSlackMessageTs, f as toStoredSlackActor } from "./context-0Et9iVSB.js";
5
- import { Jt as agentsInstructionsUpdatedEvent, Qt as getConversationEventStore, Xt as authenticationUnlinkedEvent, Yt as authenticationLinkedEvent, en as getConversationStore, in as withConversationEventLock, ln as addAgentTurnUsage, nn as getSqlExecutor, qt as JUNIOR_NATIVE_EVENT_NAMESPACE, rn as createSqlConversationEventStore, sn as bindProviderConversation } from "./agent-hooks-DS7k0ZWY.js";
6
- import { B as messageCardRef, K as agentHistoryItemSchema, et as contextProvenance, nt as instructionProvenanceFor, tt as instructionActors } from "./conversation-C_aYrISI.js";
7
- import { D as fenceLock, O as withLock, T as MUTATION_LOCK_TTL_MS, k as sleep, w as getStateAdapter } from "./profile-DZ2DUdd1.js";
5
+ import { Jt as agentsInstructionsUpdatedEvent, Qt as getConversationEventStore, Xt as authenticationUnlinkedEvent, Yt as authenticationLinkedEvent, en as getConversationStore, in as withConversationEventLock, ln as addAgentTurnUsage, nn as getSqlExecutor, qt as JUNIOR_NATIVE_EVENT_NAMESPACE, rn as createSqlConversationEventStore, sn as bindProviderConversation } from "./agent-hooks-Da_H0jHv.js";
6
+ import { H as messageCardRef, J as agentHistoryItemSchema, it as instructionProvenanceFor, nt as contextProvenance, rt as instructionActors } from "./conversation-9Fxa1Zbq.js";
7
+ import { D as fenceLock, O as withLock, T as MUTATION_LOCK_TTL_MS, k as sleep, w as getStateAdapter } from "./profile-BamYnmhO.js";
8
8
  import { isDeepStrictEqual } from "node:util";
9
9
  import { z } from "zod";
10
10
  import { createHash } from "node:crypto";
@@ -567,8 +567,8 @@ async function ensureConversationTitleOnce(args) {
567
567
  }
568
568
  }
569
569
  /**
570
- * Fire-and-forget title work after durable human transcript writes.
571
- * This is the only entry that starts generation.
570
+ * Start title work after durable human transcript writes. This is the only
571
+ * entry that starts generation; `settleConversationTitleWork` joins it.
572
572
  */
573
573
  function scheduleConversationTitle(args) {
574
574
  if (!args.conversationId) return;
@@ -580,6 +580,13 @@ function scheduleConversationTitle(args) {
580
580
  });
581
581
  }
582
582
  /**
583
+ * Wait for title generation started for one Conversation. The queue worker
584
+ * gives this to `waitUntil` so title work has an owner.
585
+ */
586
+ async function settleConversationTitleWork(conversationId) {
587
+ await inFlightTitles.get(conversationId);
588
+ }
589
+ /**
583
590
  * Join in-flight generation when present, otherwise read the stored title.
584
591
  * Does not start generation; providers use this only to project a title.
585
592
  */
@@ -2139,4 +2146,4 @@ async function saveDone(args) {
2139
2146
  });
2140
2147
  }
2141
2148
  //#endregion
2142
- export { fallbackShortTitle as $, commitAcceptedReply as A, recordAuthorizationCompleted as B, isToolResultError as C, stripRuntimeTurnContext as D, retainRuntimeTurnContext as E, loadTurnRoute as F, recordToolExecutionStarted as G, recordGuardianActionReviewed as H, openConversationProjection as I, hydrateConversationMessages as J, recordTurnRoute as K, recordAgentsInstructionsUpdated as L, loadConnectedMcpProviders as M, loadConversationProjection as N, trimTrailingAssistantMessages as O, loadProjection as P, resolveConversationTitle as Q, recordAttachmentsDelivered as R, isContinuablePiBoundary as S, normalizeToolNameFromResult as T, recordMcpProviderConnected as U, recordAuthorizationRequested as V, recordSubscribedReplyRoute as W, projectConversationMessages as X, persistConversationMessages as Y, persistConversationMessageSummaries as Z, getTerminalAssistantMessages as _, completeTurnRecord as a, getConversationMessageSlackTs as at, instructionTextForProjection as b, listTurnSummaries as c, normalizeConversationText as ct, TurnSliceLimitExceededError as d, upsertConversationMessage as dt, resolveTaskTitle as et, assertTurnToolCallLimit as f, estimateTextTokens as ft, getPiMessageRole as g, piMessageFromHistoryItem as gt, extractAssistantText as h, historyItemFromPiMessage as ht, abandonTurnRecord as i, estimateConversationContextTokens as it, commitMessages as j, TURN_CONTEXT_TAG as k, recordTurnSummary as l, recordDeliveredAssistantMessage as lt, isTurnExecutionLimitExceededError as m, getAgentContextInputLimitTokens as mt, loadTurnCheckpoint as n, buildConversationContext as nt, failTurnRecord as o, isHumanConversationMessage as ot, buildTurnErrorResponse as p, getAgentContextCompactionTriggerTokens as pt, appendConversationMessages as q, saveTurnCheckpoint as r, createConversationMemoryService as rt, getTurnRecord as s, markConversationMessage as st, continuableMessages as t, appendThreadContextMessages as tt, persistWithRetry as u, turnHasReply as ut, getUserMessageInstructionText as v, isToolResultMessage as w, isAssistantMessage as x, hasRuntimeTurnContext as y, recordAuthenticationLinked as z };
2149
+ export { resolveConversationTitle as $, commitAcceptedReply as A, recordAuthenticationLinked as B, isToolResultError as C, stripRuntimeTurnContext as D, retainRuntimeTurnContext as E, loadTurnProjection as F, recordSubscribedReplyRoute as G, recordAuthorizationRequested as H, loadTurnRoute as I, appendConversationMessages as J, recordToolExecutionStarted as K, openConversationProjection as L, loadConnectedMcpProviders as M, loadConversationProjection as N, trimTrailingAssistantMessages as O, loadProjection as P, persistConversationMessageSummaries as Q, recordAgentsInstructionsUpdated as R, isContinuablePiBoundary as S, normalizeToolNameFromResult as T, recordGuardianActionReviewed as U, recordAuthorizationCompleted as V, recordMcpProviderConnected as W, persistConversationMessages as X, hydrateConversationMessages as Y, projectConversationMessages as Z, getTerminalAssistantMessages as _, historyItemFromPiMessage as _t, completeTurnRecord as a, createConversationMemoryService as at, instructionTextForProjection as b, listTurnSummaries as c, isHumanConversationMessage as ct, TurnSliceLimitExceededError as d, recordDeliveredAssistantMessage as dt, settleConversationTitleWork as et, assertTurnToolCallLimit as f, turnHasReply as ft, getPiMessageRole as g, getAgentContextInputLimitTokens as gt, extractAssistantText as h, getAgentContextCompactionTriggerTokens as ht, abandonTurnRecord as i, buildConversationContext as it, commitMessages as j, TURN_CONTEXT_TAG as k, recordTurnSummary as l, markConversationMessage as lt, isTurnExecutionLimitExceededError as m, estimateTextTokens as mt, loadTurnCheckpoint as n, resolveTaskTitle as nt, failTurnRecord as o, estimateConversationContextTokens as ot, buildTurnErrorResponse as p, upsertConversationMessage as pt, recordTurnRoute as q, saveTurnCheckpoint as r, appendThreadContextMessages as rt, getTurnRecord as s, getConversationMessageSlackTs as st, continuableMessages as t, fallbackShortTitle as tt, persistWithRetry as u, normalizeConversationText as ut, getUserMessageInstructionText as v, piMessageFromHistoryItem as vt, isToolResultMessage as w, isAssistantMessage as x, hasRuntimeTurnContext as y, recordAttachmentsDelivered as z };
@@ -1,4 +1,4 @@
1
- import { n as JuniorPluginSet } from "../plugins-BT2l4We3.js";
1
+ import { n as JuniorPluginSet } from "../plugins-CjfUP5gJ.js";
2
2
  //#region src/cli/chat.d.ts
3
3
  export declare const CHAT_USAGE = "usage: junior chat\n junior chat -p <message>";
4
4
  export type ChatCommandOptions = {
package/dist/cli/chat.js CHANGED
@@ -1,5 +1,5 @@
1
- import { r as executeAgentRun, t as createAgentRunner } from "../agent-runner-BlDI1zV2.js";
2
- import { t as loadAppPluginSet } from "../plugin-module-BKGOXca2.js";
1
+ import { r as executeAgentRun, t as createAgentRunner } from "../agent-runner-uP7QRc4c.js";
2
+ import { t as loadAppPluginSet } from "../plugin-module-CVvEUSMH.js";
3
3
  import path from "node:path";
4
4
  import { createHash, randomUUID } from "node:crypto";
5
5
  import { stderr, stdin, stdout } from "node:process";
@@ -100,10 +100,10 @@ async function loadLocalPluginSet() {
100
100
  async function configureLocalChatPlugins(pluginSet) {
101
101
  const [pluginsModule, agentHooksModule, catalogRuntimeModule, validationModule, databaseModule] = await Promise.all([
102
102
  import("../plugins-egKWjgue.js").then((n) => n.o),
103
- import("../agent-hooks-DS7k0ZWY.js").then((n) => n.t),
104
- import("../catalog-runtime-B9u_3-GW.js").then((n) => n.t),
105
- import("../validation-DAkYeKDT.js").then((n) => n.r),
106
- import("../agent-hooks-DS7k0ZWY.js").then((n) => n.Zt)
103
+ import("../agent-hooks-Da_H0jHv.js").then((n) => n.t),
104
+ import("../catalog-runtime-C7339Cfm.js").then((n) => n.t),
105
+ import("../validation-B9lMbisx.js").then((n) => n.r),
106
+ import("../agent-hooks-Da_H0jHv.js").then((n) => n.Zt)
107
107
  ]);
108
108
  const resolvedPluginSet = pluginSet === void 0 ? await loadLocalPluginSet() : pluginSet ?? void 0;
109
109
  const plugins = pluginsModule.pluginRuntimeRegistrationsFromPluginSet(resolvedPluginSet);
@@ -153,18 +153,18 @@ function localDevServerUrl() {
153
153
  async function prepareLocalChatRun(io, pluginSet) {
154
154
  defaultStateAdapterForLocalChat();
155
155
  await configureLocalChatPlugins(pluginSet);
156
- const { setExperimentalFeatures } = await import("../agent-runner-BlDI1zV2.js").then((n) => n.x);
156
+ const { setExperimentalFeatures } = await import("../agent-runner-uP7QRc4c.js").then((n) => n.x);
157
157
  setExperimentalFeatures({ subagents: true });
158
- const { setBriefsConfig } = await import("../agent-hooks-DS7k0ZWY.js").then((n) => n.m);
158
+ const { setBriefsConfig } = await import("../agent-hooks-Da_H0jHv.js").then((n) => n.m);
159
159
  setBriefsConfig({ enabled: true });
160
- const { runLocalAgentTurn } = await import("../runner-BfelmbMv.js");
161
- const { startLocalOAuthCallbackServer } = await import("../oauth-callback-server-D07ZzVMs.js");
160
+ const { runLocalAgentTurn } = await import("../runner-DnBGVRnW.js");
161
+ const { startLocalOAuthCallbackServer } = await import("../oauth-callback-server-B_1p98Mb.js");
162
162
  const { createLocalOAuthState } = await import("../oauth-relay-CdCnu80W.js").then((n) => n.t);
163
- const { createLocalSandboxEgressSignalTransport } = await import("../sandbox-egress-signals-D5QUIO7Z.js");
164
- const { bindSpawnAgent } = await import("../spawn-DCfV7zGK.js").then((n) => n.n);
165
- const { createAgentInvocationWorker, routeAgentInvocationWork } = await import("../work-PmkvcY9l.js").then((n) => n.a);
163
+ const { createLocalSandboxEgressSignalTransport } = await import("../sandbox-egress-signals-DwJ7Boi_.js");
164
+ const { bindSpawnAgent } = await import("../spawn-DFdRspSD.js").then((n) => n.n);
165
+ const { createAgentInvocationWorker, routeAgentInvocationWork } = await import("../work-DNaoFrEe.js").then((n) => n.a);
166
166
  const { createLocalConversationWork } = await import("../conversation-work-C6y3T5Hx.js");
167
- const { processConversationWork } = await import("../worker-COcaq2J6.js").then((n) => n.n);
167
+ const { processConversationWork } = await import("../worker-xeJLxYwm.js").then((n) => n.n);
168
168
  let agentRunner;
169
169
  const localConversationWork = createLocalConversationWork(async (message) => {
170
170
  if (!agentRunner) throw new Error("Local agent runner is not ready");
package/dist/cli/check.js CHANGED
@@ -1,9 +1,9 @@
1
- import { D as JUNIOR_HEARTBEAT_ROUTE, M as LEGACY_JUNIOR_CONVERSATION_WORK_FUNCTION, T as JUNIOR_CONVERSATION_WORK_CALLBACK_ROUTE } from "../logging-F--48Q7Q.js";
2
- import { f as parseInlinePluginManifest, p as parsePluginManifest } from "../registry-_JLY0x7b.js";
3
- import { i as parseSkillFile } from "../skills-DAegjk5Y.js";
4
- import { pathToFileURL } from "node:url";
1
+ import { D as JUNIOR_HEARTBEAT_ROUTE, M as LEGACY_JUNIOR_CONVERSATION_WORK_FUNCTION, T as JUNIOR_CONVERSATION_WORK_CALLBACK_ROUTE } from "../logging-B4sKwmCG.js";
2
+ import { f as parseInlinePluginManifest, p as parsePluginManifest } from "../registry-CXNv9fDX.js";
3
+ import { i as parseSkillFile } from "../skills-Dd8O9Aav.js";
5
4
  import path from "node:path";
6
5
  import fs from "node:fs/promises";
6
+ import { pathToFileURL } from "node:url";
7
7
  //#region src/cli/check.ts
8
8
  const DEFAULT_IO = {
9
9
  info: console.log,
package/dist/cli/main.js CHANGED
@@ -25,7 +25,7 @@ async function runChat(argv, pluginSet) {
25
25
  return await (await import("./chat.js")).runChat(argv, void 0, { pluginSet });
26
26
  }
27
27
  async function runBriefs(argv) {
28
- return await (await import("../briefs-C3jhszOz.js")).runBriefs(argv);
28
+ return await (await import("../briefs-DrjBPQFy.js")).runBriefs(argv);
29
29
  }
30
30
  function topLevelCommand(argv) {
31
31
  return (argv[0] === "--" ? argv.slice(1) : argv)[0];
@@ -1,4 +1,4 @@
1
- import { n as JuniorPluginSet } from "../plugins-BT2l4We3.js";
1
+ import { n as JuniorPluginSet } from "../plugins-CjfUP5gJ.js";
2
2
  import { PluginCliIo } from "@sentry/junior-plugin-api";
3
3
  //#region src/cli/plugins.d.ts
4
4
  export type PluginCommandIo = PluginCliIo;
@@ -1,8 +1,8 @@
1
- import { d as setPlugins, f as validatePlugins, tn as getDb, wt as createPluginLogger } from "../agent-hooks-DS7k0ZWY.js";
2
- import { n as pluginCatalogRuntime } from "../catalog-runtime-B9u_3-GW.js";
3
- import { n as validatePluginRegistrations, t as validatePluginEgressCredentialHooks } from "../validation-DAkYeKDT.js";
1
+ import { d as setPlugins, f as validatePlugins, tn as getDb, wt as createPluginLogger } from "../agent-hooks-Da_H0jHv.js";
2
+ import { n as pluginCatalogRuntime } from "../catalog-runtime-C7339Cfm.js";
3
+ import { n as validatePluginRegistrations, t as validatePluginEgressCredentialHooks } from "../validation-B9lMbisx.js";
4
4
  import { a as pluginRuntimeRegistrationsFromPluginSet, i as pluginCliRegistrationsFromPluginSet, r as pluginCatalogConfigFromPluginSet } from "../plugins-egKWjgue.js";
5
- import { t as loadAppPluginSet } from "../plugin-module-BKGOXca2.js";
5
+ import { t as loadAppPluginSet } from "../plugin-module-CVvEUSMH.js";
6
6
  import { stderr, stdout } from "node:process";
7
7
  import { createJiti } from "jiti";
8
8
  import { Command, CommanderError } from "commander";
@@ -1,6 +1,6 @@
1
- import { n as pluginCatalogRuntime } from "../catalog-runtime-B9u_3-GW.js";
2
- import { S as disconnectStateAdapter, t as create } from "../profile-DZ2DUdd1.js";
3
- import { r as resolve } from "../resolve-Cuoj3MML.js";
1
+ import { n as pluginCatalogRuntime } from "../catalog-runtime-C7339Cfm.js";
2
+ import { S as disconnectStateAdapter, t as create } from "../profile-BamYnmhO.js";
3
+ import { r as resolve } from "../resolve-C9ETkt4T.js";
4
4
  //#region src/cli/snapshot-create.ts
5
5
  const DEFAULT_RUNTIME = "node22";
6
6
  const DEFAULT_TIMEOUT_MS = 6e5;
@@ -1,5 +1,5 @@
1
1
  import "../db-Ca9Nt5ci.js";
2
- import { n as JuniorPluginSet } from "../plugins-BT2l4We3.js";
2
+ import { n as JuniorPluginSet } from "../plugins-CjfUP5gJ.js";
3
3
  //#region src/cli/upgrade/types.d.ts
4
4
  interface UpgradeIo {
5
5
  info: (line: string) => void;
@@ -1,11 +1,11 @@
1
- import { a as getChatConfig } from "../config-Bmw4xTPK.js";
2
- import { t as createJuniorSqlExecutor } from "../executor-B9ksWZCv.js";
3
- import { t as createPluginCatalogRuntime } from "../registry-_JLY0x7b.js";
1
+ import { i as getChatConfig } from "../config-JR9wke1W.js";
2
+ import { t as createJuniorSqlExecutor } from "../executor-BW9XWgUQ.js";
3
+ import { t as createPluginCatalogRuntime } from "../registry-CXNv9fDX.js";
4
4
  import { n as pluginCatalogConfigFromEnv, r as pluginCatalogConfigFromPluginSet, t as defineJuniorPlugins } from "../plugins-egKWjgue.js";
5
- import { t as loadAppPluginSet } from "../plugin-module-BKGOXca2.js";
6
- import { fileURLToPath } from "node:url";
5
+ import { t as loadAppPluginSet } from "../plugin-module-CVvEUSMH.js";
7
6
  import { basename, dirname, join, resolve } from "node:path";
8
7
  import { createHash } from "node:crypto";
8
+ import { fileURLToPath } from "node:url";
9
9
  import { createJiti } from "jiti";
10
10
  import { readMigrationFiles } from "drizzle-orm/migrator";
11
11
  //#region src/db/postgres-error.ts
@@ -1,5 +1,5 @@
1
- import { d as logException, g as serializeGenAiAttribute, i as extractGenAiUsageAttributes, m as normalizeGenAiFinishReason, p as logWarn, w as withSpan } from "./logging-F--48Q7Q.js";
2
- import { a as toCanonicalInputMessage, n as getCurrentConversationPrivacy, o as toCanonicalOutputMessage, s as toGenAiMessagesTraceAttributes } from "./conversation-privacy-BV2dtba2.js";
1
+ import { d as logException, g as serializeGenAiAttribute, i as extractGenAiUsageAttributes, m as normalizeGenAiFinishReason, p as logWarn, w as withSpan } from "./logging-B4sKwmCG.js";
2
+ import { a as toCanonicalInputMessage, n as getCurrentConversationPrivacy, o as toCanonicalOutputMessage, s as toGenAiMessagesTraceAttributes } from "./conversation-privacy-au02dyZK.js";
3
3
  import { calculateCost, completeSimple, getEnvApiKey, getModels, registerApiProvider } from "@earendil-works/pi-ai/compat";
4
4
  import { stream as streamAnthropic, streamSimple as streamSimpleAnthropic } from "@earendil-works/pi-ai/api/anthropic-messages";
5
5
  import { createGatewayProvider } from "@ai-sdk/gateway";