@sentry/junior 0.109.0 → 0.111.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 (123) hide show
  1. package/dist/{agent-hooks-FHHVLNPA.js → agent-hooks-QQ2IWKOP.js} +12 -13
  2. package/dist/api/conversations/access.d.ts +9 -0
  3. package/dist/api/conversations/aggregate.d.ts +12 -1
  4. package/dist/api/conversations/archive.d.ts +3 -5
  5. package/dist/api/conversations/detail.d.ts +156 -7
  6. package/dist/api/conversations/events.d.ts +1 -1
  7. package/dist/api/conversations/list.d.ts +57 -6
  8. package/dist/api/conversations/projection.d.ts +6 -7
  9. package/dist/api/conversations/reporting.d.ts +10 -4
  10. package/dist/api/conversations/routes.d.ts +2 -1
  11. package/dist/api/conversations/shared.d.ts +1 -1
  12. package/dist/api/conversations/stats.d.ts +37 -6
  13. package/dist/api/conversations/stats.query.d.ts +1 -1
  14. package/dist/api/conversations/usage.d.ts +9 -0
  15. package/dist/api/http.d.ts +7 -0
  16. package/dist/api/locations/detail.d.ts +102 -6
  17. package/dist/api/locations/list.d.ts +43 -5
  18. package/dist/api/locations/query.d.ts +4 -2
  19. package/dist/api/locations/routes.d.ts +2 -1
  20. package/dist/api/people/list.d.ts +28 -6
  21. package/dist/api/people/list.query.d.ts +1 -1
  22. package/dist/api/people/profile.d.ts +96 -7
  23. package/dist/api/people/profile.query.d.ts +4 -2
  24. package/dist/api/people/routes.d.ts +2 -1
  25. package/dist/api/people/shared.d.ts +1219 -2
  26. package/dist/api/route.d.ts +18 -4
  27. package/dist/api/schema/common.d.ts +6 -0
  28. package/dist/api/{conversations/schema.d.ts → schema/conversation.d.ts} +31 -3
  29. package/dist/api/{locations/schema.d.ts → schema/location.d.ts} +5 -0
  30. package/dist/api/{people/schema.d.ts → schema/person.d.ts} +37 -45
  31. package/dist/api/schema.d.ts +8 -22
  32. package/dist/api/schema.js +10 -2
  33. package/dist/api.d.ts +5 -1
  34. package/dist/api.js +767 -384
  35. package/dist/app.js +591 -447
  36. package/dist/build/virtual-config.d.ts +2 -0
  37. package/dist/catalog-runtime-D22W6QEJ.js +16 -0
  38. package/dist/chat/agent/request.d.ts +3 -6
  39. package/dist/chat/agent/resume.d.ts +11 -12
  40. package/dist/chat/agent/sandbox.d.ts +36 -11
  41. package/dist/chat/agent/tools.d.ts +5 -8
  42. package/dist/chat/config.d.ts +8 -1
  43. package/dist/chat/conversations/history.d.ts +3 -0
  44. package/dist/chat/conversations/sql/privacy.d.ts +3 -15
  45. package/dist/chat/pi/messages.d.ts +2 -2
  46. package/dist/chat/pi/sdk.d.ts +1 -1
  47. package/dist/chat/pi/sql-model-usage.d.ts +4 -1
  48. package/dist/chat/plugins/agent-hooks.d.ts +2 -2
  49. package/dist/chat/runtime/agent-continue-runner.d.ts +7 -3
  50. package/dist/chat/runtime/slack-runtime.d.ts +1 -2
  51. package/dist/chat/runtime/thread-state.d.ts +3 -7
  52. package/dist/chat/runtime/turn-preparation.d.ts +2 -2
  53. package/dist/chat/sandbox/command-result.d.ts +91 -0
  54. package/dist/chat/sandbox/errors.d.ts +3 -1
  55. package/dist/chat/sandbox/ref.d.ts +5 -0
  56. package/dist/chat/sandbox/sandbox.d.ts +19 -46
  57. package/dist/chat/sandbox/session.d.ts +16 -20
  58. package/dist/chat/sandbox/skill-sync.d.ts +2 -2
  59. package/dist/chat/sandbox/workspace.d.ts +14 -12
  60. package/dist/chat/services/auth-pause.d.ts +4 -0
  61. package/dist/chat/services/context-compaction.d.ts +1 -0
  62. package/dist/chat/services/turn-result.d.ts +3 -4
  63. package/dist/chat/task-execution/queue-signing.d.ts +10 -8
  64. package/dist/chat/task-execution/queue.d.ts +9 -7
  65. package/dist/chat/task-execution/slack-work.d.ts +9 -7
  66. package/dist/chat/task-execution/state.d.ts +75 -22
  67. package/dist/chat/task-execution/store.d.ts +34 -3
  68. package/dist/chat/task-execution/worker.d.ts +0 -1
  69. package/dist/chat/tool-support/normalize-result.d.ts +2 -2
  70. package/dist/chat/tool-support/pi-tool-adapter.d.ts +2 -2
  71. package/dist/chat/tool-support/structured-result.d.ts +1 -2
  72. package/dist/chat/tools/sandbox/file-uploads.d.ts +1 -1
  73. package/dist/chat/{runtime → tools/sandbox}/generated-artifacts.d.ts +3 -3
  74. package/dist/chat/tools/types.d.ts +1 -1
  75. package/dist/chat/tools/web/fetch-content.d.ts +5 -0
  76. package/dist/chat/tools/web/image-generate.d.ts +2 -1
  77. package/dist/chat/tools/web/search.d.ts +1 -1
  78. package/dist/{chunk-CEA3A3UA.js → chunk-2ZTTXTSZ.js} +24 -1
  79. package/dist/{chunk-IVVGFRQQ.js → chunk-42WRQLJ6.js} +10 -38
  80. package/dist/{chunk-O3JMSZLI.js → chunk-6Y5L4BOM.js} +3 -5
  81. package/dist/{chunk-HO5NT6OE.js → chunk-B45FPP2A.js} +306 -31
  82. package/dist/{chunk-WHMOBKT7.js → chunk-BTRNMS6A.js} +2 -2
  83. package/dist/{chunk-PLB7MRCQ.js → chunk-C4MZ3GP5.js} +1 -1
  84. package/dist/{chunk-HHVY4SMP.js → chunk-FPK7XY3F.js} +98 -92
  85. package/dist/{chunk-RGX4V75M.js → chunk-IFAHK54X.js} +3 -3
  86. package/dist/{chunk-ISMWX44P.js → chunk-J7APPQIJ.js} +2 -2
  87. package/dist/{chunk-TMBRFULF.js → chunk-JQFJO5WH.js} +7 -1
  88. package/dist/{chunk-FWJRXN4F.js → chunk-L6JPKANW.js} +3 -139
  89. package/dist/{chunk-7Q6WCISF.js → chunk-MIAKQNYX.js} +43 -31
  90. package/dist/chunk-MPVES2IC.js +44 -0
  91. package/dist/{chunk-JNAVF45E.js → chunk-NQLWOTY4.js} +47 -19
  92. package/dist/{chunk-IXKSQGIO.js → chunk-OOLU34J4.js} +8860 -9137
  93. package/dist/{chunk-OUHNWH46.js → chunk-PYKKM4MM.js} +1 -1
  94. package/dist/{chunk-MXW4GL53.js → chunk-PZELBSHC.js} +8 -9
  95. package/dist/{chunk-QY636HZU.js → chunk-QQIVLZW4.js} +96 -17
  96. package/dist/{chunk-72OMGPDS.js → chunk-SL3ZKNLQ.js} +19 -18
  97. package/dist/{chunk-3SXUV423.js → chunk-WSRBFHPX.js} +1 -1
  98. package/dist/{chunk-TT6GMXNA.js → chunk-XQAYFRWT.js} +2 -2
  99. package/dist/{chunk-MGUMR35T.js → chunk-Z2W4SJZ7.js} +1 -1
  100. package/dist/{chunk-OCD3OZRK.js → chunk-Z4G3WCP3.js} +1 -1
  101. package/dist/{chunk-FENLIFJD.js → chunk-ZRZ4SVWG.js} +69 -10
  102. package/dist/cli/chat.js +23 -24
  103. package/dist/cli/check.js +8 -8
  104. package/dist/cli/plugins.js +15 -16
  105. package/dist/cli/snapshot-warmup.js +11 -11
  106. package/dist/cli/upgrade.js +9 -9
  107. package/dist/db/schema/conversations.d.ts +17 -0
  108. package/dist/db/schema.d.ts +17 -0
  109. package/dist/{db-V3NU72O2.js → db-WXQOQESG.js} +8 -9
  110. package/dist/instrumentation.js +4 -4
  111. package/dist/nitro.js +15 -10
  112. package/dist/reporting-schema.d.ts +46 -0
  113. package/dist/{runner-JYBCQBLK.js → runner-4QY4XH4B.js} +23 -33
  114. package/dist/{skills-U6MDAST7.js → skills-P5MU4EBX.js} +8 -8
  115. package/dist/{validation-72N3JVRU.js → validation-PQF5OP6T.js} +8 -8
  116. package/dist/version.js +1 -1
  117. package/migrations/0007_thick_sugar_man.sql +23 -0
  118. package/migrations/meta/0007_snapshot.json +1013 -0
  119. package/migrations/meta/_journal.json +7 -0
  120. package/package.json +6 -6
  121. package/dist/catalog-runtime-DMGJSLV2.js +0 -16
  122. package/dist/chunk-OB42YVAE.js +0 -16
  123. package/dist/chunk-SYAQIR5Z.js +0 -53
