@eaera-com/cms-sdk 0.1.91 → 0.1.93

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 (41) hide show
  1. package/dist/chunks/chats-F9H8sza4.js +109 -0
  2. package/dist/chunks/client-B7fm_H2u.js +184 -0
  3. package/dist/chunks/connection-DGlB8IZD.js +108 -0
  4. package/dist/chunks/{mt5Retcode-DlZLQOLA.js → mt5Retcode-DK9C-4Dv.js} +8 -0
  5. package/dist/chunks/qwenpaw.constant-BwpRhdCV.js +24 -0
  6. package/dist/common/constants/index.d.ts +1 -0
  7. package/dist/common/constants/index.d.ts.map +1 -1
  8. package/dist/common/constants/qwenpaw.constant.d.ts +46 -0
  9. package/dist/common/constants/qwenpaw.constant.d.ts.map +1 -0
  10. package/dist/common/helpers/mt5Retcode.d.ts.map +1 -1
  11. package/dist/common/helpers/mt5Retcode.js +1 -1
  12. package/dist/composables/useQwenpawChat.d.ts +240 -0
  13. package/dist/composables/useQwenpawChat.d.ts.map +1 -0
  14. package/dist/core/ws/ws.constants.d.ts +1 -0
  15. package/dist/core/ws/ws.constants.d.ts.map +1 -1
  16. package/dist/index.d.ts +8 -0
  17. package/dist/index.d.ts.map +1 -1
  18. package/dist/index.js +392 -6
  19. package/dist/nuxt.d.ts.map +1 -1
  20. package/dist/nuxt.js +10 -1
  21. package/dist/server/ai/qwenpaw/chat/stop.post.js +25 -0
  22. package/dist/server/ai/qwenpaw/chat.post.js +61 -0
  23. package/dist/server/ai/qwenpaw/chats-id.delete.js +18 -0
  24. package/dist/server/ai/qwenpaw/chats.get.js +33 -0
  25. package/dist/server/ai/qwenpaw/history.get.js +16 -0
  26. package/dist/server/ai/qwenpaw/session.get.js +14 -0
  27. package/dist/server/ai/qwenpaw/session.post.js +31 -0
  28. package/dist/server/ai/qwenpaw/upload.post.js +40 -0
  29. package/dist/services/qwenpaw/chats.d.ts +25 -0
  30. package/dist/services/qwenpaw/chats.d.ts.map +1 -0
  31. package/dist/services/qwenpaw/client.d.ts +42 -0
  32. package/dist/services/qwenpaw/client.d.ts.map +1 -0
  33. package/dist/services/qwenpaw/qwenpaw.type.d.ts +236 -0
  34. package/dist/services/qwenpaw/qwenpaw.type.d.ts.map +1 -0
  35. package/dist/services/qwenpaw/stream.d.ts +16 -0
  36. package/dist/services/qwenpaw/stream.d.ts.map +1 -0
  37. package/dist/stores/index.d.ts +1 -0
  38. package/dist/stores/index.d.ts.map +1 -1
  39. package/dist/stores/qwenpawChat.d.ts +219 -0
  40. package/dist/stores/qwenpawChat.d.ts.map +1 -0
  41. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -1,14 +1,16 @@
1
- import { $fetch } from 'ofetch';
1
+ import { $fetch, ofetch } from 'ofetch';
2
2
  import { H as HTTP_DEFAULTS, a as HTTP_RETRY_STATUS_CODES, b as HTTP_HEADER, R as RESPONSE_CASING_VALUE } from './chunks/http.constant-BzH5tJTG.js';
3
3
  export { S as SERIALIZATION_FORMAT } from './chunks/http.constant-BzH5tJTG.js';
4
4
  import { A as AUTH_PROXY_PATH, a as AUTH_ENDPOINT } from './chunks/auth.constant-CnGo0q42.js';
5
5
  import { A as AUTHZ_PROXY_PATH, a as AUTHZ_ENDPOINT } from './chunks/authz.constant-BqX8Nzw6.js';
6
6
  import { C as COOKIE_SAME_SITE, a as COOKIE_DEFAULTS, T as TOKEN_STORAGE_KEY, P as PERSIST_KEY, S as STORE_PERSIST_KEY } from './chunks/storage.constant-CVWam5ls.js';
7
7
  export { b as PERSIST_ALLOWED_KEYS, c as PERSIST_MAX_BYTES, d as PERSIST_PREFIX, e as STORAGE_NAME } from './chunks/storage.constant-CVWam5ls.js';
8
- import { ref, shallowRef, watch, computed } from 'vue';
9
- import { W as WS_RECONNECT_INITIAL_MS, a as WS_RECONNECT_MAX_MS, b as WS_CONNECTION_STATE, c as WS_PING_INTERVAL_MS, d as WS_MESSAGE_TYPE, e as WS_CLOSE_CODE, f as WS_MAX_RECONNECT_ATTEMPTS, g as WS_AUTH_TIMEOUT_MS, h as WS_RECONNECT_JITTER_MS, i as WS_PING_WATCHDOG_CHECK_MS, j as WS_MAX_SUBSCRIPTIONS, k as WS_PING_WATCHDOG_FACTOR } from './chunks/mt5Retcode-DlZLQOLA.js';
10
- export { M as MT5_RETCODE, l as WS_ACTION_ACCEPTED_ERROR_CODE, m as WS_ACTION_ERROR_CODE, n as WS_ACTION_RESULT_ERROR_CODE, o as WS_ACTION_RESULT_TTL_MS, p as WS_AUTH_ERROR_CODE, q as WS_CLOSE_REASON, r as WS_MT5_EVENT_TYPE, s as WS_TOPIC, t as WS_TOPIC_NAMESPACE, u as accountTopic, v as adminTopic, w as mt5Topic, x as streamTopic, y as symbolTopic, z as userTopic, A as viewMt5Retcode } from './chunks/mt5Retcode-DlZLQOLA.js';
11
- import { defineStore } from 'pinia';
8
+ import { ref, shallowRef, watch, computed, toRaw } from 'vue';
9
+ import { W as WS_RECONNECT_INITIAL_MS, a as WS_RECONNECT_MAX_MS, b as WS_CONNECTION_STATE, c as WS_PING_INTERVAL_MS, d as WS_MESSAGE_TYPE, e as WS_CLOSE_CODE, f as WS_MAX_RECONNECT_ATTEMPTS, g as WS_AUTH_TIMEOUT_MS, h as WS_RECONNECT_JITTER_MS, i as WS_PING_WATCHDOG_CHECK_MS, j as WS_MAX_SUBSCRIPTIONS, k as WS_PING_WATCHDOG_FACTOR } from './chunks/mt5Retcode-DK9C-4Dv.js';
10
+ export { M as MT5_RETCODE, l as WS_ACTION_ACCEPTED_ERROR_CODE, m as WS_ACTION_ERROR_CODE, n as WS_ACTION_RESULT_ERROR_CODE, o as WS_ACTION_RESULT_TTL_MS, p as WS_AUTH_ERROR_CODE, q as WS_CLOSE_REASON, r as WS_MT5_EVENT_TYPE, s as WS_TOPIC, t as WS_TOPIC_NAMESPACE, u as accountTopic, v as adminTopic, w as mt5Topic, x as streamTopic, y as symbolTopic, z as userTopic, A as viewMt5Retcode } from './chunks/mt5Retcode-DK9C-4Dv.js';
11
+ import { defineStore, storeToRefs } from 'pinia';
12
+ export { Q as QwenpawConfigError, a as QwenpawUpstreamError, b as buildConsoleChatBody, p as postConsoleChatError } from './chunks/client-B7fm_H2u.js';
13
+ export { d as deleteQwenpawChat, e as extractChatModel, f as fetchChatHistory, g as getQwenpawChatMessages, l as listQwenpawChats, a as listQwenpawGroups, m as messagesToTurns } from './chunks/chats-F9H8sza4.js';
12
14
  export { categoryLabel, computeSpread, formatPrice } from './common/helpers/format.js';
