@sentry/junior 0.165.0 → 0.166.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 (68) hide show
  1. package/dist/{agent-hooks-GSNL33UA.js → agent-hooks-ZIPK2HUF.js} +9 -9
  2. package/dist/api/schema/workspace.d.ts +2 -0
  3. package/dist/api/schema.js +1 -1
  4. package/dist/api.js +40 -47
  5. package/dist/app.js +62 -63
  6. package/dist/{catalog-runtime-4ERDVI7V.js → catalog-runtime-GEZAHBUP.js} +5 -5
  7. package/dist/chat/pi/transcript.d.ts +10 -10
  8. package/dist/chat/sandbox/snapshot/resolve.d.ts +4 -0
  9. package/dist/chat/services/conversation-memory.d.ts +7 -0
  10. package/dist/chat/workspaces/store.d.ts +10 -1
  11. package/dist/chat/workspaces/types.d.ts +8 -0
  12. package/dist/{chunk-EA4UL5H2.js → chunk-22RO7IDD.js} +40 -11
  13. package/dist/{chunk-NPW6LM2X.js → chunk-2KV4BAAN.js} +12 -12
  14. package/dist/{chunk-SA5FVUWJ.js → chunk-2ZKFLHVP.js} +6 -6
  15. package/dist/{chunk-AQEBOQUC.js → chunk-3EZ5V7XQ.js} +9 -9
  16. package/dist/{chunk-T6BAHCT6.js → chunk-43KLUCAM.js} +17 -17
  17. package/dist/{chunk-BEC542E6.js → chunk-4CMORAHL.js} +2 -1
  18. package/dist/chunk-4DARCEZH.js +274 -0
  19. package/dist/{chunk-HZDLOFO4.js → chunk-4MDEQNSW.js} +5 -5
  20. package/dist/{chunk-IZHR2OES.js → chunk-65SNO3WK.js} +13 -2
  21. package/dist/{chunk-3V2EIQLT.js → chunk-ABNRESX6.js} +1 -1
  22. package/dist/{chunk-FMOFCEAA.js → chunk-AEKBVJMV.js} +2 -2
  23. package/dist/{chunk-5T6WPPEI.js → chunk-BKP3PVKR.js} +1 -1
  24. package/dist/{chunk-6RZ6MMEK.js → chunk-C3USHSIJ.js} +1 -1
  25. package/dist/{chunk-DKO4RRGJ.js → chunk-CDBTQQQ4.js} +1 -1
  26. package/dist/{chunk-VDNNVTX2.js → chunk-DTQAMME2.js} +5 -5
  27. package/dist/{chunk-65B3PDY7.js → chunk-EKBVHDZO.js} +1 -1
  28. package/dist/{chunk-7J26TW64.js → chunk-FEYQVP64.js} +5 -5
  29. package/dist/{chunk-XOINKFDJ.js → chunk-FFE3BMAT.js} +7 -7
  30. package/dist/{chunk-RQQTOF3H.js → chunk-JDTCQDRU.js} +3 -3
  31. package/dist/{chunk-32CCG4WP.js → chunk-JUFZR2LD.js} +1 -1
  32. package/dist/{chunk-ZUKU2Y3J.js → chunk-KQ5YZGDV.js} +1 -1
  33. package/dist/{chunk-G72LBEMZ.js → chunk-LGSGPWYH.js} +1 -1
  34. package/dist/{chunk-TCWPG5VL.js → chunk-MDW5YPXW.js} +2 -2
  35. package/dist/{chunk-AEBF6AO2.js → chunk-OCOGPNHA.js} +1 -1
  36. package/dist/{chunk-FXX4NHOM.js → chunk-OYN45QUQ.js} +6 -6
  37. package/dist/{chunk-N2BRRIQZ.js → chunk-P6UQMGM2.js} +1 -1
  38. package/dist/{chunk-BEHPIDVZ.js → chunk-Q2IPCX7J.js} +45 -283
  39. package/dist/{chunk-HPWZ4BJJ.js → chunk-SLWGX3G5.js} +72 -68
  40. package/dist/{chunk-FNNQCHOL.js → chunk-U2UCDSDF.js} +4 -4
  41. package/dist/{chunk-7S2JVUWS.js → chunk-VNPG55CU.js} +1 -1
  42. package/dist/{chunk-5WDDWMQ7.js → chunk-WX42YNDQ.js} +64 -7
  43. package/dist/{chunk-6OWVPXNO.js → chunk-YTIKGCPC.js} +1 -1
  44. package/dist/{chunk-6YXCG2XL.js → chunk-ZKJO4K6M.js} +4 -4
  45. package/dist/cli/chat.js +30 -29
  46. package/dist/cli/check.js +6 -6
  47. package/dist/cli/plugins.js +12 -12
  48. package/dist/cli/snapshot-create.js +12 -10
  49. package/dist/cli/upgrade.js +7 -7
  50. package/dist/db/schema/workspaces.d.ts +68 -0
  51. package/dist/db/schema.d.ts +68 -0
  52. package/dist/{db-5TTEPMTY.js → db-TGZBS2CP.js} +7 -7
  53. package/dist/instrumentation.js +4 -4
  54. package/dist/nitro.js +2 -2
  55. package/dist/{oauth-callback-server-IVFC5YHY.js → oauth-callback-server-Z54WUF5H.js} +22 -22
  56. package/dist/{runner-G76TSHWO.js → runner-PVFHKKK6.js} +12 -12
  57. package/dist/{skills-F6PSLVSG.js → skills-BYRH3QWD.js} +6 -6
  58. package/dist/spawn-RIPWK7EP.js +37 -0
  59. package/dist/{validation-56EJI6UQ.js → validation-VZIE4RHA.js} +6 -6
  60. package/dist/version.js +1 -1
  61. package/dist/{work-RNRQCP3Y.js → work-JTHAOPDQ.js} +17 -17
  62. package/dist/worker-APEVP56Y.js +24 -0
  63. package/migrations/0031_wild_phantom_reporter.sql +4 -0
  64. package/migrations/meta/0031_snapshot.json +2823 -0
  65. package/migrations/meta/_journal.json +7 -0
  66. package/package.json +5 -5
  67. package/dist/spawn-WMJPIAZL.js +0 -37
  68. package/dist/worker-FBR2WUI4.js +0 -24