@@ -11,22 +11,21 @@ import {
11
11
  getPlugins,
12
12
  setPlugins,
13
13
  validatePlugins
14
- } from "./chunk-QY636HZU.js";
15
- import "./chunk-OUHNWH46.js";
16
- import "./chunk-RGX4V75M.js";
17
- import "./chunk-FENLIFJD.js";
18
- import "./chunk-TMBRFULF.js";
14
+ } from "./chunk-QQIVLZW4.js";
15
+ import "./chunk-PYKKM4MM.js";
16
+ import "./chunk-IFAHK54X.js";
17
+ import "./chunk-ZRZ4SVWG.js";
18
+ import "./chunk-JQFJO5WH.js";
19
19
  import "./chunk-4ZNGQH7C.js";
20
- import "./chunk-JNAVF45E.js";
20
+ import "./chunk-NQLWOTY4.js";
21
21
  import "./chunk-VFUK3X5B.js";
22
- import "./chunk-O3JMSZLI.js";
23
- import "./chunk-SYAQIR5Z.js";
24
- import "./chunk-PLB7MRCQ.js";
25
- import "./chunk-ISMWX44P.js";
26
- import "./chunk-OB42YVAE.js";
22
+ import "./chunk-6Y5L4BOM.js";
23
+ import "./chunk-C4MZ3GP5.js";
24
+ import "./chunk-J7APPQIJ.js";
25
+ import "./chunk-42WRQLJ6.js";
27
26
  import "./chunk-6GWA276C.js";
28
- import "./chunk-IVVGFRQQ.js";
29
- import "./chunk-OCD3OZRK.js";
27
+ import "./chunk-MPVES2IC.js";
28
+ import "./chunk-Z4G3WCP3.js";
30
29
  import "./chunk-MLKGABMK.js";
