@jskit-ai/assistant 0.1.32 → 0.1.34

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 (76) hide show
  1. package/package.descriptor.mjs +346 -142
  2. package/package.json +3 -19
  3. package/src/server/buildTemplateContext.js +107 -0
  4. package/templates/migrations/assistant_config_initial.cjs +25 -0
  5. package/templates/migrations/assistant_transcripts_initial.cjs +21 -14
  6. package/templates/src/local-package/client/components/AssistantSettingsClientElement.vue +88 -0
  7. package/templates/src/local-package/client/components/AssistantSurfaceClientElement.vue +10 -0
  8. package/{src/client/composables/useAssistantWorkspaceRuntime.js → templates/src/local-package/client/composables/useAssistantRuntime.js} +91 -114
  9. package/templates/src/local-package/client/index.js +3 -0
  10. package/templates/src/local-package/client/providers/AssistantClientProvider.js +16 -0
  11. package/templates/src/local-package/package.descriptor.mjs +85 -0
  12. package/templates/src/local-package/package.json +11 -0
  13. package/{src/server/AssistantServiceProvider.js → templates/src/local-package/server/AssistantProvider.js} +37 -61
  14. package/templates/src/local-package/server/actionIds.js +9 -0
  15. package/templates/src/local-package/server/actions.js +190 -0
  16. package/templates/src/local-package/server/registerRoutes.js +296 -0
  17. package/templates/src/local-package/server/repositories/assistantConfigRepository.js +141 -0
  18. package/{src → templates/src/local-package}/server/repositories/conversationsRepository.js +44 -45
  19. package/{src → templates/src/local-package}/server/repositories/messagesRepository.js +49 -34
  20. package/templates/src/local-package/server/services/assistantConfigService.js +90 -0
  21. package/{src → templates/src/local-package}/server/services/chatService.js +45 -37
  22. package/{src → templates/src/local-package}/server/services/transcriptService.js +61 -82
  23. package/templates/src/local-package/shared/assistantRuntimeConfig.js +13 -0
  24. package/templates/src/local-package/shared/index.js +1 -0
  25. package/templates/src/pages/assistant/index.vue +7 -0
  26. package/test/buildTemplateContext.test.js +112 -0
  27. package/test/packageDescriptor.test.js +69 -0
  28. package/src/client/components/AssistantClientElement.vue +0 -1316
  29. package/src/client/components/AssistantConsoleSettingsClientElement.vue +0 -70
  30. package/src/client/components/AssistantSettingsFormCard.vue +0 -76
  31. package/src/client/components/AssistantWorkspaceClientElement.vue +0 -15
  32. package/src/client/components/AssistantWorkspaceSettingsClientElement.vue +0 -72
  33. package/src/client/index.js +0 -10
  34. package/src/client/lib/assistantApi.js +0 -137
  35. package/src/client/lib/assistantHttpClient.js +0 -10
  36. package/src/client/lib/markdownRenderer.js +0 -31
  37. package/src/client/providers/AssistantWebClientProvider.js +0 -20
  38. package/src/server/actionIds.js +0 -11
  39. package/src/server/actions.js +0 -191
  40. package/src/server/lib/aiClient.js +0 -43
  41. package/src/server/lib/ndjson.js +0 -47
  42. package/src/server/lib/providers/anthropicClient.js +0 -375
  43. package/src/server/lib/providers/common.js +0 -150
  44. package/src/server/lib/providers/deepSeekClient.js +0 -22
  45. package/src/server/lib/providers/openAiClient.js +0 -13
  46. package/src/server/lib/providers/openAiCompatibleClient.js +0 -69
  47. package/src/server/lib/resolveWorkspaceSlug.js +0 -24
  48. package/src/server/lib/serviceToolCatalog.js +0 -459
  49. package/src/server/registerRoutes.js +0 -383
  50. package/src/server/repositories/assistantSettingsRepository.js +0 -100
  51. package/src/server/repositories/repositoryPersistenceUtils.js +0 -48
  52. package/src/server/services/assistantSettingsService.js +0 -149
  53. package/src/shared/assistantPaths.js +0 -50
  54. package/src/shared/assistantResource.js +0 -317
  55. package/src/shared/assistantSettingsResource.js +0 -197
  56. package/src/shared/index.js +0 -43
  57. package/src/shared/queryKeys.js +0 -69
  58. package/src/shared/settingsEvents.js +0 -6
  59. package/src/shared/streamEvents.js +0 -29
  60. package/src/shared/support/conversationStatus.js +0 -18
  61. package/src/shared/support/jsonObject.js +0 -18
  62. package/src/shared/support/positiveInteger.js +0 -9
  63. package/templates/migrations/assistant_settings_initial.cjs +0 -37
  64. package/templates/src/pages/admin/workspace/assistant/index.vue +0 -7
  65. package/test/aiConfigValidation.test.js +0 -15
  66. package/test/assistantApiSurfaceHeader.test.js +0 -64
  67. package/test/assistantResource.test.js +0 -53
  68. package/test/assistantSettingsResource.test.js +0 -48
  69. package/test/assistantSettingsService.test.js +0 -133
  70. package/test/chatService.test.js +0 -841
  71. package/test/descriptorSurfaceOption.test.js +0 -35
  72. package/test/queryKeys.test.js +0 -41
  73. package/test/resolveWorkspaceSlug.test.js +0 -83
  74. package/test/routeInputContracts.test.js +0 -286
  75. package/test/serviceToolCatalog.test.js +0 -1235
  76. package/test/transcriptService.test.js +0 -175
