Fix bizMonitor tool results failing DSH lossless JSON (strip undefined holes).

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
oliver 2026-09-20 15:35:08 +08:00
parent b235957c34
commit 4dd628b7cc
13 changed files with 414 additions and 136 deletions

View file

@ -39,6 +39,8 @@ test('one group one skill dir; ops owns NMS + managed CLI; topology owns canvas;
assert.ok(TOOLS_BY_GROUP.topology.includes('netx__suggestSinkHubs'))
assert.ok(TOOLS_BY_GROUP.topology.includes('netx__sinkTopologyDualUnits'))
assert.ok(TOOLS_BY_GROUP.bizMonitor.includes('netx__getBizMonitorContext'))
assert.ok(TOOLS_BY_GROUP.bizMonitor.includes('netx__listBizMonitors'))
assert.ok(TOOLS_BY_GROUP.bizMonitor.includes('netx__listBizMonitorBatches'))
assert.ok(TOOLS_BY_GROUP.bizMonitor.includes('netx__getBizCollectCommandRaw'))
})

40
test/json-safe.test.mjs Normal file
View file

@ -0,0 +1,40 @@
/**
* Lossless JSON helpers for DSH tool results.
*/
import assert from 'node:assert/strict'
import test from 'node:test'
import { omitUndefined, toLosslessJson } from '../src/netx/json-safe.ts'
test('omitUndefined drops undefined keys but keeps null/false/0', () => {
assert.deepEqual(
omitUndefined({ a: 1, b: undefined, c: null, d: false, e: 0 }),
{ a: 1, c: null, d: false, e: 0 },
)
})
test('toLosslessJson strips undefined holes (listBizMonitors-style payload)', () => {
const raw = {
ok: true,
data: {
kind: 'projects',
projects: [{ id: 'p1', name: 'demo' }],
tasks: undefined,
next: 'go',
},
}
const safe = toLosslessJson(raw)
assert.equal(safe.ok, true)
const data = safe.data
assert.ok(data && typeof data === 'object' && !Array.isArray(data))
assert.equal(Object.hasOwn(data, 'tasks'), false)
assert.deepEqual(data.projects, [{ id: 'p1', name: 'demo' }])
})
test('toLosslessJson keeps failure envelopes serializable', () => {
const safe = toLosslessJson({ ok: false, error: 'x', detail: undefined })
assert.equal(safe.ok, false)
assert.equal(safe.error, 'x')
assert.equal(Object.hasOwn(safe, 'detail'), false)
})