@meistrari/chat-nuxt 1.3.0 → 1.5.0

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 (98) hide show
  1. package/README.md +51 -16
  2. package/dist/module.json +1 -1
  3. package/dist/module.mjs +12 -8
  4. package/dist/runtime/components/MeistrariChatEmbed.d.vue.ts +5 -16
  5. package/dist/runtime/components/MeistrariChatEmbed.vue +28 -5
  6. package/dist/runtime/components/MeistrariChatEmbed.vue.d.ts +5 -16
  7. package/dist/runtime/components/app-markdown-render.d.vue.ts +3 -1
  8. package/dist/runtime/components/app-markdown-render.vue +15 -4
  9. package/dist/runtime/components/app-markdown-render.vue.d.ts +3 -1
  10. package/dist/runtime/components/chat/message-bubble.vue +10 -2
  11. package/dist/runtime/components/chat/message-input.d.vue.ts +30 -4
  12. package/dist/runtime/components/chat/message-input.vue +268 -24
  13. package/dist/runtime/components/chat/message-input.vue.d.ts +30 -4
  14. package/dist/runtime/composables/useChat.d.ts +3 -5
  15. package/dist/runtime/composables/useChat.js +24 -3
  16. package/dist/runtime/composables/useChatAction.d.ts +10 -0
  17. package/dist/runtime/composables/useChatAction.js +12 -0
  18. package/dist/runtime/composables/useChatApi.js +4 -0
  19. package/dist/runtime/composables/useConversations.js +8 -2
  20. package/dist/runtime/composables/useEmbedConfig.d.ts +12 -2
  21. package/dist/runtime/composables/useEmbedConfig.js +24 -3
  22. package/dist/runtime/composables/useFeatureFlags.d.ts +1 -2
  23. package/dist/runtime/composables/useTelaAgentMetadata.d.ts +8 -0
  24. package/dist/runtime/composables/useTelaAgentMetadata.js +65 -0
  25. package/dist/runtime/composables/useWorkspaceSettings.d.ts +1 -19
  26. package/dist/runtime/embed/components/ChatConfigurationModal.d.vue.ts +1 -1
  27. package/dist/runtime/embed/components/ChatConfigurationModal.vue.d.ts +1 -1
  28. package/dist/runtime/embed/components/ChatEmbed.d.vue.ts +6 -21
  29. package/dist/runtime/embed/components/ChatEmbed.vue +44 -11
  30. package/dist/runtime/embed/components/ChatEmbed.vue.d.ts +6 -21
  31. package/dist/runtime/embed/components/ChatEmbedInner.vue +36 -12
  32. package/dist/runtime/plugins/markstream.d.ts +1 -1
  33. package/dist/runtime/plugins/markstream.js +1 -1
  34. package/dist/runtime/server/api/conversations/[id]/cancel.post.d.ts +1 -1
  35. package/dist/runtime/server/api/conversations/[id]/cancel.post.js +37 -17
  36. package/dist/runtime/server/api/conversations/[id]/clear.post.js +28 -13
  37. package/dist/runtime/server/api/conversations/[id]/duplicate.post.js +11 -13
  38. package/dist/runtime/server/api/conversations/[id]/files.get.js +5 -7
  39. package/dist/runtime/server/api/conversations/[id]/index.delete.js +13 -12
  40. package/dist/runtime/server/api/conversations/[id]/index.get.js +6 -13
  41. package/dist/runtime/server/api/conversations/[id]/index.patch.js +11 -10
  42. package/dist/runtime/server/api/conversations/[id]/messages/[messageId]/retry.post.js +46 -80
  43. package/dist/runtime/server/api/conversations/[id]/messages/index.get.d.ts +1 -14
  44. package/dist/runtime/server/api/conversations/[id]/messages/index.get.js +81 -187
  45. package/dist/runtime/server/api/conversations/[id]/messages/index.post.js +68 -83
  46. package/dist/runtime/server/api/conversations/[id]/usage.get.js +4 -8
  47. package/dist/runtime/server/api/conversations/generate-title.post.js +4 -3
  48. package/dist/runtime/server/api/conversations/index.get.js +5 -4
  49. package/dist/runtime/server/api/conversations/index.post.js +5 -4
  50. package/dist/runtime/server/api/tela/agents/[id].get.d.ts +6 -0
  51. package/dist/runtime/server/api/tela/agents/[id].get.js +25 -0
  52. package/dist/runtime/server/api/workspace/settings.patch.js +1 -1
  53. package/dist/runtime/server/db/index.js +62 -0
  54. package/dist/runtime/server/db/schema/conversations.d.ts +17 -0
  55. package/dist/runtime/server/db/schema/conversations.js +3 -1
  56. package/dist/runtime/server/db/schema/workspace-settings.d.ts +1 -1
  57. package/dist/runtime/server/utils/agent-api.d.ts +1 -1
  58. package/dist/runtime/server/utils/agent-api.js +2 -5
  59. package/dist/runtime/server/utils/chat-context.d.ts +5 -0
  60. package/dist/runtime/server/utils/chat-context.js +20 -0
  61. package/dist/runtime/server/utils/chat-workspace-settings.d.ts +2 -1
  62. package/dist/runtime/server/utils/chat-workspace-settings.js +10 -1
  63. package/dist/runtime/server/utils/conversation-agent-turn.d.ts +39 -0
  64. package/dist/runtime/server/utils/conversation-agent-turn.js +170 -0
  65. package/dist/runtime/server/utils/conversation-message-files.d.ts +10 -0
  66. package/dist/runtime/server/utils/conversation-message-files.js +77 -0
  67. package/dist/runtime/server/utils/conversation-message-sync.d.ts +31 -0
  68. package/dist/runtime/server/utils/conversation-message-sync.js +132 -0
  69. package/dist/runtime/server/utils/conversation-scope.d.ts +2 -0
  70. package/dist/runtime/server/utils/conversation-scope.js +12 -0
  71. package/dist/runtime/server/utils/tela-agent-api.d.ts +29 -0
  72. package/dist/runtime/server/utils/tela-agent-api.js +107 -0
  73. package/dist/runtime/server/utils/tela-agent-session.d.ts +48 -0
  74. package/dist/runtime/server/utils/tela-agent-session.js +350 -0
  75. package/dist/runtime/types/embed.d.ts +29 -0
  76. package/dist/runtime/types/embed.js +0 -0
  77. package/dist/runtime/types/tela-agent.d.ts +243 -0
  78. package/dist/runtime/types/tela-agent.js +98 -0
  79. package/dist/runtime/types/workspace-settings-data.d.ts +19 -0
  80. package/dist/runtime/types/workspace-settings-data.js +0 -0
  81. package/dist/runtime/types/workspace-settings.d.ts +1 -1
  82. package/dist/runtime/utils/agent-input-readiness.d.ts +14 -0
  83. package/dist/runtime/utils/agent-input-readiness.js +15 -0
  84. package/dist/runtime/utils/custom-markdown-components.d.ts +9 -0
  85. package/dist/runtime/utils/custom-markdown-components.js +54 -0
  86. package/dist/runtime/utils/features.d.ts +9 -0
  87. package/dist/runtime/utils/features.js +5 -4
  88. package/dist/runtime/utils/file.js +46 -7
  89. package/dist/runtime/utils/markdown-nodes.d.ts +1 -0
  90. package/dist/runtime/utils/markdown-nodes.js +6 -0
  91. package/dist/runtime/utils/tela-chat.d.ts +6 -0
  92. package/dist/runtime/utils/tela-chat.js +12 -1
  93. package/drizzle/0014_faulty_lake.sql +2 -0
  94. package/drizzle/meta/0014_snapshot.json +732 -0
  95. package/drizzle/meta/_journal.json +7 -0
  96. package/package.json +1 -1
  97. package/dist/runtime/types/feature-flags.d.ts +0 -7
  98. package/dist/runtime/types/feature-flags.js +0 -6
