@astro-minimax/ai 0.9.0 → 0.9.3
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/README.md +108 -18
- package/dist/cache/global-cache.d.ts +6 -2
- package/dist/cache/global-cache.d.ts.map +1 -1
- package/dist/cache/global-cache.js +24 -9
- package/dist/cache/index.d.ts +7 -6
- package/dist/cache/index.d.ts.map +1 -1
- package/dist/cache/index.js +12 -4
- package/dist/cache/injection-cache.d.ts +36 -0
- package/dist/cache/injection-cache.d.ts.map +1 -0
- package/dist/cache/injection-cache.js +90 -0
- package/dist/cache/kv-adapter.d.ts.map +1 -1
- package/dist/cache/kv-adapter.js +2 -1
- package/dist/cache/memory-adapter.d.ts.map +1 -1
- package/dist/cache/memory-adapter.js +2 -1
- package/dist/cache/response-cache.d.ts +10 -5
- package/dist/cache/response-cache.d.ts.map +1 -1
- package/dist/cache/response-cache.js +18 -6
- package/dist/components/AIChatContainer.d.ts +2 -2
- package/dist/components/AIChatContainer.d.ts.map +1 -1
- package/dist/components/AIChatContainer.js +8 -920
- package/dist/components/ChatInput.d.ts +15 -0
- package/dist/components/ChatInput.d.ts.map +1 -0
- package/dist/components/ChatInput.js +72 -0
- package/dist/components/ChatPanel.d.ts +1 -1
- package/dist/components/ChatPanel.d.ts.map +1 -1
- package/dist/components/ChatPanel.js +210 -672
- package/dist/components/CodeBlock.d.ts +31 -0
- package/dist/components/CodeBlock.d.ts.map +1 -0
- package/dist/components/CodeBlock.js +143 -0
- package/dist/components/MarkmapBlock.d.ts +4 -0
- package/dist/components/MarkmapBlock.d.ts.map +1 -0
- package/dist/components/MarkmapBlock.js +180 -0
- package/dist/components/MermaidBlock.d.ts +4 -0
- package/dist/components/MermaidBlock.d.ts.map +1 -0
- package/dist/components/MermaidBlock.js +193 -0
- package/dist/components/MessageBubble.d.ts +21 -0
- package/dist/components/MessageBubble.d.ts.map +1 -0
- package/dist/components/MessageBubble.js +233 -0
- package/dist/components/ReasoningBlock.d.ts +6 -0
- package/dist/components/ReasoningBlock.d.ts.map +1 -0
- package/dist/components/ReasoningBlock.js +11 -0
- package/dist/components/RichText.d.ts +41 -0
- package/dist/components/RichText.d.ts.map +1 -0
- package/dist/components/RichText.js +202 -0
- package/dist/components/VizShared.d.ts +57 -0
- package/dist/components/VizShared.d.ts.map +1 -0
- package/dist/components/VizShared.js +233 -0
- package/dist/components/tool-auto-continue.d.ts +5 -0
- package/dist/components/tool-auto-continue.d.ts.map +1 -0
- package/dist/components/tool-auto-continue.js +33 -0
- package/dist/constants.d.ts +61 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +72 -0
- package/dist/data/index.d.ts +4 -3
- package/dist/data/index.d.ts.map +1 -1
- package/dist/data/index.js +4 -10
- package/dist/data/knowledge-types.d.ts +8 -0
- package/dist/data/knowledge-types.d.ts.map +1 -0
- package/dist/data/knowledge-types.js +14 -0
- package/dist/data/metadata-loader.d.ts +4 -28
- package/dist/data/metadata-loader.d.ts.map +1 -1
- package/dist/data/metadata-loader.js +11 -34
- package/dist/data/types.d.ts +17 -2
- package/dist/data/types.d.ts.map +1 -1
- package/dist/extensions/index.d.ts +5 -0
- package/dist/extensions/index.d.ts.map +1 -0
- package/dist/extensions/index.js +24 -0
- package/dist/extensions/injector.d.ts +14 -0
- package/dist/extensions/injector.d.ts.map +1 -0
- package/dist/extensions/injector.js +146 -0
- package/dist/extensions/loader.d.ts +5 -0
- package/dist/extensions/loader.d.ts.map +1 -0
- package/dist/extensions/loader.js +45 -0
- package/dist/extensions/registry.d.ts +4 -0
- package/dist/extensions/registry.d.ts.map +1 -0
- package/dist/extensions/registry.js +144 -0
- package/dist/extensions/types.d.ts +126 -0
- package/dist/extensions/types.d.ts.map +1 -0
- package/dist/extensions/types.js +0 -0
- package/dist/fact-registry/prompt-injector.d.ts +1 -1
- package/dist/fact-registry/prompt-injector.d.ts.map +1 -1
- package/dist/fact-registry/prompt-injector.js +2 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/intelligence/citation-guard.d.ts +2 -13
- package/dist/intelligence/citation-guard.d.ts.map +1 -1
- package/dist/intelligence/citation-guard.js +52 -23
- package/dist/intelligence/evidence-analysis.d.ts +24 -16
- package/dist/intelligence/evidence-analysis.d.ts.map +1 -1
- package/dist/intelligence/evidence-analysis.js +118 -20
- package/dist/intelligence/evidence-budget.d.ts +13 -0
- package/dist/intelligence/evidence-budget.d.ts.map +1 -0
- package/dist/intelligence/evidence-budget.js +49 -0
- package/dist/intelligence/index.d.ts +10 -4
- package/dist/intelligence/index.d.ts.map +1 -1
- package/dist/intelligence/index.js +27 -3
- package/dist/intelligence/keyword-extract.d.ts +1 -1
- package/dist/intelligence/keyword-extract.d.ts.map +1 -1
- package/dist/intelligence/keyword-extract.js +5 -9
- package/dist/intelligence/request-interpretation.d.ts +40 -0
- package/dist/intelligence/request-interpretation.d.ts.map +1 -0
- package/dist/intelligence/request-interpretation.js +71 -0
- package/dist/intelligence/response-templates.d.ts +1 -0
- package/dist/intelligence/response-templates.d.ts.map +1 -1
- package/dist/intelligence/response-templates.js +13 -0
- package/dist/prompt/dynamic-layer.d.ts +1 -5
- package/dist/prompt/dynamic-layer.d.ts.map +1 -1
- package/dist/prompt/dynamic-layer.js +145 -9
- package/dist/prompt/prompt-builder.d.ts +1 -1
- package/dist/prompt/prompt-builder.d.ts.map +1 -1
- package/dist/prompt/prompt-builder.js +5 -1
- package/dist/prompt/semi-static-layer.d.ts +1 -1
- package/dist/prompt/semi-static-layer.d.ts.map +1 -1
- package/dist/prompt/semi-static-layer.js +22 -12
- package/dist/prompt/static-layer.d.ts.map +1 -1
- package/dist/prompt/static-layer.js +37 -4
- package/dist/prompt/types.d.ts +9 -4
- package/dist/prompt/types.d.ts.map +1 -1
- package/dist/provider-manager/base.d.ts +5 -1
- package/dist/provider-manager/base.d.ts.map +1 -1
- package/dist/provider-manager/base.js +22 -2
- package/dist/provider-manager/config.d.ts.map +1 -1
- package/dist/provider-manager/config.js +3 -2
- package/dist/provider-manager/index.d.ts +1 -1
- package/dist/provider-manager/index.d.ts.map +1 -1
- package/dist/provider-manager/index.js +1 -2
- package/dist/provider-manager/manager.d.ts +10 -1
- package/dist/provider-manager/manager.d.ts.map +1 -1
- package/dist/provider-manager/manager.js +26 -10
- package/dist/provider-manager/openai.d.ts +2 -2
- package/dist/provider-manager/openai.d.ts.map +1 -1
- package/dist/provider-manager/openai.js +19 -4
- package/dist/provider-manager/types.d.ts +18 -38
- package/dist/provider-manager/types.d.ts.map +1 -1
- package/dist/provider-manager/workers.d.ts +2 -2
- package/dist/provider-manager/workers.d.ts.map +1 -1
- package/dist/provider-manager/workers.js +15 -4
- package/dist/query/followup.d.ts +7 -0
- package/dist/query/followup.d.ts.map +1 -0
- package/dist/query/followup.js +46 -0
- package/dist/query/intent.d.ts +6 -0
- package/dist/query/intent.d.ts.map +1 -0
- package/dist/query/intent.js +137 -0
- package/dist/query/types.d.ts +8 -0
- package/dist/query/types.d.ts.map +1 -0
- package/dist/query/types.js +0 -0
- package/dist/search/hybrid-search.d.ts +111 -0
- package/dist/search/hybrid-search.d.ts.map +1 -0
- package/dist/search/hybrid-search.js +326 -0
- package/dist/search/index.d.ts +11 -9
- package/dist/search/index.d.ts.map +1 -1
- package/dist/search/index.js +46 -10
- package/dist/search/scoring.d.ts +18 -0
- package/dist/search/scoring.d.ts.map +1 -0
- package/dist/search/{search-utils.js → scoring.js} +14 -27
- package/dist/search/search-api.d.ts +16 -1
- package/dist/search/search-api.d.ts.map +1 -1
- package/dist/search/search-api.js +118 -15
- package/dist/search/search-index.d.ts +2 -2
- package/dist/search/search-index.d.ts.map +1 -1
- package/dist/search/search-index.js +4 -2
- package/dist/search/session-cache.d.ts +4 -10
- package/dist/search/session-cache.d.ts.map +1 -1
- package/dist/search/session-cache.js +12 -45
- package/dist/search/types.d.ts +28 -0
- package/dist/search/types.d.ts.map +1 -1
- package/dist/search/vector-reranker.d.ts +3 -3
- package/dist/search/vector-reranker.d.ts.map +1 -1
- package/dist/search/vector-reranker.js +14 -2
- package/dist/server/chat-handler.d.ts +86 -1
- package/dist/server/chat-handler.d.ts.map +1 -1
- package/dist/server/chat-handler.js +835 -401
- package/dist/server/chat-message-utils.d.ts +6 -0
- package/dist/server/chat-message-utils.d.ts.map +1 -0
- package/dist/server/chat-message-utils.js +40 -0
- package/dist/server/chat-utils.d.ts +30 -0
- package/dist/server/chat-utils.d.ts.map +1 -0
- package/dist/server/chat-utils.js +88 -0
- package/dist/server/dev-server.js +238 -101
- package/dist/server/env-config.d.ts +22 -0
- package/dist/server/env-config.d.ts.map +1 -0
- package/dist/server/env-config.js +25 -0
- package/dist/server/errors.d.ts +1 -0
- package/dist/server/errors.d.ts.map +1 -1
- package/dist/server/errors.js +14 -7
- package/dist/server/index.d.ts +2 -4
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +4 -25
- package/dist/server/metadata-init.d.ts +10 -5
- package/dist/server/metadata-init.d.ts.map +1 -1
- package/dist/server/metadata-init.js +78 -34
- package/dist/server/notify.d.ts +12 -11
- package/dist/server/notify.d.ts.map +1 -1
- package/dist/server/notify.js +46 -48
- package/dist/server/prompt-runtime.d.ts +60 -0
- package/dist/server/prompt-runtime.d.ts.map +1 -0
- package/dist/server/prompt-runtime.js +284 -0
- package/dist/server/stream-helpers.d.ts +30 -16
- package/dist/server/stream-helpers.d.ts.map +1 -1
- package/dist/server/stream-helpers.js +152 -15
- package/dist/server/types.d.ts +47 -12
- package/dist/server/types.d.ts.map +1 -1
- package/dist/structured-output/generator.d.ts +6 -0
- package/dist/structured-output/generator.d.ts.map +1 -0
- package/dist/structured-output/generator.js +164 -0
- package/dist/structured-output/index.d.ts +4 -0
- package/dist/structured-output/index.d.ts.map +1 -0
- package/dist/structured-output/index.js +6 -0
- package/dist/structured-output/schemas/evidence.d.ts +88 -0
- package/dist/structured-output/schemas/evidence.d.ts.map +1 -0
- package/dist/structured-output/schemas/evidence.js +65 -0
- package/dist/structured-output/types.d.ts +69 -0
- package/dist/structured-output/types.d.ts.map +1 -0
- package/dist/structured-output/types.js +0 -0
- package/dist/tools/action-tools.d.ts +63 -0
- package/dist/tools/action-tools.d.ts.map +1 -0
- package/dist/tools/action-tools.js +158 -0
- package/dist/tools/index.d.ts +2 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +30 -0
- package/dist/utils/i18n.d.ts +1 -1
- package/dist/utils/i18n.d.ts.map +1 -1
- package/dist/utils/i18n.js +1 -1
- package/dist/utils/logger.d.ts +11 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +36 -0
- package/dist/utils/text.d.ts +11 -0
- package/dist/utils/text.d.ts.map +1 -0
- package/dist/utils/text.js +87 -0
- package/dist/utils/url.d.ts +19 -0
- package/dist/utils/url.d.ts.map +1 -0
- package/dist/utils/url.js +13 -0
- package/package.json +46 -12
- package/dist/intelligence/intent-detect.d.ts +0 -40
- package/dist/intelligence/intent-detect.d.ts.map +0 -1
- package/dist/intelligence/intent-detect.js +0 -93
- package/dist/providers/index.d.ts +0 -2
- package/dist/providers/index.d.ts.map +0 -1
- package/dist/providers/index.js +0 -5
- package/dist/search/search-utils.d.ts +0 -47
- package/dist/search/search-utils.d.ts.map +0 -1
- package/dist/stream/index.d.ts +0 -3
- package/dist/stream/index.d.ts.map +0 -1
- package/dist/stream/index.js +0 -8
- package/dist/stream/mock-stream.d.ts +0 -12
- package/dist/stream/mock-stream.d.ts.map +0 -1
- package/dist/stream/mock-stream.js +0 -26
- package/dist/stream/response.d.ts +0 -10
- package/dist/stream/response.d.ts.map +0 -1
- package/dist/stream/response.js +0 -21
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/server/errors.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/server/errors.ts"],"names":[],"mappings":"AAKA,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAElD;AASD,wBAAgB,SAAS,CACvB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE;IAAE,SAAS,CAAC,EAAE,OAAO,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GACrD,QAAQ,CAYV;AAMD,eAAO,MAAM,MAAM;8BACS,MAAM;8BAEN,MAAM,SAAS,MAAM;0BAEzB,MAAM;0BAEN,MAAM;wBAER,MAAM,SAAS,MAAM;+BAEd,MAAM,SAAS,MAAM;qBAE/B,MAAM;iCAEM,MAAM;wBAEf,MAAM,SAAS,MAAM;CAE1C,CAAC;AAEF,wBAAgB,qBAAqB,IAAI,QAAQ,CAQhD"}
|
package/dist/server/errors.js
CHANGED
|
@@ -1,8 +1,14 @@
|
|
|
1
1
|
import { t } from "../utils/i18n.js";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
}
|
|
2
|
+
let _allowedOrigin = "*";
|
|
3
|
+
function setCorsOrigin(origin) {
|
|
4
|
+
_allowedOrigin = origin;
|
|
5
|
+
}
|
|
6
|
+
function corsHeaders() {
|
|
7
|
+
return {
|
|
8
|
+
"Content-Type": "application/json",
|
|
9
|
+
"Access-Control-Allow-Origin": _allowedOrigin
|
|
10
|
+
};
|
|
11
|
+
}
|
|
6
12
|
function chatError(code, error, status, options) {
|
|
7
13
|
const body = {
|
|
8
14
|
error,
|
|
@@ -10,7 +16,7 @@ function chatError(code, error, status, options) {
|
|
|
10
16
|
retryable: options?.retryable ?? false,
|
|
11
17
|
retryAfter: options?.retryAfter
|
|
12
18
|
};
|
|
13
|
-
const headers = { ...
|
|
19
|
+
const headers = { ...corsHeaders() };
|
|
14
20
|
if (options?.retryAfter) {
|
|
15
21
|
headers["Retry-After"] = String(options.retryAfter);
|
|
16
22
|
}
|
|
@@ -33,7 +39,7 @@ const errors = {
|
|
|
33
39
|
function corsPreflightResponse() {
|
|
34
40
|
return new Response(null, {
|
|
35
41
|
headers: {
|
|
36
|
-
"Access-Control-Allow-Origin":
|
|
42
|
+
"Access-Control-Allow-Origin": _allowedOrigin,
|
|
37
43
|
"Access-Control-Allow-Methods": "POST, OPTIONS",
|
|
38
44
|
"Access-Control-Allow-Headers": "Content-Type, x-session-id"
|
|
39
45
|
}
|
|
@@ -42,5 +48,6 @@ function corsPreflightResponse() {
|
|
|
42
48
|
export {
|
|
43
49
|
chatError,
|
|
44
50
|
corsPreflightResponse,
|
|
45
|
-
errors
|
|
51
|
+
errors,
|
|
52
|
+
setCorsOrigin
|
|
46
53
|
};
|
package/dist/server/index.d.ts
CHANGED
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
export { handleChatRequest } from './chat-handler.js';
|
|
2
|
-
export { initializeMetadata
|
|
2
|
+
export { initializeMetadata } from './metadata-init.js';
|
|
3
|
+
export { applyAiConfigDefaults } from './env-config.js';
|
|
3
4
|
export { errors, corsPreflightResponse, chatError } from './errors.js';
|
|
4
|
-
export { notifyAiChat } from './notify.js';
|
|
5
|
-
export type { ChatNotifyOptions } from './notify.js';
|
|
6
|
-
export { writeSearchStatus, writeGeneratingStatus, writeDoneStatus, writeSourceArticles, writeTextChunk, writeFinish, streamLLMResponse, streamMockFallback, streamCachedResponse, } from './stream-helpers.js';
|
|
7
5
|
export { createChatStatusData, isChatStatusData, } from './types.js';
|
|
8
6
|
export type { ChatContext, ArticleChatContext, ChatRequestBody, ChatHandlerEnv, ChatHandlerOptions, ChatStatusData, ChatStatusStage, ChatErrorResponse, MetadataConfig, } from './types.js';
|
|
9
7
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,MAAM,EAAE,qBAAqB,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACvE,OAAO,EACL,oBAAoB,EACpB,gBAAgB,GACjB,MAAM,YAAY,CAAC;AACpB,YAAY,EACV,WAAW,EACX,kBAAkB,EAClB,eAAe,EACf,cAAc,EACd,kBAAkB,EAClB,cAAc,EACd,eAAe,EACf,iBAAiB,EACjB,cAAc,GACf,MAAM,YAAY,CAAC"}
|
package/dist/server/index.js
CHANGED
|
@@ -1,39 +1,18 @@
|
|
|
1
1
|
import { handleChatRequest } from "./chat-handler.js";
|
|
2
|
-
import { initializeMetadata
|
|
2
|
+
import { initializeMetadata } from "./metadata-init.js";
|
|
3
|
+
import { applyAiConfigDefaults } from "./env-config.js";
|
|
3
4
|
import { errors, corsPreflightResponse, chatError } from "./errors.js";
|
|
4
|
-
import { notifyAiChat } from "./notify.js";
|
|
5
|
-
import {
|
|
6
|
-
writeSearchStatus,
|
|
7
|
-
writeGeneratingStatus,
|
|
8
|
-
writeDoneStatus,
|
|
9
|
-
writeSourceArticles,
|
|
10
|
-
writeTextChunk,
|
|
11
|
-
writeFinish,
|
|
12
|
-
streamLLMResponse,
|
|
13
|
-
streamMockFallback,
|
|
14
|
-
streamCachedResponse
|
|
15
|
-
} from "./stream-helpers.js";
|
|
16
5
|
import {
|
|
17
6
|
createChatStatusData,
|
|
18
7
|
isChatStatusData
|
|
19
8
|
} from "./types.js";
|
|
20
9
|
export {
|
|
10
|
+
applyAiConfigDefaults,
|
|
21
11
|
chatError,
|
|
22
12
|
corsPreflightResponse,
|
|
23
13
|
createChatStatusData,
|
|
24
14
|
errors,
|
|
25
15
|
handleChatRequest,
|
|
26
16
|
initializeMetadata,
|
|
27
|
-
isChatStatusData
|
|
28
|
-
notifyAiChat,
|
|
29
|
-
resetMetadataInit,
|
|
30
|
-
streamCachedResponse,
|
|
31
|
-
streamLLMResponse,
|
|
32
|
-
streamMockFallback,
|
|
33
|
-
writeDoneStatus,
|
|
34
|
-
writeFinish,
|
|
35
|
-
writeGeneratingStatus,
|
|
36
|
-
writeSearchStatus,
|
|
37
|
-
writeSourceArticles,
|
|
38
|
-
writeTextChunk
|
|
17
|
+
isChatStatusData
|
|
39
18
|
};
|
|
@@ -1,11 +1,16 @@
|
|
|
1
|
-
import type { MetadataConfig, ChatHandlerEnv } from
|
|
2
|
-
/**
|
|
3
|
-
* Initializes AI metadata: loads summaries, author context, voice profile,
|
|
4
|
-
* and builds search indices. Safe to call multiple times (idempotent).
|
|
5
|
-
*/
|
|
1
|
+
import type { MetadataConfig, ChatHandlerEnv } from "./types.js";
|
|
6
2
|
export declare function initializeMetadata(config: MetadataConfig, env?: ChatHandlerEnv): void;
|
|
7
3
|
/**
|
|
8
4
|
* Resets initialization state (for testing).
|
|
9
5
|
*/
|
|
10
6
|
export declare function resetMetadataInit(): void;
|
|
7
|
+
/**
|
|
8
|
+
* Loads extensions from datas/extensions/*.json
|
|
9
|
+
* Returns the loaded extensions for use in chat pipeline.
|
|
10
|
+
*/
|
|
11
|
+
export declare function initializeExtensions(basePath?: string): Promise<void>;
|
|
12
|
+
/**
|
|
13
|
+
* Checks if extensions have been loaded.
|
|
14
|
+
*/
|
|
15
|
+
export declare function areExtensionsLoaded(): boolean;
|
|
11
16
|
//# sourceMappingURL=metadata-init.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metadata-init.d.ts","sourceRoot":"","sources":["../../src/server/metadata-init.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"metadata-init.d.ts","sourceRoot":"","sources":["../../src/server/metadata-init.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AASjE,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,cAAc,EACtB,GAAG,CAAC,EAAE,cAAc,GACnB,IAAI,CAgEN;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAMxC;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAU3E;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,OAAO,CAE7C"}
|
|
@@ -1,49 +1,93 @@
|
|
|
1
1
|
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
2
|
+
preloadKnowledgeBundle,
|
|
3
|
+
getKnowledgeBundle
|
|
4
|
+
} from "../data/index.js";
|
|
5
|
+
import {
|
|
5
6
|
initArticleIndex,
|
|
6
|
-
initProjectIndex
|
|
7
|
-
|
|
7
|
+
initProjectIndex,
|
|
8
|
+
initArticleChunks
|
|
9
|
+
} from "../search/index.js";
|
|
10
|
+
import { getExtensionRegistry } from "../extensions/index.js";
|
|
11
|
+
import { safeJoinUrl } from "../utils/url.js";
|
|
8
12
|
let initialized = false;
|
|
13
|
+
let extensionsLoaded = false;
|
|
14
|
+
let initializedBundleRef = null;
|
|
15
|
+
let initializedSiteUrl = "";
|
|
9
16
|
function initializeMetadata(config, env) {
|
|
10
|
-
if (initialized) return;
|
|
11
|
-
initialized = true;
|
|
12
|
-
preloadMetadata({
|
|
13
|
-
summaries: config.summaries,
|
|
14
|
-
authorContext: config.authorContext,
|
|
15
|
-
voiceProfile: config.voiceProfile,
|
|
16
|
-
factRegistry: config.factRegistry ?? null,
|
|
17
|
-
vectorIndex: config.vectorIndex ?? null
|
|
18
|
-
});
|
|
19
|
-
const authorCtx = getAuthorContext();
|
|
20
|
-
const allSummaries = getAllSummaries();
|
|
21
|
-
const summaryMap = new Map(allSummaries.map((s) => [s.slug, s]));
|
|
22
17
|
const siteUrl = config.siteUrl ?? env?.SITE_URL ?? "";
|
|
23
|
-
const
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
18
|
+
const bundleRef = config.knowledgeBundle;
|
|
19
|
+
if (initialized && initializedBundleRef === bundleRef && initializedSiteUrl === siteUrl) {
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
initialized = true;
|
|
23
|
+
initializedBundleRef = bundleRef;
|
|
24
|
+
initializedSiteUrl = siteUrl;
|
|
25
|
+
preloadKnowledgeBundle(
|
|
26
|
+
config.knowledgeBundle
|
|
27
|
+
);
|
|
28
|
+
const knowledgeBundle = getKnowledgeBundle();
|
|
29
|
+
if (!knowledgeBundle) return;
|
|
30
|
+
const articleDocs = knowledgeBundle.corpus.documents.map(
|
|
31
|
+
(doc) => ({
|
|
32
|
+
id: doc.id,
|
|
33
|
+
title: doc.title,
|
|
34
|
+
url: safeJoinUrl(siteUrl, doc.url ?? `/${doc.id}`),
|
|
35
|
+
excerpt: doc.summary,
|
|
36
|
+
content: doc.keyPoints.join(" "),
|
|
37
|
+
categories: [doc.category].filter(Boolean),
|
|
38
|
+
tags: doc.tags ?? [],
|
|
39
|
+
keyPoints: doc.keyPoints ?? [],
|
|
40
|
+
dateTime: doc.publishedAt ? new Date(doc.publishedAt).getTime() : 0,
|
|
41
|
+
lang: doc.lang,
|
|
42
|
+
summary: doc.summary,
|
|
43
|
+
readingTime: doc.readingTime
|
|
44
|
+
})
|
|
45
|
+
);
|
|
40
46
|
initArticleIndex(articleDocs);
|
|
41
47
|
initProjectIndex([]);
|
|
48
|
+
const chunksData = Object.fromEntries(
|
|
49
|
+
knowledgeBundle.passages.passages.reduce(
|
|
50
|
+
(map, passage) => {
|
|
51
|
+
const list = map.get(passage.documentId) ?? [];
|
|
52
|
+
list.push({
|
|
53
|
+
id: passage.id,
|
|
54
|
+
postId: passage.documentId,
|
|
55
|
+
heading: passage.heading,
|
|
56
|
+
content: passage.text,
|
|
57
|
+
position: passage.position,
|
|
58
|
+
tokenCount: passage.tokenCount,
|
|
59
|
+
headers: passage.headers
|
|
60
|
+
});
|
|
61
|
+
map.set(passage.documentId, list);
|
|
62
|
+
return map;
|
|
63
|
+
},
|
|
64
|
+
/* @__PURE__ */ new Map()
|
|
65
|
+
)
|
|
66
|
+
);
|
|
67
|
+
initArticleChunks(chunksData);
|
|
42
68
|
}
|
|
43
69
|
function resetMetadataInit() {
|
|
44
70
|
initialized = false;
|
|
71
|
+
extensionsLoaded = false;
|
|
72
|
+
initializedBundleRef = null;
|
|
73
|
+
initializedSiteUrl = "";
|
|
74
|
+
getExtensionRegistry().clear();
|
|
75
|
+
}
|
|
76
|
+
async function initializeExtensions(basePath) {
|
|
77
|
+
if (extensionsLoaded) return;
|
|
78
|
+
extensionsLoaded = true;
|
|
79
|
+
try {
|
|
80
|
+
const { loadExtensions } = await import("../extensions/loader.js");
|
|
81
|
+
await loadExtensions("datas/extensions/*.json", basePath);
|
|
82
|
+
} catch {
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
function areExtensionsLoaded() {
|
|
86
|
+
return extensionsLoaded;
|
|
45
87
|
}
|
|
46
88
|
export {
|
|
89
|
+
areExtensionsLoaded,
|
|
90
|
+
initializeExtensions,
|
|
47
91
|
initializeMetadata,
|
|
48
92
|
resetMetadataInit
|
|
49
93
|
};
|
package/dist/server/notify.d.ts
CHANGED
|
@@ -1,14 +1,15 @@
|
|
|
1
|
-
import
|
|
2
|
-
import type {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
1
|
+
import type { UIMessage } from "ai";
|
|
2
|
+
import type { NotifyArticleRef as ArticleRef, NotifyModelInfo as ModelInfo, NotifyTokenUsage as TokenUsage, PhaseTiming } from "./types.js";
|
|
3
|
+
type NotifyEnv = Record<string, unknown>;
|
|
4
|
+
interface NotifyResult {
|
|
5
|
+
event: "comment" | "ai-chat";
|
|
6
|
+
success: boolean;
|
|
7
|
+
results: Array<{
|
|
8
|
+
channel: "telegram" | "webhook" | "email";
|
|
9
|
+
success: boolean;
|
|
10
|
+
error?: string;
|
|
11
|
+
duration?: number;
|
|
12
|
+
}>;
|
|
12
13
|
}
|
|
13
14
|
export interface ChatNotifyOptions {
|
|
14
15
|
env: NotifyEnv;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"notify.d.ts","sourceRoot":"","sources":["../../src/server/notify.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"notify.d.ts","sourceRoot":"","sources":["../../src/server/notify.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AACpC,OAAO,KAAK,EACV,gBAAgB,IAAI,UAAU,EAC9B,eAAe,IAAI,SAAS,EAC5B,gBAAgB,IAAI,UAAU,EAC9B,WAAW,EACZ,MAAM,YAAY,CAAC;AAEpB,KAAK,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEzC,UAAU,YAAY;IACpB,KAAK,EAAE,SAAS,GAAG,SAAS,CAAC;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,KAAK,CAAC;QACb,OAAO,EAAE,UAAU,GAAG,SAAS,GAAG,OAAO,CAAC;QAC1C,OAAO,EAAE,OAAO,CAAC;QACjB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC,CAAC;CACJ;AAkED,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,SAAS,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,SAAS,EAAE,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kBAAkB,CAAC,EAAE,UAAU,EAAE,CAAC;IAClC,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,wBAAgB,YAAY,CAC1B,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CA4C9B"}
|
package/dist/server/notify.js
CHANGED
|
@@ -1,33 +1,23 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
1
|
+
async function loadNotifyRuntime() {
|
|
2
|
+
try {
|
|
3
|
+
return await import("@astro-minimax/notify");
|
|
4
|
+
} catch (error) {
|
|
5
|
+
if (error instanceof Error && "code" in error && error.code === "ERR_MODULE_NOT_FOUND") {
|
|
6
|
+
return null;
|
|
7
|
+
}
|
|
8
|
+
throw error;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
async function createEnvNotifier(env) {
|
|
12
|
+
const runtime = await loadNotifyRuntime();
|
|
13
|
+
if (!runtime) {
|
|
8
14
|
return null;
|
|
9
15
|
}
|
|
10
|
-
const
|
|
11
|
-
if (
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
notifierInstance = createNotifier({
|
|
16
|
-
telegram: env.NOTIFY_TELEGRAM_BOT_TOKEN && env.NOTIFY_TELEGRAM_CHAT_ID ? {
|
|
17
|
-
botToken: env.NOTIFY_TELEGRAM_BOT_TOKEN,
|
|
18
|
-
chatId: env.NOTIFY_TELEGRAM_CHAT_ID
|
|
19
|
-
} : void 0,
|
|
20
|
-
webhook: env.NOTIFY_WEBHOOK_URL ? {
|
|
21
|
-
url: env.NOTIFY_WEBHOOK_URL
|
|
22
|
-
} : void 0,
|
|
23
|
-
email: env.NOTIFY_RESEND_API_KEY && env.NOTIFY_RESEND_FROM && env.NOTIFY_RESEND_TO ? {
|
|
24
|
-
provider: "resend",
|
|
25
|
-
apiKey: env.NOTIFY_RESEND_API_KEY,
|
|
26
|
-
from: env.NOTIFY_RESEND_FROM,
|
|
27
|
-
to: env.NOTIFY_RESEND_TO
|
|
28
|
-
} : void 0
|
|
29
|
-
});
|
|
30
|
-
return notifierInstance;
|
|
16
|
+
const config = runtime.createNotifyConfigFromEnv(env);
|
|
17
|
+
if (!config.telegram && !config.webhook && !config.email) {
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
return runtime.createNotifier(config);
|
|
31
21
|
}
|
|
32
22
|
function getMessageText(message) {
|
|
33
23
|
if (Array.isArray(message.parts)) {
|
|
@@ -36,30 +26,38 @@ function getMessageText(message) {
|
|
|
36
26
|
return "";
|
|
37
27
|
}
|
|
38
28
|
function notifyAiChat(options) {
|
|
39
|
-
const {
|
|
40
|
-
|
|
41
|
-
if (!notifier) {
|
|
42
|
-
console.warn("[notify] AI chat notification skipped: no notifier available. Check environment variables.");
|
|
43
|
-
return Promise.resolve(null);
|
|
44
|
-
}
|
|
45
|
-
const userMessages = messages.filter((m) => m.role === "user");
|
|
46
|
-
const lastUserMessage = userMessages[userMessages.length - 1];
|
|
47
|
-
if (!lastUserMessage) {
|
|
48
|
-
console.warn("[notify] AI chat notification skipped: no user message found in messages array");
|
|
49
|
-
return Promise.resolve(null);
|
|
50
|
-
}
|
|
51
|
-
const userMessage = getMessageText(lastUserMessage);
|
|
52
|
-
const roundNumber = userMessages.length;
|
|
53
|
-
return notifier.aiChat({
|
|
29
|
+
const {
|
|
30
|
+
env,
|
|
54
31
|
sessionId,
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
aiResponse: aiResponse?.slice(0, 500),
|
|
32
|
+
messages,
|
|
33
|
+
aiResponse,
|
|
58
34
|
referencedArticles,
|
|
59
35
|
model,
|
|
60
36
|
usage,
|
|
61
|
-
timing
|
|
62
|
-
|
|
37
|
+
timing
|
|
38
|
+
} = options;
|
|
39
|
+
return createEnvNotifier(env).then((notifier) => {
|
|
40
|
+
if (!notifier) {
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
const userMessages = messages.filter((m) => m.role === "user");
|
|
44
|
+
const lastUserMessage = userMessages[userMessages.length - 1];
|
|
45
|
+
if (!lastUserMessage) {
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
const userMessage = getMessageText(lastUserMessage);
|
|
49
|
+
const roundNumber = userMessages.length;
|
|
50
|
+
return notifier.aiChat({
|
|
51
|
+
sessionId,
|
|
52
|
+
roundNumber,
|
|
53
|
+
userMessage,
|
|
54
|
+
aiResponse: aiResponse?.slice(0, 500),
|
|
55
|
+
referencedArticles,
|
|
56
|
+
model,
|
|
57
|
+
usage,
|
|
58
|
+
timing,
|
|
59
|
+
siteUrl: env.SITE_URL
|
|
60
|
+
});
|
|
63
61
|
}).catch((error) => {
|
|
64
62
|
console.error("[notify] AI chat notification failed:", error);
|
|
65
63
|
return null;
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import type { ChatContext } from "./types.js";
|
|
2
|
+
import type { PhaseTiming } from "./types.js";
|
|
3
|
+
import type { ProviderAdapter } from "../provider-manager/types.js";
|
|
4
|
+
import type { LoadedExtensions } from "../extensions/types.js";
|
|
5
|
+
import type { SourceSelection } from "../search/types.js";
|
|
6
|
+
import { getCitationGuardPreflight } from "../intelligence/index.js";
|
|
7
|
+
import { searchArticles, searchProjects } from "../search/index.js";
|
|
8
|
+
interface BuildRuntimeSystemPromptArgs {
|
|
9
|
+
env: Record<string, unknown>;
|
|
10
|
+
lang: string;
|
|
11
|
+
searchQuery: string;
|
|
12
|
+
relatedArticles: ReturnType<typeof searchArticles>;
|
|
13
|
+
relatedProjects: ReturnType<typeof searchProjects>;
|
|
14
|
+
evidenceSection?: string;
|
|
15
|
+
factSection?: string;
|
|
16
|
+
answerMode?: "fact" | "count" | "list" | "opinion" | "recommendation" | "unknown" | "general";
|
|
17
|
+
extensions: LoadedExtensions;
|
|
18
|
+
cacheKey: string | null;
|
|
19
|
+
voiceStylePrompt?: string;
|
|
20
|
+
chunksSection?: string;
|
|
21
|
+
preferInjectedChunks?: boolean;
|
|
22
|
+
}
|
|
23
|
+
export interface PromptAssemblyArgs {
|
|
24
|
+
env: Record<string, unknown>;
|
|
25
|
+
latestText: string;
|
|
26
|
+
context: ChatContext;
|
|
27
|
+
lang: string;
|
|
28
|
+
evidenceAnalysisTimeout: number;
|
|
29
|
+
timing: PhaseTiming & Record<string, number | undefined>;
|
|
30
|
+
adapter: ProviderAdapter | null;
|
|
31
|
+
hasRealProvider: boolean;
|
|
32
|
+
extensions: LoadedExtensions;
|
|
33
|
+
cacheKey: string | null;
|
|
34
|
+
searchQuery: string;
|
|
35
|
+
relatedArticles: ReturnType<typeof searchArticles>;
|
|
36
|
+
relatedProjects: ReturnType<typeof searchProjects>;
|
|
37
|
+
budget: {
|
|
38
|
+
analysisMaxTokens: number;
|
|
39
|
+
};
|
|
40
|
+
answerMode: "fact" | "count" | "list" | "opinion" | "recommendation" | "unknown" | "general";
|
|
41
|
+
}
|
|
42
|
+
export interface PromptAssemblyResult {
|
|
43
|
+
systemPrompt: string;
|
|
44
|
+
preflight: ReturnType<typeof getCitationGuardPreflight>;
|
|
45
|
+
unknownRefusal: {
|
|
46
|
+
text: string;
|
|
47
|
+
isUnknown: boolean;
|
|
48
|
+
} | null;
|
|
49
|
+
selectedSources: SourceSelection[];
|
|
50
|
+
}
|
|
51
|
+
export declare function resolvePromptGuards(args: {
|
|
52
|
+
latestText: string;
|
|
53
|
+
relatedArticles: ReturnType<typeof searchArticles>;
|
|
54
|
+
relatedProjects: ReturnType<typeof searchProjects>;
|
|
55
|
+
lang: string;
|
|
56
|
+
}): Pick<PromptAssemblyResult, 'preflight' | 'unknownRefusal'>;
|
|
57
|
+
export declare function buildRuntimeSystemPrompt(args: BuildRuntimeSystemPromptArgs): string;
|
|
58
|
+
export declare function assemblePromptRuntime(args: PromptAssemblyArgs): Promise<PromptAssemblyResult>;
|
|
59
|
+
export {};
|
|
60
|
+
//# sourceMappingURL=prompt-runtime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt-runtime.d.ts","sourceRoot":"","sources":["../../src/server/prompt-runtime.ts"],"names":[],"mappings":"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"}
|