@@ -37,6 +37,13 @@ export declare function markConversationMessage(conversation: ThreadConversation
37
37
  export declare function buildConversationContext(conversation: ThreadConversationState, options?: {
38
38
  excludeMessageId?: string;
39
39
  }): string | undefined;
40
+ /**
41
+ * Keep ambient history as one evidence-only block.
42
+ *
43
+ * When durable context already ends a thread-context envelope, append message
44
+ * lines inside that envelope. Otherwise wrap the new messages in one envelope.
45
+ */
46
+ export declare function appendThreadContextMessages(baseContext: string | undefined, messageLines: string[]): string | undefined;
40
47
  /** Return the earliest human-authored message known for a thread. */
41
48
  export declare function getThreadTitleSourceMessage(conversation: ThreadConversationState): ConversationMessage | undefined;
42
49
  /** Build the service that owns durable conversation memory compaction. */
@@ -1,5 +1,5 @@
1
1
  import type { JuniorDatabase } from "@/db/db";
2
- import type { Workspace } from "./types";
2
+ import type { Workspace, WorkspaceSnapshot } from "./types";
3
3
  import { WorkspaceValidationError } from "./validation";
4
4
  /** List Workspace recipes by stable name. */
5
5
  export declare function listWorkspaces(db: JuniorDatabase): Promise<Workspace[]>;
@@ -32,4 +32,13 @@ export declare function updateWorkspace(id: string, input: {
32
32
  }): Promise<Workspace | undefined>;
33
33
  /** Delete one install-wide Workspace recipe. */
34
34
  export declare function deleteWorkspace(id: string): Promise<boolean>;
35
+ /** Record the current Sandbox snapshot after a successful Workspace prepare. */
36
+ export declare function setWorkspaceSnapshot(workspaceId: string, snapshot: WorkspaceSnapshot): Promise<void>;
37
+ /** Persist dashboard snapshot facts when resolve returned a concrete entry. */
38
+ export declare function recordResolvedWorkspaceSnapshot(workspaceId: string, snapshot: {
39
+ snapshotId?: string;
40
+ profileHash?: string;
41
+ createdAtMs?: number;
42
+ buildDurationMs?: number;
43
+ }): Promise<void>;
35
44
  export { WorkspaceValidationError };
@@ -3,10 +3,18 @@ export interface WorkspaceRepo {
3
3
  provider: string;
4
4
  repo: string;
5
5
  }
6
+ /** Last successful Sandbox snapshot recorded for one Workspace recipe. */
7
+ export interface WorkspaceSnapshot {
8
+ id: string;
9
+ generatedAt: Date;
10
+ buildDurationMs: number;
11
+ profileHash: string;
12
+ }
6
13
  /** Named recipe used to prepare reusable sandbox contents. */
7
14
  export interface Workspace {
8
15
  id: string;
9
16
  name: string;
10
17
  setupScript: string;
11
18
  repos: WorkspaceRepo[];
19
+ snapshot: WorkspaceSnapshot | null;
12
20
  }
@@ -13,7 +13,7 @@ import {
13
13
  instructionProvenanceFor,
14
14
  sanitizePostgresJson,
15
15
  withConversationEventLock
16
- } from "./chunk-RQQTOF3H.js";
16
+ } from "./chunk-JDTCQDRU.js";
17
17
  import {
18
18
  SANDBOX_REPOS_ROOT,
19
19
  SANDBOX_WORKSPACE_ROOT,
@@ -24,14 +24,14 @@ import {
24
24
  fenceLock,
25
25
  getStateAdapter,
26
26
  withLock
27
- } from "./chunk-65B3PDY7.js";
27
+ } from "./chunk-EKBVHDZO.js";
28
28
  import {
29
29
  botConfig,
30
30
  completeText,
31
31
  escapeXml,
32
32
  resolveGatewayModel,
33
33
  unwrapCurrentInstruction
34
- } from "./chunk-FMOFCEAA.js";
34
+ } from "./chunk-AEKBVJMV.js";
35
35
  import {
36
36
  parseSlackMessageTs,
37
37
  toStoredSlackActor
@@ -41,7 +41,7 @@ import {
41
41
  logException,
42
42
  logWarn,
43
43
  setSpanAttributes
44
- } from "./chunk-32CCG4WP.js";
44
+ } from "./chunk-JUFZR2LD.js";
45
45
 