@@ -1,11 +1,12 @@
1
1
  import { createError, defineEventHandler, getRouterParam } from "h3";
2
- import { eq, and, asc } from "drizzle-orm";
2
+ import { eq, asc } from "drizzle-orm";
3
3
  import { useDb, schema } from "#chat-runtime/server/db";
4
- import { resolveChatContext } from "#chat-runtime/server/utils/chat-context";
4
+ import { resolveChatRuntimeContext } from "#chat-runtime/server/utils/chat-context";
5
+ import { conversationScopeConditions } from "#chat-runtime/server/utils/conversation-scope";
5
6
  import { getWorkspaceSettingsUpdatedAt, resolveWorkspaceSettings, serializeResolvedWorkspaceSettings } from "#chat-runtime/server/utils/chat-workspace-settings";
6
7
  import { logger } from "#chat-runtime/server/utils/logger";
7
8
  export default defineEventHandler(async (event) => {
8
- const context = resolveChatContext(event);
9
+ const context = resolveChatRuntimeContext(event);
9
10
  const db = useDb();
10
11
  const id = getRouterParam(event, "id");
11
12
  if (!id) {
@@ -14,28 +15,25 @@ export default defineEventHandler(async (event) => {
14
15
  statusMessage: "Conversation ID is required"
15
16
  });
16
17
  }
17
- const [original] = await db.select().from(schema.conversations).where(
18
- and(
19
- eq(schema.conversations.id, id),
20
- eq(schema.conversations.workspaceId, context.workspaceId)
21
- )
22
- ).limit(1);
18
+ const [original] = await db.select().from(schema.conversations).where(conversationScopeConditions(context, id)).limit(1);
23
19
  if (!original) {
24
20
  throw createError({
25
21
  statusCode: 404,
26
22
  statusMessage: "Conversation not found"
27
23
  });
28
24
  }
29
- const trustedSettings = original.appliedSettingsSnapshot ? original.appliedSettingsSnapshot : await resolveWorkspaceSettings(event, context, db);
25
+ const trustedSettings = original.telaAgentId ? null : original.appliedSettingsSnapshot ?? await resolveWorkspaceSettings(event, context, db);
30
26
  const duplicated = await db.transaction(async (tx) => {
31
27
  const [newConversation] = await tx.insert(schema.conversations).values({
32
28
  workspaceId: context.workspaceId,
33
29
  userId: context.user.id,
34
30
  title: `${original.title} (copy)`,
35
31
  createdBy: context.user.email,
36
- model: original.model,
37
- appliedSettingsAt: getWorkspaceSettingsUpdatedAt(trustedSettings),
38
- appliedSettingsSnapshot: serializeResolvedWorkspaceSettings(trustedSettings)
32
+ telaAgentId: original.telaAgentId,
33
+ threadSessionId: null,
34
+ model: original.telaAgentId ? null : original.model,
35
+ appliedSettingsAt: trustedSettings ? getWorkspaceSettingsUpdatedAt(trustedSettings) : null,
36
+ appliedSettingsSnapshot: trustedSettings ? serializeResolvedWorkspaceSettings(trustedSettings) : null
39
37
  }).returning();
40
38
  if (!newConversation) {
41
39
  throw createError({
@@ -1,14 +1,15 @@
1
1
  import { createError, defineEventHandler, getRouterParam } from "h3";
2
2
  import { useRuntimeConfig } from "nitropack/runtime";
3
- import { and, asc, eq } from "drizzle-orm";
3
+ import { asc, eq } from "drizzle-orm";
4
4
  import { useDb, schema } from "#chat-runtime/server/db";
5
- import { resolveChatContext } from "#chat-runtime/server/utils/chat-context";
5
+ import { resolveChatRuntimeContext } from "#chat-runtime/server/utils/chat-context";
6
+ import { conversationScopeConditions } from "#chat-runtime/server/utils/conversation-scope";
6
7
  import { APIKeyAuthStrategy, extractVaultReferences, VaultFile } from "@meistrari/vault-sdk";
7
8
  import { getAgentDataToken } from "#chat-runtime/server/utils/agent-api";
8
9
  import { generateFileId } from "#chat-runtime/utils/file";
9
10
  import { logger } from "#chat-runtime/server/utils/logger";
10
11
  export default defineEventHandler(async (event) => {
11
- const context = resolveChatContext(event);
12
+ const context = resolveChatRuntimeContext(event);
12
13
  const db = useDb();
13
14
  const conversationId = getRouterParam(event, "id");
14
15
  const authToken = getAgentDataToken(event);
@@ -19,10 +20,7 @@ export default defineEventHandler(async (event) => {
19
20
  statusMessage: "Invalid conversation ID format"
20
21
  });
21
22
  }
22
- const [conversation] = await db.select().from(schema.conversations).where(and(
23
- eq(schema.conversations.id, conversationId),
24
- eq(schema.conversations.workspaceId, context.workspaceId)
25
- ));
23
+ const [conversation] = await db.select().from(schema.conversations).where(conversationScopeConditions(context, conversationId));
26
24
  if (!conversation) {
27
25
  throw createError({
28
26
  statusCode: 404,
@@ -1,12 +1,12 @@
1
1
  import { createError, defineEventHandler, getRouterParam } from "h3";
2
- import { eq, and } from "drizzle-orm";
3
2
  import { useDb, schema } from "#chat-runtime/server/db";
4
- import { resolveChatContext } from "#chat-runtime/server/utils/chat-context";
3
+ import { resolveChatRuntimeContext } from "#chat-runtime/server/utils/chat-context";
4
+ import { conversationScopeConditions } from "#chat-runtime/server/utils/conversation-scope";
5
5
  import { getAgentDataToken, deleteSession } from "#chat-runtime/server/utils/agent-api";
6
+ import { endTelaAgentSession } from "#chat-runtime/server/utils/tela-agent-api";
6
7
  import { logger } from "#chat-runtime/server/utils/logger";
7
8
  export default defineEventHandler(async (event) => {
8
- const context = resolveChatContext(event);
9
- const token = getAgentDataToken(event);
9
+ const context = resolveChatRuntimeContext(event);
10
10
  const db = useDb();
11
11
  const id = getRouterParam(event, "id");
12
12
  if (!id) {
@@ -15,12 +15,7 @@ export default defineEventHandler(async (event) => {
15
15
  statusMessage: "Conversation ID is required"
16
16
  });
17
17
  }
18
- const [deleted] = await db.delete(schema.conversations).where(
19
- and(
20
- eq(schema.conversations.id, id),
21
- eq(schema.conversations.workspaceId, context.workspaceId)
22
- )
23
- ).returning();
18
+ const [deleted] = await db.delete(schema.conversations).where(conversationScopeConditions(context, id)).returning();
24
19
  if (!deleted) {
25
20
  throw createError({
26
21
  statusCode: 404,
@@ -29,8 +24,14 @@ export default defineEventHandler(async (event) => {
29
24
  }
30
25
  logger.info({ conversationId: id, workspaceId: context.workspaceId }, "Conversation deleted");
31
26
  if (deleted.threadSessionId) {
32
- deleteSession(token, deleted.threadSessionId).catch(() => {
33
- });
27
+ if (deleted.telaAgentId) {
28
+ endTelaAgentSession(event, deleted.threadSessionId).catch(() => {
29
+ });
30
+ } else {
31
+ const token = getAgentDataToken(event);
32
+ deleteSession(token, deleted.threadSessionId).catch(() => {
33
+ });
34
+ }
34
35
  }
35
36
  return { success: true };
36
37
  });
@@ -1,9 +1,10 @@
1
1
  import { createError, defineEventHandler, getRouterParam } from "h3";
2
- import { eq, and, asc } from "drizzle-orm";
2
+ import { eq, asc } from "drizzle-orm";
3
3
  import { useDb, schema } from "#chat-runtime/server/db";
4
- import { resolveChatContext } from "#chat-runtime/server/utils/chat-context";
4
+ import { resolveChatRuntimeContext } from "#chat-runtime/server/utils/chat-context";
5
+ import { conversationScopeConditions } from "#chat-runtime/server/utils/conversation-scope";
5
6
  export default defineEventHandler(async (event) => {
6
- const context = resolveChatContext(event);
7
+ const context = resolveChatRuntimeContext(event);
7
8
  const db = useDb();
8
9
  const id = getRouterParam(event, "id");
9
10
  if (!id) {
@@ -12,22 +13,14 @@ export default defineEventHandler(async (event) => {
12
13
  statusMessage: "Conversation ID is required"
13
14
  });
14
15
  }
15
- const [conversationResult, messages] = await Promise.all([
16
- db.select().from(schema.conversations).where(
17
- and(
18
- eq(schema.conversations.id, id),
19
- eq(schema.conversations.workspaceId, context.workspaceId)
20
- )
21
- ),
22
- db.select().from(schema.messages).where(eq(schema.messages.conversationId, id)).orderBy(asc(schema.messages.createdAt))
23
- ]);
24
- const [conversation] = conversationResult;
16
+ const [conversation] = await db.select().from(schema.conversations).where(conversationScopeConditions(context, id));
25
17
  if (!conversation) {
26
18
  throw createError({
27
19
  statusCode: 404,
28
20
  statusMessage: "Conversation not found"
29
21
  });
30
22
  }
23
+ const messages = await db.select().from(schema.messages).where(eq(schema.messages.conversationId, id)).orderBy(asc(schema.messages.createdAt));
31
24
  return {
32
25
  ...conversation,
33
26
  messages
@@ -1,11 +1,11 @@
1
1
  import { createError, defineEventHandler, getRouterParam, readBody } from "h3";
2
- import { eq, and } from "drizzle-orm";
3
2
  import { useDb, schema } from "#chat-runtime/server/db";
4
- import { resolveChatContext } from "#chat-runtime/server/utils/chat-context";
3
+ import { resolveChatRuntimeContext } from "#chat-runtime/server/utils/chat-context";
4
+ import { conversationScopeConditions } from "#chat-runtime/server/utils/conversation-scope";
5
5
  import { logger } from "#chat-runtime/server/utils/logger";
6
6
  import { isValidModel } from "#chat-runtime/types/chat";
7
7
  export default defineEventHandler(async (event) => {
8
- const context = resolveChatContext(event);
8
+ const context = resolveChatRuntimeContext(event);
9
9
  const db = useDb();
10
10
  const id = getRouterParam(event, "id");
11
11
  if (!id) {
@@ -27,7 +27,13 @@ export default defineEventHandler(async (event) => {
27
27
  statusMessage: "Title cannot be empty"
28
28
  });
29
29
  }
30
- if (body.model !== void 0 && body.model !== null && !isValidModel(body.model)) {
30
+ if (context.telaAgentId && body.model !== void 0) {
31
+ throw createError({
32
+ statusCode: 400,
33
+ statusMessage: "Model cannot be updated for Tela-agent conversations"
34
+ });
35
+ }
36
+ if (!context.telaAgentId && body.model !== void 0 && body.model !== null && !isValidModel(body.model)) {
31
37
  throw createError({
32
38
  statusCode: 400,
33
39
  statusMessage: "Invalid model"
@@ -38,12 +44,7 @@ export default defineEventHandler(async (event) => {
38
44
  updateData.title = body.title.trim();
39
45
  if (body.model !== void 0)
40
46
  updateData.model = body.model;
41
- const [updated] = await db.update(schema.conversations).set(updateData).where(
42
- and(
43
- eq(schema.conversations.id, id),
44
- eq(schema.conversations.workspaceId, context.workspaceId)
45
- )
46
- ).returning();
47
+ const [updated] = await db.update(schema.conversations).set(updateData).where(conversationScopeConditions(context, id)).returning();
47
48
  if (!updated) {
48
49
  throw createError({
49
50
  statusCode: 404,
@@ -1,24 +1,19 @@
1
1
  import { createError, defineEventHandler, getRouterParam } from "h3";
2
- import { useRuntimeConfig } from "nitropack/runtime";
3
- import { eq, and, lt, desc, isNull } from "drizzle-orm";
2
+ import { eq, and, lt, desc } from "drizzle-orm";
4
3
  import { logger } from "#chat-runtime/server/utils/logger";
5
4
  import { useDb, schema } from "#chat-runtime/server/db";
6
- import { resolveChatContext } from "#chat-runtime/server/utils/chat-context";
7
- import { buildMessageWithContext, renderSystemPrompt, truncateTitle } from "#chat-runtime/server/utils/chat-message-builder";
8
- import { getAgentDataToken, createChatAgentSession, continueSession } from "#chat-runtime/server/utils/agent-api";
5
+ import { resolveChatRuntimeContext } from "#chat-runtime/server/utils/chat-context";
9
6
  import {
10
- getConversationAppliedSettings,
11
- getWorkspaceSettingsUpdatedAt,
12
- resolveWorkspaceSettings,
13
- serializeResolvedWorkspaceSettings
14
- } from "#chat-runtime/server/utils/chat-workspace-settings";
15
- import { resolveWorkspaceCredentials } from "#chat-runtime/server/utils/workspace";
16
- import { useChatNuxtFeatures } from "#chat-runtime/utils/features";
17
- import { mergeFileUrls } from "#chat-runtime/utils/file";
18
- import { isValidModel } from "#chat-runtime/types/chat";
7
+ buildTelaAgentTurnPayload,
8
+ prepareDefaultAgentTurn,
9
+ queueTelaAgentTurn,
10
+ resolveDefaultAgentEnvironmentVariables,
11
+ withEnvironmentVariables
12
+ } from "#chat-runtime/server/utils/conversation-agent-turn";
13
+ import { conversationScopeConditions } from "#chat-runtime/server/utils/conversation-scope";
14
+ import { getAgentDataToken, createChatAgentSession, continueSession } from "#chat-runtime/server/utils/agent-api";
19
15
  export default defineEventHandler(async (event) => {
20
- const context = resolveChatContext(event);
21
- const token = getAgentDataToken(event);
16
+ const context = resolveChatRuntimeContext(event);
22
17
  const db = useDb();
23
18
  const conversationId = getRouterParam(event, "id");
24
19
  const messageId = getRouterParam(event, "messageId");
@@ -28,12 +23,7 @@ export default defineEventHandler(async (event) => {
28
23
  statusMessage: "Conversation ID and Message ID are required"
29
24
  });
30
25
  }
31
- const [conversation] = await db.select().from(schema.conversations).where(
32
- and(
33
- eq(schema.conversations.id, conversationId),
34
- eq(schema.conversations.workspaceId, context.workspaceId)
35
- )
36
- );
26
+ const [conversation] = await db.select().from(schema.conversations).where(conversationScopeConditions(context, conversationId));
37
27
  if (!conversation) {
38
28
  throw createError({
39
29
  statusCode: 404,
@@ -67,6 +57,7 @@ export default defineEventHandler(async (event) => {
67
57
  statusMessage: "User message not found"
68
58
  });
69
59
  }
60
+ const telaAgentPayload = conversation.telaAgentId ? await buildTelaAgentTurnPayload(event, conversation, userMessage.content, userMessage.files ?? void 0) : null;
70
61
  await db.update(schema.messages).set({
71
62
  content: "",
72
63
  status: "pending",
@@ -74,64 +65,42 @@ export default defineEventHandler(async (event) => {
74
65
  files: null
75
66
  }).where(eq(schema.messages.id, messageId));
76
67
  logger.info({ conversationId, messageId }, "Message retry initiated");
77
- const trustedSettings = conversation.appliedSettingsSnapshot ? null : await resolveWorkspaceSettings(event, context, db);
78
- const appliedSettings = getConversationAppliedSettings(conversation, trustedSettings);
79
- const needsNewThread = conversation.threadSessionId === null;
80
- const fileUrls = mergeFileUrls(appliedSettings.contextFiles, userMessage.files);
81
- const knowledgeSources = appliedSettings.knowledgeSources ?? null;
82
- const hasKnowledgeSources = knowledgeSources !== null && knowledgeSources.length > 0;
83
- const { vaultUrl } = useRuntimeConfig();
84
- const messageWithContext = buildMessageWithContext(
85
- userMessage.content.trim(),
86
- appliedSettings.systemMessage ?? null,
87
- knowledgeSources,
88
- needsNewThread,
89
- needsNewThread ? renderSystemPrompt(vaultUrl) : ""
90
- );
91
- const canvasTools = appliedSettings.canvasTools;
92
- const externalSkillRefs = appliedSettings.externalSkills?.map((skill) => skill.ref) ?? [];
93
- const skills = externalSkillRefs.length > 0 ? externalSkillRefs : void 0;
94
- const effectiveModel = isValidModel(conversation.model) ? conversation.model : void 0;
95
- const messageTitle = truncateTitle(userMessage.content);
96
- const settingsTimestamp = getWorkspaceSettingsUpdatedAt(appliedSettings);
97
- if (!conversation.appliedSettingsSnapshot && trustedSettings) {
98
- await db.update(schema.conversations).set({
99
- appliedSettingsAt: settingsTimestamp,
100
- appliedSettingsSnapshot: serializeResolvedWorkspaceSettings(trustedSettings),
101
- updatedAt: /* @__PURE__ */ new Date()
102
- }).where(and(
103
- eq(schema.conversations.id, conversationId),
104
- isNull(schema.conversations.appliedSettingsSnapshot)
105
- ));
68
+ if (conversation.telaAgentId) {
69
+ queueTelaAgentTurn(event, db, {
70
+ conversation,
71
+ conversationId,
72
+ assistantMessageId: messageId,
73
+ payload: telaAgentPayload,
74
+ titleContent: userMessage.content,
75
+ operation: "retry"
76
+ });
77
+ const [updatedMessage2] = await db.select().from(schema.messages).where(eq(schema.messages.id, messageId));
78
+ return updatedMessage2;
106
79
  }
80
+ const token = getAgentDataToken(event);
81
+ const defaultAgentTurn = await prepareDefaultAgentTurn(event, db, context, {
82
+ conversation,
83
+ conversationId,
84
+ content: userMessage.content,
85
+ files: userMessage.files
86
+ });
107
87
  const processAgent = async () => {
108
88
  try {
109
- if (needsNewThread) {
110
- let environmentVariables = {};
111
- if (useChatNuxtFeatures().credentials) {
112
- try {
113
- environmentVariables = await resolveWorkspaceCredentials(event, context.workspaceId);
114
- } catch (error) {
115
- logger.warn({ conversationId, messageId, error }, "Failed to resolve workspace credentials on retry, proceeding without env vars");
116
- }
117
- }
118
- const hasEnvironmentVariables = Object.keys(environmentVariables).length > 0;
119
- const result = await createChatAgentSession(token, {
120
- message: messageWithContext,
121
- fileUrls,
122
- model: effectiveModel,
123
- customTools: canvasTools?.length ? { canvas: canvasTools } : void 0,
124
- tools: hasKnowledgeSources ? { workstationQueryTool: true } : void 0,
125
- environmentVariables: hasEnvironmentVariables ? environmentVariables : void 0,
126
- skills
127
- });
89
+ if (defaultAgentTurn.needsNewThread) {
90
+ const environmentVariables = await resolveDefaultAgentEnvironmentVariables(
91
+ event,
92
+ context,
93
+ { conversationId, messageId },
94
+ "Failed to resolve workspace credentials on retry, proceeding without env vars"
95
+ );
96
+ const result = await createChatAgentSession(token, withEnvironmentVariables(defaultAgentTurn.createPayload, environmentVariables));
128
97
  if (result.success) {
129
98
  logger.info({ conversationId, messageId, sessionId: result.sessionId }, "New agent thread created on retry");
130
99
  await db.update(schema.conversations).set({
131
100
  threadSessionId: result.sessionId,
132
- title: messageTitle,
133
- appliedSettingsAt: settingsTimestamp,
134
- model: effectiveModel ?? null,
101
+ title: defaultAgentTurn.messageTitle,
102
+ appliedSettingsAt: defaultAgentTurn.settingsTimestamp,
103
+ model: defaultAgentTurn.effectiveModel ?? null,
135
104
  updatedAt: /* @__PURE__ */ new Date()
136
105
  }).where(eq(schema.conversations.id, conversationId));
137
106
  } else {
@@ -142,27 +111,24 @@ export default defineEventHandler(async (event) => {
142
111
  }).where(eq(schema.messages.id, messageId));
143
112
  }
144
113
  } else {
145
- const result = await continueSession(token, conversation.threadSessionId, {
146
- content: userMessage.content.trim(),
147
- fileUrls,
148
- model: effectiveModel
149
- });
114
+ const result = await continueSession(token, conversation.threadSessionId, defaultAgentTurn.continuePayload);
150
115
  if (!result.success) {
151
116
  logger.warn({ conversationId, messageId, error: result.error }, "Agent session continue failed on retry");
152
117
  await db.update(schema.messages).set({
153
118
  content: `Erro: ${result.error}`,
154
119
  status: "failed"
155
120
  }).where(eq(schema.messages.id, messageId));
121
+ return;
156
122
  }
157
123
  await db.update(schema.conversations).set({
158
- ...effectiveModel ? { model: effectiveModel } : {},
124
+ ...defaultAgentTurn.effectiveModel ? { model: defaultAgentTurn.effectiveModel } : {},
159
125
  updatedAt: /* @__PURE__ */ new Date()
160
126
  }).where(eq(schema.conversations.id, conversationId));
161
127
  }
162
128
  } catch (error) {
163
129
  logger.error({ error }, "Failed to process agent retry");
164
130
  await db.update(schema.messages).set({
165
- content: `Erro: ${needsNewThread ? "Falha ao conectar ao agente" : "Falha ao continuar a sess\xE3o"}`,
131
+ content: `Erro: ${defaultAgentTurn.needsNewThread ? "Falha ao conectar ao agente" : "Falha ao continuar a sess\xE3o"}`,
166
132
  status: "failed"
167
133
  }).where(eq(schema.messages.id, messageId));
168
134
  }
@@ -1,15 +1,2 @@
1
- type MessageFile = {
2
- url: string;
3
- name: string;
4
- mimeType?: string;
5
- source: 'user' | 'assistant';
6
- size?: number;
7
- };
8
- declare const _default: import("h3").EventHandler<import("h3").EventHandlerRequest, Promise<{
9
- messages: any;
10
- newFiles: MessageFile[];
11
- } | {
12
- messages: any;
13
- newFiles?: undefined;
14
- }>>;
1
+ declare const _default: import("h3").EventHandler<import("h3").EventHandlerRequest, Promise<any>>;
15
2
  export default _default;