@jskit-ai/assistant 0.1.25 → 0.1.27
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 +12 -12
- package/package.json +9 -10
- package/src/client/components/AssistantConsoleSettingsClientElement.vue +1 -2
- package/src/client/components/AssistantWorkspaceSettingsClientElement.vue +1 -2
- package/src/client/composables/useAssistantWorkspaceRuntime.js +2 -4
- package/src/client/index.js +1 -3
- package/src/client/providers/AssistantWebClientProvider.js +3 -8
- package/src/server/AssistantServiceProvider.js +23 -35
- package/src/server/lib/providers/anthropicClient.js +2 -2
- package/src/server/registerRoutes.js +3 -4
- package/src/server/services/assistantSettingsService.js +2 -6
- package/src/server/services/transcriptService.js +3 -4
- package/src/shared/index.js +1 -3
- package/src/shared/settingsEvents.js +5 -6
- package/src/shared/streamEvents.js +0 -2
- package/test/routeInputContracts.test.js +6 -7
- package/src/server/diTokens.js +0 -19
package/package.descriptor.mjs
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
export default Object.freeze({
|
|
2
2
|
packageVersion: 1,
|
|
3
3
|
packageId: "@jskit-ai/assistant",
|
|
4
|
-
version: "0.1.
|
|
4
|
+
version: "0.1.27",
|
|
5
|
+
kind: "runtime",
|
|
5
6
|
description: "Unified assistant module with streaming chat, transcript persistence, service-aware tool execution, and workspace UI.",
|
|
6
7
|
options: {
|
|
7
8
|
"ai-provider": {
|
|
@@ -93,11 +94,10 @@ export default Object.freeze({
|
|
|
93
94
|
],
|
|
94
95
|
containerTokens: {
|
|
95
96
|
server: [
|
|
96
|
-
"assistant.
|
|
97
|
-
"assistant.settings.service",
|
|
98
|
-
"assistant.transcript.service",
|
|
97
|
+
"assistant.ai.client",
|
|
99
98
|
"assistant.conversation.repository",
|
|
100
99
|
"assistant.message.repository",
|
|
100
|
+
"assistant.service.tool-catalog",
|
|
101
101
|
"assistant.settings.repository"
|
|
102
102
|
],
|
|
103
103
|
client: [
|
|
@@ -110,14 +110,14 @@ export default Object.freeze({
|
|
|
110
110
|
mutations: {
|
|
111
111
|
dependencies: {
|
|
112
112
|
runtime: {
|
|
113
|
-
"@jskit-ai/assistant": "0.1.
|
|
114
|
-
"@jskit-ai/auth-core": "0.1.
|
|
115
|
-
"@jskit-ai/database-runtime": "0.1.
|
|
116
|
-
"@jskit-ai/http-runtime": "0.1.
|
|
117
|
-
"@jskit-ai/kernel": "0.1.
|
|
118
|
-
"@jskit-ai/realtime": "0.1.
|
|
119
|
-
"@jskit-ai/users-core": "0.1.
|
|
120
|
-
"@jskit-ai/users-web": "0.1.
|
|
113
|
+
"@jskit-ai/assistant": "0.1.27",
|
|
114
|
+
"@jskit-ai/auth-core": "0.1.18",
|
|
115
|
+
"@jskit-ai/database-runtime": "0.1.19",
|
|
116
|
+
"@jskit-ai/http-runtime": "0.1.18",
|
|
117
|
+
"@jskit-ai/kernel": "0.1.19",
|
|
118
|
+
"@jskit-ai/realtime": "0.1.18",
|
|
119
|
+
"@jskit-ai/users-core": "0.1.28",
|
|
120
|
+
"@jskit-ai/users-web": "0.1.33",
|
|
121
121
|
"@tanstack/vue-query": "^5.90.5",
|
|
122
122
|
"dompurify": "^3.3.3",
|
|
123
123
|
"marked": "^17.0.4",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jskit-ai/assistant",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.27",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"test": "node --test"
|
|
@@ -8,19 +8,18 @@
|
|
|
8
8
|
"exports": {
|
|
9
9
|
"./client": "./src/client/index.js",
|
|
10
10
|
"./server/AssistantServiceProvider": "./src/server/AssistantServiceProvider.js",
|
|
11
|
-
"./server/diTokens": "./src/server/diTokens.js",
|
|
12
11
|
"./server/actionIds": "./src/server/actionIds.js",
|
|
13
12
|
"./shared": "./src/shared/index.js"
|
|
14
13
|
},
|
|
15
14
|
"dependencies": {
|
|
16
|
-
"@jskit-ai/auth-core": "0.1.
|
|
17
|
-
"@jskit-ai/database-runtime": "0.1.
|
|
18
|
-
"@jskit-ai/http-runtime": "0.1.
|
|
19
|
-
"@jskit-ai/kernel": "0.1.
|
|
20
|
-
"@jskit-ai/realtime": "0.1.
|
|
21
|
-
"@jskit-ai/shell-web": "0.1.
|
|
22
|
-
"@jskit-ai/users-core": "0.1.
|
|
23
|
-
"@jskit-ai/users-web": "0.1.
|
|
15
|
+
"@jskit-ai/auth-core": "0.1.18",
|
|
16
|
+
"@jskit-ai/database-runtime": "0.1.19",
|
|
17
|
+
"@jskit-ai/http-runtime": "0.1.18",
|
|
18
|
+
"@jskit-ai/kernel": "0.1.19",
|
|
19
|
+
"@jskit-ai/realtime": "0.1.18",
|
|
20
|
+
"@jskit-ai/shell-web": "0.1.18",
|
|
21
|
+
"@jskit-ai/users-core": "0.1.28",
|
|
22
|
+
"@jskit-ai/users-web": "0.1.33",
|
|
24
23
|
"@tanstack/vue-query": "^5.90.5",
|
|
25
24
|
"dompurify": "^3.3.3",
|
|
26
25
|
"marked": "^17.0.4",
|
|
@@ -27,7 +27,6 @@ import { validateOperationSection } from "@jskit-ai/http-runtime/shared/validato
|
|
|
27
27
|
import { useAddEdit } from "@jskit-ai/users-web/client/composables/useAddEdit";
|
|
28
28
|
import AssistantSettingsFormCard from "./AssistantSettingsFormCard.vue";
|
|
29
29
|
import { assistantConsoleSettingsResource } from "../../shared/assistantSettingsResource.js";
|
|
30
|
-
import { ASSISTANT_CONSOLE_SETTINGS_CHANGED_EVENT } from "../../shared/settingsEvents.js";
|
|
31
30
|
|
|
32
31
|
const form = reactive({
|
|
33
32
|
workspaceSurfacePrompt: ""
|
|
@@ -47,7 +46,7 @@ const addEdit = useAddEdit({
|
|
|
47
46
|
fallbackSaveError: "Unable to update assistant console settings.",
|
|
48
47
|
fieldErrorKeys: ["workspaceSurfacePrompt"],
|
|
49
48
|
realtime: {
|
|
50
|
-
event:
|
|
49
|
+
event: "assistant.console.settings.changed"
|
|
51
50
|
},
|
|
52
51
|
model: form,
|
|
53
52
|
parseInput: (rawPayload) =>
|
|
@@ -28,7 +28,6 @@ import { useAddEdit } from "@jskit-ai/users-web/client/composables/useAddEdit";
|
|
|
28
28
|
import { matchesCurrentWorkspaceEvent } from "@jskit-ai/users-web/client/support/realtimeWorkspace";
|
|
29
29
|
import AssistantSettingsFormCard from "./AssistantSettingsFormCard.vue";
|
|
30
30
|
import { assistantWorkspaceSettingsResource } from "../../shared/assistantSettingsResource.js";
|
|
31
|
-
import { ASSISTANT_WORKSPACE_SETTINGS_CHANGED_EVENT } from "../../shared/settingsEvents.js";
|
|
32
31
|
|
|
33
32
|
const form = reactive({
|
|
34
33
|
appSurfacePrompt: ""
|
|
@@ -47,7 +46,7 @@ const addEdit = useAddEdit({
|
|
|
47
46
|
fallbackSaveError: "Unable to update assistant workspace settings.",
|
|
48
47
|
fieldErrorKeys: ["appSurfacePrompt"],
|
|
49
48
|
realtime: {
|
|
50
|
-
event:
|
|
49
|
+
event: "assistant.workspace.settings.changed",
|
|
51
50
|
matches: ({ payload = {}, routeContext = {} } = {}) =>
|
|
52
51
|
matchesCurrentWorkspaceEvent(payload, routeContext?.workspaceSlugFromRoute?.value)
|
|
53
52
|
},
|
|
@@ -9,7 +9,6 @@ import { usePagedCollection } from "@jskit-ai/users-web/client/composables/usePa
|
|
|
9
9
|
import {
|
|
10
10
|
MAX_INPUT_CHARS,
|
|
11
11
|
ASSISTANT_STREAM_EVENT_TYPES,
|
|
12
|
-
ASSISTANT_TRANSCRIPT_CHANGED_EVENT,
|
|
13
12
|
MAX_HISTORY_MESSAGES,
|
|
14
13
|
assistantConversationMessagesQueryKey,
|
|
15
14
|
assistantConversationsListQueryKey,
|
|
@@ -27,7 +26,6 @@ const DEFAULT_HISTORY_PAGE_SIZE = 20;
|
|
|
27
26
|
const DEFAULT_MESSAGES_PAGE_SIZE = 200;
|
|
28
27
|
const DEFAULT_HISTORY_STALE_TIME_MS = 60_000;
|
|
29
28
|
const RESTORE_MESSAGES_PAGE = 1;
|
|
30
|
-
const ACTIVE_CONVERSATION_STORAGE_PREFIX = "assistant.activeConversationId";
|
|
31
29
|
|
|
32
30
|
function toNonNegativeInteger(value, fallback = 0) {
|
|
33
31
|
const parsed = Number(value);
|
|
@@ -44,7 +42,7 @@ function buildActiveConversationStorageKey(workspaceSlug) {
|
|
|
44
42
|
return "";
|
|
45
43
|
}
|
|
46
44
|
|
|
47
|
-
return
|
|
45
|
+
return `assistant.activeConversationId:${normalizedWorkspaceSlug}`;
|
|
48
46
|
}
|
|
49
47
|
|
|
50
48
|
function readStoredActiveConversationId(workspaceSlug) {
|
|
@@ -701,7 +699,7 @@ function useAssistantWorkspaceRuntime({ api = null } = {}) {
|
|
|
701
699
|
}
|
|
702
700
|
|
|
703
701
|
useRealtimeEvent({
|
|
704
|
-
event:
|
|
702
|
+
event: "assistant.transcript.changed",
|
|
705
703
|
enabled: computed(() => hasWorkspaceScope.value),
|
|
706
704
|
matches({ payload }) {
|
|
707
705
|
if (!payload || typeof payload !== "object") {
|
package/src/client/index.js
CHANGED
|
@@ -6,7 +6,5 @@ export { useAssistantWorkspaceRuntime } from "./composables/useAssistantWorkspac
|
|
|
6
6
|
export { assistantHttpClient } from "./lib/assistantHttpClient.js";
|
|
7
7
|
export { createAssistantWorkspaceApi, buildStreamEventError } from "./lib/assistantApi.js";
|
|
8
8
|
export {
|
|
9
|
-
AssistantWebClientProvider
|
|
10
|
-
ASSISTANT_CONSOLE_SETTINGS_ELEMENT_TOKEN,
|
|
11
|
-
ASSISTANT_WORKSPACE_SETTINGS_ELEMENT_TOKEN
|
|
9
|
+
AssistantWebClientProvider
|
|
12
10
|
} from "./providers/AssistantWebClientProvider.js";
|
|
@@ -1,9 +1,6 @@
|
|
|
1
1
|
import AssistantConsoleSettingsClientElement from "../components/AssistantConsoleSettingsClientElement.vue";
|
|
2
2
|
import AssistantWorkspaceSettingsClientElement from "../components/AssistantWorkspaceSettingsClientElement.vue";
|
|
3
3
|
|
|
4
|
-
const ASSISTANT_CONSOLE_SETTINGS_ELEMENT_TOKEN = "assistant.web.console-settings.element";
|
|
5
|
-
const ASSISTANT_WORKSPACE_SETTINGS_ELEMENT_TOKEN = "assistant.web.workspace-settings.element";
|
|
6
|
-
|
|
7
4
|
class AssistantWebClientProvider {
|
|
8
5
|
static id = "assistant.web.client";
|
|
9
6
|
static dependsOn = ["users.web.client"];
|
|
@@ -13,13 +10,11 @@ class AssistantWebClientProvider {
|
|
|
13
10
|
throw new Error("AssistantWebClientProvider requires application singleton().");
|
|
14
11
|
}
|
|
15
12
|
|
|
16
|
-
app.singleton(
|
|
17
|
-
app.singleton(
|
|
13
|
+
app.singleton("assistant.web.console-settings.element", () => AssistantConsoleSettingsClientElement);
|
|
14
|
+
app.singleton("assistant.web.workspace-settings.element", () => AssistantWorkspaceSettingsClientElement);
|
|
18
15
|
}
|
|
19
16
|
}
|
|
20
17
|
|
|
21
18
|
export {
|
|
22
|
-
AssistantWebClientProvider
|
|
23
|
-
ASSISTANT_CONSOLE_SETTINGS_ELEMENT_TOKEN,
|
|
24
|
-
ASSISTANT_WORKSPACE_SETTINGS_ELEMENT_TOKEN
|
|
19
|
+
AssistantWebClientProvider
|
|
25
20
|
};
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { KERNEL_TOKENS } from "@jskit-ai/kernel/shared/support/tokens";
|
|
2
1
|
import { withActionDefaults } from "@jskit-ai/kernel/shared/actions";
|
|
3
2
|
import { normalizeObject, normalizeText } from "@jskit-ai/kernel/shared/support/normalize";
|
|
4
3
|
import { createRepository as createConversationsRepository } from "./repositories/conversationsRepository.js";
|
|
@@ -18,18 +17,7 @@ import { createServiceToolCatalog } from "./lib/serviceToolCatalog.js";
|
|
|
18
17
|
import { normalizeOptionalHttpUrl } from "./lib/providers/common.js";
|
|
19
18
|
import { assistantActions } from "./actions.js";
|
|
20
19
|
import { registerRoutes } from "./registerRoutes.js";
|
|
21
|
-
|
|
22
|
-
ASSISTANT_CONVERSATIONS_REPOSITORY_TOKEN,
|
|
23
|
-
ASSISTANT_MESSAGES_REPOSITORY_TOKEN,
|
|
24
|
-
ASSISTANT_SETTINGS_REPOSITORY_TOKEN,
|
|
25
|
-
ASSISTANT_TRANSCRIPT_SERVICE_TOKEN,
|
|
26
|
-
ASSISTANT_CHAT_SERVICE_TOKEN,
|
|
27
|
-
ASSISTANT_SETTINGS_SERVICE_TOKEN,
|
|
28
|
-
ASSISTANT_AI_CLIENT_TOKEN,
|
|
29
|
-
ASSISTANT_SERVICE_TOOL_CATALOG_TOKEN
|
|
30
|
-
} from "./diTokens.js";
|
|
31
|
-
|
|
32
|
-
const ASSISTANT_PROVIDER_ID = ASSISTANT_CHAT_SERVICE_TOKEN;
|
|
20
|
+
|
|
33
21
|
const DEFAULT_AI_TIMEOUT_MS = 120_000;
|
|
34
22
|
|
|
35
23
|
function normalizeInteger(value, fallback) {
|
|
@@ -48,7 +36,7 @@ function normalizeStringArray(value) {
|
|
|
48
36
|
|
|
49
37
|
function resolveAssistantConfig(scope) {
|
|
50
38
|
const appConfig = scope.has("appConfig") ? normalizeObject(scope.make("appConfig")) : {};
|
|
51
|
-
const env = scope.has(
|
|
39
|
+
const env = scope.has("jskit.env") ? normalizeObject(scope.make("jskit.env")) : {};
|
|
52
40
|
const assistantConfig = normalizeObject(appConfig.assistant);
|
|
53
41
|
|
|
54
42
|
const provider = normalizeText(env.AI_PROVIDER || assistantConfig.provider).toLowerCase() || "openai";
|
|
@@ -78,7 +66,7 @@ function resolveAssistantConfig(scope) {
|
|
|
78
66
|
}
|
|
79
67
|
|
|
80
68
|
class AssistantServiceProvider {
|
|
81
|
-
static id =
|
|
69
|
+
static id = "assistant.chat.service";
|
|
82
70
|
|
|
83
71
|
static dependsOn = ["runtime.actions", "runtime.database", "auth.policy.fastify", "users.core", "runtime.realtime"];
|
|
84
72
|
|
|
@@ -94,26 +82,26 @@ class AssistantServiceProvider {
|
|
|
94
82
|
|
|
95
83
|
const config = resolveAssistantConfig(app);
|
|
96
84
|
|
|
97
|
-
app.singleton(
|
|
98
|
-
const knex = scope.make(
|
|
85
|
+
app.singleton("assistant.conversation.repository", (scope) => {
|
|
86
|
+
const knex = scope.make("jskit.database.knex");
|
|
99
87
|
return createConversationsRepository(knex);
|
|
100
88
|
});
|
|
101
89
|
|
|
102
|
-
app.singleton(
|
|
103
|
-
const knex = scope.make(
|
|
90
|
+
app.singleton("assistant.message.repository", (scope) => {
|
|
91
|
+
const knex = scope.make("jskit.database.knex");
|
|
104
92
|
return createMessagesRepository(knex);
|
|
105
93
|
});
|
|
106
94
|
|
|
107
|
-
app.singleton(
|
|
108
|
-
const knex = scope.make(
|
|
95
|
+
app.singleton("assistant.settings.repository", (scope) => {
|
|
96
|
+
const knex = scope.make("jskit.database.knex");
|
|
109
97
|
return createAssistantSettingsRepository(knex);
|
|
110
98
|
});
|
|
111
99
|
|
|
112
|
-
app.singleton(
|
|
100
|
+
app.singleton("assistant.ai.client", () => {
|
|
113
101
|
return createAiClient(config.ai);
|
|
114
102
|
});
|
|
115
103
|
|
|
116
|
-
app.singleton(
|
|
104
|
+
app.singleton("assistant.service.tool-catalog", (scope) => {
|
|
117
105
|
const skipPrefixes = ["assistant.", ...config.toolSkipActionPrefixes];
|
|
118
106
|
|
|
119
107
|
return createServiceToolCatalog(scope, {
|
|
@@ -123,11 +111,11 @@ class AssistantServiceProvider {
|
|
|
123
111
|
});
|
|
124
112
|
|
|
125
113
|
app.service(
|
|
126
|
-
|
|
114
|
+
"assistant.transcript.service",
|
|
127
115
|
(scope) =>
|
|
128
116
|
createTranscriptService({
|
|
129
|
-
conversationsRepository: scope.make(
|
|
130
|
-
messagesRepository: scope.make(
|
|
117
|
+
conversationsRepository: scope.make("assistant.conversation.repository"),
|
|
118
|
+
messagesRepository: scope.make("assistant.message.repository")
|
|
131
119
|
}),
|
|
132
120
|
{
|
|
133
121
|
events: transcriptServiceEvents
|
|
@@ -135,10 +123,10 @@ class AssistantServiceProvider {
|
|
|
135
123
|
);
|
|
136
124
|
|
|
137
125
|
app.service(
|
|
138
|
-
|
|
126
|
+
"assistant.settings.service",
|
|
139
127
|
(scope) =>
|
|
140
128
|
createAssistantSettingsService({
|
|
141
|
-
assistantSettingsRepository: scope.make(
|
|
129
|
+
assistantSettingsRepository: scope.make("assistant.settings.repository"),
|
|
142
130
|
consoleService: scope.make("consoleService")
|
|
143
131
|
}),
|
|
144
132
|
{
|
|
@@ -147,13 +135,13 @@ class AssistantServiceProvider {
|
|
|
147
135
|
);
|
|
148
136
|
|
|
149
137
|
app.service(
|
|
150
|
-
|
|
138
|
+
"assistant.chat.service",
|
|
151
139
|
(scope) =>
|
|
152
140
|
createChatService({
|
|
153
|
-
aiClient: scope.make(
|
|
154
|
-
transcriptService: scope.make(
|
|
155
|
-
serviceToolCatalog: scope.make(
|
|
156
|
-
assistantSettingsService: scope.make(
|
|
141
|
+
aiClient: scope.make("assistant.ai.client"),
|
|
142
|
+
transcriptService: scope.make("assistant.transcript.service"),
|
|
143
|
+
serviceToolCatalog: scope.make("assistant.service.tool-catalog"),
|
|
144
|
+
assistantSettingsService: scope.make("assistant.settings.service")
|
|
157
145
|
}),
|
|
158
146
|
{
|
|
159
147
|
events: {}
|
|
@@ -164,8 +152,8 @@ class AssistantServiceProvider {
|
|
|
164
152
|
withActionDefaults(assistantActions, {
|
|
165
153
|
domain: "assistant",
|
|
166
154
|
dependencies: {
|
|
167
|
-
chatService:
|
|
168
|
-
assistantSettingsService:
|
|
155
|
+
chatService: "assistant.chat.service",
|
|
156
|
+
assistantSettingsService: "assistant.settings.service"
|
|
169
157
|
}
|
|
170
158
|
})
|
|
171
159
|
);
|
|
@@ -13,7 +13,7 @@ import {
|
|
|
13
13
|
|
|
14
14
|
const DEFAULT_ANTHROPIC_MODEL = "claude-3-5-sonnet-latest";
|
|
15
15
|
const DEFAULT_ANTHROPIC_BASE_URL = "https://api.anthropic.com";
|
|
16
|
-
const
|
|
16
|
+
const DEFAULT_ANTHROPIC_MAX_OUTPUT_LIMIT = 4096;
|
|
17
17
|
const DEFAULT_ANTHROPIC_VERSION = "2023-06-01";
|
|
18
18
|
|
|
19
19
|
function normalizeTemperature(value, fallback = 0.2) {
|
|
@@ -250,7 +250,7 @@ async function fetchAnthropicMessage({
|
|
|
250
250
|
|
|
251
251
|
const requestPayload = {
|
|
252
252
|
model,
|
|
253
|
-
max_tokens:
|
|
253
|
+
max_tokens: DEFAULT_ANTHROPIC_MAX_OUTPUT_LIMIT,
|
|
254
254
|
messages,
|
|
255
255
|
temperature: normalizeTemperature(temperature)
|
|
256
256
|
};
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { withStandardErrorResponses } from "@jskit-ai/http-runtime/shared/validators/errorResponses";
|
|
2
|
-
import { KERNEL_TOKENS } from "@jskit-ai/kernel/shared/support/tokens";
|
|
3
2
|
import { normalizeText } from "@jskit-ai/kernel/shared/support/normalize";
|
|
4
3
|
import {
|
|
5
4
|
workspaceSlugParamsValidator
|
|
@@ -50,7 +49,7 @@ function registerRoutes(app) {
|
|
|
50
49
|
throw new Error("registerRoutes requires application make().");
|
|
51
50
|
}
|
|
52
51
|
|
|
53
|
-
const router = app.make(
|
|
52
|
+
const router = app.make("jskit.http.router");
|
|
54
53
|
const visibility = "workspace";
|
|
55
54
|
const workspaceRouteSurfaceConfig = resolveAssistantWorkspaceRouteSurfaceConfig(app);
|
|
56
55
|
const workspaceRouteSurfaceId = workspaceRouteSurfaceConfig.fallbackSurfaceId;
|
|
@@ -115,7 +114,7 @@ function registerRoutes(app) {
|
|
|
115
114
|
|
|
116
115
|
router.register(
|
|
117
116
|
"GET",
|
|
118
|
-
"/api/w/:workspaceSlug/
|
|
117
|
+
"/api/w/:workspaceSlug/settings/assistant",
|
|
119
118
|
{
|
|
120
119
|
auth: "required",
|
|
121
120
|
surface: workspaceRouteSurfaceId,
|
|
@@ -146,7 +145,7 @@ function registerRoutes(app) {
|
|
|
146
145
|
|
|
147
146
|
router.register(
|
|
148
147
|
"PATCH",
|
|
149
|
-
"/api/w/:workspaceSlug/
|
|
148
|
+
"/api/w/:workspaceSlug/settings/assistant",
|
|
150
149
|
{
|
|
151
150
|
auth: "required",
|
|
152
151
|
surface: workspaceRouteSurfaceId,
|
|
@@ -2,10 +2,6 @@ import { parsePositiveInteger } from "@jskit-ai/kernel/server/runtime";
|
|
|
2
2
|
import { normalizeObjectInput } from "@jskit-ai/kernel/shared/validators";
|
|
3
3
|
import { normalizeText } from "@jskit-ai/kernel/shared/support/normalize";
|
|
4
4
|
import { pickOwnProperties } from "@jskit-ai/kernel/shared/support";
|
|
5
|
-
import {
|
|
6
|
-
ASSISTANT_CONSOLE_SETTINGS_CHANGED_EVENT,
|
|
7
|
-
ASSISTANT_WORKSPACE_SETTINGS_CHANGED_EVENT
|
|
8
|
-
} from "../../shared/settingsEvents.js";
|
|
9
5
|
|
|
10
6
|
const serviceEvents = Object.freeze({
|
|
11
7
|
updateConsoleSettings: Object.freeze([
|
|
@@ -16,7 +12,7 @@ const serviceEvents = Object.freeze({
|
|
|
16
12
|
operation: "updated",
|
|
17
13
|
entityId: 1,
|
|
18
14
|
realtime: Object.freeze({
|
|
19
|
-
event:
|
|
15
|
+
event: "assistant.console.settings.changed",
|
|
20
16
|
audience: "all_users"
|
|
21
17
|
})
|
|
22
18
|
})
|
|
@@ -29,7 +25,7 @@ const serviceEvents = Object.freeze({
|
|
|
29
25
|
operation: "updated",
|
|
30
26
|
entityId: ({ args }) => args?.[0]?.id || null,
|
|
31
27
|
realtime: Object.freeze({
|
|
32
|
-
event:
|
|
28
|
+
event: "assistant.workspace.settings.changed",
|
|
33
29
|
audience: "event_scope",
|
|
34
30
|
payload: ({ args }) => ({
|
|
35
31
|
workspaceSlug: String(args?.[0]?.slug || "").trim()
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { AppError, parsePositiveInteger } from "@jskit-ai/kernel/server/runtime";
|
|
2
2
|
import { normalizeObject, normalizeText } from "@jskit-ai/kernel/shared/support/normalize";
|
|
3
|
-
import { ASSISTANT_TRANSCRIPT_CHANGED_EVENT } from "../../shared/streamEvents.js";
|
|
4
3
|
import { normalizeConversationStatus } from "../../shared/support/conversationStatus.js";
|
|
5
4
|
|
|
6
5
|
const DEFAULT_PAGE_SIZE = 20;
|
|
@@ -19,7 +18,7 @@ const serviceEvents = Object.freeze({
|
|
|
19
18
|
operation: ({ result }) => (result?.created === true ? "created" : "updated"),
|
|
20
19
|
entityId: ({ result }) => result?.conversation?.id,
|
|
21
20
|
realtime: Object.freeze({
|
|
22
|
-
event:
|
|
21
|
+
event: "assistant.transcript.changed",
|
|
23
22
|
audience: "event_scope",
|
|
24
23
|
payload: ({ result }) => ({
|
|
25
24
|
conversationId: result?.conversation?.id || null
|
|
@@ -35,7 +34,7 @@ const serviceEvents = Object.freeze({
|
|
|
35
34
|
operation: "updated",
|
|
36
35
|
entityId: ({ result }) => result?.conversationId,
|
|
37
36
|
realtime: Object.freeze({
|
|
38
|
-
event:
|
|
37
|
+
event: "assistant.transcript.changed",
|
|
39
38
|
audience: "event_scope",
|
|
40
39
|
payload: ({ result }) => ({
|
|
41
40
|
conversationId: result?.conversationId || null
|
|
@@ -51,7 +50,7 @@ const serviceEvents = Object.freeze({
|
|
|
51
50
|
operation: "updated",
|
|
52
51
|
entityId: ({ result }) => result?.id,
|
|
53
52
|
realtime: Object.freeze({
|
|
54
|
-
event:
|
|
53
|
+
event: "assistant.transcript.changed",
|
|
55
54
|
audience: "event_scope",
|
|
56
55
|
payload: ({ result }) => ({
|
|
57
56
|
conversationId: result?.id || null
|
package/src/shared/index.js
CHANGED
|
@@ -15,7 +15,6 @@ export {
|
|
|
15
15
|
|
|
16
16
|
export {
|
|
17
17
|
ASSISTANT_STREAM_EVENT_TYPES,
|
|
18
|
-
ASSISTANT_TRANSCRIPT_CHANGED_EVENT,
|
|
19
18
|
normalizeAssistantStreamEventType
|
|
20
19
|
} from "./streamEvents.js";
|
|
21
20
|
|
|
@@ -32,8 +31,7 @@ export {
|
|
|
32
31
|
} from "./assistantSettingsResource.js";
|
|
33
32
|
|
|
34
33
|
export {
|
|
35
|
-
|
|
36
|
-
ASSISTANT_WORKSPACE_SETTINGS_CHANGED_EVENT
|
|
34
|
+
assistantSettingsEvents
|
|
37
35
|
} from "./settingsEvents.js";
|
|
38
36
|
|
|
39
37
|
export {
|
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
const
|
|
2
|
-
|
|
1
|
+
const assistantSettingsEvents = Object.freeze({
|
|
2
|
+
consoleSettingsChanged: "assistant.console.settings.changed",
|
|
3
|
+
workspaceSettingsChanged: "assistant.workspace.settings.changed"
|
|
4
|
+
});
|
|
3
5
|
|
|
4
|
-
export {
|
|
5
|
-
ASSISTANT_CONSOLE_SETTINGS_CHANGED_EVENT,
|
|
6
|
-
ASSISTANT_WORKSPACE_SETTINGS_CHANGED_EVENT
|
|
7
|
-
};
|
|
6
|
+
export { assistantSettingsEvents };
|
|
@@ -8,7 +8,6 @@ const ASSISTANT_STREAM_EVENT_TYPES = Object.freeze({
|
|
|
8
8
|
DONE: "done"
|
|
9
9
|
});
|
|
10
10
|
|
|
11
|
-
const ASSISTANT_TRANSCRIPT_CHANGED_EVENT = "assistant.transcript.changed";
|
|
12
11
|
const STREAM_EVENT_TYPE_SET = new Set(Object.values(ASSISTANT_STREAM_EVENT_TYPES));
|
|
13
12
|
|
|
14
13
|
function normalizeAssistantStreamEventType(value, fallback = "") {
|
|
@@ -26,6 +25,5 @@ function normalizeAssistantStreamEventType(value, fallback = "") {
|
|
|
26
25
|
|
|
27
26
|
export {
|
|
28
27
|
ASSISTANT_STREAM_EVENT_TYPES,
|
|
29
|
-
ASSISTANT_TRANSCRIPT_CHANGED_EVENT,
|
|
30
28
|
normalizeAssistantStreamEventType
|
|
31
29
|
};
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import assert from "node:assert/strict";
|
|
2
2
|
import test from "node:test";
|
|
3
|
-
import { KERNEL_TOKENS } from "@jskit-ai/kernel/shared/support/tokens";
|
|
4
3
|
import { registerRoutes } from "../src/server/registerRoutes.js";
|
|
5
4
|
|
|
6
5
|
function createReplyDouble() {
|
|
@@ -36,7 +35,7 @@ test("assistant routes build list inputs with explicit query object", async () =
|
|
|
36
35
|
};
|
|
37
36
|
const app = {
|
|
38
37
|
make(token) {
|
|
39
|
-
if (token !==
|
|
38
|
+
if (token !== "jskit.http.router") {
|
|
40
39
|
throw new Error(`Unexpected token: ${String(token)}`);
|
|
41
40
|
}
|
|
42
41
|
return router;
|
|
@@ -56,12 +55,12 @@ test("assistant routes build list inputs with explicit query object", async () =
|
|
|
56
55
|
const workspaceSettingsReadRoute = findRoute(
|
|
57
56
|
registeredRoutes,
|
|
58
57
|
"GET",
|
|
59
|
-
"/api/w/:workspaceSlug/
|
|
58
|
+
"/api/w/:workspaceSlug/settings/assistant"
|
|
60
59
|
);
|
|
61
60
|
const workspaceSettingsPatchRoute = findRoute(
|
|
62
61
|
registeredRoutes,
|
|
63
62
|
"PATCH",
|
|
64
|
-
"/api/w/:workspaceSlug/
|
|
63
|
+
"/api/w/:workspaceSlug/settings/assistant"
|
|
65
64
|
);
|
|
66
65
|
assert.ok(conversationsRoute);
|
|
67
66
|
assert.ok(messagesRoute);
|
|
@@ -198,7 +197,7 @@ test("assistant workspace routes use workspace default surface and honor x-jskit
|
|
|
198
197
|
return token === "appConfig";
|
|
199
198
|
},
|
|
200
199
|
make(token) {
|
|
201
|
-
if (token ===
|
|
200
|
+
if (token === "jskit.http.router") {
|
|
202
201
|
return router;
|
|
203
202
|
}
|
|
204
203
|
if (token === "appConfig") {
|
|
@@ -230,8 +229,8 @@ test("assistant workspace routes use workspace default surface and honor x-jskit
|
|
|
230
229
|
registerRoutes(app);
|
|
231
230
|
|
|
232
231
|
const expectedWorkspaceRoutes = [
|
|
233
|
-
["GET", "/api/w/:workspaceSlug/
|
|
234
|
-
["PATCH", "/api/w/:workspaceSlug/
|
|
232
|
+
["GET", "/api/w/:workspaceSlug/settings/assistant"],
|
|
233
|
+
["PATCH", "/api/w/:workspaceSlug/settings/assistant"],
|
|
235
234
|
["POST", "/api/w/:workspaceSlug/assistant/chat/stream"],
|
|
236
235
|
["GET", "/api/w/:workspaceSlug/assistant/conversations"],
|
|
237
236
|
["GET", "/api/w/:workspaceSlug/assistant/conversations/:conversationId/messages"]
|
package/src/server/diTokens.js
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
const ASSISTANT_CONVERSATIONS_REPOSITORY_TOKEN = "assistant.conversation.repository";
|
|
2
|
-
const ASSISTANT_MESSAGES_REPOSITORY_TOKEN = "assistant.message.repository";
|
|
3
|
-
const ASSISTANT_SETTINGS_REPOSITORY_TOKEN = "assistant.settings.repository";
|
|
4
|
-
const ASSISTANT_TRANSCRIPT_SERVICE_TOKEN = "assistant.transcript.service";
|
|
5
|
-
const ASSISTANT_CHAT_SERVICE_TOKEN = "assistant.chat.service";
|
|
6
|
-
const ASSISTANT_SETTINGS_SERVICE_TOKEN = "assistant.settings.service";
|
|
7
|
-
const ASSISTANT_AI_CLIENT_TOKEN = "assistant.ai.client";
|
|
8
|
-
const ASSISTANT_SERVICE_TOOL_CATALOG_TOKEN = "assistant.service.tool-catalog";
|
|
9
|
-
|
|
10
|
-
export {
|
|
11
|
-
ASSISTANT_CONVERSATIONS_REPOSITORY_TOKEN,
|
|
12
|
-
ASSISTANT_MESSAGES_REPOSITORY_TOKEN,
|
|
13
|
-
ASSISTANT_SETTINGS_REPOSITORY_TOKEN,
|
|
14
|
-
ASSISTANT_TRANSCRIPT_SERVICE_TOKEN,
|
|
15
|
-
ASSISTANT_CHAT_SERVICE_TOKEN,
|
|
16
|
-
ASSISTANT_SETTINGS_SERVICE_TOKEN,
|
|
17
|
-
ASSISTANT_AI_CLIENT_TOKEN,
|
|
18
|
-
ASSISTANT_SERVICE_TOOL_CATALOG_TOKEN
|
|
19
|
-
};
|