@waifucave/discord-waifus 1.5.154
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +230 -0
- package/THIRD_PARTY_NOTICES.md +26 -0
- package/assets/ocr/eng.traineddata +0 -0
- package/bin/waifus.mjs +36 -0
- package/dist/api/errors.d.ts +9 -0
- package/dist/api/errors.js +23 -0
- package/dist/api/errors.js.map +1 -0
- package/dist/api/server.d.ts +19 -0
- package/dist/api/server.js +1290 -0
- package/dist/api/server.js.map +1 -0
- package/dist/backend/logger.d.ts +20 -0
- package/dist/backend/logger.js +65 -0
- package/dist/backend/logger.js.map +1 -0
- package/dist/backend/migrations.d.ts +4 -0
- package/dist/backend/migrations.js +521 -0
- package/dist/backend/migrations.js.map +1 -0
- package/dist/backend/redaction.d.ts +1 -0
- package/dist/backend/redaction.js +22 -0
- package/dist/backend/redaction.js.map +1 -0
- package/dist/backend/runtime.d.ts +30 -0
- package/dist/backend/runtime.js +49 -0
- package/dist/backend/runtime.js.map +1 -0
- package/dist/backend/server.d.ts +18 -0
- package/dist/backend/server.js +581 -0
- package/dist/backend/server.js.map +1 -0
- package/dist/cli/commands.d.ts +35 -0
- package/dist/cli/commands.js +510 -0
- package/dist/cli/commands.js.map +1 -0
- package/dist/cli/main.d.ts +1 -0
- package/dist/cli/main.js +12 -0
- package/dist/cli/main.js.map +1 -0
- package/dist/cli/parser.d.ts +10 -0
- package/dist/cli/parser.js +64 -0
- package/dist/cli/parser.js.map +1 -0
- package/dist/config/appConfig.d.ts +3 -0
- package/dist/config/appConfig.js +27 -0
- package/dist/config/appConfig.js.map +1 -0
- package/dist/config/layout.d.ts +13 -0
- package/dist/config/layout.js +173 -0
- package/dist/config/layout.js.map +1 -0
- package/dist/config/paths.d.ts +5 -0
- package/dist/config/paths.js +20 -0
- package/dist/config/paths.js.map +1 -0
- package/dist/config/prebuiltWaifus.d.ts +3 -0
- package/dist/config/prebuiltWaifus.js +106 -0
- package/dist/config/prebuiltWaifus.js.map +1 -0
- package/dist/discord/client.d.ts +394 -0
- package/dist/discord/client.js +1196 -0
- package/dist/discord/client.js.map +1 -0
- package/dist/discord/contextBuilder.d.ts +15 -0
- package/dist/discord/contextBuilder.js +18 -0
- package/dist/discord/contextBuilder.js.map +1 -0
- package/dist/discord/intents.d.ts +5 -0
- package/dist/discord/intents.js +21 -0
- package/dist/discord/intents.js.map +1 -0
- package/dist/discord/memberCache.d.ts +12 -0
- package/dist/discord/memberCache.js +55 -0
- package/dist/discord/memberCache.js.map +1 -0
- package/dist/discord/normalization.d.ts +34 -0
- package/dist/discord/normalization.js +330 -0
- package/dist/discord/normalization.js.map +1 -0
- package/dist/discord/rateLimit.d.ts +9 -0
- package/dist/discord/rateLimit.js +11 -0
- package/dist/discord/rateLimit.js.map +1 -0
- package/dist/orchestration/context.d.ts +85 -0
- package/dist/orchestration/context.js +200 -0
- package/dist/orchestration/context.js.map +1 -0
- package/dist/orchestration/decisions.d.ts +52 -0
- package/dist/orchestration/decisions.js +61 -0
- package/dist/orchestration/decisions.js.map +1 -0
- package/dist/orchestration/messageSplit.d.ts +6 -0
- package/dist/orchestration/messageSplit.js +118 -0
- package/dist/orchestration/messageSplit.js.map +1 -0
- package/dist/orchestration/ocr.d.ts +43 -0
- package/dist/orchestration/ocr.js +504 -0
- package/dist/orchestration/ocr.js.map +1 -0
- package/dist/orchestration/ocrPackages.d.ts +24 -0
- package/dist/orchestration/ocrPackages.js +85 -0
- package/dist/orchestration/ocrPackages.js.map +1 -0
- package/dist/orchestration/promptBlocks.d.ts +28 -0
- package/dist/orchestration/promptBlocks.js +232 -0
- package/dist/orchestration/promptBlocks.js.map +1 -0
- package/dist/orchestration/replyQuote.d.ts +7 -0
- package/dist/orchestration/replyQuote.js +198 -0
- package/dist/orchestration/replyQuote.js.map +1 -0
- package/dist/orchestration/reviewer.d.ts +5 -0
- package/dist/orchestration/reviewer.js +5 -0
- package/dist/orchestration/reviewer.js.map +1 -0
- package/dist/orchestration/runtime.d.ts +152 -0
- package/dist/orchestration/runtime.js +3535 -0
- package/dist/orchestration/runtime.js.map +1 -0
- package/dist/orchestration/session.d.ts +30 -0
- package/dist/orchestration/session.js +41 -0
- package/dist/orchestration/session.js.map +1 -0
- package/dist/orchestration/stageManager.d.ts +42 -0
- package/dist/orchestration/stageManager.js +50 -0
- package/dist/orchestration/stageManager.js.map +1 -0
- package/dist/providers/catalog.d.ts +6 -0
- package/dist/providers/catalog.js +212 -0
- package/dist/providers/catalog.js.map +1 -0
- package/dist/providers/pipelines.d.ts +13 -0
- package/dist/providers/pipelines.js +2388 -0
- package/dist/providers/pipelines.js.map +1 -0
- package/dist/providers/types.d.ts +91 -0
- package/dist/providers/types.js +2 -0
- package/dist/providers/types.js.map +1 -0
- package/dist/shared/queryLog.d.ts +39 -0
- package/dist/shared/queryLog.js +80 -0
- package/dist/shared/queryLog.js.map +1 -0
- package/dist/shared/schemas/common.d.ts +21 -0
- package/dist/shared/schemas/common.js +27 -0
- package/dist/shared/schemas/common.js.map +1 -0
- package/dist/shared/schemas/config.d.ts +57 -0
- package/dist/shared/schemas/config.js +49 -0
- package/dist/shared/schemas/config.js.map +1 -0
- package/dist/shared/schemas/domain.d.ts +825 -0
- package/dist/shared/schemas/domain.js +444 -0
- package/dist/shared/schemas/domain.js.map +1 -0
- package/dist/storage/atomic.d.ts +6 -0
- package/dist/storage/atomic.js +60 -0
- package/dist/storage/atomic.js.map +1 -0
- package/dist/storage/errors.d.ts +12 -0
- package/dist/storage/errors.js +23 -0
- package/dist/storage/errors.js.map +1 -0
- package/dist/storage/locks.d.ts +9 -0
- package/dist/storage/locks.js +42 -0
- package/dist/storage/locks.js.map +1 -0
- package/dist/storage/storageService.d.ts +25 -0
- package/dist/storage/storageService.js +66 -0
- package/dist/storage/storageService.js.map +1 -0
- package/dist-frontend/assets/index-B2bB3_2r.js +39 -0
- package/dist-frontend/assets/index-B2bB3_2r.js.map +1 -0
- package/dist-frontend/assets/index-Dj1L8Px-.css +1 -0
- package/dist-frontend/index.html +14 -0
- package/docs/api.md +162 -0
- package/docs/old-orchestrator-prompt.md +123 -0
- package/package.json +81 -0
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export type DiscordRateLimitDecision = {
|
|
2
|
+
shouldRetry: boolean;
|
|
3
|
+
retryAfterMs: number;
|
|
4
|
+
global: boolean;
|
|
5
|
+
};
|
|
6
|
+
export declare function parseDiscordRateLimit(status: number, headers: Headers, body?: {
|
|
7
|
+
retry_after?: number;
|
|
8
|
+
global?: boolean;
|
|
9
|
+
}): DiscordRateLimitDecision;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export function parseDiscordRateLimit(status, headers, body) {
|
|
2
|
+
const headerRetryAfter = headers.get("retry-after");
|
|
3
|
+
const jsonRetryAfter = body?.retry_after;
|
|
4
|
+
const retryAfterSeconds = jsonRetryAfter ?? (headerRetryAfter !== null ? Number.parseFloat(headerRetryAfter) : undefined);
|
|
5
|
+
return {
|
|
6
|
+
shouldRetry: status === 429 || retryAfterSeconds !== undefined,
|
|
7
|
+
retryAfterMs: Number.isFinite(retryAfterSeconds) ? Math.max(0, retryAfterSeconds * 1000) : 0,
|
|
8
|
+
global: body?.global === true || headers.get("x-ratelimit-global") === "true"
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=rateLimit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rateLimit.js","sourceRoot":"","sources":["../../src/discord/rateLimit.ts"],"names":[],"mappings":"AAMA,MAAM,UAAU,qBAAqB,CACnC,MAAc,EACd,OAAgB,EAChB,IAAiD;IAEjD,MAAM,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IACpD,MAAM,cAAc,GAAG,IAAI,EAAE,WAAW,CAAC;IACzC,MAAM,iBAAiB,GACrB,cAAc,IAAI,CAAC,gBAAgB,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAElG,OAAO;QACL,WAAW,EAAE,MAAM,KAAK,GAAG,IAAI,iBAAiB,KAAK,SAAS;QAC9D,YAAY,EAAE,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,iBAAkB,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7F,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,KAAK,MAAM;KAC9E,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export declare const ReactionSummarySchema: z.ZodObject<{
|
|
3
|
+
emoji: z.ZodString;
|
|
4
|
+
count: z.ZodNumber;
|
|
5
|
+
users: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
6
|
+
}, z.core.$strip>;
|
|
7
|
+
export declare const AttachmentImageSchema: z.ZodObject<{
|
|
8
|
+
url: z.ZodString;
|
|
9
|
+
contentType: z.ZodOptional<z.ZodString>;
|
|
10
|
+
contentLengthBytes: z.ZodOptional<z.ZodNumber>;
|
|
11
|
+
ocrText: z.ZodOptional<z.ZodString>;
|
|
12
|
+
}, z.core.$strip>;
|
|
13
|
+
export type AttachmentImage = z.infer<typeof AttachmentImageSchema>;
|
|
14
|
+
export declare const ContextMessageSchema: z.ZodObject<{
|
|
15
|
+
id: z.ZodString;
|
|
16
|
+
channelId: z.ZodString;
|
|
17
|
+
guildId: z.ZodOptional<z.ZodString>;
|
|
18
|
+
authorKind: z.ZodEnum<{
|
|
19
|
+
user: "user";
|
|
20
|
+
waifu: "waifu";
|
|
21
|
+
}>;
|
|
22
|
+
authorId: z.ZodString;
|
|
23
|
+
authorBot: z.ZodOptional<z.ZodBoolean>;
|
|
24
|
+
name: z.ZodString;
|
|
25
|
+
displayName: z.ZodString;
|
|
26
|
+
content: z.ZodString;
|
|
27
|
+
timestamp: z.ZodString;
|
|
28
|
+
sourceMessageIds: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
29
|
+
images: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
30
|
+
url: z.ZodString;
|
|
31
|
+
contentType: z.ZodOptional<z.ZodString>;
|
|
32
|
+
contentLengthBytes: z.ZodOptional<z.ZodNumber>;
|
|
33
|
+
ocrText: z.ZodOptional<z.ZodString>;
|
|
34
|
+
}, z.core.$strip>>>;
|
|
35
|
+
replyTo: z.ZodOptional<z.ZodObject<{
|
|
36
|
+
messageId: z.ZodString;
|
|
37
|
+
authorName: z.ZodOptional<z.ZodString>;
|
|
38
|
+
contentPreview: z.ZodOptional<z.ZodString>;
|
|
39
|
+
}, z.core.$strip>>;
|
|
40
|
+
reactions: z.ZodArray<z.ZodObject<{
|
|
41
|
+
emoji: z.ZodString;
|
|
42
|
+
count: z.ZodNumber;
|
|
43
|
+
users: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
44
|
+
}, z.core.$strip>>;
|
|
45
|
+
}, z.core.$strip>;
|
|
46
|
+
export type ContextMessage = z.infer<typeof ContextMessageSchema>;
|
|
47
|
+
export declare const OrchestratorNoReplyMarkerSchema: z.ZodObject<{
|
|
48
|
+
kind: z.ZodLiteral<"no_reply">;
|
|
49
|
+
timestamp: z.ZodString;
|
|
50
|
+
retriggerAfterSeconds: z.ZodNumber;
|
|
51
|
+
reasoning: z.ZodString;
|
|
52
|
+
}, z.core.$strip>;
|
|
53
|
+
export type OrchestratorNoReplyMarker = z.infer<typeof OrchestratorNoReplyMarkerSchema>;
|
|
54
|
+
export type MessageLikeForContext = {
|
|
55
|
+
id: string;
|
|
56
|
+
channelId: string;
|
|
57
|
+
guildId?: string;
|
|
58
|
+
authorId: string;
|
|
59
|
+
authorName: string;
|
|
60
|
+
authorDisplayName?: string;
|
|
61
|
+
authorBot?: boolean;
|
|
62
|
+
content: string;
|
|
63
|
+
createdAt: Date;
|
|
64
|
+
sourceMessageIds?: string[];
|
|
65
|
+
images?: AttachmentImage[];
|
|
66
|
+
replyTo?: {
|
|
67
|
+
messageId: string;
|
|
68
|
+
authorName?: string;
|
|
69
|
+
contentPreview?: string;
|
|
70
|
+
};
|
|
71
|
+
reactions?: Array<{
|
|
72
|
+
emoji: string;
|
|
73
|
+
count: number;
|
|
74
|
+
users?: string[];
|
|
75
|
+
}>;
|
|
76
|
+
};
|
|
77
|
+
export declare const WAIFU_CHUNK_COALESCE_WINDOW_MS = 30000;
|
|
78
|
+
export declare function buildContextMessages(messages: MessageLikeForContext[], options?: {
|
|
79
|
+
orchestratorAuthorIds?: string[];
|
|
80
|
+
waifuAuthorIds?: string[];
|
|
81
|
+
now?: Date;
|
|
82
|
+
}): ContextMessage[];
|
|
83
|
+
export declare function formatTimestamp(then: Date): string;
|
|
84
|
+
export declare function formatOrchestratorMessageBlock(message: ContextMessage): string;
|
|
85
|
+
export declare function formatWaifuContextBlock(message: ContextMessage): string;
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export const ReactionSummarySchema = z.object({
|
|
3
|
+
emoji: z.string(),
|
|
4
|
+
count: z.number().int().nonnegative(),
|
|
5
|
+
users: z.array(z.string()).optional()
|
|
6
|
+
});
|
|
7
|
+
export const AttachmentImageSchema = z.object({
|
|
8
|
+
url: z.string(),
|
|
9
|
+
contentType: z.string().optional(),
|
|
10
|
+
contentLengthBytes: z.number().int().nonnegative().optional(),
|
|
11
|
+
ocrText: z.string().optional()
|
|
12
|
+
});
|
|
13
|
+
export const ContextMessageSchema = z.object({
|
|
14
|
+
id: z.string(),
|
|
15
|
+
channelId: z.string(),
|
|
16
|
+
guildId: z.string().optional(),
|
|
17
|
+
authorKind: z.enum(["user", "waifu"]),
|
|
18
|
+
authorId: z.string(),
|
|
19
|
+
authorBot: z.boolean().optional(),
|
|
20
|
+
name: z.string(),
|
|
21
|
+
displayName: z.string(),
|
|
22
|
+
content: z.string(),
|
|
23
|
+
timestamp: z.string(),
|
|
24
|
+
sourceMessageIds: z.array(z.string()).optional(),
|
|
25
|
+
images: z.array(AttachmentImageSchema).optional(),
|
|
26
|
+
replyTo: z
|
|
27
|
+
.object({
|
|
28
|
+
messageId: z.string(),
|
|
29
|
+
authorName: z.string().optional(),
|
|
30
|
+
contentPreview: z.string().optional()
|
|
31
|
+
})
|
|
32
|
+
.optional(),
|
|
33
|
+
reactions: z.array(ReactionSummarySchema)
|
|
34
|
+
});
|
|
35
|
+
export const OrchestratorNoReplyMarkerSchema = z.object({
|
|
36
|
+
kind: z.literal("no_reply"),
|
|
37
|
+
timestamp: z.string(),
|
|
38
|
+
retriggerAfterSeconds: z.number().int(),
|
|
39
|
+
reasoning: z.string()
|
|
40
|
+
});
|
|
41
|
+
export const WAIFU_CHUNK_COALESCE_WINDOW_MS = 30_000;
|
|
42
|
+
export function buildContextMessages(messages, options = {}) {
|
|
43
|
+
const orchestratorIds = new Set(options.orchestratorAuthorIds ?? []);
|
|
44
|
+
const waifuIds = new Set(options.waifuAuthorIds ?? []);
|
|
45
|
+
const filtered = messages.filter((message) => !orchestratorIds.has(message.authorId));
|
|
46
|
+
const coalesced = coalesceAdjacentChunks(filtered, waifuIds);
|
|
47
|
+
return coalesced.map((message) => ContextMessageSchema.parse({
|
|
48
|
+
id: message.id,
|
|
49
|
+
channelId: message.channelId,
|
|
50
|
+
guildId: message.guildId,
|
|
51
|
+
authorKind: waifuIds.has(message.authorId) ? "waifu" : "user",
|
|
52
|
+
authorId: message.authorId,
|
|
53
|
+
authorBot: message.authorBot,
|
|
54
|
+
name: message.authorName,
|
|
55
|
+
displayName: message.authorDisplayName ?? message.authorName,
|
|
56
|
+
content: message.content,
|
|
57
|
+
timestamp: formatTimestamp(message.createdAt),
|
|
58
|
+
sourceMessageIds: message.sourceMessageIds,
|
|
59
|
+
images: message.images,
|
|
60
|
+
replyTo: message.replyTo,
|
|
61
|
+
reactions: message.reactions ?? []
|
|
62
|
+
}));
|
|
63
|
+
}
|
|
64
|
+
export function formatTimestamp(then) {
|
|
65
|
+
return then.toISOString().replace(/\.\d{3}Z$/, "Z");
|
|
66
|
+
}
|
|
67
|
+
const COMPACT_REPLY_PREVIEW_LIMIT = 80;
|
|
68
|
+
function clipReplyPreview(preview) {
|
|
69
|
+
return preview.length > COMPACT_REPLY_PREVIEW_LIMIT
|
|
70
|
+
? `${preview.slice(0, COMPACT_REPLY_PREVIEW_LIMIT - 1)}…`
|
|
71
|
+
: preview;
|
|
72
|
+
}
|
|
73
|
+
function replyQuoteLine(message) {
|
|
74
|
+
if (!message.replyTo)
|
|
75
|
+
return null;
|
|
76
|
+
const authorName = message.replyTo.authorName?.trim();
|
|
77
|
+
const preview = message.replyTo.contentPreview?.trim();
|
|
78
|
+
if (authorName && preview) {
|
|
79
|
+
return `replying to > ${authorName}: ${clipReplyPreview(preview)}`;
|
|
80
|
+
}
|
|
81
|
+
if (authorName) {
|
|
82
|
+
return `replying to > ${authorName}`;
|
|
83
|
+
}
|
|
84
|
+
if (preview) {
|
|
85
|
+
return `replying to > ${clipReplyPreview(preview)}`;
|
|
86
|
+
}
|
|
87
|
+
return null;
|
|
88
|
+
}
|
|
89
|
+
export function formatOrchestratorMessageBlock(message) {
|
|
90
|
+
const lines = [];
|
|
91
|
+
const quote = replyQuoteLine(message);
|
|
92
|
+
if (quote)
|
|
93
|
+
lines.push(quote);
|
|
94
|
+
lines.push(senderPrefixedContent(message.displayName, message.content));
|
|
95
|
+
const imageCount = message.images?.length ?? 0;
|
|
96
|
+
if (imageCount > 0) {
|
|
97
|
+
lines.push(`[attachments: ${imageCount}x image]`);
|
|
98
|
+
appendImageTextLines(lines, message.images);
|
|
99
|
+
}
|
|
100
|
+
return lines.join("\n");
|
|
101
|
+
}
|
|
102
|
+
export function formatWaifuContextBlock(message) {
|
|
103
|
+
const lines = [];
|
|
104
|
+
const quote = replyQuoteLine(message);
|
|
105
|
+
if (quote)
|
|
106
|
+
lines.push(quote);
|
|
107
|
+
lines.push(senderPrefixedContent(message.displayName, message.content));
|
|
108
|
+
const imageCount = message.images?.length ?? 0;
|
|
109
|
+
if (imageCount > 0) {
|
|
110
|
+
lines.push(`[attachments: ${imageCount}x image]`);
|
|
111
|
+
appendImageTextLines(lines, message.images);
|
|
112
|
+
}
|
|
113
|
+
return lines.join("\n");
|
|
114
|
+
}
|
|
115
|
+
function senderPrefixedContent(displayName, content) {
|
|
116
|
+
return content.length > 0 ? `${displayName}: ${content}` : `${displayName}:`;
|
|
117
|
+
}
|
|
118
|
+
function appendImageTextLines(lines, images) {
|
|
119
|
+
for (const image of images ?? []) {
|
|
120
|
+
const ocr = image.ocrText?.replace(/\s+/g, " ").trim();
|
|
121
|
+
if (ocr) {
|
|
122
|
+
lines.push(`[image_text: ${ocr}]`);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
function coalesceAdjacentChunks(messages, waifuAuthorIds) {
|
|
127
|
+
const replyTargetIds = new Set(messages.flatMap((message) => message.replyTo?.messageId ? [message.replyTo.messageId] : []));
|
|
128
|
+
const result = [];
|
|
129
|
+
for (const message of messages) {
|
|
130
|
+
const prev = result[result.length - 1];
|
|
131
|
+
const sameAuthor = prev && prev.authorId === message.authorId;
|
|
132
|
+
const withinWindow = sameAuthor &&
|
|
133
|
+
message.createdAt.getTime() - prev.createdAt.getTime() <= WAIFU_CHUNK_COALESCE_WINDOW_MS;
|
|
134
|
+
if (sameAuthor &&
|
|
135
|
+
withinWindow &&
|
|
136
|
+
!replyTargetIds.has(prev.id) &&
|
|
137
|
+
!replyTargetIds.has(message.id) &&
|
|
138
|
+
compatibleReplyTargets(prev, message)) {
|
|
139
|
+
result[result.length - 1] = mergeChunk(prev, message, {
|
|
140
|
+
authorKind: waifuAuthorIds.has(message.authorId) ? "waifu" : "user"
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
result.push(message);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
return result;
|
|
148
|
+
}
|
|
149
|
+
function mergeChunk(first, next, options) {
|
|
150
|
+
return {
|
|
151
|
+
...first,
|
|
152
|
+
content: joinChunkContent(first.content, next.content, options.authorKind),
|
|
153
|
+
createdAt: next.createdAt,
|
|
154
|
+
sourceMessageIds: [...(first.sourceMessageIds ?? [first.id]), ...(next.sourceMessageIds ?? [next.id])],
|
|
155
|
+
images: mergeImages(first.images, next.images),
|
|
156
|
+
reactions: mergeReactions(first.reactions, next.reactions)
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
function mergeImages(a, b) {
|
|
160
|
+
const merged = [...(a ?? []), ...(b ?? [])];
|
|
161
|
+
return merged.length ? merged : undefined;
|
|
162
|
+
}
|
|
163
|
+
function compatibleReplyTargets(first, next) {
|
|
164
|
+
const firstReplyId = first.replyTo?.messageId;
|
|
165
|
+
const nextReplyId = next.replyTo?.messageId;
|
|
166
|
+
return nextReplyId === undefined || firstReplyId === nextReplyId;
|
|
167
|
+
}
|
|
168
|
+
function joinChunkContent(first, next, authorKind) {
|
|
169
|
+
const firstTrimmed = first.trim();
|
|
170
|
+
const nextTrimmed = next.trim();
|
|
171
|
+
if (!firstTrimmed)
|
|
172
|
+
return nextTrimmed;
|
|
173
|
+
if (!nextTrimmed)
|
|
174
|
+
return firstTrimmed;
|
|
175
|
+
const separator = authorKind === "user" && !endsWithPunctuation(firstTrimmed) ? ", " : " ";
|
|
176
|
+
return `${firstTrimmed}${separator}${nextTrimmed}`;
|
|
177
|
+
}
|
|
178
|
+
function endsWithPunctuation(value) {
|
|
179
|
+
return /[.!?,:;…]$/u.test(value);
|
|
180
|
+
}
|
|
181
|
+
function mergeReactions(a, b) {
|
|
182
|
+
if (!a?.length)
|
|
183
|
+
return b ?? [];
|
|
184
|
+
if (!b?.length)
|
|
185
|
+
return a;
|
|
186
|
+
const byEmoji = new Map();
|
|
187
|
+
for (const reaction of [...a, ...b]) {
|
|
188
|
+
const existing = byEmoji.get(reaction.emoji);
|
|
189
|
+
if (existing) {
|
|
190
|
+
existing.count += reaction.count;
|
|
191
|
+
if (reaction.users)
|
|
192
|
+
existing.users = [...(existing.users ?? []), ...reaction.users];
|
|
193
|
+
}
|
|
194
|
+
else {
|
|
195
|
+
byEmoji.set(reaction.emoji, { ...reaction });
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
return [...byEmoji.values()];
|
|
199
|
+
}
|
|
200
|
+
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/orchestration/context.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export declare const REPLY_STYLE_VALUES: readonly ["normal", "short", "long", "sleepy"];
|
|
3
|
+
export type ReplyStyle = (typeof REPLY_STYLE_VALUES)[number];
|
|
4
|
+
export declare const ReplyStyleSchema: z.ZodEnum<{
|
|
5
|
+
normal: "normal";
|
|
6
|
+
short: "short";
|
|
7
|
+
long: "long";
|
|
8
|
+
sleepy: "sleepy";
|
|
9
|
+
}>;
|
|
10
|
+
export declare const ORCHESTRATOR_ACTION_VALUES: readonly ["reply", "no_reply"];
|
|
11
|
+
export type OrchestratorAction = (typeof ORCHESTRATOR_ACTION_VALUES)[number];
|
|
12
|
+
export declare const OrchestratorActionSchema: z.ZodEnum<{
|
|
13
|
+
no_reply: "no_reply";
|
|
14
|
+
reply: "reply";
|
|
15
|
+
}>;
|
|
16
|
+
export declare const RETRIGGER_MIN_SECONDS = 100;
|
|
17
|
+
export declare const RETRIGGER_MAX_SECONDS = 28800;
|
|
18
|
+
export declare const MAX_WAIFU_DELAY_SECONDS = 30;
|
|
19
|
+
export declare const RespondingWaifuSchema: z.ZodObject<{
|
|
20
|
+
waifuId: z.ZodString;
|
|
21
|
+
delaySeconds: z.ZodNumber;
|
|
22
|
+
replyStyle: z.ZodEnum<{
|
|
23
|
+
normal: "normal";
|
|
24
|
+
short: "short";
|
|
25
|
+
long: "long";
|
|
26
|
+
sleepy: "sleepy";
|
|
27
|
+
}>;
|
|
28
|
+
replyToMessageId: z.ZodOptional<z.ZodString>;
|
|
29
|
+
sceneDirection: z.ZodOptional<z.ZodString>;
|
|
30
|
+
}, z.core.$strip>;
|
|
31
|
+
export type RespondingWaifu = z.infer<typeof RespondingWaifuSchema>;
|
|
32
|
+
export declare const OrchestratorDecisionSchema: z.ZodObject<{
|
|
33
|
+
action: z.ZodEnum<{
|
|
34
|
+
no_reply: "no_reply";
|
|
35
|
+
reply: "reply";
|
|
36
|
+
}>;
|
|
37
|
+
respondingWaifus: z.ZodDefault<z.ZodArray<z.ZodObject<{
|
|
38
|
+
waifuId: z.ZodString;
|
|
39
|
+
delaySeconds: z.ZodNumber;
|
|
40
|
+
replyStyle: z.ZodEnum<{
|
|
41
|
+
normal: "normal";
|
|
42
|
+
short: "short";
|
|
43
|
+
long: "long";
|
|
44
|
+
sleepy: "sleepy";
|
|
45
|
+
}>;
|
|
46
|
+
replyToMessageId: z.ZodOptional<z.ZodString>;
|
|
47
|
+
sceneDirection: z.ZodOptional<z.ZodString>;
|
|
48
|
+
}, z.core.$strip>>>;
|
|
49
|
+
retriggerAfterSeconds: z.ZodOptional<z.ZodNumber>;
|
|
50
|
+
reasoning: z.ZodString;
|
|
51
|
+
}, z.core.$strip>;
|
|
52
|
+
export type OrchestratorDecision = z.infer<typeof OrchestratorDecisionSchema>;
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export const REPLY_STYLE_VALUES = ["normal", "short", "long", "sleepy"];
|
|
3
|
+
export const ReplyStyleSchema = z.enum(REPLY_STYLE_VALUES);
|
|
4
|
+
export const ORCHESTRATOR_ACTION_VALUES = ["reply", "no_reply"];
|
|
5
|
+
export const OrchestratorActionSchema = z.enum(ORCHESTRATOR_ACTION_VALUES);
|
|
6
|
+
export const RETRIGGER_MIN_SECONDS = 100;
|
|
7
|
+
export const RETRIGGER_MAX_SECONDS = 28800;
|
|
8
|
+
export const MAX_WAIFU_DELAY_SECONDS = 30;
|
|
9
|
+
export const RespondingWaifuSchema = z.object({
|
|
10
|
+
waifuId: z.string().min(1),
|
|
11
|
+
delaySeconds: z.number().min(0),
|
|
12
|
+
replyStyle: ReplyStyleSchema,
|
|
13
|
+
replyToMessageId: z.string().min(1).optional(),
|
|
14
|
+
sceneDirection: z.string().min(1).optional()
|
|
15
|
+
});
|
|
16
|
+
export const OrchestratorDecisionSchema = z
|
|
17
|
+
.object({
|
|
18
|
+
action: OrchestratorActionSchema,
|
|
19
|
+
respondingWaifus: z.array(RespondingWaifuSchema).default([]),
|
|
20
|
+
retriggerAfterSeconds: z
|
|
21
|
+
.number()
|
|
22
|
+
.min(RETRIGGER_MIN_SECONDS)
|
|
23
|
+
.max(RETRIGGER_MAX_SECONDS)
|
|
24
|
+
.optional(),
|
|
25
|
+
reasoning: z.string().min(1)
|
|
26
|
+
})
|
|
27
|
+
.superRefine((value, ctx) => {
|
|
28
|
+
if (value.action === "reply") {
|
|
29
|
+
if (value.respondingWaifus.length === 0) {
|
|
30
|
+
ctx.addIssue({
|
|
31
|
+
code: z.ZodIssueCode.custom,
|
|
32
|
+
path: ["respondingWaifus"],
|
|
33
|
+
message: "respondingWaifus must be non-empty when action is reply."
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
if (value.retriggerAfterSeconds !== undefined) {
|
|
37
|
+
ctx.addIssue({
|
|
38
|
+
code: z.ZodIssueCode.custom,
|
|
39
|
+
path: ["retriggerAfterSeconds"],
|
|
40
|
+
message: "retriggerAfterSeconds must be omitted when action is reply."
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
if (value.respondingWaifus.length > 0) {
|
|
46
|
+
ctx.addIssue({
|
|
47
|
+
code: z.ZodIssueCode.custom,
|
|
48
|
+
path: ["respondingWaifus"],
|
|
49
|
+
message: "respondingWaifus must be empty when action is no_reply."
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
if (value.retriggerAfterSeconds === undefined) {
|
|
53
|
+
ctx.addIssue({
|
|
54
|
+
code: z.ZodIssueCode.custom,
|
|
55
|
+
path: ["retriggerAfterSeconds"],
|
|
56
|
+
message: "retriggerAfterSeconds is required when action is no_reply."
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
//# sourceMappingURL=decisions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decisions.js","sourceRoot":"","sources":["../../src/orchestration/decisions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
const PARAGRAPH_SPLIT_RE = /\n+/;
|
|
2
|
+
const SENTENCE_SPLIT_RE = /(?<=[.?!])\s+/;
|
|
3
|
+
const MAX_CHUNK_CHARS = 100;
|
|
4
|
+
const COMMA_FINDER_RE = /,/g;
|
|
5
|
+
const EMOJI_FINDER_RE = /<a?:[A-Za-z0-9_]+:\d+>|[0-9#*]\uFE0F?\u20E3|(?:\p{Extended_Pictographic}|\p{Regional_Indicator})(?:[\uFE0E\uFE0F]|\p{Emoji_Modifier})?(?:\u200D(?:\p{Extended_Pictographic}|\p{Regional_Indicator})(?:[\uFE0E\uFE0F]|\p{Emoji_Modifier})?)*/gu;
|
|
6
|
+
export function splitWaifuReply(content) {
|
|
7
|
+
const trimmed = content.trim();
|
|
8
|
+
if (!trimmed)
|
|
9
|
+
return [];
|
|
10
|
+
const sentenceChunks = [];
|
|
11
|
+
for (const paragraph of trimmed.split(PARAGRAPH_SPLIT_RE)) {
|
|
12
|
+
for (const part of paragraph.split(SENTENCE_SPLIT_RE)) {
|
|
13
|
+
const piece = part.trim();
|
|
14
|
+
if (piece.length > 0)
|
|
15
|
+
sentenceChunks.push(piece);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
const result = [];
|
|
19
|
+
for (const chunk of sentenceChunks)
|
|
20
|
+
splitLongChunk(chunk, result);
|
|
21
|
+
return result;
|
|
22
|
+
}
|
|
23
|
+
function splitLongChunk(chunk, out) {
|
|
24
|
+
if (characterCount(chunk) <= MAX_CHUNK_CHARS) {
|
|
25
|
+
out.push(chunk);
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
const split = trySplitLongChunk(chunk);
|
|
29
|
+
if (!split) {
|
|
30
|
+
out.push(chunk);
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
splitLongChunk(split[0], out);
|
|
34
|
+
splitLongChunk(split[1], out);
|
|
35
|
+
}
|
|
36
|
+
function trySplitLongChunk(chunk) {
|
|
37
|
+
const mid = chunk.length / 2;
|
|
38
|
+
const commaSplit = bestCommaSplit(chunk, mid);
|
|
39
|
+
if (commaSplit)
|
|
40
|
+
return commaSplit;
|
|
41
|
+
return bestEmojiSplit(chunk, mid);
|
|
42
|
+
}
|
|
43
|
+
function bestCommaSplit(chunk, mid) {
|
|
44
|
+
let bestIndex = null;
|
|
45
|
+
let bestDist = Infinity;
|
|
46
|
+
for (const match of chunk.matchAll(COMMA_FINDER_RE)) {
|
|
47
|
+
const idx = match.index ?? 0;
|
|
48
|
+
if (idx === 0 || idx === chunk.length - 1)
|
|
49
|
+
continue;
|
|
50
|
+
const dist = Math.abs(idx - mid);
|
|
51
|
+
if (dist < bestDist) {
|
|
52
|
+
bestDist = dist;
|
|
53
|
+
bestIndex = idx;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
if (bestIndex === null)
|
|
57
|
+
return null;
|
|
58
|
+
const left = chunk.slice(0, bestIndex).trimEnd();
|
|
59
|
+
const right = chunk.slice(bestIndex + 1).trimStart();
|
|
60
|
+
if (!left || !right)
|
|
61
|
+
return null;
|
|
62
|
+
return [left, right];
|
|
63
|
+
}
|
|
64
|
+
function bestEmojiSplit(chunk, mid) {
|
|
65
|
+
let bestEnd = null;
|
|
66
|
+
let bestDist = Infinity;
|
|
67
|
+
for (const match of chunk.matchAll(EMOJI_FINDER_RE)) {
|
|
68
|
+
const end = (match.index ?? 0) + match[0].length;
|
|
69
|
+
if (end >= chunk.length)
|
|
70
|
+
continue;
|
|
71
|
+
const dist = Math.abs(end - mid);
|
|
72
|
+
if (dist < bestDist) {
|
|
73
|
+
bestDist = dist;
|
|
74
|
+
bestEnd = end;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
if (bestEnd === null)
|
|
78
|
+
return null;
|
|
79
|
+
const left = chunk.slice(0, bestEnd).trimEnd();
|
|
80
|
+
const right = chunk.slice(bestEnd).trimStart();
|
|
81
|
+
if (!left || !right)
|
|
82
|
+
return null;
|
|
83
|
+
return [left, right];
|
|
84
|
+
}
|
|
85
|
+
const IMMEDIATE_CHUNK_LIMIT = 2;
|
|
86
|
+
const SHORT_THIRD_CHUNK_CHAR_LIMIT = 18;
|
|
87
|
+
const THIRD_CHUNK_INDEX = 2;
|
|
88
|
+
const FOURTH_CHUNK_INDEX = 3;
|
|
89
|
+
const CUSTOM_EMOJI_ONLY_RE = /^<a?:[A-Za-z0-9_]+:(?:\d+)?>$/;
|
|
90
|
+
const KEYCAP_EMOJI_ONLY_RE = /^[0-9#*]\uFE0F?\u20E3$/u;
|
|
91
|
+
const UNICODE_EMOJI_ONLY_RE = /^(?:(?:\p{Extended_Pictographic}|\p{Regional_Indicator})(?:[\uFE0E\uFE0F]|\p{Emoji_Modifier})?(?:\u200D(?:\p{Extended_Pictographic}|\p{Regional_Indicator})(?:[\uFE0E\uFE0F]|\p{Emoji_Modifier})?)*)$/u;
|
|
92
|
+
export function planWaifuReplyChunks(chunks) {
|
|
93
|
+
let immediateLimit = IMMEDIATE_CHUNK_LIMIT;
|
|
94
|
+
if (chunks[THIRD_CHUNK_INDEX] && characterCount(chunks[THIRD_CHUNK_INDEX]) < SHORT_THIRD_CHUNK_CHAR_LIMIT) {
|
|
95
|
+
immediateLimit = THIRD_CHUNK_INDEX + 1;
|
|
96
|
+
}
|
|
97
|
+
if (immediateLimit === THIRD_CHUNK_INDEX + 1 && chunks[FOURTH_CHUNK_INDEX] && isEmojiOnlyChunk(chunks[FOURTH_CHUNK_INDEX])) {
|
|
98
|
+
immediateLimit = FOURTH_CHUNK_INDEX + 1;
|
|
99
|
+
}
|
|
100
|
+
return {
|
|
101
|
+
immediateChunks: chunks.slice(0, immediateLimit),
|
|
102
|
+
cachedChunks: chunks.slice(immediateLimit)
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
const MS_PER_CHAR = 30;
|
|
106
|
+
const MIN_DELAY_MS = 600;
|
|
107
|
+
const MAX_DELAY_MS = 4500;
|
|
108
|
+
export function typingDelayMs(chunk) {
|
|
109
|
+
return Math.min(MAX_DELAY_MS, Math.max(MIN_DELAY_MS, chunk.length * MS_PER_CHAR));
|
|
110
|
+
}
|
|
111
|
+
function characterCount(value) {
|
|
112
|
+
return Array.from(value).length;
|
|
113
|
+
}
|
|
114
|
+
function isEmojiOnlyChunk(value) {
|
|
115
|
+
const trimmed = value.trim();
|
|
116
|
+
return CUSTOM_EMOJI_ONLY_RE.test(trimmed) || KEYCAP_EMOJI_ONLY_RE.test(trimmed) || UNICODE_EMOJI_ONLY_RE.test(trimmed);
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=messageSplit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"messageSplit.js","sourceRoot":"","sources":["../../src/orchestration/messageSplit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { Logger } from "../backend/logger.js";
|
|
2
|
+
import { OcrConfig } from "../shared/schemas/config.js";
|
|
3
|
+
import { ContextMessage } from "./context.js";
|
|
4
|
+
export type ImageOcrServiceOptions = {
|
|
5
|
+
dataRoot: string;
|
|
6
|
+
config: OcrConfig;
|
|
7
|
+
logger: Logger;
|
|
8
|
+
};
|
|
9
|
+
export declare class ImageOcrService {
|
|
10
|
+
private readonly options;
|
|
11
|
+
private helperPathPromise?;
|
|
12
|
+
private tesseractWorkerPromise?;
|
|
13
|
+
private lastCleanupAt;
|
|
14
|
+
constructor(options: ImageOcrServiceOptions);
|
|
15
|
+
/** Terminate the reused tesseract.js worker (if any). Call on shutdown. */
|
|
16
|
+
dispose(): Promise<void>;
|
|
17
|
+
cleanupExpired(): Promise<void>;
|
|
18
|
+
enrichMessages(messages: ContextMessage[], options?: {
|
|
19
|
+
signal?: AbortSignal;
|
|
20
|
+
}): Promise<ContextMessage[]>;
|
|
21
|
+
private extractImageText;
|
|
22
|
+
private runConfiguredEngine;
|
|
23
|
+
private runAppleVision;
|
|
24
|
+
private runBundledTesseract;
|
|
25
|
+
private ensureTesseractWorker;
|
|
26
|
+
private createTesseractWorker;
|
|
27
|
+
private disposeTesseractWorker;
|
|
28
|
+
private runSystemTesseract;
|
|
29
|
+
private ensureAppleVisionHelper;
|
|
30
|
+
private buildAppleVisionHelper;
|
|
31
|
+
private downloadImage;
|
|
32
|
+
private readCache;
|
|
33
|
+
private writeCache;
|
|
34
|
+
private cleanupIfDue;
|
|
35
|
+
private cacheBinDir;
|
|
36
|
+
private cacheResultsDir;
|
|
37
|
+
private cachePath;
|
|
38
|
+
private tmpOcrDir;
|
|
39
|
+
private swiftModuleCacheDir;
|
|
40
|
+
}
|
|
41
|
+
export declare function clearOcrArtifacts(dataRoot: string): Promise<{
|
|
42
|
+
cleared: true;
|
|
43
|
+
}>;
|