46
46
  // src/chat/turn-context-tag.ts
47
47
  var TURN_CONTEXT_TAG = "runtime-turn-context";
@@ -72,13 +72,14 @@ function isStandaloneRuntimeContextMessage(messages, index) {
72
72
  );
73
73
  }
74
74
  var EMBEDDED_THREAD_CONTEXT_TAGS = [
75
+ "thread-context",
75
76
  "recent-thread-messages",
76
77
  "thread-compactions",
77
78
  "thread-transcript",
78
79
  "thread-background"
79
80
  ];
80
81
  var EMBEDDED_THREAD_CONTEXT_PATTERN = new RegExp(
81
- `<(${EMBEDDED_THREAD_CONTEXT_TAGS.join("|")})(?:\\s[^>]*)?>[\\s\\S]*?</\\1>`,
82
+ `<(${EMBEDDED_THREAD_CONTEXT_TAGS.join("|")})(?:\\s[^>]*)?>[\\s\\S]*</\\1>`,
82
83
  "g"
83
84
  );
84
85
  function isAssistantMessage(value) {
@@ -257,15 +258,19 @@ function buildImageContextSuffix(message, conversation) {
257
258
  if (summaries.length === 0) {
258
259
  return "";
259
260
  }
260
- return ` [image context: ${summaries.join(" | ")}]`;
261
+ return ` [image context: ${escapeXml(summaries.join(" | "))}]`;
261
262
  }
262
263
  function renderConversationMessageLine(message, conversation) {
263
- const displayName = conversationAuthorDisplayName(message);
264
- const text = message.text.replace(/\s+/g, " ").slice(0, CONTEXT_MAX_MESSAGE_CHARS);
264
+ const displayName = escapeXml(conversationAuthorDisplayName(message));
265
+ const text = escapeXml(
266
+ message.text.replace(/\s+/g, " ").slice(0, CONTEXT_MAX_MESSAGE_CHARS)
267
+ );
265
268
  const markers = [];
266
269
  if (message.meta?.replied === false) {
267
270
  markers.push(
268
- `assistant skipped: ${message.meta?.skippedReason ?? "no-reply route"}`
271
+ escapeXml(
272
+ `assistant skipped: ${message.meta?.skippedReason ?? "no-reply route"}`
273
+ )
269
274
  );
270
275
  }
271
276
  if (message.meta?.explicitMention) {
@@ -378,7 +383,7 @@ function buildConversationContext(conversation, options = {}) {
378
383
  if (lines.length > 0) {
379
384
  lines.push("");
380
385
  }
381
- lines.push("<thread-transcript>");
386
+ lines.push('<thread-context authority="evidence-only">');
382
387
  for (const [index, message] of messages.entries()) {
383
388
  const author = escapeXml(conversationAuthorDisplayName(message));
384
389
  const actorIdAttr = message.author?.userId ? ` actor_id="${escapeXml(message.author.userId)}"` : "";
@@ -390,10 +395,33 @@ function buildConversationContext(conversation, options = {}) {
390
395
  " </message>"
391
396
  );
392
397
  }
393
- lines.push("</thread-transcript>");
398
+ lines.push("</thread-context>");
394
399
  }
395
400
  return lines.join("\n");
396
401
  }
402
+ var THREAD_CONTEXT_OPEN = '<thread-context authority="evidence-only">';
403
+ var THREAD_CONTEXT_CLOSE = "</thread-context>";
404
+ function appendThreadContextMessages(baseContext, messageLines) {
405
+ const base = baseContext?.trim();
406
+ if (messageLines.length === 0) {
407
+ return base || void 0;
408
+ }
409
+ const entryBlock = messageLines.join("\n");
410
+ if (!base) {
411
+ return [THREAD_CONTEXT_OPEN, entryBlock, THREAD_CONTEXT_CLOSE].join("\n");
412
+ }
413
+ const closeIdx = base.lastIndexOf(THREAD_CONTEXT_CLOSE);
414
+ if (closeIdx >= 0) {
415
+ const before = base.slice(0, closeIdx).replace(/\s*$/, "");
416
+ const after = base.slice(closeIdx);
417
+ return `${before}
418
+ ${entryBlock}
419
+ ${after}`;
420
+ }
421
+ return [base, "", THREAD_CONTEXT_OPEN, entryBlock, THREAD_CONTEXT_CLOSE].join(
422
+ "\n"
423
+ );
424
+ }
397
425
  function pruneCompactions(compactions) {
398
426
  if (compactions.length <= CONTEXT_MAX_COMPACTIONS) {
399
427
  return compactions;
@@ -3247,6 +3275,7 @@ export {
3247
3275
  turnHasReply,
3248
3276
  markConversationMessage,
3249
3277
  buildConversationContext,
3278
+ appendThreadContextMessages,
3250
3279
  createConversationMemoryService,
3251
3280
  isHumanConversationMessage,
3252
3281
  getConversationMessageSlackTs,
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  createWebAuthorization,
3
3
  deleteWebAuthorization
4
- } from "./chunk-AEBF6AO2.js";
4
+ } from "./chunk-OCOGPNHA.js";
5
5
  import {
6
6
  appendAndEnqueueInboundMessage
7
- } from "./chunk-6YXCG2XL.js";
7
+ } from "./chunk-ZKJO4K6M.js";
8
8
  import {
9
9
  buildDeliveredTurnStatePatch,
10
10
  completeAuthPauseTurn,
@@ -12,20 +12,20 @@ import {
12
12
  getTurnUserMessage,
13
13
  processPluginTask,
14
14
  scheduleSessionCompletedPluginTasks
15
- } from "./chunk-AQEBOQUC.js";
15
+ } from "./chunk-3EZ5V7XQ.js";
16
16
  import {
17
17
  ConversationTurnLifecycleService,
18
18
  coerceThreadConversationState,
19
19
  getPersistedSandboxState,
20
20
  getPersistedThreadState,
21
21
  persistThreadStateById
22
- } from "./chunk-VDNNVTX2.js";
22
+ } from "./chunk-DTQAMME2.js";
23
23
  import {
24
24
  healthReportSchema
25
25
  } from "./chunk-UTL3MHPC.js";
26
26
  import {
27
27
  parseSlackThreadId
28
- } from "./chunk-3V2EIQLT.js";
28
+ } from "./chunk-ABNRESX6.js";
29
29
  import {
30
30
  TurnInputCommitLostError,
31
31
  abandonTurnRecord,
@@ -49,31 +49,31 @@ import {
49
49
  saveTurnCheckpoint,
50
50
  startActiveTurn,
51
51
  upsertConversationMessage
52
- } from "./chunk-EA4UL5H2.js";
52
+ } from "./chunk-22RO7IDD.js";
53
53
  import {
54
54
  normalizeSlackConversationId
55
- } from "./chunk-5WDDWMQ7.js";
55
+ } from "./chunk-WX42YNDQ.js";
56
56
  import {
57
57
  getConversationEventStore,
58
58
  getConversationStore,
59
59
  getDb
60
- } from "./chunk-RQQTOF3H.js";
60
+ } from "./chunk-JDTCQDRU.js";
61
61
  import {
62
62
  juniorApiTokens,
63
63
  juniorConversationParticipants,
64
64
  juniorConversations,
65
65
  juniorIdentities,
66
66
  juniorUsers
67
- } from "./chunk-IZHR2OES.js";
67
+ } from "./chunk-65SNO3WK.js";
68
68
  import {
69
69
  getSlackBotToken
70
- } from "./chunk-FMOFCEAA.js";
70
+ } from "./chunk-AEKBVJMV.js";
71
71
  import {
72
72
  juniorDestinations
73
73
  } from "./chunk-VFUK3X5B.js";
