@vibes.diy/api-svc 14.3.84 → 14.3.86

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 (170) hide show
  1. package/create-handler.js +2 -0
  2. package/create-handler.js.map +1 -1
  3. package/index.d.ts +3 -1
  4. package/index.js +3 -1
  5. package/index.js.map +1 -1
  6. package/intern/account-vibe-activity.js +2 -1
  7. package/intern/account-vibe-activity.js.map +1 -1
  8. package/intern/agent-account-tools.d.ts +1 -0
  9. package/intern/agent-account-tools.js +3 -1
  10. package/intern/agent-account-tools.js.map +1 -1
  11. package/intern/agent-assembly.js +8 -2
  12. package/intern/agent-assembly.js.map +1 -1
  13. package/intern/agent-belt.d.ts +1 -3
  14. package/intern/agent-belt.js +27 -27
  15. package/intern/agent-belt.js.map +1 -1
  16. package/intern/agent-build-tools.d.ts +7 -0
  17. package/intern/agent-build-tools.js +6 -19
  18. package/intern/agent-build-tools.js.map +1 -1
  19. package/intern/agent-closing-options.d.ts +26 -0
  20. package/intern/agent-closing-options.js +130 -0
  21. package/intern/agent-closing-options.js.map +1 -0
  22. package/intern/agent-discussions.js +2 -1
  23. package/intern/agent-discussions.js.map +1 -1
  24. package/intern/agent-dispatcher.d.ts +1 -0
  25. package/intern/agent-dispatcher.js +17 -3
  26. package/intern/agent-dispatcher.js.map +1 -1
  27. package/intern/agent-evidence.js +5 -4
  28. package/intern/agent-evidence.js.map +1 -1
  29. package/intern/agent-file-tools.js +5 -4
  30. package/intern/agent-file-tools.js.map +1 -1
  31. package/intern/agent-read-tools.js +43 -25
  32. package/intern/agent-read-tools.js.map +1 -1
  33. package/intern/agent-session-instruction.d.ts +3 -2
  34. package/intern/agent-session-instruction.js +10 -8
  35. package/intern/agent-session-instruction.js.map +1 -1
  36. package/intern/agent-session-runtime.js +2 -1
  37. package/intern/agent-session-runtime.js.map +1 -1
  38. package/intern/agent-session.js +8 -7
  39. package/intern/agent-session.js.map +1 -1
  40. package/intern/agent-turn.d.ts +1 -0
  41. package/intern/agent-turn.js +1 -0
  42. package/intern/agent-turn.js.map +1 -1
  43. package/intern/agent-wake.d.ts +1 -1
  44. package/intern/agent-wake.js +1 -1
  45. package/intern/agent-wake.js.map +1 -1
  46. package/intern/agent-with-vibe.d.ts +1 -0
  47. package/intern/agent-with-vibe.js +19 -18
  48. package/intern/agent-with-vibe.js.map +1 -1
  49. package/intern/alt-first-build.d.ts +36 -0
  50. package/intern/alt-first-build.js +137 -0
  51. package/intern/alt-first-build.js.map +1 -0
  52. package/intern/alt-landing.d.ts +7 -0
  53. package/intern/alt-landing.js +31 -0
  54. package/intern/alt-landing.js.map +1 -0
  55. package/intern/autumn-recent-usage.js +11 -10
  56. package/intern/autumn-recent-usage.js.map +1 -1
  57. package/intern/backend-db-callback.js +3 -2
  58. package/intern/backend-db-callback.js.map +1 -1
  59. package/intern/draft-chat-store.js +3 -2
  60. package/intern/draft-chat-store.js.map +1 -1
  61. package/intern/first-brief.d.ts +1 -1
  62. package/intern/first-brief.js +4 -3
  63. package/intern/first-brief.js.map +1 -1
  64. package/intern/first-build-classifier.d.ts +4 -4
  65. package/intern/first-build-classifier.js +18 -19
  66. package/intern/first-build-classifier.js.map +1 -1
  67. package/intern/first-build-race.d.ts +71 -0
  68. package/intern/first-build-race.js +257 -0
  69. package/intern/first-build-race.js.map +1 -0
  70. package/intern/guest-credit-meter.js +3 -2
  71. package/intern/guest-credit-meter.js.map +1 -1
  72. package/intern/image-survey.js +6 -5
  73. package/intern/image-survey.js.map +1 -1
  74. package/intern/instruction-variant.d.ts +25 -2
  75. package/intern/instruction-variant.js +189 -2
  76. package/intern/instruction-variant.js.map +1 -1
  77. package/intern/keeps-to-themselves.d.ts +1 -0
  78. package/intern/keeps-to-themselves.js +10 -0
  79. package/intern/keeps-to-themselves.js.map +1 -0
  80. package/intern/llm-tool-loop.d.ts +5 -1
  81. package/intern/llm-tool-loop.js +48 -15
  82. package/intern/llm-tool-loop.js.map +1 -1
  83. package/intern/manifest-assets-line.d.ts +2 -0
  84. package/intern/manifest-assets-line.js +14 -1
  85. package/intern/manifest-assets-line.js.map +1 -1
  86. package/intern/mercury-capability-triggers.d.ts +1 -0
  87. package/intern/mercury-capability-triggers.js +95 -0
  88. package/intern/mercury-capability-triggers.js.map +1 -0
  89. package/intern/mercury-first-build-seam.d.ts +77 -0
  90. package/intern/mercury-first-build-seam.js +316 -0
  91. package/intern/mercury-first-build-seam.js.map +1 -0
  92. package/intern/mercury-first-build.d.ts +691 -0
  93. package/intern/mercury-first-build.js +3519 -0
  94. package/intern/mercury-first-build.js.map +1 -0
  95. package/intern/mercury-resilience.d.ts +70 -0
  96. package/intern/mercury-resilience.js +122 -0
  97. package/intern/mercury-resilience.js.map +1 -0
  98. package/intern/mint-decision.d.ts +1 -0
  99. package/intern/mint-decision.js +3 -0
  100. package/intern/mint-decision.js.map +1 -1
  101. package/intern/option-line-hold.d.ts +5 -0
  102. package/intern/option-line-hold.js +39 -0
  103. package/intern/option-line-hold.js.map +1 -0
  104. package/intern/pinned-app-slug.js +2 -1
  105. package/intern/pinned-app-slug.js.map +1 -1
  106. package/intern/pouf-room-catalog.d.ts +2 -0
  107. package/intern/pouf-room-catalog.js +11 -0
  108. package/intern/pouf-room-catalog.js.map +1 -0
  109. package/intern/prompt-step.d.ts +1 -1
  110. package/intern/prompt-step.js.map +1 -1
  111. package/intern/prompt-usage.js +5 -4
  112. package/intern/prompt-usage.js.map +1 -1
  113. package/intern/retire-offer-options.d.ts +3 -0
  114. package/intern/retire-offer-options.js +91 -0
  115. package/intern/retire-offer-options.js.map +1 -0
  116. package/intern/save-repair-io.js +3 -2
  117. package/intern/save-repair-io.js.map +1 -1
  118. package/intern/seed-chat-section.d.ts +13 -0
  119. package/intern/seed-chat-section.js +62 -0
  120. package/intern/seed-chat-section.js.map +1 -1
  121. package/intern/server-first-build.js +1 -0
  122. package/intern/server-first-build.js.map +1 -1
  123. package/intern/url-research.js +3 -2
  124. package/intern/url-research.js.map +1 -1
  125. package/intern/vibe-font-catalog.d.ts +2 -0
  126. package/intern/vibe-font-catalog.js +8 -0
  127. package/intern/vibe-font-catalog.js.map +1 -0
  128. package/intern/work-tools.js +8 -5
  129. package/intern/work-tools.js.map +1 -1
  130. package/not-implemented-message.js +2 -1
  131. package/not-implemented-message.js.map +1 -1
  132. package/package.json +14 -14
  133. package/public/access-output-decoder.js +4 -3
  134. package/public/access-output-decoder.js.map +1 -1
  135. package/public/agent-turn-action.d.ts +1 -0
  136. package/public/agent-turn-action.js +312 -44
  137. package/public/agent-turn-action.js.map +1 -1
  138. package/public/agent-turn-assembly.js +5 -2
  139. package/public/agent-turn-assembly.js.map +1 -1
  140. package/public/draft-runtime.js +9 -5
  141. package/public/draft-runtime.js.map +1 -1
  142. package/public/list-memberships.js +3 -2
  143. package/public/list-memberships.js.map +1 -1
  144. package/public/list-notifications.js +2 -1
  145. package/public/list-notifications.js.map +1 -1
  146. package/public/list-recent-vibes.js +4 -3
  147. package/public/list-recent-vibes.js.map +1 -1
  148. package/public/prompt-chat-section.js +10 -1
  149. package/public/prompt-chat-section.js.map +1 -1
  150. package/public/prompt-turn-terminal.js +3 -1
  151. package/public/prompt-turn-terminal.js.map +1 -1
  152. package/public/provider-errors.js +3 -2
  153. package/public/provider-errors.js.map +1 -1
  154. package/public/report-activity.js +18 -2
  155. package/public/report-activity.js.map +1 -1
  156. package/public/report-cache.js +2 -1
  157. package/public/report-cache.js.map +1 -1
  158. package/public/serv-entry-point.js +2 -1
  159. package/public/serv-entry-point.js.map +1 -1
  160. package/public/vibe-traffic-source.js +1 -1
  161. package/public/vibe-traffic-source.js.map +1 -1
  162. package/types.d.ts +1 -0
  163. package/types.js +7 -6
  164. package/types.js.map +1 -1
  165. package/usage-report/new-user-alert-util.d.ts +6 -0
  166. package/usage-report/new-user-alert-util.js +30 -1
  167. package/usage-report/new-user-alert-util.js.map +1 -1
  168. package/intern/agent-options-tool.d.ts +0 -27
  169. package/intern/agent-options-tool.js +0 -213
  170. package/intern/agent-options-tool.js.map +0 -1
