@vibes.diy/api-svc 3.0.2 → 4.0.2

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 (92) hide show
  1. package/cf-serve.d.ts +1 -0
  2. package/cf-serve.js +9 -0
  3. package/cf-serve.js.map +1 -1
  4. package/check-auth.js +6 -10
  5. package/check-auth.js.map +1 -1
  6. package/create-handler.d.ts +1 -0
  7. package/create-handler.js +7 -0
  8. package/create-handler.js.map +1 -1
  9. package/evento-handler-manifest.js +4 -0
  10. package/evento-handler-manifest.js.map +1 -1
  11. package/intern/attempt-backend-fetch.d.ts +18 -0
  12. package/intern/attempt-backend-fetch.js +37 -0
  13. package/intern/attempt-backend-fetch.js.map +1 -0
  14. package/intern/attempt-backend-onchange.d.ts +21 -0
  15. package/intern/attempt-backend-onchange.js +40 -0
  16. package/intern/attempt-backend-onchange.js.map +1 -0
  17. package/intern/attempt-backend-scheduled.d.ts +16 -0
  18. package/intern/attempt-backend-scheduled.js +30 -0
  19. package/intern/attempt-backend-scheduled.js.map +1 -0
  20. package/intern/backend-alarm-policy.d.ts +17 -0
  21. package/intern/backend-alarm-policy.js +24 -0
  22. package/intern/backend-alarm-policy.js.map +1 -0
  23. package/intern/backend-do-addr.d.ts +15 -0
  24. package/intern/backend-do-addr.js +15 -0
  25. package/intern/backend-do-addr.js.map +1 -0
  26. package/intern/backend-onchange-policy.d.ts +6 -0
  27. package/intern/backend-onchange-policy.js +8 -0
  28. package/intern/backend-onchange-policy.js.map +1 -0
  29. package/intern/components/vibe-page.js +7 -1
  30. package/intern/components/vibe-page.js.map +1 -1
  31. package/intern/emit-backend-onchange.d.ts +13 -0
  32. package/intern/emit-backend-onchange.js +42 -0
  33. package/intern/emit-backend-onchange.js.map +1 -0
  34. package/intern/load-selected-backend.d.ts +13 -0
  35. package/intern/load-selected-backend.js +38 -0
  36. package/intern/load-selected-backend.js.map +1 -0
  37. package/intern/process-access-bindings.d.ts +7 -1
  38. package/intern/process-access-bindings.js +52 -2
  39. package/intern/process-access-bindings.js.map +1 -1
  40. package/intern/process-backend-bindings.d.ts +20 -0
  41. package/intern/process-backend-bindings.js +84 -0
  42. package/intern/process-backend-bindings.js.map +1 -0
  43. package/intern/render-vibe.js +30 -0
  44. package/intern/render-vibe.js.map +1 -1
  45. package/intern/seed-starter-chips.d.ts +27 -0
  46. package/intern/seed-starter-chips.js +86 -0
  47. package/intern/seed-starter-chips.js.map +1 -0
  48. package/intern/vibe-ssr-attempt.d.ts +29 -0
  49. package/intern/vibe-ssr-attempt.js +43 -0
  50. package/intern/vibe-ssr-attempt.js.map +1 -0
  51. package/package.json +14 -18
  52. package/public/access-binding-resolver.d.ts +9 -0
  53. package/public/access-binding-resolver.js +48 -0
  54. package/public/access-binding-resolver.js.map +1 -0
  55. package/public/app-documents-dm-eventos.js +0 -6
  56. package/public/app-documents-dm-eventos.js.map +1 -1
  57. package/public/app-documents-read-eventos.js +21 -49
  58. package/public/app-documents-read-eventos.js.map +1 -1
  59. package/public/app-documents-write-eventos.js +58 -65
  60. package/public/app-documents-write-eventos.js.map +1 -1
  61. package/public/channel-read-filter.d.ts +1 -1
  62. package/public/channel-read-filter.js +3 -3
  63. package/public/channel-read-filter.js.map +1 -1
  64. package/public/db-acl-resolver.d.ts +0 -1
  65. package/public/db-acl-resolver.js +1 -14
  66. package/public/db-acl-resolver.js.map +1 -1
  67. package/public/dm-access-fn.d.ts +2 -0
  68. package/public/dm-access-fn.js +25 -0
  69. package/public/dm-access-fn.js.map +1 -0
  70. package/public/ensure-app-settings.js +121 -3
  71. package/public/ensure-app-settings.js.map +1 -1
  72. package/public/ensure-app-slug-item.js +34 -0
  73. package/public/ensure-app-slug-item.js.map +1 -1
  74. package/public/fork-app.js +56 -5
  75. package/public/fork-app.js.map +1 -1
  76. package/public/get-app-by-fsid.d.ts +15 -0
  77. package/public/get-app-by-fsid.js +48 -1
  78. package/public/get-app-by-fsid.js.map +1 -1
  79. package/public/get-cached-suggestion.d.ts +3 -0
  80. package/public/get-cached-suggestion.js +129 -0
  81. package/public/get-cached-suggestion.js.map +1 -0
  82. package/public/get-vibe-chips.js +13 -1
  83. package/public/get-vibe-chips.js.map +1 -1
  84. package/public/prompt-chat-section.js +90 -5
  85. package/public/prompt-chat-section.js.map +1 -1
  86. package/public/publish-app.js +22 -0
  87. package/public/publish-app.js.map +1 -1
  88. package/public/seed-starter-chips-handler.d.ts +3 -0
  89. package/public/seed-starter-chips-handler.js +54 -0
  90. package/public/seed-starter-chips-handler.js.map +1 -0
  91. package/types.d.ts +1 -0
  92. package/types.js.map +1 -1
