@things-factory/board-ai 10.1.5 → 10.1.7
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/default-catalog-entries.ts +1 -1
- package/client/components/default-slash-templates.ts +1 -1
- package/client/index.ts +39 -6
- package/dist-client/client/components/default-catalog-entries.d.ts +1 -1
- package/dist-client/client/components/default-catalog-entries.js.map +1 -1
- package/dist-client/client/components/default-slash-templates.d.ts +1 -1
- package/dist-client/client/components/default-slash-templates.js.map +1 -1
- package/dist-client/client/index.d.ts +3 -11
- package/dist-client/client/index.js +37 -6
- package/dist-client/client/index.js.map +1 -1
- package/dist-client/server/service/assistant.d.ts +22 -22
- package/dist-client/server/service/assistant.js +32 -70
- package/dist-client/server/service/assistant.js.map +1 -1
- package/dist-client/server/service/grounding.d.ts +2 -12
- package/dist-client/server/service/grounding.js +15 -23
- package/dist-client/server/service/grounding.js.map +1 -1
- package/dist-client/server/service/types.d.ts +2 -4
- package/dist-client/server/service/types.js.map +1 -1
- package/dist-client/server/service/validation/board-model-schema.d.ts +270 -270
- package/dist-client/tsconfig.tsbuildinfo +1 -1
- package/dist-server/service/assistant.d.ts +22 -22
- package/dist-server/service/assistant.js +25 -76
- package/dist-server/service/assistant.js.map +1 -1
- package/dist-server/service/board-ai-resolver.js +41 -30
- package/dist-server/service/board-ai-resolver.js.map +1 -1
- package/dist-server/service/board-session-resolver.d.ts +12 -0
- package/dist-server/service/board-session-resolver.js +203 -0
- package/dist-server/service/board-session-resolver.js.map +1 -0
- package/dist-server/service/board-tool-rights.d.ts +7 -0
- package/dist-server/service/board-tool-rights.js +62 -0
- package/dist-server/service/board-tool-rights.js.map +1 -0
- package/dist-server/service/grounding.d.ts +2 -12
- package/dist-server/service/grounding.js +16 -24
- package/dist-server/service/grounding.js.map +1 -1
- package/dist-server/service/index.d.ts +4 -10
- package/dist-server/service/index.js +16 -23
- package/dist-server/service/index.js.map +1 -1
- package/dist-server/service/patch-entry/board-patch-subscription.js +2 -2
- package/dist-server/service/patch-entry/board-patch-subscription.js.map +1 -1
- package/dist-server/service/patch-entry/patch-entry.d.ts +1 -1
- package/dist-server/service/patch-entry/patch-entry.js +3 -3
- package/dist-server/service/patch-entry/patch-entry.js.map +1 -1
- package/dist-server/service/types.d.ts +2 -4
- package/dist-server/service/types.js.map +1 -1
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/package.json +7 -6
- package/server/service/apply-patch-drift.test.ts +3 -1
- package/server/service/assistant.ts +47 -73
- package/server/service/board-ai-resolver.ts +22 -12
- package/server/service/board-session-resolver.ts +183 -0
- package/server/service/board-tool-rights.test.ts +96 -0
- package/server/service/board-tool-rights.ts +73 -0
- package/server/service/dock-contract.test.ts +3 -0
- package/server/service/grounding.test.ts +3 -3
- package/server/service/grounding.ts +15 -34
- package/server/service/index.ts +16 -22
- package/server/service/patch-entry/board-patch-subscription.ts +1 -1
- package/server/service/patch-entry/patch-entry.ts +3 -2
- package/server/service/registry-tool-loop.test.ts +1 -0
- package/server/service/tool-exposure.test.ts +2 -0
- package/server/service/types.ts +3 -4
- package/translations/en.json +1 -62
- package/translations/ja.json +1 -61
- package/translations/ko.json +1 -62
- package/translations/ms.json +1 -61
- package/translations/zh.json +1 -61
- package/client/components/board-ai-chat.test.ts +0 -149
- package/client/components/board-ai-chat.ts +0 -3184
- package/client/components/chat-echo-dedup.test.ts +0 -230
- package/client/components/chat-echo-dedup.ts +0 -155
- package/client/components/chat-input-builder.ts +0 -69
- package/client/components/markdown.test.ts +0 -518
- package/client/components/markdown.ts +0 -508
- package/client/components/mention-popup-helpers.ts +0 -433
- package/client/components/mention-popup.test.ts +0 -588
- package/client/components/mention-popup.ts +0 -238
- package/client/utils/board-edit-patch.ts +0 -374
- package/dist-client/client/components/board-ai-chat.d.ts +0 -384
- package/dist-client/client/components/board-ai-chat.js +0 -3008
- package/dist-client/client/components/board-ai-chat.js.map +0 -1
- package/dist-client/client/components/board-ai-chat.test.d.ts +0 -1
- package/dist-client/client/components/board-ai-chat.test.js +0 -138
- package/dist-client/client/components/board-ai-chat.test.js.map +0 -1
- package/dist-client/client/components/chat-echo-dedup.d.ts +0 -54
- package/dist-client/client/components/chat-echo-dedup.js +0 -115
- package/dist-client/client/components/chat-echo-dedup.js.map +0 -1
- package/dist-client/client/components/chat-echo-dedup.test.d.ts +0 -1
- package/dist-client/client/components/chat-echo-dedup.test.js +0 -203
- package/dist-client/client/components/chat-echo-dedup.test.js.map +0 -1
- package/dist-client/client/components/chat-input-builder.d.ts +0 -55
- package/dist-client/client/components/chat-input-builder.js +0 -32
- package/dist-client/client/components/chat-input-builder.js.map +0 -1
- package/dist-client/client/components/markdown.d.ts +0 -60
- package/dist-client/client/components/markdown.js +0 -422
- package/dist-client/client/components/markdown.js.map +0 -1
- package/dist-client/client/components/markdown.test.d.ts +0 -1
- package/dist-client/client/components/markdown.test.js +0 -418
- package/dist-client/client/components/markdown.test.js.map +0 -1
- package/dist-client/client/components/mention-popup-helpers.d.ts +0 -165
- package/dist-client/client/components/mention-popup-helpers.js +0 -330
- package/dist-client/client/components/mention-popup-helpers.js.map +0 -1
- package/dist-client/client/components/mention-popup.d.ts +0 -35
- package/dist-client/client/components/mention-popup.js +0 -223
- package/dist-client/client/components/mention-popup.js.map +0 -1
- package/dist-client/client/components/mention-popup.test.d.ts +0 -1
- package/dist-client/client/components/mention-popup.test.js +0 -474
- package/dist-client/client/components/mention-popup.test.js.map +0 -1
- package/dist-client/client/utils/board-edit-patch.d.ts +0 -157
- package/dist-client/client/utils/board-edit-patch.js +0 -284
- package/dist-client/client/utils/board-edit-patch.js.map +0 -1
- package/dist-server/service/chat-message/chat-message-broadcast.d.ts +0 -13
- package/dist-server/service/chat-message/chat-message-broadcast.js +0 -13
- package/dist-server/service/chat-message/chat-message-broadcast.js.map +0 -1
- package/dist-server/service/chat-message/chat-message-publish.d.ts +0 -6
- package/dist-server/service/chat-message/chat-message-publish.js +0 -27
- package/dist-server/service/chat-message/chat-message-publish.js.map +0 -1
- package/dist-server/service/chat-message/chat-message-subscription.d.ts +0 -8
- package/dist-server/service/chat-message/chat-message-subscription.js +0 -53
- package/dist-server/service/chat-message/chat-message-subscription.js.map +0 -1
- package/dist-server/service/chat-message/chat-message.d.ts +0 -68
- package/dist-server/service/chat-message/chat-message.js +0 -172
- package/dist-server/service/chat-message/chat-message.js.map +0 -1
- package/dist-server/service/chat-message/fold-history.d.ts +0 -43
- package/dist-server/service/chat-message/fold-history.js +0 -33
- package/dist-server/service/chat-message/fold-history.js.map +0 -1
- package/dist-server/service/chat-message/history-summary.d.ts +0 -43
- package/dist-server/service/chat-message/history-summary.js +0 -77
- package/dist-server/service/chat-message/history-summary.js.map +0 -1
- package/dist-server/service/chat-message/index.d.ts +0 -5
- package/dist-server/service/chat-message/index.js +0 -12
- package/dist-server/service/chat-message/index.js.map +0 -1
- package/dist-server/service/chat-message/llm-history.d.ts +0 -46
- package/dist-server/service/chat-message/llm-history.js +0 -87
- package/dist-server/service/chat-message/llm-history.js.map +0 -1
- package/dist-server/service/chat-session/chat-session.d.ts +0 -62
- package/dist-server/service/chat-session/chat-session.js +0 -164
- package/dist-server/service/chat-session/chat-session.js.map +0 -1
- package/dist-server/service/chat-session/index.d.ts +0 -3
- package/dist-server/service/chat-session/index.js +0 -7
- package/dist-server/service/chat-session/index.js.map +0 -1
- package/dist-server/service/chat-session/session-activity-broadcast.d.ts +0 -30
- package/dist-server/service/chat-session/session-activity-broadcast.js +0 -34
- package/dist-server/service/chat-session/session-activity-broadcast.js.map +0 -1
- package/dist-server/service/chat-session/session-activity-publish.d.ts +0 -12
- package/dist-server/service/chat-session/session-activity-publish.js +0 -37
- package/dist-server/service/chat-session/session-activity-publish.js.map +0 -1
- package/dist-server/service/chat-session/session-activity-subscription.d.ts +0 -14
- package/dist-server/service/chat-session/session-activity-subscription.js +0 -87
- package/dist-server/service/chat-session/session-activity-subscription.js.map +0 -1
- package/dist-server/service/chat-session/session-anchor.d.ts +0 -12
- package/dist-server/service/chat-session/session-anchor.js +0 -20
- package/dist-server/service/chat-session/session-anchor.js.map +0 -1
- package/dist-server/service/chat-session/session-inbox.d.ts +0 -80
- package/dist-server/service/chat-session/session-inbox.js +0 -133
- package/dist-server/service/chat-session/session-inbox.js.map +0 -1
- package/dist-server/service/chat-session-participant/chat-session-participant.d.ts +0 -49
- package/dist-server/service/chat-session-participant/chat-session-participant.js +0 -141
- package/dist-server/service/chat-session-participant/chat-session-participant.js.map +0 -1
- package/dist-server/service/chat-session-participant/index.d.ts +0 -4
- package/dist-server/service/chat-session-participant/index.js +0 -10
- package/dist-server/service/chat-session-participant/index.js.map +0 -1
- package/dist-server/service/chat-session-participant/invite-notification.d.ts +0 -27
- package/dist-server/service/chat-session-participant/invite-notification.js +0 -30
- package/dist-server/service/chat-session-participant/invite-notification.js.map +0 -1
- package/dist-server/service/chat-session-participant/presence.d.ts +0 -4
- package/dist-server/service/chat-session-participant/presence.js +0 -22
- package/dist-server/service/chat-session-participant/presence.js.map +0 -1
- package/dist-server/service/chat-session-resolver.d.ts +0 -102
- package/dist-server/service/chat-session-resolver.js +0 -856
- package/dist-server/service/chat-session-resolver.js.map +0 -1
- package/dist-server/service/subscribe-auth.d.ts +0 -14
- package/dist-server/service/subscribe-auth.js +0 -33
- package/dist-server/service/subscribe-auth.js.map +0 -1
- package/server/service/chat-message/chat-message-broadcast.integration.test.ts +0 -73
- package/server/service/chat-message/chat-message-broadcast.test.ts +0 -40
- package/server/service/chat-message/chat-message-broadcast.ts +0 -27
- package/server/service/chat-message/chat-message-publish.ts +0 -22
- package/server/service/chat-message/chat-message-subscription.ts +0 -41
- package/server/service/chat-message/chat-message.ts +0 -195
- package/server/service/chat-message/fold-history.test.ts +0 -98
- package/server/service/chat-message/fold-history.ts +0 -77
- package/server/service/chat-message/history-summary.test.ts +0 -127
- package/server/service/chat-message/history-summary.ts +0 -100
- package/server/service/chat-message/index.ts +0 -12
- package/server/service/chat-message/llm-history.test.ts +0 -194
- package/server/service/chat-message/llm-history.ts +0 -163
- package/server/service/chat-session/chat-session.ts +0 -182
- package/server/service/chat-session/index.ts +0 -5
- package/server/service/chat-session/session-activity-broadcast.ts +0 -57
- package/server/service/chat-session/session-activity-publish.ts +0 -44
- package/server/service/chat-session/session-activity-subscription.ts +0 -67
- package/server/service/chat-session/session-anchor.ts +0 -35
- package/server/service/chat-session/session-inbox.test.ts +0 -185
- package/server/service/chat-session/session-inbox.ts +0 -161
- package/server/service/chat-session-participant/chat-session-participant.ts +0 -135
- package/server/service/chat-session-participant/index.ts +0 -6
- package/server/service/chat-session-participant/invite-notification.test.ts +0 -30
- package/server/service/chat-session-participant/invite-notification.ts +0 -48
- package/server/service/chat-session-participant/presence.test.ts +0 -39
- package/server/service/chat-session-participant/presence.ts +0 -21
- package/server/service/chat-session-resolver.ts +0 -779
- package/server/service/session-anchor.test.ts +0 -65
- package/server/service/subscribe-auth.test.ts +0 -57
- package/server/service/subscribe-auth.ts +0 -34
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
* 의 tool 카탈로그 회귀 테스트가 server-side drift 는 잡음, client 는 별도 검증
|
|
12
12
|
* 필요). 향후 GraphQL 'boardAICatalog' query 도입 시 이 파일 제거 가능.
|
|
13
13
|
*/
|
|
14
|
-
import type { CatalogEntry } from '
|
|
14
|
+
import type { CatalogEntry } from '@things-factory/ai-assistant/dist-client/index.js'
|
|
15
15
|
|
|
16
16
|
export const DEFAULT_CATALOG_ENTRIES: CatalogEntry[] = [
|
|
17
17
|
// ── Prefabs (3) ─────────────────────────────────────────
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
* 자동 호환 — drift 검증은 default-catalog-entries.test.ts 가 잡음
|
|
14
14
|
* - 너무 많이 만들지 말 것 (popup 이 과해짐). 가장 흔한 의도만.
|
|
15
15
|
*/
|
|
16
|
-
import type { SlashTemplate } from '
|
|
16
|
+
import type { SlashTemplate } from '@things-factory/ai-assistant/dist-client/index.js'
|
|
17
17
|
|
|
18
18
|
export const DEFAULT_SLASH_TEMPLATES: SlashTemplate[] = [
|
|
19
19
|
{
|
package/client/index.ts
CHANGED
|
@@ -1,11 +1,44 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @things-factory/board-ai — client entries.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* 대화면 자체는 **`@things-factory/ai-assistant` 로 나갔다**(2026-09-10). 여기 남은 것은 보드
|
|
5
|
+
* 저작의 기본 목록이고, 아래 한 줄이 그것을 대화면에 넣는다 — 등록하는 쪽이 주인이다.
|
|
5
6
|
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* - 모드 전환 애니메이션 + 단축키 + 자동 전환 룰
|
|
7
|
+
* 이 패키지를 import 하는 소비처는 예전과 똑같이 동작한다: 엘리먼트가 등록되고, 보드 카탈로그와
|
|
8
|
+
* 슬래시 목록이 채워진다.
|
|
9
9
|
*/
|
|
10
|
-
|
|
11
|
-
|
|
10
|
+
/*
|
|
11
|
+
* ⚠ **빌드된 경로를 명시한다** (2026-09-10).
|
|
12
|
+
*
|
|
13
|
+
* 처음에 `@things-factory/ai-assistant/client` 로 적었다. `exports` 맵이 없으니 그 서브패스가
|
|
14
|
+
* **소스 디렉터리**로 떨어지고, webpack 이 `.ts` 원본을 번들에 실었다. 데코레이터 메타데이터가
|
|
15
|
+
* 없는 채로 실려서 화면이 `Reflect.metadata is not a function` 으로 죽었다 — 빌드는 통과했고
|
|
16
|
+
* 브라우저에서만 터진다.
|
|
17
|
+
*
|
|
18
|
+
* 이 저장소에 같은 부류가 이미 있다: 원본 `.ts` 를 싣는 패키지 때문에 앱마다 webpack stopgap 을
|
|
19
|
+
* 두고 있다(barcode-base·print-base). 하나 더 만들지 않는다.
|
|
20
|
+
*
|
|
21
|
+
* `dist-client/index.js` 를 직접 가리키면 webpack 은 빌드된 JS 를, tsc 는 옆의 `index.d.ts` 를
|
|
22
|
+
* 집는다. 오늘 `ingest` 를 `dist-shared` 로 가리킨 것과 같은 이유다.
|
|
23
|
+
*/
|
|
24
|
+
import { registerChatDefaults } from '@things-factory/ai-assistant/dist-client/index.js'
|
|
25
|
+
import { DEFAULT_CATALOG_ENTRIES } from './components/default-catalog-entries.js'
|
|
26
|
+
import { DEFAULT_SLASH_TEMPLATES } from './components/default-slash-templates.js'
|
|
27
|
+
|
|
28
|
+
/*
|
|
29
|
+
* `footerNoticeKey` — the promise at the bottom of the empty chat.
|
|
30
|
+
*
|
|
31
|
+
* It used to be a default inside the chat component: "AI responses are previewed on the board
|
|
32
|
+
* before they are applied." operato-figure showed that sentence with no board anywhere (2026-09-11).
|
|
33
|
+
* The promise is only true because board authoring **has** the machinery — a patch is staged and
|
|
34
|
+
* the user applies it. The package with the machinery says the sentence.
|
|
35
|
+
*/
|
|
36
|
+
registerChatDefaults({
|
|
37
|
+
catalogEntries: DEFAULT_CATALOG_ENTRIES,
|
|
38
|
+
slashTemplates: DEFAULT_SLASH_TEMPLATES,
|
|
39
|
+
footerNoticeKey: 'board-ai.text.preview-before-apply'
|
|
40
|
+
})
|
|
41
|
+
|
|
42
|
+
export * from '@things-factory/ai-assistant/dist-client/index.js'
|
|
43
|
+
export * from './components/default-catalog-entries.js'
|
|
44
|
+
export * from './components/default-slash-templates.js'
|
|
@@ -11,5 +11,5 @@
|
|
|
11
11
|
* 의 tool 카탈로그 회귀 테스트가 server-side drift 는 잡음, client 는 별도 검증
|
|
12
12
|
* 필요). 향후 GraphQL 'boardAICatalog' query 도입 시 이 파일 제거 가능.
|
|
13
13
|
*/
|
|
14
|
-
import type { CatalogEntry } from '
|
|
14
|
+
import type { CatalogEntry } from '@things-factory/ai-assistant/dist-client/index.js';
|
|
15
15
|
export declare const DEFAULT_CATALOG_ENTRIES: CatalogEntry[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"default-catalog-entries.js","sourceRoot":"","sources":["../../../client/components/default-catalog-entries.ts"],"names":[],"mappings":"AAeA,MAAM,CAAC,MAAM,uBAAuB,GAAmB;IACrD,2DAA2D;IAC3D;QACE,IAAI,EAAE,cAAc;QACpB,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,6BAA6B;KAC3C;IACD;QACE,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,gBAAgB;KAC9B;IACD;QACE,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,qBAAqB;KACnC;IACD,2DAA2D;IAC3D;QACE,IAAI,EAAE,kBAAkB;QACxB,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,wBAAwB;KACtC;IACD;QACE,IAAI,EAAE,kBAAkB;QACxB,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,yBAAyB;KACvC;IACD;QACE,IAAI,EAAE,mBAAmB;QACzB,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,6BAA6B;KAC3C;IACD;QACE,IAAI,EAAE,eAAe;QACrB,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,+BAA+B;KAC7C;IACD;QACE,IAAI,EAAE,gBAAgB;QACtB,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,8BAA8B;KAC5C;IACD;QACE,IAAI,EAAE,gBAAgB;QACtB,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,mCAAmC;KACjD;IACD;QACE,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,yBAAyB;KACvC;IACD,2DAA2D;IAC3D;QACE,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,uBAAuB;KACrC;IACD;QACE,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,uBAAuB;KACrC;IACD;QACE,IAAI,EAAE,iBAAiB;QACvB,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,+BAA+B;KAC7C;IACD;QACE,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,qBAAqB;KACnC;IACD;QACE,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,kBAAkB;KAChC;IACD;QACE,IAAI,EAAE,uBAAuB;QAC7B,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,aAAa;KAC3B;CACF,CAAA","sourcesContent":["/**\n * Default 카탈로그 항목 (client-side hardcoded).\n *\n * 사용자 popup discoverability 용. server-side 카탈로그가 권위 source 이지만, 매번\n * GraphQL 호출해 동적으로 가져오는 대신 default 항목을 client 에 캐시. 호스트 패키지\n * (operato 등) 가 추가 prefab 등록 시 popup 에는 안 나타나지만, 사용자가 직접 이름을\n * 타이핑하면 server-side resolver 가 정상 처리 (catalog-resolver.ts).\n *\n * Drift 경고 — 이 파일과 server-side 의 prefab-registry.ts / COLOR_PALETTES /\n * LAYOUT_TEMPLATES 가 일치해야 한다. 새 default 추가 시 양쪽 동기 (assistant.test.ts\n * 의 tool 카탈로그 회귀 테스트가 server-side drift 는 잡음, client 는 별도 검증\n * 필요). 향후 GraphQL 'boardAICatalog' query 도입 시 이 파일 제거 가능.\n */\nimport type { CatalogEntry } from '
|
|
1
|
+
{"version":3,"file":"default-catalog-entries.js","sourceRoot":"","sources":["../../../client/components/default-catalog-entries.ts"],"names":[],"mappings":"AAeA,MAAM,CAAC,MAAM,uBAAuB,GAAmB;IACrD,2DAA2D;IAC3D;QACE,IAAI,EAAE,cAAc;QACpB,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,6BAA6B;KAC3C;IACD;QACE,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,gBAAgB;KAC9B;IACD;QACE,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,qBAAqB;KACnC;IACD,2DAA2D;IAC3D;QACE,IAAI,EAAE,kBAAkB;QACxB,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,wBAAwB;KACtC;IACD;QACE,IAAI,EAAE,kBAAkB;QACxB,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,yBAAyB;KACvC;IACD;QACE,IAAI,EAAE,mBAAmB;QACzB,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,6BAA6B;KAC3C;IACD;QACE,IAAI,EAAE,eAAe;QACrB,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,+BAA+B;KAC7C;IACD;QACE,IAAI,EAAE,gBAAgB;QACtB,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,8BAA8B;KAC5C;IACD;QACE,IAAI,EAAE,gBAAgB;QACtB,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,mCAAmC;KACjD;IACD;QACE,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,yBAAyB;KACvC;IACD,2DAA2D;IAC3D;QACE,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,uBAAuB;KACrC;IACD;QACE,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,uBAAuB;KACrC;IACD;QACE,IAAI,EAAE,iBAAiB;QACvB,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,+BAA+B;KAC7C;IACD;QACE,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,qBAAqB;KACnC;IACD;QACE,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,kBAAkB;KAChC;IACD;QACE,IAAI,EAAE,uBAAuB;QAC7B,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,aAAa;KAC3B;CACF,CAAA","sourcesContent":["/**\n * Default 카탈로그 항목 (client-side hardcoded).\n *\n * 사용자 popup discoverability 용. server-side 카탈로그가 권위 source 이지만, 매번\n * GraphQL 호출해 동적으로 가져오는 대신 default 항목을 client 에 캐시. 호스트 패키지\n * (operato 등) 가 추가 prefab 등록 시 popup 에는 안 나타나지만, 사용자가 직접 이름을\n * 타이핑하면 server-side resolver 가 정상 처리 (catalog-resolver.ts).\n *\n * Drift 경고 — 이 파일과 server-side 의 prefab-registry.ts / COLOR_PALETTES /\n * LAYOUT_TEMPLATES 가 일치해야 한다. 새 default 추가 시 양쪽 동기 (assistant.test.ts\n * 의 tool 카탈로그 회귀 테스트가 server-side drift 는 잡음, client 는 별도 검증\n * 필요). 향후 GraphQL 'boardAICatalog' query 도입 시 이 파일 제거 가능.\n */\nimport type { CatalogEntry } from '@things-factory/ai-assistant/dist-client/index.js'\n\nexport const DEFAULT_CATALOG_ENTRIES: CatalogEntry[] = [\n // ── Prefabs (3) ─────────────────────────────────────────\n {\n name: 'monitor-card',\n kind: 'prefab',\n description: 'KPI 모니터링 카드 — 라벨 + 큰 값 + 부제'\n },\n {\n name: 'gauge-panel',\n kind: 'prefab',\n description: '원형 게이지 + 라벨 패널'\n },\n {\n name: 'stat-tile',\n kind: 'prefab',\n description: '강조 컬러 KPI 타일 (큰 숫자)'\n },\n // ── Palettes (7) ────────────────────────────────────────\n {\n name: 'industrial-steel',\n kind: 'palette',\n description: '제조 / 공장 — 강철 + cyan 강조'\n },\n {\n name: 'financial-trader',\n kind: 'palette',\n description: '금융 / 트레이딩 — navy + gold'\n },\n {\n name: 'control-room-dark',\n kind: 'palette',\n description: 'NOC / 관제실 — pure black + 네온'\n },\n {\n name: 'medical-clean',\n kind: 'palette',\n description: '의료 / 헬스케어 — soft white + blue'\n },\n {\n name: 'logistics-warm',\n kind: 'palette',\n description: '물류 / 운송 — warm earth + amber'\n },\n {\n name: 'neon-cyberpunk',\n kind: 'palette',\n description: 'SF / 사이버펑크 — black + magenta/cyan'\n },\n {\n name: 'paper-light',\n kind: 'palette',\n description: '보고서 / 프레젠테이션 — 종이 light'\n },\n // ── Layouts (6) ─────────────────────────────────────────\n {\n name: 'kpi-row',\n kind: 'layout',\n description: '상단 KPI 4-tile + 메인 영역'\n },\n {\n name: '3x3-grid',\n kind: 'layout',\n description: '균등 3×3 그리드 — 9개 동등 단위'\n },\n {\n name: 't-shape-command',\n kind: 'layout',\n description: '관제실 — alarm bar + main + side'\n },\n {\n name: 'side-rail',\n kind: 'layout',\n description: '좌측 narrow + 메인 wide'\n },\n {\n name: 'split-half',\n kind: 'layout',\n description: '50/50 가로 분할 — 비교'\n },\n {\n name: 'header-content-footer',\n kind: 'layout',\n description: '보고서 형식 — 3단'\n }\n]\n"]}
|
|
@@ -13,5 +13,5 @@
|
|
|
13
13
|
* 자동 호환 — drift 검증은 default-catalog-entries.test.ts 가 잡음
|
|
14
14
|
* - 너무 많이 만들지 말 것 (popup 이 과해짐). 가장 흔한 의도만.
|
|
15
15
|
*/
|
|
16
|
-
import type { SlashTemplate } from '
|
|
16
|
+
import type { SlashTemplate } from '@things-factory/ai-assistant/dist-client/index.js';
|
|
17
17
|
export declare const DEFAULT_SLASH_TEMPLATES: SlashTemplate[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"default-slash-templates.js","sourceRoot":"","sources":["../../../client/components/default-slash-templates.ts"],"names":[],"mappings":"AAiBA,MAAM,CAAC,MAAM,uBAAuB,GAAoB;IACtD;QACE,IAAI,EAAE,MAAM;QACZ,WAAW,EAAE,oBAAoB;QACjC,QAAQ,EAAE,0BAA0B;KACrC;IACD;QACE,IAAI,EAAE,KAAK;QACX,WAAW,EAAE,iBAAiB;QAC9B,QAAQ,EAAE,sBAAsB;KACjC;IACD;QACE,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,mBAAmB;QAChC,QAAQ,EAAE,wBAAwB;KACnC;IACD;QACE,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,eAAe;QAC5B,QAAQ,EAAE,mCAAmC;KAC9C;IACD;QACE,IAAI,EAAE,YAAY;QAClB,WAAW,EAAE,uBAAuB;QACpC,QAAQ,EAAE,6CAA6C;KACxD;IACD;QACE,IAAI,EAAE,WAAW;QACjB,WAAW,EAAE,gBAAgB;QAC7B,QAAQ,EAAE,oDAAoD;KAC/D;IACD;QACE,IAAI,EAAE,aAAa;QACnB,WAAW,EAAE,YAAY;QACzB,QAAQ,EAAE,+BAA+B;KAC1C;IACD;QACE,IAAI,EAAE,KAAK;QACX,WAAW,EAAE,WAAW;QACxB,QAAQ,EAAE,mBAAmB;KAC9B;IACD;QACE,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,iBAAiB;QAC9B,QAAQ,EAAE,wBAAwB;KACnC;IACD;QACE,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,eAAe;QAC5B,QAAQ,EAAE,yBAAyB;KACpC;IACD;QACE,IAAI,EAAE,OAAO;QACb,WAAW,EAAE,2BAA2B;QACxC,QAAQ,EAAE,yBAAyB;KACpC;IACD;QACE,IAAI,EAAE,YAAY;QAClB,WAAW,EAAE,kBAAkB;QAC/B,QAAQ,EAAE,6BAA6B;KACxC;IACD;QACE,IAAI,EAAE,WAAW;QACjB,WAAW,EAAE,YAAY;QACzB,QAAQ,EAAE,iCAAiC;KAC5C;IACD;QACE,IAAI,EAAE,YAAY;QAClB,WAAW,EAAE,eAAe;QAC5B,QAAQ,EAAE,6BAA6B;KACxC;IACD;QACE,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,eAAe;QAC5B,QAAQ,EAAE,8BAA8B;KACzC;IACD;QACE,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,YAAY;QACzB,QAAQ,EAAE,2BAA2B;KACtC;IACD;QACE,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,cAAc;QAC3B,QAAQ,EAAE,4BAA4B;KACvC;IACD;QACE,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,eAAe;QAC5B,QAAQ,EAAE,wBAAwB;KACnC;IACD;QACE,IAAI,EAAE,OAAO;QACb,WAAW,EAAE,aAAa;QAC1B,QAAQ,EAAE,yBAAyB;KACpC;IACD;QACE,IAAI,EAAE,mBAAmB;QACzB,WAAW,EAAE,iBAAiB;QAC9B,QAAQ,EAAE,+BAA+B;KAC1C;IACD;QACE,IAAI,EAAE,UAAU;QAChB,WAAW,EAAE,kBAAkB;QAC/B,QAAQ,EAAE,gCAAgC;KAC3C;IACD;QACE,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,iBAAiB;QAC9B,QAAQ,EAAE,iCAAiC;KAC5C;CACF,CAAA","sourcesContent":["/**\n * Default slash templates — 사용자에게 빠르게 작성된 자연어 prompt 를 끼워주는 단축키.\n *\n * `/grid` → \"선택한 컴포넌트들을 3x2 그리드로 정렬해줘\" 같이 텍스트가 textarea 에\n * 삽입됨. 사용자는 그대로 보내거나 숫자/카탈로그 이름을 수정해 보낼 수 있다.\n *\n * Slash 는 LLM 우회 명령이 아니다 — AI 가 받는 입력은 일반 자연어 prompt 와 동일.\n * 단지 \"이런 명령이 가능하구나\" 의 discoverability 를 popup 으로 보여주는 역할.\n *\n * 수정 / 추가 정책:\n * - 한국어 우선 (자연어가 한국어라야 한국 사용자에게 즉시 작동)\n * - 카탈로그 이름 (@monitor-card 등) 가 들어간 템플릿은 server-side resolver 와\n * 자동 호환 — drift 검증은 default-catalog-entries.test.ts 가 잡음\n * - 너무 많이 만들지 말 것 (popup 이 과해짐). 가장 흔한 의도만.\n */\nimport type { SlashTemplate } from '
|
|
1
|
+
{"version":3,"file":"default-slash-templates.js","sourceRoot":"","sources":["../../../client/components/default-slash-templates.ts"],"names":[],"mappings":"AAiBA,MAAM,CAAC,MAAM,uBAAuB,GAAoB;IACtD;QACE,IAAI,EAAE,MAAM;QACZ,WAAW,EAAE,oBAAoB;QACjC,QAAQ,EAAE,0BAA0B;KACrC;IACD;QACE,IAAI,EAAE,KAAK;QACX,WAAW,EAAE,iBAAiB;QAC9B,QAAQ,EAAE,sBAAsB;KACjC;IACD;QACE,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,mBAAmB;QAChC,QAAQ,EAAE,wBAAwB;KACnC;IACD;QACE,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,eAAe;QAC5B,QAAQ,EAAE,mCAAmC;KAC9C;IACD;QACE,IAAI,EAAE,YAAY;QAClB,WAAW,EAAE,uBAAuB;QACpC,QAAQ,EAAE,6CAA6C;KACxD;IACD;QACE,IAAI,EAAE,WAAW;QACjB,WAAW,EAAE,gBAAgB;QAC7B,QAAQ,EAAE,oDAAoD;KAC/D;IACD;QACE,IAAI,EAAE,aAAa;QACnB,WAAW,EAAE,YAAY;QACzB,QAAQ,EAAE,+BAA+B;KAC1C;IACD;QACE,IAAI,EAAE,KAAK;QACX,WAAW,EAAE,WAAW;QACxB,QAAQ,EAAE,mBAAmB;KAC9B;IACD;QACE,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,iBAAiB;QAC9B,QAAQ,EAAE,wBAAwB;KACnC;IACD;QACE,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,eAAe;QAC5B,QAAQ,EAAE,yBAAyB;KACpC;IACD;QACE,IAAI,EAAE,OAAO;QACb,WAAW,EAAE,2BAA2B;QACxC,QAAQ,EAAE,yBAAyB;KACpC;IACD;QACE,IAAI,EAAE,YAAY;QAClB,WAAW,EAAE,kBAAkB;QAC/B,QAAQ,EAAE,6BAA6B;KACxC;IACD;QACE,IAAI,EAAE,WAAW;QACjB,WAAW,EAAE,YAAY;QACzB,QAAQ,EAAE,iCAAiC;KAC5C;IACD;QACE,IAAI,EAAE,YAAY;QAClB,WAAW,EAAE,eAAe;QAC5B,QAAQ,EAAE,6BAA6B;KACxC;IACD;QACE,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,eAAe;QAC5B,QAAQ,EAAE,8BAA8B;KACzC;IACD;QACE,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,YAAY;QACzB,QAAQ,EAAE,2BAA2B;KACtC;IACD;QACE,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,cAAc;QAC3B,QAAQ,EAAE,4BAA4B;KACvC;IACD;QACE,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,eAAe;QAC5B,QAAQ,EAAE,wBAAwB;KACnC;IACD;QACE,IAAI,EAAE,OAAO;QACb,WAAW,EAAE,aAAa;QAC1B,QAAQ,EAAE,yBAAyB;KACpC;IACD;QACE,IAAI,EAAE,mBAAmB;QACzB,WAAW,EAAE,iBAAiB;QAC9B,QAAQ,EAAE,+BAA+B;KAC1C;IACD;QACE,IAAI,EAAE,UAAU;QAChB,WAAW,EAAE,kBAAkB;QAC/B,QAAQ,EAAE,gCAAgC;KAC3C;IACD;QACE,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,iBAAiB;QAC9B,QAAQ,EAAE,iCAAiC;KAC5C;CACF,CAAA","sourcesContent":["/**\n * Default slash templates — 사용자에게 빠르게 작성된 자연어 prompt 를 끼워주는 단축키.\n *\n * `/grid` → \"선택한 컴포넌트들을 3x2 그리드로 정렬해줘\" 같이 텍스트가 textarea 에\n * 삽입됨. 사용자는 그대로 보내거나 숫자/카탈로그 이름을 수정해 보낼 수 있다.\n *\n * Slash 는 LLM 우회 명령이 아니다 — AI 가 받는 입력은 일반 자연어 prompt 와 동일.\n * 단지 \"이런 명령이 가능하구나\" 의 discoverability 를 popup 으로 보여주는 역할.\n *\n * 수정 / 추가 정책:\n * - 한국어 우선 (자연어가 한국어라야 한국 사용자에게 즉시 작동)\n * - 카탈로그 이름 (@monitor-card 등) 가 들어간 템플릿은 server-side resolver 와\n * 자동 호환 — drift 검증은 default-catalog-entries.test.ts 가 잡음\n * - 너무 많이 만들지 말 것 (popup 이 과해짐). 가장 흔한 의도만.\n */\nimport type { SlashTemplate } from '@things-factory/ai-assistant/dist-client/index.js'\n\nexport const DEFAULT_SLASH_TEMPLATES: SlashTemplate[] = [\n {\n name: 'grid',\n description: '선택한 컴포넌트들을 그리드로 정렬',\n template: '선택한 컴포넌트들을 3x2 그리드로 정렬해줘'\n },\n {\n name: 'row',\n description: '선택한 컴포넌트들을 한 줄로',\n template: '선택한 컴포넌트들을 한 줄로 배치해줘'\n },\n {\n name: 'column',\n description: '선택한 컴포넌트들을 세로로 일렬',\n template: '선택한 컴포넌트들을 세로로 일렬 배치해줘'\n },\n {\n name: 'palette',\n description: '검증된 색 팔레트로 통일',\n template: '@industrial-steel 팔레트로 보드 전체 통일해줘'\n },\n {\n name: 'atmosphere',\n description: '보드 분위기 변경 (자연어 자유 작성)',\n template: '보드 분위기를 어둡고 차분하게 바꿔줘 (atmosphere primer 활용)'\n },\n {\n name: 'dashboard',\n description: 'KPI 대시보드 기본 구성',\n template: '@kpi-row 레이아웃으로 @stat-tile 4개를 상단에 + 아래 메인 영역 구성해줘'\n },\n {\n name: 'add-monitor',\n description: '모니터링 카드 추가',\n template: '@monitor-card 추가 (제목과 값은 적절히)'\n },\n {\n name: 'fit',\n description: '보드 전체 보이게',\n template: '보드 전체가 보이게 화면 맞춰줘'\n },\n {\n name: 'center',\n description: '선택 컴포넌트 화면 가운데로',\n template: '선택한 컴포넌트를 화면 가운데로 이동해줘'\n },\n {\n name: 'inspect',\n description: '선택 컴포넌트 정보 보기',\n template: '현재 선택된 컴포넌트의 모든 속성을 보여줘'\n },\n {\n name: 'align',\n description: '선택 컴포넌트 정렬 (좌/우/위/아래/가운데)',\n template: '선택한 컴포넌트들을 왼쪽 기준으로 정렬해줘'\n },\n {\n name: 'distribute',\n description: '선택 컴포넌트 간격 균등 분배',\n template: '선택한 컴포넌트들을 가로로 간격 균등하게 분배해줘'\n },\n {\n name: 'duplicate',\n description: '선택 컴포넌트 복제',\n template: '선택한 컴포넌트를 오른쪽에 같은 크기로 하나 더 복제해줘'\n },\n {\n name: 'match-size',\n description: '선택 컴포넌트 크기 통일',\n template: '선택한 컴포넌트들을 첫 번째와 같은 크기로 맞춰줘'\n },\n {\n name: 'z-front',\n description: '선택 컴포넌트 맨 앞으로',\n template: '선택한 컴포넌트를 z-order 맨 앞으로 가져와줘'\n },\n {\n name: 'rotate',\n description: '선택 컴포넌트 회전',\n template: '선택한 컴포넌트를 시계방향으로 90도 회전해줘'\n },\n {\n name: 'z-back',\n description: '선택 컴포넌트 맨 뒤로',\n template: '선택한 컴포넌트를 z-order 맨 뒤로 보내줘'\n },\n {\n name: 'mirror',\n description: '선택 컴포넌트 좌우 반전',\n template: '선택한 컴포넌트를 좌우 대칭으로 반전해줘'\n },\n {\n name: 'group',\n description: '선택 컴포넌트 그룹화',\n template: '선택한 컴포넌트들을 하나의 그룹으로 묶어줘'\n },\n {\n name: 'rename-sequential',\n description: '선택 컴포넌트들에 순번 라벨',\n template: '선택한 컴포넌트들에 1, 2, 3 순번 라벨을 붙여줘'\n },\n {\n name: 'bulk-set',\n description: '선택 컴포넌트 속성 일괄 변경',\n template: '선택한 컴포넌트들의 [속성]을 [값]으로 일괄 설정해줘'\n },\n {\n name: 'cleanup',\n description: '겹침/어색한 위치 자동 정리',\n template: '겹쳐있거나 어색한 위치의 컴포넌트들을 자연스럽게 정리해줘'\n }\n]\n"]}
|
|
@@ -1,11 +1,3 @@
|
|
|
1
|
-
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* - `<ox-board-ai-chat>`: 자연어 채팅 컴포넌트 (Lit). board-modeller 또는 워크스페이스에서 임베드.
|
|
5
|
-
*
|
|
6
|
-
* 향후 추가 예정:
|
|
7
|
-
* - `<ox-board-workspace>`: editor / ai / split 모드 전환 컨테이너
|
|
8
|
-
* - 모드 전환 애니메이션 + 단축키 + 자동 전환 룰
|
|
9
|
-
*/
|
|
10
|
-
export * from './components/board-ai-chat.js';
|
|
11
|
-
export * from './utils/board-edit-patch.js';
|
|
1
|
+
export * from '@things-factory/ai-assistant/dist-client/index.js';
|
|
2
|
+
export * from './components/default-catalog-entries.js';
|
|
3
|
+
export * from './components/default-slash-templates.js';
|
|
@@ -1,12 +1,43 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @things-factory/board-ai — client entries.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* 대화면 자체는 **`@things-factory/ai-assistant` 로 나갔다**(2026-09-10). 여기 남은 것은 보드
|
|
5
|
+
* 저작의 기본 목록이고, 아래 한 줄이 그것을 대화면에 넣는다 — 등록하는 쪽이 주인이다.
|
|
5
6
|
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* - 모드 전환 애니메이션 + 단축키 + 자동 전환 룰
|
|
7
|
+
* 이 패키지를 import 하는 소비처는 예전과 똑같이 동작한다: 엘리먼트가 등록되고, 보드 카탈로그와
|
|
8
|
+
* 슬래시 목록이 채워진다.
|
|
9
9
|
*/
|
|
10
|
-
|
|
11
|
-
|
|
10
|
+
/*
|
|
11
|
+
* ⚠ **빌드된 경로를 명시한다** (2026-09-10).
|
|
12
|
+
*
|
|
13
|
+
* 처음에 `@things-factory/ai-assistant/client` 로 적었다. `exports` 맵이 없으니 그 서브패스가
|
|
14
|
+
* **소스 디렉터리**로 떨어지고, webpack 이 `.ts` 원본을 번들에 실었다. 데코레이터 메타데이터가
|
|
15
|
+
* 없는 채로 실려서 화면이 `Reflect.metadata is not a function` 으로 죽었다 — 빌드는 통과했고
|
|
16
|
+
* 브라우저에서만 터진다.
|
|
17
|
+
*
|
|
18
|
+
* 이 저장소에 같은 부류가 이미 있다: 원본 `.ts` 를 싣는 패키지 때문에 앱마다 webpack stopgap 을
|
|
19
|
+
* 두고 있다(barcode-base·print-base). 하나 더 만들지 않는다.
|
|
20
|
+
*
|
|
21
|
+
* `dist-client/index.js` 를 직접 가리키면 webpack 은 빌드된 JS 를, tsc 는 옆의 `index.d.ts` 를
|
|
22
|
+
* 집는다. 오늘 `ingest` 를 `dist-shared` 로 가리킨 것과 같은 이유다.
|
|
23
|
+
*/
|
|
24
|
+
import { registerChatDefaults } from '@things-factory/ai-assistant/dist-client/index.js';
|
|
25
|
+
import { DEFAULT_CATALOG_ENTRIES } from './components/default-catalog-entries.js';
|
|
26
|
+
import { DEFAULT_SLASH_TEMPLATES } from './components/default-slash-templates.js';
|
|
27
|
+
/*
|
|
28
|
+
* `footerNoticeKey` — the promise at the bottom of the empty chat.
|
|
29
|
+
*
|
|
30
|
+
* It used to be a default inside the chat component: "AI responses are previewed on the board
|
|
31
|
+
* before they are applied." operato-figure showed that sentence with no board anywhere (2026-09-11).
|
|
32
|
+
* The promise is only true because board authoring **has** the machinery — a patch is staged and
|
|
33
|
+
* the user applies it. The package with the machinery says the sentence.
|
|
34
|
+
*/
|
|
35
|
+
registerChatDefaults({
|
|
36
|
+
catalogEntries: DEFAULT_CATALOG_ENTRIES,
|
|
37
|
+
slashTemplates: DEFAULT_SLASH_TEMPLATES,
|
|
38
|
+
footerNoticeKey: 'board-ai.text.preview-before-apply'
|
|
39
|
+
});
|
|
40
|
+
export * from '@things-factory/ai-assistant/dist-client/index.js';
|
|
41
|
+
export * from './components/default-catalog-entries.js';
|
|
42
|
+
export * from './components/default-slash-templates.js';
|
|
12
43
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../client/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,cAAc
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../client/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH;;;;;;;;;;;;;GAaG;AACH,OAAO,EAAE,oBAAoB,EAAE,MAAM,mDAAmD,CAAA;AACxF,OAAO,EAAE,uBAAuB,EAAE,MAAM,yCAAyC,CAAA;AACjF,OAAO,EAAE,uBAAuB,EAAE,MAAM,yCAAyC,CAAA;AAEjF;;;;;;;GAOG;AACH,oBAAoB,CAAC;IACnB,cAAc,EAAE,uBAAuB;IACvC,cAAc,EAAE,uBAAuB;IACvC,eAAe,EAAE,oCAAoC;CACtD,CAAC,CAAA;AAEF,cAAc,mDAAmD,CAAA;AACjE,cAAc,yCAAyC,CAAA;AACvD,cAAc,yCAAyC,CAAA","sourcesContent":["/**\n * @things-factory/board-ai — client entries.\n *\n * 대화면 자체는 **`@things-factory/ai-assistant` 로 나갔다**(2026-09-10). 여기 남은 것은 보드\n * 저작의 기본 목록이고, 아래 한 줄이 그것을 대화면에 넣는다 — 등록하는 쪽이 주인이다.\n *\n * 이 패키지를 import 하는 소비처는 예전과 똑같이 동작한다: 엘리먼트가 등록되고, 보드 카탈로그와\n * 슬래시 목록이 채워진다.\n */\n/*\n * ⚠ **빌드된 경로를 명시한다** (2026-09-10).\n *\n * 처음에 `@things-factory/ai-assistant/client` 로 적었다. `exports` 맵이 없으니 그 서브패스가\n * **소스 디렉터리**로 떨어지고, webpack 이 `.ts` 원본을 번들에 실었다. 데코레이터 메타데이터가\n * 없는 채로 실려서 화면이 `Reflect.metadata is not a function` 으로 죽었다 — 빌드는 통과했고\n * 브라우저에서만 터진다.\n *\n * 이 저장소에 같은 부류가 이미 있다: 원본 `.ts` 를 싣는 패키지 때문에 앱마다 webpack stopgap 을\n * 두고 있다(barcode-base·print-base). 하나 더 만들지 않는다.\n *\n * `dist-client/index.js` 를 직접 가리키면 webpack 은 빌드된 JS 를, tsc 는 옆의 `index.d.ts` 를\n * 집는다. 오늘 `ingest` 를 `dist-shared` 로 가리킨 것과 같은 이유다.\n */\nimport { registerChatDefaults } from '@things-factory/ai-assistant/dist-client/index.js'\nimport { DEFAULT_CATALOG_ENTRIES } from './components/default-catalog-entries.js'\nimport { DEFAULT_SLASH_TEMPLATES } from './components/default-slash-templates.js'\n\n/*\n * `footerNoticeKey` — the promise at the bottom of the empty chat.\n *\n * It used to be a default inside the chat component: \"AI responses are previewed on the board\n * before they are applied.\" operato-figure showed that sentence with no board anywhere (2026-09-11).\n * The promise is only true because board authoring **has** the machinery — a patch is staged and\n * the user applies it. The package with the machinery says the sentence.\n */\nregisterChatDefaults({\n catalogEntries: DEFAULT_CATALOG_ENTRIES,\n slashTemplates: DEFAULT_SLASH_TEMPLATES,\n footerNoticeKey: 'board-ai.text.preview-before-apply'\n})\n\nexport * from '@things-factory/ai-assistant/dist-client/index.js'\nexport * from './components/default-catalog-entries.js'\nexport * from './components/default-slash-templates.js'\n"]}
|
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
import type { AIClient, AITool, AIToolCall, AIToolChatResult } from '@things-factory/ai-client-base';
|
|
5
5
|
import { type BoardModel, type ComponentCategory } from '@things-factory/board-import';
|
|
6
6
|
import type { BoardAIAssistant, BoardEditOp, ChatOptions, ChatResponse, LLMMessage } from './types.js';
|
|
7
|
-
import { type
|
|
8
|
-
import { type
|
|
7
|
+
import { formatAbortNotice, summarizeToolResult, type ToolGate as NeutralToolGate } from '@things-factory/ai-client-base';
|
|
8
|
+
import { type ToolCategoryFilter } from '@things-factory/ai-client-base';
|
|
9
9
|
export interface BoardAIAssistantOptions {
|
|
10
10
|
/** 기본 scope (chat 호출 시 옵션이 없으면 사용) */
|
|
11
11
|
scopes?: string[];
|
|
@@ -51,20 +51,7 @@ export declare function listColorPaletteNames(): string[];
|
|
|
51
51
|
* 등록된 레이아웃 템플릿 이름 목록 — 위와 동일.
|
|
52
52
|
*/
|
|
53
53
|
export declare function listLayoutTemplateNames(): string[];
|
|
54
|
-
|
|
55
|
-
* agentic loop 의 비정상 종료 사유 → 사용자 메시지에 부기할 한국어 한 줄.
|
|
56
|
-
*
|
|
57
|
-
* 정상 종료 (abortReason undefined) 면 빈 문자열 — concat 해도 무해.
|
|
58
|
-
* 사용자에게 "왜 중간에 멈췄는지" 단서 제공이 목적 — 침묵 종료 금지.
|
|
59
|
-
*/
|
|
60
|
-
export declare function formatAbortNotice(abortReason: AgenticLoopResult['abortReason']): string;
|
|
61
|
-
/**
|
|
62
|
-
* tool 결과를 UI fold-able 박스에 보여줄 만한 크기로 요약.
|
|
63
|
-
*
|
|
64
|
-
* 원본 그대로면 findComponents 50개 / getAtmosphereGuide 같은 큰 객체가 ChatMessage
|
|
65
|
-
* 영속까지 부담 — 핵심 모양만 유지하고 나머지는 marker.
|
|
66
|
-
*/
|
|
67
|
-
export declare function summarizeToolResult(value: any, depth?: number): any;
|
|
54
|
+
export { formatAbortNotice, summarizeToolResult };
|
|
68
55
|
export declare function isWriteTool(name: string): boolean;
|
|
69
56
|
export declare function isActionTool(name: string): boolean;
|
|
70
57
|
/**
|
|
@@ -86,14 +73,27 @@ export interface ToolExposure {
|
|
|
86
73
|
/** 외부 카테고리 화이트리스트(registerToolCategory 이름). 미지정 = 전부. */
|
|
87
74
|
toolCategories?: ToolCategoryFilter;
|
|
88
75
|
}
|
|
89
|
-
|
|
76
|
+
/**
|
|
77
|
+
* 보드의 게이트 — 공용 게이트 + 이 패키지가 가진 코어 도구 이름집합.
|
|
78
|
+
*
|
|
79
|
+
* `coreOn` 이 여기 있는 이유: 「코어 보드 편집 도구」라는 것이 board-ai 에만 있는 개념이다.
|
|
80
|
+
* 공용 게이트는 레지스트리만 안다.
|
|
81
|
+
*/
|
|
82
|
+
export interface ToolGate extends NeutralToolGate {
|
|
90
83
|
coreOn: boolean;
|
|
91
|
-
filter: ToolCategoryFilter;
|
|
92
|
-
isRead(name: string): boolean;
|
|
93
|
-
isWrite(name: string): boolean;
|
|
94
|
-
isAction(name: string): boolean;
|
|
95
|
-
spec(name: string): ToolSpec | undefined;
|
|
96
84
|
}
|
|
85
|
+
/**
|
|
86
|
+
* ── 레지스트리 판정을 공용으로 옮겼다 (2026-09-10) ─────────────────────────
|
|
87
|
+
* 이 함수가 두 출처에 답하고 있었다 — **도구 레지스트리**(등록된 카테고리의 kind·spec)와
|
|
88
|
+
* **이 패키지의 코어 이름집합**. 앞엣것은 중립이다: 「이 이름이 어느 종류이고 이 대화가 볼 수
|
|
89
|
+
* 있나」는 호스트가 누구든 같은 답이다.
|
|
90
|
+
*
|
|
91
|
+
* 그래서 앞엣것은 `registryToolGate` 로 내려갔고, 여기서 뒤엣것을 **더한다**. 이 갈이가 없으면
|
|
92
|
+
* 보드 없는 제품이 같은 dispatch 규율을 받으려고 자기 게이트를 써야 하고, 그러면 접지 가드가
|
|
93
|
+
* 갈렸던 것과 같은 일이 게이트에서 난다.
|
|
94
|
+
*
|
|
95
|
+
* 더하는 것이지 덮는 것이 아니다 — 덮으면 코어 이름집합에 없는 등록 도구가 조용히 잠긴다.
|
|
96
|
+
*/
|
|
97
97
|
export declare function buildToolGate(exposure?: ToolExposure): ToolGate;
|
|
98
98
|
/**
|
|
99
99
|
* Tool call → BoardActionOp 변환 (C-1 ephemeral scene 조작).
|
|
@@ -12,11 +12,11 @@ import { buildComponentStyleSummary } from './styling/read-tools';
|
|
|
12
12
|
*
|
|
13
13
|
* board 의 것(문서·선택 refid·편집 op)은 타입 매개변수로 넘긴다 — 루프는 그 모양을 모른다.
|
|
14
14
|
*/
|
|
15
|
-
import { runAgenticLoop } from '@things-factory/ai-client-base';
|
|
15
|
+
import { runAgenticLoop, formatAbortNotice, summarizeToolResult, registryToolGate, extendToolGate } from '@things-factory/ai-client-base';
|
|
16
16
|
import { checkReplyGrounding } from './grounding';
|
|
17
17
|
import { collectAllComponents, findComponentByRefid } from './component-tree';
|
|
18
18
|
import { isStylingTool, dispatchStylingTool, buildStylingToolDefinitions } from './styling/registry.js';
|
|
19
|
-
import { getToolSpecsFor, getToolKind,
|
|
19
|
+
import { getToolSpecsFor, getToolKind, getCategoryGuidance } from '@things-factory/ai-client-base';
|
|
20
20
|
import { validateWriteToolCall } from './validation/tool-validation';
|
|
21
21
|
const ALL_CATEGORIES = [
|
|
22
22
|
'container',
|
|
@@ -201,7 +201,8 @@ export class DefaultBoardAIAssistant {
|
|
|
201
201
|
* 근거집합의 정의와 사정거리는 ./grounding 머리말 참조(식별자 없는 창작 서술은 잡지 못한다). */
|
|
202
202
|
const warnings = checkReplyGrounding(baseReply, {
|
|
203
203
|
systemPrompt,
|
|
204
|
-
|
|
204
|
+
/* 근거집합의 칸 이름은 공용 패키지의 것이다 — 이 값이 보드 문맥이라는 것은 이 파일만 안다. */
|
|
205
|
+
hostContext: boardContext,
|
|
205
206
|
messages: messages.map(m => (typeof m.content === 'string' ? m.content : '')),
|
|
206
207
|
toolResults: loopResult.groundedTexts
|
|
207
208
|
});
|
|
@@ -1793,66 +1794,19 @@ export function listColorPaletteNames() {
|
|
|
1793
1794
|
export function listLayoutTemplateNames() {
|
|
1794
1795
|
return Object.keys(LAYOUT_TEMPLATES.templates);
|
|
1795
1796
|
}
|
|
1796
|
-
|
|
1797
|
-
*
|
|
1797
|
+
/*
|
|
1798
|
+
* 중단 통지 · 도구 결과 요약 — **공용 패키지로 옮겼다** (2026-09-10).
|
|
1798
1799
|
*
|
|
1799
|
-
*
|
|
1800
|
-
*
|
|
1801
|
-
|
|
1802
|
-
|
|
1803
|
-
|
|
1804
|
-
|
|
1805
|
-
switch (abortReason.type) {
|
|
1806
|
-
case 'aborted':
|
|
1807
|
-
return '\n\n_(요청이 중단되어 일부만 처리됐어요.)_';
|
|
1808
|
-
case 'provider_error':
|
|
1809
|
-
/* 남의 말(SDK 원문)을 사용자에게 보여주지 않는다 — "Error fetching from undefined: [503 …]" 은
|
|
1810
|
-
* 사용자가 할 수 있는 일을 알려주지 않는다. 일시 장애는 이미 몇 번 다시 시도한 뒤이므로,
|
|
1811
|
-
* 지금 필요한 안내는 "잠시 후 다시" 하나다. 원문은 서버 로그에 남는다. */
|
|
1812
|
-
return isTransientAIError({ message: abortReason.message })
|
|
1813
|
-
? '\n\n_(AI 서비스가 일시적으로 응답하지 않았어요. 잠시 후 다시 시도해 주세요.)_'
|
|
1814
|
-
: '\n\n_(처리 중 오류가 발생했어요. 같은 요청이 계속 실패하면 관리자에게 알려 주세요.)_';
|
|
1815
|
-
case 'max_iterations':
|
|
1816
|
-
return `\n\n_(작업이 너무 길어 ${abortReason.iter}회에서 중단했어요. 더 작게 나눠 요청해보세요.)_`;
|
|
1817
|
-
case 'repeated_validation_failure':
|
|
1818
|
-
return `\n\n_(\`${abortReason.toolName}\` 호출이 ${abortReason.consecutive}회 연속 실패해 중단했어요. 요청을 다시 표현해보세요.)_`;
|
|
1819
|
-
}
|
|
1820
|
-
}
|
|
1821
|
-
/**
|
|
1822
|
-
* tool 결과를 UI fold-able 박스에 보여줄 만한 크기로 요약.
|
|
1800
|
+
* 둘 다 보드를 모르는 함수였다. 옮긴 이유는 중복이 아니라 **한쪽만 갖고 있었던 것**이다:
|
|
1801
|
+
* `twin-ai` 는 `summarizeToolResult: v => v` 로 요약을 아예 안 하고 있었다. 한 제품은 압축해서
|
|
1802
|
+
* 영속하고 다른 제품은 원본을 영속했고, 그렇게 갈린 이유가 어디에도 없었다.
|
|
1803
|
+
*
|
|
1804
|
+
* 중단 통지는 더 무겁다 — 안 붙이면 **잘린 답이 완결된 답과 똑같이 보인다.** 그 보장을 제품마다
|
|
1805
|
+
* 기억해야 하는 것으로 두면 언젠가 한 제품이 잊는다.
|
|
1823
1806
|
*
|
|
1824
|
-
*
|
|
1825
|
-
* 영속까지 부담 — 핵심 모양만 유지하고 나머지는 marker.
|
|
1807
|
+
* 여기 남은 것은 재수출이다. 이 패키지를 지나는 소비처가 이름을 그대로 쓰게 한다.
|
|
1826
1808
|
*/
|
|
1827
|
-
export
|
|
1828
|
-
if (value === null || value === undefined)
|
|
1829
|
-
return value;
|
|
1830
|
-
if (typeof value === 'string') {
|
|
1831
|
-
return value.length > 200 ? `${value.slice(0, 200)}…[+${value.length - 200} chars]` : value;
|
|
1832
|
-
}
|
|
1833
|
-
if (typeof value === 'number' || typeof value === 'boolean')
|
|
1834
|
-
return value;
|
|
1835
|
-
if (Array.isArray(value)) {
|
|
1836
|
-
if (depth >= 2)
|
|
1837
|
-
return `[Array(${value.length})]`;
|
|
1838
|
-
const out = value.slice(0, 5).map(v => summarizeToolResult(v, depth + 1));
|
|
1839
|
-
if (value.length > 5)
|
|
1840
|
-
out.push(`…[+${value.length - 5} items]`);
|
|
1841
|
-
return out;
|
|
1842
|
-
}
|
|
1843
|
-
if (typeof value === 'object') {
|
|
1844
|
-
if (depth >= 3) {
|
|
1845
|
-
const keys = Object.keys(value).slice(0, 6).join(',');
|
|
1846
|
-
return `{${keys}${Object.keys(value).length > 6 ? ',…' : ''}}`;
|
|
1847
|
-
}
|
|
1848
|
-
const out = {};
|
|
1849
|
-
for (const key of Object.keys(value)) {
|
|
1850
|
-
out[key] = summarizeToolResult(value[key], depth + 1);
|
|
1851
|
-
}
|
|
1852
|
-
return out;
|
|
1853
|
-
}
|
|
1854
|
-
return undefined;
|
|
1855
|
-
}
|
|
1809
|
+
export { formatAbortNotice, summarizeToolResult };
|
|
1856
1810
|
export function isWriteTool(name) {
|
|
1857
1811
|
if (WRITE_TOOL_NAMES.has(name))
|
|
1858
1812
|
return true;
|
|
@@ -1863,18 +1817,26 @@ export function isActionTool(name) {
|
|
|
1863
1817
|
return true;
|
|
1864
1818
|
return getToolKind(name) === 'action';
|
|
1865
1819
|
}
|
|
1820
|
+
/**
|
|
1821
|
+
* ── 레지스트리 판정을 공용으로 옮겼다 (2026-09-10) ─────────────────────────
|
|
1822
|
+
* 이 함수가 두 출처에 답하고 있었다 — **도구 레지스트리**(등록된 카테고리의 kind·spec)와
|
|
1823
|
+
* **이 패키지의 코어 이름집합**. 앞엣것은 중립이다: 「이 이름이 어느 종류이고 이 대화가 볼 수
|
|
1824
|
+
* 있나」는 호스트가 누구든 같은 답이다.
|
|
1825
|
+
*
|
|
1826
|
+
* 그래서 앞엣것은 `registryToolGate` 로 내려갔고, 여기서 뒤엣것을 **더한다**. 이 갈이가 없으면
|
|
1827
|
+
* 보드 없는 제품이 같은 dispatch 규율을 받으려고 자기 게이트를 써야 하고, 그러면 접지 가드가
|
|
1828
|
+
* 갈렸던 것과 같은 일이 게이트에서 난다.
|
|
1829
|
+
*
|
|
1830
|
+
* 더하는 것이지 덮는 것이 아니다 — 덮으면 코어 이름집합에 없는 등록 도구가 조용히 잠긴다.
|
|
1831
|
+
*/
|
|
1866
1832
|
export function buildToolGate(exposure = {}) {
|
|
1867
1833
|
const coreOn = exposure.boardTools !== false;
|
|
1868
|
-
const
|
|
1869
|
-
|
|
1870
|
-
|
|
1871
|
-
coreOn
|
|
1872
|
-
|
|
1873
|
-
|
|
1874
|
-
isWrite: name => (coreOn && WRITE_TOOL_NAMES.has(name)) || kind(name) === 'write',
|
|
1875
|
-
isAction: name => (coreOn && ACTION_TOOL_NAMES.has(name)) || kind(name) === 'action',
|
|
1876
|
-
spec: name => findToolSpec(name, filter)
|
|
1877
|
-
};
|
|
1834
|
+
const gate = extendToolGate(registryToolGate(exposure.toolCategories), {
|
|
1835
|
+
isRead: name => coreOn && READ_TOOL_NAMES.has(name),
|
|
1836
|
+
isWrite: name => coreOn && WRITE_TOOL_NAMES.has(name),
|
|
1837
|
+
isAction: name => coreOn && ACTION_TOOL_NAMES.has(name)
|
|
1838
|
+
});
|
|
1839
|
+
return { ...gate, coreOn };
|
|
1878
1840
|
}
|
|
1879
1841
|
/**
|
|
1880
1842
|
* tool-registry plugin point — 등록된 모든 외부 카테고리의 LLM tool 정의를 도출.
|