@chenchaolong/plugin-trade-compliance-workbench 1.0.1 → 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.
Files changed (194) hide show
  1. package/README.md +46 -1
  2. package/dist/assets/branding/yuneec-logo.png +0 -0
  3. package/dist/assets/templates/CI.xlsx +0 -0
  4. package/dist/assets/templates/CUSTOMS_DECLARATION.xlsx +0 -0
  5. package/dist/assets/templates/PI.xlsx +0 -0
  6. package/dist/assets/templates/PL.xlsx +0 -0
  7. package/dist/index.d.ts +14 -0
  8. package/dist/index.d.ts.map +1 -1
  9. package/dist/lib/adapters/file-storage.d.ts +4 -2
  10. package/dist/lib/adapters/file-storage.d.ts.map +1 -1
  11. package/dist/lib/adapters/file-storage.js +25 -10
  12. package/dist/lib/adapters/file-storage.js.map +1 -1
  13. package/dist/lib/adapters/hsbianma.provider.d.ts +1 -0
  14. package/dist/lib/adapters/hsbianma.provider.d.ts.map +1 -1
  15. package/dist/lib/adapters/hsbianma.provider.js +32 -3
  16. package/dist/lib/adapters/hsbianma.provider.js.map +1 -1
  17. package/dist/lib/adapters/translation.provider.d.ts +3 -0
  18. package/dist/lib/adapters/translation.provider.d.ts.map +1 -1
  19. package/dist/lib/adapters/translation.provider.js +15 -6
  20. package/dist/lib/adapters/translation.provider.js.map +1 -1
  21. package/dist/lib/constants.d.ts +1 -0
  22. package/dist/lib/constants.d.ts.map +1 -1
  23. package/dist/lib/constants.js +1 -0
  24. package/dist/lib/constants.js.map +1 -1
  25. package/dist/lib/demo-data.definitions.d.ts +28 -0
  26. package/dist/lib/demo-data.definitions.d.ts.map +1 -0
  27. package/dist/lib/demo-data.definitions.js +236 -0
  28. package/dist/lib/demo-data.definitions.js.map +1 -0
  29. package/dist/lib/demo-data.entity.d.ts +9 -0
  30. package/dist/lib/demo-data.entity.d.ts.map +1 -0
  31. package/dist/lib/demo-data.entity.js +24 -0
  32. package/dist/lib/demo-data.entity.js.map +1 -0
  33. package/dist/lib/demo-data.ids.d.ts +4 -0
  34. package/dist/lib/demo-data.ids.d.ts.map +1 -0
  35. package/dist/lib/demo-data.ids.js +19 -0
  36. package/dist/lib/demo-data.ids.js.map +1 -0
  37. package/dist/lib/demo-data.service.d.ts +26 -0
  38. package/dist/lib/demo-data.service.d.ts.map +1 -0
  39. package/dist/lib/demo-data.service.js +124 -0
  40. package/dist/lib/demo-data.service.js.map +1 -0
  41. package/dist/lib/domain/default-settings.d.ts +1 -0
  42. package/dist/lib/domain/default-settings.d.ts.map +1 -1
  43. package/dist/lib/domain/default-settings.js +1 -0
  44. package/dist/lib/domain/default-settings.js.map +1 -1
  45. package/dist/lib/domain/risk-notice.d.ts +59 -0
  46. package/dist/lib/domain/risk-notice.d.ts.map +1 -0
  47. package/dist/lib/domain/risk-notice.js +30 -0
  48. package/dist/lib/domain/risk-notice.js.map +1 -0
  49. package/dist/lib/entities/catalog.entity.d.ts.map +1 -1
  50. package/dist/lib/entities/catalog.entity.js +4 -2
  51. package/dist/lib/entities/catalog.entity.js.map +1 -1
  52. package/dist/lib/entities/customer.entity.d.ts +9 -2
  53. package/dist/lib/entities/customer.entity.d.ts.map +1 -1
  54. package/dist/lib/entities/customer.entity.js +29 -1
  55. package/dist/lib/entities/customer.entity.js.map +1 -1
  56. package/dist/lib/entities/index.d.ts +2 -2
  57. package/dist/lib/entities/index.d.ts.map +1 -1
  58. package/dist/lib/entities/index.js +2 -2
  59. package/dist/lib/entities/index.js.map +1 -1
  60. package/dist/lib/entities/procurement.entity.d.ts +6 -4
  61. package/dist/lib/entities/procurement.entity.d.ts.map +1 -1
  62. package/dist/lib/entities/procurement.entity.js +9 -1
  63. package/dist/lib/entities/procurement.entity.js.map +1 -1
  64. package/dist/lib/entities/settings.entity.d.ts +12 -2
  65. package/dist/lib/entities/settings.entity.d.ts.map +1 -1
  66. package/dist/lib/entities/settings.entity.js +40 -0
  67. package/dist/lib/entities/settings.entity.js.map +1 -1
  68. package/dist/lib/entities/shared.entity.d.ts +10 -5
  69. package/dist/lib/entities/shared.entity.d.ts.map +1 -1
  70. package/dist/lib/entities/shared.entity.js +22 -1
  71. package/dist/lib/entities/shared.entity.js.map +1 -1
  72. package/dist/lib/remote-components/trade-compliance-workbench/app.css +1 -0
  73. package/dist/lib/remote-components/trade-compliance-workbench/app.js +63 -277
  74. package/dist/lib/remote-ui/analytics-contracts.d.ts +106 -0
  75. package/dist/lib/remote-ui/analytics-contracts.d.ts.map +1 -0
  76. package/dist/lib/remote-ui/analytics-contracts.js +4 -0
  77. package/dist/lib/remote-ui/analytics-contracts.js.map +1 -0
  78. package/dist/lib/remote-ui/app-source.d.ts +2 -0
  79. package/dist/lib/remote-ui/app-source.d.ts.map +1 -0
  80. package/dist/lib/remote-ui/app-source.js +753 -0
  81. package/dist/lib/remote-ui/app-source.js.map +1 -0
  82. package/dist/lib/remote-ui/bridge.d.ts +36 -0
  83. package/dist/lib/remote-ui/bridge.d.ts.map +1 -0
  84. package/dist/lib/remote-ui/bridge.js +159 -0
  85. package/dist/lib/remote-ui/bridge.js.map +1 -0
  86. package/dist/lib/remote-ui/components/data-grid.d.ts +34 -0
  87. package/dist/lib/remote-ui/components/data-grid.d.ts.map +1 -0
  88. package/dist/lib/remote-ui/components/data-grid.js +59 -0
  89. package/dist/lib/remote-ui/components/data-grid.js.map +1 -0
  90. package/dist/lib/remote-ui/components/forms.d.ts +63 -0
  91. package/dist/lib/remote-ui/components/forms.d.ts.map +1 -0
  92. package/dist/lib/remote-ui/components/forms.js +117 -0
  93. package/dist/lib/remote-ui/components/forms.js.map +1 -0
  94. package/dist/lib/remote-ui/components/layout.d.ts +34 -0
  95. package/dist/lib/remote-ui/components/layout.d.ts.map +1 -0
  96. package/dist/lib/remote-ui/components/layout.js +89 -0
  97. package/dist/lib/remote-ui/components/layout.js.map +1 -0
  98. package/dist/lib/remote-ui/contract-import.d.ts +82 -0
  99. package/dist/lib/remote-ui/contract-import.d.ts.map +1 -0
  100. package/dist/lib/remote-ui/contract-import.js +102 -0
  101. package/dist/lib/remote-ui/contract-import.js.map +1 -0
  102. package/dist/lib/remote-ui/contracts.d.ts +257 -0
  103. package/dist/lib/remote-ui/contracts.d.ts.map +1 -0
  104. package/dist/lib/remote-ui/contracts.js +12 -0
  105. package/dist/lib/remote-ui/contracts.js.map +1 -0
  106. package/dist/lib/remote-ui/customer-contract-contracts.d.ts +227 -0
  107. package/dist/lib/remote-ui/customer-contract-contracts.d.ts.map +1 -0
  108. package/dist/lib/remote-ui/customer-contract-contracts.js +10 -0
  109. package/dist/lib/remote-ui/customer-contract-contracts.js.map +1 -0
  110. package/dist/lib/remote-ui/model.d.ts +31 -0
  111. package/dist/lib/remote-ui/model.d.ts.map +1 -0
  112. package/dist/lib/remote-ui/model.js +248 -0
  113. package/dist/lib/remote-ui/model.js.map +1 -0
  114. package/dist/lib/remote-ui/pages/analytics.d.ts +12 -0
  115. package/dist/lib/remote-ui/pages/analytics.d.ts.map +1 -0
  116. package/dist/lib/remote-ui/pages/analytics.js +123 -0
  117. package/dist/lib/remote-ui/pages/analytics.js.map +1 -0
  118. package/dist/lib/remote-ui/pages/catalogs.d.ts +225 -0
  119. package/dist/lib/remote-ui/pages/catalogs.d.ts.map +1 -0
  120. package/dist/lib/remote-ui/pages/catalogs.js +572 -0
  121. package/dist/lib/remote-ui/pages/catalogs.js.map +1 -0
  122. package/dist/lib/remote-ui/pages/contracts.d.ts +80 -0
  123. package/dist/lib/remote-ui/pages/contracts.d.ts.map +1 -0
  124. package/dist/lib/remote-ui/pages/contracts.js +396 -0
  125. package/dist/lib/remote-ui/pages/contracts.js.map +1 -0
  126. package/dist/lib/remote-ui/pages/files.d.ts +31 -0
  127. package/dist/lib/remote-ui/pages/files.d.ts.map +1 -0
  128. package/dist/lib/remote-ui/pages/files.js +64 -0
  129. package/dist/lib/remote-ui/pages/files.js.map +1 -0
  130. package/dist/lib/remote-ui/pages/home.d.ts +71 -0
  131. package/dist/lib/remote-ui/pages/home.d.ts.map +1 -0
  132. package/dist/lib/remote-ui/pages/home.js +136 -0
  133. package/dist/lib/remote-ui/pages/home.js.map +1 -0
  134. package/dist/lib/remote-ui/pages/procurement.d.ts +36 -0
  135. package/dist/lib/remote-ui/pages/procurement.d.ts.map +1 -0
  136. package/dist/lib/remote-ui/pages/procurement.js +370 -0
  137. package/dist/lib/remote-ui/pages/procurement.js.map +1 -0
  138. package/dist/lib/remote-ui/pages/sales.d.ts +12 -0
  139. package/dist/lib/remote-ui/pages/sales.d.ts.map +1 -0
  140. package/dist/lib/remote-ui/pages/sales.js +106 -0
  141. package/dist/lib/remote-ui/pages/sales.js.map +1 -0
  142. package/dist/lib/remote-ui/pages/settings.d.ts +34 -0
  143. package/dist/lib/remote-ui/pages/settings.d.ts.map +1 -0
  144. package/dist/lib/remote-ui/pages/settings.js +259 -0
  145. package/dist/lib/remote-ui/pages/settings.js.map +1 -0
  146. package/dist/lib/remote-ui/procurement-contracts.d.ts +177 -0
  147. package/dist/lib/remote-ui/procurement-contracts.d.ts.map +1 -0
  148. package/dist/lib/remote-ui/procurement-contracts.js +2 -0
  149. package/dist/lib/remote-ui/procurement-contracts.js.map +1 -0
  150. package/dist/lib/remote-ui/sales-contracts.d.ts +133 -0
  151. package/dist/lib/remote-ui/sales-contracts.d.ts.map +1 -0
  152. package/dist/lib/remote-ui/sales-contracts.js +2 -0
  153. package/dist/lib/remote-ui/sales-contracts.js.map +1 -0
  154. package/dist/lib/remote-ui/settings-contracts.d.ts +114 -0
  155. package/dist/lib/remote-ui/settings-contracts.d.ts.map +1 -0
  156. package/dist/lib/remote-ui/settings-contracts.js +6 -0
  157. package/dist/lib/remote-ui/settings-contracts.js.map +1 -0
  158. package/dist/lib/remote-ui/upload-policy.d.ts +18 -0
  159. package/dist/lib/remote-ui/upload-policy.d.ts.map +1 -0
  160. package/dist/lib/remote-ui/upload-policy.js +56 -0
  161. package/dist/lib/remote-ui/upload-policy.js.map +1 -0
  162. package/dist/lib/runtime-validation.d.ts +61 -0
  163. package/dist/lib/runtime-validation.d.ts.map +1 -0
  164. package/dist/lib/runtime-validation.js +243 -0
  165. package/dist/lib/runtime-validation.js.map +1 -0
  166. package/dist/lib/sales-file.service.d.ts +54 -6
  167. package/dist/lib/sales-file.service.d.ts.map +1 -1
  168. package/dist/lib/sales-file.service.js +278 -33
  169. package/dist/lib/sales-file.service.js.map +1 -1
  170. package/dist/lib/trade-compliance.config.d.ts +32 -0
  171. package/dist/lib/trade-compliance.config.d.ts.map +1 -1
  172. package/dist/lib/trade-compliance.config.js +16 -4
  173. package/dist/lib/trade-compliance.config.js.map +1 -1
  174. package/dist/lib/types.d.ts +253 -1
  175. package/dist/lib/types.d.ts.map +1 -1
  176. package/dist/lib/types.js +24 -0
  177. package/dist/lib/types.js.map +1 -1
  178. package/dist/lib/workbench-view.provider.d.ts +675 -38
  179. package/dist/lib/workbench-view.provider.d.ts.map +1 -1
  180. package/dist/lib/workbench-view.provider.js +411 -40
  181. package/dist/lib/workbench-view.provider.js.map +1 -1
  182. package/dist/lib/workbench.middleware.d.ts +70 -19
  183. package/dist/lib/workbench.middleware.d.ts.map +1 -1
  184. package/dist/lib/workbench.middleware.js +5 -1
  185. package/dist/lib/workbench.middleware.js.map +1 -1
  186. package/dist/lib/workbench.plugin.d.ts.map +1 -1
  187. package/dist/lib/workbench.plugin.js +6 -4
  188. package/dist/lib/workbench.plugin.js.map +1 -1
  189. package/dist/lib/workbench.service.d.ts +629 -48
  190. package/dist/lib/workbench.service.d.ts.map +1 -1
  191. package/dist/lib/workbench.service.js +1818 -300
  192. package/dist/lib/workbench.service.js.map +1 -1
  193. package/package.json +15 -4
  194. 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.1",
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
+ }