@things-factory/board-ai 10.0.2 → 10.0.4
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/client/components/board-ai-chat.ts +458 -19
- package/client/components/chat-echo-dedup.test.ts +59 -3
- package/client/components/chat-echo-dedup.ts +29 -0
- package/dist-client/client/components/board-ai-chat.d.ts +63 -0
- package/dist-client/client/components/board-ai-chat.js +438 -16
- package/dist-client/client/components/board-ai-chat.js.map +1 -1
- package/dist-client/client/components/chat-echo-dedup.js +28 -0
- package/dist-client/client/components/chat-echo-dedup.js.map +1 -1
- package/dist-client/client/components/chat-echo-dedup.test.js +53 -3
- package/dist-client/client/components/chat-echo-dedup.test.js.map +1 -1
- package/dist-client/server/service/agentic-loop.d.ts +15 -0
- package/dist-client/server/service/agentic-loop.js +70 -9
- package/dist-client/server/service/agentic-loop.js.map +1 -1
- package/dist-client/server/service/assistant.js +18 -3
- package/dist-client/server/service/assistant.js.map +1 -1
- package/dist-client/server/service/types.d.ts +23 -0
- package/dist-client/server/service/types.js.map +1 -1
- package/dist-client/tsconfig.tsbuildinfo +1 -1
- package/dist-server/service/agentic-loop.d.ts +15 -0
- package/dist-server/service/agentic-loop.js +71 -9
- package/dist-server/service/agentic-loop.js.map +1 -1
- package/dist-server/service/assistant.js +17 -2
- package/dist-server/service/assistant.js.map +1 -1
- package/dist-server/service/board-ai-resolver.d.ts +13 -0
- package/dist-server/service/board-ai-resolver.js +99 -1
- package/dist-server/service/board-ai-resolver.js.map +1 -1
- package/dist-server/service/chat-message/fold-history.d.ts +30 -0
- package/dist-server/service/chat-message/fold-history.js +29 -0
- package/dist-server/service/chat-message/fold-history.js.map +1 -0
- package/dist-server/service/chat-message/history-summary.d.ts +43 -0
- package/dist-server/service/chat-message/history-summary.js +77 -0
- package/dist-server/service/chat-message/history-summary.js.map +1 -0
- package/dist-server/service/chat-message/llm-history.d.ts +19 -0
- package/dist-server/service/chat-message/llm-history.js +31 -1
- package/dist-server/service/chat-message/llm-history.js.map +1 -1
- package/dist-server/service/chat-session/chat-session.d.ts +8 -0
- package/dist-server/service/chat-session/chat-session.js +5 -0
- package/dist-server/service/chat-session/chat-session.js.map +1 -1
- package/dist-server/service/types.d.ts +23 -0
- package/dist-server/service/types.js.map +1 -1
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/package.json +6 -6
- package/server/service/agentic-loop.test.ts +91 -0
- package/server/service/agentic-loop.ts +80 -9
- package/server/service/assistant.ts +21 -3
- package/server/service/board-ai-resolver.ts +108 -1
- package/server/service/chat-message/fold-history.test.ts +98 -0
- package/server/service/chat-message/fold-history.ts +60 -0
- package/server/service/chat-message/history-summary.test.ts +127 -0
- package/server/service/chat-message/history-summary.ts +100 -0
- package/server/service/chat-message/llm-history.test.ts +65 -0
- package/server/service/chat-message/llm-history.ts +48 -1
- package/server/service/chat-session/chat-session.ts +11 -0
- package/server/service/dock-contract.test.ts +305 -0
- package/server/service/types.ts +23 -0
- package/translations/en.json +14 -1
- package/translations/ja.json +14 -1
- package/translations/ko.json +13 -0
- package/translations/ms.json +14 -1
- package/translations/zh.json +14 -1
|
@@ -9,7 +9,7 @@ import { runAgenticLoop } from './agentic-loop';
|
|
|
9
9
|
import { checkReplyGrounding } from './grounding';
|
|
10
10
|
import { collectAllComponents, findComponentByRefid } from './component-tree';
|
|
11
11
|
import { isStylingTool, dispatchStylingTool, buildStylingToolDefinitions } from './styling/registry.js';
|
|
12
|
-
import { getToolSpecsFor, getToolKind, findToolSpec } from '@things-factory/ai-client-base';
|
|
12
|
+
import { getToolSpecsFor, getToolKind, findToolSpec, getCategoryGuidance, isTransientAIError } from '@things-factory/ai-client-base';
|
|
13
13
|
import { validateWriteToolCall } from './validation/tool-validation';
|
|
14
14
|
const ALL_CATEGORIES = [
|
|
15
15
|
'container',
|
|
@@ -79,7 +79,15 @@ export class DefaultBoardAIAssistant {
|
|
|
79
79
|
* 정의만 숨기면 모델이 이름을 추측하거나 옛 대화가 재생될 때 숨긴 도구가 실행된다. */
|
|
80
80
|
const gate = buildToolGate({ boardTools: options.boardTools, toolCategories: options.toolCategories });
|
|
81
81
|
const tools = buildBoardEditTools(knownTypes, { boardTools: options.boardTools, toolCategories: options.toolCategories });
|
|
82
|
-
|
|
82
|
+
/* 노출된 도구 카테고리의 **사용 규율**을 프롬프트에 함께 싣는다.
|
|
83
|
+
*
|
|
84
|
+
* 도구 목록만 보내면 모델은 "무엇이 있는지" 는 알지만 "언제 반드시 불러야 하는지" 는 모른다.
|
|
85
|
+
* 실제로 그 공백에서 사고가 났다 — 조치 요청에 제안 도구를 부르지 않고 "제안해 두었습니다" 라고만
|
|
86
|
+
* 답해, 사용자에게 없는 버튼을 누르라고 안내했다. 규율은 도구를 등록한 쪽이 소유하고 여기서는
|
|
87
|
+
* 모아 붙이기만 한다(도메인 지식이 board-ai 프롬프트로 새지 않는다). */
|
|
88
|
+
const guidance = getCategoryGuidance(options.toolCategories);
|
|
89
|
+
const systemPrompt = this.buildSystemPromptForTools(knownTypes, categories, schemas) +
|
|
90
|
+
(guidance.length ? `\n\n==== TOOL USE RULES (from the tools exposed to this conversation) ====\n${guidance.join('\n')}` : '');
|
|
83
91
|
const selectedRefids = (options.selectedRefids ?? []).filter((n) => typeof n === 'number' && Number.isFinite(n));
|
|
84
92
|
// selection 정보는 항상 포함 (비어 있어도) — LLM 이 "선택된 게 뭐냐" 류 질문에
|
|
85
93
|
// getSelection 을 호출할지 판단하는 데 필요.
|
|
@@ -196,6 +204,8 @@ export class DefaultBoardAIAssistant {
|
|
|
196
204
|
followUp: undefined,
|
|
197
205
|
toolUsages: toolUsages.length > 0 ? toolUsages : undefined,
|
|
198
206
|
actions: accumulatedActions.length > 0 ? accumulatedActions : undefined,
|
|
207
|
+
/* 제안은 실행 전 상태다 — 대화면이 확인 버튼을 그린다. 서버는 실행하지 않는다. */
|
|
208
|
+
proposals: loopResult.proposals.length > 0 ? loopResult.proposals : undefined,
|
|
199
209
|
groundingWarnings: warnings.length > 0 ? warnings : undefined
|
|
200
210
|
};
|
|
201
211
|
}
|
|
@@ -1789,7 +1799,12 @@ export function formatAbortNotice(abortReason) {
|
|
|
1789
1799
|
case 'aborted':
|
|
1790
1800
|
return '\n\n_(요청이 중단되어 일부만 처리됐어요.)_';
|
|
1791
1801
|
case 'provider_error':
|
|
1792
|
-
|
|
1802
|
+
/* 남의 말(SDK 원문)을 사용자에게 보여주지 않는다 — "Error fetching from undefined: [503 …]" 은
|
|
1803
|
+
* 사용자가 할 수 있는 일을 알려주지 않는다. 일시 장애는 이미 몇 번 다시 시도한 뒤이므로,
|
|
1804
|
+
* 지금 필요한 안내는 "잠시 후 다시" 하나다. 원문은 서버 로그에 남는다. */
|
|
1805
|
+
return isTransientAIError({ message: abortReason.message })
|
|
1806
|
+
? '\n\n_(AI 서비스가 일시적으로 응답하지 않았어요. 잠시 후 다시 시도해 주세요.)_'
|
|
1807
|
+
: '\n\n_(처리 중 오류가 발생했어요. 같은 요청이 계속 실패하면 관리자에게 알려 주세요.)_';
|
|
1793
1808
|
case 'max_iterations':
|
|
1794
1809
|
return `\n\n_(작업이 너무 길어 ${abortReason.iter}회에서 중단했어요. 더 작게 나눠 요청해보세요.)_`;
|
|
1795
1810
|
case 'repeated_validation_failure':
|