74
74
  import {
75
75
  canExposeConversationPayload
76
- } from "./chunk-ZUKU2Y3J.js";
76
+ } from "./chunk-KQ5YZGDV.js";
77
77
  import {
78
78
  credentialContextForActor
79
79
  } from "./chunk-BDUENQD3.js";
@@ -82,7 +82,7 @@ import {
82
82
  logWarn,
83
83
  setTags,
84
84
  withLogContext
85
- } from "./chunk-32CCG4WP.js";
85
+ } from "./chunk-JUFZR2LD.js";
86
86
 
87
87
  // src/handlers/health.ts
88
88
  function readHealthReport() {
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  appendAndEnqueueInboundMessage
3
- } from "./chunk-6YXCG2XL.js";
3
+ } from "./chunk-ZKJO4K6M.js";
4
4
  import {
5
5
  ConversationTurnLifecycleService,
6
6
  getPersistedSandboxState,
7
7
  getPersistedThreadState,
8
8
  persistThreadStateById
9
- } from "./chunk-VDNNVTX2.js";
9
+ } from "./chunk-DTQAMME2.js";
10
10
  import {
11
11
  AgentInvocationBusyError,
12
12
  AgentInvocationLimitError,
@@ -15,7 +15,7 @@ import {
15
15
  agentBindingSchema,
16
16
  agentInvocationSchema,
17
17
  createAgentInvocationSchema
18
- } from "./chunk-7J26TW64.js";
18
+ } from "./chunk-FEYQVP64.js";
19
19
  import {
20
20
  TurnInputCommitLostError,
21
21
  failTurnRecord,
@@ -26,16 +26,16 @@ import {
26
26
  isTurnInputCommitLostError,
27
27
  openConversationProjection,
28
28
  saveTurnCheckpoint
29
- } from "./chunk-EA4UL5H2.js";
29
+ } from "./chunk-22RO7IDD.js";
30
30
  import {
31
31
  getConversationEventStore,
32
32
  getConversationStore,
33
33
  getSqlExecutor
34
- } from "./chunk-RQQTOF3H.js";
34
+ } from "./chunk-JDTCQDRU.js";
35
35
  import {
36
36
  juniorAgentBindings,
37
37
  juniorAgentInvocations
38
- } from "./chunk-IZHR2OES.js";
38
+ } from "./chunk-65SNO3WK.js";
39
39
 
