@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.
Files changed (60) hide show
  1. package/client/components/board-ai-chat.ts +458 -19
  2. package/client/components/chat-echo-dedup.test.ts +59 -3
  3. package/client/components/chat-echo-dedup.ts +29 -0
  4. package/dist-client/client/components/board-ai-chat.d.ts +63 -0
  5. package/dist-client/client/components/board-ai-chat.js +438 -16
  6. package/dist-client/client/components/board-ai-chat.js.map +1 -1
  7. package/dist-client/client/components/chat-echo-dedup.js +28 -0
  8. package/dist-client/client/components/chat-echo-dedup.js.map +1 -1
  9. package/dist-client/client/components/chat-echo-dedup.test.js +53 -3
  10. package/dist-client/client/components/chat-echo-dedup.test.js.map +1 -1
  11. package/dist-client/server/service/agentic-loop.d.ts +15 -0
  12. package/dist-client/server/service/agentic-loop.js +70 -9
  13. package/dist-client/server/service/agentic-loop.js.map +1 -1
  14. package/dist-client/server/service/assistant.js +18 -3
  15. package/dist-client/server/service/assistant.js.map +1 -1
  16. package/dist-client/server/service/types.d.ts +23 -0
  17. package/dist-client/server/service/types.js.map +1 -1
  18. package/dist-client/tsconfig.tsbuildinfo +1 -1
  19. package/dist-server/service/agentic-loop.d.ts +15 -0
  20. package/dist-server/service/agentic-loop.js +71 -9
  21. package/dist-server/service/agentic-loop.js.map +1 -1
  22. package/dist-server/service/assistant.js +17 -2
  23. package/dist-server/service/assistant.js.map +1 -1
  24. package/dist-server/service/board-ai-resolver.d.ts +13 -0
  25. package/dist-server/service/board-ai-resolver.js +99 -1
  26. package/dist-server/service/board-ai-resolver.js.map +1 -1
  27. package/dist-server/service/chat-message/fold-history.d.ts +30 -0
  28. package/dist-server/service/chat-message/fold-history.js +29 -0
  29. package/dist-server/service/chat-message/fold-history.js.map +1 -0
  30. package/dist-server/service/chat-message/history-summary.d.ts +43 -0
  31. package/dist-server/service/chat-message/history-summary.js +77 -0
  32. package/dist-server/service/chat-message/history-summary.js.map +1 -0
  33. package/dist-server/service/chat-message/llm-history.d.ts +19 -0
  34. package/dist-server/service/chat-message/llm-history.js +31 -1
  35. package/dist-server/service/chat-message/llm-history.js.map +1 -1
  36. package/dist-server/service/chat-session/chat-session.d.ts +8 -0
  37. package/dist-server/service/chat-session/chat-session.js +5 -0
  38. package/dist-server/service/chat-session/chat-session.js.map +1 -1
  39. package/dist-server/service/types.d.ts +23 -0
  40. package/dist-server/service/types.js.map +1 -1
  41. package/dist-server/tsconfig.tsbuildinfo +1 -1
  42. package/package.json +6 -6
  43. package/server/service/agentic-loop.test.ts +91 -0
  44. package/server/service/agentic-loop.ts +80 -9
  45. package/server/service/assistant.ts +21 -3
  46. package/server/service/board-ai-resolver.ts +108 -1
  47. package/server/service/chat-message/fold-history.test.ts +98 -0
  48. package/server/service/chat-message/fold-history.ts +60 -0
  49. package/server/service/chat-message/history-summary.test.ts +127 -0
  50. package/server/service/chat-message/history-summary.ts +100 -0
  51. package/server/service/chat-message/llm-history.test.ts +65 -0
  52. package/server/service/chat-message/llm-history.ts +48 -1
  53. package/server/service/chat-session/chat-session.ts +11 -0
  54. package/server/service/dock-contract.test.ts +305 -0
  55. package/server/service/types.ts +23 -0
  56. package/translations/en.json +14 -1
  57. package/translations/ja.json +14 -1
  58. package/translations/ko.json +13 -0
  59. package/translations/ms.json +14 -1
  60. 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
- const systemPrompt = this.buildSystemPromptForTools(knownTypes, categories, schemas);
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
- return `\n\n_(처리 오류가 발생했어요: ${abortReason.message})_`;
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':