@openclaw/zalouser 2026.5.2 → 2026.5.3-beta.2

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 (95) hide show
  1. package/dist/accounts-C00IMUgd.js +63 -0
  2. package/dist/accounts.runtime-uG7S8cXT.js +2 -0
  3. package/dist/api-BRwdUWuS.js +139 -0
  4. package/dist/api.js +7 -0
  5. package/dist/channel-ou_w_2j-.js +484 -0
  6. package/dist/channel-plugin-api.js +2 -0
  7. package/dist/channel.runtime-C9WxiAiR.js +25 -0
  8. package/dist/channel.setup-CiDeBFrn.js +10 -0
  9. package/dist/contract-api.js +3 -0
  10. package/dist/doctor-contract-DgqHp8E2.js +128 -0
  11. package/dist/doctor-contract-api.js +2 -0
  12. package/dist/index.js +27 -0
  13. package/dist/monitor-Cg7K_s_s.js +705 -0
  14. package/dist/runtime-QNU7vLgI.js +106 -0
  15. package/dist/runtime-api.js +22 -0
  16. package/dist/secret-contract-api.js +5 -0
  17. package/dist/security-audit-BZLhil-V.js +34 -0
  18. package/dist/send-BsmySxe3.js +534 -0
  19. package/dist/session-route-C0-Xr8bt.js +92 -0
  20. package/dist/setup-core-CqipqY98.js +40 -0
  21. package/dist/setup-entry.js +11 -0
  22. package/dist/setup-plugin-api.js +2 -0
  23. package/dist/setup-surface-NCOuKu-l.js +359 -0
  24. package/dist/shared-DSy8aIUx.js +120 -0
  25. package/dist/test-api.js +5 -0
  26. package/dist/zalo-js-CHCUlY3c.js +1279 -0
  27. package/package.json +15 -6
  28. package/api.ts +0 -9
  29. package/channel-plugin-api.ts +0 -3
  30. package/contract-api.ts +0 -2
  31. package/doctor-contract-api.ts +0 -1
  32. package/index.ts +0 -34
  33. package/runtime-api.ts +0 -67
  34. package/secret-contract-api.ts +0 -4
  35. package/setup-entry.ts +0 -9
  36. package/setup-plugin-api.ts +0 -2
  37. package/src/accounts.runtime.ts +0 -1
  38. package/src/accounts.test-mocks.ts +0 -14
  39. package/src/accounts.test.ts +0 -266
  40. package/src/accounts.ts +0 -131
  41. package/src/channel-api.ts +0 -20
  42. package/src/channel.adapters.ts +0 -391
  43. package/src/channel.directory.test.ts +0 -59
  44. package/src/channel.runtime.ts +0 -12
  45. package/src/channel.sendpayload.test.ts +0 -172
  46. package/src/channel.setup.test.ts +0 -33
  47. package/src/channel.setup.ts +0 -12
  48. package/src/channel.test.ts +0 -377
  49. package/src/channel.ts +0 -219
  50. package/src/config-schema.ts +0 -33
  51. package/src/directory.ts +0 -54
  52. package/src/doctor-contract.ts +0 -156
  53. package/src/doctor.test.ts +0 -77
  54. package/src/doctor.ts +0 -37
  55. package/src/group-policy.test.ts +0 -61
  56. package/src/group-policy.ts +0 -83
  57. package/src/message-sid.test.ts +0 -66
  58. package/src/message-sid.ts +0 -80
  59. package/src/monitor.account-scope.test.ts +0 -107
  60. package/src/monitor.group-gating.test.ts +0 -816
  61. package/src/monitor.send-mocks.ts +0 -20
  62. package/src/monitor.ts +0 -1044
  63. package/src/probe.test.ts +0 -60
  64. package/src/probe.ts +0 -35
  65. package/src/qr-temp-file.ts +0 -22
  66. package/src/reaction.test.ts +0 -19
  67. package/src/reaction.ts +0 -32
  68. package/src/runtime.ts +0 -9
  69. package/src/security-audit.test.ts +0 -80
  70. package/src/security-audit.ts +0 -71
  71. package/src/send.test.ts +0 -395
  72. package/src/send.ts +0 -272
  73. package/src/session-route.ts +0 -121
  74. package/src/setup-core.ts +0 -33
  75. package/src/setup-surface.test.ts +0 -363
  76. package/src/setup-surface.ts +0 -470
  77. package/src/setup-test-helpers.ts +0 -42
  78. package/src/shared.ts +0 -92
  79. package/src/status-issues.test.ts +0 -31
  80. package/src/status-issues.ts +0 -58
  81. package/src/test-helpers.ts +0 -26
  82. package/src/text-styles.test.ts +0 -203
  83. package/src/text-styles.ts +0 -540
  84. package/src/tool.test.ts +0 -212
  85. package/src/tool.ts +0 -210
  86. package/src/types.ts +0 -125
  87. package/src/zalo-js.credentials.test.ts +0 -465
  88. package/src/zalo-js.test-mocks.ts +0 -89
  89. package/src/zalo-js.ts +0 -1911
  90. package/src/zca-client.test.ts +0 -24
  91. package/src/zca-client.ts +0 -259
  92. package/src/zca-constants.ts +0 -55
  93. package/src/zca-js-exports.d.ts +0 -22
  94. package/test-api.ts +0 -21
  95. package/tsconfig.json +0 -16