@@ -1,17 +1,25 @@
1
- import { Result, exception2Result } from "@adviser/cement";
1
+ import { Future, Result, exception2Result } from "@adviser/cement";
2
2
  import { isActiveTheme, isAgentChatAppSlug, } from "@vibes.diy/api-types";
3
- import { isChatMessage } from "@vibes.diy/call-ai-v2";
3
+ import { isChatMessage, isSseEnd, isSseLine } from "@vibes.diy/call-ai-v2";
4
4
  import { classifyTurnReach } from "../intern/turn-reach.js";
5
5
  import { acquireTurnBuildLock, releaseTurnBuildLock } from "../intern/codegen-build-lock.js";
6
6
  import { refuseCrossLaneBuild } from "../intern/cross-lane-build-guard.js";
7
7
  import { userFileBlocks } from "../intern/agent-session-runtime.js";
8
+ import { alternativeReadyNote, startAlternativeFirstBuild, watchAlternativeLanding } from "../intern/alt-first-build.js";
9
+ import { fireAgentWakeTurn } from "../intern/agent-wake.js";
10
+ import { promptDispatchContext } from "../intern/prompt-dispatch-context.js";
8
11
  import { isAgentSessionSuperseded } from "../intern/agent-session.js";
9
12
  import { runEditVibeTool } from "../intern/agent-build-tools.js";