40
40
  // src/chat/agent-invocations/work.ts
41
41
  import { z } from "zod";
@@ -2,7 +2,7 @@ import {
2
2
  coerceThreadConversationState,
3
3
  getPersistedThreadState,
4
4
  persistThreadStateById
5
- } from "./chunk-VDNNVTX2.js";
5
+ } from "./chunk-DTQAMME2.js";
6
6
  import {
7
7
  pluginTaskId,
8
8
  pluginTaskParamsSchema,
@@ -22,7 +22,7 @@ import {
22
22
  markTurnCompleted,
23
23
  normalizeToolNameFromResult,
24
24
  stripRuntimeTurnContext
25
- } from "./chunk-EA4UL5H2.js";
25
+ } from "./chunk-22RO7IDD.js";
26
26
  import {
27
27
  JUNIOR_THREAD_STATE_TTL_MS
28
28
  } from "./chunk-3Y47VMHV.js";
@@ -33,25 +33,25 @@ import {
33
33
  createPluginModel,
34
34
  createPluginState,
35
35
  getPlugins
36
- } from "./chunk-5WDDWMQ7.js";
36
+ } from "./chunk-WX42YNDQ.js";
37
37
  import {
38
38
  getConversationStore,
39
39
  getDb,
40
40
  sameActorIdentity
41
- } from "./chunk-RQQTOF3H.js";
41
+ } from "./chunk-JDTCQDRU.js";
42
42
  import {
43
43
  juniorConversations,
44
44
  juniorTaskExecutions
45
- } from "./chunk-IZHR2OES.js";
45
+ } from "./chunk-65SNO3WK.js";
46
46
  import {
47
47
  getStateAdapter
48
- } from "./chunk-65B3PDY7.js";
48
+ } from "./chunk-EKBVHDZO.js";
49
49
  import {
50
50
  ProviderError,
51
51
  findProviderError,
52
52
  getProviderErrorAttributes,
53
53
  getProviderErrorUserMessage
54
- } from "./chunk-FMOFCEAA.js";
54
+ } from "./chunk-AEKBVJMV.js";
55
55
  import {
56
56
  credentialSubjectSchema
57
57
  } from "./chunk-BDUENQD3.js";
