@jskit-ai/assistant 0.1.32 → 0.1.35

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,10 +1,52 @@
1
1
  export default Object.freeze({
2
2
  packageVersion: 1,
3
3
  packageId: "@jskit-ai/assistant",
4
- version: "0.1.32",
5
- kind: "runtime",
6
- description: "Unified assistant module with streaming chat, transcript persistence, service-aware tool execution, and workspace UI.",
4
+ version: "0.1.35",
5
+ kind: "generator",
6
+ description: "Generate an app-local assistant runtime and settings integration from explicit surface choices.",
7
7
  options: {
8
+ "runtime-surface": {
9
+ required: true,
10
+ inputType: "text",
11
+ defaultValue: "",
12
+ promptLabel: "Runtime surface",
13
+ promptHint: "Enabled surface id where the assistant page will run."
14
+ },
15
+ "settings-surface": {
16
+ required: true,
17
+ inputType: "text",
18
+ defaultValue: "",
19
+ promptLabel: "Settings surface",
20
+ promptHint: "Enabled surface id whose settings outlet will host the assistant settings form."
21
+ },
22
+ "config-scope": {
23
+ required: true,
24
+ inputType: "text",
25
+ defaultValue: "global",
26
+ promptLabel: "Config scope",
27
+ promptHint: "global | workspace. Workspace scope requires both selected surfaces to requireWorkspace=true."
28
+ },
29
+ placement: {
30
+ required: false,
31
+ inputType: "text",
32
+ defaultValue: "",
33
+ promptLabel: "Menu placement",
34
+ promptHint: "Optional host:position target for the assistant page menu entry."
35
+ },
36
+ "placement-component-token": {
37
+ required: false,
38
+ inputType: "text",
39
+ defaultValue: "users.web.shell.surface-aware-menu-link-item",
40
+ promptLabel: "Placement component token",
41
+ promptHint: "Menu placement component token for the assistant page entry."
42
+ },
43
+ "menu-label": {
44
+ required: false,
45
+ inputType: "text",
46
+ defaultValue: "Assistant",
47
+ promptLabel: "Menu label",
48
+ promptHint: "Menu label for the assistant page entry."
49
+ },
8
50
  "ai-provider": {
9
51
  required: true,
10
52
  defaultValue: "openai",
@@ -30,99 +72,119 @@ export default Object.freeze({
30
72
  defaultValue: "120000",
31
73
  promptLabel: "AI timeout (ms)",
32
74
  promptHint: "Abort AI requests after this many milliseconds."
33
- },
34
- surfaces: {
35
- required: true,
36
- inputType: "text",
37
- defaultValue: "admin",
38
- promptLabel: "Target workspace surfaces",
39
- promptHint: "Comma-separated workspace surface ids for assistant page + menu placement (for example: admin,app)."
40
75
  }
41
76
  },
42
- dependsOn: [
43
- "@jskit-ai/auth-core",
44
- "@jskit-ai/database-runtime",
45
- "@jskit-ai/http-runtime",
46
- "@jskit-ai/realtime",
47
- "@jskit-ai/users-core",
48
- "@jskit-ai/users-web"
49
- ],
77
+ dependsOn: [],
50
78
  capabilities: {
51
- provides: ["assistant"],
52
- requires: [
53
- "runtime.actions",
54
- "runtime.database",
55
- "auth.policy",
56
- "users.core",
57
- "users.web",
58
- "runtime.realtime.client"
59
- ]
79
+ provides: ["assistant-generator"],
80
+ requires: []
60
81
  },
61
82
  runtime: {
62
83
  server: {
63
- providers: [
64
- {
65
- entrypoint: "src/server/AssistantServiceProvider.js",
66
- export: "AssistantServiceProvider"
67
- }
68
- ]
84
+ providers: []
69
85
  },
70
86
  client: {
71
- providers: [
72
- {
73
- entrypoint: "src/client/providers/AssistantWebClientProvider.js",
74
- export: "AssistantWebClientProvider"
75
- }
76
- ]
87
+ providers: []
77
88
  }
78
89
  },
79
90
  metadata: {
91
+ generatorPrimarySubcommand: "install",
92
+ generatorSubcommands: {
93
+ install: {
94
+ description: "Generate and install an app-local assistant runtime from explicit surface choices.",
95
+ examples: [
96
+ {
97
+ label: "App runtime, console settings, global config",
98
+ lines: [
99
+ "npx jskit generate @jskit-ai/assistant install \\",
100
+ " --runtime-surface app \\",
101
+ " --settings-surface console \\",
102
+ " --config-scope global \\",
103
+ " --placement shell-layout:primary-menu \\",
104
+ " --menu-label Assistant \\",
105
+ " --ai-provider openai \\",
106
+ " --ai-api-key \"$OPENAI_API_KEY\" \\",
107
+ " --ai-base-url \"\" \\",
108
+ " --ai-timeout-ms 120000 \\",
109
+ " --run-npm-install"
110
+ ]
111
+ },
112
+ {
113
+ label: "App runtime, app settings, global config",
114
+ lines: [
115
+ "npx jskit generate @jskit-ai/assistant install \\",
116
+ " --runtime-surface app \\",
117
+ " --settings-surface app \\",
118
+ " --config-scope global \\",
119
+ " --placement shell-layout:primary-menu \\",
120
+ " --menu-label Assistant \\",
121
+ " --ai-provider openai \\",
122
+ " --ai-api-key \"$OPENAI_API_KEY\" \\",
123
+ " --ai-base-url \"\" \\",
124
+ " --ai-timeout-ms 120000 \\",
125
+ " --run-npm-install"
126
+ ]
127
+ },
128
+ {
129
+ label: "Workspace runtime, console settings, global config",
130
+ lines: [
131
+ "npx jskit generate @jskit-ai/assistant install \\",
132
+ " --runtime-surface admin \\",
133
+ " --settings-surface console \\",
134
+ " --config-scope global \\",
135
+ " --placement shell-layout:primary-menu \\",
136
+ " --menu-label Assistant \\",
137
+ " --ai-provider openai \\",
138
+ " --ai-api-key \"$OPENAI_API_KEY\" \\",
139
+ " --ai-base-url \"\" \\",
140
+ " --ai-timeout-ms 120000 \\",
141
+ " --run-npm-install"
142
+ ]
143
+ },
144
+ {
145
+ label: "Workspace runtime, workspace settings, workspace config",
146
+ lines: [
147
+ "npx jskit generate @jskit-ai/assistant install \\",
148
+ " --runtime-surface admin \\",
149
+ " --settings-surface admin \\",
150
+ " --config-scope workspace \\",
151
+ " --placement shell-layout:primary-menu \\",
152
+ " --menu-label Assistant \\",
153
+ " --ai-provider openai \\",
154
+ " --ai-api-key \"$OPENAI_API_KEY\" \\",
155
+ " --ai-base-url \"\" \\",
156
+ " --ai-timeout-ms 120000 \\",
157
+ " --run-npm-install"
158
+ ]
159
+ }
160
+ ]
161
+ }
162
+ },
80
163
  apiSummary: {
81
164
  surfaces: [
82
165
  {
83
- subpath: "./server/AssistantServiceProvider",
84
- summary: "Exports assistant runtime provider."
85
- },
86
- {
87
- subpath: "./client",
88
- summary: "Exports assistant workspace element and composables."
89
- },
90
- {
91
- subpath: "./shared",
92
- summary: "Exports assistant API paths, query keys, stream events, and resource validators."
166
+ subpath: "./server/buildTemplateContext",
167
+ summary: "Builds deterministic assistant generator template context values from app surface metadata."
93
168
  }
94
169
  ],
95
170
  containerTokens: {
96
- server: [
97
- "assistant.ai.client",
98
- "assistant.conversation.repository",
99
- "assistant.message.repository",
100
- "assistant.service.tool-catalog",
101
- "assistant.settings.repository"
102
- ],
103
- client: [
104
- "assistant.web.console-settings.element",
105
- "assistant.web.workspace-settings.element"
106
- ]
171
+ server: [],
172
+ client: []
107
173
  }
108
174
  }
109
175
  },
110
176
  mutations: {
111
177
  dependencies: {
112
178
  runtime: {
113
- "@jskit-ai/assistant": "0.1.32",
114
- "@jskit-ai/auth-core": "0.1.23",
115
- "@jskit-ai/database-runtime": "0.1.24",
116
- "@jskit-ai/http-runtime": "0.1.23",
117
- "@jskit-ai/kernel": "0.1.24",
118
- "@jskit-ai/realtime": "0.1.23",
119
- "@jskit-ai/users-core": "0.1.33",
120
- "@jskit-ai/users-web": "0.1.38",
179
+ "@local/assistant": "file:packages/assistant",
180
+ "@jskit-ai/assistant-core": "0.1.2",
181
+ "@jskit-ai/database-runtime": "0.1.26",
182
+ "@jskit-ai/http-runtime": "0.1.25",
183
+ "@jskit-ai/kernel": "0.1.26",
184
+ "@jskit-ai/shell-web": "0.1.25",
185
+ "@jskit-ai/users-core": "0.1.36",
186
+ "@jskit-ai/users-web": "0.1.41",
121
187
  "@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
188
  "vuetify": "^4.0.0"
127
189
  },
128
190
  dev: {}
@@ -134,111 +196,253 @@ export default Object.freeze({
134
196
  files: [
135
197
  {
136
198
  op: "install-migration",
137
- from: "templates/migrations/assistant_transcripts_initial.cjs",
199
+ from: "templates/migrations/assistant_config_initial.cjs",
138
200
  toDir: "migrations",
139
201
  extension: ".cjs",
140
- reason: "Install assistant conversation/message schema migration.",
202
+ reason: "Install assistant configuration schema migration.",
141
203
  category: "assistant",
142
- id: "assistant-transcripts-initial-schema"
204
+ id: "assistant-config-initial-schema",
205
+ templateContext: {
206
+ entrypoint: "src/server/buildTemplateContext.js",
207
+ export: "buildTemplateContext"
208
+ }
143
209
  },
144
210
  {
145
211
  op: "install-migration",
146
- from: "templates/migrations/assistant_settings_initial.cjs",
212
+ from: "templates/migrations/assistant_transcripts_initial.cjs",
147
213
  toDir: "migrations",
148
214
  extension: ".cjs",
149
- reason: "Install assistant settings schema migration.",
215
+ reason: "Install assistant transcript schema migration.",
150
216
  category: "assistant",
151
- id: "assistant-settings-initial-schema"
217
+ id: "assistant-transcripts-initial-schema",
218
+ templateContext: {
219
+ entrypoint: "src/server/buildTemplateContext.js",
220
+ export: "buildTemplateContext"
221
+ }
152
222
  },
153
223
  {
154
- from: "templates/src/pages/admin/workspace/assistant/index.vue",
155
- toSurface: "${option:surfaces|lower}",
156
- toSurfacePath: "workspace/assistant/index.vue",
157
- reason: "Install assistant workspace page scaffold.",
224
+ from: "templates/src/local-package/package.json",
225
+ to: "packages/assistant/package.json",
226
+ reason: "Install app-local assistant package manifest.",
158
227
  category: "assistant",
159
- id: "assistant-page-admin-workspace-assistant-index",
160
- when: {
161
- config: "tenancyMode",
162
- in: ["personal", "workspaces"]
228
+ id: "assistant-local-package-json"
229
+ },
230
+ {
231
+ from: "templates/src/local-package/package.descriptor.mjs",
232
+ to: "packages/assistant/package.descriptor.mjs",
233
+ reason: "Install app-local assistant package descriptor.",
234
+ category: "assistant",
235
+ id: "assistant-local-package-descriptor"
236
+ },
237
+ {
238
+ from: "templates/src/local-package/shared/assistantRuntimeConfig.js",
239
+ to: "packages/assistant/src/shared/assistantRuntimeConfig.js",
240
+ reason: "Install generated assistant runtime configuration.",
241
+ category: "assistant",
242
+ id: "assistant-local-runtime-config",
243
+ templateContext: {
244
+ entrypoint: "src/server/buildTemplateContext.js",
245
+ export: "buildTemplateContext"
163
246
  }
164
- }
165
- ],
166
- text: [
247
+ },
167
248
  {
168
- op: "append-text",
169
- file: "src/placement.js",
170
- position: "bottom",
171
- skipIfContains: "id: \"assistant.workspace.menu\"",
172
- value:
173
- "\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",
174
- reason: "Append assistant menu placement into app-owned placement registry.",
249
+ from: "templates/src/local-package/shared/index.js",
250
+ to: "packages/assistant/src/shared/index.js",
251
+ reason: "Install generated assistant shared exports.",
175
252
  category: "assistant",
176
- id: "assistant-placement-menu",
177
- when: {
178
- config: "tenancyMode",
179
- in: ["personal", "workspaces"]
253
+ id: "assistant-local-shared-index"
254
+ },
255
+ {
256
+ from: "templates/src/local-package/client/index.js",
257
+ to: "packages/assistant/src/client/index.js",
258
+ reason: "Install generated assistant client exports.",
259
+ category: "assistant",
260
+ id: "assistant-local-client-index"
261
+ },
262
+ {
263
+ from: "templates/src/local-package/client/components/AssistantSurfaceClientElement.vue",
264
+ to: "packages/assistant/src/client/components/AssistantSurfaceClientElement.vue",
265
+ reason: "Install generated assistant surface page component.",
266
+ category: "assistant",
267
+ id: "assistant-local-surface-client-element",
268
+ templateContext: {
269
+ entrypoint: "src/server/buildTemplateContext.js",
270
+ export: "buildTemplateContext"
180
271
  }
181
272
  },
182
273
  {
183
- op: "append-text",
184
- file: "src/placement.js",
185
- position: "bottom",
186
- skipIfContains: "id: \"assistant.workspace.settings.form\"",
187
- value:
188
- "\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",
189
- reason: "Append assistant workspace settings form into app-owned settings placements.",
274
+ from: "templates/src/local-package/client/components/AssistantSettingsClientElement.vue",
275
+ to: "packages/assistant/src/client/components/AssistantSettingsClientElement.vue",
276
+ reason: "Install generated assistant settings form component.",
190
277
  category: "assistant",
191
- id: "assistant-workspace-settings-form-placement",
192
- when: {
193
- config: "tenancyMode",
194
- in: ["personal", "workspaces"]
278
+ id: "assistant-local-settings-client-element",
279
+ templateContext: {
280
+ entrypoint: "src/server/buildTemplateContext.js",
281
+ export: "buildTemplateContext"
195
282
  }
196
283
  },
197
284
  {
198
- op: "append-text",
199
- file: "src/placement.js",
200
- position: "bottom",
201
- skipIfContains: "id: \"assistant.console.settings.form\"",
202
- value:
203
- "\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",
204
- reason: "Append assistant console settings form into app-owned settings placements.",
285
+ from: "templates/src/local-package/client/composables/useAssistantRuntime.js",
286
+ to: "packages/assistant/src/client/composables/useAssistantRuntime.js",
287
+ reason: "Install generated assistant runtime composable.",
205
288
  category: "assistant",
206
- id: "assistant-console-settings-form-placement"
289
+ id: "assistant-local-runtime-composable",
290
+ templateContext: {
291
+ entrypoint: "src/server/buildTemplateContext.js",
292
+ export: "buildTemplateContext"
293
+ }
207
294
  },
208
295
  {
209
- op: "append-text",
210
- file: "packages/main/src/shared/resources/consoleSettingsFields.js",
211
- position: "top",
212
- skipIfContains: "import { Type } from \"typebox\";",
213
- value: "import { Type } from \"typebox\";\n",
214
- reason: "Ensure app-owned console settings field registry has TypeBox import for assistant fields.",
296
+ from: "templates/src/local-package/client/providers/AssistantClientProvider.js",
297
+ to: "packages/assistant/src/client/providers/AssistantClientProvider.js",
298
+ reason: "Install generated assistant client provider.",
215
299
  category: "assistant",
216
- id: "assistant-console-settings-fields-import-typebox"
300
+ id: "assistant-local-client-provider"
217
301
  },
302
+ {
303
+ from: "templates/src/local-package/server/AssistantProvider.js",
304
+ to: "packages/assistant/src/server/AssistantProvider.js",
305
+ reason: "Install generated assistant server provider.",
306
+ category: "assistant",
307
+ id: "assistant-local-server-provider",
308
+ templateContext: {
309
+ entrypoint: "src/server/buildTemplateContext.js",
310
+ export: "buildTemplateContext"
311
+ }
312
+ },
313
+ {
314
+ from: "templates/src/local-package/server/actionIds.js",
315
+ to: "packages/assistant/src/server/actionIds.js",
316
+ reason: "Install generated assistant action identifiers.",
317
+ category: "assistant",
318
+ id: "assistant-local-action-ids"
319
+ },
320
+ {
321
+ from: "templates/src/local-package/server/actions.js",
322
+ to: "packages/assistant/src/server/actions.js",
323
+ reason: "Install generated assistant action definitions.",
324
+ category: "assistant",
325
+ id: "assistant-local-actions",
326
+ templateContext: {
327
+ entrypoint: "src/server/buildTemplateContext.js",
328
+ export: "buildTemplateContext"
329
+ }
330
+ },
331
+ {
332
+ from: "templates/src/local-package/server/registerRoutes.js",
333
+ to: "packages/assistant/src/server/registerRoutes.js",
334
+ reason: "Install generated assistant route registration.",
335
+ category: "assistant",
336
+ id: "assistant-local-register-routes",
337
+ templateContext: {
338
+ entrypoint: "src/server/buildTemplateContext.js",
339
+ export: "buildTemplateContext"
340
+ }
341
+ },
342
+ {
343
+ from: "templates/src/local-package/server/repositories/assistantConfigRepository.js",
344
+ to: "packages/assistant/src/server/repositories/assistantConfigRepository.js",
345
+ reason: "Install generated assistant config repository.",
346
+ category: "assistant",
347
+ id: "assistant-local-config-repository",
348
+ templateContext: {
349
+ entrypoint: "src/server/buildTemplateContext.js",
350
+ export: "buildTemplateContext"
351
+ }
352
+ },
353
+ {
354
+ from: "templates/src/local-package/server/repositories/conversationsRepository.js",
355
+ to: "packages/assistant/src/server/repositories/conversationsRepository.js",
356
+ reason: "Install generated assistant conversations repository.",
357
+ category: "assistant",
358
+ id: "assistant-local-conversations-repository",
359
+ templateContext: {
360
+ entrypoint: "src/server/buildTemplateContext.js",
361
+ export: "buildTemplateContext"
362
+ }
363
+ },
364
+ {
365
+ from: "templates/src/local-package/server/repositories/messagesRepository.js",
366
+ to: "packages/assistant/src/server/repositories/messagesRepository.js",
367
+ reason: "Install generated assistant messages repository.",
368
+ category: "assistant",
369
+ id: "assistant-local-messages-repository",
370
+ templateContext: {
371
+ entrypoint: "src/server/buildTemplateContext.js",
372
+ export: "buildTemplateContext"
373
+ }
374
+ },
375
+ {
376
+ from: "templates/src/local-package/server/services/assistantConfigService.js",
377
+ to: "packages/assistant/src/server/services/assistantConfigService.js",
378
+ reason: "Install generated assistant config service.",
379
+ category: "assistant",
380
+ id: "assistant-local-config-service",
381
+ templateContext: {
382
+ entrypoint: "src/server/buildTemplateContext.js",
383
+ export: "buildTemplateContext"
384
+ }
385
+ },
386
+ {
387
+ from: "templates/src/local-package/server/services/chatService.js",
388
+ to: "packages/assistant/src/server/services/chatService.js",
389
+ reason: "Install generated assistant chat service.",
390
+ category: "assistant",
391
+ id: "assistant-local-chat-service",
392
+ templateContext: {
393
+ entrypoint: "src/server/buildTemplateContext.js",
394
+ export: "buildTemplateContext"
395
+ }
396
+ },
397
+ {
398
+ from: "templates/src/local-package/server/services/transcriptService.js",
399
+ to: "packages/assistant/src/server/services/transcriptService.js",
400
+ reason: "Install generated assistant transcript service.",
401
+ category: "assistant",
402
+ id: "assistant-local-transcript-service",
403
+ templateContext: {
404
+ entrypoint: "src/server/buildTemplateContext.js",
405
+ export: "buildTemplateContext"
406
+ }
407
+ },
408
+ {
409
+ from: "templates/src/pages/assistant/index.vue",
410
+ toSurface: "${option:runtime-surface|lower}",
411
+ toSurfacePath: "assistant/index.vue",
412
+ reason: "Install generated assistant runtime page.",
413
+ category: "assistant",
414
+ id: "assistant-page-runtime"
415
+ }
416
+ ],
417
+ text: [
218
418
  {
219
419
  op: "append-text",
220
- file: "packages/main/src/shared/resources/consoleSettingsFields.js",
420
+ file: "src/placement.js",
221
421
  position: "bottom",
222
- skipIfContains: "key: \"workspaceSurfacePrompt\"",
422
+ skipIfContains: "id: \"assistant.generated.menu\"",
223
423
  value:
224
- "\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",
225
- reason: "Append assistant console settings field into app-owned console settings field registry.",
424
+ "\naddPlacement({\n id: \"assistant.generated.menu\",\n host: \"__ASSISTANT_MENU_PLACEMENT_HOST__\",\n position: \"__ASSISTANT_MENU_PLACEMENT_POSITION__\",\n surfaces: [\"${option:runtime-surface|lower}\"],\n order: 310,\n componentToken: \"__ASSISTANT_MENU_COMPONENT_TOKEN__\",\n props: {\n label: \"__ASSISTANT_MENU_LABEL__\",\n surface: \"${option:runtime-surface|lower}\",\n workspaceSuffix: \"__ASSISTANT_MENU_WORKSPACE_SUFFIX__\",\n nonWorkspaceSuffix: \"__ASSISTANT_MENU_NON_WORKSPACE_SUFFIX__\"\n },\n when: ({ auth }) => Boolean(auth?.authenticated)\n});\n",
425
+ reason: "Append generated assistant runtime menu placement into app-owned placement registry.",
226
426
  category: "assistant",
227
- id: "assistant-console-settings-field-definition"
427
+ id: "assistant-placement-menu",
428
+ templateContext: {
429
+ entrypoint: "src/server/buildTemplateContext.js",
430
+ export: "buildTemplateContext"
431
+ }
228
432
  },
229
433
  {
230
434
  op: "append-text",
231
- file: "packages/main/src/shared/resources/workspaceSettingsFields.js",
435
+ file: "src/placement.js",
232
436
  position: "bottom",
233
- skipIfContains: "key: \"appSurfacePrompt\"",
437
+ skipIfContains: "id: \"assistant.generated.settings.form\"",
234
438
  value:
235
- "\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",
236
- reason: "Append assistant workspace settings field into app-owned workspace settings field registry.",
439
+ "\naddPlacement({\n id: \"assistant.generated.settings.form\",\n host: \"__ASSISTANT_SETTINGS_HOST__\",\n position: \"forms\",\n surfaces: [\"${option:settings-surface|lower}\"],\n order: 250,\n componentToken: \"assistant.web.settings.element\",\n when: ({ auth }) => Boolean(auth?.authenticated)\n});\n",
440
+ reason: "Append generated assistant settings form placement into app-owned settings placements.",
237
441
  category: "assistant",
238
- id: "assistant-workspace-settings-field-definition",
239
- when: {
240
- config: "tenancyMode",
241
- in: ["personal", "workspaces"]
442
+ id: "assistant-settings-form-placement",
443
+ templateContext: {
444
+ entrypoint: "src/server/buildTemplateContext.js",
445
+ export: "buildTemplateContext"
242
446
  }
243
447
  },
244
448
  {
@@ -255,7 +459,7 @@ export default Object.freeze({
255
459
  op: "upsert-env",
256
460
  key: "AI_API_KEY",
257
461
  value: "${option:ai-api-key}",
258
- reason: "Configure assistant provider API key.",
462
+ reason: "Configure assistant AI API key.",
259
463
  category: "runtime-config",
260
464
  id: "assistant-ai-api-key"
261
465
  },
@@ -264,7 +468,7 @@ export default Object.freeze({
264
468
  op: "upsert-env",
265
469
  key: "AI_BASE_URL",
266
470
  value: "${option:ai-base-url}",
267
- reason: "Configure optional assistant provider base URL.",
471
+ reason: "Configure assistant AI base URL override.",
268
472
  category: "runtime-config",
269
473
  id: "assistant-ai-base-url"
270
474
  },
@@ -273,7 +477,7 @@ export default Object.freeze({
273
477
  op: "upsert-env",
274
478
  key: "AI_TIMEOUT_MS",
275
479
  value: "${option:ai-timeout-ms}",
276
- reason: "Configure assistant provider timeout.",
480
+ reason: "Configure assistant AI timeout in milliseconds.",
277
481
  category: "runtime-config",
278
482
  id: "assistant-ai-timeout-ms"
279
483
  }
package/package.json CHANGED
@@ -1,30 +1,14 @@
1
1
  {
2
2
  "name": "@jskit-ai/assistant",
3
- "version": "0.1.32",
3
+ "version": "0.1.35",
4
4
  "type": "module",
5
5
  "scripts": {
6
6
  "test": "node --test"
7
7
  },
8
8
  "exports": {
9
- "./client": "./src/client/index.js",
10
- "./server/AssistantServiceProvider": "./src/server/AssistantServiceProvider.js",
11
- "./server/actionIds": "./src/server/actionIds.js",
12
- "./shared": "./src/shared/index.js"
9
+ "./server/buildTemplateContext": "./src/server/buildTemplateContext.js"
13
10
  },
14
11
  "dependencies": {
15
- "@jskit-ai/auth-core": "0.1.23",
16
- "@jskit-ai/database-runtime": "0.1.24",
17
- "@jskit-ai/http-runtime": "0.1.23",
18
- "@jskit-ai/kernel": "0.1.24",
19
- "@jskit-ai/realtime": "0.1.23",
20
- "@jskit-ai/shell-web": "0.1.23",
21
- "@jskit-ai/users-core": "0.1.33",
22
- "@jskit-ai/users-web": "0.1.38",
23
- "@tanstack/vue-query": "^5.90.5",
24
- "dompurify": "^3.3.3",
25
- "marked": "^17.0.4",
26
- "openai": "^6.22.0",
27
- "typebox": "^1.0.81",
28
- "vuetify": "^4.0.0"
12
+ "@jskit-ai/kernel": "0.1.26"
29
13
  }
30
14
  }