mojulo 0.0.0 → 0.1.1

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 +54 -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 +1527 -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 +68 -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,219 @@
1
+ /**
2
+ * Hindi - India (hi-IN) Locale Configuration
3
+ */
4
+
5
+ export const LOCALE_INFO = {
6
+ code: 'hi-IN',
7
+ name: 'भारत',
8
+ region: 'Asia',
9
+ currency: 'INR',
10
+ dateFormat: 'DD/MM/YYYY'
11
+ };
12
+
13
+ export const PATTERNS = {
14
+ phone: {
15
+ pattern: '^(\\+91[\\s-]?)?[6-9]\\d{9}$',
16
+ error: 'कृपया एक वैध भारतीय मोबाइल नंबर दर्ज करें',
17
+ description: 'भारतीय मोबाइल नंबर'
18
+ },
19
+ landline: {
20
+ pattern: '^(\\+91[\\s-]?)?(0\\d{2,4})[\\s-]?\\d{6,8}$',
21
+ error: 'कृपया एक वैध लैंडलाइन नंबर दर्ज करें',
22
+ description: 'भारतीय लैंडलाइन नंबर'
23
+ },
24
+ postalCode: {
25
+ pattern: '^[1-9]\\d{5}$',
26
+ error: 'कृपया एक वैध पिन कोड दर्ज करें (6 अंक)',
27
+ description: 'भारतीय पिन कोड'
28
+ },
29
+ aadhaar: {
30
+ pattern: '^\\d{4}[\\s-]?\\d{4}[\\s-]?\\d{4}$',
31
+ error: 'कृपया एक वैध आधार नंबर दर्ज करें (12 अंक)',
32
+ description: 'आधार विशिष्ट पहचान संख्या'
33
+ },
34
+ pan: {
35
+ pattern: '^[A-Z]{5}\\d{4}[A-Z]$',
36
+ error: 'कृपया एक वैध पैन दर्ज करें (उदा., ABCDE1234F)',
37
+ description: 'स्थायी खाता संख्या'
38
+ },
39
+ gstin: {
40
+ pattern: '^\\d{2}[A-Z]{5}\\d{4}[A-Z][A-Z\\d][Z][A-Z\\d]$',
41
+ error: 'कृपया एक वैध जीएसटीआईएन दर्ज करें',
42
+ description: 'जीएसटी पहचान संख्या'
43
+ },
44
+ voterId: {
45
+ pattern: '^[A-Z]{3}\\d{7}$',
46
+ error: 'कृपया एक वैध मतदाता पहचान पत्र दर्ज करें',
47
+ description: 'मतदाता फोटो पहचान पत्र'
48
+ },
49
+ passport: {
50
+ pattern: '^[A-Z]\\d{7}$',
51
+ error: 'कृपया एक वैध पासपोर्ट नंबर दर्ज करें',
52
+ description: 'भारतीय पासपोर्ट नंबर'
53
+ },
54
+ ifsc: {
55
+ pattern: '^[A-Z]{4}0[A-Z0-9]{6}$',
56
+ error: 'कृपया एक वैध आईएफएससी कोड दर्ज करें',
57
+ description: 'भारतीय वित्तीय प्रणाली कोड'
58
+ },
59
+ bankAccount: {
60
+ pattern: '^\\d{9,18}$',
61
+ error: 'कृपया एक वैध खाता संख्या दर्ज करें',
62
+ description: 'भारतीय बैंक खाता संख्या'
63
+ },
64
+ upi: {
65
+ pattern: '^[\\w\\.\\-]+@[\\w]+$',
66
+ error: 'कृपया एक वैध यूपीआई आईडी दर्ज करें',
67
+ description: 'यूपीआई वर्चुअल भुगतान पता'
68
+ },
69
+ currency: {
70
+ pattern: '^(Rs\\.?|₹)?\\s?[\\d,]+(\\.\\d{2})?$',
71
+ error: 'कृपया एक वैध राशि दर्ज करें',
72
+ description: 'भारतीय रुपये में राशि'
73
+ }
74
+ };
75
+
76
+ export const ARCHETYPES = {
77
+ phone: {
78
+ type: 'tel',
79
+ autocomplete: 'tel',
80
+ inputMode: 'tel',
81
+ placeholder: '98765 43210',
82
+ pattern: PATTERNS.phone.pattern,
83
+ patternError: PATTERNS.phone.error,
84
+ pii: true
85
+ },
86
+ postalCode: {
87
+ type: 'text',
88
+ autocomplete: 'postal-code',
89
+ inputMode: 'numeric',
90
+ placeholder: '110001',
91
+ pattern: PATTERNS.postalCode.pattern,
92
+ patternError: PATTERNS.postalCode.error,
93
+ maxLength: 6
94
+ },
95
+ nationalId: {
96
+ type: 'text',
97
+ inputMode: 'numeric',
98
+ placeholder: '1234 5678 9012',
99
+ pattern: PATTERNS.aadhaar.pattern,
100
+ patternError: PATTERNS.aadhaar.error,
101
+ pii: true,
102
+ sensitive: true,
103
+ helpText: 'आपका आधार नंबर सुरक्षित रूप से संग्रहीत किया जाएगा'
104
+ },
105
+ pan: {
106
+ type: 'text',
107
+ inputMode: 'text',
108
+ placeholder: 'ABCDE1234F',
109
+ pattern: PATTERNS.pan.pattern,
110
+ patternError: PATTERNS.pan.error,
111
+ pii: true,
112
+ maxLength: 10
113
+ },
114
+ gstin: {
115
+ type: 'text',
116
+ inputMode: 'text',
117
+ placeholder: '22AAAAA0000A1Z5',
118
+ pattern: PATTERNS.gstin.pattern,
119
+ patternError: PATTERNS.gstin.error,
120
+ pii: true,
121
+ maxLength: 15
122
+ },
123
+ ifsc: {
124
+ type: 'text',
125
+ inputMode: 'text',
126
+ placeholder: 'SBIN0001234',
127
+ pattern: PATTERNS.ifsc.pattern,
128
+ patternError: PATTERNS.ifsc.error,
129
+ maxLength: 11
130
+ },
131
+ upi: {
132
+ type: 'text',
133
+ inputMode: 'text',
134
+ placeholder: 'name@upi',
135
+ pattern: PATTERNS.upi.pattern,
136
+ patternError: PATTERNS.upi.error,
137
+ pii: true
138
+ },
139
+ state: {
140
+ type: 'dropdown',
141
+ autocomplete: 'address-level1',
142
+ options: [
143
+ { value: 'AN', label: 'अंडमान और निकोबार द्वीपसमूह' },
144
+ { value: 'AP', label: 'आंध्र प्रदेश' },
145
+ { value: 'AR', label: 'अरुणाचल प्रदेश' },
146
+ { value: 'AS', label: 'असम' },
147
+ { value: 'BR', label: 'बिहार' },
148
+ { value: 'CH', label: 'चंडीगढ़' },
149
+ { value: 'CT', label: 'छत्तीसगढ़' },
150
+ { value: 'DN', label: 'दादरा और नगर हवेली और दमन और दीव' },
151
+ { value: 'DL', label: 'दिल्ली' },
152
+ { value: 'GA', label: 'गोवा' },
153
+ { value: 'GJ', label: 'गुजरात' },
154
+ { value: 'HR', label: 'हरियाणा' },
155
+ { value: 'HP', label: 'हिमाचल प्रदेश' },
156
+ { value: 'JK', label: 'जम्मू और कश्मीर' },
157
+ { value: 'JH', label: 'झारखंड' },
158
+ { value: 'KA', label: 'कर्नाटक' },
159
+ { value: 'KL', label: 'केरल' },
160
+ { value: 'LA', label: 'लद्दाख' },
161
+ { value: 'LD', label: 'लक्षद्वीप' },
162
+ { value: 'MP', label: 'मध्य प्रदेश' },
163
+ { value: 'MH', label: 'महाराष्ट्र' },
164
+ { value: 'MN', label: 'मणिपुर' },
165
+ { value: 'ML', label: 'मेघालय' },
166
+ { value: 'MZ', label: 'मिज़ोरम' },
167
+ { value: 'NL', label: 'नागालैंड' },
168
+ { value: 'OR', label: 'ओडिशा' },
169
+ { value: 'PY', label: 'पुदुचेरी' },
170
+ { value: 'PB', label: 'पंजाब' },
171
+ { value: 'RJ', label: 'राजस्थान' },
172
+ { value: 'SK', label: 'सिक्किम' },
173
+ { value: 'TN', label: 'तमिलनाडु' },
174
+ { value: 'TG', label: 'तेलंगाना' },
175
+ { value: 'TR', label: 'त्रिपुरा' },
176
+ { value: 'UP', label: 'उत्तर प्रदेश' },
177
+ { value: 'UK', label: 'उत्तराखंड' },
178
+ { value: 'WB', label: 'पश्चिम बंगाल' }
179
+ ]
180
+ },
181
+ currency: {
182
+ type: 'text',
183
+ inputMode: 'decimal',
184
+ placeholder: '₹1,00,000',
185
+ pattern: PATTERNS.currency.pattern,
186
+ patternError: PATTERNS.currency.error
187
+ }
188
+ };
189
+
190
+ /**
191
+ * Hindi field name mappings
192
+ */
193
+ export const FIELD_LABELS = {
194
+ postalCode: 'पिन कोड',
195
+ state: 'राज्य/केंद्र शासित प्रदेश',
196
+ nationalId: 'आधार संख्या',
197
+ phone: 'फ़ोन नंबर',
198
+ mobile: 'मोबाइल नंबर',
199
+ firstName: 'पहला नाम',
200
+ lastName: 'अंतिम नाम',
201
+ fullName: 'पूरा नाम',
202
+ streetAddress: 'पता',
203
+ city: 'शहर/कस्बा',
204
+ district: 'जिला',
205
+ email: 'ईमेल पता',
206
+ dateOfBirth: 'जन्म तिथि',
207
+ company: 'कंपनी का नाम',
208
+ fatherName: 'पिता का नाम'
209
+ };
210
+
211
+ /**
212
+ * DPDP Act (Digital Personal Data Protection) compliance hints
213
+ */
214
+ export const GDPR_HINTS = {
215
+ consentRequired: true,
216
+ dataRetentionNotice: true,
217
+ rightToErasure: true,
218
+ explicitConsentLanguage: 'मैं गोपनीयता नीति के अनुसार अपने व्यक्तिगत डेटा के प्रसंस्करण के लिए सहमति देता/देती हूं।'
219
+ };
@@ -0,0 +1,157 @@
1
+ /**
2
+ * Italian (it-IT) Locale Configuration
3
+ */
4
+
5
+ export const LOCALE_INFO = {
6
+ code: 'it-IT',
7
+ name: 'Italy',
8
+ region: 'EU',
9
+ currency: 'EUR',
10
+ dateFormat: 'DD/MM/YYYY'
11
+ };
12
+
13
+ export const PATTERNS = {
14
+ phone: {
15
+ pattern: '^(\\+39)?\\s?[0-9]{2,4}[\\s-]?[0-9]{4,8}$',
16
+ error: 'Inserisci un numero di telefono valido',
17
+ description: 'Italian phone number'
18
+ },
19
+ postalCode: {
20
+ pattern: '^\\d{5}$',
21
+ error: 'Inserisci un CAP valido (5 cifre)',
22
+ description: 'Italian postal code (CAP)'
23
+ },
24
+ codiceFiscale: {
25
+ pattern: '^[A-Z]{6}\\d{2}[A-Z]\\d{2}[A-Z]\\d{3}[A-Z]$',
26
+ error: 'Inserisci un codice fiscale valido',
27
+ description: 'Italian tax code (Codice Fiscale)'
28
+ },
29
+ partitaIva: {
30
+ pattern: '^IT\\d{11}$',
31
+ error: 'Inserisci una partita IVA valida (IT + 11 cifre)',
32
+ description: 'Italian VAT number (Partita IVA)'
33
+ },
34
+ iban: {
35
+ pattern: '^IT\\d{2}[A-Z]\\d{10}[A-Z0-9]{12}$',
36
+ error: 'Inserisci un IBAN italiano valido',
37
+ description: 'Italian IBAN'
38
+ },
39
+ bic: {
40
+ pattern: '^[A-Z]{4}IT[A-Z0-9]{2}([A-Z0-9]{3})?$',
41
+ error: 'Inserisci un codice BIC valido',
42
+ description: 'BIC/SWIFT code'
43
+ },
44
+ cartaIdentita: {
45
+ pattern: '^[A-Z]{2}\\d{7}$',
46
+ error: 'Inserisci un numero di carta d\'identità valido',
47
+ description: 'Italian ID card number'
48
+ },
49
+ tessaraSanitaria: {
50
+ pattern: '^[A-Z]{6}\\d{2}[A-Z]\\d{2}[A-Z]\\d{3}[A-Z]$',
51
+ error: 'Inserisci un numero di tessera sanitaria valido',
52
+ description: 'Italian health card number'
53
+ },
54
+ currency: {
55
+ pattern: '^\\d{1,3}(\\.\\d{3})*(,\\d{2})?\\s?€?$',
56
+ error: 'Inserisci un importo valido',
57
+ description: 'Euro amount (Italian format)'
58
+ }
59
+ };
60
+
61
+ export const ARCHETYPES = {
62
+ phone: {
63
+ type: 'tel',
64
+ autocomplete: 'tel',
65
+ inputMode: 'tel',
66
+ placeholder: '333 1234567',
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: 'numeric',
75
+ placeholder: '00100',
76
+ pattern: PATTERNS.postalCode.pattern,
77
+ patternError: PATTERNS.postalCode.error,
78
+ maxLength: 5
79
+ },
80
+ nationalId: {
81
+ type: 'text',
82
+ inputMode: 'text',
83
+ placeholder: 'RSSMRA85M01H501Z',
84
+ pattern: PATTERNS.codiceFiscale.pattern,
85
+ patternError: PATTERNS.codiceFiscale.error,
86
+ pii: true,
87
+ sensitive: true,
88
+ helpText: 'Il tuo codice fiscale sarà conservato in modo sicuro'
89
+ },
90
+ iban: {
91
+ type: 'text',
92
+ inputMode: 'text',
93
+ placeholder: 'IT60X0542811101000000123456',
94
+ pattern: PATTERNS.iban.pattern,
95
+ patternError: PATTERNS.iban.error,
96
+ pii: true
97
+ },
98
+ regione: {
99
+ type: 'dropdown',
100
+ autocomplete: 'address-level1',
101
+ options: [
102
+ { value: 'ABR', label: 'Abruzzo' },
103
+ { value: 'BAS', label: 'Basilicata' },
104
+ { value: 'CAL', label: 'Calabria' },
105
+ { value: 'CAM', label: 'Campania' },
106
+ { value: 'EMR', label: 'Emilia-Romagna' },
107
+ { value: 'FVG', label: 'Friuli Venezia Giulia' },
108
+ { value: 'LAZ', label: 'Lazio' },
109
+ { value: 'LIG', label: 'Liguria' },
110
+ { value: 'LOM', label: 'Lombardia' },
111
+ { value: 'MAR', label: 'Marche' },
112
+ { value: 'MOL', label: 'Molise' },
113
+ { value: 'PMN', label: 'Piemonte' },
114
+ { value: 'PUG', label: 'Puglia' },
115
+ { value: 'SAR', label: 'Sardegna' },
116
+ { value: 'SIC', label: 'Sicilia' },
117
+ { value: 'TOS', label: 'Toscana' },
118
+ { value: 'TAA', label: 'Trentino-Alto Adige' },
119
+ { value: 'UMB', label: 'Umbria' },
120
+ { value: 'VDA', label: 'Valle d\'Aosta' },
121
+ { value: 'VEN', label: 'Veneto' }
122
+ ]
123
+ },
124
+ currency: {
125
+ type: 'text',
126
+ inputMode: 'decimal',
127
+ placeholder: '0,00 €',
128
+ pattern: PATTERNS.currency.pattern,
129
+ patternError: PATTERNS.currency.error
130
+ }
131
+ };
132
+
133
+ /**
134
+ * Italian-specific field name mappings
135
+ */
136
+ export const FIELD_LABELS = {
137
+ postalCode: 'CAP',
138
+ state: 'Regione',
139
+ nationalId: 'Codice Fiscale',
140
+ phone: 'Telefono',
141
+ firstName: 'Nome',
142
+ lastName: 'Cognome',
143
+ streetAddress: 'Indirizzo',
144
+ city: 'Città',
145
+ email: 'Indirizzo email',
146
+ dateOfBirth: 'Data di nascita'
147
+ };
148
+
149
+ /**
150
+ * GDPR compliance hints (strict for Italy/EU)
151
+ */
152
+ export const GDPR_HINTS = {
153
+ consentRequired: true,
154
+ dataRetentionNotice: true,
155
+ rightToErasure: true,
156
+ explicitConsentLanguage: 'Acconsento al trattamento dei miei dati personali in conformità con l\'informativa sulla privacy.'
157
+ };
@@ -0,0 +1,169 @@
1
+ /**
2
+ * Japanese (ja-JP) Locale Configuration
3
+ */
4
+
5
+ export const LOCALE_INFO = {
6
+ code: 'ja-JP',
7
+ name: 'Japan',
8
+ region: 'Asia',
9
+ currency: 'JPY',
10
+ dateFormat: 'YYYY/MM/DD'
11
+ };
12
+
13
+ export const PATTERNS = {
14
+ phone: {
15
+ pattern: '^(0\\d{1,4}-?\\d{1,4}-?\\d{4}|\\+81\\d{1,4}-?\\d{1,4}-?\\d{4})$',
16
+ error: '有効な電話番号を入力してください',
17
+ description: 'Japanese phone number'
18
+ },
19
+ postalCode: {
20
+ pattern: '^\\d{3}-?\\d{4}$',
21
+ error: '有効な郵便番号を入力してください(例: 123-4567)',
22
+ description: 'Japanese postal code (〒)'
23
+ },
24
+ myNumber: {
25
+ pattern: '^\\d{12}$',
26
+ error: '有効なマイナンバーを入力してください(12桁)',
27
+ description: 'Individual Number (My Number)'
28
+ },
29
+ corporateNumber: {
30
+ pattern: '^\\d{13}$',
31
+ error: '有効な法人番号を入力してください(13桁)',
32
+ description: 'Corporate Number'
33
+ },
34
+ bankAccount: {
35
+ pattern: '^\\d{7}$',
36
+ error: '有効な口座番号を入力してください(7桁)',
37
+ description: 'Japanese bank account number'
38
+ },
39
+ branchCode: {
40
+ pattern: '^\\d{3}$',
41
+ error: '有効な支店番号を入力してください(3桁)',
42
+ description: 'Bank branch code'
43
+ },
44
+ currency: {
45
+ pattern: '^¥?[\\d,]+$',
46
+ error: '有効な金額を入力してください',
47
+ description: 'Japanese Yen amount'
48
+ }
49
+ };
50
+
51
+ export const ARCHETYPES = {
52
+ phone: {
53
+ type: 'tel',
54
+ autocomplete: 'tel',
55
+ inputMode: 'tel',
56
+ placeholder: '03-1234-5678',
57
+ pattern: PATTERNS.phone.pattern,
58
+ patternError: PATTERNS.phone.error,
59
+ pii: true
60
+ },
61
+ postalCode: {
62
+ type: 'text',
63
+ autocomplete: 'postal-code',
64
+ inputMode: 'numeric',
65
+ placeholder: '123-4567',
66
+ pattern: PATTERNS.postalCode.pattern,
67
+ patternError: PATTERNS.postalCode.error,
68
+ maxLength: 8
69
+ },
70
+ nationalId: {
71
+ type: 'text',
72
+ inputMode: 'numeric',
73
+ placeholder: '123456789012',
74
+ pattern: PATTERNS.myNumber.pattern,
75
+ patternError: PATTERNS.myNumber.error,
76
+ pii: true,
77
+ sensitive: true,
78
+ helpText: 'マイナンバーは安全に保管されます'
79
+ },
80
+ prefecture: {
81
+ type: 'dropdown',
82
+ autocomplete: 'address-level1',
83
+ options: [
84
+ { value: 'hokkaido', label: '北海道' },
85
+ { value: 'aomori', label: '青森県' },
86
+ { value: 'iwate', label: '岩手県' },
87
+ { value: 'miyagi', label: '宮城県' },
88
+ { value: 'akita', label: '秋田県' },
89
+ { value: 'yamagata', label: '山形県' },
90
+ { value: 'fukushima', label: '福島県' },
91
+ { value: 'ibaraki', label: '茨城県' },
92
+ { value: 'tochigi', label: '栃木県' },
93
+ { value: 'gunma', label: '群馬県' },
94
+ { value: 'saitama', label: '埼玉県' },
95
+ { value: 'chiba', label: '千葉県' },
96
+ { value: 'tokyo', label: '東京都' },
97
+ { value: 'kanagawa', label: '神奈川県' },
98
+ { value: 'niigata', label: '新潟県' },
99
+ { value: 'toyama', label: '富山県' },
100
+ { value: 'ishikawa', label: '石川県' },
101
+ { value: 'fukui', label: '福井県' },
102
+ { value: 'yamanashi', label: '山梨県' },
103
+ { value: 'nagano', label: '長野県' },
104
+ { value: 'gifu', label: '岐阜県' },
105
+ { value: 'shizuoka', label: '静岡県' },
106
+ { value: 'aichi', label: '愛知県' },
107
+ { value: 'mie', label: '三重県' },
108
+ { value: 'shiga', label: '滋賀県' },
109
+ { value: 'kyoto', label: '京都府' },
110
+ { value: 'osaka', label: '大阪府' },
111
+ { value: 'hyogo', label: '兵庫県' },
112
+ { value: 'nara', label: '奈良県' },
113
+ { value: 'wakayama', label: '和歌山県' },
114
+ { value: 'tottori', label: '鳥取県' },
115
+ { value: 'shimane', label: '島根県' },
116
+ { value: 'okayama', label: '岡山県' },
117
+ { value: 'hiroshima', label: '広島県' },
118
+ { value: 'yamaguchi', label: '山口県' },
119
+ { value: 'tokushima', label: '徳島県' },
120
+ { value: 'kagawa', label: '香川県' },
121
+ { value: 'ehime', label: '愛媛県' },
122
+ { value: 'kochi', label: '高知県' },
123
+ { value: 'fukuoka', label: '福岡県' },
124
+ { value: 'saga', label: '佐賀県' },
125
+ { value: 'nagasaki', label: '長崎県' },
126
+ { value: 'kumamoto', label: '熊本県' },
127
+ { value: 'oita', label: '大分県' },
128
+ { value: 'miyazaki', label: '宮崎県' },
129
+ { value: 'kagoshima', label: '鹿児島県' },
130
+ { value: 'okinawa', label: '沖縄県' }
131
+ ]
132
+ },
133
+ currency: {
134
+ type: 'text',
135
+ inputMode: 'numeric',
136
+ placeholder: '¥10,000',
137
+ pattern: PATTERNS.currency.pattern,
138
+ patternError: PATTERNS.currency.error
139
+ }
140
+ };
141
+
142
+ /**
143
+ * Japanese-specific field name mappings
144
+ */
145
+ export const FIELD_LABELS = {
146
+ postalCode: '郵便番号',
147
+ state: '都道府県',
148
+ nationalId: 'マイナンバー',
149
+ phone: '電話番号',
150
+ firstName: '名',
151
+ lastName: '姓',
152
+ fullName: '氏名',
153
+ streetAddress: '住所',
154
+ city: '市区町村',
155
+ email: 'メールアドレス',
156
+ dateOfBirth: '生年月日',
157
+ company: '会社名',
158
+ department: '部署'
159
+ };
160
+
161
+ /**
162
+ * APPI (Act on Protection of Personal Information) compliance hints
163
+ */
164
+ export const GDPR_HINTS = {
165
+ consentRequired: true,
166
+ dataRetentionNotice: true,
167
+ rightToErasure: true,
168
+ explicitConsentLanguage: '個人情報の取り扱いについて同意します。'
169
+ };
@@ -0,0 +1,140 @@
1
+ /**
2
+ * Korean (ko-KR) Locale Configuration
3
+ */
4
+
5
+ export const LOCALE_INFO = {
6
+ code: 'ko-KR',
7
+ name: 'South Korea',
8
+ region: 'Asia',
9
+ currency: 'KRW',
10
+ dateFormat: 'YYYY.MM.DD'
11
+ };
12
+
13
+ export const PATTERNS = {
14
+ phone: {
15
+ pattern: '^(0\\d{1,2}-?\\d{3,4}-?\\d{4}|\\+82-?\\d{1,2}-?\\d{3,4}-?\\d{4})$',
16
+ error: '전화번호를 확인해 주세요',
17
+ description: 'Korean phone number'
18
+ },
19
+ mobile: {
20
+ pattern: '^(010-?\\d{4}-?\\d{4}|\\+82-?10-?\\d{4}-?\\d{4})$',
21
+ error: '휴대폰 번호를 확인해 주세요',
22
+ description: 'Korean mobile number'
23
+ },
24
+ postalCode: {
25
+ pattern: '^\\d{5}$',
26
+ error: '우편번호 5자리를 확인해 주세요',
27
+ description: 'Korean postal code'
28
+ },
29
+ residentRegistration: {
30
+ pattern: '^\\d{6}-?\\d{7}$',
31
+ error: '주민등록번호를 확인해 주세요',
32
+ description: 'Resident Registration Number'
33
+ },
34
+ businessRegistration: {
35
+ pattern: '^\\d{3}-?\\d{2}-?\\d{5}$',
36
+ error: '사업자등록번호를 확인해 주세요',
37
+ description: 'Business Registration Number'
38
+ },
39
+ bankAccount: {
40
+ pattern: '^\\d{10,14}$',
41
+ error: '계좌번호를 확인해 주세요',
42
+ description: 'Korean bank account number'
43
+ },
44
+ currency: {
45
+ pattern: '^₩?[\\d,]+원?$',
46
+ error: '금액을 확인해 주세요',
47
+ description: 'Korean Won amount'
48
+ }
49
+ };
50
+
51
+ export const ARCHETYPES = {
52
+ phone: {
53
+ type: 'tel',
54
+ autocomplete: 'tel',
55
+ inputMode: 'tel',
56
+ placeholder: '010-1234-5678',
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: 'numeric',
65
+ placeholder: '12345',
66
+ pattern: PATTERNS.postalCode.pattern,
67
+ patternError: PATTERNS.postalCode.error,
68
+ maxLength: 5
69
+ },
70
+ nationalId: {
71
+ type: 'text',
72
+ inputMode: 'numeric',
73
+ placeholder: '123456-1234567',
74
+ pattern: PATTERNS.residentRegistration.pattern,
75
+ patternError: PATTERNS.residentRegistration.error,
76
+ pii: true,
77
+ sensitive: true,
78
+ helpText: '주민등록번호는 암호화되어 안전하게 보관됩니다'
79
+ },
80
+ province: {
81
+ type: 'dropdown',
82
+ autocomplete: 'address-level1',
83
+ options: [
84
+ { value: 'seoul', label: '서울특별시' },
85
+ { value: 'busan', label: '부산광역시' },
86
+ { value: 'daegu', label: '대구광역시' },
87
+ { value: 'incheon', label: '인천광역시' },
88
+ { value: 'gwangju', label: '광주광역시' },
89
+ { value: 'daejeon', label: '대전광역시' },
90
+ { value: 'ulsan', label: '울산광역시' },
91
+ { value: 'sejong', label: '세종특별자치시' },
92
+ { value: 'gyeonggi', label: '경기도' },
93
+ { value: 'gangwon', label: '강원도' },
94
+ { value: 'chungbuk', label: '충청북도' },
95
+ { value: 'chungnam', label: '충청남도' },
96
+ { value: 'jeonbuk', label: '전라북도' },
97
+ { value: 'jeonnam', label: '전라남도' },
98
+ { value: 'gyeongbuk', label: '경상북도' },
99
+ { value: 'gyeongnam', label: '경상남도' },
100
+ { value: 'jeju', label: '제주특별자치도' }
101
+ ]
102
+ },
103
+ currency: {
104
+ type: 'text',
105
+ inputMode: 'numeric',
106
+ placeholder: '₩10,000',
107
+ pattern: PATTERNS.currency.pattern,
108
+ patternError: PATTERNS.currency.error
109
+ }
110
+ };
111
+
112
+ /**
113
+ * Korean-specific field name mappings
114
+ */
115
+ export const FIELD_LABELS = {
116
+ postalCode: '우편번호',
117
+ state: '시·도',
118
+ nationalId: '주민등록번호',
119
+ phone: '전화번호',
120
+ mobile: '휴대폰 번호',
121
+ firstName: '이름', // Given name (이름) - comes second in Korean name order
122
+ lastName: '성', // Family name (성) - comes first in Korean name order
123
+ fullName: '성명',
124
+ streetAddress: '도로명주소',
125
+ city: '시·군·구',
126
+ email: '이메일',
127
+ dateOfBirth: '생년월일',
128
+ company: '회사명',
129
+ department: '부서'
130
+ };
131
+
132
+ /**
133
+ * PIPA (Personal Information Protection Act / 개인정보보호법) compliance hints
134
+ */
135
+ export const GDPR_HINTS = {
136
+ consentRequired: true,
137
+ dataRetentionNotice: true,
138
+ rightToErasure: true,
139
+ explicitConsentLanguage: '개인정보 수집 및 이용에 동의합니다.'
140
+ };