@@ -61,7 +61,7 @@ import {
61
61
  import {
62
62
  buildTurnFailureResponse,
63
63
  logWarn
64
- } from "./chunk-32CCG4WP.js";
64
+ } from "./chunk-JUFZR2LD.js";
65
65
 
66
66
  // src/chat/runtime/delivered-turn-state.ts
67
67
  function buildDeliveredTurnStatePatch(args) {
@@ -87,7 +87,7 @@ import { pluginRunContextSchema } from "@sentry/junior-plugin-api";
87
87
 
88
88
  // src/chat/services/turn-session-routing.ts
89
89
  async function resolveTurnSessionRouting(args) {
90
- const conversationStore = args.conversationStore ?? (await import("./db-5TTEPMTY.js")).getConversationStore();
90
+ const conversationStore = args.conversationStore ?? (await import("./db-TGZBS2CP.js")).getConversationStore();
91
91
  const conversation = await conversationStore.get({
92
92
  conversationId: args.conversationId
93
93
  });
@@ -3,15 +3,15 @@ import {
3
3
  } from "./chunk-FA6POGLH.js";
4
4
  import {
5
5
  getTurnRequestDeadline
6
- } from "./chunk-DKO4RRGJ.js";
6
+ } from "./chunk-CDBTQQQ4.js";
7
7
  import {
8
8
  buildSentryConversationUrl,
9
9
  deleteWebAuthorization
10
- } from "./chunk-AEBF6AO2.js";
10
+ } from "./chunk-OCOGPNHA.js";
11
11
  import {
12
12
  ensureConversationWake,
13
13
  requestConversationWork
14
- } from "./chunk-6YXCG2XL.js";
14
+ } from "./chunk-ZKJO4K6M.js";
15
15
  import {
16
16
  buildDeliveredTurnStatePatch,
17
17
  finalizeFailedTurnReplyWithEvent,
@@ -24,7 +24,7 @@ import {
24
24
  requireTurnFailureEventId,
25
25
  resolveTurnSessionRouting,
26
26
  scheduleSessionCompletedPluginTasks
27
- } from "./chunk-AQEBOQUC.js";
27
+ } from "./chunk-3EZ5V7XQ.js";
28
28
  import {
29
29
  ConversationTurnLifecycleService,
30
30
  coerceThreadConversationState,
@@ -33,7 +33,7 @@ import {
33
33
  getPersistedSandboxState,
34
34
  getPersistedThreadState,
35
35
  persistThreadStateById
36
- } from "./chunk-VDNNVTX2.js";
36
+ } from "./chunk-DTQAMME2.js";
37
37
  import {
38
38
  getVercelConversationWorkQueue
39
39
  } from "./chunk-WR76IVA5.js";
