@goodandready/dsh-moa 0.2.21 → 0.2.23
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/lib/client.js +4 -4
- package/lib/index.js +79 -19
- package/lib/routes.js +25 -19
- package/package.json +8 -2
package/lib/client.js
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
// - Segmented preset selectors and count pills
|
|
7
7
|
// - Refined temperature sliders and searchable model picker
|
|
8
8
|
// - Telemetry summary grid fed by /dsh-moa/history
|
|
9
|
-
// - Robust error boundary and
|
|
9
|
+
// - Robust error boundary and configForms reactivity
|
|
10
10
|
//
|
|
11
11
|
// English is the canonical source language; the ru translation is provided
|
|
12
12
|
// by the DSH translation plugin at runtime (no bundled ru duplicate).
|
|
@@ -1776,8 +1776,8 @@ window.__ModuleLoader__.load({
|
|
|
1776
1776
|
|
|
1777
1777
|
const scope = React.useMemo(() => {
|
|
1778
1778
|
if (!effectiveCtx) return undefined
|
|
1779
|
-
const s = effectiveCtx.get ? effectiveCtx.get('
|
|
1780
|
-
return s && typeof s.
|
|
1779
|
+
const s = effectiveCtx.get ? effectiveCtx.get('configForms') : effectiveCtx.configForms
|
|
1780
|
+
return s && typeof s.get === 'function' ? s.get(NS) : undefined
|
|
1781
1781
|
}, [effectiveCtx])
|
|
1782
1782
|
|
|
1783
1783
|
const snapshot = React.useSyncExternalStore
|
|
@@ -2135,7 +2135,7 @@ window.__ModuleLoader__.load({
|
|
|
2135
2135
|
)
|
|
2136
2136
|
}
|
|
2137
2137
|
|
|
2138
|
-
exports.inject = ['slots', 'locale', 'inputTriggers', '
|
|
2138
|
+
exports.inject = ['slots', 'locale', 'inputTriggers', 'configForms']
|
|
2139
2139
|
exports.apply = function apply(ctx) {
|
|
2140
2140
|
rootCtx = ctx
|
|
2141
2141
|
|
package/lib/index.js
CHANGED
|
@@ -11,6 +11,18 @@ import { refreshCatalogInBackground } from './pricing.js'
|
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
13
|
import z from '@deepseek-ai/schemastery'
|
|
14
|
+
|
|
15
|
+
// Ensure .volatile() helper exists on Schemastery schema prototype
|
|
16
|
+
try {
|
|
17
|
+
const schemaProto = Object.getPrototypeOf(z.boolean())
|
|
18
|
+
if (schemaProto && typeof schemaProto.volatile !== 'function') {
|
|
19
|
+
schemaProto.volatile = function () {
|
|
20
|
+
return typeof this.extra === 'function' ? this.extra('volatile', true) : this
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
} catch {
|
|
24
|
+
// safe fallback
|
|
25
|
+
}
|
|
14
26
|
import path from 'node:path'
|
|
15
27
|
import os from 'node:os'
|
|
16
28
|
import {
|
|
@@ -26,7 +38,7 @@ import { registerPluginUpdater, isSafeWriteRequest } from './updater.js'
|
|
|
26
38
|
|
|
27
39
|
export const name = '@goodandready/dsh-moa'
|
|
28
40
|
export { collectProjectContext, formatProjectContext } from './file-workspace.js'
|
|
29
|
-
export const inject = ['webServer', 'llm', '
|
|
41
|
+
export const inject = ['webServer', 'llm', 'sessions', 'tools']
|
|
30
42
|
|
|
31
43
|
export const NS = 'dsh-moa'
|
|
32
44
|
|
|
@@ -65,9 +77,9 @@ export const PresetSchema = z.object({
|
|
|
65
77
|
})
|
|
66
78
|
|
|
67
79
|
export const Config = z.object({
|
|
68
|
-
enabled: z.boolean().default(true),
|
|
69
|
-
default_preset: z.string().default('default'),
|
|
70
|
-
prices: z.dict(PriceRow).default({}),
|
|
80
|
+
enabled: z.boolean().default(true).volatile(),
|
|
81
|
+
default_preset: z.string().default('default').volatile(),
|
|
82
|
+
prices: z.dict(PriceRow).default({}).volatile(),
|
|
71
83
|
presets: z.array(PresetSchema).default([
|
|
72
84
|
{
|
|
73
85
|
name: 'default',
|
|
@@ -110,31 +122,77 @@ export const Config = z.object({
|
|
|
110
122
|
max_tokens: 8192,
|
|
111
123
|
judge_criteria: '',
|
|
112
124
|
},
|
|
113
|
-
]),
|
|
125
|
+
]).volatile(),
|
|
114
126
|
})
|
|
115
127
|
|
|
116
128
|
|
|
129
|
+
export function plainConfig(value) {
|
|
130
|
+
if (value && typeof value === 'object' && typeof value.get === 'function') {
|
|
131
|
+
return plainConfig(value.get())
|
|
132
|
+
}
|
|
133
|
+
if (Array.isArray(value)) {
|
|
134
|
+
return value.map(plainConfig)
|
|
135
|
+
}
|
|
136
|
+
if (value !== null && typeof value === 'object') {
|
|
137
|
+
return Object.fromEntries(
|
|
138
|
+
Object.entries(value).map(([key, child]) => [key, plainConfig(child)])
|
|
139
|
+
)
|
|
140
|
+
}
|
|
141
|
+
return value
|
|
142
|
+
}
|
|
143
|
+
|
|
117
144
|
export function apply(ctx, config) {
|
|
118
145
|
refreshCatalogInBackground()
|
|
119
146
|
|
|
120
|
-
let
|
|
121
|
-
|
|
122
|
-
const live = () =>
|
|
147
|
+
let localConfig = plainConfig(config ?? {})
|
|
148
|
+
const getConfig = () => localConfig
|
|
149
|
+
const live = () => {
|
|
150
|
+
try {
|
|
151
|
+
const raw = getConfig() ?? {}
|
|
152
|
+
const validated = Config(plainConfig(raw))
|
|
153
|
+
return plainConfig(validated) ?? localConfig
|
|
154
|
+
} catch {
|
|
155
|
+
return localConfig
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
let settingsService = null
|
|
123
160
|
|
|
161
|
+
// Optional policy hook for DSH 0.1.7 settings forms:
|
|
162
|
+
// Suppress auto-generated settings form since dsh-moa provides its own
|
|
163
|
+
// custom settings surface in settings.plugin.item.
|
|
124
164
|
ctx.inject(['settings'], (sctx) => {
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
165
|
+
settingsService = sctx.settings
|
|
166
|
+
if (sctx.settings && typeof sctx.settings.configure === 'function') {
|
|
167
|
+
try {
|
|
168
|
+
const dispose = sctx.settings.configure({ auto: false }, ctx.fiber)
|
|
169
|
+
if (typeof sctx.effect === 'function') {
|
|
170
|
+
sctx.effect(() => () => {
|
|
171
|
+
dispose()
|
|
172
|
+
settingsService = null
|
|
173
|
+
}, 'dsh-moa: settings policy')
|
|
174
|
+
}
|
|
175
|
+
} catch {
|
|
176
|
+
// Safe fallback if configure is already registered or throws
|
|
177
|
+
}
|
|
135
178
|
}
|
|
136
179
|
})
|
|
137
180
|
|
|
181
|
+
const saveConfig = async (newFields) => {
|
|
182
|
+
const plain = plainConfig(newFields)
|
|
183
|
+
localConfig = { ...localConfig, ...plain }
|
|
184
|
+
try {
|
|
185
|
+
if (settingsService && typeof settingsService.replace === 'function') {
|
|
186
|
+
await settingsService.replace(NS, plain)
|
|
187
|
+
} else if (settingsService && typeof settingsService.update === 'function') {
|
|
188
|
+
await settingsService.update(NS, plain)
|
|
189
|
+
}
|
|
190
|
+
} catch (err) {
|
|
191
|
+
console.warn('[dsh-moa] Settings persistence warning:', err?.message || err)
|
|
192
|
+
}
|
|
193
|
+
return localConfig
|
|
194
|
+
}
|
|
195
|
+
|
|
138
196
|
/**
|
|
139
197
|
* Unified LLM dispatch function using ctx.llm.prepareCall / stream
|
|
140
198
|
*/
|
|
@@ -226,7 +284,9 @@ export function apply(ctx, config) {
|
|
|
226
284
|
live,
|
|
227
285
|
callLlm,
|
|
228
286
|
liveCanvas,
|
|
229
|
-
|
|
287
|
+
saveConfig,
|
|
288
|
+
Config,
|
|
289
|
+
plainConfig,
|
|
230
290
|
})
|
|
231
291
|
|
|
232
292
|
// Session turn interceptor: route turn to real aggregator model & stream MoA synthesis
|
package/lib/routes.js
CHANGED
|
@@ -38,21 +38,24 @@ function readBody(req) {
|
|
|
38
38
|
})
|
|
39
39
|
}
|
|
40
40
|
|
|
41
|
-
export function registerMoaRoutes(ctx, { live, callLlm, liveCanvas,
|
|
42
|
-
const getScope = () => (typeof getSettingsScope === 'function' ? getSettingsScope() : null)
|
|
41
|
+
export function registerMoaRoutes(ctx, { live, callLlm, liveCanvas, saveConfig, Config, plainConfig }) {
|
|
43
42
|
|
|
44
43
|
ctx.effect(() => {
|
|
45
44
|
return ctx.webServer.register({
|
|
46
45
|
kind: 'exact',
|
|
47
46
|
path: '/dsh-moa/status',
|
|
48
47
|
handler: (_req, res) => {
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
48
|
+
try {
|
|
49
|
+
const cfg = live()
|
|
50
|
+
writeJson(res, 200, {
|
|
51
|
+
ok: true,
|
|
52
|
+
enabled: cfg.enabled !== false,
|
|
53
|
+
defaultPreset: cfg.default_preset || 'default',
|
|
54
|
+
presetsCount: (cfg.presets || []).length,
|
|
55
|
+
})
|
|
56
|
+
} catch (err) {
|
|
57
|
+
writeJson(res, 500, { ok: false, error: err?.message || String(err) })
|
|
58
|
+
}
|
|
56
59
|
},
|
|
57
60
|
})
|
|
58
61
|
}, 'dsh-moa: status route')
|
|
@@ -120,7 +123,12 @@ ctx.effect(() => {
|
|
|
120
123
|
|
|
121
124
|
// Query settings for configured providers
|
|
122
125
|
try {
|
|
123
|
-
|
|
126
|
+
let s = null
|
|
127
|
+
try {
|
|
128
|
+
s = ctx.get ? ctx.get('settings') : null
|
|
129
|
+
} catch {
|
|
130
|
+
s = null
|
|
131
|
+
}
|
|
124
132
|
const getSetting = (k) => {
|
|
125
133
|
try { return s?.get?.(k) } catch { return undefined }
|
|
126
134
|
}
|
|
@@ -196,19 +204,17 @@ ctx.effect(() => {
|
|
|
196
204
|
return
|
|
197
205
|
}
|
|
198
206
|
|
|
199
|
-
// Persist via
|
|
200
|
-
if (
|
|
201
|
-
await
|
|
202
|
-
} else {
|
|
203
|
-
// In-memory fallback if settings service is unavailable
|
|
204
|
-
getConfig = () => validated
|
|
207
|
+
// Persist via saveConfig (in-memory and DSH profile settings)
|
|
208
|
+
if (typeof saveConfig === 'function') {
|
|
209
|
+
await saveConfig(validated)
|
|
205
210
|
}
|
|
206
211
|
|
|
212
|
+
const unwrapped = typeof plainConfig === 'function' ? plainConfig(validated) : validated
|
|
207
213
|
writeJson(res, 200, {
|
|
208
214
|
ok: true,
|
|
209
|
-
enabled:
|
|
210
|
-
defaultPreset:
|
|
211
|
-
presets:
|
|
215
|
+
enabled: unwrapped.enabled !== false,
|
|
216
|
+
defaultPreset: unwrapped.default_preset,
|
|
217
|
+
presets: unwrapped.presets,
|
|
212
218
|
})
|
|
213
219
|
} catch (err) {
|
|
214
220
|
writeJson(res, 400, { ok: false, error: err?.message || String(err) })
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@goodandready/dsh-moa",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.23",
|
|
4
4
|
"description": "Mixture of Agents (MoA) plugin for DeepSeek Harness with /moa slash command",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "lib/index.js",
|
|
@@ -48,7 +48,8 @@
|
|
|
48
48
|
"inject": [
|
|
49
49
|
"@deepseek-ai/dsh-client-locale",
|
|
50
50
|
"@deepseek-ai/dsh-client-ui-settings",
|
|
51
|
-
"@deepseek-ai/dsh-client-ui-input-trigger"
|
|
51
|
+
"@deepseek-ai/dsh-client-ui-input-trigger",
|
|
52
|
+
"@deepseek-ai/dsh-client-ui-slots"
|
|
52
53
|
]
|
|
53
54
|
}
|
|
54
55
|
},
|
|
@@ -59,5 +60,10 @@
|
|
|
59
60
|
"@deepseek-ai/dsh-settings": "^0.1.0-rc.6",
|
|
60
61
|
"@deepseek-ai/dsh-tools": "^0.1.0-rc.6",
|
|
61
62
|
"@deepseek-ai/schemastery": "^3.18.1"
|
|
63
|
+
},
|
|
64
|
+
"peerDependenciesMeta": {
|
|
65
|
+
"@deepseek-ai/dsh-settings": {
|
|
66
|
+
"optional": true
|
|
67
|
+
}
|
|
62
68
|
}
|
|
63
69
|
}
|