@things-factory/ai-assistant 10.1.154 → 10.1.155

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 (121) hide show
  1. package/client/bootstrap.ts +27 -0
  2. package/client/components/assistant-chat.ts +229 -178
  3. package/client/components/assistant-dock.ts +53 -48
  4. package/client/components/assistant-session-manager.ts +82 -100
  5. package/client/components/assistant-session-toolbar.ts +11 -3
  6. package/client/components/chat-input-builder.ts +8 -2
  7. package/client/settings/agent-settings-model.ts +164 -0
  8. package/client/settings/ai-agent-setting-let.ts +684 -0
  9. package/client/settings/ai-usage-setting-let.ts +252 -0
  10. package/client/settings/usage-model.ts +46 -0
  11. package/client/setup-assistant-dock.ts +2 -3
  12. package/client/utils/agent-choice.ts +56 -0
  13. package/client/utils/assistant-navigation.test.ts +14 -8
  14. package/client/utils/assistant-navigation.ts +8 -3
  15. package/client/utils/composer-frame.ts +28 -2
  16. package/client/utils/menu-room.ts +33 -0
  17. package/dist-client/bootstrap.d.ts +8 -0
  18. package/dist-client/bootstrap.js +26 -0
  19. package/dist-client/bootstrap.js.map +1 -0
  20. package/dist-client/components/assistant-chat.d.ts +32 -4
  21. package/dist-client/components/assistant-chat.js +234 -175
  22. package/dist-client/components/assistant-chat.js.map +1 -1
  23. package/dist-client/components/assistant-dock.d.ts +6 -8
  24. package/dist-client/components/assistant-dock.js +52 -60
  25. package/dist-client/components/assistant-dock.js.map +1 -1
  26. package/dist-client/components/assistant-session-manager.d.ts +8 -7
  27. package/dist-client/components/assistant-session-manager.js +84 -124
  28. package/dist-client/components/assistant-session-manager.js.map +1 -1
  29. package/dist-client/components/assistant-session-toolbar.d.ts +1 -0
  30. package/dist-client/components/assistant-session-toolbar.js +10 -3
  31. package/dist-client/components/assistant-session-toolbar.js.map +1 -1
  32. package/dist-client/components/chat-input-builder.d.ts +4 -0
  33. package/dist-client/components/chat-input-builder.js +4 -2
  34. package/dist-client/components/chat-input-builder.js.map +1 -1
  35. package/dist-client/settings/agent-settings-model.d.ts +93 -0
  36. package/dist-client/settings/agent-settings-model.js +95 -0
  37. package/dist-client/settings/agent-settings-model.js.map +1 -0
  38. package/dist-client/settings/ai-agent-setting-let.d.ts +51 -0
  39. package/dist-client/settings/ai-agent-setting-let.js +672 -0
  40. package/dist-client/settings/ai-agent-setting-let.js.map +1 -0
  41. package/dist-client/settings/ai-usage-setting-let.d.ts +26 -0
  42. package/dist-client/settings/ai-usage-setting-let.js +276 -0
  43. package/dist-client/settings/ai-usage-setting-let.js.map +1 -0
  44. package/dist-client/settings/usage-model.d.ts +32 -0
  45. package/dist-client/settings/usage-model.js +25 -0
  46. package/dist-client/settings/usage-model.js.map +1 -0
  47. package/dist-client/setup-assistant-dock.d.ts +0 -1
  48. package/dist-client/setup-assistant-dock.js +0 -1
  49. package/dist-client/setup-assistant-dock.js.map +1 -1
  50. package/dist-client/tsconfig.tsbuildinfo +1 -1
  51. package/dist-client/utils/agent-choice.d.ts +24 -0
  52. package/dist-client/utils/agent-choice.js +38 -0
  53. package/dist-client/utils/agent-choice.js.map +1 -0
  54. package/dist-client/utils/assistant-navigation.d.ts +8 -3
  55. package/dist-client/utils/assistant-navigation.js +7 -2
  56. package/dist-client/utils/assistant-navigation.js.map +1 -1
  57. package/dist-client/utils/assistant-navigation.test.js +14 -8
  58. package/dist-client/utils/assistant-navigation.test.js.map +1 -1
  59. package/dist-client/utils/composer-frame.d.ts +23 -2
  60. package/dist-client/utils/composer-frame.js +20 -2
  61. package/dist-client/utils/composer-frame.js.map +1 -1
  62. package/dist-client/utils/menu-room.d.ts +13 -0
  63. package/dist-client/utils/menu-room.js +26 -0
  64. package/dist-client/utils/menu-room.js.map +1 -0
  65. package/dist-server/service/ai-agent-resolver.d.ts +82 -0
  66. package/dist-server/service/ai-agent-resolver.js +417 -0
  67. package/dist-server/service/ai-agent-resolver.js.map +1 -0
  68. package/dist-server/service/assistant-capability-resolver.d.ts +1 -1
  69. package/dist-server/service/assistant-capability-resolver.js +7 -7
  70. package/dist-server/service/assistant-capability-resolver.js.map +1 -1
  71. package/dist-server/service/assistant-chat-resolver.d.ts +2 -0
  72. package/dist-server/service/assistant-chat-resolver.js +32 -15
  73. package/dist-server/service/assistant-chat-resolver.js.map +1 -1
  74. package/dist-server/service/assistant-mode/resolve.d.ts +0 -1
  75. package/dist-server/service/assistant-mode/resolve.js +0 -1
  76. package/dist-server/service/assistant-mode/resolve.js.map +1 -1
  77. package/dist-server/service/assistant-mode/types.d.ts +1 -2
  78. package/dist-server/service/assistant-mode/types.js.map +1 -1
  79. package/dist-server/service/chat-session/chat-session.d.ts +2 -0
  80. package/dist-server/service/chat-session/chat-session.js +5 -0
  81. package/dist-server/service/chat-session/chat-session.js.map +1 -1
  82. package/dist-server/service/index.d.ts +2 -1
  83. package/dist-server/service/index.js +3 -0
  84. package/dist-server/service/index.js.map +1 -1
  85. package/dist-server/service/testing/mode-conformance.js +0 -1
  86. package/dist-server/service/testing/mode-conformance.js.map +1 -1
  87. package/dist-server/tsconfig.tsbuildinfo +1 -1
  88. package/package.json +9 -7
  89. package/server/service/ai-agent-resolver.ts +330 -0
  90. package/server/service/assistant-capability-resolver.ts +7 -7
  91. package/server/service/assistant-chat-resolver.ts +32 -24
  92. package/server/service/assistant-mode/resolve.test.ts +0 -2
  93. package/server/service/assistant-mode/resolve.ts +0 -2
  94. package/server/service/assistant-mode/types.ts +1 -2
  95. package/server/service/chat-session/chat-session.ts +5 -0
  96. package/server/service/index.ts +3 -0
  97. package/server/service/testing/mode-conformance.ts +0 -1
  98. package/server/tool-registry-boot-report.test.ts +2 -0
  99. package/test/ai-agent-settings.test.ts +123 -0
  100. package/test/assistant-dock.test.ts +3 -2
  101. package/test/assistant-session-manager.test.ts +10 -4
  102. package/test/assistant-session-toolbar.test.ts +8 -0
  103. package/test/composer-frame.test.ts +40 -2
  104. package/test/menu-room.test.ts +33 -0
  105. package/test/open-doors.test.ts +3 -1
  106. package/test/session-discovery.test.ts +7 -6
  107. package/things-factory.config.js +2 -0
  108. package/translations/en.json +78 -12
  109. package/translations/es.json +78 -12
  110. package/translations/ja.json +78 -12
  111. package/translations/ko.json +78 -12
  112. package/translations/ms.json +78 -12
  113. package/translations/zh.json +78 -12
  114. package/client/components/chat-triggers.test.ts +0 -72
  115. package/client/components/chat-triggers.ts +0 -62
  116. package/dist-client/components/chat-triggers.d.ts +0 -16
  117. package/dist-client/components/chat-triggers.js +0 -42
  118. package/dist-client/components/chat-triggers.js.map +0 -1
  119. package/dist-client/components/chat-triggers.test.d.ts +0 -1
  120. package/dist-client/components/chat-triggers.test.js +0 -61
  121. package/dist-client/components/chat-triggers.test.js.map +0 -1