13
15
 
14
16
  const MT5_SERVER_NAME = "EAERA MT5 - Live";
@@ -8977,6 +8979,350 @@ const useWsStore = defineStore(
8977
8979
  }
8978
8980
  );
8979
8981
 
8982
+ const createQwenpawParseState = () => ({
8983
+ reasoningMsgIds: /* @__PURE__ */ new Set()
8984
+ });
8985
+ const parseQwenpawDataLine = (line) => {
8986
+ if (!line.startsWith("data:")) return null;
8987
+ const payload = line.slice(5).trim();
8988
+ if (!payload || payload === "[DONE]") return null;
8989
+ try {
8990
+ const parsed = JSON.parse(payload);
8991
+ if (parsed && typeof parsed === "object") return parsed;
8992
+ return null;
8993
+ } catch {
8994
+ return null;
8995
+ }
8996
+ };
8997
+ const extractEventText = (event) => {
8998
+ const parts = event.output ?? [];
8999
+ const texts = [];
9000
+ for (const item of parts) {
9001
+ if (item?.type === "reasoning") continue;
9002
+ for (const part of item?.content ?? []) {
9003
+ if (part?.type === "text" && typeof part.text === "string") texts.push(part.text);
9004
+ }
9005
+ }
9006
+ return texts.join("");
9007
+ };
9008
+ const extractEventError = (event) => {
9009
+ const err = event.error;
9010
+ if (typeof err === "string" && err) return err;
9011
+ if (err && typeof err === "object" && typeof err.message === "string") return err.message;
9012
+ return "";
9013
+ };
9014
+ const toStreamChunk = (event, textMode, state) => {
9015
+ const failure = extractEventError(event);
9016
+ if (event.status === "failed" || failure) {
9017
+ throw new Error(failure || "The agent run failed.");
9018
+ }
9019
+ if (event.type === "reasoning") {
9020
+ if (event.id) state.reasoningMsgIds.add(event.id);
9021
+ return null;
9022
+ }
9023
+ if (event.type === "text" && typeof event.text === "string") {
9024
+ if (!event.text) return null;
9025
+ if (event.msg_id && state.reasoningMsgIds.has(event.msg_id)) return null;
9026
+ const action = event.delta === true ? "append" : event.delta === false ? "replace" : textMode;
9027
+ return { action, text: event.text, done: false };
9028
+ }
9029
+ if (event.object === "response" && event.status === "completed") {
9030
+ return { action: "replace", text: extractEventText(event), done: true };
9031
+ }
9032
+ if (event.output) {
9033
+ const text = extractEventText(event);
9034
+ if (text) return { action: "replace", text, done: false };
9035
+ }
9036
+ return null;
9037
+ };
9038
+ const iterateQwenpawEvents = async (body, onChunk, textMode = "replace", onRawEvent) => {
9039
+ const reader = body.getReader();
9040
+ const decoder = new TextDecoder();
9041
+ const state = createQwenpawParseState();
9042
+ let buffer = "";
9043
+ let first = true;
9044
+ const handleLine = (line) => {
9045
+ const event = parseQwenpawDataLine(line);
9046
+ if (!event) return;
9047
+ if (first && onRawEvent) {
9048
+ first = false;
9049
+ onRawEvent(line);
9050
+ }
9051
+ const chunk = toStreamChunk(event, textMode, state);
9052
+ if (chunk) onChunk(chunk);
9053
+ };
9054
+ for (; ; ) {
9055
+ const { done, value } = await reader.read();
9056
+ if (done) break;
9057
+ buffer += decoder.decode(value, { stream: true });
9058
+ let newlineIndex = buffer.indexOf("\n");
9059
+ while (newlineIndex !== -1) {
9060
+ const line = buffer.slice(0, newlineIndex).replace(/\r$/, "");
9061
+ buffer = buffer.slice(newlineIndex + 1);
9062
+ handleLine(line);
9063
+ newlineIndex = buffer.indexOf("\n");
9064
+ }
9065
+ }
9066
+ if (buffer.length) handleLine(buffer.replace(/\r$/, ""));
9067
+ };
9068
+
9069
+ const API_BASE = "/api/cms/ai/qwenpaw";
9070
+ const newSessionId = () => `c-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
9071
+ const newTurnId = () => `t-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
9072
+ const useQwenpawChatStore = defineStore("qwenpawChat", () => {
9073
+ const chats = ref([]);
9074
+ const groups = ref([]);
9075
+ const agentId = ref("");
9076
+ const model = ref("");
9077
+ const isLoadingChats = ref(false);
9078
+ const activeSession = ref("");
9079
+ const activeChatId = ref("");
9080
+ const activeChatName = ref("");
9081
+ const turns = ref([]);
9082
+ const status = ref("idle");
9083
+ const errorMessage = ref("");
9084
+ const connectState = ref("connecting");
9085
+ const isStreaming = computed(() => status.value === "streaming");
9086
+ let abortController = null;
9087
+ const probeConnection = async () => await ofetch(`${API_BASE}/session`);
9088
+ const connect = async () => {
9089
+ connectState.value = "connecting";
9090
+ try {
9091
+ const result = await ofetch(`${API_BASE}/session`, { method: "POST" });
9092
+ connectState.value = "connected";
9093
+ return result;
9094
+ } catch (error) {
9095
+ connectState.value = aiConnectStateFromError(error);
9096
+ throw error;
9097
+ }
9098
+ };
9099
+ const ensureConnection = async () => {
9100
+ try {
9101
+ const statusResult = await probeConnection();
9102
+ if (statusResult.configured) {
9103
+ connectState.value = "connected";
9104
+ return true;
9105
+ }
9106
+ } catch (error) {
9107
+ console.error("[qwenpaw-chat] status check failed", error);
9108
+ }
9109
+ try {
9110
+ await connect();
9111
+ return true;
9112
+ } catch (error) {
9113
+ console.error("[qwenpaw-chat] connect failed", error);
9114
+ return false;
9115
+ }
9116
+ };
9117
+ const aiConnectStateFromError = (error) => {
9118
+ const status2 = error?.status ?? error?.statusCode ?? 0;
9119
+ if (status2 === 401) return "error";
9120
+ const code = error?.data?.code;
9121
+ return code === "AI_AGENT_NOT_ASSIGNED" ? "no-agent" : "not-configured";
9122
+ };
9123
+ const loadChats = async () => {
9124
+ isLoadingChats.value = true;
9125
+ try {
9126
+ const res = await withFreshSession(
9127
+ () => ofetch(
9128
+ `${API_BASE}/chats`
9129
+ )
9130
+ );
9131
+ chats.value = res.chats;
9132
+ groups.value = res.groups ?? [];
9133
+ if (res.agentId) agentId.value = res.agentId;
9134
+ } catch (error) {
9135
+ console.error("[qwenpaw-chat] list failed", error);
9136
+ } finally {
9137
+ isLoadingChats.value = false;
9138
+ }
9139
+ };
9140
+ const openChat = async (chat) => {
9141
+ if (isStreaming.value) stop();
9142
+ activeSession.value = chat.sessionId;
9143
+ activeChatId.value = chat.id;
9144
+ activeChatName.value = chat.name;
9145
+ turns.value = [];
9146
+ errorMessage.value = "";
9147
+ try {
9148
+ const res = await withFreshSession(
9149
+ () => ofetch(`${API_BASE}/history`, {
9150
+ query: { chatId: chat.id }
9151
+ })
9152
+ );
9153
+ if (activeSession.value === chat.sessionId) {
9154
+ turns.value = res.turns;
9155
+ model.value = res.model ?? "";
9156
+ }
9157
+ } catch (error) {
9158
+ console.error("[qwenpaw-chat] history failed", error);
9159
+ }
9160
+ };
9161
+ const newChat = () => {
9162
+ if (isStreaming.value) stop();
9163
+ activeSession.value = newSessionId();
9164
+ activeChatId.value = "";
9165
+ activeChatName.value = "";
9166
+ turns.value = [];
9167
+ errorMessage.value = "";
9168
+ status.value = "idle";
9169
+ };
9170
+ const stop = () => {
9171
+ const sessionId = activeSession.value;
9172
+ abortController?.abort();
9173
+ abortController = null;
9174
+ const last = turns.value.at(-1);
9175
+ if (last?.role === "assistant") {
9176
+ last.streaming = false;
9177
+ last.error = last.error ?? "Cancelled.";
9178
+ }
9179
+ status.value = "error";
9180
+ if (sessionId) {
9181
+ void ofetch(`${API_BASE}/chat/stop`, {
9182
+ method: "POST",
9183
+ body: { sessionId }
9184
+ }).catch((error) => {
9185
+ console.error("[qwenpaw-chat] stop failed", error);
9186
+ });
9187
+ }
9188
+ };
9189
+ const uploadFile = async (file) => {
9190
+ const form = new FormData();
9191
+ form.append("file", file);
9192
+ const res = await ofetch(
9193
+ `${API_BASE}/upload`,
9194
+ {
9195
+ method: "POST",
9196
+ body: form
9197
+ }
9198
+ );
9199
+ return { url: res.url, name: res.fileName || file.name, size: res.size || file.size };
9200
+ };
9201
+ const withFreshSession = async (action) => {
9202
+ try {
9203
+ return await action();
9204
+ } catch (error) {
9205
+ const status2 = error?.status ?? error?.statusCode ?? 0;
9206
+ if (status2 !== 401 && status2 !== 423) throw error;
9207
+ await connect();
9208
+ return await action();
9209
+ }
9210
+ };
9211
+ const send = async (text, files = []) => {
9212
+ const content = text.trim();
9213
+ if (!content && !files.length || isStreaming.value) return;
9214
+ if (!activeSession.value) activeSession.value = newSessionId();
9215
+ errorMessage.value = "";
9216
+ const displayFiles = files.map((file) => ({ name: file.name, size: file.size }));
9217
+ turns.value.push({
9218
+ id: newTurnId(),
9219
+ role: "user",
9220
+ text: content,
9221
+ ...displayFiles.length ? { files: displayFiles } : {},
9222
+ ts: Date.now()
9223
+ });
9224
+ turns.value.push({ id: newTurnId(), role: "assistant", text: "", streaming: true });
9225
+ const assistantTurn = turns.value.at(-1);
9226
+ if (!assistantTurn) return;
9227
+ status.value = "streaming";
9228
+ abortController = new AbortController();
9229
+ const applyChunk = (chunk) => {
9230
+ if (chunk.text) {
9231
+ assistantTurn.text = chunk.action === "append" ? assistantTurn.text + chunk.text : chunk.text;
9232
+ }
9233
+ };
9234
+ try {
9235
+ const refs = [];
9236
+ for (const file of files) {
9237
+ refs.push(await uploadFile(file));
9238
+ }
9239
+ const signal = abortController.signal;
9240
+ const response = await withFreshSession(async () => {
9241
+ const res = await fetch(`${API_BASE}/chat`, {
9242
+ method: "POST",
9243
+ headers: { "content-type": "application/json" },
9244
+ body: JSON.stringify({
9245
+ ...content ? { text: content } : {},
9246
+ ...refs.length ? { files: refs } : {},
9247
+ sessionId: activeSession.value
9248
+ }),
9249
+ signal
9250
+ });
9251
+ if (res.status === 401 || res.status === 423) {
9252
+ throw Object.assign(new Error("AI session expired."), { status: res.status });
9253
+ }
9254
+ return res;
9255
+ });
9256
+ if (!response.ok || !response.body) {
9257
+ let message = "Chat request failed.";
9258
+ try {
9259
+ const payload = await response.json();
9260
+ message = payload.message || payload.statusMessage || message;
9261
+ } catch {
9262
+ }
9263
+ throw new Error(message);
9264
+ }
9265
+ await iterateQwenpawEvents(response.body, applyChunk);
9266
+ assistantTurn.streaming = false;
9267
+ status.value = "idle";
9268
+ void loadChats();
9269
+ } catch (error) {
9270
+ assistantTurn.streaming = false;
9271
+ if (error instanceof Error && error.name === "AbortError") {
9272
+ status.value = "idle";
9273
+ } else {
9274
+ if (!assistantTurn.text) {
9275
+ turns.value = turns.value.filter((turn) => turn.id !== assistantTurn.id);
9276
+ }
9277
+ errorMessage.value = error instanceof Error ? error.message : "Chat request failed.";
9278
+ status.value = "error";
9279
+ }
9280
+ } finally {
9281
+ abortController = null;
9282
+ }
9283
+ };
9284
+ const resendLast = () => {
9285
+ if (isStreaming.value) return;
9286
+ const lastUser = [...turns.value].reverse().find((turn) => turn.role === "user");
9287
+ if (lastUser) void send(lastUser.text);
9288
+ };
9289
+ const clearError = () => {
9290
+ errorMessage.value = "";
9291
+ };
9292
+ const deleteChat = async (chatId) => {
9293
+ await ofetch(`${API_BASE}/chats/${encodeURIComponent(chatId)}`, { method: "DELETE" });
9294
+ chats.value = chats.value.filter((item) => item.id !== chatId);
9295
+ if (activeChatId.value === chatId) newChat();
9296
+ };
9297
+ return {
9298
+ chats,
9299
+ groups,
9300
+ agentId,
9301
+ model,
9302
+ isLoadingChats,
9303
+ activeSession,
9304
+ activeChatId,
9305
+ activeChatName,
9306
+ turns,
9307
+ status,
9308
+ isStreaming,
9309
+ errorMessage,
9310
+ connectState,
9311
+ probeConnection,
9312
+ connect,
9313
+ ensureConnection,
9314
+ aiConnectStateFromError,
9315
+ loadChats,
9316
+ openChat,
9317
+ newChat,
9318
+ send,
9319
+ stop,
9320
+ resendLast,
9321
+ clearError,
9322
+ deleteChat
9323
+ };
9324
+ });
9325
+
8980
9326
  function createPersistPlugin(options) {
8981
9327
  const { storage, httpEndpoint, ssr = false, debounceMs = 150 } = options;
8982
9328
  return (ctx) => {
@@ -9084,6 +9430,46 @@ function clearCbsStateKey() {
9084
9430
  if (typeof localStorage !== "undefined") localStorage.removeItem(CBS_STATE_KEY_STORAGE);
9085
9431
  }
9086
9432
 
9433
+ const useQwenpawChat = () => {
9434
+ const store = useQwenpawChatStore();
9435
+ const refs = storeToRefs(store);
9436
+ return {
9437
+ get chats() {
9438
+ return refs.chats.value;
9439
+ },
9440
+ get turns() {
9441
+ return refs.turns.value;
9442
+ },
9443
+ get isLoadingChats() {
9444
+ return refs.isLoadingChats.value;
9445
+ },
9446
+ get isStreaming() {
9447
+ return refs.isStreaming.value;
9448
+ },
9449
+ get errorMessage() {
9450
+ return refs.errorMessage.value;
9451
+ },
9452
+ get connectState() {
9453
+ return refs.connectState.value;
9454
+ },
9455
+ status: () => store.probeConnection(),
9456
+ ensureConnection: () => store.ensureConnection(),
9457
+ connect: async () => {
9458
+ await store.connect();
9459
+ },
9460
+ loadChats: () => store.loadChats(),
9461
+ openChat: (chat) => store.openChat(chat),
9462
+ newChat: () => store.newChat(),
9463
+ send: (text, files = []) => store.send(text, files),
9464
+ stop: () => store.stop(),
9465
+ deleteChat: (chatId) => store.deleteChat(chatId)
9466
+ };
9467
+ };
9468
+ const useQwenpawChatStoreRaw = () => {
9469
+ const store = useQwenpawChatStore();
9470
+ return toRaw(store);
9471
+ };
9472
+
9087
9473
  const formatValue = (value) => {
9088
9474
  const s = typeof value === "number" ? String(value) : value;
9089
9475
  return /\s/.test(s) ? `"${s}"` : s;
@@ -9106,4 +9492,4 @@ const buildFilter = (conditions) => {
9106
9492
  return conditions.map((c) => `${c.field}:${c.op}:${formatScalarOrList(c)}`).join(" AND ");
9107
9493
  };
9108
9494
 
9109
- export { ACTION_KIND, ACTION_KINDS, ACTION_RESULT_FIELDS, AUTHZ_ENDPOINT, AUTHZ_PROXY_PATH, AUTH_ENDPOINT, BARS_DEFAULTS, BARS_ENDPOINT, CBS_STATE_KEY_STORAGE, CHART_INTERVAL, CONDITION_FIELDS, CONDITION_OPERATORS, CONDITION_OPERATOR_LABELS, CONDITION_OPERATOR_SYMBOL_TO_WORD, CONDITION_OPERATOR_VALUE_KINDS, CONDITION_TYPE, CONTENT_DEFAULTS, CONTENT_ENDPOINT, CONTENT_FILTER_OPERATOR, CONTENT_FILTER_SCALAR_OPERATOR, CONTENT_TYPE, CONTENT_TYPES_DEFAULTS, CONTENT_TYPES_ENDPOINT, CONTENT_TYPE_CATEGORY, CONTENT_TYPE_NAMES, COOKIE_SAME_SITE, CRON_PRESETS, CmsError, DEFAULT_CRON_SCHEDULE, DEFAULT_EVENT_CONTENT_TYPE, DEFAULT_LLM_QUERY_TOOLS, EVENT_PAYLOAD_FIELDS, EVENT_TYPE, EVENT_TYPE_OPTIONS, EXECUTIONS_DEFAULTS, EXECUTIONS_ENDPOINT, EXECUTION_STATUS, EXECUTION_STATUSES, EXECUTION_TRANSITION, EXECUTION_TYPE, GOV_ACTION_BY_CT, GOV_ACTION_NAME, GOV_CONTENT_TYPE, GOV_CONTENT_TYPE_NAMES, GOV_COST_GROUP, GOV_DEFAULTS, GOV_ENDPOINT, GOV_USAGE_WINDOW, HISTORY_DEAL_ENTRY, HISTORY_DEFAULTS, HISTORY_ENDPOINT, HISTORY_ORDER_STATUS, HISTORY_SORT_BY, HISTORY_SORT_DIRECTION, HISTORY_TAB, HTTP_DEFAULTS, HTTP_HEADER, HTTP_RETRY_STATUS_CODES, KALSHI_CHART_INTERVAL, KALSHI_ENDPOINT, KALSHI_FUTURE_STATUS, KALSHI_LAST_TICKS_DEFAULTS, KALSHI_LIFECYCLE_STATUS, KALSHI_SERVER_STATUS, KALSHI_SETTLEMENT_RESULT, KALSHI_SYMBOL_TICKS_DEFAULTS, KALSHI_TRENDING_DEFAULTS, LEVERAGE_OPTIONS, LLM_ENDPOINT, LLM_EVAL_BOUNDS, LLM_PROVIDER_TYPE, LLM_QUERY_TOOL, LLM_QUERY_TOOL_OPTIONS, MONITORED_GROUPS_TYPE, MT5_ACCOUNT_STATUS, MT5_ACTION_NAME, MT5_ALL_ACTIONS, MT5_CHART_BAR_SOURCE, MT5_COMMISSION_MODE, MT5_COMMISSION_VOLUME_TYPE, MT5_DEAL_ENTRY, MT5_EXECUTION_MODE, MT5_FINANCIAL_ACTIONS, MT5_INTERVAL, MT5_LOCAL_ACTIONS, MT5_MARKET_STATUS, MT5_OPERATIONAL_ACTIONS, MT5_ORDER_DURATION, MT5_ORDER_KIND, MT5_ORDER_STATE, MT5_ORDER_STATE_NAME, MT5_ORDER_TYPE, MT5_POSITION_TYPE, MT5_SERVER_NAME, MT5_SERVER_STATE, MT5_SYNC_PHASE, MT5_TRADE_MODE, MT5_TRADE_SIDE, MT5_TRADING_ACTIONS, MT5_VIEWER_ACTIONS, NOTIFICATIONS_ENDPOINT, NOTIFICATION_FALLBACK_POLICY, NOTIFICATION_TEMPLATE_STATE, PACKS_AUDIT_ENDPOINT, PACKS_ENDPOINT, PEOPLE_ACTION_BY_CT, PEOPLE_ACTION_NAME, PEOPLE_CONTENT_TYPE, PEOPLE_CONTENT_TYPE_NAMES, PEOPLE_COPILOT_ENDPOINT, PEOPLE_DEFAULTS, PEOPLE_ENDPOINT, PEOPLE_FORK_ACTION, PEOPLE_MIGRATE_ACTION, PEOPLE_PACK_ID, PEOPLE_SUBJECT_KIND, PEOPLE_SYSTEM_ONLY_ACTIONS, PEOPLE_TARGET_TYPE, PERSIST_KEY, PUBLIC_MARKETS_TYPE, REPORT_TEMPLATES_ENDPOINT, RULES_DEFAULTS, RULES_ENDPOINT, SETTINGS_ENDPOINT, SILENT_LOGIN_MESSAGE, SORT_DIRECTION, STORE_PERSIST_KEY, SUM_WITHIN_DAYS, TOKEN_STORAGE_KEY, TRIGGER_MODE, TRIGGER_TYPE, TokenManager, WS_AUTH_TIMEOUT_MS, WS_CLOSE_CODE, WS_CONNECTION_STATE, WS_EVENT_NAME, WS_MAX_SUBSCRIPTIONS, WS_MESSAGE_TYPE, WS_PING_INTERVAL_MS, WS_RECONNECT_INITIAL_MS, WS_RECONNECT_JITTER_MS, WS_RECONNECT_MAX_MS, actionDefByActionName, actionDefByKind, actionsFromExecution, actionsToExecutionParams, buildCronTrigger, buildEventTrigger, buildFilter, buildSignalTrigger, clearCbsStateKey, coerceEventType, cookieStorage, createApi, createAuthService, createAuthzService, createBarsService, createCmsSDK, createContentService, createContentTypesService, createEaeraWebSocket, createExecutionsService, createGovService, createHistoryService, createKalshiService, createLlmService, createNotificationsService, createPeopleHistoryService, createPeopleService, createPersistPlugin, createSettingsService, eventPayloadFieldsFor, isKnownEventType, isSystemOnlyAction, llmEvalOf, localStorageAdapter, memoryStorage, normalizeChartInterval, normalizeConditionOperator, parseActionResponse, promptNameOf, queryToolsOf, readCbsStateKey, resolveStorage, resultOutputOf, scheduleOf, serializeAction, serializeActionParams, signalNameOf, triggerModeOf, useAuthStore, useAuthzStore, useBarsStore, useContentStore, useExecutionsStore, useGovStore, useHistoryStore, useKalshiStore, useLlmProvidersStore, useLlmStore, usePeopleStore, useRulesStore, useSettingsStore, useWsStore };
9495
+ export { ACTION_KIND, ACTION_KINDS, ACTION_RESULT_FIELDS, AUTHZ_ENDPOINT, AUTHZ_PROXY_PATH, AUTH_ENDPOINT, BARS_DEFAULTS, BARS_ENDPOINT, CBS_STATE_KEY_STORAGE, CHART_INTERVAL, CONDITION_FIELDS, CONDITION_OPERATORS, CONDITION_OPERATOR_LABELS, CONDITION_OPERATOR_SYMBOL_TO_WORD, CONDITION_OPERATOR_VALUE_KINDS, CONDITION_TYPE, CONTENT_DEFAULTS, CONTENT_ENDPOINT, CONTENT_FILTER_OPERATOR, CONTENT_FILTER_SCALAR_OPERATOR, CONTENT_TYPE, CONTENT_TYPES_DEFAULTS, CONTENT_TYPES_ENDPOINT, CONTENT_TYPE_CATEGORY, CONTENT_TYPE_NAMES, COOKIE_SAME_SITE, CRON_PRESETS, CmsError, DEFAULT_CRON_SCHEDULE, DEFAULT_EVENT_CONTENT_TYPE, DEFAULT_LLM_QUERY_TOOLS, EVENT_PAYLOAD_FIELDS, EVENT_TYPE, EVENT_TYPE_OPTIONS, EXECUTIONS_DEFAULTS, EXECUTIONS_ENDPOINT, EXECUTION_STATUS, EXECUTION_STATUSES, EXECUTION_TRANSITION, EXECUTION_TYPE, GOV_ACTION_BY_CT, GOV_ACTION_NAME, GOV_CONTENT_TYPE, GOV_CONTENT_TYPE_NAMES, GOV_COST_GROUP, GOV_DEFAULTS, GOV_ENDPOINT, GOV_USAGE_WINDOW, HISTORY_DEAL_ENTRY, HISTORY_DEFAULTS, HISTORY_ENDPOINT, HISTORY_ORDER_STATUS, HISTORY_SORT_BY, HISTORY_SORT_DIRECTION, HISTORY_TAB, HTTP_DEFAULTS, HTTP_HEADER, HTTP_RETRY_STATUS_CODES, KALSHI_CHART_INTERVAL, KALSHI_ENDPOINT, KALSHI_FUTURE_STATUS, KALSHI_LAST_TICKS_DEFAULTS, KALSHI_LIFECYCLE_STATUS, KALSHI_SERVER_STATUS, KALSHI_SETTLEMENT_RESULT, KALSHI_SYMBOL_TICKS_DEFAULTS, KALSHI_TRENDING_DEFAULTS, LEVERAGE_OPTIONS, LLM_ENDPOINT, LLM_EVAL_BOUNDS, LLM_PROVIDER_TYPE, LLM_QUERY_TOOL, LLM_QUERY_TOOL_OPTIONS, MONITORED_GROUPS_TYPE, MT5_ACCOUNT_STATUS, MT5_ACTION_NAME, MT5_ALL_ACTIONS, MT5_CHART_BAR_SOURCE, MT5_COMMISSION_MODE, MT5_COMMISSION_VOLUME_TYPE, MT5_DEAL_ENTRY, MT5_EXECUTION_MODE, MT5_FINANCIAL_ACTIONS, MT5_INTERVAL, MT5_LOCAL_ACTIONS, MT5_MARKET_STATUS, MT5_OPERATIONAL_ACTIONS, MT5_ORDER_DURATION, MT5_ORDER_KIND, MT5_ORDER_STATE, MT5_ORDER_STATE_NAME, MT5_ORDER_TYPE, MT5_POSITION_TYPE, MT5_SERVER_NAME, MT5_SERVER_STATE, MT5_SYNC_PHASE, MT5_TRADE_MODE, MT5_TRADE_SIDE, MT5_TRADING_ACTIONS, MT5_VIEWER_ACTIONS, NOTIFICATIONS_ENDPOINT, NOTIFICATION_FALLBACK_POLICY, NOTIFICATION_TEMPLATE_STATE, PACKS_AUDIT_ENDPOINT, PACKS_ENDPOINT, PEOPLE_ACTION_BY_CT, PEOPLE_ACTION_NAME, PEOPLE_CONTENT_TYPE, PEOPLE_CONTENT_TYPE_NAMES, PEOPLE_COPILOT_ENDPOINT, PEOPLE_DEFAULTS, PEOPLE_ENDPOINT, PEOPLE_FORK_ACTION, PEOPLE_MIGRATE_ACTION, PEOPLE_PACK_ID, PEOPLE_SUBJECT_KIND, PEOPLE_SYSTEM_ONLY_ACTIONS, PEOPLE_TARGET_TYPE, PERSIST_KEY, PUBLIC_MARKETS_TYPE, REPORT_TEMPLATES_ENDPOINT, RULES_DEFAULTS, RULES_ENDPOINT, SETTINGS_ENDPOINT, SILENT_LOGIN_MESSAGE, SORT_DIRECTION, STORE_PERSIST_KEY, SUM_WITHIN_DAYS, TOKEN_STORAGE_KEY, TRIGGER_MODE, TRIGGER_TYPE, TokenManager, WS_AUTH_TIMEOUT_MS, WS_CLOSE_CODE, WS_CONNECTION_STATE, WS_EVENT_NAME, WS_MAX_SUBSCRIPTIONS, WS_MESSAGE_TYPE, WS_PING_INTERVAL_MS, WS_RECONNECT_INITIAL_MS, WS_RECONNECT_JITTER_MS, WS_RECONNECT_MAX_MS, actionDefByActionName, actionDefByKind, actionsFromExecution, actionsToExecutionParams, buildCronTrigger, buildEventTrigger, buildFilter, buildSignalTrigger, clearCbsStateKey, coerceEventType, cookieStorage, createApi, createAuthService, createAuthzService, createBarsService, createCmsSDK, createContentService, createContentTypesService, createEaeraWebSocket, createExecutionsService, createGovService, createHistoryService, createKalshiService, createLlmService, createNotificationsService, createPeopleHistoryService, createPeopleService, createPersistPlugin, createQwenpawParseState, createSettingsService, eventPayloadFieldsFor, extractEventError, extractEventText, isKnownEventType, isSystemOnlyAction, iterateQwenpawEvents, llmEvalOf, localStorageAdapter, memoryStorage, normalizeChartInterval, normalizeConditionOperator, parseActionResponse, parseQwenpawDataLine, promptNameOf, queryToolsOf, readCbsStateKey, resolveStorage, resultOutputOf, scheduleOf, serializeAction, serializeActionParams, signalNameOf, toStreamChunk, triggerModeOf, useAuthStore, useAuthzStore, useBarsStore, useContentStore, useExecutionsStore, useGovStore, useHistoryStore, useKalshiStore, useLlmProvidersStore, useLlmStore, usePeopleStore, useQwenpawChat, useQwenpawChatStore, useQwenpawChatStoreRaw, useRulesStore, useSettingsStore, useWsStore };
@@ -1 +1 @@
1
- {"version":3,"file":"nuxt.d.ts","sourceRoot":"","sources":["../src/nuxt.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AACtF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qCAAqC,CAAC;AAEvE,MAAM,WAAW,cAAc;IAC7B;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,8CAA8C;IAC9C,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,+DAA+D;IAC/D,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,wFAAwF;IACxF,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,kFAAkF;IAClF,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAqBD;;;;;;;;;;;;;GAaG;;AACH,wBA+BG"}
1
+ {"version":3,"file":"nuxt.d.ts","sourceRoot":"","sources":["../src/nuxt.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AACtF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qCAAqC,CAAC;AAEvE,MAAM,WAAW,cAAc;IAC7B;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,8CAA8C;IAC9C,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,+DAA+D;IAC/D,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,wFAAwF;IACxF,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,kFAAkF;IAClF,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AA6BD;;;;;;;;;;;;;GAaG;;AACH,wBAoCG"}
package/dist/nuxt.js CHANGED
@@ -16,7 +16,15 @@ const SERVER_HANDLERS = [
16
16
  ["/api/cms/idp-link-callback", "server/auth/idp-link-callback.get.js"],
17
17
  ["/api/cms/idp-me", "server/auth/idp-me.get.js"],
18
18
  ["/api/cms/portal-access", "server/authz/portal-access.get.js"],
19
- ["/api/cms-sdk/persist", "server/persist.post.js"]
19
+ ["/api/cms-sdk/persist", "server/persist.post.js"],
20
+ ["/api/cms/ai/qwenpaw/session", "server/ai/qwenpaw/session.get.js"],
21
+ ["/api/cms/ai/qwenpaw/session", "server/ai/qwenpaw/session.post.js"],
22
+ ["/api/cms/ai/qwenpaw/chats", "server/ai/qwenpaw/chats.get.js"],
23
+ ["/api/cms/ai/qwenpaw/chats/:chatId", "server/ai/qwenpaw/chats-id.delete.js"],
24
+ ["/api/cms/ai/qwenpaw/history", "server/ai/qwenpaw/history.get.js"],
25
+ ["/api/cms/ai/qwenpaw/chat", "server/ai/qwenpaw/chat.post.js"],
26
+ ["/api/cms/ai/qwenpaw/chat/stop", "server/ai/qwenpaw/chat/stop.post.js"],
27
+ ["/api/cms/ai/qwenpaw/upload", "server/ai/qwenpaw/upload.post.js"]
20
28
  ];
21
29
  const nuxt = defineNuxtModule({
22
30
  meta: {
@@ -40,6 +48,7 @@ const nuxt = defineNuxtModule({
40
48
  for (const [route, file] of SERVER_HANDLERS) {
41
49
  addServerHandler({ route, handler: resolve(file) });
42
50
  }
51
+ nuxt.options.runtimeConfig.qwenpaw ??= { baseUrl: "", agentId: "" };
43
52
  addPlugin({ src: resolve("runtime/plugin.js") });
44
53
  if (options.mock) {
45
54
  logger.warn("cms-sdk: mock mode is ON — domain services return fake data.");
@@ -0,0 +1,25 @@
1
+ import { defineEventHandler, readBody, createError } from 'h3';
2
+ import { c as qwenpawStop, p as postConsoleChatError } from '../../../../chunks/client-B7fm_H2u.js';
3
+ import { c as QWENPAW_MAX_SESSION_ID_LENGTH } from '../../../../chunks/qwenpaw.constant-BwpRhdCV.js';
4
+ import { r as requireCmsSession, a as resolveQwenpawConnection, b as resolveQwenpawServerConfig } from '../../../../chunks/connection-DGlB8IZD.js';
5
+
6
+ const stop_post = defineEventHandler(async (event) => {
7
+ requireCmsSession(event);
8
+ const body = await readBody(event);
9
+ const sessionId = (body?.sessionId ?? "").trim();
10
+ if (!sessionId || sessionId.length > QWENPAW_MAX_SESSION_ID_LENGTH) {
11
+ throw createError({ statusCode: 400, message: "Conversation session is required." });
12
+ }
13
+ const connection = resolveQwenpawConnection(event);
14
+ try {
15
+ return await qwenpawStop({
16
+ config: resolveQwenpawServerConfig(event),
17
+ target: { baseUrl: connection.baseUrl, agentId: connection.agentId },
18
+ sessionId
19
+ });
20
+ } catch (error) {
21
+ throw postConsoleChatError(error);
22
+ }
23
+ });
24
+
25
+ export { stop_post as default };
@@ -0,0 +1,61 @@
1
+ import { Readable } from 'node:stream';
2
+ import { defineEventHandler, readBody, createError, setResponseStatus, setResponseHeader, sendStream } from 'h3';
3
+ import { q as qwenpawChat, p as postConsoleChatError } from '../../../chunks/client-B7fm_H2u.js';
4
+ import { Q as QWENPAW_MAX_MESSAGE_LENGTH, a as QWENPAW_MAX_FILES, b as QWENPAW_MAX_FILE_NAME_LENGTH, c as QWENPAW_MAX_SESSION_ID_LENGTH } from '../../../chunks/qwenpaw.constant-BwpRhdCV.js';
5
+ import { r as requireCmsSession, a as resolveQwenpawConnection, b as resolveQwenpawServerConfig } from '../../../chunks/connection-DGlB8IZD.js';
6
+
7
+ const chat_post = defineEventHandler(async (event) => {
8
+ requireCmsSession(event);
9
+ const body = await readBody(event);
10
+ const text = (body?.text ?? "").trim();
11
+ if (text.length > QWENPAW_MAX_MESSAGE_LENGTH) {
12
+ throw createError({ statusCode: 413, message: "Message too long." });
13
+ }
14
+ const rawFiles = Array.isArray(body?.files) ? body.files.slice(0, QWENPAW_MAX_FILES) : [];
15
+ const files = rawFiles.map((file) => {
16
+ const url = (file?.url ?? "").trim();
17
+ const name = (file?.name ?? "").trim().slice(0, QWENPAW_MAX_FILE_NAME_LENGTH) || "attachment";
18
+ if (!url.startsWith("/") || url.length > 500 || url.includes("..")) {
19
+ throw createError({ statusCode: 400, message: "Invalid attachment reference." });
20
+ }
21
+ return { url, name, ...typeof file?.size === "number" ? { size: file.size } : {} };
22
+ });
23
+ if (!text && !files.length) {
24
+ throw createError({ statusCode: 400, message: "Message is required." });
25
+ }
26
+ const sessionId = (body?.sessionId ?? "").trim();
27
+ if (!sessionId || sessionId.length > QWENPAW_MAX_SESSION_ID_LENGTH) {
28
+ throw createError({ statusCode: 400, message: "Conversation session is required." });
29
+ }
30
+ const connection = resolveQwenpawConnection(event);
31
+ const upstreamAbort = new AbortController();
32
+ event.node.req.once("close", () => upstreamAbort.abort());
33
+ let upstream;
34
+ try {
35
+ upstream = await qwenpawChat({
36
+ config: resolveQwenpawServerConfig(event),
37
+ target: {
38
+ baseUrl: connection.baseUrl,
39
+ agentId: connection.agentId,
40
+ sessionId,
41
+ userId: "cms-sdk"
42
+ },
43
+ text,
44
+ files,
45
+ signal: upstreamAbort.signal
46
+ });
47
+ } catch (error) {
48
+ throw postConsoleChatError(error);
49
+ }
50
+ setResponseStatus(event, upstream.status);
51
+ setResponseHeader(event, "content-type", "text/event-stream");
52
+ setResponseHeader(event, "cache-control", "no-cache");
53
+ setResponseHeader(event, "connection", "keep-alive");
54
+ setResponseHeader(event, "x-accel-buffering", "no");
55
+ return sendStream(
56
+ event,
57
+ Readable.fromWeb(upstream.body)
58
+ );
59
+ });
60
+
61
+ export { chat_post as default };
@@ -0,0 +1,18 @@
1
+ import { defineEventHandler, getRouterParam, createError } from 'h3';
2
+ import { d as deleteQwenpawChat } from '../../../chunks/chats-F9H8sza4.js';
3
+ import { r as requireCmsSession, a as resolveQwenpawConnection } from '../../../chunks/connection-DGlB8IZD.js';
4
+
5
+ const chatsId_delete = defineEventHandler(async (event) => {
6
+ requireCmsSession(event);
7
+ const chatId = getRouterParam(event, "chatId") ?? "";
8
+ if (!chatId) {
9
+ throw createError({ statusCode: 400, message: "Missing chat id." });
10
+ }
11
+ const ok = await deleteQwenpawChat(resolveQwenpawConnection(event), chatId);
12
+ if (!ok) {
13
+ throw createError({ statusCode: 502, message: "Delete failed." });
14
+ }
15
+ return { deleted: true };
16
+ });
17
+
18
+ export { chatsId_delete as default };
@@ -0,0 +1,33 @@
1
+ import { defineEventHandler } from 'h3';
2
+ import { l as listQwenpawChats, a as listQwenpawGroups } from '../../../chunks/chats-F9H8sza4.js';
3
+ import { r as requireCmsSession, a as resolveQwenpawConnection, b as resolveQwenpawServerConfig } from '../../../chunks/connection-DGlB8IZD.js';
4
+
5
+ const chats_get = defineEventHandler(async (event) => {
6
+ requireCmsSession(event);
7
+ const connection = resolveQwenpawConnection(event);
8
+ const [chats, groups] = await Promise.all([
9
+ listQwenpawChats(connection),
10
+ listQwenpawGroups(connection)
11
+ ]);
12
+ const normalized = chats.sort((a, b) => (b.updated_at ?? "").localeCompare(a.updated_at ?? "")).map((chat) => ({
13
+ id: chat.id,
14
+ name: chat.name || "Conversation",
15
+ sessionId: chat.session_id,
16
+ updatedAt: chat.updated_at,
17
+ status: chat.status,
18
+ ...chat.group_id ? { groupId: chat.group_id } : {}
19
+ }));
20
+ const normalizedGroups = groups.sort((a, b) => (a.order ?? 0) - (b.order ?? 0)).map((group) => ({
21
+ id: group.id,
22
+ name: group.name,
23
+ order: group.order ?? 0,
24
+ kind: group.kind
25
+ }));
26
+ return {
27
+ chats: normalized,
28
+ groups: normalizedGroups,
29
+ agentId: resolveQwenpawServerConfig(event).agentId
30
+ };
31
+ });
32
+
33
+ export { chats_get as default };
@@ -0,0 +1,16 @@
1
+ import { defineEventHandler, getQuery, createError } from 'h3';
2
+ import { f as fetchChatHistory } from '../../../chunks/chats-F9H8sza4.js';
3
+ import { r as requireCmsSession, a as resolveQwenpawConnection } from '../../../chunks/connection-DGlB8IZD.js';
4
+
5
+ const history_get = defineEventHandler(async (event) => {
6
+ requireCmsSession(event);
7
+ const query = getQuery(event);
8
+ const chatId = typeof query.chatId === "string" ? query.chatId.trim() : "";
9
+ if (!chatId) {
10
+ throw createError({ statusCode: 400, message: "Missing chat id." });
11
+ }
12
+ const connection = resolveQwenpawConnection(event);
13
+ return await fetchChatHistory(connection, chatId);
14
+ });
15
+
16
+ export { history_get as default };
@@ -0,0 +1,14 @@
1
+ import { defineEventHandler } from 'h3';
2
+ import { r as requireCmsSession, a as resolveQwenpawConnection, h as hasQwenpawConnection } from '../../../chunks/connection-DGlB8IZD.js';
3
+
4
+ const session_get = defineEventHandler((event) => {
5
+ requireCmsSession(event);
6
+ const resolved = resolveQwenpawConnection(event);
7
+ return {
8
+ configured: hasQwenpawConnection(event),
9
+ baseUrl: resolved.baseUrl,
10
+ agentId: resolved.agentId
11
+ };
12
+ });
13
+
14
+ export { session_get as default };