10
13
  import { claimFirstTurnMint, claimMintJob, readClaimedChatApp } from "../intern/mint-job-store.js";
11
14
  import { claimAgentAppContext } from "../intern/agent-request-frame.js";
12
15
  import { inflateAgentFiles, serverFirstBuildAppContext } from "../intern/agent-assembly.js";
13
16
  import { runServerFirstBuild } from "../intern/server-first-build.js";
17
+ import { recordMercuryRace, runMercuryFirstBuild, } from "../intern/mercury-first-build.js";
18
+ import { MERCURY_RATE_LIMITED_STAGE_MS } from "../intern/mercury-resilience.js";
19
+ import { runMercurySeam, withMercuryUsageRounds, withPreambleFirst, } from "../intern/mercury-first-build-seam.js";
20
+ import { createFirstBuildRace, createPreJoinRounds, deferredStream, joinedFirstBuildReceipt, withoutPreJoinText, } from "../intern/first-build-race.js";
14
21
  import { createAgentBelt } from "../intern/agent-belt.js";
22
+ import { createAgentClosingOptions } from "../intern/agent-closing-options.js";
15
23
  import { createAccountAgentBelt } from "../intern/agent-account-tools.js";
16
24
  import { poufLookFor } from "../intern/pouf-look-flag.js";
17
25
  import { readComposedSettingsForApp } from "./app-setting-items.js";
@@ -33,28 +41,77 @@ import { createAgentEvidenceWriter, nextAgentSessionMessages } from "../intern/a
33
41
  import { observeEvidenceLine } from "../intern/turn-latency.js";
34
42
  import { handleLlmResponse } from "./stream-assembly.js";
35
43
  import { handleFSPrompt } from "./fs-prompt.js";
36
- import { FIRST_BRIEF_WORD_COUNT, fastFirstTurnLevers, AGENT_FIRST_BRIEF_ENV, agentFirstBriefEnabled, firstBriefArmed, seededAddressWordsArmed, variantForTurn, } from "../intern/instruction-variant.js";
44
+ import { FIRST_BRIEF_WORD_COUNT, fastFirstTurnLevers, AGENT_FIRST_BRIEF_ENV, agentFirstBriefEnabled, firstBriefArmed, isMercuryVariant, mercuryRecutArmed, mercuryStyleFor, mercuryJuiceFor, mercuryDepthFor, mercuryReplyFor, mercuryDuoFor, mercuryOneCallFor, mercuryDuoPoolFor, mercuryRecordsRulesFor, mercuryVariantForTurn, mercuryPlannerFor, mercuryFormatFor, MERCURY_FIRST_BUILD_ENV, seededAddressWordsArmed, variantForTurn, } from "../intern/instruction-variant.js";
45
+ import { isEvalHandle } from "../intern/eval-handles.js";
37
46
  import { slugWordBag } from "../intern/ensure-slug-binding.js";
38
47
  import { firstBriefOutcomeFromReceipt, firstBriefTools, firstBriefTurnEligible, observeFirstBriefRound, recordFirstBriefOutcome, recordFirstBriefRow, withFirstBriefLine, withSeededAddressWordsLine, withoutFirstBriefLine, withFirstBriefContinueNote, } from "../intern/first-brief.js";
