@superblocksteam/vite-plugin-file-sync 2.0.67 → 2.0.68-next.1
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/dist/ai-service/agent/tools/apis/analysis.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/apis/analysis.js +4 -0
- package/dist/ai-service/agent/tools/apis/analysis.js.map +1 -1
- package/dist/ai-service/agent/tools/apis/api-executor.d.ts +9 -1
- package/dist/ai-service/agent/tools/apis/api-executor.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/apis/api-executor.js +4 -1
- package/dist/ai-service/agent/tools/apis/api-executor.js.map +1 -1
- package/dist/ai-service/agent/tools/apis/api-validation-orchestrator.d.ts +1 -0
- package/dist/ai-service/agent/tools/apis/api-validation-orchestrator.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/apis/api-validation-orchestrator.js +1 -1
- package/dist/ai-service/agent/tools/apis/api-validation-orchestrator.js.map +1 -1
- package/dist/ai-service/agent/tools/apis/test-api.d.ts +5 -0
- package/dist/ai-service/agent/tools/apis/test-api.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/apis/test-api.js +37 -18
- package/dist/ai-service/agent/tools/apis/test-api.js.map +1 -1
- package/dist/ai-service/agent/tools/build-delete-file.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/build-delete-file.js +29 -0
- package/dist/ai-service/agent/tools/build-delete-file.js.map +1 -1
- package/dist/ai-service/agent/tools/integrations/execute-request.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/integrations/execute-request.js +5 -4
- package/dist/ai-service/agent/tools/integrations/execute-request.js.map +1 -1
- package/dist/ai-service/agent/tools.d.ts.map +1 -1
- package/dist/ai-service/agent/tools.js +17 -6
- package/dist/ai-service/agent/tools.js.map +1 -1
- package/dist/ai-service/agent/tools2/entity-permissions.d.ts +23 -20
- package/dist/ai-service/agent/tools2/entity-permissions.d.ts.map +1 -1
- package/dist/ai-service/agent/tools2/entity-permissions.js +15 -11
- package/dist/ai-service/agent/tools2/entity-permissions.js.map +1 -1
- package/dist/ai-service/agent/tools2/example.js +2 -2
- package/dist/ai-service/agent/tools2/example.js.map +1 -1
- package/dist/ai-service/agent/tools2/index.d.ts +1 -1
- package/dist/ai-service/agent/tools2/index.d.ts.map +1 -1
- package/dist/ai-service/agent/tools2/index.js +1 -1
- package/dist/ai-service/agent/tools2/index.js.map +1 -1
- package/dist/ai-service/agent/tools2/registry.d.ts +4 -4
- package/dist/ai-service/agent/tools2/registry.d.ts.map +1 -1
- package/dist/ai-service/agent/tools2/registry.js +42 -29
- package/dist/ai-service/agent/tools2/registry.js.map +1 -1
- package/dist/ai-service/agent/tools2/tools/read.d.ts +1 -1
- package/dist/ai-service/agent/tools2/types.d.ts +36 -15
- package/dist/ai-service/agent/tools2/types.d.ts.map +1 -1
- package/dist/ai-service/agent/tools2/types.js.map +1 -1
- package/dist/ai-service/chat/chat-session-store.d.ts +5 -7
- package/dist/ai-service/chat/chat-session-store.d.ts.map +1 -1
- package/dist/ai-service/chat/chat-session-store.js +36 -17
- package/dist/ai-service/chat/chat-session-store.js.map +1 -1
- package/dist/ai-service/chat/extract-history.d.ts +0 -85
- package/dist/ai-service/chat/extract-history.d.ts.map +1 -1
- package/dist/ai-service/chat/extract-history.js +3 -239
- package/dist/ai-service/chat/extract-history.js.map +1 -1
- package/dist/ai-service/index.d.ts +26 -4
- package/dist/ai-service/index.d.ts.map +1 -1
- package/dist/ai-service/index.js +125 -4
- package/dist/ai-service/index.js.map +1 -1
- package/dist/ai-service/judge/debug-browser.d.ts +8 -0
- package/dist/ai-service/judge/debug-browser.d.ts.map +1 -0
- package/dist/ai-service/judge/debug-browser.js +79 -0
- package/dist/ai-service/judge/debug-browser.js.map +1 -0
- package/dist/ai-service/judge/index.d.ts +12 -0
- package/dist/ai-service/judge/index.d.ts.map +1 -0
- package/dist/ai-service/judge/index.js +11 -0
- package/dist/ai-service/judge/index.js.map +1 -0
- package/dist/ai-service/judge/integration/mcp-client.d.ts +82 -0
- package/dist/ai-service/judge/integration/mcp-client.d.ts.map +1 -0
- package/dist/ai-service/judge/integration/mcp-client.js +276 -0
- package/dist/ai-service/judge/integration/mcp-client.js.map +1 -0
- package/dist/ai-service/judge/integration/playwright-bridge.d.ts +142 -0
- package/dist/ai-service/judge/integration/playwright-bridge.d.ts.map +1 -0
- package/dist/ai-service/judge/integration/playwright-bridge.js +217 -0
- package/dist/ai-service/judge/integration/playwright-bridge.js.map +1 -0
- package/dist/ai-service/judge/judge-eval-http.d.ts +3 -0
- package/dist/ai-service/judge/judge-eval-http.d.ts.map +1 -0
- package/dist/ai-service/judge/judge-eval-http.js +541 -0
- package/dist/ai-service/judge/judge-eval-http.js.map +1 -0
- package/dist/ai-service/judge/judge-eval-service-runner.d.ts +35 -0
- package/dist/ai-service/judge/judge-eval-service-runner.d.ts.map +1 -0
- package/dist/ai-service/judge/judge-eval-service-runner.js +124 -0
- package/dist/ai-service/judge/judge-eval-service-runner.js.map +1 -0
- package/dist/ai-service/judge/judge-executor.d.ts +65 -0
- package/dist/ai-service/judge/judge-executor.d.ts.map +1 -0
- package/dist/ai-service/judge/judge-executor.js +334 -0
- package/dist/ai-service/judge/judge-executor.js.map +1 -0
- package/dist/ai-service/judge/judge-service.d.ts +161 -0
- package/dist/ai-service/judge/judge-service.d.ts.map +1 -0
- package/dist/ai-service/judge/judge-service.js +241 -0
- package/dist/ai-service/judge/judge-service.js.map +1 -0
- package/dist/ai-service/judge/prompts/evaluation-criteria.d.ts +37 -0
- package/dist/ai-service/judge/prompts/evaluation-criteria.d.ts.map +1 -0
- package/dist/ai-service/judge/prompts/evaluation-criteria.js +283 -0
- package/dist/ai-service/judge/prompts/evaluation-criteria.js.map +1 -0
- package/dist/ai-service/judge/prompts/system-prompt.d.ts +30 -0
- package/dist/ai-service/judge/prompts/system-prompt.d.ts.map +1 -0
- package/dist/ai-service/judge/prompts/system-prompt.js +212 -0
- package/dist/ai-service/judge/prompts/system-prompt.js.map +1 -0
- package/dist/ai-service/judge/storage/csv-storage.d.ts +99 -0
- package/dist/ai-service/judge/storage/csv-storage.d.ts.map +1 -0
- package/dist/ai-service/judge/storage/csv-storage.js +274 -0
- package/dist/ai-service/judge/storage/csv-storage.js.map +1 -0
- package/dist/ai-service/judge/storage/index.d.ts +9 -0
- package/dist/ai-service/judge/storage/index.d.ts.map +1 -0
- package/dist/ai-service/judge/storage/index.js +7 -0
- package/dist/ai-service/judge/storage/index.js.map +1 -0
- package/dist/ai-service/judge/storage/interface.d.ts +51 -0
- package/dist/ai-service/judge/storage/interface.d.ts.map +1 -0
- package/dist/ai-service/judge/storage/interface.js +8 -0
- package/dist/ai-service/judge/storage/interface.js.map +1 -0
- package/dist/ai-service/judge/storage/types.d.ts +54 -0
- package/dist/ai-service/judge/storage/types.d.ts.map +1 -0
- package/dist/ai-service/judge/storage/types.js +7 -0
- package/dist/ai-service/judge/storage/types.js.map +1 -0
- package/dist/ai-service/judge/tools/index.d.ts +22 -0
- package/dist/ai-service/judge/tools/index.d.ts.map +1 -0
- package/dist/ai-service/judge/tools/index.js +29 -0
- package/dist/ai-service/judge/tools/index.js.map +1 -0
- package/dist/ai-service/judge/tools/playwright-action.d.ts +18 -0
- package/dist/ai-service/judge/tools/playwright-action.d.ts.map +1 -0
- package/dist/ai-service/judge/tools/playwright-action.js +171 -0
- package/dist/ai-service/judge/tools/playwright-action.js.map +1 -0
- package/dist/ai-service/judge/tools/submit-feedback.d.ts +41 -0
- package/dist/ai-service/judge/tools/submit-feedback.d.ts.map +1 -0
- package/dist/ai-service/judge/tools/submit-feedback.js +150 -0
- package/dist/ai-service/judge/tools/submit-feedback.js.map +1 -0
- package/dist/ai-service/judge/types.d.ts +169 -0
- package/dist/ai-service/judge/types.d.ts.map +1 -0
- package/dist/ai-service/judge/types.js +8 -0
- package/dist/ai-service/judge/types.js.map +1 -0
- package/dist/ai-service/llm/context/constants.d.ts +7 -0
- package/dist/ai-service/llm/context/constants.d.ts.map +1 -1
- package/dist/ai-service/llm/context/constants.js +7 -0
- package/dist/ai-service/llm/context/constants.js.map +1 -1
- package/dist/ai-service/llm/context/context.d.ts +8 -1
- package/dist/ai-service/llm/context/context.d.ts.map +1 -1
- package/dist/ai-service/llm/context/context.js +47 -12
- package/dist/ai-service/llm/context/context.js.map +1 -1
- package/dist/ai-service/llm/context/internal-types.d.ts +1 -0
- package/dist/ai-service/llm/context/internal-types.d.ts.map +1 -1
- package/dist/ai-service/llm/context/internal-types.js.map +1 -1
- package/dist/ai-service/llm/context/manager.d.ts +2 -1
- package/dist/ai-service/llm/context/manager.d.ts.map +1 -1
- package/dist/ai-service/llm/context/manager.js +2 -1
- package/dist/ai-service/llm/context/manager.js.map +1 -1
- package/dist/ai-service/llm/context/utils/message-utils.d.ts +10 -0
- package/dist/ai-service/llm/context/utils/message-utils.d.ts.map +1 -1
- package/dist/ai-service/llm/context/utils/message-utils.js +74 -0
- package/dist/ai-service/llm/context/utils/message-utils.js.map +1 -1
- package/dist/ai-service/llm/error.d.ts +1 -1
- package/dist/ai-service/llm/interaction/adapters/vercel.d.ts.map +1 -1
- package/dist/ai-service/llm/interaction/adapters/vercel.js.map +1 -1
- package/dist/ai-service/llm/interaction/provider.d.ts +10 -9
- package/dist/ai-service/llm/interaction/provider.d.ts.map +1 -1
- package/dist/ai-service/llmobs/middleware/stream-text.d.ts +8 -8
- package/dist/ai-service/llmobs/middleware/stream-text.d.ts.map +1 -1
- package/dist/ai-service/llmobs/middleware/stream-text.js.map +1 -1
- package/dist/ai-service/llmobs/tracer.d.ts.map +1 -1
- package/dist/ai-service/llmobs/tracer.js +2 -1
- package/dist/ai-service/llmobs/tracer.js.map +1 -1
- package/dist/ai-service/mcp/embedded-playwright-mcp-server.d.ts +53 -0
- package/dist/ai-service/mcp/embedded-playwright-mcp-server.d.ts.map +1 -0
- package/dist/ai-service/mcp/embedded-playwright-mcp-server.js +541 -0
- package/dist/ai-service/mcp/embedded-playwright-mcp-server.js.map +1 -0
- package/dist/ai-service/mcp/playwright-server.d.ts +114 -0
- package/dist/ai-service/mcp/playwright-server.d.ts.map +1 -0
- package/dist/ai-service/mcp/playwright-server.js +109 -0
- package/dist/ai-service/mcp/playwright-server.js.map +1 -0
- package/dist/ai-service/state-machine/clark-fsm.d.ts +4 -1
- package/dist/ai-service/state-machine/clark-fsm.d.ts.map +1 -1
- package/dist/ai-service/state-machine/clark-fsm.js +3 -1
- package/dist/ai-service/state-machine/clark-fsm.js.map +1 -1
- package/dist/ai-service/state-machine/handlers/idle.d.ts.map +1 -1
- package/dist/ai-service/state-machine/handlers/idle.js +3 -1
- package/dist/ai-service/state-machine/handlers/idle.js.map +1 -1
- package/dist/ai-service/state-machine/handlers/runtime-reviewing.d.ts.map +1 -1
- package/dist/ai-service/state-machine/handlers/runtime-reviewing.js +4 -1
- package/dist/ai-service/state-machine/handlers/runtime-reviewing.js.map +1 -1
- package/dist/ai-service/state-machine/helpers/context-id.d.ts +1 -1
- package/dist/ai-service/state-machine/helpers/context-id.d.ts.map +1 -1
- package/dist/ai-service/state-machine/helpers/context-id.js +6 -7
- package/dist/ai-service/state-machine/helpers/context-id.js.map +1 -1
- package/dist/ai-service/state-machine/mocks.d.ts +1 -0
- package/dist/ai-service/state-machine/mocks.d.ts.map +1 -1
- package/dist/ai-service/state-machine/mocks.js +5 -1
- package/dist/ai-service/state-machine/mocks.js.map +1 -1
- package/dist/server-rpc/client.js +1 -1
- package/dist/server-rpc/client.js.map +1 -1
- package/dist/socket-manager.d.ts.map +1 -1
- package/dist/socket-manager.js +26 -6
- package/dist/socket-manager.js.map +1 -1
- package/dist/sync-service/index.d.ts +5 -0
- package/dist/sync-service/index.d.ts.map +1 -1
- package/dist/sync-service/index.js +13 -1
- package/dist/sync-service/index.js.map +1 -1
- package/package.json +7 -6
|
@@ -1,88 +1,3 @@
|
|
|
1
1
|
import type { AiChatMessage } from "@superblocksteam/library-shared/types";
|
|
2
|
-
/**
|
|
3
|
-
* Pure functions for filtering and processing chat message history
|
|
4
|
-
* These functions extract conversation context suitable for LLM prompts
|
|
5
|
-
*/
|
|
6
|
-
/**
|
|
7
|
-
* Get up to the last N messages from the array
|
|
8
|
-
*/
|
|
9
|
-
export declare function getLimitedRecentMessages(messages: AiChatMessage[], limit?: number): AiChatMessage[];
|
|
10
|
-
/**
|
|
11
|
-
* Find the index of the most recent user message
|
|
12
|
-
*/
|
|
13
|
-
export declare function findLastUserMessageIndex(messages: AiChatMessage[]): number;
|
|
14
|
-
export declare function findLastMessageIndex(messages: AiChatMessage[], filter: (message: AiChatMessage) => boolean, n?: number): number;
|
|
15
|
-
/**
|
|
16
|
-
* Remove messages from the given index onwards
|
|
17
|
-
*/
|
|
18
|
-
export declare function removeMessagesFromIndex(messages: AiChatMessage[], fromIndex: number): AiChatMessage[];
|
|
19
|
-
/**
|
|
20
|
-
* Find the summary message index in the current exchange (looking backwards)
|
|
21
|
-
*/
|
|
22
|
-
export declare function findSummaryIndex(messages: AiChatMessage[], currentIndex: number): number;
|
|
23
|
-
/**
|
|
24
|
-
* Check if a message should be included in history (text type only)
|
|
25
|
-
*/
|
|
26
|
-
export declare function isTextType(message: AiChatMessage | undefined): boolean;
|
|
27
|
-
/**
|
|
28
|
-
* Check if an assistant message comes after a summary in its exchange
|
|
29
|
-
*/
|
|
30
|
-
export declare function isAssistantMessageAfterSummary(messages: AiChatMessage[], messageIndex: number, message: AiChatMessage): boolean;
|
|
31
|
-
/**
|
|
32
|
-
* Process messages to extract valid user-assistant exchanges
|
|
33
|
-
*/
|
|
34
|
-
export declare function processMessageExchanges(messages: AiChatMessage[]): Array<{
|
|
35
|
-
role: "user" | "assistant";
|
|
36
|
-
content: string;
|
|
37
|
-
}>;
|
|
38
|
-
/**
|
|
39
|
-
* Process a single exchange to extract the user message and main assistant response
|
|
40
|
-
*/
|
|
41
|
-
export declare function processSingleExchange(exchange: {
|
|
42
|
-
userMessage: AiChatMessage;
|
|
43
|
-
assistantMessages: AiChatMessage[];
|
|
44
|
-
}): Array<{
|
|
45
|
-
role: "user" | "assistant";
|
|
46
|
-
content: string;
|
|
47
|
-
}>;
|
|
48
|
-
/**
|
|
49
|
-
* Identify complete message exchanges (user prompt + assistant responses) in the conversation
|
|
50
|
-
* An exchange starts with a user message and includes all subsequent assistant messages until the next user message
|
|
51
|
-
*/
|
|
52
|
-
export declare function identifyMessageExchanges(messages: AiChatMessage[]): Array<{
|
|
53
|
-
userMessage: AiChatMessage;
|
|
54
|
-
assistantMessages: AiChatMessage[];
|
|
55
|
-
startIndex: number;
|
|
56
|
-
endIndex: number;
|
|
57
|
-
}>;
|
|
58
|
-
/**
|
|
59
|
-
* Determine the outcome of a message exchange based on subsequent user actions
|
|
60
|
-
*/
|
|
61
|
-
export declare function determineExchangeOutcome(exchange: {
|
|
62
|
-
userMessage: AiChatMessage;
|
|
63
|
-
assistantMessages: AiChatMessage[];
|
|
64
|
-
startIndex: number;
|
|
65
|
-
endIndex: number;
|
|
66
|
-
}, allMessages: AiChatMessage[]): "accepted" | "rejected" | "unknown";
|
|
67
2
|
export declare function getLastUserMessage(messages: AiChatMessage[]): AiChatMessage | undefined;
|
|
68
|
-
/**
|
|
69
|
-
* Extract productive conversation history for LLM context
|
|
70
|
-
*
|
|
71
|
-
* 1. Removes the most recent user message and anything after it (incomplete exchange)
|
|
72
|
-
* 2. Identifies complete message exchanges (user prompt + assistant responses)
|
|
73
|
-
* 3. Categorizes exchanges by outcome (accepted, rejected, unknown)
|
|
74
|
-
* 4. Filters for accepted exchanges
|
|
75
|
-
* 5. Optionally includes the most recent exchange if outcome is unknown
|
|
76
|
-
* 6. Sorts exchanges by original order and flattens to messages
|
|
77
|
-
* 7. Processes messages to apply filtering and summary logic
|
|
78
|
-
*/
|
|
79
|
-
export declare const extractProductiveHistoryForContext: typeof _extractProductiveHistoryForContext;
|
|
80
|
-
declare function _extractProductiveHistoryForContext(messages: AiChatMessage[], options?: {
|
|
81
|
-
maxAcceptedExchanges?: number;
|
|
82
|
-
includeRecentUnknown?: boolean;
|
|
83
|
-
}): Array<{
|
|
84
|
-
role: "user" | "assistant";
|
|
85
|
-
content: string;
|
|
86
|
-
}>;
|
|
87
|
-
export {};
|
|
88
3
|
//# sourceMappingURL=extract-history.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extract-history.d.ts","sourceRoot":"","sources":["../../../src/ai-service/chat/extract-history.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"extract-history.d.ts","sourceRoot":"","sources":["../../../src/ai-service/chat/extract-history.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;AAsB3E,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,aAAa,EAAE,GACxB,aAAa,GAAG,SAAS,CAG3B"}
|
|
@@ -1,259 +1,23 @@
|
|
|
1
1
|
import { getLogger } from "../../util/logger.js";
|
|
2
|
-
import llmobs from "../llmobs/index.js";
|
|
3
|
-
/**
|
|
4
|
-
* Pure functions for filtering and processing chat message history
|
|
5
|
-
* These functions extract conversation context suitable for LLM prompts
|
|
6
|
-
*/
|
|
7
|
-
/**
|
|
8
|
-
* Get up to the last N messages from the array
|
|
9
|
-
*/
|
|
10
|
-
export function getLimitedRecentMessages(messages, limit = 100) {
|
|
11
|
-
return messages.slice(-limit);
|
|
12
|
-
}
|
|
13
2
|
/**
|
|
14
3
|
* Find the index of the most recent user message
|
|
15
4
|
*/
|
|
16
|
-
|
|
17
|
-
return findLastMessageIndex(messages, (msg) => msg.role === "user");
|
|
18
|
-
}
|
|
19
|
-
// 0-indexed: 0 = last, 1 = second last, etc.
|
|
20
|
-
export function findLastMessageIndex(messages, filter, n = 0) {
|
|
5
|
+
function findLastUserMessageIndex(messages) {
|
|
21
6
|
let count = 0;
|
|
22
7
|
for (let i = messages.length - 1; i >= 0; i--) {
|
|
23
8
|
getLogger().info(`Checking message at index ${i}: ${JSON.stringify(messages[i])}`);
|
|
24
|
-
if (
|
|
9
|
+
if (messages[i].role !== "user") {
|
|
25
10
|
continue;
|
|
26
11
|
}
|
|
27
12
|
count++;
|
|
28
|
-
if (count >
|
|
13
|
+
if (count > 0) {
|
|
29
14
|
return i;
|
|
30
15
|
}
|
|
31
16
|
}
|
|
32
17
|
return -1;
|
|
33
18
|
}
|
|
34
|
-
/**
|
|
35
|
-
* Remove messages from the given index onwards
|
|
36
|
-
*/
|
|
37
|
-
export function removeMessagesFromIndex(messages, fromIndex) {
|
|
38
|
-
return fromIndex >= 0 ? messages.slice(0, fromIndex) : [...messages];
|
|
39
|
-
}
|
|
40
|
-
/**
|
|
41
|
-
* Find the summary message index in the current exchange (looking backwards)
|
|
42
|
-
*/
|
|
43
|
-
export function findSummaryIndex(messages, currentIndex) {
|
|
44
|
-
for (let j = currentIndex; j >= 0; j--) {
|
|
45
|
-
const prevMessage = messages[j];
|
|
46
|
-
// Found summary message
|
|
47
|
-
if (prevMessage?.role === "assistant" && prevMessage?.group === "summary") {
|
|
48
|
-
return j;
|
|
49
|
-
}
|
|
50
|
-
// Stop looking if we hit a user message (start of exchange)
|
|
51
|
-
if (prevMessage?.role === "user") {
|
|
52
|
-
break;
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
return -1;
|
|
56
|
-
}
|
|
57
|
-
/**
|
|
58
|
-
* Check if a message should be included in history (text type only)
|
|
59
|
-
*/
|
|
60
|
-
export function isTextType(message) {
|
|
61
|
-
return Boolean(message && message.type === "text");
|
|
62
|
-
}
|
|
63
|
-
/**
|
|
64
|
-
* Check if an assistant message comes after a summary in its exchange
|
|
65
|
-
*/
|
|
66
|
-
export function isAssistantMessageAfterSummary(messages, messageIndex, message) {
|
|
67
|
-
if (message.role !== "assistant" || !isTextType(message)) {
|
|
68
|
-
return false;
|
|
69
|
-
}
|
|
70
|
-
const summaryIndex = findSummaryIndex(messages, messageIndex);
|
|
71
|
-
return summaryIndex >= 0 && messageIndex > summaryIndex;
|
|
72
|
-
}
|
|
73
|
-
/**
|
|
74
|
-
* Process messages to extract valid user-assistant exchanges
|
|
75
|
-
*/
|
|
76
|
-
export function processMessageExchanges(messages) {
|
|
77
|
-
const processedMessages = [];
|
|
78
|
-
for (let i = 0; i < messages.length; i++) {
|
|
79
|
-
const message = messages[i];
|
|
80
|
-
// Include user messages with type "text"
|
|
81
|
-
if (message?.role === "user" && isTextType(message)) {
|
|
82
|
-
processedMessages.push({
|
|
83
|
-
role: "user",
|
|
84
|
-
content: message.content,
|
|
85
|
-
});
|
|
86
|
-
}
|
|
87
|
-
// Include assistant messages that come after summary and have type "text"
|
|
88
|
-
if (message && isAssistantMessageAfterSummary(messages, i, message)) {
|
|
89
|
-
processedMessages.push({
|
|
90
|
-
role: "assistant",
|
|
91
|
-
content: message.content,
|
|
92
|
-
});
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
return processedMessages;
|
|
96
|
-
}
|
|
97
|
-
/**
|
|
98
|
-
* Process a single exchange to extract the user message and main assistant response
|
|
99
|
-
*/
|
|
100
|
-
export function processSingleExchange(exchange) {
|
|
101
|
-
const result = [];
|
|
102
|
-
// Include user message if it's text type
|
|
103
|
-
if (isTextType(exchange.userMessage)) {
|
|
104
|
-
result.push({
|
|
105
|
-
role: "user",
|
|
106
|
-
content: exchange.userMessage.content,
|
|
107
|
-
});
|
|
108
|
-
}
|
|
109
|
-
// Find the summary message and include only the first assistant message after it
|
|
110
|
-
let summaryIndex = -1;
|
|
111
|
-
for (let i = 0; i < exchange.assistantMessages.length; i++) {
|
|
112
|
-
const msg = exchange.assistantMessages[i];
|
|
113
|
-
if (msg?.role === "assistant" && msg?.group === "summary") {
|
|
114
|
-
summaryIndex = i;
|
|
115
|
-
break;
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
// Include the first assistant message after summary with text type
|
|
119
|
-
if (summaryIndex >= 0) {
|
|
120
|
-
for (let i = summaryIndex + 1; i < exchange.assistantMessages.length; i++) {
|
|
121
|
-
const msg = exchange.assistantMessages[i];
|
|
122
|
-
if (msg?.role === "assistant" && isTextType(msg)) {
|
|
123
|
-
result.push({
|
|
124
|
-
role: "assistant",
|
|
125
|
-
content: msg.content,
|
|
126
|
-
});
|
|
127
|
-
break; // Only include the first one
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
return result;
|
|
132
|
-
}
|
|
133
|
-
/**
|
|
134
|
-
* Identify complete message exchanges (user prompt + assistant responses) in the conversation
|
|
135
|
-
* An exchange starts with a user message and includes all subsequent assistant messages until the next user message
|
|
136
|
-
*/
|
|
137
|
-
export function identifyMessageExchanges(messages) {
|
|
138
|
-
const exchanges = [];
|
|
139
|
-
let currentExchange = null;
|
|
140
|
-
for (let i = 0; i < messages.length; i++) {
|
|
141
|
-
const message = messages[i];
|
|
142
|
-
if (message?.role === "user") {
|
|
143
|
-
// If we have a current exchange, finalize it
|
|
144
|
-
if (currentExchange) {
|
|
145
|
-
exchanges.push({
|
|
146
|
-
...currentExchange,
|
|
147
|
-
endIndex: i - 1,
|
|
148
|
-
});
|
|
149
|
-
}
|
|
150
|
-
// Start a new exchange
|
|
151
|
-
currentExchange = {
|
|
152
|
-
userMessage: message,
|
|
153
|
-
assistantMessages: [],
|
|
154
|
-
startIndex: i,
|
|
155
|
-
};
|
|
156
|
-
}
|
|
157
|
-
else if (message?.role === "assistant" && currentExchange) {
|
|
158
|
-
// Add assistant message to current exchange
|
|
159
|
-
currentExchange.assistantMessages.push(message);
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
// Finalize the last exchange if it exists
|
|
163
|
-
if (currentExchange) {
|
|
164
|
-
exchanges.push({
|
|
165
|
-
...currentExchange,
|
|
166
|
-
endIndex: messages.length - 1,
|
|
167
|
-
});
|
|
168
|
-
}
|
|
169
|
-
return exchanges;
|
|
170
|
-
}
|
|
171
|
-
/**
|
|
172
|
-
* Determine the outcome of a message exchange based on subsequent user actions
|
|
173
|
-
*/
|
|
174
|
-
export function determineExchangeOutcome(exchange, allMessages) {
|
|
175
|
-
// Look for acceptance/rejection messages after this exchange
|
|
176
|
-
const messagesAfterExchange = allMessages.slice(exchange.endIndex + 1);
|
|
177
|
-
for (const message of messagesAfterExchange) {
|
|
178
|
-
if (message.role === "user") {
|
|
179
|
-
if (message.type === "draftAccepted") {
|
|
180
|
-
return "accepted";
|
|
181
|
-
}
|
|
182
|
-
if (message.type === "draftRejected") {
|
|
183
|
-
return "rejected";
|
|
184
|
-
}
|
|
185
|
-
// If we hit another user text message before finding acceptance/rejection,
|
|
186
|
-
// the outcome is unknown (user moved on without explicitly accepting/rejecting)
|
|
187
|
-
if (message.type === "text") {
|
|
188
|
-
return "unknown";
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
return "unknown";
|
|
193
|
-
}
|
|
194
19
|
export function getLastUserMessage(messages) {
|
|
195
20
|
const lastUserIndex = findLastUserMessageIndex(messages);
|
|
196
21
|
return lastUserIndex >= 0 ? messages[lastUserIndex] : undefined;
|
|
197
22
|
}
|
|
198
|
-
/**
|
|
199
|
-
* Extract productive conversation history for LLM context
|
|
200
|
-
*
|
|
201
|
-
* 1. Removes the most recent user message and anything after it (incomplete exchange)
|
|
202
|
-
* 2. Identifies complete message exchanges (user prompt + assistant responses)
|
|
203
|
-
* 3. Categorizes exchanges by outcome (accepted, rejected, unknown)
|
|
204
|
-
* 4. Filters for accepted exchanges
|
|
205
|
-
* 5. Optionally includes the most recent exchange if outcome is unknown
|
|
206
|
-
* 6. Sorts exchanges by original order and flattens to messages
|
|
207
|
-
* 7. Processes messages to apply filtering and summary logic
|
|
208
|
-
*/
|
|
209
|
-
export const extractProductiveHistoryForContext = llmobs.wrap({
|
|
210
|
-
kind: "task",
|
|
211
|
-
name: "extractProductiveHistoryForContext",
|
|
212
|
-
}, _extractProductiveHistoryForContext);
|
|
213
|
-
function _extractProductiveHistoryForContext(messages, options = {}) {
|
|
214
|
-
const { maxAcceptedExchanges = 2, includeRecentUnknown = true } = options;
|
|
215
|
-
// Step 1: Remove only truly incomplete exchanges (user message with no assistant response)
|
|
216
|
-
let messagesToProcess = messages;
|
|
217
|
-
const lastUserIndex = findLastUserMessageIndex(messages);
|
|
218
|
-
if (lastUserIndex >= 0) {
|
|
219
|
-
// Check if this user message has any assistant responses after it
|
|
220
|
-
const hasAssistantResponse = messages
|
|
221
|
-
.slice(lastUserIndex + 1)
|
|
222
|
-
.some((msg) => msg?.role === "assistant");
|
|
223
|
-
// Only remove if there's no assistant response (truly incomplete)
|
|
224
|
-
if (!hasAssistantResponse) {
|
|
225
|
-
messagesToProcess = removeMessagesFromIndex(messages, lastUserIndex);
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
|
-
// Step 2: Identify complete message exchanges
|
|
229
|
-
const exchanges = identifyMessageExchanges(messagesToProcess);
|
|
230
|
-
// Step 3: Categorize exchanges by outcome
|
|
231
|
-
const exchangesWithOutcomes = exchanges.map((exchange) => ({
|
|
232
|
-
...exchange,
|
|
233
|
-
outcome: determineExchangeOutcome(exchange, messages),
|
|
234
|
-
}));
|
|
235
|
-
// Step 4: Filter exchanges based on acceptance criteria
|
|
236
|
-
const acceptedExchanges = exchangesWithOutcomes
|
|
237
|
-
.filter((exchange) => exchange.outcome === "accepted")
|
|
238
|
-
.slice(-maxAcceptedExchanges); // Take the most recent accepted exchanges
|
|
239
|
-
let finalExchanges = acceptedExchanges;
|
|
240
|
-
// Step 5: Optionally include the most recent exchange if it has unknown outcome
|
|
241
|
-
// This covers the draft case where the user has not accepted or rejected the draft
|
|
242
|
-
if (includeRecentUnknown && exchanges.length > 0) {
|
|
243
|
-
const mostRecentExchange = exchangesWithOutcomes[exchangesWithOutcomes.length - 1];
|
|
244
|
-
if (mostRecentExchange?.outcome === "unknown" &&
|
|
245
|
-
!acceptedExchanges.includes(mostRecentExchange)) {
|
|
246
|
-
finalExchanges = [...acceptedExchanges, mostRecentExchange];
|
|
247
|
-
}
|
|
248
|
-
}
|
|
249
|
-
// Step 6: Sort by original order and process each exchange individually
|
|
250
|
-
const sortedExchanges = finalExchanges.sort((a, b) => a.startIndex - b.startIndex);
|
|
251
|
-
// Step 7: Process each exchange individually to maintain proper boundaries
|
|
252
|
-
const processedMessages = [];
|
|
253
|
-
for (const exchange of sortedExchanges) {
|
|
254
|
-
const exchangeMessages = processSingleExchange(exchange);
|
|
255
|
-
processedMessages.push(...exchangeMessages);
|
|
256
|
-
}
|
|
257
|
-
return processedMessages;
|
|
258
|
-
}
|
|
259
23
|
//# sourceMappingURL=extract-history.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extract-history.js","sourceRoot":"","sources":["../../../src/ai-service/chat/extract-history.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"extract-history.js","sourceRoot":"","sources":["../../../src/ai-service/chat/extract-history.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAGjD;;GAEG;AACH,SAAS,wBAAwB,CAAC,QAAyB;IACzD,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9C,SAAS,EAAE,CAAC,IAAI,CACd,6BAA6B,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAE,CAAC,EAAE,CAClE,CAAC;QACF,IAAI,QAAQ,CAAC,CAAC,CAAE,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YACjC,SAAS;QACX,CAAC;QACD,KAAK,EAAE,CAAC;QACR,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YACd,OAAO,CAAC,CAAC;QACX,CAAC;IACH,CAAC;IACD,OAAO,CAAC,CAAC,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,QAAyB;IAEzB,MAAM,aAAa,GAAG,wBAAwB,CAAC,QAAQ,CAAC,CAAC;IACzD,OAAO,aAAa,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAClE,CAAC"}
|
|
@@ -2,9 +2,10 @@ import { TracedEventEmitter } from "@superblocksteam/shared";
|
|
|
2
2
|
import { ChatSessionStore } from "./chat/chat-session-store.js";
|
|
3
3
|
import { AppContextStore } from "./context/app-context.js";
|
|
4
4
|
import type { FileSystemManager } from "../file-system-manager.js";
|
|
5
|
-
import type { AiServiceConfig, AiServiceEvents, EditorClient, UserChange, ApiUpdate } from "./types.ts";
|
|
6
5
|
import type { SourceTracker } from "../source-tracker.js";
|
|
7
|
-
import type {
|
|
6
|
+
import type { JudgeEvaluationOptions, JudgeEvaluationResult } from "./judge/judge-service.js";
|
|
7
|
+
import type { AiServiceConfig, AiServiceEvents, EditorClient, UserChange, ApiUpdate } from "./types.ts";
|
|
8
|
+
import type { AiGenerateRequest, AiExplainCodeRequest, LLMProviderConfig, PromptContext, RuntimeErrorData } from "@superblocksteam/library-shared/types";
|
|
8
9
|
export { AiServiceFeatureFlags } from "./features.js";
|
|
9
10
|
export declare class AiService extends TracedEventEmitter<AiServiceEvents> {
|
|
10
11
|
private readonly config;
|
|
@@ -25,6 +26,7 @@ export declare class AiService extends TracedEventEmitter<AiServiceEvents> {
|
|
|
25
26
|
private readonly entityPermissionStore;
|
|
26
27
|
private _onGenerationCompleteCallback;
|
|
27
28
|
private tokenManagerJwt?;
|
|
29
|
+
private readonly mcpServerManager;
|
|
28
30
|
get appContext(): AppContextStore;
|
|
29
31
|
constructor(config: AiServiceConfig);
|
|
30
32
|
/**
|
|
@@ -44,8 +46,8 @@ export declare class AiService extends TracedEventEmitter<AiServiceEvents> {
|
|
|
44
46
|
handleAiGenerate(request: AiGenerateRequest, peer: EditorClient, peerId: string): Promise<void>;
|
|
45
47
|
handleAiExplainCode(request: AiExplainCodeRequest, peer: EditorClient): Promise<void>;
|
|
46
48
|
private submitAcceptanceEvaluation;
|
|
47
|
-
handleUserAcceptedDraft(peer: EditorClient): Promise<void>;
|
|
48
|
-
handleUserRejectedDraft(peer: EditorClient): Promise<void>;
|
|
49
|
+
handleUserAcceptedDraft(peer: EditorClient, silently?: boolean): Promise<void>;
|
|
50
|
+
handleUserRejectedDraft(peer: EditorClient, silently?: boolean): Promise<void>;
|
|
49
51
|
handleUserCanceled(): Promise<void>;
|
|
50
52
|
handleUserConnected(peer: EditorClient, peerId: string): void;
|
|
51
53
|
handleUserDisconnected(peerId: string): void;
|
|
@@ -60,8 +62,28 @@ export declare class AiService extends TracedEventEmitter<AiServiceEvents> {
|
|
|
60
62
|
jwt: string;
|
|
61
63
|
promptContext?: PromptContext;
|
|
62
64
|
}, peer: EditorClient): Promise<void>;
|
|
65
|
+
/**
|
|
66
|
+
* Handles judge evaluation requests.
|
|
67
|
+
*
|
|
68
|
+
* Evaluates an application against a prompt using the judge system.
|
|
69
|
+
* The evaluation is automatically stored to CSV for later analysis.
|
|
70
|
+
*
|
|
71
|
+
* @param request - Judge evaluation request
|
|
72
|
+
* @returns Evaluation result with scores and feedback
|
|
73
|
+
*/
|
|
74
|
+
handleJudgeEvaluation(request: {
|
|
75
|
+
promptId: string;
|
|
76
|
+
prompt: string;
|
|
77
|
+
appId: string;
|
|
78
|
+
appUrl: string;
|
|
79
|
+
jwt: string;
|
|
80
|
+
llmConfig?: LLMProviderConfig;
|
|
81
|
+
options?: Partial<JudgeEvaluationOptions>;
|
|
82
|
+
storageStateData?: any;
|
|
83
|
+
}): Promise<JudgeEvaluationResult>;
|
|
63
84
|
handleUserChange(change: UserChange): void;
|
|
64
85
|
handleNewChat(): Promise<void>;
|
|
86
|
+
handleTruncateChatAfterTimestamp(sinceTimestamp: number): Promise<void>;
|
|
65
87
|
handleApiUpdate(update: ApiUpdate): Promise<void>;
|
|
66
88
|
isBusy(): boolean;
|
|
67
89
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ai-service/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ai-service/index.ts"],"names":[],"mappings":"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"}
|