@goodandready/dsh-moa 0.2.73 → 0.2.75
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/README.md +15 -0
- package/README.ru.md +15 -0
- package/README.zh.md +15 -0
- package/lib/client.js +185 -2
- package/lib/events.js +4 -0
- package/lib/moa-schema.js +16 -0
- package/lib/pipeline/context.js +70 -2
- package/lib/pipeline/developer-preferences.js +196 -0
- package/lib/pipeline/escalation.js +160 -0
- package/lib/pipeline/manifest-stack.js +287 -0
- package/lib/pipeline/runner.js +60 -6
- package/lib/pipeline/self-consistency.js +135 -0
- package/lib/routes/preferences.js +108 -0
- package/lib/routes.js +3 -0
- package/package.json +1 -1
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Developer Preferences Management Routes (#309)
|
|
3
|
+
* Exposes endpoints to inspect, add, toggle, and delete developer coding preferences.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import {
|
|
7
|
+
loadDeveloperPreferences,
|
|
8
|
+
addDeveloperPreference,
|
|
9
|
+
updateDeveloperPreference,
|
|
10
|
+
deleteDeveloperPreference,
|
|
11
|
+
} from '../pipeline/developer-preferences.js'
|
|
12
|
+
import { writeJson, readBody, assertAuthorizedRequest } from '../access.js'
|
|
13
|
+
import { isSafeWriteRequest } from '../updater.js'
|
|
14
|
+
|
|
15
|
+
export function registerPreferencesRoutes(ctx) {
|
|
16
|
+
// 1. Exact route: /dsh-moa/preferences
|
|
17
|
+
ctx.effect(() => {
|
|
18
|
+
return ctx.webServer.register({
|
|
19
|
+
kind: 'exact',
|
|
20
|
+
path: '/dsh-moa/preferences',
|
|
21
|
+
handler: async (req, res) => {
|
|
22
|
+
if (!assertAuthorizedRequest(req, res, ctx)) return
|
|
23
|
+
|
|
24
|
+
if (req.method === 'GET') {
|
|
25
|
+
const preferences = loadDeveloperPreferences()
|
|
26
|
+
return writeJson(res, 200, { ok: true, preferences })
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
if (req.method === 'POST') {
|
|
30
|
+
if (!isSafeWriteRequest(req)) {
|
|
31
|
+
return writeJson(res, 403, { ok: false, error: 'Forbidden: cross-site request rejected' })
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
let body = {}
|
|
35
|
+
try {
|
|
36
|
+
const raw = await readBody(req)
|
|
37
|
+
if (raw) body = JSON.parse(raw)
|
|
38
|
+
} catch (_err) {
|
|
39
|
+
return writeJson(res, 400, { ok: false, error: 'Malformed JSON payload' })
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
if (body.action === 'delete' && body.id) {
|
|
43
|
+
const deleted = deleteDeveloperPreference(body.id)
|
|
44
|
+
return writeJson(res, 200, { ok: true, deleted, id: body.id })
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
if (body.action === 'update' && body.id) {
|
|
48
|
+
const updated = updateDeveloperPreference(body.id, body.updates || body)
|
|
49
|
+
if (!updated) return writeJson(res, 404, { ok: false, error: 'Preference not found' })
|
|
50
|
+
return writeJson(res, 200, { ok: true, preference: updated })
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const created = addDeveloperPreference(body)
|
|
54
|
+
if (!created) {
|
|
55
|
+
return writeJson(res, 400, { ok: false, error: 'Missing required rule field' })
|
|
56
|
+
}
|
|
57
|
+
return writeJson(res, 201, { ok: true, preference: created })
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
return writeJson(res, 405, { ok: false, error: 'GET or POST required' })
|
|
61
|
+
},
|
|
62
|
+
})
|
|
63
|
+
})
|
|
64
|
+
|
|
65
|
+
// 2. Prefix route: /dsh-moa/preferences/ for REST ID operations
|
|
66
|
+
ctx.effect(() => {
|
|
67
|
+
return ctx.webServer.register({
|
|
68
|
+
kind: 'prefix',
|
|
69
|
+
path: '/dsh-moa/preferences/',
|
|
70
|
+
handler: async (req, res) => {
|
|
71
|
+
if (!assertAuthorizedRequest(req, res, ctx)) return
|
|
72
|
+
|
|
73
|
+
const url = new URL(req.url, 'http://127.0.0.1')
|
|
74
|
+
const id = url.pathname.replace(/^\/dsh-moa\/preferences\//, '').trim()
|
|
75
|
+
|
|
76
|
+
if (!id) {
|
|
77
|
+
return writeJson(res, 400, { ok: false, error: 'Missing preference ID in URL path' })
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
if (req.method === 'DELETE') {
|
|
81
|
+
if (!isSafeWriteRequest(req)) {
|
|
82
|
+
return writeJson(res, 403, { ok: false, error: 'Forbidden: cross-site request rejected' })
|
|
83
|
+
}
|
|
84
|
+
const deleted = deleteDeveloperPreference(id)
|
|
85
|
+
return writeJson(res, 200, { ok: true, deleted, id })
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
if (req.method === 'PATCH' || req.method === 'POST') {
|
|
89
|
+
if (!isSafeWriteRequest(req)) {
|
|
90
|
+
return writeJson(res, 403, { ok: false, error: 'Forbidden: cross-site request rejected' })
|
|
91
|
+
}
|
|
92
|
+
let body = {}
|
|
93
|
+
try {
|
|
94
|
+
const raw = await readBody(req)
|
|
95
|
+
if (raw) body = JSON.parse(raw)
|
|
96
|
+
} catch {
|
|
97
|
+
return writeJson(res, 400, { ok: false, error: 'Malformed JSON payload' })
|
|
98
|
+
}
|
|
99
|
+
const updated = updateDeveloperPreference(id, body)
|
|
100
|
+
if (!updated) return writeJson(res, 404, { ok: false, error: 'Preference not found' })
|
|
101
|
+
return writeJson(res, 200, { ok: true, preference: updated })
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
return writeJson(res, 405, { ok: false, error: 'DELETE or PATCH required' })
|
|
105
|
+
},
|
|
106
|
+
})
|
|
107
|
+
})
|
|
108
|
+
}
|
package/lib/routes.js
CHANGED
|
@@ -8,12 +8,14 @@ import { registerHistoryRoutes } from './routes/history.js'
|
|
|
8
8
|
import { registerWorkbenchRoutes } from './routes/workbench.js'
|
|
9
9
|
import { registerPipelineRoutes } from './routes/pipeline.js'
|
|
10
10
|
import { registerCacheRoutes } from './routes/cache.js'
|
|
11
|
+
import { registerPreferencesRoutes } from './routes/preferences.js'
|
|
11
12
|
|
|
12
13
|
export { registerPresetRoutes } from './routes/presets.js'
|
|
13
14
|
export { registerHistoryRoutes } from './routes/history.js'
|
|
14
15
|
export { registerWorkbenchRoutes } from './routes/workbench.js'
|
|
15
16
|
export { registerPipelineRoutes } from './routes/pipeline.js'
|
|
16
17
|
export { registerCacheRoutes } from './routes/cache.js'
|
|
18
|
+
export { registerPreferencesRoutes } from './routes/preferences.js'
|
|
17
19
|
|
|
18
20
|
export function registerMoaRoutes(ctx, deps) {
|
|
19
21
|
registerPresetRoutes(ctx, deps)
|
|
@@ -21,4 +23,5 @@ export function registerMoaRoutes(ctx, deps) {
|
|
|
21
23
|
registerWorkbenchRoutes(ctx, deps)
|
|
22
24
|
registerPipelineRoutes(ctx, deps)
|
|
23
25
|
registerCacheRoutes(ctx, deps)
|
|
26
|
+
registerPreferencesRoutes(ctx, deps)
|
|
24
27
|
}
|