@@ -0,0 +1,129 @@
1
+ import { Result, Option, EventoResult } from "@adviser/cement";
2
+ import { reqGetCachedSuggestion, isCachedSuggestionKeyShape, isCrossSlugBless, } from "@vibes.diy/api-types";
3
+ import { type } from "arktype";
4
+ import { ensureLogger } from "@vibes.diy/identity";
5
+ import { unwrapMsgBase } from "../unwrap-msg-base.js";
6
+ import { optAuth } from "../check-auth.js";
7
+ import { isPublicReadable, isWorldReadable, checkDocAccess } from "./access-helpers.js";
8
+ import { selectLatestAppPerSlug } from "./select-app.js";
9
+ import { isHiddenForCaller } from "./unpublished-binding.js";
10
+ import { ensureAppSettings } from "./ensure-app-settings.js";
11
+ import { cachedSuggestionSourceIsPublic } from "./get-app-by-fsid.js";
12
+ export const getCachedSuggestionEvento = {
13
+ hash: "get-cached-suggestion",
14
+ validate: unwrapMsgBase(async (msg) => {
15
+ const ret = reqGetCachedSuggestion(msg.payload);
16
+ if (ret instanceof type.errors) {
17
+ return Result.Ok(Option.None());
18
+ }
19
+ return Result.Ok(Option.Some({ ...msg, payload: ret }));
20
+ }),
21
+ handle: optAuth(async (ctx) => {
22
+ const req = ctx.validated.payload;
23
+ const vctx = ctx.ctx.getOrThrow("vibesApiCtx");
24
+ const logger = ensureLogger(vctx.sthis, "getCachedSuggestion");
25
+ const miss = {
26
+ type: "vibes.diy.res-get-cached-suggestion",
27
+ ownerHandle: req.ownerHandle,
28
+ appSlug: req.appSlug,
29
+ key: req.key,
30
+ };
31
+ const safeKey = isCachedSuggestionKeyShape(req.key) ? req.key : `<non-canonical:${req.key.length}>`;
32
+ const emit = (res, outcome, reason) => {
33
+ logger
34
+ .Info()
35
+ .Any("event", {
36
+ outcome,
37
+ ...(reason ? { reason } : {}),
38
+ ownerHandle: req.ownerHandle,
39
+ appSlug: req.appSlug,
40
+ key: safeKey,
41
+ ...(res.fsId ? { fsId: res.fsId } : {}),
42
+ })
43
+ .Msg("cached-suggestion-read");
44
+ return ctx.send.send(ctx, res).then(() => Result.Ok(EventoResult.Continue));
45
+ };
46
+ const callerUserId = req._auth?.verifiedAuth.claims.userId;
47
+ const app = await selectLatestAppPerSlug(vctx, { ownerHandle: req.ownerHandle, appSlug: req.appSlug });
48
+ let isMember = false;
49
+ if (callerUserId) {
50
+ const { access } = await checkDocAccess(vctx, callerUserId, req.appSlug, req.ownerHandle);
51
+ isMember = access !== "none";
52
+ }
53
+ let publicVisible = false;
54
+ if (!isMember &&
55
+ app &&
56
+ app.mode === "production" &&
57
+ !(await isHiddenForCaller(vctx, {
58
+ ownerHandle: app.ownerHandle,
59
+ appSlug: app.appSlug,
60
+ ownerUserId: app.userId,
61
+ callerUserId,
62
+ }))) {
63
+ publicVisible = callerUserId
64
+ ? await isWorldReadable(vctx, req.appSlug, req.ownerHandle)
65
+ : await isPublicReadable(vctx, req.appSlug, req.ownerHandle);
66
+ }
67
+ if (!isMember && !publicVisible) {
68
+ return emit(miss, "miss", "not-visible");
69
+ }
70
+ const rAppSet = await ensureAppSettings(vctx, {
71
+ type: "vibes.diy.req-ensure-app-settings",
72
+ appSlug: req.appSlug,
73
+ ownerHandle: req.ownerHandle,
74
+ });
75
+ if (rAppSet.isErr()) {
76
+ return emit(miss, "lookup-error", "settings-read-failed");
77
+ }
78
+ const cachedSuggestionBlesses = rAppSet.Ok().settings.entry.cachedSuggestionBlesses;
79
+ const entry = cachedSuggestionBlesses?.[req.key];
80
+ if (!entry) {
81
+ return emit(miss, "miss", "unblessed");
82
+ }
83
+ if (isCrossSlugBless(entry) && entry.targetOwnerHandle && entry.targetAppSlug) {
84
+ const targetApp = await selectLatestAppPerSlug(vctx, {
85
+ ownerHandle: entry.targetOwnerHandle,
86
+ appSlug: entry.targetAppSlug,
87
+ });
88
+ const targetPublic = !!targetApp &&
89
+ targetApp.mode === "production" &&
90
+ !(await isHiddenForCaller(vctx, {
91
+ ownerHandle: targetApp.ownerHandle,
92
+ appSlug: targetApp.appSlug,
93
+ ownerUserId: targetApp.userId,
94
+ callerUserId,
95
+ })) &&
96
+ (await isPublicReadable(vctx, entry.targetAppSlug, entry.targetOwnerHandle));
97
+ if (!targetPublic) {
98
+ return emit(miss, "miss", "target-not-public");
99
+ }
100
+ return emit({
101
+ type: "vibes.diy.res-get-cached-suggestion",
102
+ ownerHandle: req.ownerHandle,
103
+ appSlug: req.appSlug,
104
+ key: req.key,
105
+ targetOwnerHandle: entry.targetOwnerHandle,
106
+ targetAppSlug: entry.targetAppSlug,
107
+ }, "hit", "vibe");
108
+ }
109
+ if (!entry.fsId || !entry.sourceFsId) {
110
+ return emit(miss, "miss", "unblessed");
111
+ }
112
+ const sourcePublic = await cachedSuggestionSourceIsPublic(vctx, {
113
+ ownerHandle: req.ownerHandle,
114
+ appSlug: req.appSlug,
115
+ sourceFsId: entry.sourceFsId,
116
+ });
117
+ if (!sourcePublic) {
118
+ return emit(miss, "miss", "source-not-public");
119
+ }
120
+ return emit({
121
+ type: "vibes.diy.res-get-cached-suggestion",
122
+ ownerHandle: req.ownerHandle,
123
+ appSlug: req.appSlug,
124
+ key: req.key,
125
+ fsId: entry.fsId,
126
+ }, "hit");
127
+ }),
128
+ };
129
+ //# sourceMappingURL=get-cached-suggestion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-cached-suggestion.js","sourceRoot":"","sources":["../../jsr/public/get-cached-suggestion.ts"],"names":[],"mappings":"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"}
@@ -94,8 +94,20 @@ export const getVibeChipsEvento = {
94
94
  turn.sections.sort((a, b) => a.blockSeq - b.blockSeq);
95
95
  }