package/src/tool.test.ts DELETED
@@ -1,212 +0,0 @@
1
- import { beforeEach, describe, expect, it, vi } from "vitest";
2
- import { sendImageZalouser, sendLinkZalouser, sendMessageZalouser } from "./send.js";
3
- import { createZalouserTool, executeZalouserTool } from "./tool.js";
4
- import {
5
- checkZaloAuthenticated,
6
- getZaloUserInfo,
7
- listZaloFriendsMatching,
8
- listZaloGroupsMatching,
9
- } from "./zalo-js.js";
10
-
11
- vi.mock("./send.js", () => ({
12
- sendMessageZalouser: vi.fn(),
13
- sendImageZalouser: vi.fn(),
14
- sendLinkZalouser: vi.fn(),
15
- sendReactionZalouser: vi.fn(),
16
- }));
17
-
18
- vi.mock("./zalo-js.js", () => ({
19
- checkZaloAuthenticated: vi.fn(),
20
- getZaloUserInfo: vi.fn(),
21
- listZaloFriendsMatching: vi.fn(),
22
- listZaloGroupsMatching: vi.fn(),
23
- }));
24
-
25
- const mockSendMessage = vi.mocked(sendMessageZalouser);
26
- const mockSendImage = vi.mocked(sendImageZalouser);
27
- const mockSendLink = vi.mocked(sendLinkZalouser);
28
- const mockCheckAuth = vi.mocked(checkZaloAuthenticated);
29
- const mockGetUserInfo = vi.mocked(getZaloUserInfo);
30
- const mockListFriends = vi.mocked(listZaloFriendsMatching);
31
- const mockListGroups = vi.mocked(listZaloGroupsMatching);
32
-
33
- function extractDetails(result: { content?: Array<{ type: string; text?: string }> }): unknown {
34
- const text = result.content?.[0]?.text ?? "{}";
35
- return JSON.parse(text) as unknown;
36
- }
37
-
38
- describe("executeZalouserTool", () => {
39
- beforeEach(() => {
40
- mockSendMessage.mockReset();
41
- mockSendImage.mockReset();
42
- mockSendLink.mockReset();
43
- mockCheckAuth.mockReset();
44
- mockGetUserInfo.mockReset();
45
- mockListFriends.mockReset();
46
- mockListGroups.mockReset();
47
- });
48
-
49
- it("returns error when send action is missing required fields", async () => {
50
- const result = await executeZalouserTool("tool-1", { action: "send" });
51
- expect(extractDetails(result)).toEqual({
52
- error: "threadId and message required for send action",
53
- });
54
- });
55
-
56
- it("sends text message for send action", async () => {
57
- mockSendMessage.mockResolvedValueOnce({ ok: true, messageId: "m-1" });
58
- const result = await executeZalouserTool("tool-1", {
59
- action: "send",
60
- threadId: "t-1",
61
- message: "hello",
62
- profile: "work",
63
- isGroup: true,
64
- });
65
- expect(mockSendMessage).toHaveBeenCalledWith("t-1", "hello", {
66
- profile: "work",
67
- isGroup: true,
68
- });
69
- expect(extractDetails(result)).toEqual({ success: true, messageId: "m-1" });
70
- });
71
-
72
- it("defaults send routing from ambient deliveryContext target", async () => {
73
- mockSendMessage.mockResolvedValueOnce({ ok: true, messageId: "m-ambient" });
74
- const tool = createZalouserTool({
75
- deliveryContext: {
76
- channel: "zalouser",
77
- to: "zalouser:g-ambient",
78
- },
79
- });
80
-
81
- const result = await tool.execute("tool-1", {
82
- action: "send",
83
- message: "hello",
84
- });
85
-
86
- expect(mockSendMessage).toHaveBeenCalledWith("g-ambient", "hello", {
87
- profile: undefined,
88
- isGroup: true,
89
- });
90
- expect(extractDetails(result)).toEqual({ success: true, messageId: "m-ambient" });
91
- });
92
-
93
- it("keeps explicit threadId over ambient delivery defaults", async () => {
94
- mockSendMessage.mockResolvedValueOnce({ ok: true, messageId: "m-explicit" });
95
- const tool = createZalouserTool({
96
- deliveryContext: {
97
- channel: "zalouser",
98
- to: "zalouser:g-ambient",
99
- },
100
- });
101
-
102
- await tool.execute("tool-1", {
103
- action: "send",
104
- threadId: "u-explicit",
105
- message: "hello",
106
- isGroup: false,
107
- });
108
-
109
- expect(mockSendMessage).toHaveBeenCalledWith("u-explicit", "hello", {
110
- profile: undefined,
111
- isGroup: false,
112
- });
113
- });
114
-
115
- it("does not route send actions from foreign ambient thread defaults", async () => {
116
- const tool = createZalouserTool({
117
- deliveryContext: {
118
- channel: "slack",
119
- to: "channel:C123",
120
- threadId: "1710000000.000100",
121
- },
122
- });
123
-
124
- const result = await tool.execute("tool-1", {
125
- action: "send",
126
- message: "hello",
127
- });
128
-
129
- expect(mockSendMessage).not.toHaveBeenCalled();
130
- expect(extractDetails(result)).toEqual({
131
- error: "threadId and message required for send action",
132
- });
133
- });
134
-
135
- it("returns tool error when send action fails", async () => {
136
- mockSendMessage.mockResolvedValueOnce({ ok: false, error: "blocked" });
137
- const result = await executeZalouserTool("tool-1", {
138
- action: "send",
139
- threadId: "t-1",
140
- message: "hello",
141
- });
142
- expect(extractDetails(result)).toEqual({ error: "blocked" });
143
- });
144
-
145
- it("routes image and link actions to correct helpers", async () => {
146
- mockSendImage.mockResolvedValueOnce({ ok: true, messageId: "img-1" });
147
- const imageResult = await executeZalouserTool("tool-1", {
148
- action: "image",
149
- threadId: "g-1",
150
- url: "https://example.com/image.jpg",
151
- message: "caption",
152
- isGroup: true,
153
- });
154
- expect(mockSendImage).toHaveBeenCalledWith("g-1", "https://example.com/image.jpg", {
155
- profile: undefined,
156
- caption: "caption",
157
- isGroup: true,
158
- });
159
- expect(extractDetails(imageResult)).toEqual({ success: true, messageId: "img-1" });
160
-
161
- mockSendLink.mockResolvedValueOnce({ ok: true, messageId: "lnk-1" });
162
- const linkResult = await executeZalouserTool("tool-1", {
163
- action: "link",
164
- threadId: "t-2",
165
- url: "https://openclaw.ai",
166
- message: "read this",
167
- });
168
- expect(mockSendLink).toHaveBeenCalledWith("t-2", "https://openclaw.ai", {
169
- profile: undefined,
170
- caption: "read this",
171
- isGroup: undefined,
172
- });
173
- expect(extractDetails(linkResult)).toEqual({ success: true, messageId: "lnk-1" });
174
- });
175
-
176
- it("returns friends/groups lists", async () => {
177
- mockListFriends.mockResolvedValueOnce([{ userId: "1", displayName: "Alice" }]);
178
- mockListGroups.mockResolvedValueOnce([{ groupId: "2", name: "Work" }]);
179
-
180
- const friends = await executeZalouserTool("tool-1", {
181
- action: "friends",
182
- profile: "work",
183
- query: "ali",
184
- });
185
- expect(mockListFriends).toHaveBeenCalledWith("work", "ali");
186
- expect(extractDetails(friends)).toEqual([{ userId: "1", displayName: "Alice" }]);
187
-
188
- const groups = await executeZalouserTool("tool-1", {
189
- action: "groups",
190
- profile: "work",
191
- query: "wrk",
192
- });
193
- expect(mockListGroups).toHaveBeenCalledWith("work", "wrk");
194
- expect(extractDetails(groups)).toEqual([{ groupId: "2", name: "Work" }]);
195
- });
196
-
197
- it("reports me + status actions", async () => {
198
- mockGetUserInfo.mockResolvedValueOnce({ userId: "7", displayName: "Me" });
199
- mockCheckAuth.mockResolvedValueOnce(true);
200
-
201
- const me = await executeZalouserTool("tool-1", { action: "me", profile: "work" });
202
- expect(mockGetUserInfo).toHaveBeenCalledWith("work");
203
- expect(extractDetails(me)).toEqual({ userId: "7", displayName: "Me" });
204
-
205
- const status = await executeZalouserTool("tool-1", { action: "status", profile: "work" });
206
- expect(mockCheckAuth).toHaveBeenCalledWith("work");
207
- expect(extractDetails(status)).toEqual({
208
- authenticated: true,
209
- output: "authenticated",
210
- });
211
- });
212
- });
package/src/tool.ts DELETED
@@ -1,210 +0,0 @@
1
- import type { AnyAgentTool, OpenClawPluginToolContext } from "openclaw/plugin-sdk/core";
2
- import { formatErrorMessage } from "openclaw/plugin-sdk/error-runtime";
3
- import { Type } from "typebox";
4
- import { sendImageZalouser, sendLinkZalouser, sendMessageZalouser } from "./send.js";
5
- import { parseZalouserOutboundTarget } from "./session-route.js";
6
- import {
7
- checkZaloAuthenticated,
8
- getZaloUserInfo,
9
- listZaloFriendsMatching,
10
- listZaloGroupsMatching,
11
- } from "./zalo-js.js";
12
-
13
- const ACTIONS = ["send", "image", "link", "friends", "groups", "me", "status"] as const;
14
-
15
- type AgentToolResult = {
16
- content: Array<{ type: "text"; text: string }>;
17
- details: unknown;
18
- };
19
-
20
- function stringEnum<T extends readonly string[]>(
21
- values: T,
22
- options: { description?: string } = {},
23
- ) {
24
- return Type.Unsafe<T[number]>({
25
- type: "string",
26
- enum: [...values],
27
- ...options,
28
- });
29
- }
30
-
31
- const ZalouserToolSchema = Type.Object(
32
- {
33
- action: stringEnum(ACTIONS, { description: `Action to perform: ${ACTIONS.join(", ")}` }),
34
- threadId: Type.Optional(Type.String({ description: "Thread ID for messaging" })),
35
- message: Type.Optional(Type.String({ description: "Message text" })),
36
- isGroup: Type.Optional(Type.Boolean({ description: "Is group chat" })),
37
- profile: Type.Optional(Type.String({ description: "Profile name" })),
38
- query: Type.Optional(Type.String({ description: "Search query" })),
39
- url: Type.Optional(Type.String({ description: "URL for media/link" })),
40
- },
41
- { additionalProperties: false },
42
- );
43
-
44
- type ToolParams = {
45
- action: (typeof ACTIONS)[number];
46
- threadId?: string;
47
- message?: string;
48
- isGroup?: boolean;
49
- profile?: string;
50
- query?: string;
51
- url?: string;
52
- };
53
-
54
- type ZalouserToolContext = Pick<OpenClawPluginToolContext, "deliveryContext">;
55
-
56
- function json(payload: unknown): AgentToolResult {
57
- return {
58
- content: [{ type: "text", text: JSON.stringify(payload, null, 2) }],
59
- details: payload,
60
- };
61
- }
62
-
63
- function resolveAmbientZalouserTarget(context?: ZalouserToolContext): {
64
- threadId?: string;
65
- isGroup?: boolean;
66
- } {
67
- const deliveryContext = context?.deliveryContext;
68
- const rawTarget = deliveryContext?.to;
69
- if (
70
- (deliveryContext?.channel === undefined || deliveryContext.channel === "zalouser") &&
71
- typeof rawTarget === "string" &&
72
- rawTarget.trim()
73
- ) {
74
- try {
75
- return parseZalouserOutboundTarget(rawTarget);
76
- } catch {
77
- // Ignore unrelated delivery targets; explicit tool params still win.
78
- }
79
- }
80
- if (deliveryContext?.channel && deliveryContext.channel !== "zalouser") {
81
- return {};
82
- }
83
- const ambientThreadId = deliveryContext?.threadId;
84
- if (typeof ambientThreadId === "string" && ambientThreadId.trim()) {
85
- return { threadId: ambientThreadId.trim() };
86
- }
87
- if (typeof ambientThreadId === "number" && Number.isFinite(ambientThreadId)) {
88
- return { threadId: String(ambientThreadId) };
89
- }
90
- return {};
91
- }
92
-
93
- function resolveZalouserSendTarget(params: ToolParams, context?: ZalouserToolContext) {
94
- const explicitThreadId = typeof params.threadId === "string" ? params.threadId.trim() : "";
95
- const ambientTarget = resolveAmbientZalouserTarget(context);
96
- return {
97
- threadId: explicitThreadId || ambientTarget.threadId,
98
- isGroup: typeof params.isGroup === "boolean" ? params.isGroup : ambientTarget.isGroup,
99
- };
100
- }
101
-
102
- export async function executeZalouserTool(
103
- _toolCallId: string,
104
- params: ToolParams,
105
- _signal?: AbortSignal,
106
- _onUpdate?: unknown,
107
- context?: ZalouserToolContext,
108
- ): Promise<AgentToolResult> {
109
- try {
110
- switch (params.action) {
111
- case "send": {
112
- const target = resolveZalouserSendTarget(params, context);
113
- if (!target.threadId || !params.message) {
114
- throw new Error("threadId and message required for send action");
115
- }
116
- const result = await sendMessageZalouser(target.threadId, params.message, {
117
- profile: params.profile,
118
- isGroup: target.isGroup,
119
- });
120
- if (!result.ok) {
121
- throw new Error(result.error || "Failed to send message");
122
- }
123
- return json({ success: true, messageId: result.messageId });
124
- }
125
-
126
- case "image": {
127
- const target = resolveZalouserSendTarget(params, context);
128
- if (!target.threadId) {
129
- throw new Error("threadId required for image action");
130
- }
131
- if (!params.url) {
132
- throw new Error("url required for image action");
133
- }
134
- const result = await sendImageZalouser(target.threadId, params.url, {
135
- profile: params.profile,
136
- caption: params.message,
137
- isGroup: target.isGroup,
138
- });
139
- if (!result.ok) {
140
- throw new Error(result.error || "Failed to send image");
141
- }
142
- return json({ success: true, messageId: result.messageId });
143
- }
144
-
145
- case "link": {
146
- const target = resolveZalouserSendTarget(params, context);
147
- if (!target.threadId || !params.url) {
148
- throw new Error("threadId and url required for link action");
149
- }
150
- const result = await sendLinkZalouser(target.threadId, params.url, {
151
- profile: params.profile,
152
- caption: params.message,
153
- isGroup: target.isGroup,
154
- });
155
- if (!result.ok) {
156
- throw new Error(result.error || "Failed to send link");
157
- }
158
- return json({ success: true, messageId: result.messageId });
159
- }
160
-
161
- case "friends": {
162
- const rows = await listZaloFriendsMatching(params.profile, params.query);
163
- return json(rows);
164
- }
165
-
166
- case "groups": {
167
- const rows = await listZaloGroupsMatching(params.profile, params.query);
168
- return json(rows);
169
- }
170
-
171
- case "me": {
172
- const info = await getZaloUserInfo(params.profile);
173
- return json(info ?? { error: "Not authenticated" });
174
- }
175
-
176
- case "status": {
177
- const authenticated = await checkZaloAuthenticated(params.profile);
178
- return json({
179
- authenticated,
180
- output: authenticated ? "authenticated" : "not authenticated",
181
- });
182
- }
183
-
184
- default: {
185
- params.action satisfies never;
186
- throw new Error(
187
- `Unknown action: ${String(params.action)}. Valid actions: send, image, link, friends, groups, me, status`,
188
- );
189
- }
190
- }
191
- } catch (err) {
192
- return json({
193
- error: formatErrorMessage(err),
194
- });
195
- }
196
- }
197
-
198
- export function createZalouserTool(context?: ZalouserToolContext): AnyAgentTool {
199
- return {
200
- name: "zalouser",
201
- label: "Zalo Personal",
202
- description:
203
- "Send messages and access data via Zalo personal account. " +
204
- "Actions: send (text message), image (send image URL), link (send link), " +
205
- "friends (list/search friends), groups (list groups), me (profile info), status (auth check).",
206
- parameters: ZalouserToolSchema,
207
- execute: async (toolCallId, params, signal, onUpdate) =>
208
- await executeZalouserTool(toolCallId, params as ToolParams, signal, onUpdate, context),
209
- } satisfies AnyAgentTool;
210
- }
package/src/types.ts DELETED
@@ -1,125 +0,0 @@
1
- import type { Style } from "./zca-constants.js";
2
-
3
- export type ZcaFriend = {
4
- userId: string;
5
- displayName: string;
6
- avatar?: string;
7
- };
8
-
9
- export type ZaloGroup = {
10
- groupId: string;
11
- name: string;
12
- memberCount?: number;
13
- };
14
-
15
- export type ZaloGroupMember = {
16
- userId: string;
17
- displayName: string;
18
- avatar?: string;
19
- };
20
-
21
- export type ZaloEventMessage = {
22
- msgId: string;
23
- cliMsgId: string;
24
- uidFrom: string;
25
- idTo: string;
26
- msgType: string;
27
- st: number;
28
- at: number;
29
- cmd: number;
30
- ts: string | number;
31
- };
32
-
33
- export type ZaloInboundMessage = {
34
- threadId: string;
35
- isGroup: boolean;
36
- senderId: string;
37
- senderName?: string;
38
- groupName?: string;
39
- content: string;
40
- commandContent?: string;
41
- timestampMs: number;
42
- msgId?: string;
43
- cliMsgId?: string;
44
- hasAnyMention?: boolean;
45
- wasExplicitlyMentioned?: boolean;
46
- canResolveExplicitMention?: boolean;
47
- implicitMention?: boolean;
48
- eventMessage?: ZaloEventMessage;
49
- raw: unknown;
50
- };
51
-
52
- export type ZcaUserInfo = {
53
- userId: string;
54
- displayName: string;
55
- avatar?: string;
56
- };
57
-
58
- export type ZaloSendOptions = {
59
- profile?: string;
60
- mediaUrl?: string;
61
- caption?: string;
62
- isGroup?: boolean;
63
- mediaLocalRoots?: readonly string[];
64
- mediaReadFile?: (filePath: string) => Promise<Buffer>;
65
- textMode?: "markdown" | "plain";
66
- textChunkMode?: "length" | "newline";
67
- textChunkLimit?: number;
68
- textStyles?: Style[];
69
- };
70
-
71
- export type ZaloSendResult = {
72
- ok: boolean;
73
- messageId?: string;
74
- error?: string;
75
- };
76
-
77
- export type ZaloGroupContext = {
78
- groupId: string;
79
- name?: string;
80
- members?: string[];
81
- };
82
-
83
- export type ZaloAuthStatus = {
84
- connected: boolean;
85
- message: string;
86
- };
87
-
88
- type ZalouserToolConfig = { allow?: string[]; deny?: string[] };
89
-
90
- export type ZalouserGroupConfig = {
91
- enabled?: boolean;
92
- requireMention?: boolean;
93
- tools?: ZalouserToolConfig;
94
- };
95
-
96
- type ZalouserSharedConfig = {
97
- enabled?: boolean;
98
- name?: string;
99
- profile?: string;
100
- dangerouslyAllowNameMatching?: boolean;
101
- dmPolicy?: "pairing" | "allowlist" | "open" | "disabled";
102
- allowFrom?: Array<string | number>;
103
- historyLimit?: number;
104
- groupAllowFrom?: Array<string | number>;
105
- groupPolicy?: "open" | "allowlist" | "disabled";
106
- groups?: Record<string, ZalouserGroupConfig>;
107
- messagePrefix?: string;
108
- responsePrefix?: string;
109
- };
110
-
111
- export type ZalouserAccountConfig = ZalouserSharedConfig;
112
-
113
- export type ZalouserConfig = ZalouserSharedConfig & {
114
- defaultAccount?: string;
115
- accounts?: Record<string, ZalouserAccountConfig>;
116
- };
117
-
118
- export type ResolvedZalouserAccount = {
119
- accountId: string;
120
- name?: string;
121
- enabled: boolean;
122
- profile: string;
123
- authenticated: boolean;
124
- config: ZalouserAccountConfig;
125
- };