48
+ export const FIRST_BUILD_RACE_EVIDENCE_NAME = "first-build-race";
39
49
  export function createAgentTurnAction(args) {
40
50
  const { ctx, vctx, req, orig, resChat, agentPayload, liveSession, agentEvidence, agentFetchUrlContext, firstBuildVerdict, agentFirstTurnMint, submittedAt, agentWakeTurn, dispatchCarry, instructionVariant, turnLatency, terminal, facts, reenter, } = args;
41
51
  const topLevel = isAgentChatAppSlug(resChat.appSlug);
42
52
  const turnVariant = variantForTurn(instructionVariant, { firstTurn: agentFirstTurnMint });
43
53
  const fastLevers = fastFirstTurnLevers(instructionVariant, agentFirstTurnMint);
44
54
  const personWords = currentUserMessageText(orig.prompt.messages.filter(isChatMessage));
45
- const briefArmed = firstBriefArmed(instructionVariant, agentFirstTurnMint, agentFirstBriefEnabled(vctx.sthis.env.get(AGENT_FIRST_BRIEF_ENV))) &&
46
- firstBriefTurnEligible({
47
- wakeTurn: agentWakeTurn,
48
- topLevel,
49
- personWords,
50
- linkedUrls: agentFetchUrlContext?.activatedUrls.length ?? 0,
51
- });
55
+ const briefEligible = firstBriefTurnEligible({
56
+ wakeTurn: agentWakeTurn,
57
+ topLevel,
58
+ personWords,
59
+ linkedUrls: agentFetchUrlContext?.activatedUrls.length ?? 0,
60
+ });
61
+ const briefDefaultOn = agentFirstBriefEnabled(vctx.sthis.env.get(AGENT_FIRST_BRIEF_ENV));
62
+ const mercuryVariant = mercuryVariantForTurn({
63
+ instructionVariant,
64
+ flag: vctx.sthis.env.get(MERCURY_FIRST_BUILD_ENV),
65
+ });
66
+ const mercurySwitched = mercuryVariant !== undefined && instructionVariant === undefined;
67
+ const mercuryKeepText = isEvalHandle(resChat.ownerHandle);
68
+ const mercuryFormat = mercuryFormatFor(mercuryVariant);
69
+ const mercuryPlanner = mercuryPlannerFor(mercuryVariant);
70
+ const mercuryPlannerNamed = mercuryPlanner === "mercury" ? undefined : mercuryPlanner;
71
+ const mercuryArmed = mercuryRecutArmed(mercuryVariant, agentFirstTurnMint) && briefEligible;
72
+ const briefArmed = mercuryArmed
73
+ ? firstBriefArmed(undefined, agentFirstTurnMint, briefDefaultOn) && briefEligible
74
+ : firstBriefArmed(instructionVariant, agentFirstTurnMint, briefDefaultOn) && briefEligible;
52
75
  const seededWordsArmed = seededAddressWordsArmed(instructionVariant, agentFirstTurnMint) &&
53
76
  agentWakeTurn === false &&
54
77
  topLevel === false &&
55
78
  personWords.length > 0;
56
79
  return async ({ scope, blockSeq, promptId }) => {
57
- const briefWords = briefArmed || seededWordsArmed ? slugWordBag(FIRST_BRIEF_WORD_COUNT) : [];
80
+ const briefWords = briefArmed || seededWordsArmed || mercuryArmed ? slugWordBag(FIRST_BRIEF_WORD_COUNT) : [];
81
+ const mercuryRounds = [];
82
+ const mercuryCancel = new AbortController();
83
+ const race = mercuryArmed
84
+ ? createFirstBuildRace({ onAgentWon: () => mercuryCancel.abort() })
85
+ : undefined;
86
+ let lastMercuryRow;
87
+ const mercuryPending = mercuryArmed
88
+ ? runMercuryFirstBuild(vctx, {
89
+ chatId: req.chatId,
90
+ signal: mercuryCancel.signal,
91
+ onRowWritten: (rowId) => {
92
+ lastMercuryRow = rowId;
93
+ },
94
+ userId: req._auth.verifiedAuth.claims.userId,
95
+ onUsage: (rounds) => {
96
+ mercuryRounds.push(...rounds);
97
+ },
98
+ personWords,
99
+ words: briefWords,
100
+ style: mercuryStyleFor(mercuryVariant),
101
+ juice: mercuryJuiceFor(mercuryVariant),
102
+ depth: mercuryDepthFor(mercuryVariant),
103
+ reply: mercuryReplyFor(mercuryVariant),
104
+ duo: mercuryDuoFor(mercuryVariant),
105
+ ...(mercuryDuoPoolFor(mercuryVariant) === undefined ? {} : { duoPool: mercuryDuoPoolFor(mercuryVariant) }),
106
+ oneCall: mercuryOneCallFor(mercuryVariant),
107
+ recordsRules: mercuryRecordsRulesFor(mercuryVariant),
108
+ ...(mercuryPlannerNamed === undefined ? {} : { planner: mercuryPlannerNamed }),
109
+ ...(mercuryFormat === "skeleton" ? {} : { format: mercuryFormat }),
110
+ rooms: poufLookFor(vctx, req._auth.verifiedAuth.claims.userId),
111
+ ...(mercurySwitched ? { rateLimitedBudgetMs: MERCURY_RATE_LIMITED_STAGE_MS } : {}),
112
+ ...(mercuryKeepText ? { keepText: true } : {}),
113
+ })
114
+ : undefined;
58
115
  let briefCallPending = briefArmed;
59
116
  let briefAddressRetried = false;
60
117
  let briefContinueOwed = false;
@@ -74,8 +131,10 @@ export function createAgentTurnAction(args) {
74
131
  ? { ownerHandle: resChat.ownerHandle }
75
132
  : { ownerHandle: resChat.ownerHandle, appSlug: resChat.appSlug },
76
133
  });
77
- if (rActor.isErr())
134
+ if (rActor.isErr()) {
135
+ mercuryCancel.abort();
78
136
  return Result.Err(rActor.Err());
137
+ }
79
138
  const surveyColorway = startFirstTurnImageSurvey(vctx, {
80
139
  guard: liveSession,
81
140
  firstTurn: agentFirstTurnMint,
@@ -96,8 +155,10 @@ export function createAgentTurnAction(args) {
96
155
  let liveAppSlug = resChat.appSlug;
97
156
  let firstTurnAppClaimed = agentFirstTurnMint === false;
98
157
  const rVfs = await pVfs;
99
- if (rVfs.isErr())
158
+ if (rVfs.isErr()) {
159
+ mercuryCancel.abort();
100
160
  return Result.Err(rVfs.Err());
161
+ }
101
162
  const vfs = new Map(rVfs.Ok());
102
163
  function extendDeadlineForAwaitedBuild(awaiting) {
103
164
  void extendOpenTurnDeadline(vctx.sql, {
@@ -115,6 +176,7 @@ export function createAgentTurnAction(args) {
115
176
  });
116
177
  }
117
178
  const firstTurnFileBlocks = userFileBlocks(orig.prompt.messages);
179
+ const turnCarry = isMercuryVariant(instructionVariant) ? carryWithoutVariant(dispatchCarry) : dispatchCarry;
118
180
  const dispatcherBase = {
119
181
  vctx,
120
182
  host: ctx,
@@ -128,10 +190,9 @@ export function createAgentTurnAction(args) {
128
190
  extendDeadlineForAwaitedBuild(t.promptId);
129
191
  return t.chatId === req.chatId ? liveSession.watch(t.promptId) : liveSession.watchBuild(t);
130
192
  },
131
- ...(Object.keys(dispatchCarry).length === 0 ? {} : { carry: dispatchCarry }),
193
+ ...(Object.keys(turnCarry).length === 0 ? {} : { carry: turnCarry }),
132
194
  };
133
- const dispatcher = createAgentBuildDispatcher({
134
- ...dispatcherBase,
195
+ const firstTurnDispatch = {
135
196
  ...(agentFirstTurnMint
136
197
  ? {
137
198
  firstTurn: {
@@ -147,7 +208,16 @@ export function createAgentTurnAction(args) {
147
208
  },
148
209
  }
149
210
  : {}),
150
- });
211
+ };
212
+ const dispatcher = createAgentBuildDispatcher({ ...dispatcherBase, ...firstTurnDispatch });
213
+ const mercuryDispatcher = mercuryPending === undefined
214
+ ? dispatcher
215
+ : createAgentBuildDispatcher({
216
+ ...dispatcherBase,
217
+ ...(Object.keys(dispatchCarry).length === 0 ? {} : { carry: dispatchCarry }),
218
+ ...firstTurnDispatch,
219
+ ...(mercurySwitched ? { mercuryFont: true } : {}),
220
+ });
151
221
  const evidence = agentEvidence ??
152
222
  observeEvidenceLine(createAgentEvidenceWriter({
153
223
  chatId: req.chatId,
@@ -183,6 +253,163 @@ export function createAgentTurnAction(args) {
183
253
  firstTurnAppClaimed = true;
184
254
  }
185
255
  }
256
+ const seamTask = mercuryPending !== undefined && race !== undefined && firstTurnMint !== undefined && topLevel === false
257
+ ? runMercurySeam(vctx, {
258
+ pending: mercuryPending,
259
+ actor: rActor.Ok(),
260
+ dispatcher: mercuryDispatcher,
261
+ firstTurn: firstTurnMint,
262
+ ...(surveyColorway?.colorway === undefined ? {} : { presetColorway: surveyColorway.colorway }),
263
+ style: mercuryStyleFor(mercuryVariant),
264
+ juice: mercuryJuiceFor(mercuryVariant),
265
+ depth: mercuryDepthFor(mercuryVariant),
266
+ reply: mercuryReplyFor(mercuryVariant),
267
+ duo: mercuryDuoFor(mercuryVariant),
268
+ oneCall: mercuryOneCallFor(mercuryVariant),
269
+ recordsRules: mercuryRecordsRulesFor(mercuryVariant),
270
+ ...(mercuryPlannerNamed === undefined ? {} : { planner: mercuryPlannerNamed }),
271
+ ...(mercuryFormat === "skeleton" ? {} : { format: mercuryFormat }),
272
+ ...(mercurySwitched ? { productionSwitch: true } : {}),
273
+ ...(mercuryKeepText ? { keepText: true } : {}),
274
+ race,
275
+ evidence,
276
+ })
277
+ .catch((e) => {
278
+ race.mercurySettled(false);
279
+ race.settleMercury({ dispatched: false });
280
+ vctx.logger.Warn().Err(e).Str("chatId", req.chatId).Msg("mercury-seam-threw");
281
+ return { dispatched: false, reason: "mercury-failed" };
282
+ })
283
+ .then(async (outcome) => {
284
+ if (outcome.dispatched) {
285
+ liveAppSlug = outcome.appSlug;
286
+ liveSession.claimAppAddress(outcome.appSlug);
287
+ firstTurnAppClaimed = true;
288
+ }
289
+ if (lastMercuryRow !== undefined)
290
+ await recordMercuryRace(vctx, { chatId: req.chatId, promptId: lastMercuryRow, race: race.receipt() });
291
+ return outcome;
292
+ })
293
+ : undefined;
294
+ const preJoin = createPreJoinRounds();
295
+ let roundText = "";
296
+ let alternativeRecorded = false;
297
+ function raceRound(stream) {
298
+ if (race === undefined || preJoin.open() === false)
299
+ return stream;
300
+ const tag = preJoin.startRound();
301
+ roundText = "";
302
+ let calledTool = false;
303
+ return stream.pipeThrough(new TransformStream({
304
+ transform(msg, controller) {
305
+ if (isSseLine(msg)) {
306
+ for (const choice of msg.chunk.choices) {
307
+ if (choice.delta.tool_calls !== undefined)
308
+ calledTool = true;
309
+ const content = choice.delta.content;
310
+ if (typeof content === "string")
311
+ roundText += content;
312
+ }
313
+ controller.enqueue({ ...msg, chunk: { ...msg.chunk, id: tag } });
314
+ return;
315
+ }
316
+ if (isSseEnd(msg) && calledTool === false) {
317
+ race.agentAnswered();
318
+ preJoin.answered(tag);
319
+ }
320
+ controller.enqueue(msg);
321
+ },
322
+ }));
323
+ }
324
+ const beltFirstTurn = firstTurnMint === undefined || race === undefined
325
+ ? firstTurnMint
326
+ : {
327
+ ...firstTurnMint,
328
+ joinRunning: async () => {
329
+ const decision = await race.agentCreate();
330
+ if (decision.kind !== "join")
331
+ return undefined;
332
+ preJoin.joined();
333
+ await evidence({
334
+ kind: "receipt",
335
+ name: FIRST_BUILD_RACE_EVIDENCE_NAME,
336
+ text: JSON.stringify({ race: race.receipt() }),
337
+ });
338
+ return joinedFirstBuildReceipt(decision);
339
+ },
340
+ startAlternative: async (input) => {
341
+ if (race.receipt().alternative !== undefined)
342
+ return { dispatched: false };
343
+ race.noteAlternative({ dispatched: false });
344
+ const originLabel = `${resChat.ownerHandle}/${liveAppSlug}`;
345
+ const alternativeLabel = new Future();
346
+ const started = await startAlternativeFirstBuild(vctx, {
347
+ actor: rActor.Ok(),
348
+ openAuth: { auth: req.auth, _auth: req._auth },
349
+ input,
350
+ prompt: personWords,
351
+ personWords,
352
+ ...(roundText.trim().length === 0 ? {} : { opener: roundText }),
353
+ originLabel,
354
+ originChatId: req.chatId,
355
+ dispatcherFor: (altChatId) => createAgentBuildDispatcher({
356
+ ...dispatcherBase,
357
+ firstTurn: {
358
+ chatId: altChatId,
359
+ ...(submittedAt === undefined ? {} : { submittedAt }),
360
+ ...(firstTurnFileBlocks.length === 0 ? {} : { fileBlocks: firstTurnFileBlocks }),
361
+ },
362
+ takeFileBlocks: () => [],
363
+ callerSlot: { tryTake: () => undefined },
364
+ onPendingBuild: (t) => {
365
+ watchAlternativeLanding(vctx, {
366
+ chatId: t.chatId,
367
+ promptId: t.promptId,
368
+ originChatId: req.chatId,
369
+ onLanded: async (landed) => {
370
+ race.noteAlternative({ landed });
371
+ if (alternativeRecorded && lastMercuryRow !== undefined)
372
+ await recordMercuryRace(vctx, { chatId: req.chatId, promptId: lastMercuryRow, race: race.receipt() });
373
+ const note = alternativeReadyNote(landed, await alternativeLabel.asPromise());
374
+ if (note === undefined)
375
+ return;
376
+ vctx.logger
377
+ .Info()
378
+ .Any("event", { chatId: req.chatId, alternativeChatId: t.chatId, promptId: t.promptId })
379
+ .Msg("alternative-first-build-wake-firing");
380
+ fireAgentWakeTurn({
381
+ vctx,
382
+ host: ctx,
383
+ auth: req.auth,
384
+ outerTid: req.outerTid,
385
+ chatId: req.chatId,
386
+ budget: 0,
387
+ note,
388
+ ...(turnCarry.builderModel === undefined ? {} : { builderModel: turnCarry.builderModel }),
389
+ ...(turnCarry.subagentModel === undefined ? {} : { subagentModel: turnCarry.subagentModel }),
390
+ ...(turnCarry.agentModel === undefined ? {} : { agentModel: turnCarry.agentModel }),
391
+ ...(turnCarry.timeZone === undefined ? {} : { timeZone: turnCarry.timeZone }),
392
+ handle: (wakeCtx) => reenter(promptDispatchContext(ctx, wakeCtx.validated)),
393
+ });
394
+ },
395
+ });
396
+ },
397
+ }),
398
+ });
399
+ alternativeLabel.resolve(started.dispatched ? started.label : undefined);
400
+ race.noteAlternative(started.dispatched
401
+ ? { dispatched: true, chatId: started.chatId, appSlug: started.appSlug, landed: "pending" }
402
+ : {
403
+ dispatched: false,
404
+ ...(started.chatId === undefined ? {} : { chatId: started.chatId }),
405
+ landed: started.skipped,
406
+ });
407
+ return { dispatched: started.dispatched };
408
+ },
409
+ };
410
+ function serverCreatedFrame(messages) {
411
+ return serverFirstBuildAppContext(messages, { ownerHandle: resChat.ownerHandle, appSlug: liveAppSlug });
412
+ }
186
413
  const poufApp = agentFirstTurnMint === false && topLevel === false && poufLookFor(vctx, rActor.Ok().userId)
187
414
  ? await exception2Result(() => readComposedSettingsForApp(vctx, resChat.ownerHandle, resChat.appSlug)).then((r) => r.isOk() && r.Ok().find(isActiveTheme)?.theme === "pouf")
188
415
  : false;
@@ -190,6 +417,7 @@ export function createAgentTurnAction(args) {
190
417
  ? createAccountAgentBelt(vctx, {
191
418
  actor: rActor.Ok(),
192
419
  chatId: req.chatId,
420
+ personWords,
193
421
  openAuth: { auth: req.auth, _auth: req._auth },
194
422
  dispatcher,
195
423
  mintDispatcherFor: (mintChatId) => createAgentBuildDispatcher({
@@ -208,12 +436,12 @@ export function createAgentTurnAction(args) {
208
436
  : createAgentBelt(vctx, {
209
437
  actor: rActor.Ok(),
210
438
  chatId: req.chatId,
439
+ personWords,
211
440
  vfs,
212
- onOptionsOffered: (offered) => evidence({ kind: "options", options: [...offered] }),
213
441
  ...(poufApp ? { poufApp } : {}),
214
- ...(firstTurnMint === undefined
442
+ ...(beltFirstTurn === undefined
215
443
  ? {}
216
- : { firstTurn: serverCreated === undefined ? firstTurnMint : { ...firstTurnMint, preCreated: serverCreated } }),
444
+ : { firstTurn: serverCreated === undefined ? beltFirstTurn : { ...beltFirstTurn, preCreated: serverCreated } }),
217
445
  ...(agentFetchUrlContext === undefined ? {} : { fetchUrl: agentFetchUrlContext }),
218
446
  dispatcher,
219
447
  queueEdit: (input) => liveSession.queue(input),
@@ -254,6 +482,7 @@ export function createAgentTurnAction(args) {
254
482
  });
255
483
  },
256
484
  onDispatch: (dispatched) => {
485
+ preJoin.joined();
257
486
  liveAppSlug = dispatched.appSlug;
258
487
  liveSession.claimAppAddress(dispatched.appSlug);
259
488
  firstTurnAppClaimed = true;
@@ -294,7 +523,7 @@ export function createAgentTurnAction(args) {
294
523
  : seededWordsArmed
295
524
  ? withSeededAddressWordsLine(agentPayload.messages, briefWords)
296
525
  : agentPayload.messages
297
- : serverFirstBuildAppContext(agentPayload.messages, { ownerHandle: resChat.ownerHandle, appSlug: liveAppSlug }),
526
+ : serverCreatedFrame(agentPayload.messages),
298
527
  model: agentPayload.model,
299
528
  ownerHandle: resChat.ownerHandle,
300
529
  appSlug: liveAppSlug,
@@ -320,9 +549,34 @@ export function createAgentTurnAction(args) {
320
549
  const rSse = createProviderSseStream(res.res, promptId);
321
550
  if (rSse.isErr()) {
322
551
  vctx.logger.Warn().Err(rSse).Str("chatId", req.chatId).Msg("agent-turn-provider-stream-unavailable");
552
+ race?.agentFailed();
323
553
  }
324
554
  else {
325
- providerStream = createAgentTurnStream({
555
+ const roundOne = briefArmed
556
+ ? observeFirstBriefRound(rSse.Ok(), {
557
+ startedAt: briefStartedAt,
558
+ now: () => Date.now(),
559
+ onEnd: async (round) => {
560
+ briefRound = round;
561
+ if (race !== undefined && round.called && (await race.agentCreate()).kind === "join") {
562
+ briefRecorded = true;
563
+ return;
564
+ }
565
+ await recordFirstBriefRow(vctx, {
566
+ chatId: req.chatId,
567
+ userId: req._auth.verifiedAuth.claims.userId,
568
+ model: briefModel,
569
+ round,
570
+ });
571
+ if (round.called === false) {
572
+ briefCallPending = false;
573
+ briefContinueOwed = true;
574
+ await recordBrief({ dispatched: false, reason: "no-create-call" });
575
+ }
576
+ },
577
+ })
578
+ : rSse.Ok();
579
+ const turnStream = createAgentTurnStream({
326
580
  vctx,
327
581
  belt,
328
582
  actor: rActor.Ok(),
@@ -330,27 +584,21 @@ export function createAgentTurnAction(args) {
330
584
  vfs,
331
585
  dispatcher,
332
586
  request: res.llmReq,
333
- stream: briefArmed
334
- ? observeFirstBriefRound(rSse.Ok(), {
335
- startedAt: briefStartedAt,
336
- now: () => Date.now(),
337
- onEnd: async (round) => {
338
- briefRound = round;
339
- await recordFirstBriefRow(vctx, {
340
- chatId: req.chatId,
341
- userId: req._auth.verifiedAuth.claims.userId,
342
- model: briefModel,
343
- round,
344
- });
345
- if (round.called === false) {
346
- briefCallPending = false;
347
- briefContinueOwed = true;
348
- await recordBrief({ dispatched: false, reason: "no-create-call" });
349
- }
350
- },
351
- })
352
- : rSse.Ok(),
587
+ stream: raceRound(roundOne),
353
588
  abort: res.abort,
589
+ settleOptionLines: createAgentClosingOptions(vctx, {
590
+ actor: rActor.Ok(),
591
+ chatId: req.chatId,
592
+ ...(topLevel ? { noApp: true } : {}),
593
+ onOffered: (row) => {
594
+ race?.noteChips(row.options.length);
595
+ return evidence({
596
+ kind: "options",
597
+ options: [...row.options],
598
+ text: JSON.stringify({ asked: row.asked, dropped: row.dropped }),
599
+ });
600
+ },
601
+ }),
354
602
  onToolEvidence: async ({ kind, call, text, round, epoch }) => {
355
603
  const written = await evidence({ kind, callId: call.id, name: call.name, text, round, epoch });
356
604
  if (briefRecorded === false && kind === "receipt" && call.name === "create_vibe" && round === 1 && epoch === 0) {
@@ -390,7 +638,7 @@ export function createAgentTurnAction(args) {
390
638
  const framed = agentFirstTurnMint && firstTurnAppClaimed
391
639
  ? serverCreated === undefined
392
640
  ? claimAgentAppContext(request.messages, { ownerHandle: resChat.ownerHandle, appSlug: liveAppSlug })
393
- : serverFirstBuildAppContext(request.messages, { ownerHandle: resChat.ownerHandle, appSlug: liveAppSlug })
641
+ : serverCreatedFrame(request.messages)
394
642
  : request.messages;
395
643
  const messages = await inflateAgentFiles(vctx, {
396
644
  messages: briefArmed || seededWordsArmed ? withoutFirstBriefLine(framed) : framed,
@@ -441,14 +689,24 @@ export function createAgentTurnAction(args) {
441
689
  return Result.Err(rRound);
442
690
  return Result.Ok({
443
691
  request: { ...loopReq, messages },
444
- stream: rRound.Ok(),
692
+ stream: raceRound(rRound.Ok()),
445
693
  abort: dispatch.abort,
446
694
  });
447
695
  },
448
696
  onError: (error) => {
449
697
  vctx.logger.Warn().Any("event", { chatId: req.chatId, promptId, error }).Msg("agent-turn-loop-failed");
698
+ race?.agentFailed();
699
+ preJoin.close();
450
700
  },
451
701
  });
702
+ providerStream =
703
+ race === undefined || mercuryPending === undefined
704
+ ? turnStream
705
+ : deferredStream(race.decided.then((verdict) => {
706
+ const preamble = verdict === "mercury" ? race.mercuryPreamble() : undefined;
707
+ const shown = preamble !== undefined ? withPreambleFirst(withoutPreJoinText(turnStream, preJoin), preamble) : turnStream;
708
+ return withMercuryUsageRounds(shown, { settled: mercuryPending, rounds: () => mercuryRounds });
709
+ }));
452
710
  }
453
711
  const finalBlockSeq = await handleLlmResponse({
454
712
  scope,
@@ -469,6 +727,12 @@ export function createAgentTurnAction(args) {
469
727
  platformInitiated: agentWakeTurn,
470
728
  step: agentWakeTurn ? "wake" : "agent",
471
729
  });
730
+ if (seamTask !== undefined)
731
+ await seamTask;
732
+ if (race !== undefined && lastMercuryRow !== undefined) {
733
+ await recordMercuryRace(vctx, { chatId: req.chatId, promptId: lastMercuryRow, race: race.receipt() });
734
+ alternativeRecorded = true;
735
+ }
472
736
  return Result.Ok(finalBlockSeq);
473
737
  };
474
738
  }
@@ -617,4 +881,8 @@ async function commitStagedFiles(args) {
617
881
  ...(designCheck === undefined ? {} : { designCheck }),
618
882
  });
619
883
  }
884
+ function carryWithoutVariant(carry) {
885
+ const { instructionVariant: _variant, ...rest } = carry;
886
+ return rest;
887
+ }
620
888
  //# sourceMappingURL=agent-turn-action.js.map