llmz 1.0.1 → 1.0.3

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 (55) hide show
  1. package/DOCS.md +8 -4
  2. package/ERRORS.md +5 -2
  3. package/dist/{component-BpMVZYOa.cjs → component-CMFoCHyu.cjs} +3 -3
  4. package/dist/{component-C27qu6Zv.js → component-DncqP4fB.js} +3 -3
  5. package/dist/context.d.ts +1 -1
  6. package/dist/{custom-client-MytucGI-.cjs → custom-client-BwRYQ4Oa.cjs} +37 -13
  7. package/dist/{custom-client-BDkgBR2w.js → custom-client-JcdoH-47.js} +37 -13
  8. package/dist/errors/catalog.d.ts +7 -0
  9. package/dist/{errors-IhnTKUp7.cjs → errors-C6ppQUZX.cjs} +22 -0
  10. package/dist/{errors-H4JJFH3S.js → errors-Crk5P8jo.js} +17 -1
  11. package/dist/errors.d.ts +6 -0
  12. package/dist/{execute-DLas4V2n.cjs → execute-DJBNrA2H.cjs} +209 -79
  13. package/dist/{execute-BYI_U5sR.js → execute-DoN74Exa.js} +209 -79
  14. package/dist/{exit-BUgJ5qi5.cjs → exit-BOtKWPuT.cjs} +2 -2
  15. package/dist/{exit-CPNk3vbz.js → exit-DMPwCSba.js} +2 -2
  16. package/dist/index.cjs +18 -17
  17. package/dist/index.d.ts +1 -1
  18. package/dist/index.js +18 -18
  19. package/dist/index.workerd.js +404 -88
  20. package/dist/inspection.d.ts +2 -0
  21. package/dist/{native-DvTH9vFe.js → native-BGW5kBlv.js} +136 -10
  22. package/dist/{native-Bm6L9zOb.cjs → native-sbuzbLbY.cjs} +136 -10
  23. package/dist/prompts/native-examples.d.ts +10 -0
  24. package/dist/prompts/native-examples.test.d.ts +1 -0
  25. package/dist/prompts/reasoning.d.ts +2 -0
  26. package/dist/prompts/reasoning.test.d.ts +1 -0
  27. package/dist/{quickjs-variant-DJwYDSsb.cjs → quickjs-variant-21IO97PF.cjs} +15 -8
  28. package/dist/{quickjs-variant-DlPi9-Sx.js → quickjs-variant-CtuGagsb.js} +10 -9
  29. package/dist/runtime/chat-completion.test.d.ts +1 -0
  30. package/dist/runtime/chat-last-speaker.test.d.ts +1 -0
  31. package/dist/runtime/empty-completion.test.d.ts +1 -0
  32. package/dist/runtime/execution-report.d.ts +3 -0
  33. package/dist/runtime/forced-inspection.d.ts +13 -0
  34. package/dist/runtime/forced-inspection.test.d.ts +1 -0
  35. package/dist/runtime/javascript-api.d.ts +3 -0
  36. package/dist/runtime/think-signal.test.d.ts +1 -0
  37. package/dist/runtime/tool-wrapper.d.ts +4 -2
  38. package/dist/runtime/types.d.ts +8 -0
  39. package/dist/{schema-DBkjo0b7.cjs → schema-CXlnbb3n.cjs} +1 -1
  40. package/dist/{schema-Aer_W7Al.js → schema-GE4ISPCR.js} +1 -1
  41. package/dist/session/messages.d.ts +2 -0
  42. package/dist/session/serialization.d.ts +2 -0
  43. package/dist/session/session.d.ts +4 -0
  44. package/dist/session/speaker.test.d.ts +1 -0
  45. package/dist/{tool--gK91eez.js → tool-DstssiAs.js} +4 -4
  46. package/dist/{tool-Da_F-N-5.cjs → tool-_wK9hQOb.cjs} +4 -4
  47. package/dist/{truncate-BSoH2-nY.js → truncate-BEKbdo3t.js} +1 -1
  48. package/dist/{truncate-nV3Mxr6-.cjs → truncate-uomAMGPs.cjs} +1 -1
  49. package/dist/types.d.ts +6 -0
  50. package/dist/{typings-C1ihexWE.cjs → typings-BA_XxAcY.cjs} +1 -1
  51. package/dist/{typings-D9_aC8aq.js → typings-BEVDvtuk.js} +1 -1
  52. package/dist/vm/types.d.ts +2 -0
  53. package/dist/{vm-8jxt8PTK.js → vm-C7SfutHn.js} +28 -3
  54. package/dist/{vm-XuVPuW3Y.cjs → vm-gmekHc0i.cjs} +28 -2
  55. package/package.json +2 -1
