mojulo 0.0.0 → 0.1.0

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 (121) hide show
  1. package/README.md +53 -4
  2. package/lib/audit-logger-new.js +11 -0
  3. package/lib/auth/gate.js +25 -0
  4. package/lib/auth/service.js +17 -0
  5. package/lib/auth/session.js +63 -0
  6. package/lib/builder/chat-processor.js +607 -0
  7. package/lib/builder/composer-bridge.js +82 -0
  8. package/lib/builder/evaluator.js +159 -0
  9. package/lib/builder/executor.js +252 -0
  10. package/lib/builder/index.js +48 -0
  11. package/lib/builder/session.js +248 -0
  12. package/lib/builder/system-prompt.js +422 -0
  13. package/lib/builder/tone-presets.js +75 -0
  14. package/lib/builder/tool-executors.js +1418 -0
  15. package/lib/builder/tools.js +338 -0
  16. package/lib/builder/validators.js +239 -0
  17. package/lib/composer/composer.js +225 -0
  18. package/lib/composer/index.js +40 -0
  19. package/lib/composer/protocols/00_base.txt +19 -0
  20. package/lib/composer/protocols/01_knowledge.txt +9 -0
  21. package/lib/composer/protocols/02_form-gathering.txt +32 -0
  22. package/lib/composer/protocols/03_appointments.txt +16 -0
  23. package/lib/composer/protocols/04_triage.txt +15 -0
  24. package/lib/composer/protocols/05_optical-read.txt +22 -0
  25. package/lib/composer/response-builder.js +98 -0
  26. package/lib/config-builder.js +650 -0
  27. package/lib/db/ids.js +10 -0
  28. package/lib/db/index.js +179 -0
  29. package/lib/db/repositories/apiKeys.js +72 -0
  30. package/lib/db/repositories/auditLogs.js +12 -0
  31. package/lib/db/repositories/botSpaces.js +12 -0
  32. package/lib/db/repositories/builderSessions.js +312 -0
  33. package/lib/db/repositories/deploymentEvents.js +12 -0
  34. package/lib/db/repositories/deployments.js +385 -0
  35. package/lib/db/repositories/documents.js +68 -0
  36. package/lib/db/repositories/mcpJobs.js +84 -0
  37. package/lib/deployers/bot-fleet.js +110 -0
  38. package/lib/deployers/bot-proxy.js +72 -0
  39. package/lib/deployers/build.js +89 -0
  40. package/lib/deployers/cloud-deploy.js +310 -0
  41. package/lib/deployers/docker.js +439 -0
  42. package/lib/deployers/fly.js +432 -0
  43. package/lib/deployers/index.js +38 -0
  44. package/lib/deployment-auth.js +36 -0
  45. package/lib/document-parser.js +171 -0
  46. package/lib/embedder/chunker.js +93 -0
  47. package/lib/embedder/local.js +101 -0
  48. package/lib/embedder/preview-rag.js +93 -0
  49. package/lib/envelope-schema.js +54 -0
  50. package/lib/fleet/scoped-sql.js +342 -0
  51. package/lib/form-schema-config/base.js +135 -0
  52. package/lib/form-schema-config/index.js +286 -0
  53. package/lib/form-schema-config/locales/af-ZA.js +153 -0
  54. package/lib/form-schema-config/locales/ar-AE.js +142 -0
  55. package/lib/form-schema-config/locales/ar-SA.js +164 -0
  56. package/lib/form-schema-config/locales/de-DE.js +152 -0
  57. package/lib/form-schema-config/locales/en-AU.js +161 -0
  58. package/lib/form-schema-config/locales/en-CA.js +115 -0
  59. package/lib/form-schema-config/locales/en-GB.js +132 -0
  60. package/lib/form-schema-config/locales/en-IN.js +219 -0
  61. package/lib/form-schema-config/locales/en-MY.js +171 -0
  62. package/lib/form-schema-config/locales/en-NG.js +198 -0
  63. package/lib/form-schema-config/locales/en-PH.js +186 -0
  64. package/lib/form-schema-config/locales/en-SG.js +153 -0
  65. package/lib/form-schema-config/locales/en-US.js +138 -0
  66. package/lib/form-schema-config/locales/es-ES.js +171 -0
  67. package/lib/form-schema-config/locales/es-MX.js +193 -0
  68. package/lib/form-schema-config/locales/fr-CA.js +138 -0
  69. package/lib/form-schema-config/locales/fr-FR.js +155 -0
  70. package/lib/form-schema-config/locales/hi-IN.js +219 -0
  71. package/lib/form-schema-config/locales/it-IT.js +157 -0
  72. package/lib/form-schema-config/locales/ja-JP.js +169 -0
  73. package/lib/form-schema-config/locales/ko-KR.js +140 -0
  74. package/lib/form-schema-config/locales/nl-NL.js +149 -0
  75. package/lib/form-schema-config/locales/pt-BR.js +168 -0
  76. package/lib/form-schema-config/locales/zh-CN.js +172 -0
  77. package/lib/form-schema-config/locales/zh-HK.js +142 -0
  78. package/lib/form-structure-schema.js +191 -0
  79. package/lib/llm-providers.js +828 -0
  80. package/lib/markdown.js +197 -0
  81. package/lib/mcp/catalysts/appointment-to-calendar.md +84 -0
  82. package/lib/mcp/catalysts/conversations-to-channel-digest.md +104 -0
  83. package/lib/mcp/catalysts/document-extract-to-store.md +92 -0
  84. package/lib/mcp/catalysts/knowledge-gap-miner.md +96 -0
  85. package/lib/mcp/catalysts/loader.js +144 -0
  86. package/lib/mcp/catalysts/qualify-lead-to-crm.md +83 -0
  87. package/lib/mcp/catalysts/scan-conversations-for-signal.md +92 -0
  88. package/lib/mcp/catalysts/submission-to-ticket.md +83 -0
  89. package/lib/mcp/catalysts/submissions-to-warehouse.md +103 -0
  90. package/lib/mcp/catalysts/weekly-submissions-digest.md +82 -0
  91. package/lib/mcp/jobs.js +64 -0
  92. package/lib/mcp/server.js +184 -0
  93. package/lib/mcp/session-binding.js +130 -0
  94. package/lib/mcp/tools/build.js +123 -0
  95. package/lib/mcp/tools/catalysts.js +477 -0
  96. package/lib/mcp/tools/context.js +325 -0
  97. package/lib/mcp/tools/fleet.js +391 -0
  98. package/lib/mcp/tools/jobs-tools.js +240 -0
  99. package/lib/mcp/tools/operate.js +314 -0
  100. package/lib/preview/build-preview-config.js +136 -0
  101. package/lib/rate-limiter.js +11 -0
  102. package/lib/resolve-api-key.js +142 -0
  103. package/lib/storage/index.js +40 -0
  104. package/messages/de.json +2136 -0
  105. package/messages/en.json +2136 -0
  106. package/messages/es.json +2136 -0
  107. package/messages/fr.json +2136 -0
  108. package/messages/it.json +2136 -0
  109. package/messages/ja.json +2136 -0
  110. package/messages/ko.json +2136 -0
  111. package/messages/nl.json +2136 -0
  112. package/messages/pl.json +2136 -0
  113. package/messages/pt.json +2136 -0
  114. package/messages/ru.json +2136 -0
  115. package/messages/uk.json +2136 -0
  116. package/messages/zh.json +2136 -0
  117. package/package.json +61 -5
  118. package/scripts/mcp-config.mjs +162 -0
  119. package/scripts/mcp-stdio-loader.mjs +42 -0
  120. package/scripts/mcp-stdio.mjs +108 -0
  121. package/scripts/mojulo-paths.mjs +48 -0
