@things-factory/ai-assistant 10.1.154 → 10.1.156
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/bootstrap.ts +27 -0
- package/client/components/assistant-chat.ts +229 -178
- package/client/components/assistant-dock.ts +53 -48
- package/client/components/assistant-session-manager.ts +82 -100
- package/client/components/assistant-session-toolbar.ts +11 -3
- package/client/components/chat-input-builder.ts +8 -2
- package/client/settings/agent-settings-model.ts +164 -0
- package/client/settings/ai-agent-setting-let.ts +684 -0
- package/client/settings/ai-usage-setting-let.ts +252 -0
- package/client/settings/usage-model.ts +46 -0
- package/client/setup-assistant-dock.ts +2 -3
- package/client/utils/agent-choice.ts +56 -0
- package/client/utils/assistant-navigation.test.ts +14 -8
- package/client/utils/assistant-navigation.ts +8 -3
- package/client/utils/composer-frame.ts +28 -2
- package/client/utils/menu-room.ts +33 -0
- package/dist-client/bootstrap.d.ts +8 -0
- package/dist-client/bootstrap.js +26 -0
- package/dist-client/bootstrap.js.map +1 -0
- package/dist-client/components/assistant-chat.d.ts +32 -4
- package/dist-client/components/assistant-chat.js +234 -175
- package/dist-client/components/assistant-chat.js.map +1 -1
- package/dist-client/components/assistant-dock.d.ts +6 -8
- package/dist-client/components/assistant-dock.js +52 -60
- package/dist-client/components/assistant-dock.js.map +1 -1
- package/dist-client/components/assistant-session-manager.d.ts +8 -7
- package/dist-client/components/assistant-session-manager.js +84 -124
- package/dist-client/components/assistant-session-manager.js.map +1 -1
- package/dist-client/components/assistant-session-toolbar.d.ts +1 -0
- package/dist-client/components/assistant-session-toolbar.js +10 -3
- package/dist-client/components/assistant-session-toolbar.js.map +1 -1
- package/dist-client/components/chat-input-builder.d.ts +4 -0
- package/dist-client/components/chat-input-builder.js +4 -2
- package/dist-client/components/chat-input-builder.js.map +1 -1
- package/dist-client/settings/agent-settings-model.d.ts +93 -0
- package/dist-client/settings/agent-settings-model.js +95 -0
- package/dist-client/settings/agent-settings-model.js.map +1 -0
- package/dist-client/settings/ai-agent-setting-let.d.ts +51 -0
- package/dist-client/settings/ai-agent-setting-let.js +672 -0
- package/dist-client/settings/ai-agent-setting-let.js.map +1 -0
- package/dist-client/settings/ai-usage-setting-let.d.ts +26 -0
- package/dist-client/settings/ai-usage-setting-let.js +276 -0
- package/dist-client/settings/ai-usage-setting-let.js.map +1 -0
- package/dist-client/settings/usage-model.d.ts +32 -0
- package/dist-client/settings/usage-model.js +25 -0
- package/dist-client/settings/usage-model.js.map +1 -0
- package/dist-client/setup-assistant-dock.d.ts +0 -1
- package/dist-client/setup-assistant-dock.js +0 -1
- package/dist-client/setup-assistant-dock.js.map +1 -1
- package/dist-client/tsconfig.tsbuildinfo +1 -1
- package/dist-client/utils/agent-choice.d.ts +24 -0
- package/dist-client/utils/agent-choice.js +38 -0
- package/dist-client/utils/agent-choice.js.map +1 -0
- package/dist-client/utils/assistant-navigation.d.ts +8 -3
- package/dist-client/utils/assistant-navigation.js +7 -2
- package/dist-client/utils/assistant-navigation.js.map +1 -1
- package/dist-client/utils/assistant-navigation.test.js +14 -8
- package/dist-client/utils/assistant-navigation.test.js.map +1 -1
- package/dist-client/utils/composer-frame.d.ts +23 -2
- package/dist-client/utils/composer-frame.js +20 -2
- package/dist-client/utils/composer-frame.js.map +1 -1
- package/dist-client/utils/menu-room.d.ts +13 -0
- package/dist-client/utils/menu-room.js +26 -0
- package/dist-client/utils/menu-room.js.map +1 -0
- package/dist-server/service/ai-agent-resolver.d.ts +82 -0
- package/dist-server/service/ai-agent-resolver.js +417 -0
- package/dist-server/service/ai-agent-resolver.js.map +1 -0
- package/dist-server/service/assistant-capability-resolver.d.ts +1 -1
- package/dist-server/service/assistant-capability-resolver.js +7 -7
- package/dist-server/service/assistant-capability-resolver.js.map +1 -1
- package/dist-server/service/assistant-chat-resolver.d.ts +2 -0
- package/dist-server/service/assistant-chat-resolver.js +32 -15
- package/dist-server/service/assistant-chat-resolver.js.map +1 -1
- package/dist-server/service/assistant-mode/resolve.d.ts +0 -1
- package/dist-server/service/assistant-mode/resolve.js +0 -1
- package/dist-server/service/assistant-mode/resolve.js.map +1 -1
- package/dist-server/service/assistant-mode/types.d.ts +1 -2
- package/dist-server/service/assistant-mode/types.js.map +1 -1
- package/dist-server/service/chat-session/chat-session.d.ts +2 -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/index.d.ts +2 -1
- package/dist-server/service/index.js +3 -0
- package/dist-server/service/index.js.map +1 -1
- package/dist-server/service/testing/mode-conformance.js +0 -1
- package/dist-server/service/testing/mode-conformance.js.map +1 -1
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/package.json +9 -7
- package/server/service/ai-agent-resolver.ts +330 -0
- package/server/service/assistant-capability-resolver.ts +7 -7
- package/server/service/assistant-chat-resolver.ts +32 -24
- package/server/service/assistant-mode/resolve.test.ts +0 -2
- package/server/service/assistant-mode/resolve.ts +0 -2
- package/server/service/assistant-mode/types.ts +1 -2
- package/server/service/chat-session/chat-session.ts +5 -0
- package/server/service/index.ts +3 -0
- package/server/service/testing/mode-conformance.ts +0 -1
- package/server/tool-registry-boot-report.test.ts +2 -0
- package/test/ai-agent-settings.test.ts +123 -0
- package/test/assistant-dock.test.ts +3 -2
- package/test/assistant-session-manager.test.ts +10 -4
- package/test/assistant-session-toolbar.test.ts +8 -0
- package/test/composer-frame.test.ts +40 -2
- package/test/menu-room.test.ts +33 -0
- package/test/open-doors.test.ts +3 -1
- package/test/session-discovery.test.ts +7 -6
- package/things-factory.config.js +2 -0
- package/translations/en.json +78 -12
- package/translations/es.json +78 -12
- package/translations/ja.json +78 -12
- package/translations/ko.json +78 -12
- package/translations/ms.json +78 -12
- package/translations/zh.json +78 -12
- package/client/components/chat-triggers.test.ts +0 -72
- package/client/components/chat-triggers.ts +0 -62
- package/dist-client/components/chat-triggers.d.ts +0 -16
- package/dist-client/components/chat-triggers.js +0 -42
- package/dist-client/components/chat-triggers.js.map +0 -1
- package/dist-client/components/chat-triggers.test.d.ts +0 -1
- package/dist-client/components/chat-triggers.test.js +0 -61
- package/dist-client/components/chat-triggers.test.js.map +0 -1
package/translations/ja.json
CHANGED
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
"ai-assistant.session.filters": "フィルター",
|
|
14
14
|
"ai-assistant.session.reset-filters": "検索とフィルターを解除",
|
|
15
15
|
"ai-assistant.session.filtered-empty": "この対象で条件に合う会話はありません。",
|
|
16
|
-
"ai-assistant.session.scope-empty": "
|
|
16
|
+
"ai-assistant.session.scope-empty": "会話はまだありません。",
|
|
17
17
|
"ai-assistant.session.audience-private": "参加者のみ",
|
|
18
18
|
"ai-assistant.session.audience-open": "事業場内に公開",
|
|
19
19
|
"ai-assistant.session.manage": "会話を管理",
|
|
@@ -31,16 +31,9 @@
|
|
|
31
31
|
"ai-assistant.label.create": "作成",
|
|
32
32
|
"ai-assistant.label.edit": "編集",
|
|
33
33
|
"ai-assistant.label.style": "スタイル",
|
|
34
|
-
"ai-assistant.label.korean-supported": "多言語対応",
|
|
35
|
-
"ai-assistant.label.multi-command": "複数命令",
|
|
36
|
-
"ai-assistant.label.review-able": "レビュー可能",
|
|
37
34
|
"ai-assistant.text.empty-title": "AI と一緒にボードを作成しましょう",
|
|
38
35
|
"ai-assistant.text.empty-subtitle": "自然言語で指示すると AI がボードを作成・編集・スタイリングします。下の例をクリックして始めてください。",
|
|
39
36
|
"ai-assistant.text.input-placeholder": "自然言語で指示してください (Shift+Enter で改行、Enter で送信)",
|
|
40
|
-
"ai-assistant.text.triggers-heading": "または自動補完で素早く開始",
|
|
41
|
-
"ai-assistant.text.trigger-component-tooltip": "ボードのコンポーネントをメンション",
|
|
42
|
-
"ai-assistant.text.trigger-user-tooltip": "$t(term.domain)内のメンバーをメンション",
|
|
43
|
-
"ai-assistant.text.trigger-insert-tooltip": "プリファブ / パレット / レイアウト / 命令テンプレートを挿入",
|
|
44
37
|
"ai-assistant.text.send-tooltip": "送信 (Enter)",
|
|
45
38
|
"ai-assistant.text.show-examples-tooltip": "よく使う指示の例を表示",
|
|
46
39
|
"ai-assistant.text.applied-changes": "変更しました。",
|
|
@@ -54,9 +47,6 @@
|
|
|
54
47
|
"ai-assistant.example.style-dark-mode": "ダークモード — 濃紺の背景、白文字、ティール アクセント",
|
|
55
48
|
"ai-assistant.example.style-rounded-shadow": "すべての図形を角丸にしてカード風の柔らかい影を追加",
|
|
56
49
|
"ai-assistant.button.new-chat": "新しいチャット",
|
|
57
|
-
"ai-assistant.label.trigger-component": "コンポーネント",
|
|
58
|
-
"ai-assistant.label.trigger-user": "ユーザー",
|
|
59
|
-
"ai-assistant.label.trigger-insert": "挿入",
|
|
60
50
|
"ai-assistant.button.examples": "例",
|
|
61
51
|
"ai-assistant.button.close": "閉じる",
|
|
62
52
|
"ai-assistant.button.revert": "元に戻す",
|
|
@@ -317,5 +307,81 @@
|
|
|
317
307
|
"ai-assistant.text.room-attachments-unavailable": "参加者への添付ファイル送信はまだ対応していません。添付ファイルを外してから送信してください。",
|
|
318
308
|
"ai-assistant.button.reply": "返信",
|
|
319
309
|
"ai-assistant.button.cancel-reply": "返信を取り消す",
|
|
320
|
-
"ai-assistant.text.reply-to": "{name} への返信"
|
|
310
|
+
"ai-assistant.text.reply-to": "{name} への返信",
|
|
311
|
+
"ai-assistant.label.ai-agent": "AI エージェント",
|
|
312
|
+
"ai-assistant.agent.title": "AI エージェント",
|
|
313
|
+
"ai-assistant.agent.load-failed": "AI エージェントを読み込めませんでした。",
|
|
314
|
+
"ai-assistant.agent.retry": "再試行",
|
|
315
|
+
"ai-assistant.agent.loading": "読み込み中…",
|
|
316
|
+
"ai-assistant.agent.add": "エージェント",
|
|
317
|
+
"ai-assistant.agent.inherited-from": "{path} から継承",
|
|
318
|
+
"ai-assistant.agent.this-domain": "この事業所",
|
|
319
|
+
"ai-assistant.agent.status-on": "この事業所の AI: 利用可能 · 選べるエージェント {count} · 既定 {name}",
|
|
320
|
+
"ai-assistant.agent.status-no-key": "API キーのあるエージェントがないため、この事業所では AI を使えません。",
|
|
321
|
+
"ai-assistant.agent.status-all-off": "すべてのエージェントがオフのため、この事業所では AI を使えません。",
|
|
322
|
+
"ai-assistant.agent.status-no-agent": "AI エージェントがないため、この事業所では AI を使えません。",
|
|
323
|
+
"ai-assistant.agent.default": "既定",
|
|
324
|
+
"ai-assistant.agent.default-hint": "選ぶ前に使われるエージェント",
|
|
325
|
+
"ai-assistant.agent.use": "使用",
|
|
326
|
+
"ai-assistant.agent.use-here": "この事業所で使う",
|
|
327
|
+
"ai-assistant.agent.used-below": "下位 {count} 件",
|
|
328
|
+
"ai-assistant.agent.key-this-domain": "この事業所のキー {hint}",
|
|
329
|
+
"ai-assistant.agent.key-of": "{domain} のキー",
|
|
330
|
+
"ai-assistant.agent.key-missing": "キーなし",
|
|
331
|
+
"ai-assistant.agent.more": "その他",
|
|
332
|
+
"ai-assistant.agent.edit": "編集",
|
|
333
|
+
"ai-assistant.agent.delete": "削除",
|
|
334
|
+
"ai-assistant.agent.replace-own-key": "この事業所のキーを変更",
|
|
335
|
+
"ai-assistant.agent.use-own-key": "この事業所のキーを使う",
|
|
336
|
+
"ai-assistant.agent.back-to-key": "{domain} のキーに戻す",
|
|
337
|
+
"ai-assistant.agent.key-placeholder": "この事業所の API キー",
|
|
338
|
+
"ai-assistant.agent.cancel": "キャンセル",
|
|
339
|
+
"ai-assistant.agent.save": "保存",
|
|
340
|
+
"ai-assistant.agent.name": "名前",
|
|
341
|
+
"ai-assistant.agent.provider": "提供元",
|
|
342
|
+
"ai-assistant.agent.api-key": "API キー",
|
|
343
|
+
"ai-assistant.agent.key-stored": "保存済みのキー {hint} — 変更する時だけ入力",
|
|
344
|
+
"ai-assistant.agent.model": "モデル",
|
|
345
|
+
"ai-assistant.agent.pick-model": "モデルを選択",
|
|
346
|
+
"ai-assistant.agent.reload-models": "モデル一覧を再読み込み",
|
|
347
|
+
"ai-assistant.agent.enter-key-first": "API キーを入力するとモデルを選べます。",
|
|
348
|
+
"ai-assistant.agent.reading-models": "提供元のモデル一覧を読み込み中…",
|
|
349
|
+
"ai-assistant.agent.model-gone": "提供元の一覧にないモデルです。別のモデルを選んでください。",
|
|
350
|
+
"ai-assistant.agent.advanced": "詳細設定",
|
|
351
|
+
"ai-assistant.agent.base-url": "Base URL",
|
|
352
|
+
"ai-assistant.agent.organization": "Organization",
|
|
353
|
+
"ai-assistant.agent.back-to-key-title": "{domain} のキーに戻しますか?",
|
|
354
|
+
"ai-assistant.agent.back-to-key-text": "「{name}」に設定したこの事業所のキーを削除し、{domain} のキーで再び応答します。",
|
|
355
|
+
"ai-assistant.agent.turn-off-title": "「{name}」をオフにしますか?",
|
|
356
|
+
"ai-assistant.agent.turn-off-text": "この事業所と {domains} で応答しなくなります。",
|
|
357
|
+
"ai-assistant.agent.delete-below": "{domains} でも応答しなくなります。",
|
|
358
|
+
"ai-assistant.agent.delete-title": "「{name}」を削除しますか?",
|
|
359
|
+
"ai-assistant.agent.delete-text": "API キーも一緒に削除されます。記録済みの使用量は残ります。",
|
|
360
|
+
"ai-assistant.agent.used-below-title": "「{name}」を使う下位事業所",
|
|
361
|
+
"ai-assistant.agent.close": "閉じる",
|
|
362
|
+
"ai-assistant.agent.save-failed": "保存できませんでした",
|
|
363
|
+
"ai-assistant.agent.confirm": "確認",
|
|
364
|
+
"ai-assistant.usage.title": "AI 使用量",
|
|
365
|
+
"ai-assistant.usage.deleted-agent": "(削除されたエージェント)",
|
|
366
|
+
"ai-assistant.usage.today": "今日",
|
|
367
|
+
"ai-assistant.usage.7d": "7日",
|
|
368
|
+
"ai-assistant.usage.30d": "30日",
|
|
369
|
+
"ai-assistant.usage.by-hour": "時間",
|
|
370
|
+
"ai-assistant.usage.by-day": "日",
|
|
371
|
+
"ai-assistant.usage.by-month": "月",
|
|
372
|
+
"ai-assistant.usage.agent": "エージェント",
|
|
373
|
+
"ai-assistant.usage.all-agents": "すべてのエージェント",
|
|
374
|
+
"ai-assistant.usage.person": "ユーザー",
|
|
375
|
+
"ai-assistant.usage.all-people": "すべてのユーザー",
|
|
376
|
+
"ai-assistant.usage.include-below": "下位事業所を含む",
|
|
377
|
+
"ai-assistant.usage.load-failed": "使用量を読み込めませんでした。",
|
|
378
|
+
"ai-assistant.usage.loading": "読み込み中…",
|
|
379
|
+
"ai-assistant.usage.empty": "この期間に AI は使われていません。",
|
|
380
|
+
"ai-assistant.usage.when": "時点",
|
|
381
|
+
"ai-assistant.usage.calls": "呼び出し",
|
|
382
|
+
"ai-assistant.usage.input-tokens": "入力トークン",
|
|
383
|
+
"ai-assistant.usage.output-tokens": "出力トークン",
|
|
384
|
+
"ai-assistant.usage.failures": "失敗",
|
|
385
|
+
"ai-assistant.usage.total": "合計",
|
|
386
|
+
"ai-assistant.text.send-to-people-notice": "この会話の参加者に送ります。AI は応答しません。"
|
|
321
387
|
}
|
package/translations/ko.json
CHANGED
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
"ai-assistant.session.filters": "필터",
|
|
14
14
|
"ai-assistant.session.reset-filters": "검색·필터 초기화",
|
|
15
15
|
"ai-assistant.session.filtered-empty": "이 대상에서 조건에 맞는 대화가 없습니다.",
|
|
16
|
-
"ai-assistant.session.scope-empty": "
|
|
16
|
+
"ai-assistant.session.scope-empty": "대화가 아직 없습니다.",
|
|
17
17
|
"ai-assistant.session.audience-private": "참여자만",
|
|
18
18
|
"ai-assistant.session.audience-open": "사업장 공개",
|
|
19
19
|
"ai-assistant.session.manage": "대화 관리",
|
|
@@ -31,16 +31,9 @@
|
|
|
31
31
|
"ai-assistant.label.create": "생성",
|
|
32
32
|
"ai-assistant.label.edit": "편집",
|
|
33
33
|
"ai-assistant.label.style": "스타일",
|
|
34
|
-
"ai-assistant.label.korean-supported": "한국어 자유",
|
|
35
|
-
"ai-assistant.label.multi-command": "다중 명령",
|
|
36
|
-
"ai-assistant.label.review-able": "검수 가능",
|
|
37
34
|
"ai-assistant.text.empty-title": "AI 와 함께 보드를 만들어보세요",
|
|
38
35
|
"ai-assistant.text.empty-subtitle": "자연어로 명령하시면 AI 가 보드를 생성·편집·스타일링합니다. 아래 예시를 클릭해 시작해보세요.",
|
|
39
36
|
"ai-assistant.text.input-placeholder": "자연어 명령 — # 컴포넌트 · @ 카탈로그 · / 템플릿 자동완성",
|
|
40
|
-
"ai-assistant.text.triggers-heading": "또는 자동완성으로 빠르게 시작",
|
|
41
|
-
"ai-assistant.text.trigger-component-tooltip": "보드의 컴포넌트를 검색해 멘션",
|
|
42
|
-
"ai-assistant.text.trigger-user-tooltip": "$t(term.domain) 동료를 멘션",
|
|
43
|
-
"ai-assistant.text.trigger-insert-tooltip": "프리팹 / 팔레트 / 레이아웃 / 명령 템플릿 삽입",
|
|
44
37
|
"ai-assistant.text.send-tooltip": "전송 (Enter)",
|
|
45
38
|
"ai-assistant.text.show-examples-tooltip": "자주 쓰는 명령 예시 보기",
|
|
46
39
|
"ai-assistant.text.applied-changes": "변경했습니다.",
|
|
@@ -70,9 +63,6 @@
|
|
|
70
63
|
"ai-assistant.example.style-dark-mode": "다크 모드 — 짙은 남색 배경, 흰색 텍스트, 청록 강조",
|
|
71
64
|
"ai-assistant.example.style-rounded-shadow": "모든 도형 모서리 둥글게 + 카드형 옅은 그림자",
|
|
72
65
|
"ai-assistant.button.new-chat": "새 대화",
|
|
73
|
-
"ai-assistant.label.trigger-component": "컴포넌트",
|
|
74
|
-
"ai-assistant.label.trigger-user": "사용자",
|
|
75
|
-
"ai-assistant.label.trigger-insert": "삽입",
|
|
76
66
|
"ai-assistant.button.examples": "예시",
|
|
77
67
|
"ai-assistant.button.close": "닫기",
|
|
78
68
|
"ai-assistant.button.revert": "되돌리기",
|
|
@@ -317,5 +307,81 @@
|
|
|
317
307
|
"ai-assistant.text.room-attachments-unavailable": "참여자에게 첨부파일을 보내는 기능은 아직 지원하지 않습니다. 첨부파일을 제거한 뒤 보내주세요.",
|
|
318
308
|
"ai-assistant.button.reply": "답장",
|
|
319
309
|
"ai-assistant.button.cancel-reply": "답장 취소",
|
|
320
|
-
"ai-assistant.text.reply-to": "{name}에게 답장"
|
|
310
|
+
"ai-assistant.text.reply-to": "{name}에게 답장",
|
|
311
|
+
"ai-assistant.label.ai-agent": "AI 에이전트",
|
|
312
|
+
"ai-assistant.agent.title": "AI 에이전트",
|
|
313
|
+
"ai-assistant.agent.load-failed": "AI 에이전트를 읽지 못했습니다.",
|
|
314
|
+
"ai-assistant.agent.retry": "다시 시도",
|
|
315
|
+
"ai-assistant.agent.loading": "읽는 중…",
|
|
316
|
+
"ai-assistant.agent.add": "에이전트",
|
|
317
|
+
"ai-assistant.agent.inherited-from": "{path}에서 물려받음",
|
|
318
|
+
"ai-assistant.agent.this-domain": "이 사업장",
|
|
319
|
+
"ai-assistant.agent.status-on": "이 사업장의 AI: 사용 가능 · 쓸 수 있는 에이전트 {count} · 기본 {name}",
|
|
320
|
+
"ai-assistant.agent.status-no-key": "API 키가 있는 에이전트가 없어 이 사업장에서 AI 를 쓸 수 없습니다.",
|
|
321
|
+
"ai-assistant.agent.status-all-off": "모든 에이전트가 꺼져 있어 이 사업장에서 AI 를 쓸 수 없습니다.",
|
|
322
|
+
"ai-assistant.agent.status-no-agent": "AI 에이전트가 없어 이 사업장에서 AI 를 쓸 수 없습니다.",
|
|
323
|
+
"ai-assistant.agent.default": "기본",
|
|
324
|
+
"ai-assistant.agent.default-hint": "고르기 전에 쓰이는 에이전트",
|
|
325
|
+
"ai-assistant.agent.use": "사용",
|
|
326
|
+
"ai-assistant.agent.use-here": "이 사업장에서 씀",
|
|
327
|
+
"ai-assistant.agent.used-below": "하위 {count}곳",
|
|
328
|
+
"ai-assistant.agent.key-this-domain": "이 사업장 키 {hint}",
|
|
329
|
+
"ai-assistant.agent.key-of": "{domain} 키",
|
|
330
|
+
"ai-assistant.agent.key-missing": "키 없음",
|
|
331
|
+
"ai-assistant.agent.more": "더 보기",
|
|
332
|
+
"ai-assistant.agent.edit": "고치기",
|
|
333
|
+
"ai-assistant.agent.delete": "지우기",
|
|
334
|
+
"ai-assistant.agent.replace-own-key": "이 사업장 키 바꾸기",
|
|
335
|
+
"ai-assistant.agent.use-own-key": "이 사업장 키로 쓰기",
|
|
336
|
+
"ai-assistant.agent.back-to-key": "{domain} 키로 되돌리기",
|
|
337
|
+
"ai-assistant.agent.key-placeholder": "이 사업장의 API 키",
|
|
338
|
+
"ai-assistant.agent.cancel": "취소",
|
|
339
|
+
"ai-assistant.agent.save": "저장",
|
|
340
|
+
"ai-assistant.agent.name": "이름",
|
|
341
|
+
"ai-assistant.agent.provider": "제공처",
|
|
342
|
+
"ai-assistant.agent.api-key": "API 키",
|
|
343
|
+
"ai-assistant.agent.key-stored": "저장된 키 {hint} — 바꿀 때만 입력",
|
|
344
|
+
"ai-assistant.agent.model": "모델",
|
|
345
|
+
"ai-assistant.agent.pick-model": "모델 고르기",
|
|
346
|
+
"ai-assistant.agent.reload-models": "모델 목록 다시 읽기",
|
|
347
|
+
"ai-assistant.agent.enter-key-first": "API 키를 넣으면 모델을 고를 수 있습니다.",
|
|
348
|
+
"ai-assistant.agent.reading-models": "제공처의 모델 목록을 읽는 중…",
|
|
349
|
+
"ai-assistant.agent.model-gone": "제공처 목록에 없는 모델입니다. 다른 모델을 고르세요.",
|
|
350
|
+
"ai-assistant.agent.advanced": "고급",
|
|
351
|
+
"ai-assistant.agent.base-url": "Base URL",
|
|
352
|
+
"ai-assistant.agent.organization": "Organization",
|
|
353
|
+
"ai-assistant.agent.back-to-key-title": "{domain} 키로 되돌릴까요?",
|
|
354
|
+
"ai-assistant.agent.back-to-key-text": "\"{name}\" 에 넣은 이 사업장의 키를 지우고, {domain} 의 키로 다시 답합니다.",
|
|
355
|
+
"ai-assistant.agent.turn-off-title": "\"{name}\" 을(를) 끌까요?",
|
|
356
|
+
"ai-assistant.agent.turn-off-text": "이 사업장과 {domains} 에서 더 이상 답하지 않습니다.",
|
|
357
|
+
"ai-assistant.agent.delete-below": "{domains} 에서도 더 이상 답하지 않습니다.",
|
|
358
|
+
"ai-assistant.agent.delete-title": "\"{name}\" 을(를) 지울까요?",
|
|
359
|
+
"ai-assistant.agent.delete-text": "API 키도 함께 지워집니다. 이미 남은 사용량 기록은 그대로 둡니다.",
|
|
360
|
+
"ai-assistant.agent.used-below-title": "\"{name}\" 을(를) 쓰는 하위 사업장",
|
|
361
|
+
"ai-assistant.agent.close": "닫기",
|
|
362
|
+
"ai-assistant.agent.save-failed": "저장하지 못했습니다",
|
|
363
|
+
"ai-assistant.agent.confirm": "확인",
|
|
364
|
+
"ai-assistant.usage.title": "AI 사용량",
|
|
365
|
+
"ai-assistant.usage.deleted-agent": "(지운 에이전트)",
|
|
366
|
+
"ai-assistant.usage.today": "오늘",
|
|
367
|
+
"ai-assistant.usage.7d": "7일",
|
|
368
|
+
"ai-assistant.usage.30d": "30일",
|
|
369
|
+
"ai-assistant.usage.by-hour": "시간",
|
|
370
|
+
"ai-assistant.usage.by-day": "일",
|
|
371
|
+
"ai-assistant.usage.by-month": "월",
|
|
372
|
+
"ai-assistant.usage.agent": "에이전트",
|
|
373
|
+
"ai-assistant.usage.all-agents": "모든 에이전트",
|
|
374
|
+
"ai-assistant.usage.person": "사용자",
|
|
375
|
+
"ai-assistant.usage.all-people": "모든 사용자",
|
|
376
|
+
"ai-assistant.usage.include-below": "하위 사업장 포함",
|
|
377
|
+
"ai-assistant.usage.load-failed": "사용량을 읽지 못했습니다.",
|
|
378
|
+
"ai-assistant.usage.loading": "읽는 중…",
|
|
379
|
+
"ai-assistant.usage.empty": "이 기간에 쓴 AI 가 없습니다.",
|
|
380
|
+
"ai-assistant.usage.when": "시점",
|
|
381
|
+
"ai-assistant.usage.calls": "호출",
|
|
382
|
+
"ai-assistant.usage.input-tokens": "입력 토큰",
|
|
383
|
+
"ai-assistant.usage.output-tokens": "출력 토큰",
|
|
384
|
+
"ai-assistant.usage.failures": "실패",
|
|
385
|
+
"ai-assistant.usage.total": "합계",
|
|
386
|
+
"ai-assistant.text.send-to-people-notice": "이 대화의 참여자에게 보냅니다. AI 는 답하지 않습니다."
|
|
321
387
|
}
|
package/translations/ms.json
CHANGED
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
"ai-assistant.session.filters": "Penapis",
|
|
14
14
|
"ai-assistant.session.reset-filters": "Kosongkan carian dan penapis",
|
|
15
15
|
"ai-assistant.session.filtered-empty": "Tiada perbualan yang sepadan untuk subjek ini.",
|
|
16
|
-
"ai-assistant.session.scope-empty": "Belum ada perbualan
|
|
16
|
+
"ai-assistant.session.scope-empty": "Belum ada perbualan.",
|
|
17
17
|
"ai-assistant.session.audience-private": "Peserta sahaja",
|
|
18
18
|
"ai-assistant.session.audience-open": "Semua dalam domain ini",
|
|
19
19
|
"ai-assistant.session.manage": "Urus perbualan",
|
|
@@ -31,16 +31,9 @@
|
|
|
31
31
|
"ai-assistant.label.create": "Cipta",
|
|
32
32
|
"ai-assistant.label.edit": "Edit",
|
|
33
33
|
"ai-assistant.label.style": "Gaya",
|
|
34
|
-
"ai-assistant.label.korean-supported": "Pelbagai bahasa",
|
|
35
|
-
"ai-assistant.label.multi-command": "Arahan kumpulan",
|
|
36
|
-
"ai-assistant.label.review-able": "Boleh disemak",
|
|
37
34
|
"ai-assistant.text.empty-title": "Reka papan bersama AI",
|
|
38
35
|
"ai-assistant.text.empty-subtitle": "Terangkan dalam bahasa biasa dan AI akan mencipta, mengedit dan menggayakan papan. Klik contoh di bawah untuk bermula.",
|
|
39
36
|
"ai-assistant.text.input-placeholder": "Terangkan dalam bahasa biasa (Shift+Enter baris baharu, Enter hantar)",
|
|
40
|
-
"ai-assistant.text.triggers-heading": "Atau mula pantas dengan auto-lengkap",
|
|
41
|
-
"ai-assistant.text.trigger-component-tooltip": "Sebut komponen pada papan",
|
|
42
|
-
"ai-assistant.text.trigger-user-tooltip": "Sebut rakan domain",
|
|
43
|
-
"ai-assistant.text.trigger-insert-tooltip": "Sisip prefab / palet / susun atur / templat arahan",
|
|
44
37
|
"ai-assistant.text.send-tooltip": "Hantar (Enter)",
|
|
45
38
|
"ai-assistant.text.show-examples-tooltip": "Tunjuk contoh arahan biasa",
|
|
46
39
|
"ai-assistant.text.applied-changes": "Diterapkan.",
|
|
@@ -54,9 +47,6 @@
|
|
|
54
47
|
"ai-assistant.example.style-dark-mode": "Mod gelap — latar biru tua, teks putih, aksen teal",
|
|
55
48
|
"ai-assistant.example.style-rounded-shadow": "Bulatkan sudut semua bentuk + bayang kad lembut",
|
|
56
49
|
"ai-assistant.button.new-chat": "Sembang baharu",
|
|
57
|
-
"ai-assistant.label.trigger-component": "Komponen",
|
|
58
|
-
"ai-assistant.label.trigger-user": "Pengguna",
|
|
59
|
-
"ai-assistant.label.trigger-insert": "Sisip",
|
|
60
50
|
"ai-assistant.button.examples": "Contoh",
|
|
61
51
|
"ai-assistant.button.close": "Tutup",
|
|
62
52
|
"ai-assistant.button.revert": "Batalkan",
|
|
@@ -317,5 +307,81 @@
|
|
|
317
307
|
"ai-assistant.text.room-attachments-unavailable": "Lampiran kepada peserta belum disokong. Buang lampiran sebelum menghantar.",
|
|
318
308
|
"ai-assistant.button.reply": "Balas",
|
|
319
309
|
"ai-assistant.button.cancel-reply": "Batal balasan",
|
|
320
|
-
"ai-assistant.text.reply-to": "Balas kepada {name}"
|
|
310
|
+
"ai-assistant.text.reply-to": "Balas kepada {name}",
|
|
311
|
+
"ai-assistant.label.ai-agent": "Ejen AI",
|
|
312
|
+
"ai-assistant.agent.title": "Ejen AI",
|
|
313
|
+
"ai-assistant.agent.load-failed": "Tidak dapat membaca ejen AI.",
|
|
314
|
+
"ai-assistant.agent.retry": "Cuba lagi",
|
|
315
|
+
"ai-assistant.agent.loading": "Membaca…",
|
|
316
|
+
"ai-assistant.agent.add": "Ejen",
|
|
317
|
+
"ai-assistant.agent.inherited-from": "Diwarisi daripada {path}",
|
|
318
|
+
"ai-assistant.agent.this-domain": "Domain ini",
|
|
319
|
+
"ai-assistant.agent.status-on": "AI aktif di sini · {count} ejen boleh dipilih · lalai {name}",
|
|
320
|
+
"ai-assistant.agent.status-no-key": "Tiada ejen yang mempunyai kunci API, jadi AI tidak aktif di sini.",
|
|
321
|
+
"ai-assistant.agent.status-all-off": "Semua ejen dimatikan, jadi AI tidak aktif di sini.",
|
|
322
|
+
"ai-assistant.agent.status-no-agent": "Tiada ejen AI, jadi AI tidak aktif di sini.",
|
|
323
|
+
"ai-assistant.agent.default": "Lalai",
|
|
324
|
+
"ai-assistant.agent.default-hint": "Ejen yang digunakan sebelum memilih",
|
|
325
|
+
"ai-assistant.agent.use": "Guna",
|
|
326
|
+
"ai-assistant.agent.use-here": "Guna di sini",
|
|
327
|
+
"ai-assistant.agent.used-below": "{count} di bawah",
|
|
328
|
+
"ai-assistant.agent.key-this-domain": "Kunci domain ini {hint}",
|
|
329
|
+
"ai-assistant.agent.key-of": "Kunci {domain}",
|
|
330
|
+
"ai-assistant.agent.key-missing": "Tiada kunci",
|
|
331
|
+
"ai-assistant.agent.more": "Lagi",
|
|
332
|
+
"ai-assistant.agent.edit": "Sunting",
|
|
333
|
+
"ai-assistant.agent.delete": "Padam",
|
|
334
|
+
"ai-assistant.agent.replace-own-key": "Ganti kunci domain ini",
|
|
335
|
+
"ai-assistant.agent.use-own-key": "Guna kunci domain ini",
|
|
336
|
+
"ai-assistant.agent.back-to-key": "Kembali ke kunci {domain}",
|
|
337
|
+
"ai-assistant.agent.key-placeholder": "Kunci API domain ini",
|
|
338
|
+
"ai-assistant.agent.cancel": "Batal",
|
|
339
|
+
"ai-assistant.agent.save": "Simpan",
|
|
340
|
+
"ai-assistant.agent.name": "Nama",
|
|
341
|
+
"ai-assistant.agent.provider": "Penyedia",
|
|
342
|
+
"ai-assistant.agent.api-key": "Kunci API",
|
|
343
|
+
"ai-assistant.agent.key-stored": "Kunci tersimpan {hint} - masukkan hanya untuk menukarnya",
|
|
344
|
+
"ai-assistant.agent.model": "Model",
|
|
345
|
+
"ai-assistant.agent.pick-model": "Pilih model",
|
|
346
|
+
"ai-assistant.agent.reload-models": "Baca semula senarai model",
|
|
347
|
+
"ai-assistant.agent.enter-key-first": "Masukkan kunci API untuk memilih model.",
|
|
348
|
+
"ai-assistant.agent.reading-models": "Membaca model penyedia…",
|
|
349
|
+
"ai-assistant.agent.model-gone": "Penyedia tidak lagi menawarkan model ini. Pilih yang lain.",
|
|
350
|
+
"ai-assistant.agent.advanced": "Lanjutan",
|
|
351
|
+
"ai-assistant.agent.base-url": "Base URL",
|
|
352
|
+
"ai-assistant.agent.organization": "Organisasi",
|
|
353
|
+
"ai-assistant.agent.back-to-key-title": "Kembali ke kunci {domain}?",
|
|
354
|
+
"ai-assistant.agent.back-to-key-text": "Kunci domain ini untuk \"{name}\" dipadam, dan kunci {domain} digunakan semula.",
|
|
355
|
+
"ai-assistant.agent.turn-off-title": "Matikan \"{name}\"?",
|
|
356
|
+
"ai-assistant.agent.turn-off-text": "Ia berhenti menjawab di sini dan di {domains}.",
|
|
357
|
+
"ai-assistant.agent.delete-below": "Ia juga berhenti menjawab di {domains}.",
|
|
358
|
+
"ai-assistant.agent.delete-title": "Padam \"{name}\"?",
|
|
359
|
+
"ai-assistant.agent.delete-text": "Kunci API dipadam bersama. Penggunaan yang telah direkodkan kekal.",
|
|
360
|
+
"ai-assistant.agent.used-below-title": "Domain di bawah yang menggunakan \"{name}\"",
|
|
361
|
+
"ai-assistant.agent.close": "Tutup",
|
|
362
|
+
"ai-assistant.agent.save-failed": "Tidak disimpan",
|
|
363
|
+
"ai-assistant.agent.confirm": "Sahkan",
|
|
364
|
+
"ai-assistant.usage.title": "Penggunaan AI",
|
|
365
|
+
"ai-assistant.usage.deleted-agent": "(ejen dipadam)",
|
|
366
|
+
"ai-assistant.usage.today": "Hari ini",
|
|
367
|
+
"ai-assistant.usage.7d": "7 hari",
|
|
368
|
+
"ai-assistant.usage.30d": "30 hari",
|
|
369
|
+
"ai-assistant.usage.by-hour": "Jam",
|
|
370
|
+
"ai-assistant.usage.by-day": "Hari",
|
|
371
|
+
"ai-assistant.usage.by-month": "Bulan",
|
|
372
|
+
"ai-assistant.usage.agent": "Ejen",
|
|
373
|
+
"ai-assistant.usage.all-agents": "Semua ejen",
|
|
374
|
+
"ai-assistant.usage.person": "Pengguna",
|
|
375
|
+
"ai-assistant.usage.all-people": "Semua orang",
|
|
376
|
+
"ai-assistant.usage.include-below": "Termasuk domain di bawah",
|
|
377
|
+
"ai-assistant.usage.load-failed": "Tidak dapat membaca penggunaan.",
|
|
378
|
+
"ai-assistant.usage.loading": "Membaca…",
|
|
379
|
+
"ai-assistant.usage.empty": "Tiada AI digunakan dalam tempoh ini.",
|
|
380
|
+
"ai-assistant.usage.when": "Bila",
|
|
381
|
+
"ai-assistant.usage.calls": "Panggilan",
|
|
382
|
+
"ai-assistant.usage.input-tokens": "Token input",
|
|
383
|
+
"ai-assistant.usage.output-tokens": "Token output",
|
|
384
|
+
"ai-assistant.usage.failures": "Gagal",
|
|
385
|
+
"ai-assistant.usage.total": "Jumlah",
|
|
386
|
+
"ai-assistant.text.send-to-people-notice": "Ini dihantar kepada peserta perbualan ini. AI tidak menjawabnya."
|
|
321
387
|
}
|
package/translations/zh.json
CHANGED
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
"ai-assistant.session.filters": "筛选",
|
|
14
14
|
"ai-assistant.session.reset-filters": "清除搜索和筛选",
|
|
15
15
|
"ai-assistant.session.filtered-empty": "此对象没有符合条件的对话。",
|
|
16
|
-
"ai-assistant.session.scope-empty": "
|
|
16
|
+
"ai-assistant.session.scope-empty": "尚无对话。",
|
|
17
17
|
"ai-assistant.session.audience-private": "仅参与者",
|
|
18
18
|
"ai-assistant.session.audience-open": "组织内公开",
|
|
19
19
|
"ai-assistant.session.manage": "管理对话",
|
|
@@ -31,16 +31,9 @@
|
|
|
31
31
|
"ai-assistant.label.create": "创建",
|
|
32
32
|
"ai-assistant.label.edit": "编辑",
|
|
33
33
|
"ai-assistant.label.style": "样式",
|
|
34
|
-
"ai-assistant.label.korean-supported": "多语言",
|
|
35
|
-
"ai-assistant.label.multi-command": "批量命令",
|
|
36
|
-
"ai-assistant.label.review-able": "可审核",
|
|
37
34
|
"ai-assistant.text.empty-title": "与 AI 一起设计看板",
|
|
38
35
|
"ai-assistant.text.empty-subtitle": "用自然语言描述,AI 将创建、编辑和样式化看板。点击下方示例开始。",
|
|
39
36
|
"ai-assistant.text.input-placeholder": "用自然语言描述 (Shift+Enter 换行, Enter 发送)",
|
|
40
|
-
"ai-assistant.text.triggers-heading": "或用自动完成快速开始",
|
|
41
|
-
"ai-assistant.text.trigger-component-tooltip": "提及看板上的组件",
|
|
42
|
-
"ai-assistant.text.trigger-user-tooltip": "提及$t(term.domain)内同事",
|
|
43
|
-
"ai-assistant.text.trigger-insert-tooltip": "插入预制 / 调色板 / 布局 / 命令模板",
|
|
44
37
|
"ai-assistant.text.send-tooltip": "发送 (Enter)",
|
|
45
38
|
"ai-assistant.text.show-examples-tooltip": "显示常用命令示例",
|
|
46
39
|
"ai-assistant.text.applied-changes": "已应用。",
|
|
@@ -54,9 +47,6 @@
|
|
|
54
47
|
"ai-assistant.example.style-dark-mode": "深色模式 — 深蓝背景、白色文字、青色强调",
|
|
55
48
|
"ai-assistant.example.style-rounded-shadow": "所有图形圆角 + 柔和卡片阴影",
|
|
56
49
|
"ai-assistant.button.new-chat": "新对话",
|
|
57
|
-
"ai-assistant.label.trigger-component": "组件",
|
|
58
|
-
"ai-assistant.label.trigger-user": "用户",
|
|
59
|
-
"ai-assistant.label.trigger-insert": "插入",
|
|
60
50
|
"ai-assistant.button.examples": "示例",
|
|
61
51
|
"ai-assistant.button.close": "关闭",
|
|
62
52
|
"ai-assistant.button.revert": "撤销",
|
|
@@ -317,5 +307,81 @@
|
|
|
317
307
|
"ai-assistant.text.room-attachments-unavailable": "暂不支持向参与者发送附件。请先移除附件再发送。",
|
|
318
308
|
"ai-assistant.button.reply": "回复",
|
|
319
309
|
"ai-assistant.button.cancel-reply": "取消回复",
|
|
320
|
-
"ai-assistant.text.reply-to": "回复 {name}"
|
|
310
|
+
"ai-assistant.text.reply-to": "回复 {name}",
|
|
311
|
+
"ai-assistant.label.ai-agent": "AI 代理",
|
|
312
|
+
"ai-assistant.agent.title": "AI 代理",
|
|
313
|
+
"ai-assistant.agent.load-failed": "无法读取 AI 代理。",
|
|
314
|
+
"ai-assistant.agent.retry": "重试",
|
|
315
|
+
"ai-assistant.agent.loading": "读取中…",
|
|
316
|
+
"ai-assistant.agent.add": "代理",
|
|
317
|
+
"ai-assistant.agent.inherited-from": "继承自 {path}",
|
|
318
|
+
"ai-assistant.agent.this-domain": "此站点",
|
|
319
|
+
"ai-assistant.agent.status-on": "此站点的 AI:可用 · 可选代理 {count} 个 · 默认 {name}",
|
|
320
|
+
"ai-assistant.agent.status-no-key": "没有设置 API 密钥的代理,此站点无法使用 AI。",
|
|
321
|
+
"ai-assistant.agent.status-all-off": "所有代理都已关闭,此站点无法使用 AI。",
|
|
322
|
+
"ai-assistant.agent.status-no-agent": "没有 AI 代理,此站点无法使用 AI。",
|
|
323
|
+
"ai-assistant.agent.default": "默认",
|
|
324
|
+
"ai-assistant.agent.default-hint": "未选择时使用的代理",
|
|
325
|
+
"ai-assistant.agent.use": "使用",
|
|
326
|
+
"ai-assistant.agent.use-here": "在此站点使用",
|
|
327
|
+
"ai-assistant.agent.used-below": "下级 {count} 个",
|
|
328
|
+
"ai-assistant.agent.key-this-domain": "此站点的密钥 {hint}",
|
|
329
|
+
"ai-assistant.agent.key-of": "{domain} 的密钥",
|
|
330
|
+
"ai-assistant.agent.key-missing": "无密钥",
|
|
331
|
+
"ai-assistant.agent.more": "更多",
|
|
332
|
+
"ai-assistant.agent.edit": "编辑",
|
|
333
|
+
"ai-assistant.agent.delete": "删除",
|
|
334
|
+
"ai-assistant.agent.replace-own-key": "更换此站点的密钥",
|
|
335
|
+
"ai-assistant.agent.use-own-key": "使用此站点的密钥",
|
|
336
|
+
"ai-assistant.agent.back-to-key": "恢复使用 {domain} 的密钥",
|
|
337
|
+
"ai-assistant.agent.key-placeholder": "此站点的 API 密钥",
|
|
338
|
+
"ai-assistant.agent.cancel": "取消",
|
|
339
|
+
"ai-assistant.agent.save": "保存",
|
|
340
|
+
"ai-assistant.agent.name": "名称",
|
|
341
|
+
"ai-assistant.agent.provider": "提供商",
|
|
342
|
+
"ai-assistant.agent.api-key": "API 密钥",
|
|
343
|
+
"ai-assistant.agent.key-stored": "已保存的密钥 {hint} — 仅在更换时输入",
|
|
344
|
+
"ai-assistant.agent.model": "模型",
|
|
345
|
+
"ai-assistant.agent.pick-model": "选择模型",
|
|
346
|
+
"ai-assistant.agent.reload-models": "重新读取模型列表",
|
|
347
|
+
"ai-assistant.agent.enter-key-first": "输入 API 密钥后即可选择模型。",
|
|
348
|
+
"ai-assistant.agent.reading-models": "正在读取提供商的模型列表…",
|
|
349
|
+
"ai-assistant.agent.model-gone": "提供商已不再提供此模型。请选择其他模型。",
|
|
350
|
+
"ai-assistant.agent.advanced": "高级",
|
|
351
|
+
"ai-assistant.agent.base-url": "Base URL",
|
|
352
|
+
"ai-assistant.agent.organization": "Organization",
|
|
353
|
+
"ai-assistant.agent.back-to-key-title": "恢复使用 {domain} 的密钥吗?",
|
|
354
|
+
"ai-assistant.agent.back-to-key-text": "将删除此站点为“{name}”设置的密钥,改由 {domain} 的密钥应答。",
|
|
355
|
+
"ai-assistant.agent.turn-off-title": "关闭“{name}”吗?",
|
|
356
|
+
"ai-assistant.agent.turn-off-text": "它将不再在此站点和 {domains} 中应答。",
|
|
357
|
+
"ai-assistant.agent.delete-below": "它也将不再在 {domains} 中应答。",
|
|
358
|
+
"ai-assistant.agent.delete-title": "删除“{name}”吗?",
|
|
359
|
+
"ai-assistant.agent.delete-text": "API 密钥会一并删除。已记录的用量保留。",
|
|
360
|
+
"ai-assistant.agent.used-below-title": "使用“{name}”的下级站点",
|
|
361
|
+
"ai-assistant.agent.close": "关闭",
|
|
362
|
+
"ai-assistant.agent.save-failed": "未保存",
|
|
363
|
+
"ai-assistant.agent.confirm": "确认",
|
|
364
|
+
"ai-assistant.usage.title": "AI 用量",
|
|
365
|
+
"ai-assistant.usage.deleted-agent": "(已删除的代理)",
|
|
366
|
+
"ai-assistant.usage.today": "今天",
|
|
367
|
+
"ai-assistant.usage.7d": "7 天",
|
|
368
|
+
"ai-assistant.usage.30d": "30 天",
|
|
369
|
+
"ai-assistant.usage.by-hour": "小时",
|
|
370
|
+
"ai-assistant.usage.by-day": "天",
|
|
371
|
+
"ai-assistant.usage.by-month": "月",
|
|
372
|
+
"ai-assistant.usage.agent": "代理",
|
|
373
|
+
"ai-assistant.usage.all-agents": "所有代理",
|
|
374
|
+
"ai-assistant.usage.person": "用户",
|
|
375
|
+
"ai-assistant.usage.all-people": "所有用户",
|
|
376
|
+
"ai-assistant.usage.include-below": "包含下级站点",
|
|
377
|
+
"ai-assistant.usage.load-failed": "无法读取用量。",
|
|
378
|
+
"ai-assistant.usage.loading": "读取中…",
|
|
379
|
+
"ai-assistant.usage.empty": "此期间未使用 AI。",
|
|
380
|
+
"ai-assistant.usage.when": "时间",
|
|
381
|
+
"ai-assistant.usage.calls": "调用",
|
|
382
|
+
"ai-assistant.usage.input-tokens": "输入令牌",
|
|
383
|
+
"ai-assistant.usage.output-tokens": "输出令牌",
|
|
384
|
+
"ai-assistant.usage.failures": "失败",
|
|
385
|
+
"ai-assistant.usage.total": "合计",
|
|
386
|
+
"ai-assistant.text.send-to-people-notice": "此消息发送给本会话的参与者,AI 不会回复。"
|
|
321
387
|
}
|
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* What this guards: **the empty chat does not teach what this surface cannot do.**
|
|
3
|
-
*
|
|
4
|
-
* operato-figure mounted the chat and its empty screen offered all three triggers. `#` mentions
|
|
5
|
-
* components of a document figure has none of; `/` inserts templates figure registered none of,
|
|
6
|
-
* so the popup opens empty. Neither errors — they just do nothing, which reads as broken rather
|
|
7
|
-
* than not applicable.
|
|
8
|
-
*/
|
|
9
|
-
import { availableTriggers } from './chat-triggers'
|
|
10
|
-
|
|
11
|
-
const chars = (availability: any) => availableTriggers(availability).map(chip => chip.char)
|
|
12
|
-
|
|
13
|
-
const board = { hasMentionableThings: true, hasSession: true, slashTemplateCount: 12 }
|
|
14
|
-
const figure = { hasMentionableThings: false, hasSession: true, slashTemplateCount: 0 }
|
|
15
|
-
|
|
16
|
-
describe('a board authoring surface', () => {
|
|
17
|
-
it('offers all three', () => {
|
|
18
|
-
expect(chars(board)).toEqual(['#', '@', '/'])
|
|
19
|
-
})
|
|
20
|
-
})
|
|
21
|
-
|
|
22
|
-
describe('a surface with no document of its own', () => {
|
|
23
|
-
it('★ does not offer # — there is nothing to mention', () => {
|
|
24
|
-
expect(chars(figure)).not.toContain('#')
|
|
25
|
-
})
|
|
26
|
-
|
|
27
|
-
it('★ does not offer / — nobody registered a template, so the popup would open empty', () => {
|
|
28
|
-
expect(chars(figure)).not.toContain('/')
|
|
29
|
-
})
|
|
30
|
-
|
|
31
|
-
it('still offers @ — mentioning a colleague works wherever a conversation is stored', () => {
|
|
32
|
-
expect(chars(figure)).toEqual(['@'])
|
|
33
|
-
})
|
|
34
|
-
})
|
|
35
|
-
|
|
36
|
-
describe('each chip is read off the one thing it needs', () => {
|
|
37
|
-
it('a declared type list is enough for # — a live document is not required', () => {
|
|
38
|
-
expect(chars({ ...figure, hasMentionableThings: true })).toContain('#')
|
|
39
|
-
})
|
|
40
|
-
|
|
41
|
-
it('an ad-hoc turn has no @ — a mention notifies a participant and there is no conversation to join', () => {
|
|
42
|
-
expect(chars({ ...board, hasSession: false })).not.toContain('@')
|
|
43
|
-
})
|
|
44
|
-
|
|
45
|
-
it('one registered template is enough for /', () => {
|
|
46
|
-
expect(chars({ ...figure, slashTemplateCount: 1 })).toContain('/')
|
|
47
|
-
})
|
|
48
|
-
})
|
|
49
|
-
|
|
50
|
-
describe('what the row looks like when nothing is available', () => {
|
|
51
|
-
it('★ empty, so the caller can leave the whole row out rather than draw a heading over nothing', () => {
|
|
52
|
-
expect(availableTriggers({ hasMentionableThings: false, hasSession: false, slashTemplateCount: 0 })).toEqual([])
|
|
53
|
-
})
|
|
54
|
-
})
|
|
55
|
-
|
|
56
|
-
describe('order', () => {
|
|
57
|
-
it('stays # @ / regardless of which ones survive — it is the order people learned', () => {
|
|
58
|
-
expect(chars({ hasMentionableThings: true, hasSession: false, slashTemplateCount: 3 })).toEqual(['#', '/'])
|
|
59
|
-
})
|
|
60
|
-
})
|
|
61
|
-
|
|
62
|
-
describe('every chip carries its own words', () => {
|
|
63
|
-
it('label and tooltip keys are distinct per chip — one shared key would caption them all alike', () => {
|
|
64
|
-
const chips = availableTriggers(board)
|
|
65
|
-
const labels = new Set(chips.map(chip => chip.labelKey))
|
|
66
|
-
const tooltips = new Set(chips.map(chip => chip.tooltipKey))
|
|
67
|
-
|
|
68
|
-
expect(labels.size).toBe(chips.length)
|
|
69
|
-
expect(tooltips.size).toBe(chips.length)
|
|
70
|
-
for (const chip of chips) expect(chip.labelKey.startsWith('ai-assistant.')).toBe(true)
|
|
71
|
-
})
|
|
72
|
-
})
|
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Which trigger characters a chat surface can actually use — **asked, not declared.**
|
|
3
|
-
*
|
|
4
|
-
* All three chips (`#` `@` `/`) were always drawn. On operato-figure that taught two things the
|
|
5
|
-
* surface cannot do: `#` mentions components of a document figure has none of, and `/` inserts
|
|
6
|
-
* templates figure registered none of, so the popup opens empty.
|
|
7
|
-
*
|
|
8
|
-
* A chip that opens nothing is worse than an absent one. The reader does not conclude "not
|
|
9
|
-
* applicable here" — they conclude the feature is broken, and they are half right.
|
|
10
|
-
*
|
|
11
|
-
* So each chip is read off the thing it needs. A host that gains a document, a stored session or
|
|
12
|
-
* a template set gets the chip with no extra declaration; one that never does never shows it.
|
|
13
|
-
* Same shape as lite-menu deciding whether the board menu type is selectable by asking whether
|
|
14
|
-
* its renderer is registered, rather than declaring that it is.
|
|
15
|
-
*/
|
|
16
|
-
|
|
17
|
-
/** What the surface has to offer, as plain facts. The caller reads these off itself. */
|
|
18
|
-
export interface TriggerAvailability {
|
|
19
|
-
/** Something to mention: a live document, a static one, or a declared type list. */
|
|
20
|
-
hasMentionableThings: boolean
|
|
21
|
-
/** A stored conversation. A `@` mention notifies a participant, and an ad-hoc turn has none. */
|
|
22
|
-
hasSession: boolean
|
|
23
|
-
/** How many insertable templates the host registered. */
|
|
24
|
-
slashTemplateCount: number
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
export interface TriggerChip {
|
|
28
|
-
char: '#' | '@' | '/'
|
|
29
|
-
labelKey: string
|
|
30
|
-
tooltipKey: string
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
/** Order is fixed: `#` `@` `/`. It is the order people learned, so it does not follow availability. */
|
|
34
|
-
export function availableTriggers(availability: TriggerAvailability): TriggerChip[] {
|
|
35
|
-
const chips: TriggerChip[] = []
|
|
36
|
-
|
|
37
|
-
if (availability.hasMentionableThings) {
|
|
38
|
-
chips.push({
|
|
39
|
-
char: '#',
|
|
40
|
-
labelKey: 'ai-assistant.label.trigger-component',
|
|
41
|
-
tooltipKey: 'ai-assistant.text.trigger-component-tooltip'
|
|
42
|
-
})
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
if (availability.hasSession) {
|
|
46
|
-
chips.push({
|
|
47
|
-
char: '@',
|
|
48
|
-
labelKey: 'ai-assistant.label.trigger-user',
|
|
49
|
-
tooltipKey: 'ai-assistant.text.trigger-user-tooltip'
|
|
50
|
-
})
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
if (availability.slashTemplateCount > 0) {
|
|
54
|
-
chips.push({
|
|
55
|
-
char: '/',
|
|
56
|
-
labelKey: 'ai-assistant.label.trigger-insert',
|
|
57
|
-
tooltipKey: 'ai-assistant.text.trigger-insert-tooltip'
|
|
58
|
-
})
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
return chips
|
|
62
|
-
}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
/** What the surface has to offer, as plain facts. The caller reads these off itself. */
|
|
2
|
-
export interface TriggerAvailability {
|
|
3
|
-
/** Something to mention: a live document, a static one, or a declared type list. */
|
|
4
|
-
hasMentionableThings: boolean;
|
|
5
|
-
/** A stored conversation. A `@` mention notifies a participant, and an ad-hoc turn has none. */
|
|
6
|
-
hasSession: boolean;
|
|
7
|
-
/** How many insertable templates the host registered. */
|
|
8
|
-
slashTemplateCount: number;
|
|
9
|
-
}
|
|
10
|
-
export interface TriggerChip {
|
|
11
|
-
char: '#' | '@' | '/';
|
|
12
|
-
labelKey: string;
|
|
13
|
-
tooltipKey: string;
|
|
14
|
-
}
|
|
15
|
-
/** Order is fixed: `#` `@` `/`. It is the order people learned, so it does not follow availability. */
|
|
16
|
-
export declare function availableTriggers(availability: TriggerAvailability): TriggerChip[];
|