@@ -1,6 +1,7 @@
1
1
  import { Iteration } from '../context.js';
2
2
  import { type Tool } from '../tool.js';
3
- import type { TruncationPolicy } from '../truncate.js';
3
+ import { type TruncationPolicy } from '../truncate.js';
4
+ import type { ForcedInspection } from './forced-inspection.js';
4
5
  import { ExecutionHooks } from './types.js';
5
6
  type ToolWrapperProps = {
6
7
  tool: Tool;
@@ -11,6 +12,7 @@ type ToolWrapperProps = {
11
12
  onTruncation?: (value: unknown, policy: TruncationPolicy) => void;
12
13
  onResult?: (value: unknown) => void;
13
14
  controller: AbortController;
15
+ onThink?: (inspection: ForcedInspection) => void;
14
16
  };
15
- export declare function wrapTool({ tool, object, iteration, beforeHook, afterHook, onTruncation, onResult, controller, }: ToolWrapperProps): (input: any) => Promise<any>;
17
+ export declare function wrapTool({ tool, object, iteration, beforeHook, afterHook, onTruncation, onResult, controller, onThink, }: ToolWrapperProps): (input: any, line?: number) => Promise<any>;
16
18
  export {};
@@ -126,6 +126,14 @@ export type ExecutionHooks = {
126
126
  } | void>;
127
127
  };
