@things-factory/board-ai 10.1.6 → 10.1.8

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 (31) hide show
  1. package/client/index.ts +13 -1
  2. package/dist-client/client/index.js +13 -1
  3. package/dist-client/client/index.js.map +1 -1
  4. package/dist-client/server/service/assistant.js +17 -1
  5. package/dist-client/server/service/assistant.js.map +1 -1
  6. package/dist-client/server/service/types.d.ts +7 -0
  7. package/dist-client/server/service/types.js.map +1 -1
  8. package/dist-client/tsconfig.tsbuildinfo +1 -1
  9. package/dist-server/service/assistant.js +17 -1
  10. package/dist-server/service/assistant.js.map +1 -1
  11. package/dist-server/service/board-ai-resolver.d.ts +1 -0
  12. package/dist-server/service/board-ai-resolver.js +10 -2
  13. package/dist-server/service/board-ai-resolver.js.map +1 -1
  14. package/dist-server/service/board-session-resolver.js +3 -3
  15. package/dist-server/service/board-session-resolver.js.map +1 -1
  16. package/dist-server/service/types.d.ts +7 -0
  17. package/dist-server/service/types.js.map +1 -1
  18. package/dist-server/tsconfig.tsbuildinfo +1 -1
  19. package/logs/.5e5d741d8b7784a2fbad65eedc0fd46946aaf6f2-audit.json +15 -0
  20. package/logs/connections-2026-09-12-15.log +0 -0
  21. package/package.json +7 -7
  22. package/server/service/assistant.test.ts +5 -0
  23. package/server/service/assistant.ts +18 -1
  24. package/server/service/board-ai-resolver.ts +10 -2
  25. package/server/service/board-session-resolver.ts +3 -3
  26. package/server/service/types.ts +8 -0
  27. package/translations/en.json +1 -62
  28. package/translations/ja.json +1 -61
  29. package/translations/ko.json +1 -62
  30. package/translations/ms.json +1 -61
  31. package/translations/zh.json +1 -61
package/client/index.ts CHANGED
@@ -25,7 +25,19 @@ import { registerChatDefaults } from '@things-factory/ai-assistant/dist-client/i
25
25
  import { DEFAULT_CATALOG_ENTRIES } from './components/default-catalog-entries.js'
26
26
  import { DEFAULT_SLASH_TEMPLATES } from './components/default-slash-templates.js'
27
27
 
28
- registerChatDefaults({ catalogEntries: DEFAULT_CATALOG_ENTRIES, slashTemplates: DEFAULT_SLASH_TEMPLATES })
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
+ })
29
41
 
30
42
  export * from '@things-factory/ai-assistant/dist-client/index.js'
31
43
  export * from './components/default-catalog-entries.js'
@@ -24,7 +24,19 @@
24
24
  import { registerChatDefaults } from '@things-factory/ai-assistant/dist-client/index.js';
25
25
  import { DEFAULT_CATALOG_ENTRIES } from './components/default-catalog-entries.js';
26
26
  import { DEFAULT_SLASH_TEMPLATES } from './components/default-slash-templates.js';
27
- registerChatDefaults({ catalogEntries: DEFAULT_CATALOG_ENTRIES, slashTemplates: DEFAULT_SLASH_TEMPLATES });
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
+ });
28
40
  export * from '@things-factory/ai-assistant/dist-client/index.js';
29
41
  export * from './components/default-catalog-entries.js';
30
42
  export * from './components/default-slash-templates.js';
@@ -1 +1 @@
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,oBAAoB,CAAC,EAAE,cAAc,EAAE,uBAAuB,EAAE,cAAc,EAAE,uBAAuB,EAAE,CAAC,CAAA;AAE1G,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\nregisterChatDefaults({ catalogEntries: DEFAULT_CATALOG_ENTRIES, slashTemplates: DEFAULT_SLASH_TEMPLATES })\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"]}
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"]}
@@ -206,6 +206,21 @@ export class DefaultBoardAIAssistant {
206
206
  messages: messages.map(m => (typeof m.content === 'string' ? m.content : '')),
207
207
  toolResults: loopResult.groundedTexts
208
208
  });
209
+ const analysis = (toolUsages.length || patch || accumulatedActions.length || loopResult.proposals.length)
210
+ ? {
211
+ kind: 'board.analysis.v1',
212
+ scope: { boardId: currentBoard?.id },
213
+ window: { turn: messages.length },
214
+ confidence: { level: warnings.length ? 'low' : 'medium', reasons: warnings.length ? ['grounding-warning'] : ['tool-or-board-context'] },
215
+ limitations: warnings.map(code => ({ code })),
216
+ claims: [{ code: patch ? 'board.patch-proposed' : 'board.context-reviewed', severity: 'info', evidence: { toolCalls: toolUsages.length, componentCount: components.length }, method: 'board-agentic-loop', assumptions: ['Board context is current for this turn.'] }],
217
+ facts: { board: boardContext, toolUsages },
218
+ ...(patch ? { proposal: patch } : accumulatedActions.length ? { proposal: accumulatedActions } : {}),
219
+ approvalRequired: true,
220
+ approval: { required: true, mode: 'confirm', reason: patch || accumulatedActions.length ? 'Board or scene change requires user confirmation.' : 'Analysis is advisory.' },
221
+ trace: { source: 'board-ai', generatedAt: new Date().toISOString(), version: '1' }
222
+ }
223
+ : undefined;
209
224
  return {
210
225
  reply,
211
226
  patch,
@@ -214,7 +229,8 @@ export class DefaultBoardAIAssistant {
214
229
  actions: accumulatedActions.length > 0 ? accumulatedActions : undefined,
215
230
  /* 제안은 실행 전 상태다 — 대화면이 확인 버튼을 그린다. 서버는 실행하지 않는다. */
216
231
  proposals: loopResult.proposals.length > 0 ? loopResult.proposals : undefined,
217
- groundingWarnings: warnings.length > 0 ? warnings : undefined
232
+ groundingWarnings: warnings.length > 0 ? warnings : undefined,
233
+ analysis
218
234
  };
219
235
  }
220
236
  resolveTypesAndCategories(options) {