veryfront 0.1.849 → 0.1.851

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.
package/esm/deno.js CHANGED
@@ -1,6 +1,6 @@
1
1
  export default {
2
2
  "name": "veryfront",
3
- "version": "0.1.849",
3
+ "version": "0.1.851",
4
4
  "license": "Apache-2.0",
5
5
  "nodeModulesDir": "auto",
6
6
  "minimumDependencyAge": {
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/runtime/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/runtime/index.ts"],"names":[],"mappings":"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"}
@@ -327,6 +327,8 @@ export class AgentRuntime {
327
327
  let activeSkillId = hydratedSkillState.activeSkillId;
328
328
  let activeSkillPolicy = hydratedSkillState.activeSkillPolicy;
329
329
  let activeSkillDelegationOverrides = hydratedSkillState.activeSkillDelegationOverrides;
330
+ const hasSubmittedFormInputInLoop = hasSubmittedFormInputResult(currentMessages) ||
331
+ runtimeContext?.[SUBMITTED_FORM_INPUT_CONTEXT_KEY] === true;
330
332
  const allowedRemoteToolNames = getRuntimeAllowedRemoteTools(this.config);
331
333
  const providerTools = getRuntimeProviderTools(this.config);
332
334
  const forwardedRemoteToolDefinitions = getRuntimeForwardedIntegrationToolDefs(this.config);
@@ -336,6 +338,9 @@ export class AgentRuntime {
336
338
  for (let step = 0; step < maxSteps; step++) {
337
339
  this.status = "thinking";
338
340
  addSpanEvent(loopSpan, "step_start", { step });
341
+ const stepRuntimeContext = hasSubmittedFormInputInLoop
342
+ ? markSubmittedFormInputRuntimeContext(currentRuntimeContext)
343
+ : currentRuntimeContext;
339
344
  const preparedStep = await prepareAgentRuntimeStep({
340
345
  agentId: this.id,
341
346
  activeSkillPolicy,
@@ -348,7 +353,7 @@ export class AgentRuntime {
348
353
  mode: "generate",
349
354
  remoteToolSources,
350
355
  resolveRuntimeState: this.resolveRuntimeState.bind(this),
351
- runtimeContext: currentRuntimeContext,
356
+ runtimeContext: stepRuntimeContext,
352
357
  step,
353
358
  systemPrompt: currentSystemPrompt,
354
359
  toolContextBase,
@@ -460,7 +465,7 @@ export class AgentRuntime {
460
465
  return;
461
466
  }
462
467
  const policyCheck = enforceSkillPolicy(tc.toolName, activeSkillPolicy, mustLoadSkillFirst, {
463
- allowSubmittedFormInputReuse: hasSubmittedFormInputResult(currentMessages),
468
+ hasSubmittedFormInput: hasSubmittedFormInputInLoop,
464
469
  });
465
470
  if (!policyCheck.allowed) {
466
471
  toolCall.status = "error";
@@ -566,6 +571,8 @@ export class AgentRuntime {
566
571
  let activeSkillId = hydratedSkillState.activeSkillId;
567
572
  let activeSkillPolicy = hydratedSkillState.activeSkillPolicy;
568
573
  let activeSkillDelegationOverrides = hydratedSkillState.activeSkillDelegationOverrides;
574
+ let hasSubmittedFormInputInLoop = hasSubmittedFormInputResult(currentMessages) ||
575
+ runtimeContext?.[SUBMITTED_FORM_INPUT_CONTEXT_KEY] === true;
569
576
  let finalFinishReason;
570
577
  let latestAssistantText = "";
571
578
  const allowedRemoteToolNames = getRuntimeAllowedRemoteTools(this.config);
@@ -579,6 +586,9 @@ export class AgentRuntime {
579
586
  throwIfAborted(abortSignal);
580
587
  sendSSE(controller, encoder, { type: "step-start" });
581
588
  const currentStepToolResults = new Map();
589
+ const stepRuntimeContext = hasSubmittedFormInputInLoop
590
+ ? markSubmittedFormInputRuntimeContext(currentRuntimeContext)
591
+ : currentRuntimeContext;
582
592
  const preparedStep = await prepareAgentRuntimeStep({
583
593
  agentId: this.id,
584
594
  activeSkillPolicy,
@@ -591,7 +601,7 @@ export class AgentRuntime {
591
601
  mode: "stream",
592
602
  remoteToolSources,
593
603
  resolveRuntimeState: this.resolveRuntimeState.bind(this),
594
- runtimeContext: currentRuntimeContext,
604
+ runtimeContext: stepRuntimeContext,
595
605
  step,
596
606
  systemPrompt: currentSystemPrompt,
597
607
  toolContextBase,
@@ -764,6 +774,7 @@ export class AgentRuntime {
764
774
  }
765
775
  activeSkillPolicy = removeFormInputAfterSubmission(tc.name, matchingResult.output, activeSkillId, activeSkillPolicy);
766
776
  if (isSubmittedFormInputExecutionResult(tc.name, matchingResult.output)) {
777
+ hasSubmittedFormInputInLoop = true;
767
778
  currentRuntimeContext = markSubmittedFormInputRuntimeContext(currentRuntimeContext);
768
779
  }
769
780
  if (tc.name === "create_agent") {
@@ -787,6 +798,7 @@ export class AgentRuntime {
787
798
  }
788
799
  activeSkillPolicy = removeFormInputAfterSubmission(tc.name, persistedResult.result, activeSkillId, activeSkillPolicy);
789
800
  if (isSubmittedFormInputExecutionResult(tc.name, persistedResult.result)) {
801
+ hasSubmittedFormInputInLoop = true;
790
802
  currentRuntimeContext = markSubmittedFormInputRuntimeContext(currentRuntimeContext);
791
803
  }
792
804
  if (tc.name === "create_agent") {
@@ -816,7 +828,7 @@ export class AgentRuntime {
816
828
  continue;
817
829
  }
818
830
  const policyCheck = enforceSkillPolicy(tc.name, activeSkillPolicy, mustLoadSkillFirst, {
819
- allowSubmittedFormInputReuse: hasSubmittedFormInputResult(currentMessages),
831
+ hasSubmittedFormInput: hasSubmittedFormInputInLoop,
820
832
  });
821
833
  if (!policyCheck.allowed) {
822
834
  await this.recordToolError(toolCall, policyCheck.error, controller, encoder, currentMessages, toolCalls);
@@ -857,6 +869,7 @@ export class AgentRuntime {
857
869
  }
858
870
  activeSkillPolicy = removeFormInputAfterSubmission(tc.name, result, activeSkillId, activeSkillPolicy);
859
871
  if (isSubmittedFormInputExecutionResult(tc.name, result)) {
872
+ hasSubmittedFormInputInLoop = true;
860
873
  currentRuntimeContext = markSubmittedFormInputRuntimeContext(currentRuntimeContext);
861
874
  }
862
875
  if (tc.name === "create_agent") {
@@ -23,7 +23,7 @@ export type SkillPolicyResult = {
23
23
  error: string;
24
24
  };
25
25
  export type SkillPolicyOptions = {
26
- allowSubmittedFormInputReuse?: boolean;
26
+ hasSubmittedFormInput?: boolean;
27
27
  };
28
28
  export declare function enforceSkillPolicy(toolName: string, activeSkillPolicy: string[] | undefined, mustLoadSkillFirst: boolean, options?: SkillPolicyOptions): SkillPolicyResult;
29
29
  //# sourceMappingURL=skill-policy-enforcement.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"skill-policy-enforcement.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/runtime/skill-policy-enforcement.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAO1D,OAAO,EAEL,KAAK,wBAAwB,EAC9B,MAAM,iCAAiC,CAAC;AAIzC,eAAO,MAAM,kBAAkB,eAAe,CAAC;AAC/C,eAAO,MAAM,kBAAkB,eAAe,CAAC;AAC/C,eAAO,MAAM,oBAAoB,iBAAiB,CAAC;AACnD,eAAO,MAAM,gCAAgC,gCAAgC,CAAC;AAa9E,wBAAgB,mCAAmC,CACjD,QAAQ,EAAE,SAAS,OAAO,EAAE,GAC3B;IACD,aAAa,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,iBAAiB,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IACxC,8BAA8B,EAAE,wBAAwB,GAAG,SAAS,CAAC;CACtE,CAeA;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAIlE;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,EAAE,GAAG,SAAS,CAyBxE;AA2BD,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,GAAG,OAAO,CAQjF;AAED,wBAAgB,kCAAkC,CAChD,KAAK,EAAE,SAAS,cAAc,EAAE,EAChC,QAAQ,EAAE,SAAS,OAAO,EAAE,EAC5B,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACvC,cAAc,EAAE,CAQlB;AAED,wBAAgB,8BAA8B,CAC5C,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,OAAO,EACf,aAAa,EAAE,MAAM,GAAG,SAAS,EACjC,iBAAiB,EAAE,MAAM,EAAE,GAAG,SAAS,GACtC,MAAM,EAAE,GAAG,SAAS,CAStB;AAED,wBAAgB,8BAA8B,CAC5C,aAAa,EAAE,MAAM,GAAG,SAAS,EACjC,iBAAiB,EAAE,MAAM,EAAE,GAAG,SAAS,GACtC,MAAM,EAAE,GAAG,SAAS,CAoCtB;AAED,MAAM,MAAM,iBAAiB,GACzB;IAAE,OAAO,EAAE,IAAI,CAAA;CAAE,GACjB;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtC,MAAM,MAAM,kBAAkB,GAAG;IAC/B,4BAA4B,CAAC,EAAE,OAAO,CAAC;CACxC,CAAC;AAEF,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,iBAAiB,EAAE,MAAM,EAAE,GAAG,SAAS,EACvC,kBAAkB,EAAE,OAAO,EAC3B,OAAO,GAAE,kBAAuB,GAC/B,iBAAiB,CAsBnB"}
1
+ {"version":3,"file":"skill-policy-enforcement.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/runtime/skill-policy-enforcement.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAO1D,OAAO,EAEL,KAAK,wBAAwB,EAC9B,MAAM,iCAAiC,CAAC;AAIzC,eAAO,MAAM,kBAAkB,eAAe,CAAC;AAC/C,eAAO,MAAM,kBAAkB,eAAe,CAAC;AAC/C,eAAO,MAAM,oBAAoB,iBAAiB,CAAC;AACnD,eAAO,MAAM,gCAAgC,gCAAgC,CAAC;AAa9E,wBAAgB,mCAAmC,CACjD,QAAQ,EAAE,SAAS,OAAO,EAAE,GAC3B;IACD,aAAa,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,iBAAiB,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IACxC,8BAA8B,EAAE,wBAAwB,GAAG,SAAS,CAAC;CACtE,CAeA;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAIlE;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,EAAE,GAAG,SAAS,CAyBxE;AA2BD,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,GAAG,OAAO,CAQjF;AAED,wBAAgB,kCAAkC,CAChD,KAAK,EAAE,SAAS,cAAc,EAAE,EAChC,QAAQ,EAAE,SAAS,OAAO,EAAE,EAC5B,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACvC,cAAc,EAAE,CAQlB;AAED,wBAAgB,8BAA8B,CAC5C,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,OAAO,EACf,aAAa,EAAE,MAAM,GAAG,SAAS,EACjC,iBAAiB,EAAE,MAAM,EAAE,GAAG,SAAS,GACtC,MAAM,EAAE,GAAG,SAAS,CAStB;AAED,wBAAgB,8BAA8B,CAC5C,aAAa,EAAE,MAAM,GAAG,SAAS,EACjC,iBAAiB,EAAE,MAAM,EAAE,GAAG,SAAS,GACtC,MAAM,EAAE,GAAG,SAAS,CAoCtB;AAED,MAAM,MAAM,iBAAiB,GACzB;IAAE,OAAO,EAAE,IAAI,CAAA;CAAE,GACjB;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtC,MAAM,MAAM,kBAAkB,GAAG;IAC/B,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACjC,CAAC;AAEF,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,iBAAiB,EAAE,MAAM,EAAE,GAAG,SAAS,EACvC,kBAAkB,EAAE,OAAO,EAC3B,OAAO,GAAE,kBAAuB,GAC/B,iBAAiB,CA0BnB"}
@@ -130,9 +130,12 @@ export function enforceSkillPolicy(toolName, activeSkillPolicy, mustLoadSkillFir
130
130
  if (mustLoadSkillFirst && toolName !== LOAD_SKILL_TOOL_ID) {
131
131
  return { allowed: false, error: getSkillActivationRequiredError(toolName) };
132
132
  }
133
- if (toolName === FORM_INPUT_TOOL_ID &&
134
- options.allowSubmittedFormInputReuse === true) {
135
- return { allowed: true };
133
+ if (options.hasSubmittedFormInput === true &&
134
+ POST_SUBMITTED_FORM_INPUT_BLOCKED_TOOL_IDS.has(toolName)) {
135
+ return {
136
+ allowed: false,
137
+ error: `Tool "${toolName}" cannot run after a submitted form_input result exists. Continue with the submitted values.`,
138
+ };
136
139
  }
137
140
  if (activeSkillPolicy && !isToolAllowedBySkill(toolName, activeSkillPolicy)) {
138
141
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../../../../src/src/html/hydration-script-builder/templates/router.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,eAAe,cA+0B3B,CAAC"}
1
+ {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../../../../src/src/html/hydration-script-builder/templates/router.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,eAAe,cA+9B3B,CAAC"}
@@ -37,6 +37,7 @@ export const getRouterScript = () => `
37
37
  const PREFETCH_DELAY_MS = 100;
38
38
  const MAX_PREFETCH_PATHS = 100;
39
39
  const MAX_ROUTE_TIMINGS = 100;
40
+ const MAX_SERVER_TIMING_LENGTH = 1024;
40
41
 
41
42
  // ============================================
42
43
  // Debug logging (production-safe)
@@ -159,6 +160,139 @@ export const getRouterScript = () => `
159
160
  return entry;
160
161
  }
161
162
 
163
+ function sanitizeServerTimingHeader(value) {
164
+ if (!value) return null;
165
+
166
+ const metrics = [];
167
+ const printable = String(value).replace(/[^\\x20-\\x7E]/g, ' ').trim();
168
+ if (!printable) return null;
169
+
170
+ for (const item of printable.split(',')) {
171
+ const segments = item.split(';').map((segment) => segment.trim()).filter(Boolean);
172
+ const name = sanitizeServerTimingMetricName(segments[0]);
173
+ if (!name) continue;
174
+
175
+ for (const segment of segments.slice(1)) {
176
+ const [key, rawValue = ''] = segment.split('=');
177
+ if (key.trim().toLowerCase() !== 'dur') continue;
178
+
179
+ const duration = Number(rawValue.trim().replace(/^"|"$/g, ''));
180
+ if (!Number.isFinite(duration) || duration < 0) continue;
181
+
182
+ metrics.push(name + ';dur=' + (Math.round(duration * 100) / 100).toFixed(2));
183
+ break;
184
+ }
185
+ }
186
+
187
+ const sanitized = metrics.join(', ');
188
+ return sanitized ? sanitized.slice(0, MAX_SERVER_TIMING_LENGTH) : null;
189
+ }
190
+
191
+ function sanitizeServerTimingMetricName(name) {
192
+ return String(name || '').trim().replace(/[^A-Za-z0-9_.-]/g, '_').slice(0, 128);
193
+ }
194
+
195
+ function parseServerTimingMetrics(value) {
196
+ const header = sanitizeServerTimingHeader(value);
197
+ if (!header) return null;
198
+
199
+ const metrics = {};
200
+ for (const item of header.split(',')) {
201
+ const segments = item.split(';').map((segment) => segment.trim()).filter(Boolean);
202
+ const name = sanitizeServerTimingMetricName(segments[0]);
203
+ if (!name) continue;
204
+
205
+ for (const segment of segments.slice(1)) {
206
+ const [key, rawValue = ''] = segment.split('=');
207
+ if (key.trim().toLowerCase() !== 'dur') continue;
208
+
209
+ const duration = Number(rawValue.trim().replace(/^"|"$/g, ''));
210
+ if (Number.isFinite(duration) && duration >= 0) {
211
+ metrics[name] = Math.round(duration * 100) / 100;
212
+ }
213
+ }
214
+ }
215
+
216
+ return Object.keys(metrics).length ? metrics : null;
217
+ }
218
+
219
+ function readResponseServerTiming(response) {
220
+ try {
221
+ return sanitizeServerTimingHeader(response.headers?.get('server-timing'));
222
+ } catch (_) {
223
+ return null;
224
+ }
225
+ }
226
+
227
+ function roundRouteTimingValue(value) {
228
+ return Math.round(value * 100) / 100;
229
+ }
230
+
231
+ function extractResourceTiming(entry) {
232
+ const fields = [
233
+ 'startTime',
234
+ 'requestStart',
235
+ 'responseStart',
236
+ 'responseEnd',
237
+ 'duration',
238
+ 'transferSize',
239
+ 'encodedBodySize',
240
+ 'decodedBodySize'
241
+ ];
242
+ const timing = {};
243
+
244
+ for (const field of fields) {
245
+ const value = entry?.[field];
246
+ if (typeof value === 'number' && Number.isFinite(value) && value >= 0) {
247
+ timing[field] = roundRouteTimingValue(value);
248
+ }
249
+ }
250
+
251
+ return Object.keys(timing).length ? timing : null;
252
+ }
253
+
254
+ function getPageDataResourceTiming(endpoint, fetchStartedAt) {
255
+ try {
256
+ if (typeof performance === 'undefined' || typeof performance.getEntriesByName !== 'function') {
257
+ return null;
258
+ }
259
+
260
+ const href = new URL(endpoint, window.location.href).href;
261
+ const entries = performance.getEntriesByName(href, 'resource');
262
+ if (!entries.length) return null;
263
+
264
+ for (let index = entries.length - 1; index >= 0; index--) {
265
+ const entry = entries[index];
266
+ if (
267
+ typeof entry?.responseEnd === 'number' &&
268
+ Number.isFinite(entry.responseEnd) &&
269
+ entry.responseEnd + 1 >= fetchStartedAt
270
+ ) {
271
+ return extractResourceTiming(entry);
272
+ }
273
+ }
274
+
275
+ return null;
276
+ } catch (_) {
277
+ return null;
278
+ }
279
+ }
280
+
281
+ function buildPageDataTimingDetail(response, endpoint, fetchStartedAt, source) {
282
+ const detail = { source, status: response.status };
283
+ const serverTiming = readResponseServerTiming(response);
284
+ if (serverTiming) {
285
+ detail.serverTiming = serverTiming;
286
+ const serverTimingMetrics = parseServerTimingMetrics(serverTiming);
287
+ if (serverTimingMetrics) detail.serverTimingMetrics = serverTimingMetrics;
288
+ }
289
+
290
+ const resourceTiming = getPageDataResourceTiming(response.url || endpoint, fetchStartedAt);
291
+ if (resourceTiming) detail.resourceTiming = resourceTiming;
292
+
293
+ return detail;
294
+ }
295
+
162
296
  // ============================================
163
297
  // LRU Cache with TTL (single Map to prevent sync issues)
164
298
  // ============================================
@@ -320,7 +454,12 @@ export const getRouterScript = () => `
320
454
  if (!response.ok) {
321
455
  perfEnd('fetch:' + path);
322
456
  if (recordRouteTiming) {
323
- emitRouteTiming('page-data', path, startedAt, { source: timingSource, status: response.status });
457
+ emitRouteTiming(
458
+ 'page-data',
459
+ path,
460
+ startedAt,
461
+ buildPageDataTimingDetail(response, endpoint, startedAt, timingSource)
462
+ );
324
463
  }
325
464
  const error = new Error('Failed to fetch page data: ' + response.status);
326
465
  error.status = response.status;
@@ -332,7 +471,12 @@ export const getRouterScript = () => `
332
471
  perfEnd('parse:' + path);
333
472
  perfEnd('fetch:' + path);
334
473
  if (recordRouteTiming) {
335
- emitRouteTiming('page-data', path, startedAt, { source: timingSource, status: response.status });
474
+ emitRouteTiming(
475
+ 'page-data',
476
+ path,
477
+ startedAt,
478
+ buildPageDataTimingDetail(response, endpoint, startedAt, timingSource)
479
+ );
336
480
  }
337
481
 
338
482
  if (triggerReloadOnVersionMismatch) {
@@ -1 +1 @@
1
- {"version":3,"file":"api-store.d.ts","sourceRoot":"","sources":["../../../../../src/src/rendering/cache/stores/api-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAY7E,MAAM,WAAW,oBAAoB;IACnC,mCAAmC;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mDAAmD;IACnD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,sDAAsD;IACtD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,yDAAyD;IACzD,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAwBD,qBAAa,aAAc,YAAW,UAAU;IAC9C,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,kBAAkB,CAAsC;IAChE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA0B;IACrD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;gBAExB,OAAO,GAAE,oBAAyB;IAa9C,OAAO,CAAC,UAAU;IA4BlB,OAAO,CAAC,SAAS;IAoBjB,OAAO,CAAC,WAAW;IAqBb,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC;IAsBnD,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBpD,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAclC,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAuB/C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAKtB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAM9B,QAAQ,IAAI,eAAe;CAG5B"}
1
+ {"version":3,"file":"api-store.d.ts","sourceRoot":"","sources":["../../../../../src/src/rendering/cache/stores/api-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAY7E,MAAM,WAAW,oBAAoB;IACnC,mCAAmC;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mDAAmD;IACnD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,sDAAsD;IACtD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,yDAAyD;IACzD,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAwBD,qBAAa,aAAc,YAAW,UAAU;IAC9C,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,kBAAkB,CAAsC;IAChE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA0B;IACrD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;gBAExB,OAAO,GAAE,oBAAyB;IAa9C,OAAO,CAAC,UAAU;IA4BlB,OAAO,CAAC,SAAS;IAoBjB,OAAO,CAAC,WAAW;IAqBb,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC;IAsBnD,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBpD,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAclC,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAuB/C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAKtB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAM9B,QAAQ,IAAI,eAAe;CAG5B"}
@@ -111,15 +111,13 @@ export class APICacheStore {
111
111
  if (value.result.stream)
112
112
  return;
113
113
  await this.localCache?.set(key, value);
114
- void (async () => {
115
- try {
116
- const backend = await this.getBackend();
117
- await backend.set(key, this.serialize(value), this.ttlSeconds);
118
- }
119
- catch (error) {
120
- logger.debug("[APICacheStore] Failed to store in distributed cache (no fallback)", { key, error });
121
- }
122
- })();
114
+ try {
115
+ const backend = await this.getBackend();
116
+ await backend.set(key, this.serialize(value), this.ttlSeconds);
117
+ }
118
+ catch (error) {
119
+ logger.debug("[APICacheStore] Failed to store in distributed cache (no fallback)", { key, error });
120
+ }
123
121
  }
124
122
  async delete(key) {
125
123
  await this.localCache?.delete(key);
@@ -1,3 +1,3 @@
1
1
  /** Shared version value. */
2
- export declare const VERSION = "0.1.849";
2
+ export declare const VERSION = "0.1.851";
3
3
  //# sourceMappingURL=version-constant.d.ts.map
@@ -1,4 +1,4 @@
1
1
  // Keep in sync with deno.json version.
2
2
  // scripts/release.ts updates this constant during releases.
3
3
  /** Shared version value. */
4
- export const VERSION = "0.1.849";
4
+ export const VERSION = "0.1.851";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "veryfront",
3
- "version": "0.1.849",
3
+ "version": "0.1.851",
4
4
  "description": "The simplest way to build AI-powered apps",
5
5
  "keywords": [
6
6
  "react",