@@ -0,0 +1,149 @@
1
+ /**
2
+ * Dutch (nl-NL) Locale Configuration
3
+ */
4
+
5
+ export const LOCALE_INFO = {
6
+ code: 'nl-NL',
7
+ name: 'Netherlands',
8
+ region: 'EU',
9
+ currency: 'EUR',
10
+ dateFormat: 'DD-MM-YYYY'
11
+ };
12
+
13
+ export const PATTERNS = {
14
+ phone: {
15
+ pattern: '^(\\+31|0)[1-9]\\d{8}$',
16
+ error: 'Voer een geldig telefoonnummer in',
17
+ description: 'Dutch phone number'
18
+ },
19
+ postalCode: {
20
+ pattern: '^[1-9]\\d{3}\\s?[A-Z]{2}$',
21
+ error: 'Voer een geldige postcode in (bijv. 1234 AB)',
22
+ description: 'Dutch postal code'
23
+ },
24
+ bsn: {
25
+ pattern: '^\\d{9}$',
26
+ error: 'Voer een geldig BSN in (9 cijfers)',
27
+ description: 'Burgerservicenummer (BSN)'
28
+ },
29
+ iban: {
30
+ pattern: '^NL\\d{2}[A-Z]{4}\\d{10}$',
31
+ error: 'Voer een geldige Nederlandse IBAN in',
32
+ description: 'Dutch IBAN'
33
+ },
34
+ bic: {
35
+ pattern: '^[A-Z]{4}NL[A-Z0-9]{2}([A-Z0-9]{3})?$',
36
+ error: 'Voer een geldige BIC in',
37
+ description: 'BIC/SWIFT code'
38
+ },
39
+ vatNumber: {
40
+ pattern: '^NL\\d{9}B\\d{2}$',
41
+ error: 'Voer een geldig BTW-nummer in',
42
+ description: 'Dutch VAT number (BTW-nummer)'
43
+ },
44
+ kvkNumber: {
45
+ pattern: '^\\d{8}$',
46
+ error: 'Voer een geldig KvK-nummer in (8 cijfers)',
47
+ description: 'Chamber of Commerce number (KvK)'
48
+ },
49
+ idCard: {
50
+ pattern: '^[A-Z]{2}[A-Z0-9]{6}\\d$',
51
+ error: 'Voer een geldig identiteitskaartnummer in',
52
+ description: 'Dutch ID card number'
53
+ },
54
+ currency: {
55
+ pattern: '^€?\\s?\\d{1,3}(\\.\\d{3})*(,\\d{2})?$',
56
+ error: 'Voer een geldig bedrag in',
57
+ description: 'Euro amount (Dutch format)'
58
+ }
59
+ };
60
+
61
+ export const ARCHETYPES = {
62
+ phone: {
63
+ type: 'tel',
64
+ autocomplete: 'tel',
65
+ inputMode: 'tel',
66
+ placeholder: '06 12345678',
67
+ pattern: PATTERNS.phone.pattern,
68
+ patternError: PATTERNS.phone.error,
69
+ pii: true
70
+ },
71
+ postalCode: {
72
+ type: 'text',
73
+ autocomplete: 'postal-code',
74
+ inputMode: 'text',
75
+ placeholder: '1234 AB',
76
+ pattern: PATTERNS.postalCode.pattern,
77
+ patternError: PATTERNS.postalCode.error,
78
+ maxLength: 7
79
+ },
80
+ nationalId: {
81
+ type: 'text',
82
+ inputMode: 'numeric',
83
+ placeholder: '123456789',
84
+ pattern: PATTERNS.bsn.pattern,
85
+ patternError: PATTERNS.bsn.error,
86
+ pii: true,
87
+ sensitive: true,
88
+ helpText: 'Uw BSN wordt veilig bewaard'
89
+ },
90
+ iban: {
91
+ type: 'text',
92
+ inputMode: 'text',
93
+ placeholder: 'NL91ABNA0417164300',
94
+ pattern: PATTERNS.iban.pattern,
95
+ patternError: PATTERNS.iban.error,
96
+ pii: true
97
+ },
98
+ provincie: {
99
+ type: 'dropdown',
100
+ autocomplete: 'address-level1',
101
+ options: [
102
+ { value: 'DR', label: 'Drenthe' },
103
+ { value: 'FL', label: 'Flevoland' },
104
+ { value: 'FR', label: 'Friesland' },
105
+ { value: 'GE', label: 'Gelderland' },
106
+ { value: 'GR', label: 'Groningen' },
107
+ { value: 'LI', label: 'Limburg' },
108
+ { value: 'NB', label: 'Noord-Brabant' },
109
+ { value: 'NH', label: 'Noord-Holland' },
110
+ { value: 'OV', label: 'Overijssel' },
111
+ { value: 'UT', label: 'Utrecht' },
112
+ { value: 'ZE', label: 'Zeeland' },
113
+ { value: 'ZH', label: 'Zuid-Holland' }
114
+ ]
115
+ },
116
+ currency: {
117
+ type: 'text',
118
+ inputMode: 'decimal',
119
+ placeholder: '€ 0,00',
120
+ pattern: PATTERNS.currency.pattern,
121
+ patternError: PATTERNS.currency.error
122
+ }
123
+ };
124
+
125
+ /**
126
+ * Dutch-specific field name mappings
127
+ */
128
+ export const FIELD_LABELS = {
129
+ postalCode: 'Postcode',
130
+ state: 'Provincie',
131
+ nationalId: 'Burgerservicenummer (BSN)',
132
+ phone: 'Telefoonnummer',
133
+ firstName: 'Voornaam',
134
+ lastName: 'Achternaam',
135
+ streetAddress: 'Straat en huisnummer',
136
+ city: 'Plaats',
137
+ email: 'E-mailadres',
138
+ dateOfBirth: 'Geboortedatum'
139
+ };
140
+
141
+ /**
142
+ * GDPR compliance hints (strict for Netherlands/EU)
143
+ */
144
+ export const GDPR_HINTS = {
145
+ consentRequired: true,
146
+ dataRetentionNotice: true,
147
+ rightToErasure: true,
148
+ explicitConsentLanguage: 'Ik ga akkoord met de verwerking van mijn persoonsgegevens conform het privacybeleid.'
149
+ };
@@ -0,0 +1,168 @@
1
+ /**
2
+ * Brazilian Portuguese (pt-BR) Locale Configuration
3
+ */
4
+
5
+ export const LOCALE_INFO = {
6
+ code: 'pt-BR',
7
+ name: 'Brazil',
8
+ region: 'South America',
9
+ currency: 'BRL',
10
+ dateFormat: 'DD/MM/YYYY'
11
+ };
12
+
13
+ export const PATTERNS = {
14
+ phone: {
15
+ pattern: '^(\\+55\\s?)?(\\(?\\d{2}\\)?\\s?)?\\d{4,5}-?\\d{4}$',
16
+ error: 'Digite um telefone válido',
17
+ description: 'Brazilian phone number'
18
+ },
19
+ mobile: {
20
+ pattern: '^(\\+55\\s?)?(\\(?\\d{2}\\)?\\s?)?9\\d{4}-?\\d{4}$',
21
+ error: 'Digite um celular válido',
22
+ description: 'Brazilian mobile number'
23
+ },
24
+ postalCode: {
25
+ pattern: '^\\d{5}-?\\d{3}$',
26
+ error: 'Digite um CEP válido (ex: 01310-100)',
27
+ description: 'Brazilian postal code (CEP)'
28
+ },
29
+ cpf: {
30
+ pattern: '^\\d{3}\\.?\\d{3}\\.?\\d{3}-?\\d{2}$',
31
+ error: 'Digite um CPF válido',
32
+ description: 'Individual taxpayer ID (CPF)'
33
+ },
34
+ cnpj: {
35
+ pattern: '^\\d{2}\\.?\\d{3}\\.?\\d{3}\\/?\\d{4}-?\\d{2}$',
36
+ error: 'Digite um CNPJ válido',
37
+ description: 'Business taxpayer ID (CNPJ)'
38
+ },
39
+ rg: {
40
+ pattern: '^[\\d\\w\\.\\-]+$',
41
+ error: 'Digite um RG válido',
42
+ description: 'Identity card (RG)'
43
+ },
44
+ bankAccount: {
45
+ pattern: '^\\d{5,12}-?[\\dxX]$',
46
+ error: 'Digite uma conta válida',
47
+ description: 'Brazilian bank account'
48
+ },
49
+ bankAgency: {
50
+ pattern: '^\\d{4}-?\\d?$',
51
+ error: 'Digite uma agência válida',
52
+ description: 'Bank agency number'
53
+ },
54
+ currency: {
55
+ pattern: '^R\\$\\s?[\\d\\.]+,\\d{2}$',
56
+ error: 'Digite um valor válido',
57
+ description: 'Brazilian Real amount'
58
+ }
59
+ };
60
+
61
+ export const ARCHETYPES = {
62
+ phone: {
63
+ type: 'tel',
64
+ autocomplete: 'tel',
65
+ inputMode: 'tel',
66
+ placeholder: '(11) 91234-5678',
67
+ pattern: PATTERNS.mobile.pattern,
68
+ patternError: PATTERNS.mobile.error,
69
+ pii: true
70
+ },
71
+ postalCode: {
72
+ type: 'text',
73
+ autocomplete: 'postal-code',
74
+ inputMode: 'numeric',
75
+ placeholder: '01310-100',
76
+ pattern: PATTERNS.postalCode.pattern,
77
+ patternError: PATTERNS.postalCode.error,
78
+ maxLength: 9
79
+ },
80
+ nationalId: {
81
+ type: 'text',
82
+ inputMode: 'numeric',
83
+ placeholder: '123.456.789-00',
84
+ pattern: PATTERNS.cpf.pattern,
85
+ patternError: PATTERNS.cpf.error,
86
+ pii: true,
87
+ sensitive: true,
88
+ helpText: 'Seu CPF será armazenado com segurança'
89
+ },
90
+ cnpj: {
91
+ type: 'text',
92
+ inputMode: 'numeric',
93
+ placeholder: '12.345.678/0001-90',
94
+ pattern: PATTERNS.cnpj.pattern,
95
+ patternError: PATTERNS.cnpj.error,
96
+ pii: true
97
+ },
98
+ state: {
99
+ type: 'dropdown',
100
+ autocomplete: 'address-level1',
101
+ options: [
102
+ { value: 'AC', label: 'Acre' },
103
+ { value: 'AL', label: 'Alagoas' },
104
+ { value: 'AP', label: 'Amapá' },
105
+ { value: 'AM', label: 'Amazonas' },
106
+ { value: 'BA', label: 'Bahia' },
107
+ { value: 'CE', label: 'Ceará' },
108
+ { value: 'DF', label: 'Distrito Federal' },
109
+ { value: 'ES', label: 'Espírito Santo' },
110
+ { value: 'GO', label: 'Goiás' },
111
+ { value: 'MA', label: 'Maranhão' },
112
+ { value: 'MT', label: 'Mato Grosso' },
113
+ { value: 'MS', label: 'Mato Grosso do Sul' },
114
+ { value: 'MG', label: 'Minas Gerais' },
115
+ { value: 'PA', label: 'Pará' },
116
+ { value: 'PB', label: 'Paraíba' },
117
+ { value: 'PR', label: 'Paraná' },
118
+ { value: 'PE', label: 'Pernambuco' },
119
+ { value: 'PI', label: 'Piauí' },
120
+ { value: 'RJ', label: 'Rio de Janeiro' },
121
+ { value: 'RN', label: 'Rio Grande do Norte' },
122
+ { value: 'RS', label: 'Rio Grande do Sul' },
123
+ { value: 'RO', label: 'Rondônia' },
124
+ { value: 'RR', label: 'Roraima' },
125
+ { value: 'SC', label: 'Santa Catarina' },
126
+ { value: 'SP', label: 'São Paulo' },
127
+ { value: 'SE', label: 'Sergipe' },
128
+ { value: 'TO', label: 'Tocantins' }
129
+ ]
130
+ },
131
+ currency: {
132
+ type: 'text',
133
+ inputMode: 'decimal',
134
+ placeholder: 'R$ 100,00',
135
+ pattern: PATTERNS.currency.pattern,
136
+ patternError: PATTERNS.currency.error
137
+ }
138
+ };
139
+
140
+ /**
141
+ * Brazilian Portuguese field name mappings
142
+ */
143
+ export const FIELD_LABELS = {
144
+ postalCode: 'CEP',
145
+ state: 'Estado',
146
+ nationalId: 'CPF',
147
+ phone: 'Telefone',
148
+ mobile: 'Celular',
149
+ firstName: 'Nome',
150
+ lastName: 'Sobrenome',
151
+ fullName: 'Nome completo',
152
+ streetAddress: 'Endereço',
153
+ city: 'Cidade',
154
+ neighborhood: 'Bairro',
155
+ email: 'E-mail',
156
+ dateOfBirth: 'Data de nascimento',
157
+ company: 'Empresa'
158
+ };
159
+
160
+ /**
161
+ * LGPD (Lei Geral de Proteção de Dados) compliance hints
162
+ */
163
+ export const GDPR_HINTS = {
164
+ consentRequired: true,
165
+ dataRetentionNotice: true,
166
+ rightToErasure: true,
167
+ explicitConsentLanguage: 'Concordo com o tratamento dos meus dados pessoais conforme a Política de Privacidade.'
168
+ };
@@ -0,0 +1,172 @@
1
+ /**
2
+ * Simplified Chinese - China (zh-CN) Locale Configuration
3
+ */
4
+
5
+ export const LOCALE_INFO = {
6
+ code: 'zh-CN',
7
+ name: 'China',
8
+ region: 'Asia',
9
+ currency: 'CNY',
10
+ dateFormat: 'YYYY-MM-DD'
11
+ };
12
+
13
+ export const PATTERNS = {
14
+ phone: {
15
+ pattern: '^(\\+86)?1[3-9]\\d{9}$',
16
+ error: '请输入有效的手机号码',
17
+ description: 'Chinese mobile number'
18
+ },
19
+ landline: {
20
+ pattern: '^(\\+86)?(0\\d{2,3})-?\\d{7,8}$',
21
+ error: '请输入有效的固定电话',
22
+ description: 'Chinese landline number'
23
+ },
24
+ postalCode: {
25
+ pattern: '^\\d{6}$',
26
+ error: '请输入有效的邮政编码(6位数字)',
27
+ description: 'Chinese postal code'
28
+ },
29
+ idCard: {
30
+ pattern: '^[1-9]\\d{5}(18|19|20)\\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\\d|3[01])\\d{3}[\\dXx]$',
31
+ error: '请输入有效的身份证号码',
32
+ description: 'Resident Identity Card (18 digits)'
33
+ },
34
+ usci: {
35
+ pattern: '^[0-9A-HJ-NPQRTUWXY]{2}\\d{6}[0-9A-HJ-NPQRTUWXY]{10}$',
36
+ error: '请输入有效的统一社会信用代码',
37
+ description: 'Unified Social Credit Identifier'
38
+ },
39
+ bankCard: {
40
+ pattern: '^\\d{16,19}$',
41
+ error: '请输入有效的银行卡号',
42
+ description: 'Chinese bank card number'
43
+ },
44
+ passport: {
45
+ pattern: '^[EeGg]\\d{8}$',
46
+ error: '请输入有效的护照号码',
47
+ description: 'Chinese passport number'
48
+ },
49
+ currency: {
50
+ pattern: '^¥?[\\d,]+(\\.\\d{2})?$',
51
+ error: '请输入有效的金额',
52
+ description: 'Chinese Yuan amount'
53
+ }
54
+ };
55
+
56
+ export const ARCHETYPES = {
57
+ phone: {
58
+ type: 'tel',
59
+ autocomplete: 'tel',
60
+ inputMode: 'tel',
61
+ placeholder: '13812345678',
62
+ pattern: PATTERNS.phone.pattern,
63
+ patternError: PATTERNS.phone.error,
64
+ pii: true
65
+ },
66
+ postalCode: {
67
+ type: 'text',
68
+ autocomplete: 'postal-code',
69
+ inputMode: 'numeric',
70
+ placeholder: '100000',
71
+ pattern: PATTERNS.postalCode.pattern,
72
+ patternError: PATTERNS.postalCode.error,
73
+ maxLength: 6
74
+ },
75
+ nationalId: {
76
+ type: 'text',
77
+ inputMode: 'text',
78
+ placeholder: '110101199001011234',
79
+ pattern: PATTERNS.idCard.pattern,
80
+ patternError: PATTERNS.idCard.error,
81
+ pii: true,
82
+ sensitive: true,
83
+ helpText: '您的身份证号码将被安全存储',
84
+ maxLength: 18
85
+ },
86
+ usci: {
87
+ type: 'text',
88
+ inputMode: 'text',
89
+ placeholder: '91110000MA001ABCX0',
90
+ pattern: PATTERNS.usci.pattern,
91
+ patternError: PATTERNS.usci.error,
92
+ pii: true,
93
+ maxLength: 18
94
+ },
95
+ province: {
96
+ type: 'dropdown',
97
+ autocomplete: 'address-level1',
98
+ options: [
99
+ { value: 'beijing', label: '北京市' },
100
+ { value: 'tianjin', label: '天津市' },
101
+ { value: 'hebei', label: '河北省' },
102
+ { value: 'shanxi', label: '山西省' },
103
+ { value: 'neimenggu', label: '内蒙古自治区' },
104
+ { value: 'liaoning', label: '辽宁省' },
105
+ { value: 'jilin', label: '吉林省' },
106
+ { value: 'heilongjiang', label: '黑龙江省' },
107
+ { value: 'shanghai', label: '上海市' },
108
+ { value: 'jiangsu', label: '江苏省' },
109
+ { value: 'zhejiang', label: '浙江省' },
110
+ { value: 'anhui', label: '安徽省' },
111
+ { value: 'fujian', label: '福建省' },
112
+ { value: 'jiangxi', label: '江西省' },
113
+ { value: 'shandong', label: '山东省' },
114
+ { value: 'henan', label: '河南省' },
115
+ { value: 'hubei', label: '湖北省' },
116
+ { value: 'hunan', label: '湖南省' },
117
+ { value: 'guangdong', label: '广东省' },
118
+ { value: 'guangxi', label: '广西壮族自治区' },
119
+ { value: 'hainan', label: '海南省' },
120
+ { value: 'chongqing', label: '重庆市' },
121
+ { value: 'sichuan', label: '四川省' },
122
+ { value: 'guizhou', label: '贵州省' },
123
+ { value: 'yunnan', label: '云南省' },
124
+ { value: 'xizang', label: '西藏自治区' },
125
+ { value: 'shaanxi', label: '陕西省' },
126
+ { value: 'gansu', label: '甘肃省' },
127
+ { value: 'qinghai', label: '青海省' },
128
+ { value: 'ningxia', label: '宁夏回族自治区' },
129
+ { value: 'xinjiang', label: '新疆维吾尔自治区' },
130
+ { value: 'hongkong', label: '香港特别行政区' },
131
+ { value: 'macau', label: '澳门特别行政区' },
132
+ { value: 'taiwan', label: '台湾省' }
133
+ ]
134
+ },
135
+ currency: {
136
+ type: 'text',
137
+ inputMode: 'decimal',
138
+ placeholder: '¥100.00',
139
+ pattern: PATTERNS.currency.pattern,
140
+ patternError: PATTERNS.currency.error
141
+ }
142
+ };
143
+
144
+ /**
145
+ * Simplified Chinese field name mappings
146
+ */
147
+ export const FIELD_LABELS = {
148
+ postalCode: '邮政编码',
149
+ state: '省/自治区/直辖市',
150
+ nationalId: '身份证号码',
151
+ phone: '电话号码',
152
+ mobile: '手机号码',
153
+ firstName: '名',
154
+ lastName: '姓',
155
+ fullName: '姓名',
156
+ streetAddress: '详细地址',
157
+ city: '市/区',
158
+ district: '区/县',
159
+ email: '电子邮箱',
160
+ dateOfBirth: '出生日期',
161
+ company: '公司名称'
162
+ };
163
+
164
+ /**
165
+ * PIPL (Personal Information Protection Law) compliance hints
166
+ */
167
+ export const GDPR_HINTS = {
168
+ consentRequired: true,
169
+ dataRetentionNotice: true,
170
+ rightToErasure: true,
171
+ explicitConsentLanguage: '我同意按照隐私政策处理我的个人信息。'
172
+ };
@@ -0,0 +1,142 @@
1
+ /**
2
+ * Traditional Chinese - Hong Kong (zh-HK) Locale Configuration
3
+ */
4
+
5
+ export const LOCALE_INFO = {
6
+ code: 'zh-HK',
7
+ name: 'Hong Kong',
8
+ region: 'Asia',
9
+ currency: 'HKD',
10
+ dateFormat: 'DD/MM/YYYY'
11
+ };
12
+
13
+ export const PATTERNS = {
14
+ phone: {
15
+ pattern: '^(\\+852[\\s-]?)?[2-9]\\d{7}$',
16
+ error: '請輸入有效的電話號碼',
17
+ description: 'Hong Kong phone number'
18
+ },
19
+ mobile: {
20
+ pattern: '^(\\+852[\\s-]?)?[5-9]\\d{7}$',
21
+ error: '請輸入有效的手機號碼',
22
+ description: 'Hong Kong mobile number'
23
+ },
24
+ hkid: {
25
+ pattern: '^[A-Z]{1,2}\\d{6}\\(?[0-9A]\\)?$',
26
+ error: '請輸入有效的香港身份證號碼',
27
+ description: 'Hong Kong Identity Card'
28
+ },
29
+ brn: {
30
+ pattern: '^\\d{8}$',
31
+ error: '請輸入有效的商業登記號碼',
32
+ description: 'Business Registration Number'
33
+ },
34
+ bankAccount: {
35
+ pattern: '^\\d{3}-?\\d{6}-?\\d{3}$',
36
+ error: '請輸入有效的銀行帳戶號碼',
37
+ description: 'Hong Kong bank account'
38
+ },
39
+ fps: {
40
+ pattern: '^\\d{7,9}$',
41
+ error: '請輸入有效的轉數快識別碼',
42
+ description: 'Faster Payment System ID'
43
+ },
44
+ currency: {
45
+ pattern: '^(HK\\$|\\$)?[\\d,]+(\\.\\d{2})?$',
46
+ error: '請輸入有效的金額',
47
+ description: 'Hong Kong Dollar amount'
48
+ }
49
+ };
50
+
51
+ export const ARCHETYPES = {
52
+ phone: {
53
+ type: 'tel',
54
+ autocomplete: 'tel',
55
+ inputMode: 'tel',
56
+ placeholder: '9123 4567',
57
+ pattern: PATTERNS.mobile.pattern,
58
+ patternError: PATTERNS.mobile.error,
59
+ pii: true
60
+ },
61
+ postalCode: {
62
+ type: 'text',
63
+ autocomplete: 'postal-code',
64
+ inputMode: 'text',
65
+ placeholder: 'N/A',
66
+ helpText: '香港不使用郵政編碼'
67
+ },
68
+ nationalId: {
69
+ type: 'text',
70
+ inputMode: 'text',
71
+ placeholder: 'A123456(7)',
72
+ pattern: PATTERNS.hkid.pattern,
73
+ patternError: PATTERNS.hkid.error,
74
+ pii: true,
75
+ sensitive: true,
76
+ helpText: '您的身份證號碼將被安全儲存'
77
+ },
78
+ district: {
79
+ type: 'dropdown',
80
+ autocomplete: 'address-level1',
81
+ options: [
82
+ { value: 'central-western', label: '中西區' },
83
+ { value: 'eastern', label: '東區' },
84
+ { value: 'southern', label: '南區' },
85
+ { value: 'wan-chai', label: '灣仔區' },
86
+ { value: 'kowloon-city', label: '九龍城區' },
87
+ { value: 'kwun-tong', label: '觀塘區' },
88
+ { value: 'sham-shui-po', label: '深水埗區' },
89
+ { value: 'wong-tai-sin', label: '黃大仙區' },
90
+ { value: 'yau-tsim-mong', label: '油尖旺區' },
91
+ { value: 'islands', label: '離島區' },
92
+ { value: 'kwai-tsing', label: '葵青區' },
93
+ { value: 'north', label: '北區' },
94
+ { value: 'sai-kung', label: '西貢區' },
95
+ { value: 'sha-tin', label: '沙田區' },
96
+ { value: 'tai-po', label: '大埔區' },
97
+ { value: 'tsuen-wan', label: '荃灣區' },
98
+ { value: 'tuen-mun', label: '屯門區' },
99
+ { value: 'yuen-long', label: '元朗區' }
100
+ ]
101
+ },
102
+ currency: {
103
+ type: 'text',
104
+ inputMode: 'decimal',
105
+ placeholder: 'HK$1,000.00',
106
+ pattern: PATTERNS.currency.pattern,
107
+ patternError: PATTERNS.currency.error
108
+ }
109
+ };
110
+
111
+ /**
112
+ * Traditional Chinese (HK) field name mappings
113
+ */
114
+ export const FIELD_LABELS = {
115
+ postalCode: '郵政編碼',
116
+ state: '地區',
117
+ district: '區域',
118
+ nationalId: '香港身份證號碼',
119
+ phone: '電話號碼',
120
+ mobile: '手機號碼',
121
+ firstName: '名',
122
+ lastName: '姓',
123
+ fullName: '姓名',
124
+ streetAddress: '地址',
125
+ city: '城市',
126
+ building: '大廈/屋苑',
127
+ floor: '樓層',
128
+ flat: '單位',
129
+ email: '電郵地址',
130
+ dateOfBirth: '出生日期',
131
+ company: '公司名稱'
132
+ };
133
+
134
+ /**
135
+ * PDPO (Personal Data Privacy Ordinance) compliance hints
136
+ */
137
+ export const GDPR_HINTS = {
138
+ consentRequired: true,
139
+ dataRetentionNotice: true,
140
+ rightToErasure: true,
141
+ explicitConsentLanguage: '本人同意按照私隱政策處理本人的個人資料。'
142
+ };