



























@@ -1459,129 +1459,6 @@ export const IMessageConfigSchema = IMessageAccountSchemaBase.extend({
14591459}
14601460});
146114611462-const BlueBubblesAllowFromEntry = z.union([z.string(), z.number()]);
1463-1464-const BlueBubblesActionSchema = z
1465-.object({
1466-reactions: z.boolean().optional(),
1467-edit: z.boolean().optional(),
1468-unsend: z.boolean().optional(),
1469-reply: z.boolean().optional(),
1470-sendWithEffect: z.boolean().optional(),
1471-renameGroup: z.boolean().optional(),
1472-setGroupIcon: z.boolean().optional(),
1473-addParticipant: z.boolean().optional(),
1474-removeParticipant: z.boolean().optional(),
1475-leaveGroup: z.boolean().optional(),
1476-sendAttachment: z.boolean().optional(),
1477-})
1478-.strict()
1479-.optional();
1480-1481-const BlueBubblesGroupConfigSchema = z
1482-.object({
1483-requireMention: z.boolean().optional(),
1484-tools: ToolPolicySchema,
1485-toolsBySender: ToolPolicyBySenderSchema,
1486-})
1487-.strict();
1488-1489-export const BlueBubblesAccountSchemaBase = z
1490-.object({
1491-name: z.string().optional(),
1492-capabilities: z.array(z.string()).optional(),
1493-markdown: MarkdownConfigSchema,
1494-configWrites: z.boolean().optional(),
1495-enabled: z.boolean().optional(),
1496-serverUrl: z.string().optional(),
1497-password: SecretInputSchema.optional().register(sensitive),
1498-webhookPath: z.string().optional(),
1499-dmPolicy: DmPolicySchema.optional().default("pairing"),
1500-allowFrom: z.array(BlueBubblesAllowFromEntry).optional(),
1501-groupAllowFrom: z.array(BlueBubblesAllowFromEntry).optional(),
1502-groupPolicy: GroupPolicySchema.optional().default("allowlist"),
1503-contextVisibility: ContextVisibilityModeSchema.optional(),
1504-historyLimit: z.number().int().min(0).optional(),
1505-dmHistoryLimit: z.number().int().min(0).optional(),
1506-dms: z.record(z.string(), DmConfigSchema.optional()).optional(),
1507-textChunkLimit: z.number().int().positive().optional(),
1508-sendTimeoutMs: z.number().int().positive().optional(),
1509-chunkMode: z.enum(["length", "newline"]).optional(),
1510-mediaMaxMb: z.number().int().positive().optional(),
1511-mediaLocalRoots: z.array(z.string()).optional(),
1512-sendReadReceipts: z.boolean().optional(),
1513-network: z
1514-.object({
1515-dangerouslyAllowPrivateNetwork: z.boolean().optional(),
1516-})
1517-.strict()
1518-.optional(),
1519-blockStreaming: z.boolean().optional(),
1520-blockStreamingCoalesce: BlockStreamingCoalesceSchema.optional(),
1521-groups: z.record(z.string(), BlueBubblesGroupConfigSchema.optional()).optional(),
1522-enrichGroupParticipantsFromContacts: z.boolean().optional(),
1523-heartbeat: ChannelHeartbeatVisibilitySchema,
1524-healthMonitor: ChannelHealthMonitorSchema,
1525-responsePrefix: z.string().optional(),
1526-coalesceSameSenderDms: z.boolean().optional(),
1527-})
1528-.strict();
1529-1530-// Account-level schemas skip allowFrom validation because accounts inherit
1531-// allowFrom from the parent channel config at runtime.
1532-// Validation is enforced at the top-level BlueBubblesConfigSchema instead.
1533-export const BlueBubblesAccountSchema = BlueBubblesAccountSchemaBase;
1534-1535-export const BlueBubblesConfigSchema = BlueBubblesAccountSchemaBase.extend({
1536-accounts: z.record(z.string(), BlueBubblesAccountSchema.optional()).optional(),
1537-defaultAccount: z.string().optional(),
1538-actions: BlueBubblesActionSchema,
1539-}).superRefine((value, ctx) => {
1540-requireOpenAllowFrom({
1541-policy: value.dmPolicy,
1542-allowFrom: value.allowFrom,
1543- ctx,
1544-path: ["allowFrom"],
1545-message:
1546-'channels.bluebubbles.dmPolicy="open" requires channels.bluebubbles.allowFrom to include "*"',
1547-});
1548-requireAllowlistAllowFrom({
1549-policy: value.dmPolicy,
1550-allowFrom: value.allowFrom,
1551- ctx,
1552-path: ["allowFrom"],
1553-message:
1554-'channels.bluebubbles.dmPolicy="allowlist" requires channels.bluebubbles.allowFrom to contain at least one sender ID',
1555-});
1556-1557-if (!value.accounts) {
1558-return;
1559-}
1560-for (const [accountId, account] of Object.entries(value.accounts)) {
1561-if (!account) {
1562-continue;
1563-}
1564-const effectivePolicy = account.dmPolicy ?? value.dmPolicy;
1565-const effectiveAllowFrom = account.allowFrom ?? value.allowFrom;
1566-requireOpenAllowFrom({
1567-policy: effectivePolicy,
1568-allowFrom: effectiveAllowFrom,
1569- ctx,
1570-path: ["accounts", accountId, "allowFrom"],
1571-message:
1572-'channels.bluebubbles.accounts.*.dmPolicy="open" requires channels.bluebubbles.accounts.*.allowFrom (or channels.bluebubbles.allowFrom) to include "*"',
1573-});
1574-requireAllowlistAllowFrom({
1575-policy: effectivePolicy,
1576-allowFrom: effectiveAllowFrom,
1577- ctx,
1578-path: ["accounts", accountId, "allowFrom"],
1579-message:
1580-'channels.bluebubbles.accounts.*.dmPolicy="allowlist" requires channels.bluebubbles.accounts.*.allowFrom (or channels.bluebubbles.allowFrom) to contain at least one sender ID',
1581-});
1582-}
1583-});
1584-15851462export const MSTeamsChannelSchema = z
15861463.object({
15871464requireMention: z.boolean().optional(),
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。