96
96
  const orderedTurns = Array.from(turns.values()).sort((a, b) => (a.created < b.created ? 1 : a.created > b.created ? -1 : 0));
97
+ let inheritedFsId;
98
+ const normalizedTurns = new Array(orderedTurns.length);
99
+ for (let i = orderedTurns.length - 1; i >= 0; i--) {
100
+ const turn = orderedTurns[i];
101
+ if (turn.fsId !== undefined) {
102
+ inheritedFsId = turn.fsId;
103
+ normalizedTurns[i] = turn;
104
+ }
105
+ else {
106
+ normalizedTurns[i] = inheritedFsId !== undefined ? { ...turn, fsId: inheritedFsId } : turn;
107
+ }
108
+ }
97
109
  const effectiveFsId = req.fsId ?? app?.fsId;
98
- const candidateTurns = !isMember && app?.fsId ? orderedTurns.filter((t) => t.fsId === app.fsId) : orderedTurns;
110
+ const candidateTurns = !isMember && app?.fsId ? normalizedTurns.filter((t) => t.fsId === app.fsId) : normalizedTurns;
99
111
  const chips = latestTurnChips(candidateTurns, effectiveFsId);
100
112
  await ctx.send.send(ctx, {
101
113
  type: "vibes.diy.res-get-vibe-chips",
@@ -1 +1 @@
1
- {"version":3,"file":"get-vibe-chips.js","sourceRoot":"","sources":["../../jsr/public/get-vibe-chips.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"get-vibe-chips.js","sourceRoot":"","sources":["../../jsr/public/get-vibe-chips.ts"],"names":[],"mappings":"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"}
@@ -34,6 +34,15 @@ const PRIMARY_RETRY_DELAY_MS = 100;
34
34
  const FALLBACK_RETRY_DELAY_MS = 250;
35
35
  const MAX_RETRY_AFTER_MS = 10_000;
36
36
  const MAX_ATTEMPT_BODY_SNIPPET_CHARS = 2000;
37
+ const DISPATCH_FIRST_TOKEN_TIMEOUT_MS = 45_000;
38
+ const DISPATCH_TOTAL_BUDGET_MS = 120_000;
39
+ function envPositiveInt(vctx, key, fallback) {
40
+ const raw = vctx.sthis.env.get(key);
41
+ if (typeof raw !== "string")
42
+ return fallback;
43
+ const n = Number.parseInt(raw, 10);
44
+ return Number.isFinite(n) && n > 0 ? n : fallback;
45
+ }
37
46
  function formatAttemptFailure(failure) {
38
47
  const prefix = `${failure.label} ${failure.model}`;
39
48
  switch (failure.kind) {
@@ -48,6 +57,8 @@ function formatAttemptFailure(failure) {
48
57
  }
49
58
  case "exception":
50
59
  return `${prefix} failed with error ${failure.error}`;
60
+ case "timeout":
61
+ return `${prefix} timed out after ${failure.elapsedMs}ms with no response`;
51
62
  }
52
63
  }
53
64
  function formatLlmAttemptFailures(failures) {
@@ -203,13 +214,40 @@ async function findFallbackModel(vctx, mode, failedModel) {
203
214
  return Result.Err(`No fallback model configured for ${mode} after ${failedModel}`);
204
215
  }
205
216
  async function attemptLlmRequest(args) {
206
- const { vctx, diag, llmReq, label } = args;
217
+ const { vctx, diag, llmReq, label, firstTokenTimeoutMs } = args;
207
218
  const abort = new AbortController();
208
219
  const startedAt = Date.now();
220
+ let timedOut = false;
221
+ const timer = setTimeout(() => {
222
+ timedOut = true;
223
+ abort.abort();
224
+ }, firstTokenTimeoutMs);
209
225
  const rRes = await exception2Result(() => vctx.llmRequest(llmReq, { signal: abort.signal }));
226
+ clearTimeout(timer);
210
227
  const elapsedMs = Date.now() - startedAt;
211
228
  if (rRes.isErr()) {
212
229
  abort.abort();
230
+ if (timedOut) {
231
+ logLlmAttemptFailure({
232
+ vctx,
233
+ diag,
234
+ label,
235
+ model: llmReq.model,
236
+ elapsedMs,
237
+ details: { kind: "timeout", retryable: true, timeoutMs: firstTokenTimeoutMs },
238
+ });
239
+ return {
240
+ ok: false,
241
+ abort,
242
+ failure: {
243
+ kind: "timeout",
244
+ label,
245
+ model: llmReq.model,
246
+ elapsedMs,
247
+ retryable: true,
248
+ },
249
+ };
250
+ }
213
251
  const error = String(rRes.Err());
214
252
  logLlmAttemptFailure({
215
253
  vctx,
@@ -314,12 +352,37 @@ async function dispatchLlmRequestWithFallback(args) {
314
352
  phase: args.phase,
315
353
  mode: args.mode,
316
354
  };
355
+ const firstTokenTimeoutMs = envPositiveInt(args.vctx, "DISPATCH_FIRST_TOKEN_TIMEOUT_MS", DISPATCH_FIRST_TOKEN_TIMEOUT_MS);
356
+ const totalBudgetMs = envPositiveInt(args.vctx, "DISPATCH_TOTAL_BUDGET_MS", DISPATCH_TOTAL_BUDGET_MS);
357
+ const dispatchDeadline = Date.now() + totalBudgetMs;
358
+ const budgetRemainingMs = () => Math.max(0, dispatchDeadline - Date.now());
359
+ const attemptTimeoutMs = () => Math.min(firstTokenTimeoutMs, budgetRemainingMs());
360
+ const backoffMs = (failure, defaultDelayMs) => Math.min(delayForAttempt(failure, defaultDelayMs), budgetRemainingMs());
361
+ const budgetExhausted = () => {
362
+ const abort = new AbortController();
363
+ abort.abort();
364
+ const note = `LLM dispatch exceeded ${totalBudgetMs}ms budget before a response`;
365
+ const error = attempts.length > 0 ? `${formatLlmAttemptFailures(attempts)}; ${note}` : note;
366
+ args.vctx.logger
367
+ .Warn()
368
+ .Any("event", { chatId: args.chatId, promptId: args.promptId, phase: args.phase, mode: args.mode, attempts: attempts.length })
369
+ .Msg("llm-dispatch-budget-exhausted");
370
+ return { ok: false, llmReq: args.llmReq, abort, attempts, error };
371
+ };
317
372
  let lastPrimary;
318
373
  for (const label of ["primary", "primary-retry"]) {
319
374
  if (lastPrimary) {
320
- await waitMs(delayForAttempt(lastPrimary.failure, PRIMARY_RETRY_DELAY_MS));
375
+ await waitMs(backoffMs(lastPrimary.failure, PRIMARY_RETRY_DELAY_MS));
321
376
  }
322
- const attempt = await attemptLlmRequest({ vctx: args.vctx, diag, llmReq: args.llmReq, label });
377
+ if (Date.now() >= dispatchDeadline)
378
+ return budgetExhausted();
379
+ const attempt = await attemptLlmRequest({
380
+ vctx: args.vctx,
381
+ diag,
382
+ llmReq: args.llmReq,
383
+ label,
384
+ firstTokenTimeoutMs: attemptTimeoutMs(),
385
+ });
323
386
  if (attempt.ok)
324
387
  return { ok: true, res: attempt.res, llmReq: args.llmReq, abort: attempt.abort, attempts };
325
388
  attempts.push(attempt.failure);
@@ -336,8 +399,16 @@ async function dispatchLlmRequestWithFallback(args) {
336
399
  }
337
400
  const fallbackModel = rFallbackModel.Ok();
338
401
  const fallbackReq = { ...args.llmReq, model: fallbackModel };
339
- await waitMs(delayForAttempt(failedPrimary.failure, FALLBACK_RETRY_DELAY_MS));
340
- const fallback = await attemptLlmRequest({ vctx: args.vctx, diag, llmReq: fallbackReq, label: "fallback" });
402
+ await waitMs(backoffMs(failedPrimary.failure, FALLBACK_RETRY_DELAY_MS));
403
+ if (Date.now() >= dispatchDeadline)
404
+ return budgetExhausted();
405
+ const fallback = await attemptLlmRequest({
406
+ vctx: args.vctx,
407
+ diag,
408
+ llmReq: fallbackReq,
409
+ label: "fallback",
410
+ firstTokenTimeoutMs: attemptTimeoutMs(),
411
+ });
341
412
  if (fallback.ok) {
342
413
  args.vctx.logger
343
414
  .Info()
@@ -653,6 +724,8 @@ async function handlerLlmRequest({ scope, ctx, vctx, blockSeq, req, resChat, pro
653
724
  return r;
654
725
  })
655
726
  .do();
727
+ const dispatchStartedAt = Date.now();
728
+ vctx.logger.Info().Any("event", { chatId: req.chatId, promptId, mode: req.mode, model: modelId }).Msg("llm-dispatch-start");
656
729
  const dispatch = await dispatchLlmRequestWithFallback({
657
730
  vctx,
658
731
  mode: req.mode,
@@ -661,6 +734,18 @@ async function handlerLlmRequest({ scope, ctx, vctx, blockSeq, req, resChat, pro
661
734
  promptId,
662
735
  phase: "initial",
663
736
  });
737
+ vctx.logger
738
+ .Info()
739
+ .Any("event", {
740
+ chatId: req.chatId,
741
+ promptId,
742
+ mode: req.mode,
743
+ ok: dispatch.ok,
744
+ model: dispatch.llmReq.model,
745
+ attempts: dispatch.attempts.length,
746
+ elapsedMs: Date.now() - dispatchStartedAt,
747
+ })
748
+ .Msg("llm-dispatch-settled");
664
749
  const res = await scope
665
750
  .evalResult(async () => {
666
751
  return dispatch.ok ? Result.Ok(dispatch.res) : Result.Err(dispatch.error);