@@ -1,70 +0,0 @@
1
- <template>
2
- <AssistantSettingsFormCard
3
- root-class="assistant-console-settings-client-element"
4
- title="Assistant console settings"
5
- subtitle="Configure the prompt used on workspace/admin assistant surfaces."
6
- no-permission-message="You do not have permission to view assistant console settings."
7
- save-label="Save assistant console settings"
8
- :add-edit="addEdit"
9
- :show-form-skeleton="showFormSkeleton"
10
- >
11
- <v-textarea
12
- v-model="form.workspaceSurfacePrompt"
13
- label="Workspace/Admin surface prompt"
14
- variant="outlined"
15
- density="comfortable"
16
- rows="6"
17
- auto-grow
18
- :readonly="!addEdit.canSave || addEdit.isSaving || addEdit.isRefetching"
19
- :error-messages="addEdit.fieldErrors.workspaceSurfacePrompt ? [addEdit.fieldErrors.workspaceSurfacePrompt] : []"
20
- />
21
- </AssistantSettingsFormCard>
22
- </template>
23
-
24
- <script setup>
25
- import { computed, reactive } from "vue";
26
- import { validateOperationSection } from "@jskit-ai/http-runtime/shared/validators/operationValidation";
27
- import { useAddEdit } from "@jskit-ai/users-web/client/composables/useAddEdit";
28
- import AssistantSettingsFormCard from "./AssistantSettingsFormCard.vue";
29
- import { assistantConsoleSettingsResource } from "../../shared/assistantSettingsResource.js";
30
-
31
- const form = reactive({
32
- workspaceSurfacePrompt: ""
33
- });
34
-
35
- const addEdit = useAddEdit({
36
- visibility: "public",
37
- access: "never",
38
- resource: assistantConsoleSettingsResource,
39
- apiSuffix: "/console/settings/assistant",
40
- queryKeyFactory: () => ["assistant", "settings", "console"],
41
- viewPermissions: [],
42
- savePermissions: [],
43
- writeMethod: "PATCH",
44
- placementSource: "assistant.console-settings-view",
45
- fallbackLoadError: "Unable to load assistant console settings.",
46
- fallbackSaveError: "Unable to update assistant console settings.",
47
- fieldErrorKeys: ["workspaceSurfacePrompt"],
48
- realtime: {
49
- event: "assistant.console.settings.changed"
50
- },
51
- model: form,
52
- parseInput: (rawPayload) =>
53
- validateOperationSection({
54
- operation: assistantConsoleSettingsResource.operations.patch,
55
- section: "bodyValidator",
56
- value: rawPayload
57
- }),
58
- mapLoadedToModel(model, payload = {}) {
59
- const settings = payload?.settings && typeof payload.settings === "object" ? payload.settings : {};
60
- model.workspaceSurfacePrompt = String(settings.workspaceSurfacePrompt || "");
61
- },
62
- buildRawPayload(model) {
63
- return {
64
- workspaceSurfacePrompt: model.workspaceSurfacePrompt
65
- };
66
- }
67
- });
68
-
69
- const showFormSkeleton = computed(() => Boolean(addEdit.isInitialLoading));
70
- </script>
@@ -1,76 +0,0 @@
1
- <template>
2
- <section :class="props.rootClass">
3
- <v-card rounded="lg" elevation="1" border>
4
- <v-card-item>
5
- <v-card-title class="text-h6">{{ props.title }}</v-card-title>
6
- <v-card-subtitle>{{ props.subtitle }}</v-card-subtitle>
7
- </v-card-item>
8
- <v-divider />
9
- <v-card-text class="pt-4">
10
- <template v-if="props.showFormSkeleton">
11
- <v-skeleton-loader type="text@2, list-item-two-line@4, button" />
12
- </template>
13
-
14
- <p v-else-if="props.addEdit.loadError" class="text-body-2 text-medium-emphasis mb-4">
15
- {{ props.addEdit.loadError }}
16
- </p>
17
-
18
- <p v-else-if="!props.addEdit.canView" class="text-body-2 text-medium-emphasis mb-4">
19
- {{ props.noPermissionMessage }}
20
- </p>
21
-
22
- <template v-else>
23
- <v-form @submit.prevent="props.addEdit.submit" novalidate>
24
- <v-progress-linear v-if="props.addEdit.isRefetching" indeterminate class="mb-4" />
25
- <slot />
26
- <div class="d-flex align-center justify-end ga-3 mt-2">
27
- <v-btn
28
- v-if="props.addEdit.canSave"
29
- type="submit"
30
- color="primary"
31
- :loading="props.addEdit.isSaving"
32
- :disabled="props.addEdit.isInitialLoading || props.addEdit.isRefetching"
33
- >
34
- {{ props.saveLabel }}
35
- </v-btn>
36
- <v-chip v-else color="secondary" label>Read-only</v-chip>
37
- </div>
38
- </v-form>
39
- </template>
40
- </v-card-text>
41
- </v-card>
42
- </section>
43
- </template>
44
-
45
- <script setup>
46
- const props = defineProps({
47
- rootClass: {
48
- type: String,
49
- required: true
50
- },
51
- title: {
52
- type: String,
53
- required: true
54
- },
55
- subtitle: {
56
- type: String,
57
- required: true
58
- },
59
- noPermissionMessage: {
60
- type: String,
61
- required: true
62
- },
63
- saveLabel: {
64
- type: String,
65
- required: true
66
- },
67
- addEdit: {
68
- type: Object,
69
- required: true
70
- },
71
- showFormSkeleton: {
72
- type: Boolean,
73
- default: false
74
- }
75
- });
76
- </script>
@@ -1,15 +0,0 @@
1
- <template>
2
- <AssistantClientElement
3
- :meta="runtime.meta"
4
- :state="runtime.state"
5
- :actions="runtime.actions"
6
- :viewer="runtime.viewer.value"
7
- />
8
- </template>
9
-
10
- <script setup>
11
- import AssistantClientElement from "./AssistantClientElement.vue";
12
- import { useAssistantWorkspaceRuntime } from "../composables/useAssistantWorkspaceRuntime.js";
13
-
14
- const runtime = useAssistantWorkspaceRuntime();
15
- </script>
@@ -1,72 +0,0 @@
1
- <template>
2
- <AssistantSettingsFormCard
3
- root-class="assistant-workspace-settings-client-element"
4
- title="Assistant workspace settings"
5
- subtitle="Configure the prompt used on the app surface for this workspace."
6
- no-permission-message="You do not have permission to view assistant workspace settings."
7
- save-label="Save assistant workspace settings"
8
- :add-edit="addEdit"
9
- :show-form-skeleton="showFormSkeleton"
10
- >
11
- <v-textarea
12
- v-model="form.appSurfacePrompt"
13
- label="App surface prompt"
14
- variant="outlined"
15
- density="comfortable"
16
- rows="6"
17
- auto-grow
18
- :readonly="!addEdit.canSave || addEdit.isSaving || addEdit.isRefetching"
19
- :error-messages="addEdit.fieldErrors.appSurfacePrompt ? [addEdit.fieldErrors.appSurfacePrompt] : []"
20
- />
21
- </AssistantSettingsFormCard>
22
- </template>
23
-
24
- <script setup>
25
- import { computed, reactive } from "vue";
26
- import { validateOperationSection } from "@jskit-ai/http-runtime/shared/validators/operationValidation";
27
- import { useAddEdit } from "@jskit-ai/users-web/client/composables/useAddEdit";
28
- import { matchesCurrentWorkspaceEvent } from "@jskit-ai/users-web/client/support/realtimeWorkspace";
29
- import AssistantSettingsFormCard from "./AssistantSettingsFormCard.vue";
30
- import { assistantWorkspaceSettingsResource } from "../../shared/assistantSettingsResource.js";
31
-
32
- const form = reactive({
33
- appSurfacePrompt: ""
34
- });
35
-
36
- const addEdit = useAddEdit({
37
- visibility: "workspace",
38
- resource: assistantWorkspaceSettingsResource,
39
- apiSuffix: "/settings/assistant",
40
- queryKeyFactory: (surfaceId = "", workspaceSlug = "") => ["assistant", "settings", "workspace", surfaceId, workspaceSlug],
41
- viewPermissions: ["workspace.settings.view", "workspace.settings.update"],
42
- savePermissions: ["workspace.settings.update"],
43
- writeMethod: "PATCH",
44
- placementSource: "assistant.workspace-settings-view",
45
- fallbackLoadError: "Unable to load assistant workspace settings.",
46
- fallbackSaveError: "Unable to update assistant workspace settings.",
47
- fieldErrorKeys: ["appSurfacePrompt"],
48
- realtime: {
49
- event: "assistant.workspace.settings.changed",
50
- matches: ({ payload = {}, routeContext = {} } = {}) =>
51
- matchesCurrentWorkspaceEvent(payload, routeContext?.workspaceSlugFromRoute?.value)
52
- },
53
- model: form,
54
- parseInput: (rawPayload) =>
55
- validateOperationSection({
56
- operation: assistantWorkspaceSettingsResource.operations.patch,
57
- section: "bodyValidator",
58
- value: rawPayload
59
- }),
60
- mapLoadedToModel(model, payload = {}) {
61
- const settings = payload?.settings && typeof payload.settings === "object" ? payload.settings : {};
62
- model.appSurfacePrompt = String(settings.appSurfacePrompt || "");
63
- },
64
- buildRawPayload(model) {
65
- return {
66
- appSurfacePrompt: model.appSurfacePrompt
67
- };
68
- }
69
- });
70
-
71
- const showFormSkeleton = computed(() => Boolean(addEdit.isInitialLoading));
72
- </script>
@@ -1,10 +0,0 @@
1
- export { default as AssistantClientElement } from "./components/AssistantClientElement.vue";
2
- export { default as AssistantWorkspaceClientElement } from "./components/AssistantWorkspaceClientElement.vue";
3
- export { default as AssistantConsoleSettingsClientElement } from "./components/AssistantConsoleSettingsClientElement.vue";
4
- export { default as AssistantWorkspaceSettingsClientElement } from "./components/AssistantWorkspaceSettingsClientElement.vue";
5
- export { useAssistantWorkspaceRuntime } from "./composables/useAssistantWorkspaceRuntime.js";
6
- export { assistantHttpClient } from "./lib/assistantHttpClient.js";
7
- export { createAssistantWorkspaceApi, buildStreamEventError } from "./lib/assistantApi.js";
8
- export {
9
- AssistantWebClientProvider
10
- } from "./providers/AssistantWebClientProvider.js";
@@ -1,137 +0,0 @@
1
- import {
2
- ASSISTANT_STREAM_EVENT_TYPES,
3
- buildAssistantWorkspaceApiPath,
4
- normalizeAssistantStreamEventType
5
- } from "../../shared/index.js";
6
- import { appendQueryString } from "@jskit-ai/kernel/shared/support";
7
-
8
- function buildStreamEventError(event) {
9
- const message = String(event?.message || "Assistant request failed.");
10
- const error = new Error(message);
11
- error.code = String(event?.code || "assistant_stream_error");
12
- error.status = Number(event?.status || 500);
13
- error.event = event && typeof event === "object" ? { ...event } : null;
14
- return error;
15
- }
16
-
17
- function appendQueryParam(params, key, value) {
18
- if (value == null) {
19
- return;
20
- }
21
-
22
- const normalized = String(value).trim();
23
- if (!normalized) {
24
- return;
25
- }
26
-
27
- params.set(key, normalized);
28
- }
29
-
30
- function resolveWorkspaceBasePath(workspaceSlug = "") {
31
- const path = buildAssistantWorkspaceApiPath(workspaceSlug, "/");
32
- if (!path) {
33
- throw new Error("Assistant workspace slug is required.");
34
- }
35
-
36
- return path;
37
- }
38
-
39
- function normalizeSurfaceHeaderValue(value) {
40
- return String(value || "").trim().toLowerCase();
41
- }
42
-
43
- function resolveAssistantRequestHeaders(resolveSurfaceId) {
44
- if (typeof resolveSurfaceId !== "function") {
45
- return null;
46
- }
47
-
48
- const surfaceId = normalizeSurfaceHeaderValue(resolveSurfaceId());
49
- if (!surfaceId) {
50
- return null;
51
- }
52
-
53
- return {
54
- "x-jskit-surface": surfaceId
55
- };
56
- }
57
-
58
- function createAssistantWorkspaceApi({ request, requestStream, resolveSurfaceId = null }) {
59
- if (typeof request !== "function" || typeof requestStream !== "function") {
60
- throw new Error("createAssistantWorkspaceApi requires request() and requestStream().");
61
- }
62
-
63
- return Object.freeze({
64
- async streamChat(workspaceSlug, payload, { signal, onEvent, onMalformedLine, rejectOnErrorEvent = true } = {}) {
65
- const basePath = resolveWorkspaceBasePath(workspaceSlug);
66
- let streamEventError = null;
67
- const requestHeaders = resolveAssistantRequestHeaders(resolveSurfaceId);
68
-
69
- const streamHandlers = {
70
- onEvent(event) {
71
- const eventType = normalizeAssistantStreamEventType(event?.type, "");
72
- if (rejectOnErrorEvent && eventType === ASSISTANT_STREAM_EVENT_TYPES.ERROR && !streamEventError) {
73
- streamEventError = buildStreamEventError(event);
74
- }
75
-
76
- if (typeof onEvent === "function") {
77
- onEvent(event);
78
- }
79
- }
80
- };
81
-
82
- if (typeof onMalformedLine === "function") {
83
- streamHandlers.onMalformedLine = (line, parseError) => {
84
- onMalformedLine(line, parseError);
85
- };
86
- }
87
-
88
- await requestStream(
89
- `${basePath}/chat/stream`,
90
- {
91
- method: "POST",
92
- ...(requestHeaders ? { headers: requestHeaders } : {}),
93
- body: payload,
94
- signal
95
- },
96
- streamHandlers
97
- );
98
-
99
- if (streamEventError) {
100
- throw streamEventError;
101
- }
102
- },
103
-
104
- listConversations(workspaceSlug, query = {}) {
105
- const basePath = resolveWorkspaceBasePath(workspaceSlug);
106
- const params = new URLSearchParams();
107
- appendQueryParam(params, "cursor", query.cursor);
108
- appendQueryParam(params, "limit", query.limit);
109
- appendQueryParam(params, "status", query.status);
110
- const requestHeaders = resolveAssistantRequestHeaders(resolveSurfaceId);
111
-
112
- return request(
113
- appendQueryString(`${basePath}/conversations`, params.toString()),
114
- requestHeaders ? { headers: requestHeaders } : {}
115
- );
116
- },
117
-
118
- getConversationMessages(workspaceSlug, conversationId, query = {}) {
119
- const basePath = resolveWorkspaceBasePath(workspaceSlug);
120
- const encodedConversationId = encodeURIComponent(String(conversationId || "").trim());
121
- const params = new URLSearchParams();
122
- appendQueryParam(params, "page", query.page);
123
- appendQueryParam(params, "pageSize", query.pageSize);
124
- const requestHeaders = resolveAssistantRequestHeaders(resolveSurfaceId);
125
-
126
- return request(
127
- appendQueryString(`${basePath}/conversations/${encodedConversationId}/messages`, params.toString()),
128
- requestHeaders ? { headers: requestHeaders } : {}
129
- );
130
- }
131
- });
132
- }
133
-
134
- export {
135
- createAssistantWorkspaceApi,
136
- buildStreamEventError
137
- };
@@ -1,10 +0,0 @@
1
- import { createHttpClient } from "@jskit-ai/http-runtime/client";
2
-
3
- const assistantHttpClient = createHttpClient({
4
- credentials: "include",
5
- csrf: {
6
- sessionPath: "/api/session"
7
- }
8
- });
9
-
10
- export { assistantHttpClient };
@@ -1,31 +0,0 @@
1
- import DOMPurify from "dompurify";
2
- import { marked } from "marked";
3
-
4
- marked.setOptions(
5
- Object.freeze({
6
- gfm: true,
7
- breaks: true
8
- })
9
- );
10
-
11
- function normalizeMarkdownText(value) {
12
- return typeof value === "string" ? value : String(value || "");
13
- }
14
-
15
- function renderMarkdownToSafeHtml(value = "") {
16
- const markdownText = normalizeMarkdownText(value);
17
- if (!markdownText) {
18
- return "";
19
- }
20
-
21
- const unsafeHtml = String(marked.parse(markdownText) || "");
22
- return String(
23
- DOMPurify.sanitize(unsafeHtml, {
24
- USE_PROFILES: {
25
- html: true
26
- }
27
- }) || ""
28
- );
29
- }
30
-
31
- export { renderMarkdownToSafeHtml };
@@ -1,20 +0,0 @@
1
- import AssistantConsoleSettingsClientElement from "../components/AssistantConsoleSettingsClientElement.vue";
2
- import AssistantWorkspaceSettingsClientElement from "../components/AssistantWorkspaceSettingsClientElement.vue";
3
-
4
- class AssistantWebClientProvider {
5
- static id = "assistant.web.client";
6
- static dependsOn = ["users.web.client"];
7
-
8
- register(app) {
9
- if (!app || typeof app.singleton !== "function") {
10
- throw new Error("AssistantWebClientProvider requires application singleton().");
11
- }
12
-
13
- app.singleton("assistant.web.console-settings.element", () => AssistantConsoleSettingsClientElement);
14
- app.singleton("assistant.web.workspace-settings.element", () => AssistantWorkspaceSettingsClientElement);
15
- }
16
- }
17
-
18
- export {
19
- AssistantWebClientProvider
20
- };
@@ -1,11 +0,0 @@
1
- const actionIds = Object.freeze({
2
- chatStream: "assistant.chat.stream",
3
- conversationsList: "assistant.conversations.list",
4
- conversationMessagesList: "assistant.conversation.messages.list",
5
- consoleSettingsRead: "assistant.console.settings.read",
6
- consoleSettingsUpdate: "assistant.console.settings.update",
7
- workspaceSettingsRead: "assistant.workspace.settings.read",
8
- workspaceSettingsUpdate: "assistant.workspace.settings.update"
9
- });
10
-
11
- export { actionIds };
@@ -1,191 +0,0 @@
1
- import { workspaceSlugParamsValidator } from "@jskit-ai/users-core/server/validators/routeParamsValidator";
2
- import { resolveWorkspace } from "@jskit-ai/users-core/server/support/resolveWorkspace";
3
- import {
4
- EMPTY_INPUT_VALIDATOR
5
- } from "@jskit-ai/kernel/shared/actions/actionContributorHelpers";
6
- import { assistantResource } from "../shared/assistantResource.js";
7
- import {
8
- assistantConsoleSettingsResource,
9
- assistantWorkspaceSettingsResource
10
- } from "../shared/assistantSettingsResource.js";
11
- import { actionIds } from "./actionIds.js";
12
-
13
- const assistantActions = Object.freeze([
14
- {
15
- id: actionIds.chatStream,
16
- version: 1,
17
- kind: "stream",
18
- channels: ["api", "internal"],
19
- surfacesFrom: "workspace",
20
- permission: {
21
- require: "authenticated"
22
- },
23
- inputValidator: [workspaceSlugParamsValidator, assistantResource.operations.chatStream.bodyValidator],
24
- idempotency: "optional",
25
- audit: {
26
- actionName: actionIds.chatStream
27
- },
28
- observability: {},
29
- async execute(input, context, deps) {
30
- return deps.chatService.streamChat(input, {
31
- context,
32
- streamWriter: deps.streamWriter,
33
- abortSignal: deps.abortSignal
34
- });
35
- }
36
- },
37
- {
38
- id: actionIds.conversationsList,
39
- version: 1,
40
- kind: "query",
41
- channels: ["api", "internal"],
42
- surfacesFrom: "workspace",
43
- permission: {
44
- require: "authenticated"
45
- },
46
- inputValidator: [
47
- workspaceSlugParamsValidator,
48
- {
49
- query: assistantResource.operations.conversationsList.queryValidator
50
- }
51
- ],
52
- outputValidator: assistantResource.operations.conversationsList.outputValidator,
53
- idempotency: "none",
54
- audit: {
55
- actionName: actionIds.conversationsList
56
- },
57
- observability: {},
58
- async execute(input, context, deps) {
59
- return deps.chatService.listConversations(input.query, {
60
- context
61
- });
62
- }
63
- },
64
- {
65
- id: actionIds.conversationMessagesList,
66
- version: 1,
67
- kind: "query",
68
- channels: ["api", "internal"],
69
- surfacesFrom: "workspace",
70
- permission: {
71
- require: "authenticated"
72
- },
73
- inputValidator: [
74
- workspaceSlugParamsValidator,
75
- assistantResource.operations.conversationMessagesList.paramsValidator,
76
- {
77
- query: assistantResource.operations.conversationMessagesList.queryValidator
78
- }
79
- ],
80
- outputValidator: assistantResource.operations.conversationMessagesList.outputValidator,
81
- idempotency: "none",
82
- audit: {
83
- actionName: actionIds.conversationMessagesList
84
- },
85
- observability: {},
86
- async execute(input, context, deps) {
87
- return deps.chatService.getConversationMessages(input.conversationId, input.query, {
88
- context
89
- });
90
- }
91
- },
92
- {
93
- id: actionIds.consoleSettingsRead,
94
- version: 1,
95
- kind: "query",
96
- channels: ["api", "automation", "internal"],
97
- surfacesFrom: "console",
98
- permission: {
99
- require: "authenticated"
100
- },
101
- inputValidator: EMPTY_INPUT_VALIDATOR,
102
- outputValidator: assistantConsoleSettingsResource.operations.view.outputValidator,
103
- idempotency: "none",
104
- audit: {
105
- actionName: actionIds.consoleSettingsRead
106
- },
107
- observability: {},
108
- async execute(_input, context, deps) {
109
- return deps.assistantSettingsService.getConsoleSettings({
110
- context
111
- });
112
- }
113
- },
114
- {
115
- id: actionIds.consoleSettingsUpdate,
116
- version: 1,
117
- kind: "command",
118
- channels: ["api", "automation", "internal"],
119
- surfacesFrom: "console",
120
- permission: {
121
- require: "authenticated"
122
- },
123
- inputValidator: {
124
- payload: assistantConsoleSettingsResource.operations.patch.bodyValidator
125
- },
126
- outputValidator: assistantConsoleSettingsResource.operations.patch.outputValidator,
127
- idempotency: "optional",
128
- audit: {
129
- actionName: actionIds.consoleSettingsUpdate
130
- },
131
- observability: {},
132
- async execute(input, context, deps) {
133
- return deps.assistantSettingsService.updateConsoleSettings(input.payload, {
134
- context
135
- });
136
- }
137
- },
138
- {
139
- id: actionIds.workspaceSettingsRead,
140
- version: 1,
141
- kind: "query",
142
- channels: ["api", "automation", "internal"],
143
- surfacesFrom: "workspace",
144
- permission: {
145
- require: "any",
146
- permissions: ["workspace.settings.view", "workspace.settings.update"]
147
- },
148
- inputValidator: workspaceSlugParamsValidator,
149
- outputValidator: assistantWorkspaceSettingsResource.operations.view.outputValidator,
150
- idempotency: "none",
151
- audit: {
152
- actionName: actionIds.workspaceSettingsRead
153
- },
154
- observability: {},
155
- async execute(input, context, deps) {
156
- return deps.assistantSettingsService.getWorkspaceSettings(resolveWorkspace(context, input), {
157
- context
158
- });
159
- }
160
- },
161
- {
162
- id: actionIds.workspaceSettingsUpdate,
163
- version: 1,
164
- kind: "command",
165
- channels: ["api", "automation", "internal"],
166
- surfacesFrom: "workspace",
167
- permission: {
168
- require: "all",
169
- permissions: ["workspace.settings.update"]
170
- },
171
- inputValidator: [
172
- workspaceSlugParamsValidator,
173
- {
174
- patch: assistantWorkspaceSettingsResource.operations.patch.bodyValidator
175
- }
176
- ],
177
- outputValidator: assistantWorkspaceSettingsResource.operations.patch.outputValidator,
178
- idempotency: "optional",
179
- audit: {
180
- actionName: actionIds.workspaceSettingsUpdate
181
- },
182
- observability: {},
183
- async execute(input, context, deps) {
184
- return deps.assistantSettingsService.updateWorkspaceSettings(resolveWorkspace(context, input), input.patch, {
185
- context
186
- });
187
- }
188
- }
189
- ]);
190
-
191
- export { assistantActions };