@@ -47,7 +47,7 @@ import {
47
47
  lookupSlackUserProfile,
48
48
  resolvePluginOAuthAccount,
49
49
  runAgentWithTimeout
50
- } from "./chunk-XOINKFDJ.js";
50
+ } from "./chunk-FFE3BMAT.js";
51
51
  import {
52
52
  RetryableDeliveryError
53
53
  } from "./chunk-RF6J3DIO.js";
@@ -63,13 +63,13 @@ import {
63
63
  removeReactionFromMessage,
64
64
  resolveBaseUrl,
65
65
  truncateStatusText
66
- } from "./chunk-FXX4NHOM.js";
66
+ } from "./chunk-OYN45QUQ.js";
67
67
  import {
68
68
  parseSlackThreadId,
69
69
  readSlackRawMessageContext,
70
70
  resolveSlackChannelIdFromMessage,
71
71
  resolveSlackChannelIdFromThreadId
72
- } from "./chunk-3V2EIQLT.js";
72
+ } from "./chunk-ABNRESX6.js";
73
73
  import {
74
74
  CooperativeTurnYieldError,
75
75
  TurnSliceLimitExceededError,
@@ -96,7 +96,7 @@ import {
96
96
  recordTurnSummary,
97
97
  saveTurnCheckpoint,
98
98
  turnHasReply
99
- } from "./chunk-EA4UL5H2.js";
99
+ } from "./chunk-22RO7IDD.js";
100
100
  import {
101
101
  SlackActionError,
102
102
  getDashboardConversationLink,
@@ -105,18 +105,18 @@ import {
105
105
  getSlackClient,
106
106
  isDmChannel,
107
107
  normalizeSlackConversationId
108
- } from "./chunk-5WDDWMQ7.js";
108
+ } from "./chunk-WX42YNDQ.js";
109
109
  import {
110
110
  getConversationEventStore,
111
111
  getSqlExecutor,
112
112
  requireSlackDestination,
113
113
  upsertIdentity,
114
114
  upsertLinkedIdentity
115
- } from "./chunk-RQQTOF3H.js";
115
+ } from "./chunk-JDTCQDRU.js";
116
116
  import {
117
117
  acquireActiveLock,
118
118
  getStateAdapter
119
- } from "./chunk-65B3PDY7.js";
119
+ } from "./chunk-EKBVHDZO.js";
120
120
  import {
121
121
  botConfig,
122
122
  escapeXml,
@@ -124,18 +124,18 @@ import {
124
124
  getRuntimeMetadata,
125
125
  normalizeSlackEmojiName,
126
126
  standardModelId
127
- } from "./chunk-FMOFCEAA.js";
127
+ } from "./chunk-AEKBVJMV.js";
128
128
  import {
129
129
  discoverSkills
130
- } from "./chunk-TCWPG5VL.js";
130
+ } from "./chunk-MDW5YPXW.js";
131
131
  import {
132
132
  pluginCatalogRuntime
133
- } from "./chunk-7S2JVUWS.js";
133
+ } from "./chunk-VNPG55CU.js";
134
134
  import {
135
135
  buildOAuthTokenRequest,
136
136
  hasRequiredOAuthScope,
137
137
  parseOAuthTokenResponse
138
- } from "./chunk-N2BRRIQZ.js";
138
+ } from "./chunk-P6UQMGM2.js";
139
139
  import {
140
140
  createSlackResumeActor,
141
141
  isUserActor,
@@ -151,7 +151,7 @@ import {
151
151
  setTags,
152
152
  toOptionalString,
153
153
  withLogContext
154
- } from "./chunk-32CCG4WP.js";
154
+ } from "./chunk-JUFZR2LD.js";
155
155
  import {
156
156
  homeDir
157
157
  } from "./chunk-H4HBKISO.js";
@@ -730,7 +730,8 @@ var workspaceRepoSchema = z7.object({
730
730
  }).strict();
731
731
  var workspaceSnapshotSchema = z7.object({
732
732
  id: z7.string(),
733
- generatedAt: z7.iso.datetime()
733
+ generatedAt: z7.iso.datetime(),
734
+ buildDurationMs: z7.number().int().nonnegative()
734
735
  }).strict();
735
736
  var workspaceSchema = z7.object({
736
737
  id: z7.string().uuid(),