@@ -0,0 +1,164 @@
1
+ /**
2
+ * What the AI agent card shows and sends, apart from how it draws (design/ai/agent-settings.md §7).
3
+ *
4
+ * Every action on the card - pick the default, turn an agent off, edit one, delete one, answer an inherited agent with
5
+ * this domain's key - is saved as the domain's whole agent list, so the server checks it as one write.
6
+ */
7
+ export interface AgentDomain {
8
+ id: string
9
+ name: string
10
+ }
11
+
12
+ export interface AgentView {
13
+ id: string
14
+ name: string
15
+ provider: string
16
+ model: string
17
+ baseURL?: string | null
18
+ organization?: string | null
19
+ active: boolean
20
+ owner: AgentDomain
21
+ inherited: boolean
22
+ turnedOff: boolean
23
+ keyState: 'own' | 'inherited' | 'overridden' | 'missing'
24
+ keyDomain?: AgentDomain | null
25
+ keyHint?: string | null
26
+ usable: boolean
27
+ isDefault: boolean
28
+ usedBelow: AgentDomain[]
29
+ }
30
+
31
+ export interface AgentSettings {
32
+ chain: AgentDomain[]
33
+ agents: AgentView[]
34
+ defaultAgentId?: string | null
35
+ defaultFrom: 'own' | 'inherited' | 'first' | 'none'
36
+ state: string
37
+ reason?: string | null
38
+ }
39
+
40
+ export interface AgentDraft {
41
+ id?: string
42
+ name: string
43
+ provider: string
44
+ model: string
45
+ baseURL: string
46
+ organization: string
47
+ active: boolean
48
+ /** A new key. Empty keeps the stored one. */
49
+ apiKey: string
50
+ }
51
+
52
+ export type SaveChange =
53
+ | { kind: 'default'; agentId: string }
54
+ | { kind: 'turn-off'; agentId: string; off: boolean }
55
+ | { kind: 'active'; agentId: string; active: boolean }
56
+ | { kind: 'delete'; agentId: string }
57
+ | { kind: 'upsert'; draft: AgentDraft }
58
+ | { kind: 'key-override'; agentId: string; apiKey: string }
59
+ | { kind: 'key-clear'; agentId: string }
60
+
61
+ export function draftOf(agent?: AgentView): AgentDraft {
62
+ return {
63
+ ...(agent && { id: agent.id }),
64
+ name: agent?.name ?? '',
65
+ provider: agent?.provider ?? 'openai',
66
+ model: agent?.model ?? '',
67
+ baseURL: agent?.baseURL ?? '',
68
+ organization: agent?.organization ?? '',
69
+ active: agent?.active ?? true,
70
+ apiKey: ''
71
+ }
72
+ }
73
+
74
+ export interface AgentGroup {
75
+ ownerId: string
76
+ inherited: boolean
77
+ /** The owner's place: `그룹 › 본사` when there is more than one domain above, else its name. */
78
+ path: string
79
+ agents: AgentView[]
80
+ }
81
+
82
+ /** This domain's own agents first, then each domain above, closest first. A domain with no agents has no group. */
83
+ export function groupByOwner(settings: AgentSettings): AgentGroup[] {
84
+ const groups: AgentGroup[] = []
85
+ const above = settings.chain.length - 1
86
+ for (const [index, domain] of settings.chain.entries()) {
87
+ const agents = settings.agents.filter(one => one.owner.id === domain.id)
88
+ if (!agents.length && index > 0) continue
89
+ const path =
90
+ above > 1
91
+ ? settings.chain
92
+ .slice(index)
93
+ .reverse()
94
+ .map(one => one.name)
95
+ .join(' › ')
96
+ : domain.name
97
+ groups.push({ ownerId: domain.id, inherited: index > 0, path, agents })
98
+ }
99
+ return groups
100
+ }
101
+
102
+ /** The whole save for one action on the card. */
103
+ export function saveInput(settings: AgentSettings, change: SaveChange) {
104
+ let agents = settings.agents
105
+ .filter(one => !one.inherited)
106
+ .map(one => ({
107
+ id: one.id,
108
+ name: one.name,
109
+ provider: one.provider,
110
+ model: one.model,
111
+ ...(one.baseURL && { baseURL: one.baseURL }),
112
+ ...(one.organization && { organization: one.organization }),
113
+ active: one.active
114
+ })) as Array<Record<string, any>>
115
+ /* Only this domain's own choice is written - an inherited or a first-by-name default is not pinned here. */
116
+ let defaultAgentId = settings.defaultFrom === 'own' ? settings.defaultAgentId ?? undefined : undefined
117
+ let turnedOff = settings.agents.filter(one => one.inherited && one.turnedOff).map(one => one.id)
118
+ let inheritedKeys: Array<{ agentId: string; apiKey?: string; clear?: boolean }> | undefined
119
+
120
+ switch (change.kind) {
121
+ case 'default':
122
+ defaultAgentId = change.agentId
123
+ break
124
+ case 'turn-off':
125
+ turnedOff = change.off ? [...new Set([...turnedOff, change.agentId])] : turnedOff.filter(id => id !== change.agentId)
126
+ if (change.off && defaultAgentId === change.agentId) defaultAgentId = undefined
127
+ break
128
+ case 'active':
129
+ agents = agents.map(one => (one.id === change.agentId ? { ...one, active: change.active } : one))
130
+ break
131
+ case 'delete':
132
+ agents = agents.filter(one => one.id !== change.agentId)
133
+ if (defaultAgentId === change.agentId) defaultAgentId = undefined
134
+ break
135
+ case 'upsert': {
136
+ const { draft } = change
137
+ const written = {
138
+ ...(draft.id && { id: draft.id }),
139
+ name: draft.name.trim(),
140
+ provider: draft.provider,
141
+ model: draft.model,
142
+ ...(draft.baseURL.trim() && { baseURL: draft.baseURL.trim() }),
143
+ ...(draft.provider === 'openai' && draft.organization.trim() && { organization: draft.organization.trim() }),
144
+ active: draft.active,
145
+ ...(draft.apiKey.trim() && { apiKey: draft.apiKey.trim() })
146
+ }
147
+ agents = draft.id ? agents.map(one => (one.id === draft.id ? written : one)) : [...agents, written]
148
+ break
149
+ }
150
+ case 'key-override':
151
+ inheritedKeys = [{ agentId: change.agentId, apiKey: change.apiKey }]
152
+ break
153
+ case 'key-clear':
154
+ inheritedKeys = [{ agentId: change.agentId, clear: true }]
155
+ break
156
+ }
157
+
158
+ return {
159
+ agents,
160
+ ...(defaultAgentId && { defaultAgentId }),
161
+ turnedOff,
162
+ ...(inheritedKeys && { inheritedKeys })
163
+ }
164
+ }