@chenchaolong/plugin-trade-compliance-workbench 1.0.0 → 1.0.2
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 +46 -1
- package/dist/assets/branding/yuneec-logo.png +0 -0
- package/dist/assets/templates/CI.xlsx +0 -0
- package/dist/assets/templates/CUSTOMS_DECLARATION.xlsx +0 -0
- package/dist/assets/templates/PI.xlsx +0 -0
- package/dist/assets/templates/PL.xlsx +0 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/lib/adapters/file-storage.d.ts +4 -2
- package/dist/lib/adapters/file-storage.d.ts.map +1 -1
- package/dist/lib/adapters/file-storage.js +25 -10
- package/dist/lib/adapters/file-storage.js.map +1 -1
- package/dist/lib/adapters/hsbianma.provider.d.ts +1 -0
- package/dist/lib/adapters/hsbianma.provider.d.ts.map +1 -1
- package/dist/lib/adapters/hsbianma.provider.js +32 -3
- package/dist/lib/adapters/hsbianma.provider.js.map +1 -1
- package/dist/lib/adapters/translation.provider.d.ts +3 -0
- package/dist/lib/adapters/translation.provider.d.ts.map +1 -1
- package/dist/lib/adapters/translation.provider.js +15 -6
- package/dist/lib/adapters/translation.provider.js.map +1 -1
- package/dist/lib/constants.d.ts +3 -2
- package/dist/lib/constants.d.ts.map +1 -1
- package/dist/lib/constants.js +3 -2
- package/dist/lib/constants.js.map +1 -1
- package/dist/lib/demo-data.definitions.d.ts +28 -0
- package/dist/lib/demo-data.definitions.d.ts.map +1 -0
- package/dist/lib/demo-data.definitions.js +236 -0
- package/dist/lib/demo-data.definitions.js.map +1 -0
- package/dist/lib/demo-data.entity.d.ts +9 -0
- package/dist/lib/demo-data.entity.d.ts.map +1 -0
- package/dist/lib/demo-data.entity.js +24 -0
- package/dist/lib/demo-data.entity.js.map +1 -0
- package/dist/lib/demo-data.ids.d.ts +4 -0
- package/dist/lib/demo-data.ids.d.ts.map +1 -0
- package/dist/lib/demo-data.ids.js +19 -0
- package/dist/lib/demo-data.ids.js.map +1 -0
- package/dist/lib/demo-data.service.d.ts +26 -0
- package/dist/lib/demo-data.service.d.ts.map +1 -0
- package/dist/lib/demo-data.service.js +124 -0
- package/dist/lib/demo-data.service.js.map +1 -0
- package/dist/lib/domain/default-settings.d.ts +1 -0
- package/dist/lib/domain/default-settings.d.ts.map +1 -1
- package/dist/lib/domain/default-settings.js +1 -0
- package/dist/lib/domain/default-settings.js.map +1 -1
- package/dist/lib/domain/risk-notice.d.ts +59 -0
- package/dist/lib/domain/risk-notice.d.ts.map +1 -0
- package/dist/lib/domain/risk-notice.js +30 -0
- package/dist/lib/domain/risk-notice.js.map +1 -0
- package/dist/lib/entities/catalog.entity.d.ts.map +1 -1
- package/dist/lib/entities/catalog.entity.js +4 -2
- package/dist/lib/entities/catalog.entity.js.map +1 -1
- package/dist/lib/entities/customer.entity.d.ts +9 -2
- package/dist/lib/entities/customer.entity.d.ts.map +1 -1
- package/dist/lib/entities/customer.entity.js +29 -1
- package/dist/lib/entities/customer.entity.js.map +1 -1
- package/dist/lib/entities/index.d.ts +2 -2
- package/dist/lib/entities/index.d.ts.map +1 -1
- package/dist/lib/entities/index.js +2 -2
- package/dist/lib/entities/index.js.map +1 -1
- package/dist/lib/entities/procurement.entity.d.ts +6 -4
- package/dist/lib/entities/procurement.entity.d.ts.map +1 -1
- package/dist/lib/entities/procurement.entity.js +9 -1
- package/dist/lib/entities/procurement.entity.js.map +1 -1
- package/dist/lib/entities/settings.entity.d.ts +12 -2
- package/dist/lib/entities/settings.entity.d.ts.map +1 -1
- package/dist/lib/entities/settings.entity.js +40 -0
- package/dist/lib/entities/settings.entity.js.map +1 -1
- package/dist/lib/entities/shared.entity.d.ts +10 -5
- package/dist/lib/entities/shared.entity.d.ts.map +1 -1
- package/dist/lib/entities/shared.entity.js +22 -1
- package/dist/lib/entities/shared.entity.js.map +1 -1
- package/dist/lib/remote-components/trade-compliance-workbench/app.css +1 -0
- package/dist/lib/remote-components/trade-compliance-workbench/app.js +63 -277
- package/dist/lib/remote-ui/analytics-contracts.d.ts +106 -0
- package/dist/lib/remote-ui/analytics-contracts.d.ts.map +1 -0
- package/dist/lib/remote-ui/analytics-contracts.js +4 -0
- package/dist/lib/remote-ui/analytics-contracts.js.map +1 -0
- package/dist/lib/remote-ui/app-source.d.ts +2 -0
- package/dist/lib/remote-ui/app-source.d.ts.map +1 -0
- package/dist/lib/remote-ui/app-source.js +753 -0
- package/dist/lib/remote-ui/app-source.js.map +1 -0
- package/dist/lib/remote-ui/bridge.d.ts +36 -0
- package/dist/lib/remote-ui/bridge.d.ts.map +1 -0
- package/dist/lib/remote-ui/bridge.js +159 -0
- package/dist/lib/remote-ui/bridge.js.map +1 -0
- package/dist/lib/remote-ui/components/data-grid.d.ts +34 -0
- package/dist/lib/remote-ui/components/data-grid.d.ts.map +1 -0
- package/dist/lib/remote-ui/components/data-grid.js +59 -0
- package/dist/lib/remote-ui/components/data-grid.js.map +1 -0
- package/dist/lib/remote-ui/components/forms.d.ts +63 -0
- package/dist/lib/remote-ui/components/forms.d.ts.map +1 -0
- package/dist/lib/remote-ui/components/forms.js +117 -0
- package/dist/lib/remote-ui/components/forms.js.map +1 -0
- package/dist/lib/remote-ui/components/layout.d.ts +34 -0
- package/dist/lib/remote-ui/components/layout.d.ts.map +1 -0
- package/dist/lib/remote-ui/components/layout.js +89 -0
- package/dist/lib/remote-ui/components/layout.js.map +1 -0
- package/dist/lib/remote-ui/contract-import.d.ts +82 -0
- package/dist/lib/remote-ui/contract-import.d.ts.map +1 -0
- package/dist/lib/remote-ui/contract-import.js +102 -0
- package/dist/lib/remote-ui/contract-import.js.map +1 -0
- package/dist/lib/remote-ui/contracts.d.ts +257 -0
- package/dist/lib/remote-ui/contracts.d.ts.map +1 -0
- package/dist/lib/remote-ui/contracts.js +12 -0
- package/dist/lib/remote-ui/contracts.js.map +1 -0
- package/dist/lib/remote-ui/customer-contract-contracts.d.ts +227 -0
- package/dist/lib/remote-ui/customer-contract-contracts.d.ts.map +1 -0
- package/dist/lib/remote-ui/customer-contract-contracts.js +10 -0
- package/dist/lib/remote-ui/customer-contract-contracts.js.map +1 -0
- package/dist/lib/remote-ui/model.d.ts +31 -0
- package/dist/lib/remote-ui/model.d.ts.map +1 -0
- package/dist/lib/remote-ui/model.js +248 -0
- package/dist/lib/remote-ui/model.js.map +1 -0
- package/dist/lib/remote-ui/pages/analytics.d.ts +12 -0
- package/dist/lib/remote-ui/pages/analytics.d.ts.map +1 -0
- package/dist/lib/remote-ui/pages/analytics.js +123 -0
- package/dist/lib/remote-ui/pages/analytics.js.map +1 -0
- package/dist/lib/remote-ui/pages/catalogs.d.ts +225 -0
- package/dist/lib/remote-ui/pages/catalogs.d.ts.map +1 -0
- package/dist/lib/remote-ui/pages/catalogs.js +572 -0
- package/dist/lib/remote-ui/pages/catalogs.js.map +1 -0
- package/dist/lib/remote-ui/pages/contracts.d.ts +80 -0
- package/dist/lib/remote-ui/pages/contracts.d.ts.map +1 -0
- package/dist/lib/remote-ui/pages/contracts.js +396 -0
- package/dist/lib/remote-ui/pages/contracts.js.map +1 -0
- package/dist/lib/remote-ui/pages/files.d.ts +31 -0
- package/dist/lib/remote-ui/pages/files.d.ts.map +1 -0
- package/dist/lib/remote-ui/pages/files.js +64 -0
- package/dist/lib/remote-ui/pages/files.js.map +1 -0
- package/dist/lib/remote-ui/pages/home.d.ts +71 -0
- package/dist/lib/remote-ui/pages/home.d.ts.map +1 -0
- package/dist/lib/remote-ui/pages/home.js +136 -0
- package/dist/lib/remote-ui/pages/home.js.map +1 -0
- package/dist/lib/remote-ui/pages/procurement.d.ts +36 -0
- package/dist/lib/remote-ui/pages/procurement.d.ts.map +1 -0
- package/dist/lib/remote-ui/pages/procurement.js +370 -0
- package/dist/lib/remote-ui/pages/procurement.js.map +1 -0
- package/dist/lib/remote-ui/pages/sales.d.ts +12 -0
- package/dist/lib/remote-ui/pages/sales.d.ts.map +1 -0
- package/dist/lib/remote-ui/pages/sales.js +106 -0
- package/dist/lib/remote-ui/pages/sales.js.map +1 -0
- package/dist/lib/remote-ui/pages/settings.d.ts +34 -0
- package/dist/lib/remote-ui/pages/settings.d.ts.map +1 -0
- package/dist/lib/remote-ui/pages/settings.js +259 -0
- package/dist/lib/remote-ui/pages/settings.js.map +1 -0
- package/dist/lib/remote-ui/procurement-contracts.d.ts +177 -0
- package/dist/lib/remote-ui/procurement-contracts.d.ts.map +1 -0
- package/dist/lib/remote-ui/procurement-contracts.js +2 -0
- package/dist/lib/remote-ui/procurement-contracts.js.map +1 -0
- package/dist/lib/remote-ui/sales-contracts.d.ts +133 -0
- package/dist/lib/remote-ui/sales-contracts.d.ts.map +1 -0
- package/dist/lib/remote-ui/sales-contracts.js +2 -0
- package/dist/lib/remote-ui/sales-contracts.js.map +1 -0
- package/dist/lib/remote-ui/settings-contracts.d.ts +114 -0
- package/dist/lib/remote-ui/settings-contracts.d.ts.map +1 -0
- package/dist/lib/remote-ui/settings-contracts.js +6 -0
- package/dist/lib/remote-ui/settings-contracts.js.map +1 -0
- package/dist/lib/remote-ui/upload-policy.d.ts +18 -0
- package/dist/lib/remote-ui/upload-policy.d.ts.map +1 -0
- package/dist/lib/remote-ui/upload-policy.js +56 -0
- package/dist/lib/remote-ui/upload-policy.js.map +1 -0
- package/dist/lib/runtime-validation.d.ts +61 -0
- package/dist/lib/runtime-validation.d.ts.map +1 -0
- package/dist/lib/runtime-validation.js +243 -0
- package/dist/lib/runtime-validation.js.map +1 -0
- package/dist/lib/sales-file.service.d.ts +54 -6
- package/dist/lib/sales-file.service.d.ts.map +1 -1
- package/dist/lib/sales-file.service.js +278 -33
- package/dist/lib/sales-file.service.js.map +1 -1
- package/dist/lib/trade-compliance.config.d.ts +32 -0
- package/dist/lib/trade-compliance.config.d.ts.map +1 -1
- package/dist/lib/trade-compliance.config.js +16 -4
- package/dist/lib/trade-compliance.config.js.map +1 -1
- package/dist/lib/types.d.ts +253 -1
- package/dist/lib/types.d.ts.map +1 -1
- package/dist/lib/types.js +24 -0
- package/dist/lib/types.js.map +1 -1
- package/dist/lib/workbench-view.provider.d.ts +675 -38
- package/dist/lib/workbench-view.provider.d.ts.map +1 -1
- package/dist/lib/workbench-view.provider.js +411 -40
- package/dist/lib/workbench-view.provider.js.map +1 -1
- package/dist/lib/workbench.middleware.d.ts +70 -19
- package/dist/lib/workbench.middleware.d.ts.map +1 -1
- package/dist/lib/workbench.middleware.js +5 -1
- package/dist/lib/workbench.middleware.js.map +1 -1
- package/dist/lib/workbench.plugin.d.ts.map +1 -1
- package/dist/lib/workbench.plugin.js +6 -4
- package/dist/lib/workbench.plugin.js.map +1 -1
- package/dist/lib/workbench.service.d.ts +629 -48
- package/dist/lib/workbench.service.d.ts.map +1 -1
- package/dist/lib/workbench.service.js +1818 -300
- package/dist/lib/workbench.service.js.map +1 -1
- package/package.json +15 -4
- package/scripts/seed-demo-data.mjs +138 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@chenchaolong/plugin-trade-compliance-workbench",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.2",
|
|
4
4
|
"description": "外贸合规工作台新版组织级插件",
|
|
5
5
|
"license": "AGPL-3.0",
|
|
6
6
|
"type": "module",
|
|
@@ -16,6 +16,7 @@
|
|
|
16
16
|
},
|
|
17
17
|
"files": [
|
|
18
18
|
"dist",
|
|
19
|
+
"scripts/seed-demo-data.mjs",
|
|
19
20
|
"!**/*.tsbuildinfo"
|
|
20
21
|
],
|
|
21
22
|
"scripts": {
|
|
@@ -23,6 +24,10 @@
|
|
|
23
24
|
"check:remote": "node --check src/lib/remote-components/trade-compliance-workbench/app.js && node --check src/lib/remote-components/trade-compliance-workbench/editor-source.mjs",
|
|
24
25
|
"build:remote": "node scripts/build-remote.mjs",
|
|
25
26
|
"build": "pnpm clean && pnpm check:remote && pnpm build:remote && tsc -p tsconfig.lib.json && node scripts/copy-assets.mjs",
|
|
27
|
+
"preview": "node scripts/preview-remote.mjs",
|
|
28
|
+
"visual:check": "node scripts/visual-check.mjs",
|
|
29
|
+
"sanitize:templates": "node scripts/remove-template-images.mjs",
|
|
30
|
+
"seed:demo": "node scripts/seed-demo-data.mjs",
|
|
26
31
|
"test": "vitest run",
|
|
27
32
|
"test:watch": "vitest",
|
|
28
33
|
"typecheck": "tsc -p tsconfig.spec.json --noEmit"
|
|
@@ -37,11 +42,14 @@
|
|
|
37
42
|
"cheerio": "^1.2.0",
|
|
38
43
|
"decimal.js": "^10.6.0",
|
|
39
44
|
"exceljs": "^4.4.0",
|
|
45
|
+
"jszip": "^3.10.1",
|
|
40
46
|
"mammoth": "^1.12.0",
|
|
41
47
|
"pdf-parse": "^2.4.5",
|
|
48
|
+
"pg-query-stream": "^4.0.0",
|
|
42
49
|
"short-unique-id": "^5.3.2",
|
|
43
50
|
"tslib": "^2.8.1",
|
|
44
|
-
"xlsx": "^0.18.5"
|
|
51
|
+
"xlsx": "^0.18.5",
|
|
52
|
+
"yauzl": "^3.4.0"
|
|
45
53
|
},
|
|
46
54
|
"peerDependencies": {
|
|
47
55
|
"@langchain/core": ">=0.3.0",
|
|
@@ -50,8 +58,8 @@
|
|
|
50
58
|
"@nestjs/typeorm": "^11.0.0",
|
|
51
59
|
"@xpert-ai/contracts": "^3.10.1",
|
|
52
60
|
"@xpert-ai/plugin-sdk": "^3.10.1",
|
|
53
|
-
"react": ">=18",
|
|
54
|
-
"react-dom": ">=18",
|
|
61
|
+
"react": ">=18 <19",
|
|
62
|
+
"react-dom": ">=18 <19",
|
|
55
63
|
"typeorm": "^0.3.24",
|
|
56
64
|
"zod": "^3.25.67"
|
|
57
65
|
},
|
|
@@ -61,6 +69,9 @@
|
|
|
61
69
|
"@nestjs/core": "^11.1.6",
|
|
62
70
|
"@nestjs/typeorm": "^11.0.0",
|
|
63
71
|
"@types/node": "^20.19.9",
|
|
72
|
+
"@types/react": "18.3.28",
|
|
73
|
+
"@types/react-dom": "18.3.7",
|
|
74
|
+
"@types/yauzl": "^3.4.0",
|
|
64
75
|
"@univerjs/preset-sheets-core": "^0.25.1",
|
|
65
76
|
"@univerjs/presets": "^0.25.1",
|
|
66
77
|
"@xpert-ai/contracts": "^3.10.1",
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
const PACKAGE_NAME = '@chenchaolong/plugin-trade-compliance-workbench'
|
|
4
|
+
const MANIFEST_SLOT = 'agent.workbench.fixed'
|
|
5
|
+
const ACTION_KEY = 'seed_demo_data'
|
|
6
|
+
|
|
7
|
+
if (process.argv.includes('--help') || process.argv.includes('-h')) {
|
|
8
|
+
printHelp()
|
|
9
|
+
process.exit(0)
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
main().catch(error => {
|
|
13
|
+
console.error(`Demo seed failed: ${redactSecrets(error instanceof Error ? error.message : String(error))}`)
|
|
14
|
+
process.exitCode = 1
|
|
15
|
+
})
|
|
16
|
+
|
|
17
|
+
async function main() {
|
|
18
|
+
const apiUrl = requiredEnv('XPERT_API_URL')
|
|
19
|
+
const token = normalizeBearerToken(requiredEnv('XPERT_TOKEN'))
|
|
20
|
+
const organizationId = requiredEnv('XPERT_ORG_ID')
|
|
21
|
+
const xpertId = requiredEnv('XPERT_ID')
|
|
22
|
+
const timeoutMs = httpTimeoutMs()
|
|
23
|
+
const apiBase = normalizeApiBase(apiUrl)
|
|
24
|
+
const headers = {
|
|
25
|
+
authorization: `Bearer ${token}`,
|
|
26
|
+
'organization-id': organizationId,
|
|
27
|
+
'content-type': 'application/json'
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const manifestsPayload = await requestJson(
|
|
31
|
+
`${apiBase}/agent/${encodeURIComponent(xpertId)}/slots/${encodeURIComponent(MANIFEST_SLOT)}/views`,
|
|
32
|
+
{ headers },
|
|
33
|
+
timeoutMs
|
|
34
|
+
)
|
|
35
|
+
const manifests = manifestList(manifestsPayload)
|
|
36
|
+
const manifest = manifests.find(item => item?.source?.plugin === PACKAGE_NAME)
|
|
37
|
+
if (!manifest) throw new Error(`No active view manifest found for ${PACKAGE_NAME}`)
|
|
38
|
+
if (!Array.isArray(manifest.actions) || !manifest.actions.some(action => action?.key === ACTION_KEY)) {
|
|
39
|
+
throw new Error(`The active ${PACKAGE_NAME} manifest does not expose ${ACTION_KEY}`)
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const result = await requestJson(
|
|
43
|
+
`${apiBase}/agent/${encodeURIComponent(xpertId)}/views/${encodeURIComponent(String(manifest.key))}/actions/${ACTION_KEY}`,
|
|
44
|
+
{ method: 'POST', headers, body: JSON.stringify({ input: { confirmation: 'INIT_DEMO_DATA' } }) },
|
|
45
|
+
timeoutMs
|
|
46
|
+
)
|
|
47
|
+
const actionResult = unwrap(result)
|
|
48
|
+
if (actionResult?.success === false) throw new Error(actionResult?.error?.message || actionResult?.message?.zh_Hans || 'Seed action was rejected')
|
|
49
|
+
|
|
50
|
+
const data = actionResult?.data ?? actionResult
|
|
51
|
+
console.log(`Demo seed action completed for organization ${organizationId}, Xpert ${xpertId}.`)
|
|
52
|
+
console.log(JSON.stringify(data, null, 2))
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
async function requestJson(url, init, timeoutMs) {
|
|
56
|
+
const controller = new AbortController()
|
|
57
|
+
const timer = setTimeout(() => controller.abort(), timeoutMs)
|
|
58
|
+
timer.unref?.()
|
|
59
|
+
let response
|
|
60
|
+
let text
|
|
61
|
+
try {
|
|
62
|
+
response = await fetch(url, { ...init, signal: controller.signal })
|
|
63
|
+
text = await response.text()
|
|
64
|
+
} catch (error) {
|
|
65
|
+
if (controller.signal.aborted) throw new Error(`HTTP request timed out after ${timeoutMs} ms`)
|
|
66
|
+
throw error
|
|
67
|
+
} finally {
|
|
68
|
+
clearTimeout(timer)
|
|
69
|
+
}
|
|
70
|
+
let payload
|
|
71
|
+
try { payload = text ? JSON.parse(text) : null } catch { throw new Error(`HTTP ${response.status} returned a non-JSON response`) }
|
|
72
|
+
if (!response.ok) {
|
|
73
|
+
const body = unwrap(payload)
|
|
74
|
+
throw new Error(`HTTP ${response.status}: ${body?.message || body?.error || response.statusText}`)
|
|
75
|
+
}
|
|
76
|
+
return payload
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function manifestList(payload) {
|
|
80
|
+
const value = unwrap(payload)
|
|
81
|
+
if (Array.isArray(value)) return value
|
|
82
|
+
if (Array.isArray(value?.items)) return value.items
|
|
83
|
+
throw new Error('View manifest discovery returned an unexpected payload')
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
function unwrap(payload) {
|
|
87
|
+
if (payload && typeof payload === 'object' && 'data' in payload && ('success' in payload || 'status' in payload)) return payload.data
|
|
88
|
+
return payload
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
function normalizeBearerToken(value) {
|
|
92
|
+
const token = value.trim().replace(/^Bearer\s+/i, '')
|
|
93
|
+
if (!token) throw new Error('XPERT_TOKEN must contain a bearer token')
|
|
94
|
+
return token
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
function normalizeApiBase(value) {
|
|
98
|
+
const base = value.trim().replace(/\/+$/, '')
|
|
99
|
+
return base.endsWith('/api') ? base : `${base}/api`
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
function requiredEnv(name) {
|
|
103
|
+
const value = process.env[name]?.trim()
|
|
104
|
+
if (!value) throw new Error(`Missing required environment variable ${name}`)
|
|
105
|
+
return value
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
function httpTimeoutMs() {
|
|
109
|
+
const value = process.env.XPERT_HTTP_TIMEOUT_MS?.trim()
|
|
110
|
+
if (!value) return 15_000
|
|
111
|
+
const timeoutMs = Number(value)
|
|
112
|
+
if (!Number.isSafeInteger(timeoutMs) || timeoutMs < 1 || timeoutMs > 300_000) {
|
|
113
|
+
throw new Error('XPERT_HTTP_TIMEOUT_MS must be an integer between 1 and 300000')
|
|
114
|
+
}
|
|
115
|
+
return timeoutMs
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
function redactSecrets(message) {
|
|
119
|
+
const configured = process.env.XPERT_TOKEN?.trim() ?? ''
|
|
120
|
+
const secrets = [configured, configured.replace(/^Bearer\s+/i, '')].filter(Boolean).sort((left, right) => right.length - left.length)
|
|
121
|
+
return secrets.reduce((result, secret) => result.split(secret).join('[REDACTED]'), message)
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
function printHelp() {
|
|
125
|
+
console.log(`Seed deterministic demo data into an installed trade compliance workbench plugin.
|
|
126
|
+
|
|
127
|
+
Usage:
|
|
128
|
+
pnpm seed:demo
|
|
129
|
+
|
|
130
|
+
Required environment variables:
|
|
131
|
+
XPERT_API_URL Xpert backend base URL, with or without /api
|
|
132
|
+
XPERT_TOKEN Login bearer token, raw or prefixed with Bearer
|
|
133
|
+
XPERT_ORG_ID Target organization UUID
|
|
134
|
+
XPERT_ID Agent/Xpert UUID hosting the workbench view
|
|
135
|
+
|
|
136
|
+
The command discovers the active view by source.plugin, then invokes ${ACTION_KEY}
|
|
137
|
+
with the exact confirmation payload. It never reads tokens or organization IDs from a database.`)
|
|
138
|
+
}
|