128
128
  type Options = Partial<Pick<Context, 'loop' | 'timeout'>> & {
129
+ /**
130
+ * Require the assistant to be the last participant who spoke before the built-in
131
+ * ListenExit can complete. Defaults to true. Successful text and component delivery
132
+ * count across iterations and executions; events and tool results do not.
133
+ * Set false for intentionally silent chat handling. Custom exits and workers
134
+ * are unaffected. Rejection is recoverable within the remaining loop budget.
135
+ */
136
+ requireChatResponse?: boolean;
129
137
  /**
130
138
  * Optional cap on the model's context window, in tokens.
131
139
  * The effective limit is `min(maxTokens, smallest configured model input limit)`.
@@ -1,4 +1,4 @@
1
- const require_errors = require("./errors-IhnTKUp7.cjs");
1
+ const require_errors = require("./errors-C6ppQUZX.cjs");
2
2
  let _bpinternal_zui = require("@bpinternal/zui");
3
3
  //#region src/schema.ts
4
4
  const INPUT_SCHEMA_OPTIONS = {
@@ -1,4 +1,4 @@
1
- import { H as isLLMzError, b as InvalidConfigurationError } from "./errors-H4JJFH3S.js";
1
+ import { U as isLLMzError, b as InvalidConfigurationError } from "./errors-Crk5P8jo.js";
2
2
  import { transforms, z } from "@bpinternal/zui";
3
3
  //#region src/schema.ts
4
4
  const INPUT_SCHEMA_OPTIONS = {
@@ -10,6 +10,8 @@ export type AssistantResponse = {
10
10
  continuation?: unknown;
11
11
  };
12
12
  export declare function normalizeInput(message: SessionInput): SessionMessage;
13
+ /** Only actual participant content counts as speech, including image/audio-only messages. */
14
+ export declare function inputSpeaker(message: SessionMessage): 'user' | 'assistant' | null;
13
15
  export declare function createAssistantMessage(response: AssistantResponse): SessionMessage;
14
16
  export declare function validateInputMessage(message: CognitiveMessage): void;
15
17
  export declare function validateMessageContent(message: CognitiveMessage): void;
@@ -23,6 +23,8 @@ export type SessionState = {
23
23
  memory: SerializedMemory;
24
24
  pendingInputs: PendingInput[];
25
25
  activeTurn: boolean;
26
+ /** Acknowledged conversation speaker, independent of retained/compacted history. Absent in older snapshots. */
27
+ lastSpeaker?: 'user' | 'assistant' | null;
26
28
  latestResultId?: string;
27
29
  compaction?: false | Omit<CompactionOptions, 'summarize'>;
28
30
  };
@@ -45,6 +45,10 @@ export declare class Session {
45
45
  get messages(): SessionMessage[];
46
46
  /** Retained conversation plus queued input, preserving event and summary roles. Returns a detached copy. */
47
47
  get transcript(): SessionInput[];
48
+ /** Last participant who spoke in the active history. Events and queued inputs do not count. */
49
+ get lastSpeaker(): 'user' | 'assistant' | null;
50
+ /** Record acknowledged text or component delivery, never generation alone. */
51
+ recordAssistantDelivery(iterationId: string): void;
48
52
  get pendingMessages(): SessionMessage[];
49
53
  get hasActiveTurn(): boolean;
50
54
  get status(): 'idle' | 'pending' | 'active';
@@ -0,0 +1 @@
1
+ export {};
@@ -1,9 +1,9 @@
1
1
  import { F as isBuffer, I as isArguments, L as isPrototype, M as isTypedArray, R as isArrayLike, U as isArray, Y as __exportAll, c as isValidIdentifier, j as baseKeys, l as isZuiSchema, n as fromJSONSchemaCompat, s as isJsonSchema, x as _getTag_default } from "./utils-BOFzb8Ok.js";
2
- import { E as InvalidToolError, H as isLLMzError, I as ToolExecutionError, L as ToolInputError, V as isCriticalError, r as VMSignal } from "./errors-H4JJFH3S.js";
2
+ import { E as InvalidToolError, H as isCriticalError, L as ToolExecutionError, R as ToolInputError, U as isLLMzError, r as VMSignal } from "./errors-Crk5P8jo.js";
3
3
  import { t as uniq } from "./uniq-DfUeSNaX.js";
4
- import { i as toModelSchema, r as schemaInput, t as parseSchemaAsync } from "./schema-Aer_W7Al.js";
5
- import { i as unwrapTruncated, n as isTruncated } from "./truncate-BSoH2-nY.js";
6
- import { t as getTypings } from "./typings-D9_aC8aq.js";
4
+ import { i as toModelSchema, r as schemaInput, t as parseSchemaAsync } from "./schema-GE4ISPCR.js";
5
+ import { i as unwrapTruncated, n as isTruncated } from "./truncate-BEKbdo3t.js";
6
+ import { t as getTypings } from "./typings-BEVDvtuk.js";
7
7
  import { transforms, z } from "@bpinternal/zui";
8
8
  //#region ../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/isEmpty.js
9
9
  /** `Object#toString` result references. */
@@ -1,9 +1,9 @@
1
1
  const require_utils = require("./utils-CTlsXvdj.cjs");
2
- const require_errors = require("./errors-IhnTKUp7.cjs");
2
+ const require_errors = require("./errors-C6ppQUZX.cjs");
3
3
  const require_uniq = require("./uniq-DiXgysNV.cjs");
4
- const require_schema = require("./schema-DBkjo0b7.cjs");
5
- const require_truncate = require("./truncate-nV3Mxr6-.cjs");
6
- const require_typings = require("./typings-C1ihexWE.cjs");
4
+ const require_schema = require("./schema-CXlnbb3n.cjs");
5
+ const require_truncate = require("./truncate-uomAMGPs.cjs");
6
+ const require_typings = require("./typings-BA_XxAcY.cjs");
7
7
  let _bpinternal_zui = require("@bpinternal/zui");
8
8
  //#region ../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/isEmpty.js
9
9
  /** `Object#toString` result references. */
@@ -1,4 +1,4 @@
1
- import { b as InvalidConfigurationError } from "./errors-H4JJFH3S.js";
1
+ import { b as InvalidConfigurationError } from "./errors-Crk5P8jo.js";
2
2
  //#region src/truncate.ts
3
3
  const TRUNCATE_SIGNATURE = "llmz.truncate.v1";
4
4
  const DEFAULT_TOOL_RESULT_MAX_TOKENS = 2e3;
@@ -1,4 +1,4 @@
1
- const require_errors = require("./errors-IhnTKUp7.cjs");
1
+ const require_errors = require("./errors-C6ppQUZX.cjs");
2
2
  //#region src/truncate.ts
3
3
  const TRUNCATE_SIGNATURE = "llmz.truncate.v1";
4
4
  const DEFAULT_TOOL_RESULT_MAX_TOKENS = 2e3;
package/dist/types.d.ts CHANGED
@@ -35,6 +35,12 @@ export declare namespace Traces {
35
35
  duration: number;
36
36
  }>;
37
37
  type ThinkSignal = TraceTemplate<'think_signal', {
38
+ tool_name?: string;
39
+ tool_call_id?: string;
40
+ object?: string;
41
+ reason?: string;
42
+ context?: unknown;
43
+ metadata?: Record<string, unknown>;
38
44
  line: number;
39
45
  }>;
40
46
  type PropertyMutation = TraceTemplate<'property', {
@@ -1,5 +1,5 @@
1
1
  const require_utils = require("./utils-CTlsXvdj.cjs");
2
- const require_errors = require("./errors-IhnTKUp7.cjs");
2
+ const require_errors = require("./errors-C6ppQUZX.cjs");
3
3
  let _bpinternal_zui = require("@bpinternal/zui");
4
4
  //#region src/typings-formatter.ts
5
5
  /**
@@ -1,5 +1,5 @@
1
1
  import { Y as __exportAll, d as toPropertyKey, i as getMultilineComment, n as fromJSONSchemaCompat } from "./utils-BOFzb8Ok.js";
2
- import { b as InvalidConfigurationError, c as CodeFormattingError } from "./errors-H4JJFH3S.js";
2
+ import { b as InvalidConfigurationError, c as CodeFormattingError } from "./errors-Crk5P8jo.js";
3
3
  import { transforms, z } from "@bpinternal/zui";
4
4
  //#region src/typings-formatter.ts
5
5
  /**
@@ -5,6 +5,7 @@ import type { Trace, VMExecutionResult } from '../types.js';
5
5
  /** Host-only lifecycle hook; symbols are not copied into the generated program's globals. */
6
6
  export declare const VM_PROGRAM_COMPLETE: unique symbol;
7
7
  export declare const VM_TERMINATION: unique symbol;
8
+ export declare const VM_CALL_SITE: unique symbol;
8
9
  export declare const VM_ON_ERROR: unique symbol;
9
10
  export type VMTermination = {
10
11
  isTerminated(): boolean;
@@ -13,6 +14,7 @@ export type VMTermination = {
13
14
  getSignal?(): VMSignal | undefined;
14
15
  };
15
16
  export type VMContext = Record<string, any> & {
17
+ [VM_CALL_SITE]?: () => number | undefined;
16
18
  [VM_ON_ERROR]?: (error: LLMzFailure) => void;
17
19
  [VM_PROGRAM_COMPLETE]?: () => void;
18
20
  [VM_TERMINATION]?: VMTermination;
@@ -1,6 +1,6 @@
1
1
  import { A as keys, B as baseAssignValue, J as __commonJSMin, V as isFunction, W as isSymbol, h as baseIteratee } from "./utils-BOFzb8Ok.js";
2
- import { B as UnknownToolError, H as isLLMzError, N as ReservedIdentifierError, o as AssignmentError, r as VMSignal, s as CodeExecutionError, t as Signals, v as InvalidCodeError } from "./errors-H4JJFH3S.js";
3
- import { a as cloneMemoryValue, d as TERMINATION_BINDING_NAMES, l as RESERVED_RUNTIME_NAMES, n as getQuickJSVariant, o as decodeMemoryValue, u as RUNTIME_BINDING_NAMES } from "./quickjs-variant-DlPi9-Sx.js";
2
+ import { P as ReservedIdentifierError, U as isLLMzError, V as UnknownToolError, o as AssignmentError, r as VMSignal, s as CodeExecutionError, t as Signals, v as InvalidCodeError } from "./errors-Crk5P8jo.js";
3
+ import { a as cloneMemoryValue, d as TERMINATION_BINDING_NAMES, l as RESERVED_RUNTIME_NAMES, n as getQuickJSVariant, o as decodeMemoryValue, u as RUNTIME_BINDING_NAMES } from "./quickjs-variant-CtuGagsb.js";
4
4
  import MagicString from "magic-string";
5
5
  import { parse } from "acorn";
6
6
  import { newQuickJSWASMModuleFromVariant, shouldInterruptAfterDeadline } from "quickjs-emscripten-core";
@@ -2994,6 +2994,7 @@ function formatError(err, lines, matches, traces, variables, lines_executed, cod
2994
2994
  /** Host-only lifecycle hook; symbols are not copied into the generated program's globals. */
2995
2995
  const VM_PROGRAM_COMPLETE = Symbol("llmz.programComplete");
2996
2996
  const VM_TERMINATION = Symbol("llmz.termination");
2997
+ const VM_CALL_SITE = Symbol("llmz.callSite");
2997
2998
  const VM_ON_ERROR = Symbol("llmz.onError");
2998
2999
  //#endregion
2999
3000
  //#region src/vm/instrument.ts
@@ -3121,6 +3122,16 @@ var NodeDriver = class {
3121
3122
  async execute(ctx) {
3122
3123
  const { transformed, consumer, context, traces, recordTrace, code, lines_executed, variables } = ctx;
3123
3124
  const state = instrumentContext(context, transformed, recordTrace, variables, lines_executed, consumer, findUserCodeStartLine(transformed), ctx.memoryNames);
3125
+ context[VM_CALL_SITE] = () => {
3126
+ var _Error$stack;
3127
+ const frame = (_Error$stack = (/* @__PURE__ */ new Error()).stack) === null || _Error$stack === void 0 ? void 0 : _Error$stack.match(/<anonymous>:(\d+):(\d+)/);
3128
+ if (!frame) return;
3129
+ const position = consumer.originalPositionFor({
3130
+ line: Number(frame[1]) - 1,
3131
+ column: Number(frame[2])
3132
+ });
3133
+ return position.line ? Math.max(1, position.line - 3) : void 0;
3134
+ };
3124
3135
  const AsyncFunction = async function() {}.constructor;
3125
3136
  return finalizeMemoryCapture(await (async () => {
3126
3137
  const descriptors = Object.getOwnPropertyDescriptors(context);
@@ -3273,6 +3284,20 @@ var QuickJSDriver = class {
3273
3284
  const disposeIfNeeded = (handle) => {
3274
3285
  if (handle !== vm.true && handle !== vm.false && handle !== vm.null && handle !== vm.undefined) handle.dispose();
3275
3286
  };
3287
+ context[VM_CALL_SITE] = () => {
3288
+ const stack = vm.evalCode("new Error().stack");
3289
+ if ("error" in stack) {
3290
+ var _stack$error;
3291
+ (_stack$error = stack.error) === null || _stack$error === void 0 || _stack$error.dispose();
3292
+ return;
3293
+ }
3294
+ try {
3295
+ const frame = vm.getString(stack.value).match(/<quickjs>:(\d+)/);
3296
+ return frame ? Math.max(1, Number(frame[1]) - 9 - userCodeStartLine + 1) : void 0;
3297
+ } finally {
3298
+ stack.value.dispose();
3299
+ }
3300
+ };
3276
3301
  const bridgeFunction = (fn, _fnName = "anonymous") => {
3277
3302
  return (...argHandles) => {
3278
3303
  const args = argHandles.map((h) => vm.dump(h));
@@ -3956,4 +3981,4 @@ async function runAsyncFunction(context, code, traces = [], signal = null, timeo
3956
3981
  });
3957
3982
  }
3958
3983
  //#endregion
3959
- export { compile as a, VM_TERMINATION as i, VM_ON_ERROR as n, VM_PROGRAM_COMPLETE as r, runAsyncFunction, withMissingMember as t };
3984
+ export { VM_TERMINATION as a, VM_PROGRAM_COMPLETE as i, VM_CALL_SITE as n, compile as o, VM_ON_ERROR as r, runAsyncFunction, withMissingMember as t };
@@ -1,6 +1,6 @@
1
1
  const require_utils = require("./utils-CTlsXvdj.cjs");
2
- const require_errors = require("./errors-IhnTKUp7.cjs");
3
- const require_quickjs_variant = require("./quickjs-variant-DJwYDSsb.cjs");
2
+ const require_errors = require("./errors-C6ppQUZX.cjs");
3
+ const require_quickjs_variant = require("./quickjs-variant-21IO97PF.cjs");
4
4
  let magic_string = require("magic-string");
5
5
  magic_string = require_utils.__toESM(magic_string, 1);
6
6
  let acorn = require("acorn");
@@ -2995,6 +2995,7 @@ function formatError(err, lines, matches, traces, variables, lines_executed, cod
2995
2995
  /** Host-only lifecycle hook; symbols are not copied into the generated program's globals. */
2996
2996
  const VM_PROGRAM_COMPLETE = Symbol("llmz.programComplete");
2997
2997
  const VM_TERMINATION = Symbol("llmz.termination");
2998
+ const VM_CALL_SITE = Symbol("llmz.callSite");
2998
2999
  const VM_ON_ERROR = Symbol("llmz.onError");
2999
3000
  //#endregion
3000
3001
  //#region src/vm/instrument.ts
@@ -3122,6 +3123,16 @@ var NodeDriver = class {
3122
3123
  async execute(ctx) {
3123
3124
  const { transformed, consumer, context, traces, recordTrace, code, lines_executed, variables } = ctx;
3124
3125
  const state = instrumentContext(context, transformed, recordTrace, variables, lines_executed, consumer, findUserCodeStartLine(transformed), ctx.memoryNames);
3126
+ context[VM_CALL_SITE] = () => {
3127
+ var _Error$stack;
3128
+ const frame = (_Error$stack = (/* @__PURE__ */ new Error()).stack) === null || _Error$stack === void 0 ? void 0 : _Error$stack.match(/<anonymous>:(\d+):(\d+)/);
3129
+ if (!frame) return;
3130
+ const position = consumer.originalPositionFor({
3131
+ line: Number(frame[1]) - 1,
3132
+ column: Number(frame[2])
3133
+ });
3134
+ return position.line ? Math.max(1, position.line - 3) : void 0;
3135
+ };
3125
3136
  const AsyncFunction = async function() {}.constructor;
3126
3137
  return finalizeMemoryCapture(await (async () => {
3127
3138
  const descriptors = Object.getOwnPropertyDescriptors(context);
@@ -3274,6 +3285,20 @@ var QuickJSDriver = class {
3274
3285
  const disposeIfNeeded = (handle) => {
3275
3286
  if (handle !== vm.true && handle !== vm.false && handle !== vm.null && handle !== vm.undefined) handle.dispose();
3276
3287
  };
3288
+ context[VM_CALL_SITE] = () => {
3289
+ const stack = vm.evalCode("new Error().stack");
3290
+ if ("error" in stack) {
3291
+ var _stack$error;
3292
+ (_stack$error = stack.error) === null || _stack$error === void 0 || _stack$error.dispose();
3293
+ return;
3294
+ }
3295
+ try {
3296
+ const frame = vm.getString(stack.value).match(/<quickjs>:(\d+)/);
3297
+ return frame ? Math.max(1, Number(frame[1]) - 9 - userCodeStartLine + 1) : void 0;
3298
+ } finally {
3299
+ stack.value.dispose();
3300
+ }
3301
+ };
3277
3302
  const bridgeFunction = (fn, _fnName = "anonymous") => {
3278
3303
  return (...argHandles) => {
3279
3304
  const args = argHandles.map((h) => vm.dump(h));
@@ -3957,6 +3982,7 @@ async function runAsyncFunction(context, code, traces = [], signal = null, timeo
3957
3982
  });
3958
3983
  }
3959
3984
  //#endregion
3985
+ exports.VM_CALL_SITE = VM_CALL_SITE;
3960
3986
  exports.VM_ON_ERROR = VM_ON_ERROR;
3961
3987
  exports.VM_PROGRAM_COMPLETE = VM_PROGRAM_COMPLETE;
3962
3988
  exports.VM_TERMINATION = VM_TERMINATION;
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "llmz",
3
3
  "type": "module",
4
4
  "description": "LLMz - An LLM-native Typescript VM built on top of Zui",
5
- "version": "1.0.1",
5
+ "version": "1.0.3",
6
6
  "files": [
7
7
  "dist",
8
8
  "DOCS.md",
@@ -30,6 +30,7 @@
30
30
  "watch": "tsdown --watch",
31
31
  "test": "vitest --run",
32
32
  "test:e2e": "pnpm check:e2e:type && vitest run --config vitest.e2e.config.ts",
33
+ "test:e2e:quarantine": "vitest run --config vitest.quarantine.config.ts production-chat",
33
34
  "test:e2e:update": "vitest -u run --config vitest.e2e.config.ts",
34
35
  "test:e2e:watch": "vitest --config vitest.e2e.config.ts",
35
36
  "check:format": "oxfmt --check .",