31
30
  export {
32
31
  PluginHookDeniedError,
@@ -0,0 +1,9 @@
1
+ import type { JuniorDatabase } from "@/db/db";
2
+ import type { JuniorDestinationVisibility } from "@/db/schema/destinations";
3
+ export interface ConversationAccess {
4
+ canViewPrivateContent: boolean;
5
+ isParticipant: boolean;
6
+ visibility: JuniorDestinationVisibility | null;
7
+ }
8
+ /** Resolve viewer access for a bounded set of persisted conversations. */
9
+ export declare function readConversationAccessFromSql(db: JuniorDatabase, conversationIds: readonly string[], verifiedViewerEmail?: string): Promise<Map<string, ConversationAccess>>;
@@ -1,5 +1,15 @@
1
+ import type { AnyPgColumn } from "drizzle-orm/pg-core";
2
+ interface ConversationAggregateSource {
3
+ conversationId: AnyPgColumn;
4
+ durationMs: AnyPgColumn;
5
+ executionStatus: AnyPgColumn;
6
+ usage: AnyPgColumn;
7
+ }
1
8
  /** Select complete conversation metrics inside the database instead of materializing source rows. */
2
- export declare function conversationAggregateColumns(): {
9
+ export declare function conversationAggregateColumns(sources?: {
10
+ metrics: ConversationAggregateSource;
11
+ roots: ConversationAggregateSource;
12
+ }): {
3
13
  active: import("drizzle-orm").SQL<number>;
4
14
  conversations: import("drizzle-orm").SQL<number>;
5
15
  costUsd: import("drizzle-orm").SQL<number | null>;
@@ -14,3 +24,4 @@ export declare function conversationRangeColumns(): {
14
24
  };
15
25
  /** Count distinct UTC activity dates without loading conversation timestamps into the app. */
16
26
  export declare function conversationActiveDaysColumn(): import("drizzle-orm").SQL<number>;
27
+ export {};
@@ -1,7 +1,5 @@
1
1
  /** Serve the archive mutation with optimistic activity concurrency control. */
2
- declare const _default: {
3
- method: "patch";
4
- path: string;
5
- handler: (c: import("hono").Context<any, any, import("hono/types").BlankInput>) => Promise<Response>;
6
- };
2
+ declare const _default: import("../route").ApiRoute<import("zod").ZodObject<{
3
+ archived: import("zod").ZodBoolean;
4
+ }, import("zod/v4/core").$strict>>;
7
5
  export default _default;
@@ -1,10 +1,159 @@
1
- import type { ConversationDetailReport } from "./schema";
1
+ import type { ConversationDetailReport } from "../schema/conversation";
2
2
  /** Load one conversation from its canonical event history. */
3
- export declare function readConversationDetail(conversationId: string): Promise<ConversationDetailReport | undefined>;
3
+ export declare function readConversationDetail(conversationId: string, options?: {
4
+ verifiedViewerEmail?: string;
5
+ }): Promise<ConversationDetailReport | undefined>;
4
6
  /** Serve one conversation detail endpoint. */
5
- declare const _default: {
6
- method: "get";
7
- path: string;
8
- handler: (c: import("hono").Context<any, any, import("hono/types").BlankInput>) => Promise<Response>;
9
- };
7
+ declare const _default: import("../route").ApiRoute<import("zod").ZodObject<{
8
+ displayTitle: import("zod").ZodString;
9
+ cumulativeDurationMs: import("zod").ZodNumber;
10
+ cumulativeUsage: import("zod").ZodOptional<import("zod").ZodObject<{
11
+ inputTokens: import("zod").ZodOptional<import("zod").ZodNumber>;
12
+ outputTokens: import("zod").ZodOptional<import("zod").ZodNumber>;
13
+ cachedInputTokens: import("zod").ZodOptional<import("zod").ZodNumber>;
14
+ cacheCreationTokens: import("zod").ZodOptional<import("zod").ZodNumber>;
15
+ reasoningTokens: import("zod").ZodOptional<import("zod").ZodNumber>;
16
+ totalTokens: import("zod").ZodOptional<import("zod").ZodNumber>;
17
+ cost: import("zod").ZodOptional<import("zod").ZodObject<{
18
+ input: import("zod").ZodOptional<import("zod").ZodNumber>;
19
+ output: import("zod").ZodOptional<import("zod").ZodNumber>;
20
+ cacheRead: import("zod").ZodOptional<import("zod").ZodNumber>;
21
+ cacheWrite: import("zod").ZodOptional<import("zod").ZodNumber>;
22
+ total: import("zod").ZodOptional<import("zod").ZodNumber>;
23
+ }, import("zod/v4/core").$strict>>;
24
+ }, import("zod/v4/core").$strict>>;
25
+ conversationId: import("zod").ZodString;
26
+ isParticipant: import("zod").ZodBoolean;
27
+ status: import("zod").ZodEnum<{
28
+ completed: "completed";
29
+ failed: "failed";
30
+ active: "active";
31
+ }>;
32
+ startedAt: import("zod").ZodString;
33
+ lastSeenAt: import("zod").ZodString;
34
+ lastProgressAt: import("zod").ZodString;
35
+ surface: import("zod").ZodEnum<{
36
+ slack: "slack";
37
+ api: "api";
38
+ internal: "internal";
39
+ scheduler: "scheduler";
40
+ }>;
41
+ actorIdentity: import("zod").ZodOptional<import("zod").ZodObject<{
42
+ email: import("zod").ZodOptional<import("zod").ZodString>;
43
+ fullName: import("zod").ZodOptional<import("zod").ZodString>;
44
+ slackUserId: import("zod").ZodOptional<import("zod").ZodString>;
45
+ slackUserName: import("zod").ZodOptional<import("zod").ZodString>;
46
+ }, import("zod/v4/core").$strict>>;
47
+ archivedAt: import("zod").ZodOptional<import("zod").ZodString>;
48
+ channel: import("zod").ZodOptional<import("zod").ZodString>;
49
+ channelName: import("zod").ZodOptional<import("zod").ZodString>;
50
+ channelNameRedacted: import("zod").ZodOptional<import("zod").ZodBoolean>;
51
+ locationId: import("zod").ZodOptional<import("zod").ZodString>;
52
+ sentryTraceUrl: import("zod").ZodOptional<import("zod").ZodString>;
53
+ traceId: import("zod").ZodOptional<import("zod").ZodString>;
54
+ modelUsage: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodObject<{
55
+ modelId: import("zod").ZodString;
56
+ usage: import("zod").ZodObject<{
57
+ inputTokens: import("zod").ZodOptional<import("zod").ZodNumber>;
58
+ outputTokens: import("zod").ZodOptional<import("zod").ZodNumber>;
59
+ cachedInputTokens: import("zod").ZodOptional<import("zod").ZodNumber>;
60
+ cacheCreationTokens: import("zod").ZodOptional<import("zod").ZodNumber>;
61
+ reasoningTokens: import("zod").ZodOptional<import("zod").ZodNumber>;
62
+ totalTokens: import("zod").ZodOptional<import("zod").ZodNumber>;
63
+ cost: import("zod").ZodOptional<import("zod").ZodObject<{
64
+ input: import("zod").ZodOptional<import("zod").ZodNumber>;
65
+ output: import("zod").ZodOptional<import("zod").ZodNumber>;
66
+ cacheRead: import("zod").ZodOptional<import("zod").ZodNumber>;
67
+ cacheWrite: import("zod").ZodOptional<import("zod").ZodNumber>;
68
+ total: import("zod").ZodOptional<import("zod").ZodNumber>;
69
+ }, import("zod/v4/core").$strict>>;
70
+ }, import("zod/v4/core").$strict>;
71
+ }, import("zod/v4/core").$strict>>>;
72
+ events: import("zod").ZodArray<import("zod").ZodObject<{
73
+ seq: import("zod").ZodNumber;
74
+ createdAt: import("zod").ZodString;
75
+ data: import("zod").ZodDiscriminatedUnion<[import("zod").ZodObject<{
76
+ type: import("zod").ZodLiteral<"message">;
77
+ messageId: import("zod").ZodString;
78
+ role: import("zod").ZodEnum<{
79
+ system: "system";
80
+ user: "user";
81
+ assistant: "assistant";
82
+ }>;
83
+ eventType: import("zod").ZodOptional<import("zod").ZodString>;
84
+ text: import("zod").ZodOptional<import("zod").ZodString>;
85
+ redacted: import("zod").ZodOptional<import("zod").ZodLiteral<true>>;
86
+ }, import("zod/v4/core").$strict>, import("zod").ZodObject<{
87
+ type: import("zod").ZodLiteral<"message_handled">;
88
+ messageId: import("zod").ZodString;
89
+ }, import("zod/v4/core").$strict>, import("zod").ZodObject<{
90
+ type: import("zod").ZodLiteral<"tool_started">;
91
+ toolCallId: import("zod").ZodString;
92
+ name: import("zod").ZodString;
93
+ }, import("zod/v4/core").$strict>, import("zod").ZodObject<{
94
+ type: import("zod").ZodLiteral<"tool_calls">;
95
+ calls: import("zod").ZodArray<import("zod").ZodObject<{
96
+ toolCallId: import("zod").ZodString;
97
+ name: import("zod").ZodString;
98
+ input: import("zod").ZodOptional<import("zod").ZodUnknown>;
99
+ }, import("zod/v4/core").$strict>>;
100
+ }, import("zod/v4/core").$strict>, import("zod").ZodObject<{
101
+ type: import("zod").ZodLiteral<"tool_result">;
102
+ toolCallId: import("zod").ZodString;
103
+ outcome: import("zod").ZodEnum<{
104
+ error: "error";
105
+ completed: "completed";
106
+ }>;
107
+ output: import("zod").ZodOptional<import("zod").ZodUnknown>;
108
+ }, import("zod/v4/core").$strict>, import("zod").ZodDiscriminatedUnion<[import("zod").ZodObject<{
109
+ type: import("zod").ZodLiteral<"turn_lifecycle">;
110
+ turnId: import("zod").ZodString;
111
+ state: import("zod").ZodEnum<{
112
+ no_reply: "no_reply";
113
+ started: "started";
114
+ succeeded: "succeeded";
115
+ }>;
116
+ }, import("zod/v4/core").$strict>, import("zod").ZodObject<{
117
+ type: import("zod").ZodLiteral<"turn_lifecycle">;
118
+ turnId: import("zod").ZodString;
119
+ state: import("zod").ZodLiteral<"failed">;
120
+ failureKind: import("zod").ZodEnum<{
121
+ delivery: "delivery";
122
+ agent: "agent";
123
+ }>;
124
+ }, import("zod/v4/core").$strict>], "state">, import("zod").ZodObject<{
125
+ type: import("zod").ZodLiteral<"compaction">;
126
+ }, import("zod/v4/core").$strict>, import("zod").ZodObject<{
127
+ type: import("zod").ZodLiteral<"handoff">;
128
+ modelProfile: import("zod").ZodString;
129
+ modelId: import("zod").ZodString;
130
+ reasoningLevel: import("zod").ZodOptional<import("zod").ZodString>;
131
+ triggeringToolCallId: import("zod").ZodOptional<import("zod").ZodString>;
132
+ }, import("zod/v4/core").$strict>, import("zod").ZodObject<{
133
+ type: import("zod").ZodLiteral<"subagent_started">;
134
+ childConversationId: import("zod").ZodString;
135
+ subagentKind: import("zod").ZodString;
136
+ parentToolCallId: import("zod").ZodOptional<import("zod").ZodString>;
137
+ }, import("zod/v4/core").$strict>, import("zod").ZodObject<{
138
+ type: import("zod").ZodLiteral<"subagent_ended">;
139
+ startedSeq: import("zod").ZodNumber;
140
+ outcome: import("zod").ZodEnum<{
141
+ error: "error";
142
+ success: "success";
143
+ aborted: "aborted";
144
+ }>;
145
+ }, import("zod/v4/core").$strict>], "type">;
146
+ }, import("zod/v4/core").$strict>>;
147
+ eventHistory: import("zod").ZodDiscriminatedUnion<[import("zod").ZodObject<{
148
+ status: import("zod").ZodLiteral<"available">;
149
+ }, import("zod/v4/core").$strict>, import("zod").ZodObject<{
150
+ status: import("zod").ZodLiteral<"redacted">;
151
+ reason: import("zod").ZodLiteral<"non_public_conversation">;
152
+ }, import("zod/v4/core").$strict>, import("zod").ZodObject<{
153
+ status: import("zod").ZodLiteral<"expired">;
154
+ expiredAt: import("zod").ZodString;
155
+ }, import("zod/v4/core").$strict>], "status">;
156
+ generatedAt: import("zod").ZodString;
157
+ sentryConversationUrl: import("zod").ZodOptional<import("zod").ZodString>;
158
+ }, import("zod/v4/core").$strict>>;
10
159
  export default _default;
@@ -1,5 +1,5 @@
1
1
  import type { ConversationEvent } from "@/chat/conversations/history";
2
- import { type ConversationReportEvent } from "./schema";
2
+ import { type ConversationReportEvent } from "../schema/conversation";
3
3
  /** Canonical event types that can contribute to the reporting projection. */
4
4
  export declare const conversationReportSourceEventTypes: readonly ["message", "message_handled", "agent_step", "tool_execution_started", "turn_started", "turn_completed", "turn_failed", "compaction", "handoff", "subagent_started", "subagent_ended"];
5
5
  /**
@@ -1,6 +1,6 @@
1
1
  import type { Conversation } from "@/chat/conversations/store";
2
2
  import type { JuniorDatabase } from "@/db/db";
3
- import type { ConversationFeed } from "./schema";
3
+ import type { ConversationFeed } from "../schema/conversation";
4
4
  declare function conversationRows(db: JuniorDatabase, limit: number, actorEmail?: string): Promise<{
5
5
  conversation: {
6
6
  conversationId: string;
@@ -40,6 +40,7 @@ declare function conversationRows(db: JuniorDatabase, limit: number, actorEmail?
40
40
  lastCheckpointAt: Date | null;
41
41
  lastEnqueuedAt: Date | null;
42
42
  parentConversationId: string | null;
43
+ rootConversationId: string | null;
43
44
  transcriptPurgedAt: Date | null;
44
45
  durationMs: number;
45
46
  usage: {
@@ -93,6 +94,7 @@ export declare function readConversationRecordFromSql(conversationId: string): P
93
94
  durationMs: number;
94
95
  locationId?: string;
95
96
  usage: ConversationRow["conversation"]["usage"];
97
+ rootConversationId: string | null;
96
98
  } | undefined>;
97
99
  /**
98
100
  * Build a bounded dashboard feed, applying a normalized actor-email filter
@@ -101,6 +103,7 @@ export declare function readConversationRecordFromSql(conversationId: string): P
101
103
  export declare function readConversationFeedFromSql(options?: {
102
104
  actorEmail?: string;
103
105
  limit?: number;
106
+ verifiedViewerEmail?: string;
104
107
  }): Promise<ConversationFeed>;
105
108
  /**
106
109
  * Load a bounded feed with an optional normalized actor-email presentation
@@ -108,11 +111,59 @@ export declare function readConversationFeedFromSql(options?: {
108
111
  */
109
112
  export declare function readConversationFeed(options?: {
110
113
  actorEmail?: string;
114
+ verifiedViewerEmail?: string;
111
115
  }): Promise<ConversationFeed>;
112
116
  /** Serve the conversation feed endpoint. */
113
- declare const _default: {
114
- method: "get";
115
- path: string;
116
- handler: (c: import("hono").Context<any, any, import("hono/types").BlankInput>) => Promise<Response>;
117
- };
117
+ declare const _default: import("../route").ApiRoute<import("zod").ZodObject<{
118
+ conversations: import("zod").ZodArray<import("zod").ZodObject<{
119
+ displayTitle: import("zod").ZodString;
120
+ cumulativeDurationMs: import("zod").ZodNumber;
121
+ cumulativeUsage: import("zod").ZodOptional<import("zod").ZodObject<{
122
+ inputTokens: import("zod").ZodOptional<import("zod").ZodNumber>;
123
+ outputTokens: import("zod").ZodOptional<import("zod").ZodNumber>;
124
+ cachedInputTokens: import("zod").ZodOptional<import("zod").ZodNumber>;
125
+ cacheCreationTokens: import("zod").ZodOptional<import("zod").ZodNumber>;
126
+ reasoningTokens: import("zod").ZodOptional<import("zod").ZodNumber>;
127
+ totalTokens: import("zod").ZodOptional<import("zod").ZodNumber>;
128
+ cost: import("zod").ZodOptional<import("zod").ZodObject<{
129
+ input: import("zod").ZodOptional<import("zod").ZodNumber>;
130
+ output: import("zod").ZodOptional<import("zod").ZodNumber>;
131
+ cacheRead: import("zod").ZodOptional<import("zod").ZodNumber>;
132
+ cacheWrite: import("zod").ZodOptional<import("zod").ZodNumber>;
133
+ total: import("zod").ZodOptional<import("zod").ZodNumber>;
134
+ }, import("zod/v4/core").$strict>>;
135
+ }, import("zod/v4/core").$strict>>;
136
+ conversationId: import("zod").ZodString;
137
+ isParticipant: import("zod").ZodBoolean;
138
+ status: import("zod").ZodEnum<{
139
+ completed: "completed";
140
+ failed: "failed";
141
+ active: "active";
142
+ }>;
143
+ startedAt: import("zod").ZodString;
144
+ lastSeenAt: import("zod").ZodString;
145
+ lastProgressAt: import("zod").ZodString;
146
+ surface: import("zod").ZodEnum<{
147
+ slack: "slack";
148
+ api: "api";
149
+ internal: "internal";
150
+ scheduler: "scheduler";
151
+ }>;
152
+ actorIdentity: import("zod").ZodOptional<import("zod").ZodObject<{
153
+ email: import("zod").ZodOptional<import("zod").ZodString>;
154
+ fullName: import("zod").ZodOptional<import("zod").ZodString>;
155
+ slackUserId: import("zod").ZodOptional<import("zod").ZodString>;
156
+ slackUserName: import("zod").ZodOptional<import("zod").ZodString>;
157
+ }, import("zod/v4/core").$strict>>;
158
+ archivedAt: import("zod").ZodOptional<import("zod").ZodString>;
159
+ channel: import("zod").ZodOptional<import("zod").ZodString>;
160
+ channelName: import("zod").ZodOptional<import("zod").ZodString>;
161
+ channelNameRedacted: import("zod").ZodOptional<import("zod").ZodBoolean>;
162
+ locationId: import("zod").ZodOptional<import("zod").ZodString>;
163
+ sentryTraceUrl: import("zod").ZodOptional<import("zod").ZodString>;
164
+ traceId: import("zod").ZodOptional<import("zod").ZodString>;
165
+ }, import("zod/v4/core").$strict>>;
166
+ source: import("zod").ZodLiteral<"conversation_index">;
167
+ generatedAt: import("zod").ZodString;
168
+ }, import("zod/v4/core").$strict>>;
118
169
  export default _default;
@@ -1,14 +1,13 @@
1
1
  import type { Conversation as StoredConversation } from "@/chat/conversations/store";
2
- import type { ConversationSummaryReport, ConversationSurface, ConversationUsage } from "./schema";
3
- /** Build the privacy-safe title shared by summary and detail reports. */
4
- export declare function titleFromConversation(args: {
5
- conversation: StoredConversation;
6
- surface: ConversationSurface;
7
- }): string;
2
+ import type { ConversationSummaryReport, ConversationUsage } from "../schema/conversation";
3
+ import type { ConversationAccess } from "./access";
4
+ type ConversationProjectionSource = Pick<StoredConversation, "actor" | "archivedAtMs" | "channelName" | "conversationId" | "createdAtMs" | "execution" | "lastActivityAtMs" | "source" | "title" | "updatedAtMs">;
8
5
  /** Project one durable conversation and its SQL metrics into the REST summary. */
9
6
  export declare function conversationSummaryFromStoredConversation(args: {
10
- conversation: StoredConversation;
7
+ access?: ConversationAccess;
8
+ conversation: ConversationProjectionSource;
11
9
  durationMs: number;
12
10
  locationId?: string;
13
11
  usage?: ConversationUsage;
14
12
  }): ConversationSummaryReport;
13
+ export {};
@@ -1,11 +1,11 @@
1
- import type { juniorConversations, juniorDestinations } from "@/db/schema";
2
- import type { ConversationSummaryReport, ConversationSurface } from "./schema";
1
+ import type { juniorConversations } from "@/db/schema";
2
+ import type { ConversationAccess } from "./access";
3
+ import type { ConversationSummaryReport, ConversationSurface } from "../schema/conversation";
3
4
  export type ReportingConversationRow = {
4
5
  channelName: string | null;
5
6
  conversationId: string;
6
7
  createdAt: Date;
7
8
  destinationId: string | null;
8
- destinationVisibility: (typeof juniorDestinations.$inferSelect)["visibility"] | null;
9
9
  durationMs: number;
10
10
  email: string | null;
11
11
  executionStatus: (typeof juniorConversations.$inferSelect)["executionStatus"];
@@ -32,7 +32,13 @@ export declare function slackLocationLabel(args: {
32
32
  channelNameRedacted?: boolean;
33
33
  }): string | undefined;
34
34
  /** Project one SQL conversation row into a privacy-safe API summary. */
35
- export declare function summaryFromRow(row: ReportingConversationRow): ConversationSummaryReport;
35
+ export declare function summaryFromRow(row: ReportingConversationRow, options?: {
36
+ access?: ConversationAccess;
37
+ metrics?: {
38
+ durationMs: number;
39
+ usage?: NonNullable<ReportingConversationRow["usage"]>;
40
+ };
41
+ }): ConversationSummaryReport;
36
42
  /** Collapse persisted conversation usage into the dashboard token total. */
37
43
  export declare function usageTokens(row: Pick<ReportingConversationRow, "usage">): number | undefined;
38
44
  /** Collapse a conversation summary status into aggregate counters. */
@@ -1,3 +1,4 @@
1
1
  import { Hono } from "hono";
2
+ import { type JuniorApiEnv } from "../route";
2
3
  /** Create the HTTP routes owned by the conversations API. */
3
- export declare function createConversationRoutes(): Hono;
4
+ export declare function createConversationRoutes(): Hono<JuniorApiEnv>;
@@ -1,4 +1,4 @@
1
- import type { ConversationSummaryReport, ConversationSurface } from "./schema";
1
+ import type { ConversationSummaryReport, ConversationSurface } from "../schema/conversation";
2
2
  /** Format a Slack destination without exposing private channel names. */
3
3
  export declare function slackStatsLocationLabel(input: Pick<ConversationSummaryReport, "channel" | "channelName" | "channelNameRedacted">): string | undefined;
4
4
  /** Return the generic display label for a conversation surface. */
@@ -1,10 +1,41 @@
1
- import type { ConversationStatsReport } from "./schema";
1
+ import type { ConversationStatsReport } from "../schema/conversation";
2
2
  /** Load aggregate conversation stats directly from durable SQL records. */
3
3
  export declare function readConversationStats(): Promise<ConversationStatsReport>;
4
4
  /** Serve aggregate conversation stats. */
5
- declare const _default: {
6
- method: "get";
7
- path: string;
8
- handler: () => Promise<Response>;
9
- };
5
+ declare const _default: import("../route").ApiRoute<import("zod").ZodObject<{
6
+ active: import("zod").ZodNumber;
7
+ conversations: import("zod").ZodNumber;
8
+ durationMs: import("zod").ZodNumber;
9
+ failed: import("zod").ZodNumber;
10
+ generatedAt: import("zod").ZodString;
11
+ metricDays: import("zod").ZodArray<import("zod").ZodObject<{
12
+ costUsd: import("zod").ZodOptional<import("zod").ZodNumber>;
13
+ date: import("zod").ZodString;
14
+ durationMs: import("zod").ZodNumber;
15
+ tokens: import("zod").ZodOptional<import("zod").ZodNumber>;
16
+ }, import("zod/v4/core").$strict>>;
17
+ locations: import("zod").ZodArray<import("zod").ZodObject<{
18
+ active: import("zod").ZodNumber;
19
+ conversations: import("zod").ZodNumber;
20
+ durationMs: import("zod").ZodNumber;
21
+ failed: import("zod").ZodNumber;
22
+ label: import("zod").ZodString;
23
+ costUsd: import("zod").ZodOptional<import("zod").ZodNumber>;
24
+ tokens: import("zod").ZodOptional<import("zod").ZodNumber>;
25
+ }, import("zod/v4/core").$strict>>;
26
+ actors: import("zod").ZodArray<import("zod").ZodObject<{
27
+ active: import("zod").ZodNumber;
28
+ conversations: import("zod").ZodNumber;
29
+ durationMs: import("zod").ZodNumber;
30
+ failed: import("zod").ZodNumber;
31
+ label: import("zod").ZodString;
32
+ costUsd: import("zod").ZodOptional<import("zod").ZodNumber>;
33
+ tokens: import("zod").ZodOptional<import("zod").ZodNumber>;
34
+ }, import("zod/v4/core").$strict>>;
35
+ source: import("zod").ZodLiteral<"conversation_index">;
36
+ costUsd: import("zod").ZodOptional<import("zod").ZodNumber>;
37
+ tokens: import("zod").ZodOptional<import("zod").ZodNumber>;
38
+ windowEnd: import("zod").ZodString;
39
+ windowStart: import("zod").ZodString;
40
+ }, import("zod/v4/core").$strict>>;
10
41
  export default _default;
@@ -1,3 +1,3 @@
1
- import type { ConversationStatsReport } from "./schema";
1
+ import type { ConversationStatsReport } from "../schema/conversation";
2
2
  /** Build complete 90-day dashboard stats from normalized durable SQL records. */
3
3
  export declare function readConversationStatsFromSql(): Promise<ConversationStatsReport>;
@@ -0,0 +1,9 @@
1
+ import { type AgentTurnUsage } from "@/chat/usage";
2
+ import type { JuniorDatabase } from "@/db/db";
3
+ interface RootConversationMetrics {
4
+ durationMs: number;
5
+ usage?: AgentTurnUsage;
6
+ }
7
+ /** Aggregate persisted metrics in PostgreSQL for selected conversation trees. */
8
+ export declare function readRootConversationMetricsFromSql(db: JuniorDatabase, rootConversationIds: readonly string[]): Promise<Map<string, RootConversationMetrics>>;
9
+ export {};
@@ -1,5 +1,12 @@
1
+ import type { ContentfulStatusCode } from "hono/utils/http-status";
1
2
  import { z } from "zod";
3
+ /** Serialize a REST response only after it satisfies its declared schema. */
4
+ export declare function jsonResponse<TSchema extends z.ZodType>(schema: TSchema, value: z.input<TSchema>, init?: ResponseInit): Response;
5
+ /** Stop a request with Junior's stable JSON error contract. */
6
+ export declare function throwApiError(status: ContentfulStatusCode, message: string, cause?: unknown): never;
2
7
  /** Parse route parameters and return a 400 response contract for invalid input. */
3
8
  export declare function parseParams<TSchema extends z.ZodType>(schema: TSchema, params: Record<string, string>): z.infer<TSchema>;
4
9
  /** Parse an HTTP query and return a 400 response contract for invalid input. */
5
10
  export declare function parseQuery<TSchema extends z.ZodType>(schema: TSchema, query: unknown): z.infer<TSchema>;
11
+ /** Parse a JSON request body and return a 400 response contract on failure. */
12
+ export declare function parseBody<TSchema extends z.ZodType>(schema: TSchema, body: unknown): z.infer<TSchema>;
@@ -1,5 +1,7 @@
1
1
  /** Expose operational detail for one persisted public conversation location. */
2
- export declare function readLocationDetail(locationId: string): Promise<{
2
+ export declare function readLocationDetail(locationId: string, options?: {
3
+ verifiedViewerEmail?: string;
4
+ }): Promise<{
3
5
  active: number;
4
6
  conversations: number;
5
7
  durationMs: number;
@@ -40,6 +42,7 @@ export declare function readLocationDetail(locationId: string): Promise<{
40
42
  displayTitle: string;
41
43
  cumulativeDurationMs: number;
42
44
  conversationId: string;
45
+ isParticipant: boolean;
43
46
  status: "completed" | "failed" | "active";
44
47
  startedAt: string;
45
48
  lastSeenAt: string;
@@ -81,9 +84,102 @@ export declare function readLocationDetail(locationId: string): Promise<{
81
84
  tokens?: number | undefined;
82
85
  } | undefined>;
83
86
  /** Serve one public location detail endpoint. */
84
- declare const _default: {
85
- method: "get";
86
- path: string;
87
- handler: (c: import("hono").Context<any, any, import("hono/types").BlankInput>) => Promise<Response>;
88
- };
87
+ declare const _default: import("../route").ApiRoute<import("zod").ZodObject<{
88
+ active: import("zod").ZodNumber;
89
+ conversations: import("zod").ZodNumber;
90
+ durationMs: import("zod").ZodNumber;
91
+ failed: import("zod").ZodNumber;
92
+ label: import("zod").ZodString;
93
+ costUsd: import("zod").ZodOptional<import("zod").ZodNumber>;
94
+ tokens: import("zod").ZodOptional<import("zod").ZodNumber>;
95
+ id: import("zod").ZodString;
96
+ firstSeenAt: import("zod").ZodString;
97
+ kind: import("zod").ZodEnum<{
98
+ channel: "channel";
99
+ dm: "dm";
100
+ group: "group";
101
+ local_conversation: "local_conversation";
102
+ thread: "thread";
103
+ web_session: "web_session";
104
+ }>;
105
+ lastSeenAt: import("zod").ZodString;
106
+ provider: import("zod").ZodString;
107
+ providerDestinationId: import("zod").ZodString;
108
+ visibility: import("zod").ZodLiteral<"public">;
109
+ activityDays: import("zod").ZodArray<import("zod").ZodObject<{
110
+ active: import("zod").ZodNumber;
111
+ conversations: import("zod").ZodNumber;
112
+ date: import("zod").ZodString;
113
+ durationMs: import("zod").ZodNumber;
114
+ failed: import("zod").ZodNumber;
115
+ tokens: import("zod").ZodOptional<import("zod").ZodNumber>;
116
+ }, import("zod/v4/core").$strict>>;
117
+ actors: import("zod").ZodArray<import("zod").ZodObject<{
118
+ active: import("zod").ZodNumber;
119
+ conversations: import("zod").ZodNumber;
120
+ durationMs: import("zod").ZodNumber;
121
+ failed: import("zod").ZodNumber;
122
+ label: import("zod").ZodString;
123
+ costUsd: import("zod").ZodOptional<import("zod").ZodNumber>;
124
+ tokens: import("zod").ZodOptional<import("zod").ZodNumber>;
125
+ actor: import("zod").ZodObject<{
126
+ email: import("zod").ZodOptional<import("zod").ZodString>;
127
+ fullName: import("zod").ZodOptional<import("zod").ZodString>;
128
+ slackUserId: import("zod").ZodOptional<import("zod").ZodString>;
129
+ slackUserName: import("zod").ZodOptional<import("zod").ZodString>;
130
+ }, import("zod/v4/core").$strict>;
131
+ }, import("zod/v4/core").$strict>>;
132
+ generatedAt: import("zod").ZodString;
133
+ recentConversations: import("zod").ZodArray<import("zod").ZodObject<{
134
+ displayTitle: import("zod").ZodString;
135
+ cumulativeDurationMs: import("zod").ZodNumber;
136
+ cumulativeUsage: import("zod").ZodOptional<import("zod").ZodObject<{
137
+ inputTokens: import("zod").ZodOptional<import("zod").ZodNumber>;
138
+ outputTokens: import("zod").ZodOptional<import("zod").ZodNumber>;
139
+ cachedInputTokens: import("zod").ZodOptional<import("zod").ZodNumber>;
140
+ cacheCreationTokens: import("zod").ZodOptional<import("zod").ZodNumber>;
141
+ reasoningTokens: import("zod").ZodOptional<import("zod").ZodNumber>;
142
+ totalTokens: import("zod").ZodOptional<import("zod").ZodNumber>;
143
+ cost: import("zod").ZodOptional<import("zod").ZodObject<{
144
+ input: import("zod").ZodOptional<import("zod").ZodNumber>;
145
+ output: import("zod").ZodOptional<import("zod").ZodNumber>;
146
+ cacheRead: import("zod").ZodOptional<import("zod").ZodNumber>;
147
+ cacheWrite: import("zod").ZodOptional<import("zod").ZodNumber>;
148
+ total: import("zod").ZodOptional<import("zod").ZodNumber>;
149
+ }, import("zod/v4/core").$strict>>;
150
+ }, import("zod/v4/core").$strict>>;
151
+ conversationId: import("zod").ZodString;
152
+ isParticipant: import("zod").ZodBoolean;
153
+ status: import("zod").ZodEnum<{
154
+ completed: "completed";
155
+ failed: "failed";
156
+ active: "active";
157
+ }>;
158
+ startedAt: import("zod").ZodString;
159
+ lastSeenAt: import("zod").ZodString;
160
+ lastProgressAt: import("zod").ZodString;
161
+ surface: import("zod").ZodEnum<{
162
+ slack: "slack";
163
+ api: "api";
164
+ internal: "internal";
165
+ scheduler: "scheduler";
166
+ }>;
167
+ actorIdentity: import("zod").ZodOptional<import("zod").ZodObject<{
168
+ email: import("zod").ZodOptional<import("zod").ZodString>;
169
+ fullName: import("zod").ZodOptional<import("zod").ZodString>;
170
+ slackUserId: import("zod").ZodOptional<import("zod").ZodString>;
171
+ slackUserName: import("zod").ZodOptional<import("zod").ZodString>;
172
+ }, import("zod/v4/core").$strict>>;
173
+ archivedAt: import("zod").ZodOptional<import("zod").ZodString>;
174
+ channel: import("zod").ZodOptional<import("zod").ZodString>;
175
+ channelName: import("zod").ZodOptional<import("zod").ZodString>;
176
+ channelNameRedacted: import("zod").ZodOptional<import("zod").ZodBoolean>;
177
+ locationId: import("zod").ZodOptional<import("zod").ZodString>;
178
+ sentryTraceUrl: import("zod").ZodOptional<import("zod").ZodString>;
179
+ traceId: import("zod").ZodOptional<import("zod").ZodString>;
180
+ }, import("zod/v4/core").$strict>>;
181
+ source: import("zod").ZodLiteral<"conversation_index">;
182
+ windowEnd: import("zod").ZodString;
183
+ windowStart: import("zod").ZodString;
184
+ }, import("zod/v4/core").$strict>>;
89
185
  export default _default;