@jskit-ai/assistant 0.1.4
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/package.descriptor.mjs +284 -0
- package/package.json +31 -0
- package/src/client/components/AssistantClientElement.vue +1316 -0
- package/src/client/components/AssistantConsoleSettingsClientElement.vue +71 -0
- package/src/client/components/AssistantSettingsFormCard.vue +76 -0
- package/src/client/components/AssistantWorkspaceClientElement.vue +15 -0
- package/src/client/components/AssistantWorkspaceSettingsClientElement.vue +73 -0
- package/src/client/composables/useAssistantWorkspaceRuntime.js +789 -0
- package/src/client/index.js +12 -0
- package/src/client/lib/assistantApi.js +137 -0
- package/src/client/lib/assistantHttpClient.js +10 -0
- package/src/client/lib/markdownRenderer.js +31 -0
- package/src/client/providers/AssistantWebClientProvider.js +25 -0
- package/src/server/AssistantServiceProvider.js +179 -0
- package/src/server/actionIds.js +11 -0
- package/src/server/actions.js +191 -0
- package/src/server/diTokens.js +19 -0
- package/src/server/lib/aiClient.js +43 -0
- package/src/server/lib/ndjson.js +47 -0
- package/src/server/lib/providers/anthropicClient.js +375 -0
- package/src/server/lib/providers/common.js +158 -0
- package/src/server/lib/providers/deepSeekClient.js +22 -0
- package/src/server/lib/providers/openAiClient.js +13 -0
- package/src/server/lib/providers/openAiCompatibleClient.js +69 -0
- package/src/server/lib/resolveWorkspaceSlug.js +24 -0
- package/src/server/lib/serviceToolCatalog.js +459 -0
- package/src/server/registerRoutes.js +384 -0
- package/src/server/repositories/assistantSettingsRepository.js +100 -0
- package/src/server/repositories/conversationsRepository.js +244 -0
- package/src/server/repositories/messagesRepository.js +154 -0
- package/src/server/repositories/repositoryPersistenceUtils.js +63 -0
- package/src/server/services/assistantSettingsService.js +153 -0
- package/src/server/services/chatService.js +987 -0
- package/src/server/services/transcriptService.js +334 -0
- package/src/shared/assistantPaths.js +50 -0
- package/src/shared/assistantResource.js +323 -0
- package/src/shared/assistantSettingsResource.js +214 -0
- package/src/shared/index.js +39 -0
- package/src/shared/queryKeys.js +69 -0
- package/src/shared/settingsEvents.js +7 -0
- package/src/shared/streamEvents.js +31 -0
- package/src/shared/support/positiveInteger.js +9 -0
- package/templates/migrations/assistant_settings_initial.cjs +39 -0
- package/templates/migrations/assistant_transcripts_initial.cjs +51 -0
- package/templates/src/pages/admin/workspace/assistant/index.vue +7 -0
- package/test/aiConfigValidation.test.js +15 -0
- package/test/assistantApiSurfaceHeader.test.js +64 -0
- package/test/assistantResource.test.js +53 -0
- package/test/assistantSettingsResource.test.js +48 -0
- package/test/assistantSettingsService.test.js +133 -0
- package/test/chatService.test.js +841 -0
- package/test/descriptorSurfaceOption.test.js +35 -0
- package/test/queryKeys.test.js +41 -0
- package/test/resolveWorkspaceSlug.test.js +83 -0
- package/test/routeInputContracts.test.js +287 -0
- package/test/serviceToolCatalog.test.js +1235 -0
- package/test/transcriptService.test.js +175 -0
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
export default Object.freeze({
|
|
2
|
+
packageVersion: 1,
|
|
3
|
+
packageId: "@jskit-ai/assistant",
|
|
4
|
+
version: "0.1.4",
|
|
5
|
+
description: "Unified assistant module with streaming chat, transcript persistence, service-aware tool execution, and workspace UI.",
|
|
6
|
+
options: {
|
|
7
|
+
"ai-provider": {
|
|
8
|
+
required: true,
|
|
9
|
+
defaultValue: "openai",
|
|
10
|
+
promptLabel: "AI provider",
|
|
11
|
+
promptHint: "Supported values: openai | deepseek | anthropic."
|
|
12
|
+
},
|
|
13
|
+
"ai-api-key": {
|
|
14
|
+
required: true,
|
|
15
|
+
allowEmpty: true,
|
|
16
|
+
defaultValue: "",
|
|
17
|
+
promptLabel: "AI API key",
|
|
18
|
+
promptHint: "Leave empty to keep assistant disabled until you add a key."
|
|
19
|
+
},
|
|
20
|
+
"ai-base-url": {
|
|
21
|
+
required: true,
|
|
22
|
+
allowEmpty: true,
|
|
23
|
+
defaultValue: "",
|
|
24
|
+
promptLabel: "AI base URL",
|
|
25
|
+
promptHint: "Optional provider-compatible base URL override."
|
|
26
|
+
},
|
|
27
|
+
"ai-timeout-ms": {
|
|
28
|
+
required: true,
|
|
29
|
+
defaultValue: "120000",
|
|
30
|
+
promptLabel: "AI timeout (ms)",
|
|
31
|
+
promptHint: "Abort AI requests after this many milliseconds."
|
|
32
|
+
},
|
|
33
|
+
surfaces: {
|
|
34
|
+
required: true,
|
|
35
|
+
inputType: "text",
|
|
36
|
+
defaultValue: "admin",
|
|
37
|
+
promptLabel: "Target workspace surfaces",
|
|
38
|
+
promptHint: "Comma-separated workspace surface ids for assistant page + menu placement (for example: admin,app)."
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
dependsOn: [
|
|
42
|
+
"@jskit-ai/auth-core",
|
|
43
|
+
"@jskit-ai/database-runtime",
|
|
44
|
+
"@jskit-ai/http-runtime",
|
|
45
|
+
"@jskit-ai/realtime",
|
|
46
|
+
"@jskit-ai/users-core",
|
|
47
|
+
"@jskit-ai/users-web"
|
|
48
|
+
],
|
|
49
|
+
capabilities: {
|
|
50
|
+
provides: ["assistant"],
|
|
51
|
+
requires: [
|
|
52
|
+
"runtime.actions",
|
|
53
|
+
"runtime.database",
|
|
54
|
+
"auth.policy",
|
|
55
|
+
"users.core",
|
|
56
|
+
"users.web",
|
|
57
|
+
"runtime.realtime.client"
|
|
58
|
+
]
|
|
59
|
+
},
|
|
60
|
+
runtime: {
|
|
61
|
+
server: {
|
|
62
|
+
providers: [
|
|
63
|
+
{
|
|
64
|
+
entrypoint: "src/server/AssistantServiceProvider.js",
|
|
65
|
+
export: "AssistantServiceProvider"
|
|
66
|
+
}
|
|
67
|
+
]
|
|
68
|
+
},
|
|
69
|
+
client: {
|
|
70
|
+
providers: [
|
|
71
|
+
{
|
|
72
|
+
entrypoint: "src/client/providers/AssistantWebClientProvider.js",
|
|
73
|
+
export: "AssistantWebClientProvider"
|
|
74
|
+
}
|
|
75
|
+
]
|
|
76
|
+
}
|
|
77
|
+
},
|
|
78
|
+
metadata: {
|
|
79
|
+
apiSummary: {
|
|
80
|
+
surfaces: [
|
|
81
|
+
{
|
|
82
|
+
subpath: "./server/AssistantServiceProvider",
|
|
83
|
+
summary: "Exports assistant runtime provider."
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
subpath: "./client",
|
|
87
|
+
summary: "Exports assistant workspace element and composables."
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
subpath: "./shared",
|
|
91
|
+
summary: "Exports assistant API paths, query keys, stream events, and resource validators."
|
|
92
|
+
}
|
|
93
|
+
],
|
|
94
|
+
containerTokens: {
|
|
95
|
+
server: [
|
|
96
|
+
"assistant.chat.service",
|
|
97
|
+
"assistant.settings.service",
|
|
98
|
+
"assistant.transcript.service",
|
|
99
|
+
"assistant.conversation.repository",
|
|
100
|
+
"assistant.message.repository",
|
|
101
|
+
"assistant.settings.repository"
|
|
102
|
+
],
|
|
103
|
+
client: [
|
|
104
|
+
"assistant.web.console-settings.element",
|
|
105
|
+
"assistant.web.workspace-settings.element"
|
|
106
|
+
]
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
},
|
|
110
|
+
mutations: {
|
|
111
|
+
dependencies: {
|
|
112
|
+
runtime: {
|
|
113
|
+
"@jskit-ai/assistant": "0.1.4",
|
|
114
|
+
"@jskit-ai/auth-core": "0.1.4",
|
|
115
|
+
"@jskit-ai/database-runtime": "0.1.4",
|
|
116
|
+
"@jskit-ai/http-runtime": "0.1.4",
|
|
117
|
+
"@jskit-ai/kernel": "0.1.4",
|
|
118
|
+
"@jskit-ai/realtime": "0.1.4",
|
|
119
|
+
"@jskit-ai/users-core": "0.1.4",
|
|
120
|
+
"@jskit-ai/users-web": "0.1.4",
|
|
121
|
+
"@tanstack/vue-query": "^5.90.5",
|
|
122
|
+
"dompurify": "^3.3.3",
|
|
123
|
+
"marked": "^17.0.4",
|
|
124
|
+
"openai": "^6.22.0",
|
|
125
|
+
"typebox": "^1.0.81",
|
|
126
|
+
"vuetify": "^4.0.0"
|
|
127
|
+
},
|
|
128
|
+
dev: {}
|
|
129
|
+
},
|
|
130
|
+
packageJson: {
|
|
131
|
+
scripts: {}
|
|
132
|
+
},
|
|
133
|
+
procfile: {},
|
|
134
|
+
files: [
|
|
135
|
+
{
|
|
136
|
+
op: "install-migration",
|
|
137
|
+
from: "templates/migrations/assistant_transcripts_initial.cjs",
|
|
138
|
+
toDir: "migrations",
|
|
139
|
+
slug: "assistant_transcripts_initial",
|
|
140
|
+
extension: ".cjs",
|
|
141
|
+
reason: "Install assistant conversation/message schema migration.",
|
|
142
|
+
category: "assistant",
|
|
143
|
+
id: "assistant-transcripts-initial-schema"
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
op: "install-migration",
|
|
147
|
+
from: "templates/migrations/assistant_settings_initial.cjs",
|
|
148
|
+
toDir: "migrations",
|
|
149
|
+
slug: "assistant_settings_initial",
|
|
150
|
+
extension: ".cjs",
|
|
151
|
+
reason: "Install assistant settings schema migration.",
|
|
152
|
+
category: "assistant",
|
|
153
|
+
id: "assistant-settings-initial-schema"
|
|
154
|
+
},
|
|
155
|
+
{
|
|
156
|
+
from: "templates/src/pages/admin/workspace/assistant/index.vue",
|
|
157
|
+
toSurface: "${option:surfaces|lower}",
|
|
158
|
+
toSurfacePath: "workspace/assistant/index.vue",
|
|
159
|
+
reason: "Install assistant workspace page scaffold.",
|
|
160
|
+
category: "assistant",
|
|
161
|
+
id: "assistant-page-admin-workspace-assistant-index",
|
|
162
|
+
when: {
|
|
163
|
+
config: "tenancyMode",
|
|
164
|
+
in: ["personal", "workspace"]
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
],
|
|
168
|
+
text: [
|
|
169
|
+
{
|
|
170
|
+
op: "append-text",
|
|
171
|
+
file: "src/placement.js",
|
|
172
|
+
position: "bottom",
|
|
173
|
+
skipIfContains: "id: \"assistant.workspace.menu\"",
|
|
174
|
+
value:
|
|
175
|
+
"\n(() => {\n const assistantWorkspaceSurfaceIds = \"${option:surfaces|lower}\"\n .split(\",\")\n .map((entry) => String(entry || \"\").trim().toLowerCase())\n .filter(Boolean);\n\n addPlacement({\n id: \"assistant.workspace.menu\",\n host: \"shell-layout\",\n position: \"primary-menu\",\n surfaces: assistantWorkspaceSurfaceIds.length > 0 ? assistantWorkspaceSurfaceIds : [\"*\"],\n order: 310,\n componentToken: \"users.web.shell.surface-aware-menu-link-item\",\n props: {\n label: \"Assistant\",\n workspaceSuffix: \"/workspace/assistant\",\n nonWorkspaceSuffix: \"/workspace/assistant\"\n },\n when: ({ auth }) => Boolean(auth?.authenticated)\n });\n})();\n",
|
|
176
|
+
reason: "Append assistant menu placement into app-owned placement registry.",
|
|
177
|
+
category: "assistant",
|
|
178
|
+
id: "assistant-placement-menu",
|
|
179
|
+
when: {
|
|
180
|
+
config: "tenancyMode",
|
|
181
|
+
in: ["personal", "workspace"]
|
|
182
|
+
}
|
|
183
|
+
},
|
|
184
|
+
{
|
|
185
|
+
op: "append-text",
|
|
186
|
+
file: "src/placement.js",
|
|
187
|
+
position: "bottom",
|
|
188
|
+
skipIfContains: "id: \"assistant.workspace.settings.form\"",
|
|
189
|
+
value:
|
|
190
|
+
"\naddPlacement({\n id: \"assistant.workspace.settings.form\",\n host: \"workspace-settings\",\n position: \"forms\",\n surfaces: [\"*\"],\n order: 250,\n componentToken: \"assistant.web.workspace-settings.element\"\n});\n",
|
|
191
|
+
reason: "Append assistant workspace settings form into app-owned settings placements.",
|
|
192
|
+
category: "assistant",
|
|
193
|
+
id: "assistant-workspace-settings-form-placement",
|
|
194
|
+
when: {
|
|
195
|
+
config: "tenancyMode",
|
|
196
|
+
in: ["personal", "workspace"]
|
|
197
|
+
}
|
|
198
|
+
},
|
|
199
|
+
{
|
|
200
|
+
op: "append-text",
|
|
201
|
+
file: "src/placement.js",
|
|
202
|
+
position: "bottom",
|
|
203
|
+
skipIfContains: "id: \"assistant.console.settings.form\"",
|
|
204
|
+
value:
|
|
205
|
+
"\naddPlacement({\n id: \"assistant.console.settings.form\",\n host: \"console-settings\",\n position: \"forms\",\n surfaces: [\"*\"],\n order: 250,\n componentToken: \"assistant.web.console-settings.element\",\n when: ({ auth }) => Boolean(auth?.authenticated)\n});\n",
|
|
206
|
+
reason: "Append assistant console settings form into app-owned settings placements.",
|
|
207
|
+
category: "assistant",
|
|
208
|
+
id: "assistant-console-settings-form-placement"
|
|
209
|
+
},
|
|
210
|
+
{
|
|
211
|
+
op: "append-text",
|
|
212
|
+
file: "packages/main/src/shared/resources/consoleSettingsFields.js",
|
|
213
|
+
position: "top",
|
|
214
|
+
skipIfContains: "import { Type } from \"typebox\";",
|
|
215
|
+
value: "import { Type } from \"typebox\";\n",
|
|
216
|
+
reason: "Ensure app-owned console settings field registry has TypeBox import for assistant fields.",
|
|
217
|
+
category: "assistant",
|
|
218
|
+
id: "assistant-console-settings-fields-import-typebox"
|
|
219
|
+
},
|
|
220
|
+
{
|
|
221
|
+
op: "append-text",
|
|
222
|
+
file: "packages/main/src/shared/resources/consoleSettingsFields.js",
|
|
223
|
+
position: "bottom",
|
|
224
|
+
skipIfContains: "key: \"workspaceSurfacePrompt\"",
|
|
225
|
+
value:
|
|
226
|
+
"\ndefineField({\n key: \"workspaceSurfacePrompt\",\n dbColumn: \"assistant_workspace_surface_prompt\",\n required: true,\n inputSchema: Type.String({\n maxLength: 12000,\n messages: {\n maxLength: \"Workspace surface system prompt must be at most 12000 characters.\",\n default: \"Workspace surface system prompt must be valid text.\"\n }\n }),\n outputSchema: Type.String({ maxLength: 12000 }),\n normalizeInput: (value) => String(value || \"\"),\n normalizeOutput: (value) => String(value || \"\"),\n resolveDefault: () => \"\"\n});\n",
|
|
227
|
+
reason: "Append assistant console settings field into app-owned console settings field registry.",
|
|
228
|
+
category: "assistant",
|
|
229
|
+
id: "assistant-console-settings-field-definition"
|
|
230
|
+
},
|
|
231
|
+
{
|
|
232
|
+
op: "append-text",
|
|
233
|
+
file: "packages/main/src/shared/resources/workspaceSettingsFields.js",
|
|
234
|
+
position: "bottom",
|
|
235
|
+
skipIfContains: "key: \"appSurfacePrompt\"",
|
|
236
|
+
value:
|
|
237
|
+
"\ndefineField({\n key: \"appSurfacePrompt\",\n dbColumn: \"assistant_app_surface_prompt\",\n required: true,\n inputSchema: Type.String({\n maxLength: 12000,\n messages: {\n maxLength: \"App surface system prompt must be at most 12000 characters.\",\n default: \"App surface system prompt must be valid text.\"\n }\n }),\n outputSchema: Type.String({ maxLength: 12000 }),\n normalizeInput: (value) => String(value || \"\"),\n normalizeOutput: (value) => String(value || \"\"),\n resolveDefault: () => \"\"\n});\n",
|
|
238
|
+
reason: "Append assistant workspace settings field into app-owned workspace settings field registry.",
|
|
239
|
+
category: "assistant",
|
|
240
|
+
id: "assistant-workspace-settings-field-definition",
|
|
241
|
+
when: {
|
|
242
|
+
config: "tenancyMode",
|
|
243
|
+
in: ["personal", "workspace"]
|
|
244
|
+
}
|
|
245
|
+
},
|
|
246
|
+
{
|
|
247
|
+
file: ".env",
|
|
248
|
+
op: "upsert-env",
|
|
249
|
+
key: "AI_PROVIDER",
|
|
250
|
+
value: "${option:ai-provider}",
|
|
251
|
+
reason: "Configure assistant AI provider id.",
|
|
252
|
+
category: "runtime-config",
|
|
253
|
+
id: "assistant-ai-provider"
|
|
254
|
+
},
|
|
255
|
+
{
|
|
256
|
+
file: ".env",
|
|
257
|
+
op: "upsert-env",
|
|
258
|
+
key: "AI_API_KEY",
|
|
259
|
+
value: "${option:ai-api-key}",
|
|
260
|
+
reason: "Configure assistant provider API key.",
|
|
261
|
+
category: "runtime-config",
|
|
262
|
+
id: "assistant-ai-api-key"
|
|
263
|
+
},
|
|
264
|
+
{
|
|
265
|
+
file: ".env",
|
|
266
|
+
op: "upsert-env",
|
|
267
|
+
key: "AI_BASE_URL",
|
|
268
|
+
value: "${option:ai-base-url}",
|
|
269
|
+
reason: "Configure optional assistant provider base URL.",
|
|
270
|
+
category: "runtime-config",
|
|
271
|
+
id: "assistant-ai-base-url"
|
|
272
|
+
},
|
|
273
|
+
{
|
|
274
|
+
file: ".env",
|
|
275
|
+
op: "upsert-env",
|
|
276
|
+
key: "AI_TIMEOUT_MS",
|
|
277
|
+
value: "${option:ai-timeout-ms}",
|
|
278
|
+
reason: "Configure assistant provider timeout.",
|
|
279
|
+
category: "runtime-config",
|
|
280
|
+
id: "assistant-ai-timeout-ms"
|
|
281
|
+
}
|
|
282
|
+
]
|
|
283
|
+
}
|
|
284
|
+
});
|
package/package.json
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@jskit-ai/assistant",
|
|
3
|
+
"version": "0.1.4",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"scripts": {
|
|
6
|
+
"test": "node --test"
|
|
7
|
+
},
|
|
8
|
+
"exports": {
|
|
9
|
+
"./client": "./src/client/index.js",
|
|
10
|
+
"./server/AssistantServiceProvider": "./src/server/AssistantServiceProvider.js",
|
|
11
|
+
"./server/diTokens": "./src/server/diTokens.js",
|
|
12
|
+
"./server/actionIds": "./src/server/actionIds.js",
|
|
13
|
+
"./shared": "./src/shared/index.js"
|
|
14
|
+
},
|
|
15
|
+
"dependencies": {
|
|
16
|
+
"@jskit-ai/auth-core": "0.1.4",
|
|
17
|
+
"@jskit-ai/database-runtime": "0.1.4",
|
|
18
|
+
"@jskit-ai/http-runtime": "0.1.4",
|
|
19
|
+
"@jskit-ai/kernel": "0.1.4",
|
|
20
|
+
"@jskit-ai/realtime": "0.1.4",
|
|
21
|
+
"@jskit-ai/shell-web": "0.1.4",
|
|
22
|
+
"@jskit-ai/users-core": "0.1.4",
|
|
23
|
+
"@jskit-ai/users-web": "0.1.4",
|
|
24
|
+
"@tanstack/vue-query": "^5.90.5",
|
|
25
|
+
"dompurify": "^3.3.3",
|
|
26
|
+
"marked": "^17.0.4",
|
|
27
|
+
"openai": "^6.22.0",
|
|
28
|
+
"typebox": "^1.0.81",
|
|
29
|
+
"vuetify": "^4.0.0"
|
|
30
|
+
}
|
|
31
|
+
}
|