@meistrari/chat-nuxt 4.3.0 → 4.4.0-rc.1

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/dist/module.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@meistrari/chat-nuxt",
3
3
  "configKey": "chatNuxt",
4
- "version": "4.3.0-rc.1",
4
+ "version": "4.4.0-rc.1",
5
5
  "builder": {
6
6
  "@nuxt/module-builder": "1.0.2",
7
7
  "unbuild": "unknown"
@@ -4,3 +4,9 @@ export declare const AGENT_API_V5_CONFIG_KEY = "agent-api-v5";
4
4
  export declare const CONVERSATION_V2_CONFIG_KEY = "conversation-v2";
5
5
  export declare const PRE_WAKE_CACHE_CONFIG_KEY = "pre-wake-cache";
6
6
  export declare const ROUTE_CLAUDE_VIA_GATEWAY_CONFIG_KEY = "route-claude-via-gateway";
7
+ export type ChatHarness = 'claude' | 'lightweight';
8
+ export type ChatConfig = {
9
+ harness?: ChatHarness;
10
+ [key: string]: boolean | ChatHarness | undefined;
11
+ };
12
+ export declare function resolveChatHarness(config?: Pick<ChatConfig, 'harness'>): ChatHarness;
@@ -4,3 +4,6 @@ export const AGENT_API_V5_CONFIG_KEY = 'agent-api-v5';
4
4
  export const CONVERSATION_V2_CONFIG_KEY = 'conversation-v2';
5
5
  export const PRE_WAKE_CACHE_CONFIG_KEY = 'pre-wake-cache';
6
6
  export const ROUTE_CLAUDE_VIA_GATEWAY_CONFIG_KEY = 'route-claude-via-gateway';
7
+ export function resolveChatHarness(config) {
8
+ return config?.harness === 'lightweight' ? 'lightweight' : 'claude';
9
+ }
@@ -23,6 +23,7 @@ export declare const conversationWakeStateSchema: z.ZodEnum<{
23
23
  ready: "ready";
24
24
  stale: "stale";
25
25
  checking: "checking";
26
+ not_required: "not_required";
26
27
  }>;
27
28
  export type ConversationWakeState = z.infer<typeof conversationWakeStateSchema>;
28
29
  export declare const wakeConversationResponseSchema: z.ZodObject<{
@@ -33,6 +34,7 @@ export declare const wakeConversationResponseSchema: z.ZodObject<{
33
34
  ready: "ready";
34
35
  stale: "stale";
35
36
  checking: "checking";
37
+ not_required: "not_required";
36
38
  }>;
37
39
  sessionId: z.ZodNullable<z.ZodString>;
38
40
  error: z.ZodNullable<z.ZodString>;
@@ -15,7 +15,7 @@ export const turnRuntimeStateNameSchema = z.enum([
15
15
  'failed',
16
16
  'cancelled',
17
17
  ]);
18
- export const conversationWakeStateSchema = z.enum(['stale', 'checking', 'waking', 'ready', 'parked', 'failed']);
18
+ export const conversationWakeStateSchema = z.enum(['stale', 'checking', 'waking', 'ready', 'not_required', 'parked', 'failed']);
19
19
  export const wakeConversationResponseSchema = z.object({
20
20
  state: conversationWakeStateSchema,
21
21
  sessionId: z.string().nullable(),
@@ -260,6 +260,29 @@ export declare const createConversationRequestSchema: z.ZodObject<{
260
260
  }, z.core.$strip>], "type">>>;
261
261
  }, z.core.$strict>;
262
262
  export type CreateConversationRequest = z.infer<typeof createConversationRequestSchema>;
263
+ /** Request contract when x-chat-config selects harness: lightweight. Availability is workspace-scoped. */
264
+ export declare const createLightweightConversationRequestSchema: z.ZodObject<{
265
+ reasoningEffort: z.ZodOptional<z.ZodNullable<z.ZodEnum<{
266
+ low: "low";
267
+ medium: "medium";
268
+ high: "high";
269
+ xhigh: "xhigh";
270
+ max: "max";
271
+ }>>>;
272
+ agentInputs: z.ZodOptional<z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{
273
+ type: z.ZodLiteral<"file">;
274
+ name: z.ZodString;
275
+ vaultRef: z.ZodString;
276
+ filename: z.ZodString;
277
+ metadata: z.ZodOptional<z.ZodString>;
278
+ }, z.core.$strip>, z.ZodObject<{
279
+ type: z.ZodLiteral<"text">;
280
+ name: z.ZodString;
281
+ content: z.ZodString;
282
+ }, z.core.$strip>], "type">>>;
283
+ model: z.ZodOptional<z.ZodNullable<z.ZodString>>;
284
+ }, z.core.$strict>;
285
+ export type CreateLightweightConversationRequest = z.infer<typeof createLightweightConversationRequestSchema>;
263
286
  export declare const conversationEventSchema: z.ZodObject<{
264
287
  id: z.ZodString;
265
288
  conversationId: z.ZodString;
@@ -427,6 +450,19 @@ export declare const updateConversationRequestSchema: z.ZodObject<{
427
450
  }>>>;
428
451
  }, z.core.$strict>;
429
452
  export type UpdateConversationRequest = z.infer<typeof updateConversationRequestSchema>;
453
+ /** Request contract when x-chat-config selects harness: lightweight. Claude keeps its existing model enum. */
454
+ export declare const updateLightweightConversationRequestSchema: z.ZodObject<{
455
+ title: z.ZodOptional<z.ZodString>;
456
+ reasoningEffort: z.ZodOptional<z.ZodNullable<z.ZodEnum<{
457
+ low: "low";
458
+ medium: "medium";
459
+ high: "high";
460
+ xhigh: "xhigh";
461
+ max: "max";
462
+ }>>>;
463
+ model: z.ZodOptional<z.ZodNullable<z.ZodString>>;
464
+ }, z.core.$strict>;
465
+ export type UpdateLightweightConversationRequest = z.infer<typeof updateLightweightConversationRequestSchema>;
430
466
  export declare const moveConversationRequestSchema: z.ZodObject<{
431
467
  groupId: z.ZodNullable<z.ZodString>;
432
468
  }, z.core.$strip>;
@@ -2,6 +2,7 @@ import { z } from 'zod';
2
2
  import { telaAgentExecutionInputSchema } from '../integrations/tela-agent-api';
3
3
  import { messageFileSchema } from './files';
4
4
  import { chatModelSchema, chatReasoningEffortSchema } from './models';
5
+ import { chatModelSchema as lightweightModelSchema } from './lightweight-models';
5
6
  import { conversationCreatorFilterSchema, messageRoleSchema, messageStatusSchema, } from './primitives';
6
7
  import { resolvedWorkspaceSettingsSchema } from './workspace-settings';
7
8
  export const conversationSchema = z.object({
@@ -64,6 +65,10 @@ export const createConversationRequestSchema = z.strictObject({
64
65
  reasoningEffort: chatReasoningEffortSchema.nullable().optional(),
65
66
  agentInputs: z.array(telaAgentExecutionInputSchema).optional(),
66
67
  });
68
+ /** Request contract when x-chat-config selects harness: lightweight. Availability is workspace-scoped. */
69
+ export const createLightweightConversationRequestSchema = createConversationRequestSchema.extend({
70
+ model: lightweightModelSchema.nullable().optional(),
71
+ });
67
72
  export const conversationEventSchema = z.object({
68
73
  id: z.string(),
69
74
  conversationId: z.string(),
@@ -105,6 +110,10 @@ export const updateConversationRequestSchema = z.strictObject({
105
110
  model: chatModelSchema.nullable().optional(),
106
111
  reasoningEffort: chatReasoningEffortSchema.nullable().optional(),
107
112
  });
113
+ /** Request contract when x-chat-config selects harness: lightweight. Claude keeps its existing model enum. */
114
+ export const updateLightweightConversationRequestSchema = updateConversationRequestSchema.extend({
115
+ model: lightweightModelSchema.nullable().optional(),
116
+ });
108
117
  export const moveConversationRequestSchema = z.object({
109
118
  groupId: z.string().nullable(),
110
119
  });
@@ -0,0 +1,126 @@
1
+ import { z } from 'zod';
2
+ export declare const chatModelSchema: z.ZodString;
3
+ export type ChatModel = z.infer<typeof chatModelSchema>;
4
+ export declare const chatModelCatalogEntrySchema: z.ZodObject<{
5
+ id: z.ZodString;
6
+ name: z.ZodString;
7
+ vendor: z.ZodString;
8
+ harness: z.ZodEnum<{
9
+ claude: "claude";
10
+ lightweight: "lightweight";
11
+ codex: "codex";
12
+ }>;
13
+ provider: z.ZodString;
14
+ providerOptions: z.ZodArray<z.ZodEnum<{
15
+ bedrock: "bedrock";
16
+ vertex: "vertex";
17
+ anthropic: "anthropic";
18
+ }>>;
19
+ contextWindow: z.ZodNumber;
20
+ maxOutputTokens: z.ZodNullable<z.ZodNumber>;
21
+ inputModalities: z.ZodArray<z.ZodEnum<{
22
+ file: "file";
23
+ text: "text";
24
+ image: "image";
25
+ audio: "audio";
26
+ video: "video";
27
+ }>>;
28
+ tier: z.ZodNumber;
29
+ pricing: z.ZodNullable<z.ZodObject<{
30
+ promptPerMillion: z.ZodNumber;
31
+ completionPerMillion: z.ZodNumber;
32
+ inputCacheReadPerMillion: z.ZodOptional<z.ZodNumber>;
33
+ inputCacheWritePerMillion: z.ZodOptional<z.ZodNumber>;
34
+ }, z.core.$strip>>;
35
+ status: z.ZodEnum<{
36
+ available: "available";
37
+ deprecated: "deprecated";
38
+ }>;
39
+ aliasOf: z.ZodNullable<z.ZodString>;
40
+ isDefault: z.ZodBoolean;
41
+ }, z.core.$strip>;
42
+ export type ChatModelCatalogEntry = z.infer<typeof chatModelCatalogEntrySchema>;
43
+ export declare const chatModelCatalogResponseSchema: z.ZodObject<{
44
+ success: z.ZodLiteral<true>;
45
+ models: z.ZodArray<z.ZodObject<{
46
+ id: z.ZodString;
47
+ name: z.ZodString;
48
+ vendor: z.ZodString;
49
+ harness: z.ZodEnum<{
50
+ claude: "claude";
51
+ lightweight: "lightweight";
52
+ codex: "codex";
53
+ }>;
54
+ provider: z.ZodString;
55
+ providerOptions: z.ZodArray<z.ZodEnum<{
56
+ bedrock: "bedrock";
57
+ vertex: "vertex";
58
+ anthropic: "anthropic";
59
+ }>>;
60
+ contextWindow: z.ZodNumber;
61
+ maxOutputTokens: z.ZodNullable<z.ZodNumber>;
62
+ inputModalities: z.ZodArray<z.ZodEnum<{
63
+ file: "file";
64
+ text: "text";
65
+ image: "image";
66
+ audio: "audio";
67
+ video: "video";
68
+ }>>;
69
+ tier: z.ZodNumber;
70
+ pricing: z.ZodNullable<z.ZodObject<{
71
+ promptPerMillion: z.ZodNumber;
72
+ completionPerMillion: z.ZodNumber;
73
+ inputCacheReadPerMillion: z.ZodOptional<z.ZodNumber>;
74
+ inputCacheWritePerMillion: z.ZodOptional<z.ZodNumber>;
75
+ }, z.core.$strip>>;
76
+ status: z.ZodEnum<{
77
+ available: "available";
78
+ deprecated: "deprecated";
79
+ }>;
80
+ aliasOf: z.ZodNullable<z.ZodString>;
81
+ isDefault: z.ZodBoolean;
82
+ }, z.core.$strip>>;
83
+ }, z.core.$strip>;
84
+ export declare const chatModelsResponseSchema: z.ZodObject<{
85
+ models: z.ZodArray<z.ZodObject<{
86
+ id: z.ZodString;
87
+ name: z.ZodString;
88
+ vendor: z.ZodString;
89
+ harness: z.ZodEnum<{
90
+ claude: "claude";
91
+ lightweight: "lightweight";
92
+ codex: "codex";
93
+ }>;
94
+ provider: z.ZodString;
95
+ providerOptions: z.ZodArray<z.ZodEnum<{
96
+ bedrock: "bedrock";
97
+ vertex: "vertex";
98
+ anthropic: "anthropic";
99
+ }>>;
100
+ contextWindow: z.ZodNumber;
101
+ maxOutputTokens: z.ZodNullable<z.ZodNumber>;
102
+ inputModalities: z.ZodArray<z.ZodEnum<{
103
+ file: "file";
104
+ text: "text";
105
+ image: "image";
106
+ audio: "audio";
107
+ video: "video";
108
+ }>>;
109
+ tier: z.ZodNumber;
110
+ pricing: z.ZodNullable<z.ZodObject<{
111
+ promptPerMillion: z.ZodNumber;
112
+ completionPerMillion: z.ZodNumber;
113
+ inputCacheReadPerMillion: z.ZodOptional<z.ZodNumber>;
114
+ inputCacheWritePerMillion: z.ZodOptional<z.ZodNumber>;
115
+ }, z.core.$strip>>;
116
+ status: z.ZodEnum<{
117
+ available: "available";
118
+ deprecated: "deprecated";
119
+ }>;
120
+ aliasOf: z.ZodNullable<z.ZodString>;
121
+ isDefault: z.ZodBoolean;
122
+ }, z.core.$strip>>;
123
+ }, z.core.$strip>;
124
+ export declare function isValidChatModel(value: unknown): value is ChatModel;
125
+ export { chatReasoningEffortSchema, chatReasoningEffortValues, isValidChatReasoningEffort } from './models';
126
+ export type { ChatReasoningEffort } from './models';
@@ -0,0 +1,34 @@
1
+ import { z } from 'zod';
2
+ export const chatModelSchema = z.string().trim().min(1);
3
+ export const chatModelCatalogEntrySchema = z.object({
4
+ id: chatModelSchema,
5
+ name: z.string().min(1),
6
+ vendor: z.string().min(1),
7
+ harness: z.enum(['claude', 'codex', 'lightweight']),
8
+ provider: z.string().min(1),
9
+ providerOptions: z.array(z.enum(['bedrock', 'vertex', 'anthropic'])),
10
+ contextWindow: z.number().int().positive(),
11
+ maxOutputTokens: z.number().int().positive().nullable(),
12
+ inputModalities: z.array(z.enum(['text', 'image', 'file', 'audio', 'video'])),
13
+ tier: z.number().int().min(1).max(5),
14
+ pricing: z.object({
15
+ promptPerMillion: z.number().nonnegative(),
16
+ completionPerMillion: z.number().nonnegative(),
17
+ inputCacheReadPerMillion: z.number().nonnegative().optional(),
18
+ inputCacheWritePerMillion: z.number().nonnegative().optional(),
19
+ }).nullable(),
20
+ status: z.enum(['available', 'deprecated']),
21
+ aliasOf: chatModelSchema.nullable(),
22
+ isDefault: z.boolean(),
23
+ });
24
+ export const chatModelCatalogResponseSchema = z.object({
25
+ success: z.literal(true),
26
+ models: z.array(chatModelCatalogEntrySchema),
27
+ });
28
+ export const chatModelsResponseSchema = z.object({
29
+ models: z.array(chatModelCatalogEntrySchema),
30
+ });
31
+ export function isValidChatModel(value) {
32
+ return chatModelSchema.safeParse(value).success;
33
+ }
34
+ export { chatReasoningEffortSchema, chatReasoningEffortValues, isValidChatReasoningEffort } from './models';
@@ -5,6 +5,8 @@ export * from './chat/credentials';
5
5
  export * from './chat/external-skills';
6
6
  export * from './chat/files';
7
7
  export * from './chat/github';
8
+ export { chatModelCatalogEntrySchema, chatModelCatalogResponseSchema, chatModelsResponseSchema, isValidChatModel as isValidLightweightChatModel, chatModelSchema as lightweightChatModelSchema, } from './chat/lightweight-models';
9
+ export type { ChatModelCatalogEntry, ChatModel as LightweightChatModel } from './chat/lightweight-models';
8
10
  export * from './chat/messages';
9
11
  export * from './chat/models';
10
12
  export * from './chat/primitives';
@@ -14,6 +16,7 @@ export * from './chat/usage';
14
16
  export * from './chat/workspace-agent';
15
17
  export * from './chat/workspace-settings';
16
18
  export * from './integrations/agent-api';
19
+ export * from './integrations/lightweight';
17
20
  export * from './integrations/tela-agent-api';
18
21
  export * from './integrations/tela-api';
19
22
  export * from './tools/canvas';
@@ -5,6 +5,7 @@ export * from './chat/credentials';
5
5
  export * from './chat/external-skills';
6
6
  export * from './chat/files';
7
7
  export * from './chat/github';
8
+ export { chatModelCatalogEntrySchema, chatModelCatalogResponseSchema, chatModelsResponseSchema, isValidChatModel as isValidLightweightChatModel, chatModelSchema as lightweightChatModelSchema, } from './chat/lightweight-models';
8
9
  export * from './chat/messages';
9
10
  export * from './chat/models';
10
11
  export * from './chat/primitives';
@@ -14,6 +15,7 @@ export * from './chat/usage';
14
15
  export * from './chat/workspace-agent';
15
16
  export * from './chat/workspace-settings';
16
17
  export * from './integrations/agent-api';
18
+ export * from './integrations/lightweight';
17
19
  export * from './integrations/tela-agent-api';
18
20
  export * from './integrations/tela-api';
19
21
  export * from './tools/canvas';
@@ -0,0 +1,17 @@
1
+ import type { MessageFile } from '../chat/files';
2
+ import type { ReasoningItem } from './agent-api';
3
+ export declare function lightweightFiles(value: unknown): MessageFile[];
4
+ export declare function createLightweightTurn(runId: string, sessionId: string): {
5
+ runId: string;
6
+ sessionId: string;
7
+ lastSequence: number;
8
+ text: string;
9
+ pendingText: string;
10
+ thinking: string;
11
+ reasoning: ReasoningItem[];
12
+ toolFiles: MessageFile[];
13
+ files: MessageFile[];
14
+ };
15
+ export type LightweightTurn = ReturnType<typeof createLightweightTurn>;
16
+ export declare function applyLightweightPart(state: LightweightTurn, part: Record<string, unknown>, sequence: number, timestamp: number): boolean;
17
+ export declare function lightweightThreadReasoning(sessionId: string, runId: string, events: Record<string, unknown>[]): ReasoningItem[];
@@ -0,0 +1,135 @@
1
+ function isRecord(value) {
2
+ return value !== null && typeof value === 'object' && !Array.isArray(value);
3
+ }
4
+ function stringify(value) {
5
+ return typeof value === 'string' ? value : JSON.stringify(value) ?? '';
6
+ }
7
+ function argumentsOf(value) {
8
+ if (isRecord(value))
9
+ return value;
10
+ if (typeof value === 'string') {
11
+ try {
12
+ const parsed = JSON.parse(value);
13
+ if (isRecord(parsed))
14
+ return parsed;
15
+ }
16
+ catch { }
17
+ }
18
+ return { value };
19
+ }
20
+ function reasoningItem(sessionId, uuid, content, timestamp, role = 'assistant') {
21
+ return { type: role, uuid, message: { role, content: [content] }, timestamp, session_id: sessionId, timeElapsed: 0, parent_tool_use_id: null };
22
+ }
23
+ export function lightweightFiles(value) {
24
+ const files = new Map();
25
+ function visit(candidate, name) {
26
+ if (Array.isArray(candidate)) {
27
+ for (const item of candidate)
28
+ visit(item, name);
29
+ }
30
+ else if (isRecord(candidate)) {
31
+ const fileName = candidate.fileName ?? candidate.filename ?? candidate.name;
32
+ for (const item of Object.values(candidate))
33
+ visit(item, typeof fileName === 'string' ? fileName : name);
34
+ }
35
+ else if (typeof candidate === 'string') {
36
+ try {
37
+ const parsed = JSON.parse(candidate);
38
+ if (typeof parsed !== 'string') {
39
+ visit(parsed, name);
40
+ return;
41
+ }
42
+ }
43
+ catch { }
44
+ for (const match of candidate.matchAll(/vault:\/\/[^\s"'`<>)}\]]+/g)) {
45
+ const url = match[0].replace(/[.,;:!?]+$/, '');
46
+ const existing = files.get(url);
47
+ files.set(url, { url, name: name ?? existing?.name ?? url.split('/').at(-1) ?? 'attachment', source: 'assistant' });
48
+ }
49
+ }
50
+ }
51
+ visit(value);
52
+ return [...files.values()];
53
+ }
54
+ export function createLightweightTurn(runId, sessionId) {
55
+ return {
56
+ runId,
57
+ sessionId,
58
+ lastSequence: -1,
59
+ text: '',
60
+ pendingText: '',
61
+ thinking: '',
62
+ reasoning: [],
63
+ toolFiles: [],
64
+ files: [],
65
+ };
66
+ }
67
+ function upsertReasoning(state, item) {
68
+ const index = state.reasoning.findIndex(existing => existing.uuid === item.uuid);
69
+ if (index < 0)
70
+ state.reasoning.push(item);
71
+ else
72
+ state.reasoning[index] = item;
73
+ }
74
+ export function applyLightweightPart(state, part, sequence, timestamp) {
75
+ if (sequence <= state.lastSequence)
76
+ return false;
77
+ state.lastSequence = sequence;
78
+ const delta = typeof part.delta === 'string' ? part.delta : typeof part.text === 'string' ? part.text : '';
79
+ if (part.type === 'text-delta') {
80
+ state.text += delta;
81
+ state.pendingText += delta;
82
+ state.files = lightweightFiles([state.toolFiles, state.text]);
83
+ return true;
84
+ }
85
+ if (part.type === 'reasoning-delta') {
86
+ state.thinking += delta;
87
+ const id = `${state.runId}:thinking:${typeof part.id === 'string' ? part.id : 'default'}`;
88
+ const existing = state.reasoning.find(item => item.uuid === id)?.message.content[0];
89
+ const text = existing && 'text' in existing && typeof existing.text === 'string' ? existing.text : '';
90
+ upsertReasoning(state, reasoningItem(state.sessionId, id, { type: 'text', text: text + delta }, timestamp));
91
+ return true;
92
+ }
93
+ if (part.type === 'tool-call' && typeof part.toolCallId === 'string') {
94
+ if (state.pendingText) {
95
+ upsertReasoning(state, reasoningItem(state.sessionId, `${state.runId}:text:${sequence}`, { type: 'text', text: state.pendingText }, timestamp));
96
+ state.pendingText = '';
97
+ }
98
+ upsertReasoning(state, reasoningItem(state.sessionId, `${state.runId}:call:${part.toolCallId}`, {
99
+ type: 'tool_use',
100
+ id: part.toolCallId,
101
+ name: typeof part.toolName === 'string' ? part.toolName : 'Tool',
102
+ input: argumentsOf(part.input),
103
+ }, timestamp));
104
+ return true;
105
+ }
106
+ if ((part.type === 'tool-result' || part.type === 'tool-error') && typeof part.toolCallId === 'string') {
107
+ const output = part.type === 'tool-error' ? part.error : part.output;
108
+ upsertReasoning(state, reasoningItem(state.sessionId, `${state.runId}:result:${part.toolCallId}`, {
109
+ type: 'tool_result',
110
+ tool_use_id: part.toolCallId,
111
+ content: stringify(output),
112
+ is_error: part.type === 'tool-error',
113
+ }, timestamp, 'user'));
114
+ state.toolFiles = lightweightFiles([state.toolFiles, output]);
115
+ state.files = lightweightFiles([state.toolFiles, state.text]);
116
+ return true;
117
+ }
118
+ return false;
119
+ }
120
+ export function lightweightThreadReasoning(sessionId, runId, events) {
121
+ const state = createLightweightTurn(runId, sessionId);
122
+ for (const [index, event] of events.entries()) {
123
+ const timestamp = typeof event.timestamp === 'number' ? event.timestamp : 0;
124
+ if ((event.type === 'thinking' || event.type === 'text') && typeof event.text === 'string') {
125
+ upsertReasoning(state, reasoningItem(sessionId, `${runId}:${event.type}:${event.sequenceIndex ?? index}`, { type: 'text', text: event.text }, timestamp));
126
+ }
127
+ else if (event.type === 'tool_call') {
128
+ applyLightweightPart(state, { type: 'tool-call', toolCallId: event.callId, toolName: event.toolName, input: event.arguments }, index, timestamp);
129
+ }
130
+ else if (event.type === 'tool_result' && isRecord(event.result)) {
131
+ applyLightweightPart(state, { type: event.result.isError ? 'tool-error' : 'tool-result', toolCallId: event.callId, output: event.result.output, error: event.result.output }, index, timestamp);
132
+ }
133
+ }
134
+ return state.reasoning;
135
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@meistrari/chat-nuxt",
3
- "version": "4.3.0",
3
+ "version": "4.4.0-rc.1",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {