@things-factory/ai-assistant 10.1.208 → 10.1.212

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 (167) hide show
  1. package/client/components/assistant-chat.ts +238 -9
  2. package/client/components/assistant-dock.ts +9 -4
  3. package/client/components/assistant-invite.ts +138 -0
  4. package/client/components/assistant-session-manager.ts +53 -12
  5. package/client/components/proposal-request.test.ts +10 -0
  6. package/client/components/roster-identity.test.ts +2 -12
  7. package/client/components/roster-identity.ts +0 -6
  8. package/client/utils/assistant-session-actions.ts +3 -1
  9. package/client/utils/assistant-session-admin.ts +9 -2
  10. package/client/utils/assistant-session-controller.ts +1 -1
  11. package/client/utils/assistant-typing.test.ts +33 -0
  12. package/client/utils/assistant-typing.ts +53 -0
  13. package/dist-client/components/assistant-chat.d.ts +28 -0
  14. package/dist-client/components/assistant-chat.js +259 -8
  15. package/dist-client/components/assistant-chat.js.map +1 -1
  16. package/dist-client/components/assistant-dock.js +12 -4
  17. package/dist-client/components/assistant-dock.js.map +1 -1
  18. package/dist-client/components/assistant-invite.d.ts +39 -0
  19. package/dist-client/components/assistant-invite.js +150 -0
  20. package/dist-client/components/assistant-invite.js.map +1 -0
  21. package/dist-client/components/assistant-session-manager.d.ts +5 -1
  22. package/dist-client/components/assistant-session-manager.js +40 -10
  23. package/dist-client/components/assistant-session-manager.js.map +1 -1
  24. package/dist-client/components/proposal-request.test.js +8 -0
  25. package/dist-client/components/proposal-request.test.js.map +1 -1
  26. package/dist-client/components/roster-identity.d.ts +0 -2
  27. package/dist-client/components/roster-identity.js +0 -7
  28. package/dist-client/components/roster-identity.js.map +1 -1
  29. package/dist-client/components/roster-identity.test.js +2 -13
  30. package/dist-client/components/roster-identity.test.js.map +1 -1
  31. package/dist-client/tsconfig.tsbuildinfo +1 -1
  32. package/dist-client/utils/assistant-session-actions.d.ts +1 -0
  33. package/dist-client/utils/assistant-session-actions.js +3 -1
  34. package/dist-client/utils/assistant-session-actions.js.map +1 -1
  35. package/dist-client/utils/assistant-session-admin.d.ts +5 -2
  36. package/dist-client/utils/assistant-session-admin.js +3 -0
  37. package/dist-client/utils/assistant-session-admin.js.map +1 -1
  38. package/dist-client/utils/assistant-session-controller.d.ts +1 -1
  39. package/dist-client/utils/assistant-session-controller.js.map +1 -1
  40. package/dist-client/utils/assistant-typing.d.ts +20 -0
  41. package/dist-client/utils/assistant-typing.js +48 -0
  42. package/dist-client/utils/assistant-typing.js.map +1 -0
  43. package/dist-client/utils/assistant-typing.test.d.ts +1 -0
  44. package/dist-client/utils/assistant-typing.test.js +30 -0
  45. package/dist-client/utils/assistant-typing.test.js.map +1 -0
  46. package/dist-server/service/assistant-chat-resolver.js +5 -12
  47. package/dist-server/service/assistant-chat-resolver.js.map +1 -1
  48. package/dist-server/service/assistant-mode/index.d.ts +1 -1
  49. package/dist-server/service/assistant-mode/index.js +2 -1
  50. package/dist-server/service/assistant-mode/index.js.map +1 -1
  51. package/dist-server/service/assistant-mode/mode-categories.js +9 -2
  52. package/dist-server/service/assistant-mode/mode-categories.js.map +1 -1
  53. package/dist-server/service/assistant-mode/screen-rules.d.ts +6 -0
  54. package/dist-server/service/assistant-mode/screen-rules.js +10 -3
  55. package/dist-server/service/assistant-mode/screen-rules.js.map +1 -1
  56. package/dist-server/service/chat-message/chat-message-room.js +3 -1
  57. package/dist-server/service/chat-message/chat-message-room.js.map +1 -1
  58. package/dist-server/service/chat-message/chat-typing-subscription.d.ts +10 -0
  59. package/dist-server/service/chat-message/chat-typing-subscription.js +68 -0
  60. package/dist-server/service/chat-message/chat-typing-subscription.js.map +1 -0
  61. package/dist-server/service/chat-message/chat-typing.d.ts +28 -0
  62. package/dist-server/service/chat-message/chat-typing.js +40 -0
  63. package/dist-server/service/chat-message/chat-typing.js.map +1 -0
  64. package/dist-server/service/chat-session/attachment-tool-result.d.ts +1 -0
  65. package/dist-server/service/chat-session/attachment-tool-result.js +6 -0
  66. package/dist-server/service/chat-session/attachment-tool-result.js.map +1 -1
  67. package/dist-server/service/chat-session/attachment-tools.js +2 -2
  68. package/dist-server/service/chat-session/attachment-tools.js.map +1 -1
  69. package/dist-server/service/chat-session/chat-session.d.ts +2 -1
  70. package/dist-server/service/chat-session/chat-session.js +1 -1
  71. package/dist-server/service/chat-session/chat-session.js.map +1 -1
  72. package/dist-server/service/chat-session/session-activity-broadcast.d.ts +12 -0
  73. package/dist-server/service/chat-session/session-activity-broadcast.js +15 -0
  74. package/dist-server/service/chat-session/session-activity-broadcast.js.map +1 -1
  75. package/dist-server/service/chat-session/session-activity-publish.d.ts +2 -0
  76. package/dist-server/service/chat-session/session-activity-publish.js +5 -2
  77. package/dist-server/service/chat-session/session-activity-publish.js.map +1 -1
  78. package/dist-server/service/chat-session/session-visibility.d.ts +17 -2
  79. package/dist-server/service/chat-session/session-visibility.js +28 -3
  80. package/dist-server/service/chat-session/session-visibility.js.map +1 -1
  81. package/dist-server/service/chat-session/session-write-gate.d.ts +1 -1
  82. package/dist-server/service/chat-session/session-write-gate.js +1 -1
  83. package/dist-server/service/chat-session/session-write-gate.js.map +1 -1
  84. package/dist-server/service/chat-session-participant/index.d.ts +1 -0
  85. package/dist-server/service/chat-session-participant/index.js +4 -1
  86. package/dist-server/service/chat-session-participant/index.js.map +1 -1
  87. package/dist-server/service/chat-session-participant/invite-notification.d.ts +16 -1
  88. package/dist-server/service/chat-session-participant/invite-notification.js +34 -5
  89. package/dist-server/service/chat-session-participant/invite-notification.js.map +1 -1
  90. package/dist-server/service/chat-session-participant/mention-invite.d.ts +30 -4
  91. package/dist-server/service/chat-session-participant/mention-invite.js +78 -31
  92. package/dist-server/service/chat-session-participant/mention-invite.js.map +1 -1
  93. package/dist-server/service/chat-session-participant/read-roster.js +5 -2
  94. package/dist-server/service/chat-session-participant/read-roster.js.map +1 -1
  95. package/dist-server/service/chat-session-resolver.d.ts +27 -0
  96. package/dist-server/service/chat-session-resolver.js +226 -25
  97. package/dist-server/service/chat-session-resolver.js.map +1 -1
  98. package/dist-server/service/data-entry/entry-target.d.ts +6 -0
  99. package/dist-server/service/data-entry/entry-target.js.map +1 -1
  100. package/dist-server/service/data-entry/entry-tools.js +2 -2
  101. package/dist-server/service/data-entry/entry-tools.js.map +1 -1
  102. package/dist-server/service/data-entry/entry-update.js +1 -1
  103. package/dist-server/service/data-entry/entry-update.js.map +1 -1
  104. package/dist-server/service/data-read/list-read.d.ts +10 -0
  105. package/dist-server/service/data-read/list-read.js +12 -0
  106. package/dist-server/service/data-read/list-read.js.map +1 -1
  107. package/dist-server/service/data-read/read-target.d.ts +5 -0
  108. package/dist-server/service/data-read/read-target.js.map +1 -1
  109. package/dist-server/service/index.d.ts +4 -2
  110. package/dist-server/service/index.js +9 -1
  111. package/dist-server/service/index.js.map +1 -1
  112. package/dist-server/service/testing/conversation-script.d.ts +1 -1
  113. package/dist-server/service/testing/conversation-script.js.map +1 -1
  114. package/dist-server/service/testing/mode-conformance.js +2 -0
  115. package/dist-server/service/testing/mode-conformance.js.map +1 -1
  116. package/dist-server/tsconfig.tsbuildinfo +1 -1
  117. package/package.json +6 -6
  118. package/server/service/assistant-chat-resolver.ts +7 -12
  119. package/server/service/assistant-mode/index.ts +1 -1
  120. package/server/service/assistant-mode/mode-categories.ts +11 -3
  121. package/server/service/assistant-mode/mode-front.test.ts +53 -1
  122. package/server/service/assistant-mode/screen-rules.test.ts +7 -1
  123. package/server/service/assistant-mode/screen-rules.ts +11 -2
  124. package/server/service/chat-message/chat-message-room.test.ts +7 -2
  125. package/server/service/chat-message/chat-message-room.ts +3 -1
  126. package/server/service/chat-message/chat-typing-subscription.ts +52 -0
  127. package/server/service/chat-message/chat-typing.test.ts +45 -0
  128. package/server/service/chat-message/chat-typing.ts +48 -0
  129. package/server/service/chat-session/attachment-tool-result.test.ts +9 -1
  130. package/server/service/chat-session/attachment-tool-result.ts +7 -0
  131. package/server/service/chat-session/attachment-tools.ts +3 -3
  132. package/server/service/chat-session/chat-session.ts +3 -2
  133. package/server/service/chat-session/group-room.test.ts +233 -0
  134. package/server/service/chat-session/session-activity-broadcast.ts +20 -0
  135. package/server/service/chat-session/session-activity-publish.ts +6 -1
  136. package/server/service/chat-session/session-activity-receivers.test.ts +26 -0
  137. package/server/service/chat-session/session-visibility.test.ts +32 -1
  138. package/server/service/chat-session/session-visibility.ts +33 -4
  139. package/server/service/chat-session/session-write-gate.test.ts +7 -1
  140. package/server/service/chat-session/session-write-gate.ts +2 -2
  141. package/server/service/chat-session-participant/index.ts +2 -0
  142. package/server/service/chat-session-participant/invite-notification.test.ts +36 -1
  143. package/server/service/chat-session-participant/invite-notification.ts +43 -5
  144. package/server/service/chat-session-participant/mention-invite.test.ts +49 -1
  145. package/server/service/chat-session-participant/mention-invite.ts +82 -28
  146. package/server/service/chat-session-participant/read-roster.test.ts +13 -4
  147. package/server/service/chat-session-participant/read-roster.ts +6 -3
  148. package/server/service/chat-session-resolver.ts +204 -27
  149. package/server/service/data-entry/data-entry-update.test.ts +8 -0
  150. package/server/service/data-entry/entry-target.ts +6 -0
  151. package/server/service/data-entry/entry-tools.ts +2 -2
  152. package/server/service/data-entry/entry-update.ts +1 -1
  153. package/server/service/data-read/list-missing.test.ts +49 -0
  154. package/server/service/data-read/list-read.ts +18 -0
  155. package/server/service/data-read/read-target.ts +5 -0
  156. package/server/service/index.ts +6 -1
  157. package/server/service/testing/conversation-script.ts +1 -1
  158. package/server/service/testing/mode-conformance.ts +1 -0
  159. package/test/assistant-dock.test.ts +5 -1
  160. package/test/assistant-session-manager.test.ts +4 -2
  161. package/test/open-doors.test.ts +10 -5
  162. package/translations/en.json +29 -4
  163. package/translations/es.json +29 -4
  164. package/translations/ja.json +29 -4
  165. package/translations/ko.json +30 -5
  166. package/translations/ms.json +29 -4
  167. package/translations/zh.json +29 -4
@@ -33,6 +33,12 @@ export interface ListRead {
33
33
  route?: string
34
34
  /** The route has a URL-bound grid. Otherwise conditions are disclosed as not applied on its screen card. */
35
35
  screenQuery?: boolean
36
+ /**
37
+ * What a row may be missing - the screen's own "no counterparty", "no account subject" filters - the `missing`
38
+ * condition. Asked to fill the bank lines' unregistered parties, the model had no way to say "unregistered" and
39
+ * searched the asker's own name (2026-10-24).
40
+ */
41
+ missing?: { name: string; description: string; filters: ReadFilter[] }[]
36
42
  }
37
43
 
38
44
  /** The money column a minimum or maximum amount means - `amount` when there is one, else the first summed column. */
@@ -62,6 +68,18 @@ export function listReadTarget(list: ListRead): ReadTarget {
62
68
  ...(list.status
63
69
  ? [{ name: 'status', type: 'enum', values: list.status.values, labelKey: 'ai-assistant.read.status', filter: (v: any) => ({ name: list.status!.field, operator: 'eq', value: v }) }]
64
70
  : []),
71
+ ...(list.missing?.length
72
+ ? [
73
+ {
74
+ name: 'missing',
75
+ type: 'enum',
76
+ values: list.missing.map(one => one.name),
77
+ labelKey: 'ai-assistant.read.missing',
78
+ description: `the rows missing one thing: ${list.missing.map(one => `${one.name} - ${one.description}`).join('; ')}`,
79
+ filter: (v: any) => list.missing!.find(one => one.name === v)!.filters
80
+ }
81
+ ]
82
+ : []),
65
83
  ...(amount
66
84
  ? [
67
85
  { name: 'minAmount', type: 'number', labelKey: 'ai-assistant.read.min-amount', description: `at least this ${amount}${inCurrency}`, filter: (v: any) => ({ name: amount, operator: 'gte', value: v }) },
@@ -162,6 +162,11 @@ export interface DetailRead {
162
162
  /** One query with one root field. Its variables are the arguments - each declared in `args`. */
163
163
  query: string
164
164
  args?: DetailArg[]
165
+ /**
166
+ * The records the answer is about, whose screens put it in front (EntryTarget.axes) - the management check answers
167
+ * for any ledger record; asked on a deposit's 360 why it was in the check, the model never opened it (2026-10-24).
168
+ */
169
+ axes?: string[]
165
170
  }
166
171
 
167
172
  /** Characters of an answer handed to the model - a longer one is refused, and the model narrows it. */
@@ -5,6 +5,7 @@ import { AssistantCapabilityResolver } from './assistant-capability-resolver.js'
5
5
  import { AiAgentResolver } from './ai-agent-resolver.js'
6
6
  import { MySessionActivitySubscription } from './chat-session/session-activity-subscription.js'
7
7
  import { ChatMessageSubscription } from './chat-message/chat-message-subscription.js'
8
+ import { ChatTypingSubscription } from './chat-message/chat-typing-subscription.js'
8
9
  import { entities as ChatSessionEntities } from './chat-session/index.js'
9
10
  import { entities as ChatMessageEntities } from './chat-message/index.js'
10
11
  import { entities as ChatSessionParticipantEntities } from './chat-session-participant/index.js'
@@ -29,7 +30,9 @@ export * from './assistant-capability-resolver.js'
29
30
  export * from './tool-access.js'
30
31
  /* Data entry from material - an app registers what it can enter; a mode names it (design/ai/data-entry.md). */
31
32
  export * from './data-entry/entry-target.js'
32
- export { registerEntryTarget, entryCategoryOf } from './data-entry/entry-tools.js'
33
+ export { registerEntryTarget, entryCategoryOf, runAsCaller } from './data-entry/entry-tools.js'
34
+ /* An application's tool that prepares many changes at once makes the same change card the model's would (2026-10-24). */
35
+ export { proposeChanges, MAX_CHANGES } from './data-entry/entry-update.js'
33
36
  /* Reading an application's lists - an app registers what it lets read; a mode names it (design/ai/read-targets.md). */
34
37
  export * from './data-read/read-target.js'
35
38
  export { registerReadTarget, readCategoryOf, registerDetailRead, detailCategoryOf } from './data-read/read-tools.js'
@@ -79,6 +82,8 @@ export const schema = {
79
82
  /* A domain's AI agents - the settings card and the dock's picker (design/ai/agent-settings.md). */
80
83
  AiAgentResolver,
81
84
  ChatMessageSubscription,
85
+ /* 「입력 중」 — 저장하지 않는 방의 한 줄. 듣는 사람은 메시지와 같은 방 판정을 지난다. */
86
+ ChatTypingSubscription,
82
87
  /* 내가 참여한 모든 세션의 활동 — 창을 닫아 둔 표면이 배지·목록을 갱신할 수 있게. */
83
88
  MySessionActivitySubscription,
84
89
  /* 사람이 누른 입력 제안을 쓰는 자리 — 행마다 앱의 코드로, 그 사람의 권한으로. */
@@ -126,7 +126,7 @@ export interface ConversationOptions {
126
126
  */
127
127
  participants?: ScriptParticipant[]
128
128
  /** 이 대화가 공개인가 — 기본은 공개(ADR-0073 판정 2). 'private' 이면 멘션이 사람을 앉히지 않는다. */
129
- visibility?: 'open' | 'private'
129
+ visibility?: 'open' | 'group' | 'private'
130
130
  /** Who the assistant is on this surface — in real use it comes from the registered mode. */
131
131
  systemPrompt?: string
132
132
  /** Which registered categories this conversation may use. Omitted allows none. */
@@ -146,6 +146,7 @@ export function modeCarriesSharedRules(kind: string): string[] {
146
146
  if (/name our plumbing|do not describe our machinery/i.test(prompt)) found.push('absence-rule-copy')
147
147
  if (/^\s*Next:/im.test(prompt) || /end the reply with one last line/i.test(prompt)) found.push('next-request-rule-copy')
148
148
  if (/finish what was asked in this turn|never ask whether to propose/i.test(prompt)) found.push('finish-rule-copy')
149
+ if (/\[writer → addressee\]/.test(prompt)) found.push('speaker-rule-copy')
149
150
  return found
150
151
  }
151
152
 
@@ -168,7 +168,11 @@ describe('what twin needed of the dock', () => {
168
168
  })
169
169
 
170
170
  it('a carried conversation that could not be made is said, not swallowed', () => {
171
- assert.match(dock, /this\.startCarried\(ask\)\.catch\(error => \{\s*notify\(\{ level: 'error'/)
171
+ assert.match(dock, /this\.startCarried\(ask\)\.catch\(\(?\w*\)? => \{\s*notify\(\{ level: 'error'/)
172
+ })
173
+
174
+ it('★ and nothing is sent into the previous conversation after it - the request depended on the context that failed', () => {
175
+ assert.match(dock, /this\.startCarried\(ask\)\.catch\([\s\S]*?return undefined\s*\}\)[\s\S]{0,200}?if \(!id\) return\n/)
172
176
  })
173
177
  })
174
178
 
@@ -58,11 +58,13 @@ describe('the doors are the framework ones, as they are', () => {
58
58
  })
59
59
 
60
60
  describe('nothing irreversible without asking', () => {
61
- it('delete and making public ask first with the platform confirm; making private, hiding and renaming do not', () => {
61
+ it('delete, making public, making private (its people leave) and leaving ask first with the platform confirm; making it a group, hiding and renaming do not', () => {
62
62
  assert.match(manager, /import \{ OxPrompt \} from '@operato\/popup'/)
63
63
  assert.match(manager, /this\.askRemove\(entry, name\)/)
64
64
  assert.match(manager, /this\.askOpen\(entry, name\)/)
65
- assert.match(manager, /@select=\$\{\(\) => this\.setVisibility\(entry, 'private'\)\}/)
65
+ assert.match(manager, /this\.askPrivate\(entry, name\)/)
66
+ assert.match(manager, /this\.askLeave\(entry, name\)/)
67
+ assert.match(manager, /@select=\$\{\(\) => this\.setVisibility\(entry, 'group'\)\}/)
66
68
  })
67
69
 
68
70
  it('no browser dialog - they sit outside the theme', () => {
@@ -55,12 +55,15 @@ const OPEN_BY_DECISION: Record<Root, Record<string, string>> = {
55
55
  Mutation: {},
56
56
  Subscription: {
57
57
  chatMessageActivity:
58
- "subscribe: a member of the domain, and the room open to the caller — open to the domain, private to its participants " +
58
+ "subscribe: a member of the domain, and the room open to the caller — open to the domain, group or private to its seats " +
59
59
  '(ADR-0073 decision 2), refused with the words of a missing session otherwise. Every message: same domain + session, ' +
60
60
  'and the room asked again. The body is redacted by doors for each receiver (ADR-0073 ruling 1).',
61
61
  mySessionActivity:
62
62
  "subscribe: a member of the domain. Every message: same domain, and the caller among the payload's participants. " +
63
- 'Badge fields and a one-line preview only, no body.'
63
+ 'Badge fields and a one-line preview only, no body.',
64
+ chatTyping:
65
+ 'subscribe: a member of the domain, and the room open to the caller, asked as chatMessageActivity asks it. Every notice: ' +
66
+ "same domain + session, not the caller's own, and the room asked again. A user id, a name and a time - nothing stored, no body."
64
67
  }
65
68
  }
66
69
 
@@ -129,7 +132,7 @@ describe('what the walk itself has to be true for', () => {
129
132
  /* If the resolver list shrank to nothing, the lists above would pass by having nothing to look at. */
130
133
  expect(fieldsOf('Query').length).toBeGreaterThanOrEqual(10)
131
134
  expect(fieldsOf('Mutation').length).toBeGreaterThanOrEqual(13)
132
- expect(fieldsOf('Subscription')).toHaveLength(2)
135
+ expect(fieldsOf('Subscription')).toHaveLength(3)
133
136
  })
134
137
 
135
138
  it('tells an undeclared field from one the schema does not have', () => {
@@ -145,11 +148,13 @@ describe('what the walk itself has to be true for', () => {
145
148
  * 2026-09-30: 30 — applyEntryProposal (enter the rows the person pressed, design/ai/data-entry.md), declared.
146
149
  * 2026-10-12: 35 — aiAgentSettings · aiAgentChoices · aiProviderModels · saveAiAgents · aiUsageSummary (a domain's AI
147
150
  * agents and their usage, design/ai/agent-settings.md), declared.
151
+ * 2026-10-24: 41 — mayInviteToAISession · inviteToAISession · removeFromAISession · leaveAISession · sayTyping declared, chatTyping open (a
152
+ * group conversation and its typing line, ADR-0073 decision 3).
148
153
  */
149
154
  const all = fieldsOf('Query').length + fieldsOf('Mutation').length + fieldsOf('Subscription').length
150
155
  const open = openFields('Query').length + openFields('Mutation').length + openFields('Subscription').length
151
156
 
152
- expect(all).toBe(35)
153
- expect(open).toBe(2)
157
+ expect(all).toBe(41)
158
+ expect(open).toBe(3)
154
159
  })
155
160
  })
@@ -1,4 +1,5 @@
1
1
  {
2
+ "ai-assistant.dock.carry-failed": "The selected context could not be attached. Nothing was sent. Try again from the original screen.",
2
3
  "ai-assistant.dock.wait-before-switch": "Wait for the current response before changing conversations.",
3
4
  "ai-assistant.dock.switch-title": "Change conversation?",
4
5
  "ai-assistant.dock.switch-draft": "Your unsent text and attachments will not move to the other conversation.",
@@ -14,7 +15,7 @@
14
15
  "ai-assistant.session.reset-filters": "Clear search and filters",
15
16
  "ai-assistant.session.filtered-empty": "No conversations match these filters here.",
16
17
  "ai-assistant.session.scope-empty": "No conversations yet.",
17
- "ai-assistant.session.audience-private": "Participants only",
18
+ "ai-assistant.session.audience-private": "Only me",
18
19
  "ai-assistant.session.audience-open": "Everyone in this domain",
19
20
  "ai-assistant.session.manage": "Manage conversation",
20
21
  "ai-assistant.session.list": "Conversations",
@@ -121,7 +122,6 @@
121
122
  "ai-assistant.text.say-to-room-tooltip": "say this to the people here — the assistant does not answer",
122
123
  "ai-assistant.text.no-room-yet": "this conversation is not saved yet, so there is nobody else in it to talk to",
123
124
  "ai-assistant.text.will-be-invited": "{names} will join this conversation when you send",
124
- "ai-assistant.text.cannot-invite": "{names} will not join — only the people already in this conversation can bring someone in",
125
125
  "ai-assistant.text.answer-needs-permission": "you do not have permission to see this answer. ask an administrator for access.",
126
126
  "ai-assistant.label.conversation": "conversation",
127
127
  "ai-assistant.text.switch-conversation": "switch to {name}",
@@ -182,7 +182,7 @@
182
182
  "ai-assistant.session.filter-whose": "Whose",
183
183
  "ai-assistant.session.filter-participant": "I'm in",
184
184
  "ai-assistant.session.filter-visibility": "Visibility",
185
- "ai-assistant.session.filter-any-visibility": "Public and private",
185
+ "ai-assistant.session.filter-any-visibility": "Any audience",
186
186
  "ai-assistant.session.filter-open": "Public",
187
187
  "ai-assistant.session.filter-private": "Private",
188
188
  "ai-assistant.session.filter-unread": "Unread",
@@ -247,6 +247,7 @@
247
247
  "ai-assistant.read.year": "year",
248
248
  "ai-assistant.read.month": "month",
249
249
  "ai-assistant.read.flow": "in or out",
250
+ "ai-assistant.read.missing": "missing",
250
251
  "ai-assistant.read.period": "month",
251
252
  "ai-assistant.read.status": "status",
252
253
  "ai-assistant.read.min-amount": "minimum amount",
@@ -399,5 +400,29 @@
399
400
  "ai-assistant.run.assistant-run-model-error": "the AI model failed during the run.",
400
401
  "ai-assistant.run.assistant-run-abandoned": "the run stopped partway and was started again.",
401
402
  "ai-assistant.run.ai-not-configured": "AI is not set up for this domain.",
402
- "ai-assistant.run.ai-agent-not-available": "the AI agent picked for this run is not available here."
403
+ "ai-assistant.run.ai-agent-not-available": "the AI agent picked for this run is not available here.",
404
+ "ai-assistant.text.cannot-invite-private": "{names} will not join — a private conversation is yours alone. Make it a group to bring people in",
405
+ "ai-assistant.text.cannot-invite-group": "{names} will not join — only the person who started this group can bring someone in",
406
+ "ai-assistant.button.invite": "Invite",
407
+ "ai-assistant.label.participants": "People in this conversation",
408
+ "ai-assistant.button.remove-participant": "Send {name} out",
409
+ "ai-assistant.text.invited": "{name} can now read and write here, and has been told.",
410
+ "ai-assistant.text.removed-participant": "{name} is no longer in this conversation.",
411
+ "ai-assistant.text.typing-many": "{count} people are typing",
412
+ "ai-assistant.text.typing": "Typing: {names}",
413
+ "ai-assistant.text.invite-search": "Name or email",
414
+ "ai-assistant.text.invite-none-found": "No one to invite by that name.",
415
+ "ai-assistant.session.filter-group": "Group",
416
+ "ai-assistant.session.make-group": "Make it a group",
417
+ "ai-assistant.session.leave": "Leave",
418
+ "ai-assistant.session.confirm-private": "Make \"{name}\" private? Only you will read it, and everyone else in it leaves.",
419
+ "ai-assistant.session.confirm-leave-open": "Leave \"{name}\"? Its new messages stop reaching you.",
420
+ "ai-assistant.session.confirm-leave": "Leave \"{name}\"? You will not read it again unless its owner brings you back.",
421
+ "ai-assistant.session.leave-refused": "you could not leave this conversation.",
422
+ "ai-assistant.session.audience-group": "Invited people",
423
+ "ai-assistant.text.invite-title": "Conversation invite",
424
+ "ai-assistant.text.invite-body-named": "{who} brought you into the conversation \"{name}\".",
425
+ "ai-assistant.text.invite-body": "{who} brought you into a conversation.",
426
+ "ai-assistant.text.board-invite-title": "Board collaboration invite",
427
+ "ai-assistant.text.board-invite-body": "{who} invited you to collaborate on a board."
403
428
  }
@@ -1,4 +1,5 @@
1
1
  {
2
+ "ai-assistant.dock.carry-failed": "The selected context could not be attached. Nothing was sent. Try again from the original screen.",
2
3
  "ai-assistant.dock.wait-before-switch": "Espere a que termine la respuesta actual antes de cambiar de conversación.",
3
4
  "ai-assistant.dock.switch-title": "¿Cambiar de conversación?",
4
5
  "ai-assistant.dock.switch-draft": "El texto no enviado y los archivos adjuntos no se trasladarán a la otra conversación.",
@@ -14,7 +15,7 @@
14
15
  "ai-assistant.session.reset-filters": "Borrar búsqueda y filtros",
15
16
  "ai-assistant.session.filtered-empty": "Ninguna conversación coincide aquí con estos filtros.",
16
17
  "ai-assistant.session.scope-empty": "Aún no hay conversaciones.",
17
- "ai-assistant.session.audience-private": "Solo participantes",
18
+ "ai-assistant.session.audience-private": "Solo yo",
18
19
  "ai-assistant.session.audience-open": "Todos en este dominio",
19
20
  "ai-assistant.session.manage": "Gestionar conversación",
20
21
  "ai-assistant.session.list": "Conversaciones",
@@ -121,7 +122,6 @@
121
122
  "ai-assistant.text.say-to-room-tooltip": "decírselo a las personas presentes; el asistente no responde",
122
123
  "ai-assistant.text.no-room-yet": "esta conversación aún no se ha guardado, así que no hay nadie más en ella con quien hablar",
123
124
  "ai-assistant.text.will-be-invited": "{names} se unirá a esta conversación cuando envíe el mensaje",
124
- "ai-assistant.text.cannot-invite": "{names} no se unirá: solo las personas que ya están en esta conversación pueden incorporar a alguien",
125
125
  "ai-assistant.text.answer-needs-permission": "no tiene permiso para ver esta respuesta. solicite acceso a un administrador.",
126
126
  "ai-assistant.label.conversation": "conversación",
127
127
  "ai-assistant.text.switch-conversation": "cambiar a {name}",
@@ -182,7 +182,7 @@
182
182
  "ai-assistant.session.filter-whose": "De quién",
183
183
  "ai-assistant.session.filter-participant": "En las que participo",
184
184
  "ai-assistant.session.filter-visibility": "Visibilidad",
185
- "ai-assistant.session.filter-any-visibility": "Públicas y privadas",
185
+ "ai-assistant.session.filter-any-visibility": "Cualquier alcance",
186
186
  "ai-assistant.session.filter-open": "Públicas",
187
187
  "ai-assistant.session.filter-private": "Privadas",
188
188
  "ai-assistant.session.filter-unread": "No leídas",
@@ -247,6 +247,7 @@
247
247
  "ai-assistant.read.year": "año",
248
248
  "ai-assistant.read.month": "mes",
249
249
  "ai-assistant.read.flow": "entrada o salida",
250
+ "ai-assistant.read.missing": "falta",
250
251
  "ai-assistant.read.period": "mes",
251
252
  "ai-assistant.read.status": "estado",
252
253
  "ai-assistant.read.min-amount": "importe mínimo",
@@ -399,5 +400,29 @@
399
400
  "ai-assistant.run.assistant-run-model-error": "el modelo de IA falló durante la ejecución.",
400
401
  "ai-assistant.run.assistant-run-abandoned": "la ejecución se detuvo a medias y se inició de nuevo.",
401
402
  "ai-assistant.run.ai-not-configured": "la IA no está configurada para este dominio.",
402
- "ai-assistant.run.ai-agent-not-available": "el agente de IA elegido para esta ejecución no está disponible aquí."
403
+ "ai-assistant.run.ai-agent-not-available": "el agente de IA elegido para esta ejecución no está disponible aquí.",
404
+ "ai-assistant.text.cannot-invite-private": "{names} no se unirá: una conversación privada es solo tuya. Conviértela en grupo para invitar a otras personas",
405
+ "ai-assistant.text.cannot-invite-group": "{names} no se unirá: solo quien inició este grupo puede invitar a alguien",
406
+ "ai-assistant.button.invite": "Invitar",
407
+ "ai-assistant.label.participants": "Participantes de esta conversación",
408
+ "ai-assistant.button.remove-participant": "Sacar a {name}",
409
+ "ai-assistant.text.invited": "{name} ha sido invitado y se le ha avisado.",
410
+ "ai-assistant.text.removed-participant": "{name} ya no está en esta conversación.",
411
+ "ai-assistant.text.typing-many": "{count} personas escribiendo",
412
+ "ai-assistant.text.typing": "{names} está escribiendo",
413
+ "ai-assistant.text.invite-search": "Nombre o correo",
414
+ "ai-assistant.text.invite-none-found": "No hay a quién invitar con ese nombre.",
415
+ "ai-assistant.session.filter-group": "Grupo",
416
+ "ai-assistant.session.make-group": "Convertir en grupo",
417
+ "ai-assistant.session.leave": "Salir",
418
+ "ai-assistant.session.confirm-private": "¿Hacer privada \"{name}\"? Solo tú podrás leerla y el resto de participantes saldrá.",
419
+ "ai-assistant.session.confirm-leave-open": "¿Salir de \"{name}\"? Dejarás de recibir sus mensajes nuevos.",
420
+ "ai-assistant.session.confirm-leave": "¿Salir de \"{name}\"? No podrás leerla de nuevo hasta que quien la inició te invite otra vez.",
421
+ "ai-assistant.session.leave-refused": "no se pudo salir de esta conversación.",
422
+ "ai-assistant.session.audience-group": "Personas invitadas",
423
+ "ai-assistant.text.invite-title": "Invitación a una conversación",
424
+ "ai-assistant.text.invite-body-named": "{who} te invitó a la conversación \"{name}\".",
425
+ "ai-assistant.text.invite-body": "{who} te invitó a una conversación.",
426
+ "ai-assistant.text.board-invite-title": "Invitación a colaborar en un tablero",
427
+ "ai-assistant.text.board-invite-body": "{who} te invitó a colaborar en un tablero."
403
428
  }
@@ -1,4 +1,5 @@
1
1
  {
2
+ "ai-assistant.dock.carry-failed": "The selected context could not be attached. Nothing was sent. Try again from the original screen.",
2
3
  "ai-assistant.dock.wait-before-switch": "回答が終わってから会話を切り替えてください。",
3
4
  "ai-assistant.dock.switch-title": "会話を切り替えますか?",
4
5
  "ai-assistant.dock.switch-draft": "未送信の文章と添付は別の会話に移りません。",
@@ -14,7 +15,7 @@
14
15
  "ai-assistant.session.reset-filters": "検索とフィルターを解除",
15
16
  "ai-assistant.session.filtered-empty": "この対象で条件に合う会話はありません。",
16
17
  "ai-assistant.session.scope-empty": "会話はまだありません。",
17
- "ai-assistant.session.audience-private": "参加者のみ",
18
+ "ai-assistant.session.audience-private": "自分だけ",
18
19
  "ai-assistant.session.audience-open": "事業場内に公開",
19
20
  "ai-assistant.session.manage": "会話を管理",
20
21
  "ai-assistant.session.list": "会話一覧",
@@ -121,7 +122,6 @@
121
122
  "ai-assistant.text.say-to-room-tooltip": "ここにいる人たちに話します。AI は答えません",
122
123
  "ai-assistant.text.no-room-yet": "まだ保存されていない会話なので、一緒にいる人がいません",
123
124
  "ai-assistant.text.will-be-invited": "送信すると {names} がこの会話に加わります",
124
- "ai-assistant.text.cannot-invite": "{names} は加わりません。この会話にいる人だけが他の人を呼べます",
125
125
  "ai-assistant.text.answer-needs-permission": "この回答を見る権限がありません。管理者に申請してください。",
126
126
  "ai-assistant.label.conversation": "会話",
127
127
  "ai-assistant.text.switch-conversation": "{name} の会話に切り替える",
@@ -182,7 +182,7 @@
182
182
  "ai-assistant.session.filter-whose": "誰の",
183
183
  "ai-assistant.session.filter-participant": "参加中",
184
184
  "ai-assistant.session.filter-visibility": "公開範囲",
185
- "ai-assistant.session.filter-any-visibility": "公開・非公開",
185
+ "ai-assistant.session.filter-any-visibility": "すべての公開範囲",
186
186
  "ai-assistant.session.filter-open": "公開",
187
187
  "ai-assistant.session.filter-private": "非公開",
188
188
  "ai-assistant.session.filter-unread": "未読",
@@ -247,6 +247,7 @@
247
247
  "ai-assistant.read.year": "年",
248
248
  "ai-assistant.read.month": "月",
249
249
  "ai-assistant.read.flow": "入出金",
250
+ "ai-assistant.read.missing": "未入力",
250
251
  "ai-assistant.read.period": "月",
251
252
  "ai-assistant.read.status": "状態",
252
253
  "ai-assistant.read.min-amount": "最小金額",
@@ -399,5 +400,29 @@
399
400
  "ai-assistant.run.assistant-run-model-error": "実行中に AI モデルの呼び出しが失敗しました。",
400
401
  "ai-assistant.run.assistant-run-abandoned": "実行が途中で止まったため、もう一度開始しました。",
401
402
  "ai-assistant.run.ai-not-configured": "この事業所には AI が設定されていません。",
402
- "ai-assistant.run.ai-agent-not-available": "この実行に選んだ AI エージェントはここでは使えません。"
403
+ "ai-assistant.run.ai-agent-not-available": "この実行に選んだ AI エージェントはここでは使えません。",
404
+ "ai-assistant.text.cannot-invite-private": "{names} さんは参加しません。非公開の会話は自分だけが読めます。人を招くにはグループに変えてください",
405
+ "ai-assistant.text.cannot-invite-group": "{names} さんは参加しません。このグループに人を招けるのは開始した人だけです",
406
+ "ai-assistant.button.invite": "招待",
407
+ "ai-assistant.label.participants": "この会話の参加者",
408
+ "ai-assistant.button.remove-participant": "{name} さんを退出させる",
409
+ "ai-assistant.text.invited": "{name} さんを招待し、通知しました。",
410
+ "ai-assistant.text.removed-participant": "{name} さんを退出させました。",
411
+ "ai-assistant.text.typing-many": "{count} 人が入力中",
412
+ "ai-assistant.text.typing": "{names} さんが入力中",
413
+ "ai-assistant.text.invite-search": "名前またはメール",
414
+ "ai-assistant.text.invite-none-found": "招待できる人がいません。",
415
+ "ai-assistant.session.filter-group": "グループ",
416
+ "ai-assistant.session.make-group": "グループにする",
417
+ "ai-assistant.session.leave": "退出",
418
+ "ai-assistant.session.confirm-private": "「{name}」を非公開にしますか? 自分だけが読めるようになり、ほかの参加者は全員退出します。",
419
+ "ai-assistant.session.confirm-leave-open": "「{name}」から退出しますか? 新しいメッセージの通知が届かなくなります。",
420
+ "ai-assistant.session.confirm-leave": "「{name}」から退出しますか? 開始した人が再び招待するまで読めなくなります。",
421
+ "ai-assistant.session.leave-refused": "この会話から退出できませんでした。",
422
+ "ai-assistant.session.audience-group": "招待された人",
423
+ "ai-assistant.text.invite-title": "会話への招待",
424
+ "ai-assistant.text.invite-body-named": "{who} さんが会話「{name}」に招待しました。",
425
+ "ai-assistant.text.invite-body": "{who} さんが会話に招待しました。",
426
+ "ai-assistant.text.board-invite-title": "ボード共同作業への招待",
427
+ "ai-assistant.text.board-invite-body": "{who} さんがボードの共同作業に招待しました。"
403
428
  }
@@ -1,4 +1,5 @@
1
1
  {
2
+ "ai-assistant.dock.carry-failed": "선택한 내용을 전달하지 못해 요청을 보내지 않았습니다. 원래 화면에서 다시 시도해 주세요.",
2
3
  "ai-assistant.dock.wait-before-switch": "답변이 끝난 뒤 대화를 전환할 수 있습니다.",
3
4
  "ai-assistant.dock.switch-title": "대화를 전환할까요?",
4
5
  "ai-assistant.dock.switch-draft": "작성 중인 글과 첨부는 다른 대화로 옮겨지지 않습니다.",
@@ -14,7 +15,7 @@
14
15
  "ai-assistant.session.reset-filters": "검색·필터 초기화",
15
16
  "ai-assistant.session.filtered-empty": "이 대상에서 조건에 맞는 대화가 없습니다.",
16
17
  "ai-assistant.session.scope-empty": "대화가 아직 없습니다.",
17
- "ai-assistant.session.audience-private": "참여자만",
18
+ "ai-assistant.session.audience-private": "나만",
18
19
  "ai-assistant.session.audience-open": "사업장 공개",
19
20
  "ai-assistant.session.manage": "대화 관리",
20
21
  "ai-assistant.session.list": "대화 목록",
@@ -90,7 +91,7 @@
90
91
  "ai-assistant.text.proposal-choices": "이어서 할 것",
91
92
  "ai-assistant.text.attached-image-ask": "이미지를 붙였습니다. 이걸 보고 해 주세요.",
92
93
  "ai-assistant.text.attached-file-ask": "파일을 붙였습니다. 한번 봐 주세요.",
93
- "ai-assistant.text.other-figure-history": "이 대화는 다른 Figure 의 것입니다. 지금 열어 둔 모델의 대화를 여세요.",
94
+ "ai-assistant.text.other-figure-history": "이 대화는 다른 피규어의 것입니다. 지금 열어 둔 피규어의 대화를 여세요.",
94
95
  "ai-assistant.text.application-vs-model-history": "이 대화는 모델이 아니라 애플리케이션에 대한 것입니다. 원하는 쪽 대화를 여세요.",
95
96
  "ai-assistant.text.other-station-history": "이 대화는 다른 현장 화면의 것입니다. 지금 보고 있는 화면의 대화를 여세요.",
96
97
  "ai-assistant.text.unknown-mode": "이 화면이 찾는 대화가 서버에 없습니다({kind}). 페이지를 새로고침해 주세요.",
@@ -121,7 +122,6 @@
121
122
  "ai-assistant.text.say-to-room-tooltip": "대화 참여자에게 메시지를 보냅니다. AI는 응답하지 않습니다.",
122
123
  "ai-assistant.text.no-room-yet": "아직 저장되지 않은 대화라 같이 있는 사람이 없습니다",
123
124
  "ai-assistant.text.will-be-invited": "전송하면 {names} 님이 이 대화에 초대됩니다.",
124
- "ai-assistant.text.cannot-invite": "{names} 은 들어오지 않습니다. 이 대화에 있는 사람만 다른 사람을 부를 수 있습니다",
125
125
  "ai-assistant.text.answer-needs-permission": "이 답을 볼 권한이 없습니다. 관리자에게 요청하십시오.",
126
126
  "ai-assistant.label.conversation": "대화",
127
127
  "ai-assistant.text.switch-conversation": "{name} 대화로 바꾸기",
@@ -182,7 +182,7 @@
182
182
  "ai-assistant.session.filter-whose": "누구의",
183
183
  "ai-assistant.session.filter-participant": "내가 참여",
184
184
  "ai-assistant.session.filter-visibility": "공개 범위",
185
- "ai-assistant.session.filter-any-visibility": "공개 · 비공개",
185
+ "ai-assistant.session.filter-any-visibility": "모든 공개 범위",
186
186
  "ai-assistant.session.filter-open": "공개",
187
187
  "ai-assistant.session.filter-private": "비공개",
188
188
  "ai-assistant.session.filter-unread": "안 읽음",
@@ -247,6 +247,7 @@
247
247
  "ai-assistant.read.year": "연도",
248
248
  "ai-assistant.read.month": "월",
249
249
  "ai-assistant.read.flow": "입출금",
250
+ "ai-assistant.read.missing": "빠진 칸",
250
251
  "ai-assistant.read.period": "월",
251
252
  "ai-assistant.read.status": "상태",
252
253
  "ai-assistant.read.min-amount": "최소 금액",
@@ -399,5 +400,29 @@
399
400
  "ai-assistant.run.assistant-run-model-error": "실행 중 AI 모델 호출이 실패했습니다.",
400
401
  "ai-assistant.run.assistant-run-abandoned": "실행이 도중에 멈춰 다시 시작했습니다.",
401
402
  "ai-assistant.run.ai-not-configured": "이 사업장에는 AI 가 설정되어 있지 않습니다.",
402
- "ai-assistant.run.ai-agent-not-available": "이 실행에서 선택한 AI 에이전트는 현재 사용할 수 없습니다."
403
+ "ai-assistant.run.ai-agent-not-available": "이 실행에서 선택한 AI 에이전트는 현재 사용할 수 없습니다.",
404
+ "ai-assistant.text.cannot-invite-private": "{names} 님은 들어오지 않습니다. 비공개 대화는 나만 읽습니다. 사람을 들이려면 그룹으로 바꾸세요",
405
+ "ai-assistant.text.cannot-invite-group": "{names} 님은 들어오지 않습니다. 그룹 대화에는 시작한 사람만 사람을 들일 수 있습니다",
406
+ "ai-assistant.button.invite": "초대",
407
+ "ai-assistant.label.participants": "이 대화의 참여자",
408
+ "ai-assistant.button.remove-participant": "{name} 님 내보내기",
409
+ "ai-assistant.text.invited": "{name} 님을 초대했고 알림을 보냈습니다.",
410
+ "ai-assistant.text.removed-participant": "{name} 님을 내보냈습니다.",
411
+ "ai-assistant.text.typing-many": "{count}명이 입력 중",
412
+ "ai-assistant.text.typing": "{names} 님이 입력 중",
413
+ "ai-assistant.text.invite-search": "이름 또는 이메일",
414
+ "ai-assistant.text.invite-none-found": "초대할 사람이 없습니다.",
415
+ "ai-assistant.session.filter-group": "그룹",
416
+ "ai-assistant.session.make-group": "그룹으로 바꾸기",
417
+ "ai-assistant.session.leave": "나가기",
418
+ "ai-assistant.session.confirm-private": "\"{name}\" 을(를) 비공개로 바꿀까요? 나만 읽게 되고 다른 참여자는 모두 나갑니다.",
419
+ "ai-assistant.session.confirm-leave-open": "\"{name}\" 에서 나갈까요? 새 메시지 알림이 오지 않습니다.",
420
+ "ai-assistant.session.confirm-leave": "\"{name}\" 에서 나갈까요? 시작한 사람이 다시 초대하기 전에는 읽을 수 없습니다.",
421
+ "ai-assistant.session.leave-refused": "이 대화에서 나가지 못했습니다.",
422
+ "ai-assistant.session.audience-group": "초대된 사람",
423
+ "ai-assistant.text.invite-title": "대화 초대",
424
+ "ai-assistant.text.invite-body-named": "{who} 님이 \"{name}\" 대화에 초대했습니다.",
425
+ "ai-assistant.text.invite-body": "{who} 님이 대화에 초대했습니다.",
426
+ "ai-assistant.text.board-invite-title": "보드 협업 초대",
427
+ "ai-assistant.text.board-invite-body": "{who} 님이 보드 협업에 초대했습니다."
403
428
  }
@@ -1,4 +1,5 @@
1
1
  {
2
+ "ai-assistant.dock.carry-failed": "The selected context could not be attached. Nothing was sent. Try again from the original screen.",
2
3
  "ai-assistant.dock.wait-before-switch": "Tunggu jawapan selesai sebelum menukar perbualan.",
3
4
  "ai-assistant.dock.switch-title": "Tukar perbualan?",
4
5
  "ai-assistant.dock.switch-draft": "Teks dan lampiran belum dihantar tidak akan dipindahkan.",
@@ -14,7 +15,7 @@
14
15
  "ai-assistant.session.reset-filters": "Kosongkan carian dan penapis",
15
16
  "ai-assistant.session.filtered-empty": "Tiada perbualan yang sepadan untuk subjek ini.",
16
17
  "ai-assistant.session.scope-empty": "Belum ada perbualan.",
17
- "ai-assistant.session.audience-private": "Peserta sahaja",
18
+ "ai-assistant.session.audience-private": "Saya sahaja",
18
19
  "ai-assistant.session.audience-open": "Semua dalam domain ini",
19
20
  "ai-assistant.session.manage": "Urus perbualan",
20
21
  "ai-assistant.session.list": "Senarai perbualan",
@@ -121,7 +122,6 @@
121
122
  "ai-assistant.text.say-to-room-tooltip": "cakap kepada orang di sini — pembantu tidak menjawab",
122
123
  "ai-assistant.text.no-room-yet": "perbualan ini belum disimpan, jadi tiada orang lain di dalamnya",
123
124
  "ai-assistant.text.will-be-invited": "{names} akan menyertai perbualan ini apabila anda hantar",
124
- "ai-assistant.text.cannot-invite": "{names} tidak akan menyertai — hanya orang yang sudah ada dalam perbualan boleh membawa orang masuk",
125
125
  "ai-assistant.text.answer-needs-permission": "anda tiada kebenaran untuk melihat jawapan ini. minta kebenaran daripada pentadbir.",
126
126
  "ai-assistant.label.conversation": "perbualan",
127
127
  "ai-assistant.text.switch-conversation": "tukar ke perbualan {name}",
@@ -182,7 +182,7 @@
182
182
  "ai-assistant.session.filter-whose": "Milik siapa",
183
183
  "ai-assistant.session.filter-participant": "Saya sertai",
184
184
  "ai-assistant.session.filter-visibility": "Keterlihatan",
185
- "ai-assistant.session.filter-any-visibility": "Awam dan peribadi",
185
+ "ai-assistant.session.filter-any-visibility": "Semua capaian",
186
186
  "ai-assistant.session.filter-open": "Awam",
187
187
  "ai-assistant.session.filter-private": "Peribadi",
188
188
  "ai-assistant.session.filter-unread": "Belum dibaca",
@@ -247,6 +247,7 @@
247
247
  "ai-assistant.read.year": "tahun",
248
248
  "ai-assistant.read.month": "bulan",
249
249
  "ai-assistant.read.flow": "masuk atau keluar",
250
+ "ai-assistant.read.missing": "tiada",
250
251
  "ai-assistant.read.period": "bulan",
251
252
  "ai-assistant.read.status": "status",
252
253
  "ai-assistant.read.min-amount": "jumlah minimum",
@@ -399,5 +400,29 @@
399
400
  "ai-assistant.run.assistant-run-model-error": "model AI gagal semasa larian.",
400
401
  "ai-assistant.run.assistant-run-abandoned": "larian terhenti di tengah jalan dan dimulakan semula.",
401
402
  "ai-assistant.run.ai-not-configured": "AI belum disediakan untuk domain ini.",
402
- "ai-assistant.run.ai-agent-not-available": "ejen AI yang dipilih untuk larian ini tidak tersedia di sini."
403
+ "ai-assistant.run.ai-agent-not-available": "ejen AI yang dipilih untuk larian ini tidak tersedia di sini.",
404
+ "ai-assistant.text.cannot-invite-private": "{names} tidak akan menyertai — perbualan peribadi hanya untuk anda. Tukar kepada kumpulan untuk menjemput orang",
405
+ "ai-assistant.text.cannot-invite-group": "{names} tidak akan menyertai — hanya orang yang memulakan kumpulan ini boleh menjemput orang",
406
+ "ai-assistant.button.invite": "Jemput",
407
+ "ai-assistant.label.participants": "Peserta perbualan ini",
408
+ "ai-assistant.button.remove-participant": "Keluarkan {name}",
409
+ "ai-assistant.text.invited": "{name} telah dijemput dan dimaklumkan.",
410
+ "ai-assistant.text.removed-participant": "{name} telah dikeluarkan.",
411
+ "ai-assistant.text.typing-many": "{count} orang sedang menaip",
412
+ "ai-assistant.text.typing": "{names} sedang menaip",
413
+ "ai-assistant.text.invite-search": "Nama atau e-mel",
414
+ "ai-assistant.text.invite-none-found": "Tiada orang untuk dijemput.",
415
+ "ai-assistant.session.filter-group": "Kumpulan",
416
+ "ai-assistant.session.make-group": "Jadikan kumpulan",
417
+ "ai-assistant.session.leave": "Keluar",
418
+ "ai-assistant.session.confirm-private": "Jadikan \"{name}\" peribadi? Hanya anda boleh membacanya, dan semua peserta lain akan keluar.",
419
+ "ai-assistant.session.confirm-leave-open": "Keluar dari \"{name}\"? Mesej baharu tidak akan sampai kepada anda lagi.",
420
+ "ai-assistant.session.confirm-leave": "Keluar dari \"{name}\"? Anda tidak boleh membacanya lagi melainkan pemiliknya menjemput anda semula.",
421
+ "ai-assistant.session.leave-refused": "anda tidak dapat keluar dari perbualan ini.",
422
+ "ai-assistant.session.audience-group": "Orang yang dijemput",
423
+ "ai-assistant.text.invite-title": "Jemputan perbualan",
424
+ "ai-assistant.text.invite-body-named": "{who} menjemput anda ke perbualan \"{name}\".",
425
+ "ai-assistant.text.invite-body": "{who} menjemput anda ke sebuah perbualan.",
426
+ "ai-assistant.text.board-invite-title": "Jemputan kerjasama papan",
427
+ "ai-assistant.text.board-invite-body": "{who} menjemput anda bekerjasama pada papan."
403
428
  }
@@ -1,4 +1,5 @@
1
1
  {
2
+ "ai-assistant.dock.carry-failed": "The selected context could not be attached. Nothing was sent. Try again from the original screen.",
2
3
  "ai-assistant.dock.wait-before-switch": "请等待当前回答完成后再切换对话。",
3
4
  "ai-assistant.dock.switch-title": "切换对话?",
4
5
  "ai-assistant.dock.switch-draft": "未发送的文字和附件不会移至另一对话。",
@@ -14,7 +15,7 @@
14
15
  "ai-assistant.session.reset-filters": "清除搜索和筛选",
15
16
  "ai-assistant.session.filtered-empty": "此对象没有符合条件的对话。",
16
17
  "ai-assistant.session.scope-empty": "尚无对话。",
17
- "ai-assistant.session.audience-private": "仅参与者",
18
+ "ai-assistant.session.audience-private": "仅自己",
18
19
  "ai-assistant.session.audience-open": "组织内公开",
19
20
  "ai-assistant.session.manage": "管理对话",
20
21
  "ai-assistant.session.list": "对话列表",
@@ -121,7 +122,6 @@
121
122
  "ai-assistant.text.say-to-room-tooltip": "对这里的人说,AI 不会回答",
122
123
  "ai-assistant.text.no-room-yet": "这个对话还没有保存,所以没有其他人在场",
123
124
  "ai-assistant.text.will-be-invited": "发送后 {names} 将加入此对话",
124
- "ai-assistant.text.cannot-invite": "{names} 不会加入。只有已在此对话中的人才能邀请他人",
125
125
  "ai-assistant.text.answer-needs-permission": "没有查看此回答的权限。请向管理员申请。",
126
126
  "ai-assistant.label.conversation": "对话",
127
127
  "ai-assistant.text.switch-conversation": "切换到 {name} 对话",
@@ -182,7 +182,7 @@
182
182
  "ai-assistant.session.filter-whose": "谁的",
183
183
  "ai-assistant.session.filter-participant": "我参与的",
184
184
  "ai-assistant.session.filter-visibility": "可见范围",
185
- "ai-assistant.session.filter-any-visibility": "公开和私密",
185
+ "ai-assistant.session.filter-any-visibility": "全部范围",
186
186
  "ai-assistant.session.filter-open": "公开",
187
187
  "ai-assistant.session.filter-private": "私密",
188
188
  "ai-assistant.session.filter-unread": "未读",
@@ -247,6 +247,7 @@
247
247
  "ai-assistant.read.year": "年份",
248
248
  "ai-assistant.read.month": "月份",
249
249
  "ai-assistant.read.flow": "收支",
250
+ "ai-assistant.read.missing": "缺少",
250
251
  "ai-assistant.read.period": "月份",
251
252
  "ai-assistant.read.status": "状态",
252
253
  "ai-assistant.read.min-amount": "最小金额",
@@ -399,5 +400,29 @@
399
400
  "ai-assistant.run.assistant-run-model-error": "运行期间 AI 模型调用失败。",
400
401
  "ai-assistant.run.assistant-run-abandoned": "运行中途停止,已重新开始。",
401
402
  "ai-assistant.run.ai-not-configured": "此站点尚未设置 AI。",
402
- "ai-assistant.run.ai-agent-not-available": "为此运行选择的 AI 代理在此不可用。"
403
+ "ai-assistant.run.ai-agent-not-available": "为此运行选择的 AI 代理在此不可用。",
404
+ "ai-assistant.text.cannot-invite-private": "{names} 不会加入 — 私密对话只有你自己能看。要邀请他人,请改为群组",
405
+ "ai-assistant.text.cannot-invite-group": "{names} 不会加入 — 只有发起此群组的人可以邀请他人",
406
+ "ai-assistant.button.invite": "邀请",
407
+ "ai-assistant.label.participants": "此对话的参与者",
408
+ "ai-assistant.button.remove-participant": "将 {name} 移出",
409
+ "ai-assistant.text.invited": "已邀请 {name} 并发送通知。",
410
+ "ai-assistant.text.removed-participant": "已将 {name} 移出。",
411
+ "ai-assistant.text.typing-many": "{count} 人正在输入",
412
+ "ai-assistant.text.typing": "{names} 正在输入",
413
+ "ai-assistant.text.invite-search": "姓名或邮箱",
414
+ "ai-assistant.text.invite-none-found": "没有可邀请的人。",
415
+ "ai-assistant.session.filter-group": "群组",
416
+ "ai-assistant.session.make-group": "改为群组",
417
+ "ai-assistant.session.leave": "退出",
418
+ "ai-assistant.session.confirm-private": "将“{name}”设为私密?只有你能查看,其他参与者都会被移出。",
419
+ "ai-assistant.session.confirm-leave-open": "退出“{name}”?你将不再收到新消息通知。",
420
+ "ai-assistant.session.confirm-leave": "退出“{name}”?在发起人再次邀请前你将无法查看。",
421
+ "ai-assistant.session.leave-refused": "无法退出此对话。",
422
+ "ai-assistant.session.audience-group": "受邀者",
423
+ "ai-assistant.text.invite-title": "对话邀请",
424
+ "ai-assistant.text.invite-body-named": "{who} 邀请你加入对话“{name}”。",
425
+ "ai-assistant.text.invite-body": "{who} 邀请你加入对话。",
426
+ "ai-assistant.text.board-invite-title": "看板协作邀请",
427
+ "ai-assistant.text.board-invite-body": "{who} 邀请你协作编辑看板。"
403
428
  }