diff --git a/.env.example b/.env.example index ff8056f..a049791 100644 --- a/.env.example +++ b/.env.example @@ -18,4 +18,8 @@ CORS_TRUSTED_CDN_HOSTS="cdn.example.com" # --- OpenAI configuration --- OPENAI_API_KEY="your-openai-api-key-here" OPENAI_MODEL="gpt-3.5-turbo" -OPENAI_BASE_URL="https://api.openai.com/v1" \ No newline at end of file +OPENAI_BASE_URL="https://api.openai.com/v1" + +# --- hCaptcha configuration --- +HCAPTCHA_SECRET_KEY=your-hcaptcha-secret-key-here +HCAPTCHA_SITE_KEY=your-hcaptcha-site-key-here \ No newline at end of file diff --git a/.env.schema b/.env.schema index 476fbc7..142f2b3 100644 --- a/.env.schema +++ b/.env.schema @@ -18,4 +18,8 @@ CORS_TRUSTED_CDN_HOSTS= # --- OpenAI configuration --- OPENAI_API_KEY= OPENAI_MODEL= -OPENAI_BASE_URL= \ No newline at end of file +OPENAI_BASE_URL= + +# --- hCaptcha configuration --- +HCAPTCHA_SECRET_KEY= +HCAPTCHA_SITE_KEY= \ No newline at end of file diff --git a/apps/api/.env.example b/apps/api/.env.example index dfbfb27..f88a073 100644 --- a/apps/api/.env.example +++ b/apps/api/.env.example @@ -12,4 +12,8 @@ CORS_TRUSTED_CDN_HOSTS="cdn.example.com" # --- OpenAI configuration --- OPENAI_API_KEY="your-openai-api-key-here" OPENAI_MODEL="gpt-3.5-turbo" -OPENAI_BASE_URL="https://api.openai.com/v1" \ No newline at end of file +OPENAI_BASE_URL="https://api.openai.com/v1" + +# --- hCaptcha configuration --- +HCAPTCHA_SECRET_KEY=your-hcaptcha-secret-key-here +HCAPTCHA_SITE_KEY=your-hcaptcha-site-key-here \ No newline at end of file diff --git a/apps/api/.env.schema b/apps/api/.env.schema index 85643b8..944f21d 100644 --- a/apps/api/.env.schema +++ b/apps/api/.env.schema @@ -12,4 +12,8 @@ CORS_TRUSTED_CDN_HOSTS= # --- OpenAI configuration --- OPENAI_API_KEY= OPENAI_MODEL= -OPENAI_BASE_URL= \ No newline at end of file +OPENAI_BASE_URL= + +# --- hCaptcha configuration --- +HCAPTCHA_SECRET_KEY= +HCAPTCHA_SITE_KEY= \ No newline at end of file diff --git a/apps/api/middleware/helmet.js b/apps/api/middleware/helmet.js index ac13aaf..73eba2d 100644 --- a/apps/api/middleware/helmet.js +++ b/apps/api/middleware/helmet.js @@ -13,8 +13,8 @@ const helmetMiddleware = helmet({ 'upgrade-insecure-requests': isDevelopment ? null : [], 'frame-ancestors': ["'self'", ...CORS_TRUSTED_HOSTS], - 'script-src': ["'self'", "'unsafe-inline'", 'https://static.cloudflareinsights.com', ...CORS_TRUSTED_CDN_HOSTS], - 'style-src': ["'self'", "'unsafe-inline'", ...CORS_TRUSTED_CDN_HOSTS], + 'script-src': ["'self'", "'unsafe-inline'", 'https://static.cloudflareinsights.com', 'https://js.hcaptcha.com', 'https://newassets.hcaptcha.com', ...CORS_TRUSTED_CDN_HOSTS], + 'style-src': ["'self'", "'unsafe-inline'", 'https://newassets.hcaptcha.com', ...CORS_TRUSTED_CDN_HOSTS], 'img-src': ["'self'", 'data:', 'https://contrib.rocks', ...CORS_TRUSTED_CDN_HOSTS], 'font-src': ["'self'", ...CORS_TRUSTED_CDN_HOSTS] } diff --git a/apps/web/.env.example b/apps/web/.env.example index ff8056f..a049791 100644 --- a/apps/web/.env.example +++ b/apps/web/.env.example @@ -18,4 +18,8 @@ CORS_TRUSTED_CDN_HOSTS="cdn.example.com" # --- OpenAI configuration --- OPENAI_API_KEY="your-openai-api-key-here" OPENAI_MODEL="gpt-3.5-turbo" -OPENAI_BASE_URL="https://api.openai.com/v1" \ No newline at end of file +OPENAI_BASE_URL="https://api.openai.com/v1" + +# --- hCaptcha configuration --- +HCAPTCHA_SECRET_KEY=your-hcaptcha-secret-key-here +HCAPTCHA_SITE_KEY=your-hcaptcha-site-key-here \ No newline at end of file diff --git a/apps/web/.env.schema b/apps/web/.env.schema index 476fbc7..142f2b3 100644 --- a/apps/web/.env.schema +++ b/apps/web/.env.schema @@ -18,4 +18,8 @@ CORS_TRUSTED_CDN_HOSTS= # --- OpenAI configuration --- OPENAI_API_KEY= OPENAI_MODEL= -OPENAI_BASE_URL= \ No newline at end of file +OPENAI_BASE_URL= + +# --- hCaptcha configuration --- +HCAPTCHA_SECRET_KEY= +HCAPTCHA_SITE_KEY= \ No newline at end of file diff --git a/apps/web/middleware/helmet.js b/apps/web/middleware/helmet.js index 0e6a99d..366234c 100644 --- a/apps/web/middleware/helmet.js +++ b/apps/web/middleware/helmet.js @@ -30,11 +30,12 @@ const helmetMiddleware = helmet({ 'upgrade-insecure-requests': isDevelopment ? null : [], 'frame-ancestors': ["'self'", ...CORS_TRUSTED_HOSTS], - 'script-src': ["'self'", "'unsafe-inline'", 'https://static.cloudflareinsights.com', ...CORS_TRUSTED_CDN_HOSTS], - 'style-src': ["'self'", "'unsafe-inline'", ...CORS_TRUSTED_CDN_HOSTS], + 'frame-src': ["'self'", 'https://newassets.hcaptcha.com', 'https://js.hcaptcha.com', ...CORS_TRUSTED_HOSTS], + 'script-src': ["'self'", "'unsafe-inline'", 'https://static.cloudflareinsights.com', 'https://js.hcaptcha.com', 'https://newassets.hcaptcha.com', ...CORS_TRUSTED_CDN_HOSTS], + 'style-src': ["'self'", "'unsafe-inline'", 'https://newassets.hcaptcha.com', ...CORS_TRUSTED_CDN_HOSTS], 'img-src': ["'self'", 'data:', 'https://contrib.rocks', ...CORS_TRUSTED_CDN_HOSTS], 'font-src': ["'self'", ...CORS_TRUSTED_CDN_HOSTS], - 'connect-src': ["'self'", ...(APP_API_BASE_URL ? [removePathFromUrl(APP_API_BASE_URL)] : [])] + 'connect-src': ["'self'", 'https://hcaptcha.com', 'https://*.hcaptcha.com', ...(APP_API_BASE_URL ? [removePathFromUrl(APP_API_BASE_URL)] : [])] } }, frameguard: false, diff --git a/apps/web/routes/home.js b/apps/web/routes/home.js index b4c08b3..01ede21 100644 --- a/apps/web/routes/home.js +++ b/apps/web/routes/home.js @@ -39,7 +39,8 @@ export const route = new AppRoute('/', 'get', async (req, res) => { const META = { APP_API_BASE_URL: process.env.APP_USE_BUILTIN_API === 'true' ? '/api' - : normalizeApiBaseUrl(String(process.env.APP_API_BASE_URL)) + : normalizeApiBaseUrl(String(process.env.APP_API_BASE_URL)), + HCAPTCHA_SITE_KEY: String(process.env.HCAPTCHA_SITE_KEY || '') } res.render('layout/main', { VIEW: 'home', APP_NAME, TITLE: 'Home', BASE_URL: process.env.BASE_URL || '', META }) diff --git a/docs/api-reference/packages/core/ai/openai-wrapper/classes/default.md b/docs/api-reference/packages/core/ai/openai-wrapper/classes/default.md index 02b5e68..11b4c6f 100644 --- a/docs/api-reference/packages/core/ai/openai-wrapper/classes/default.md +++ b/docs/api-reference/packages/core/ai/openai-wrapper/classes/default.md @@ -6,7 +6,7 @@ # Class: default -Defined in: [packages/core/ai/openai-wrapper.js:26](https://github.com/GTPSHAX/modul-ajar-generator/blob/9db625383fe8ae8db846d4419c7c2eb1c653406a/packages/core/ai/openai-wrapper.js#L26) +Defined in: [packages/core/ai/openai-wrapper.js:26](https://github.com/GTPSHAX/modul-ajar-generator/blob/d4b0e01a4a3d86231cbebd8dec7d9bc8aedf2a93/packages/core/ai/openai-wrapper.js#L26) OpenAIWrapper is a simple wrapper around the OpenAI API to manage contexts and generate responses. @@ -29,7 +29,7 @@ Make sure to set the OPENAI_API_KEY and OPENAI_MODEL environment variables befor > **new default**(`apiKey`, `model?`, `baseURL?`): `OpenAIWrapper` -Defined in: [packages/core/ai/openai-wrapper.js:43](https://github.com/GTPSHAX/modul-ajar-generator/blob/9db625383fe8ae8db846d4419c7c2eb1c653406a/packages/core/ai/openai-wrapper.js#L43) +Defined in: [packages/core/ai/openai-wrapper.js:43](https://github.com/GTPSHAX/modul-ajar-generator/blob/d4b0e01a4a3d86231cbebd8dec7d9bc8aedf2a93/packages/core/ai/openai-wrapper.js#L43) Creates an instance of OpenAIWrapper. @@ -65,7 +65,7 @@ The base URL for the OpenAI API > **get** **baseURL**(): `string` \| `null` -Defined in: [packages/core/ai/openai-wrapper.js:63](https://github.com/GTPSHAX/modul-ajar-generator/blob/9db625383fe8ae8db846d4419c7c2eb1c653406a/packages/core/ai/openai-wrapper.js#L63) +Defined in: [packages/core/ai/openai-wrapper.js:63](https://github.com/GTPSHAX/modul-ajar-generator/blob/d4b0e01a4a3d86231cbebd8dec7d9bc8aedf2a93/packages/core/ai/openai-wrapper.js#L63) Gets the base URL for the OpenAI API. @@ -81,7 +81,7 @@ Gets the base URL for the OpenAI API. > **get** **client**(): `OpenAI` -Defined in: [packages/core/ai/openai-wrapper.js:88](https://github.com/GTPSHAX/modul-ajar-generator/blob/9db625383fe8ae8db846d4419c7c2eb1c653406a/packages/core/ai/openai-wrapper.js#L88) +Defined in: [packages/core/ai/openai-wrapper.js:88](https://github.com/GTPSHAX/modul-ajar-generator/blob/d4b0e01a4a3d86231cbebd8dec7d9bc8aedf2a93/packages/core/ai/openai-wrapper.js#L88) Gets the OpenAI client instance. @@ -97,7 +97,7 @@ Gets the OpenAI client instance. > **get** **context**(): [`Message`](../interfaces/Message.md)[] -Defined in: [packages/core/ai/openai-wrapper.js:96](https://github.com/GTPSHAX/modul-ajar-generator/blob/9db625383fe8ae8db846d4419c7c2eb1c653406a/packages/core/ai/openai-wrapper.js#L96) +Defined in: [packages/core/ai/openai-wrapper.js:96](https://github.com/GTPSHAX/modul-ajar-generator/blob/d4b0e01a4a3d86231cbebd8dec7d9bc8aedf2a93/packages/core/ai/openai-wrapper.js#L96) Gets the default context. @@ -109,7 +109,7 @@ Gets the default context. > **set** **context**(`context`): `void` -Defined in: [packages/core/ai/openai-wrapper.js:104](https://github.com/GTPSHAX/modul-ajar-generator/blob/9db625383fe8ae8db846d4419c7c2eb1c653406a/packages/core/ai/openai-wrapper.js#L104) +Defined in: [packages/core/ai/openai-wrapper.js:104](https://github.com/GTPSHAX/modul-ajar-generator/blob/d4b0e01a4a3d86231cbebd8dec7d9bc8aedf2a93/packages/core/ai/openai-wrapper.js#L104) Sets the default context. @@ -131,7 +131,7 @@ Sets the default context. > **get** **model**(): `string` -Defined in: [packages/core/ai/openai-wrapper.js:71](https://github.com/GTPSHAX/modul-ajar-generator/blob/9db625383fe8ae8db846d4419c7c2eb1c653406a/packages/core/ai/openai-wrapper.js#L71) +Defined in: [packages/core/ai/openai-wrapper.js:71](https://github.com/GTPSHAX/modul-ajar-generator/blob/d4b0e01a4a3d86231cbebd8dec7d9bc8aedf2a93/packages/core/ai/openai-wrapper.js#L71) Gets the model. @@ -143,7 +143,7 @@ Gets the model. > **set** **model**(`model`): `void` -Defined in: [packages/core/ai/openai-wrapper.js:79](https://github.com/GTPSHAX/modul-ajar-generator/blob/9db625383fe8ae8db846d4419c7c2eb1c653406a/packages/core/ai/openai-wrapper.js#L79) +Defined in: [packages/core/ai/openai-wrapper.js:79](https://github.com/GTPSHAX/modul-ajar-generator/blob/d4b0e01a4a3d86231cbebd8dec7d9bc8aedf2a93/packages/core/ai/openai-wrapper.js#L79) Sets the model. @@ -163,7 +163,7 @@ Sets the model. > **addContext**(...`contexts`): `void` -Defined in: [packages/core/ai/openai-wrapper.js:115](https://github.com/GTPSHAX/modul-ajar-generator/blob/9db625383fe8ae8db846d4419c7c2eb1c653406a/packages/core/ai/openai-wrapper.js#L115) +Defined in: [packages/core/ai/openai-wrapper.js:115](https://github.com/GTPSHAX/modul-ajar-generator/blob/d4b0e01a4a3d86231cbebd8dec7d9bc8aedf2a93/packages/core/ai/openai-wrapper.js#L115) Adds one or more context objects to the existing default context. @@ -183,7 +183,7 @@ Adds one or more context objects to the existing default context. > **chat**(`messages`): `Promise`\<`string`\> -Defined in: [packages/core/ai/openai-wrapper.js:173](https://github.com/GTPSHAX/modul-ajar-generator/blob/9db625383fe8ae8db846d4419c7c2eb1c653406a/packages/core/ai/openai-wrapper.js#L173) +Defined in: [packages/core/ai/openai-wrapper.js:173](https://github.com/GTPSHAX/modul-ajar-generator/blob/d4b0e01a4a3d86231cbebd8dec7d9bc8aedf2a93/packages/core/ai/openai-wrapper.js#L173) Send a chat message to the OpenAI model with the loaded contexts. @@ -205,7 +205,7 @@ Send a chat message to the OpenAI model with the loaded contexts. > **loadContext**(`filePath`): `void` -Defined in: [packages/core/ai/openai-wrapper.js:151](https://github.com/GTPSHAX/modul-ajar-generator/blob/9db625383fe8ae8db846d4419c7c2eb1c653406a/packages/core/ai/openai-wrapper.js#L151) +Defined in: [packages/core/ai/openai-wrapper.js:151](https://github.com/GTPSHAX/modul-ajar-generator/blob/d4b0e01a4a3d86231cbebd8dec7d9bc8aedf2a93/packages/core/ai/openai-wrapper.js#L151) Loads a context from a file and adds it to the default context as a system message. @@ -225,7 +225,7 @@ Loads a context from a file and adds it to the default context as a system messa > **loadContextsFromDir**(`pathDir`): `void` -Defined in: [packages/core/ai/openai-wrapper.js:126](https://github.com/GTPSHAX/modul-ajar-generator/blob/9db625383fe8ae8db846d4419c7c2eb1c653406a/packages/core/ai/openai-wrapper.js#L126) +Defined in: [packages/core/ai/openai-wrapper.js:126](https://github.com/GTPSHAX/modul-ajar-generator/blob/d4b0e01a4a3d86231cbebd8dec7d9bc8aedf2a93/packages/core/ai/openai-wrapper.js#L126) Load context(s) from a directory. diff --git a/docs/api-reference/packages/core/ai/openai-wrapper/interfaces/Message.md b/docs/api-reference/packages/core/ai/openai-wrapper/interfaces/Message.md index 9271dcf..19c1011 100644 --- a/docs/api-reference/packages/core/ai/openai-wrapper/interfaces/Message.md +++ b/docs/api-reference/packages/core/ai/openai-wrapper/interfaces/Message.md @@ -6,7 +6,7 @@ # Interface: Message -Defined in: [packages/core/ai/openai-wrapper.js:8](https://github.com/GTPSHAX/modul-ajar-generator/blob/9db625383fe8ae8db846d4419c7c2eb1c653406a/packages/core/ai/openai-wrapper.js#L8) +Defined in: [packages/core/ai/openai-wrapper.js:8](https://github.com/GTPSHAX/modul-ajar-generator/blob/d4b0e01a4a3d86231cbebd8dec7d9bc8aedf2a93/packages/core/ai/openai-wrapper.js#L8) ## Properties @@ -14,7 +14,7 @@ Defined in: [packages/core/ai/openai-wrapper.js:8](https://github.com/GTPSHAX/mo > **content**: `string` -Defined in: [packages/core/ai/openai-wrapper.js:10](https://github.com/GTPSHAX/modul-ajar-generator/blob/9db625383fe8ae8db846d4419c7c2eb1c653406a/packages/core/ai/openai-wrapper.js#L10) +Defined in: [packages/core/ai/openai-wrapper.js:10](https://github.com/GTPSHAX/modul-ajar-generator/blob/d4b0e01a4a3d86231cbebd8dec7d9bc8aedf2a93/packages/core/ai/openai-wrapper.js#L10) The content of the message @@ -24,7 +24,7 @@ The content of the message > `optional` **name?**: `string` -Defined in: [packages/core/ai/openai-wrapper.js:11](https://github.com/GTPSHAX/modul-ajar-generator/blob/9db625383fe8ae8db846d4419c7c2eb1c653406a/packages/core/ai/openai-wrapper.js#L11) +Defined in: [packages/core/ai/openai-wrapper.js:11](https://github.com/GTPSHAX/modul-ajar-generator/blob/d4b0e01a4a3d86231cbebd8dec7d9bc8aedf2a93/packages/core/ai/openai-wrapper.js#L11) Optional name for tool/function messages @@ -34,7 +34,7 @@ Optional name for tool/function messages > **role**: `"system"` \| `"user"` \| `"assistant"` \| `"tool"` -Defined in: [packages/core/ai/openai-wrapper.js:9](https://github.com/GTPSHAX/modul-ajar-generator/blob/9db625383fe8ae8db846d4419c7c2eb1c653406a/packages/core/ai/openai-wrapper.js#L9) +Defined in: [packages/core/ai/openai-wrapper.js:9](https://github.com/GTPSHAX/modul-ajar-generator/blob/d4b0e01a4a3d86231cbebd8dec7d9bc8aedf2a93/packages/core/ai/openai-wrapper.js#L9) The role of the message sender (excluding 'function' to avoid name requirement) @@ -44,6 +44,6 @@ The role of the message sender (excluding 'function' to avoid name requirement) > `optional` **tool\_call\_id?**: `string` -Defined in: [packages/core/ai/openai-wrapper.js:12](https://github.com/GTPSHAX/modul-ajar-generator/blob/9db625383fe8ae8db846d4419c7c2eb1c653406a/packages/core/ai/openai-wrapper.js#L12) +Defined in: [packages/core/ai/openai-wrapper.js:12](https://github.com/GTPSHAX/modul-ajar-generator/blob/d4b0e01a4a3d86231cbebd8dec7d9bc8aedf2a93/packages/core/ai/openai-wrapper.js#L12) Optional tool_call_id for tool messages diff --git a/docs/api-reference/packages/core/engine/vm-runner/classes/default.md b/docs/api-reference/packages/core/engine/vm-runner/classes/default.md index 6907a24..bc190c9 100644 --- a/docs/api-reference/packages/core/engine/vm-runner/classes/default.md +++ b/docs/api-reference/packages/core/engine/vm-runner/classes/default.md @@ -6,7 +6,7 @@ # Class: default -Defined in: [packages/core/engine/vm-runner.js:28](https://github.com/GTPSHAX/modul-ajar-generator/blob/9db625383fe8ae8db846d4419c7c2eb1c653406a/packages/core/engine/vm-runner.js#L28) +Defined in: [packages/core/engine/vm-runner.js:28](https://github.com/GTPSHAX/modul-ajar-generator/blob/d4b0e01a4a3d86231cbebd8dec7d9bc8aedf2a93/packages/core/engine/vm-runner.js#L28) Runs JavaScript code safely inside a sandboxed VM context. @@ -30,7 +30,7 @@ const runner = new VMRunner( > **new default**(`code`, `shared?`, `callback?`): `VMRunner` -Defined in: [packages/core/engine/vm-runner.js:45](https://github.com/GTPSHAX/modul-ajar-generator/blob/9db625383fe8ae8db846d4419c7c2eb1c653406a/packages/core/engine/vm-runner.js#L45) +Defined in: [packages/core/engine/vm-runner.js:45](https://github.com/GTPSHAX/modul-ajar-generator/blob/d4b0e01a4a3d86231cbebd8dec7d9bc8aedf2a93/packages/core/engine/vm-runner.js#L45) Creates a new VMRunner instance. @@ -64,7 +64,7 @@ Error-first callback for results > **callback**: [`VMCallback`](../type-aliases/VMCallback.md) \| `null` = `null` -Defined in: [packages/core/engine/vm-runner.js:34](https://github.com/GTPSHAX/modul-ajar-generator/blob/9db625383fe8ae8db846d4419c7c2eb1c653406a/packages/core/engine/vm-runner.js#L34) +Defined in: [packages/core/engine/vm-runner.js:34](https://github.com/GTPSHAX/modul-ajar-generator/blob/d4b0e01a4a3d86231cbebd8dec7d9bc8aedf2a93/packages/core/engine/vm-runner.js#L34) *** @@ -72,7 +72,7 @@ Defined in: [packages/core/engine/vm-runner.js:34](https://github.com/GTPSHAX/mo > **code**: `string` \| `null` = `null` -Defined in: [packages/core/engine/vm-runner.js:30](https://github.com/GTPSHAX/modul-ajar-generator/blob/9db625383fe8ae8db846d4419c7c2eb1c653406a/packages/core/engine/vm-runner.js#L30) +Defined in: [packages/core/engine/vm-runner.js:30](https://github.com/GTPSHAX/modul-ajar-generator/blob/d4b0e01a4a3d86231cbebd8dec7d9bc8aedf2a93/packages/core/engine/vm-runner.js#L30) *** @@ -80,7 +80,7 @@ Defined in: [packages/core/engine/vm-runner.js:30](https://github.com/GTPSHAX/mo > **context**: [`ContextObject`](../type-aliases/ContextObject.md) \| `null` = `null` -Defined in: [packages/core/engine/vm-runner.js:36](https://github.com/GTPSHAX/modul-ajar-generator/blob/9db625383fe8ae8db846d4419c7c2eb1c653406a/packages/core/engine/vm-runner.js#L36) +Defined in: [packages/core/engine/vm-runner.js:36](https://github.com/GTPSHAX/modul-ajar-generator/blob/d4b0e01a4a3d86231cbebd8dec7d9bc8aedf2a93/packages/core/engine/vm-runner.js#L36) *** @@ -88,7 +88,7 @@ Defined in: [packages/core/engine/vm-runner.js:36](https://github.com/GTPSHAX/mo > **shared**: [`ContextObject`](../type-aliases/ContextObject.md) \| `null` = `null` -Defined in: [packages/core/engine/vm-runner.js:32](https://github.com/GTPSHAX/modul-ajar-generator/blob/9db625383fe8ae8db846d4419c7c2eb1c653406a/packages/core/engine/vm-runner.js#L32) +Defined in: [packages/core/engine/vm-runner.js:32](https://github.com/GTPSHAX/modul-ajar-generator/blob/d4b0e01a4a3d86231cbebd8dec7d9bc8aedf2a93/packages/core/engine/vm-runner.js#L32) ## Methods @@ -96,7 +96,7 @@ Defined in: [packages/core/engine/vm-runner.js:32](https://github.com/GTPSHAX/mo > **addContext**(...`contexts`): `void` -Defined in: [packages/core/engine/vm-runner.js:144](https://github.com/GTPSHAX/modul-ajar-generator/blob/9db625383fe8ae8db846d4419c7c2eb1c653406a/packages/core/engine/vm-runner.js#L144) +Defined in: [packages/core/engine/vm-runner.js:144](https://github.com/GTPSHAX/modul-ajar-generator/blob/d4b0e01a4a3d86231cbebd8dec7d9bc8aedf2a93/packages/core/engine/vm-runner.js#L144) Adds extra variables into the VM context before running. @@ -118,7 +118,7 @@ Objects to merge into the VM context > **run**(): `void` -Defined in: [packages/core/engine/vm-runner.js:76](https://github.com/GTPSHAX/modul-ajar-generator/blob/9db625383fe8ae8db846d4419c7c2eb1c653406a/packages/core/engine/vm-runner.js#L76) +Defined in: [packages/core/engine/vm-runner.js:76](https://github.com/GTPSHAX/modul-ajar-generator/blob/d4b0e01a4a3d86231cbebd8dec7d9bc8aedf2a93/packages/core/engine/vm-runner.js#L76) Runs the code inside the VM and calls the callback with the result. diff --git a/docs/api-reference/packages/core/engine/vm-runner/type-aliases/ContextObject.md b/docs/api-reference/packages/core/engine/vm-runner/type-aliases/ContextObject.md index f4ef4f3..e8839f3 100644 --- a/docs/api-reference/packages/core/engine/vm-runner/type-aliases/ContextObject.md +++ b/docs/api-reference/packages/core/engine/vm-runner/type-aliases/ContextObject.md @@ -8,6 +8,6 @@ > **ContextObject** = `Record`\<`string`, `any`\> -Defined in: [packages/core/engine/vm-runner.js:11](https://github.com/GTPSHAX/modul-ajar-generator/blob/9db625383fe8ae8db846d4419c7c2eb1c653406a/packages/core/engine/vm-runner.js#L11) +Defined in: [packages/core/engine/vm-runner.js:11](https://github.com/GTPSHAX/modul-ajar-generator/blob/d4b0e01a4a3d86231cbebd8dec7d9bc8aedf2a93/packages/core/engine/vm-runner.js#L11) ## Type Parameters diff --git a/docs/api-reference/packages/core/engine/vm-runner/type-aliases/VMCallback.md b/docs/api-reference/packages/core/engine/vm-runner/type-aliases/VMCallback.md index b0b0d42..327a8a6 100644 --- a/docs/api-reference/packages/core/engine/vm-runner/type-aliases/VMCallback.md +++ b/docs/api-reference/packages/core/engine/vm-runner/type-aliases/VMCallback.md @@ -8,7 +8,7 @@ > **VMCallback** = (`err`, `result?`) => `void` -Defined in: [packages/core/engine/vm-runner.js:10](https://github.com/GTPSHAX/modul-ajar-generator/blob/9db625383fe8ae8db846d4419c7c2eb1c653406a/packages/core/engine/vm-runner.js#L10) +Defined in: [packages/core/engine/vm-runner.js:10](https://github.com/GTPSHAX/modul-ajar-generator/blob/d4b0e01a4a3d86231cbebd8dec7d9bc8aedf2a93/packages/core/engine/vm-runner.js#L10) ## Type Parameters diff --git a/docs/api-reference/packages/handlers/handle-autofill-ai/functions/default.md b/docs/api-reference/packages/handlers/handle-autofill-ai/functions/default.md index d7d66cd..f74fe48 100644 --- a/docs/api-reference/packages/handlers/handle-autofill-ai/functions/default.md +++ b/docs/api-reference/packages/handlers/handle-autofill-ai/functions/default.md @@ -8,7 +8,7 @@ > **default**(`body`): `Promise`\<\{ `data?`: `string`; `message?`: `string`; `status`: `number`; \}\> -Defined in: [packages/handlers/handle-autofill-ai.js:61](https://github.com/GTPSHAX/modul-ajar-generator/blob/9db625383fe8ae8db846d4419c7c2eb1c653406a/packages/handlers/handle-autofill-ai.js#L61) +Defined in: [packages/handlers/handle-autofill-ai.js:61](https://github.com/GTPSHAX/modul-ajar-generator/blob/d4b0e01a4a3d86231cbebd8dec7d9bc8aedf2a93/packages/handlers/handle-autofill-ai.js#L61) Handles auto-filling AI functionality. diff --git a/docs/api-reference/packages/handlers/handle-autofill-ai/interfaces/Message.md b/docs/api-reference/packages/handlers/handle-autofill-ai/interfaces/Message.md index f1c02ad..3c45a68 100644 --- a/docs/api-reference/packages/handlers/handle-autofill-ai/interfaces/Message.md +++ b/docs/api-reference/packages/handlers/handle-autofill-ai/interfaces/Message.md @@ -6,7 +6,7 @@ # Interface: Message -Defined in: [packages/handlers/handle-autofill-ai.js:8](https://github.com/GTPSHAX/modul-ajar-generator/blob/9db625383fe8ae8db846d4419c7c2eb1c653406a/packages/handlers/handle-autofill-ai.js#L8) +Defined in: [packages/handlers/handle-autofill-ai.js:8](https://github.com/GTPSHAX/modul-ajar-generator/blob/d4b0e01a4a3d86231cbebd8dec7d9bc8aedf2a93/packages/handlers/handle-autofill-ai.js#L8) ## Properties @@ -14,7 +14,7 @@ Defined in: [packages/handlers/handle-autofill-ai.js:8](https://github.com/GTPSH > **content**: `string` -Defined in: [packages/handlers/handle-autofill-ai.js:10](https://github.com/GTPSHAX/modul-ajar-generator/blob/9db625383fe8ae8db846d4419c7c2eb1c653406a/packages/handlers/handle-autofill-ai.js#L10) +Defined in: [packages/handlers/handle-autofill-ai.js:10](https://github.com/GTPSHAX/modul-ajar-generator/blob/d4b0e01a4a3d86231cbebd8dec7d9bc8aedf2a93/packages/handlers/handle-autofill-ai.js#L10) The content of the message @@ -24,7 +24,7 @@ The content of the message > `optional` **name?**: `string` -Defined in: [packages/handlers/handle-autofill-ai.js:11](https://github.com/GTPSHAX/modul-ajar-generator/blob/9db625383fe8ae8db846d4419c7c2eb1c653406a/packages/handlers/handle-autofill-ai.js#L11) +Defined in: [packages/handlers/handle-autofill-ai.js:11](https://github.com/GTPSHAX/modul-ajar-generator/blob/d4b0e01a4a3d86231cbebd8dec7d9bc8aedf2a93/packages/handlers/handle-autofill-ai.js#L11) Optional name for tool/function messages @@ -34,7 +34,7 @@ Optional name for tool/function messages > **role**: `"system"` \| `"user"` \| `"assistant"` \| `"tool"` -Defined in: [packages/handlers/handle-autofill-ai.js:9](https://github.com/GTPSHAX/modul-ajar-generator/blob/9db625383fe8ae8db846d4419c7c2eb1c653406a/packages/handlers/handle-autofill-ai.js#L9) +Defined in: [packages/handlers/handle-autofill-ai.js:9](https://github.com/GTPSHAX/modul-ajar-generator/blob/d4b0e01a4a3d86231cbebd8dec7d9bc8aedf2a93/packages/handlers/handle-autofill-ai.js#L9) The role of the message sender (excluding 'function' to avoid name requirement) @@ -44,6 +44,6 @@ The role of the message sender (excluding 'function' to avoid name requirement) > `optional` **tool\_call\_id?**: `string` -Defined in: [packages/handlers/handle-autofill-ai.js:12](https://github.com/GTPSHAX/modul-ajar-generator/blob/9db625383fe8ae8db846d4419c7c2eb1c653406a/packages/handlers/handle-autofill-ai.js#L12) +Defined in: [packages/handlers/handle-autofill-ai.js:12](https://github.com/GTPSHAX/modul-ajar-generator/blob/d4b0e01a4a3d86231cbebd8dec7d9bc8aedf2a93/packages/handlers/handle-autofill-ai.js#L12) Optional tool_call_id for tool messages diff --git a/docs/api-reference/packages/handlers/handle-generate-docx/functions/default.md b/docs/api-reference/packages/handlers/handle-generate-docx/functions/default.md index 99dc663..edc45c2 100644 --- a/docs/api-reference/packages/handlers/handle-generate-docx/functions/default.md +++ b/docs/api-reference/packages/handlers/handle-generate-docx/functions/default.md @@ -8,7 +8,7 @@ > **default**(`body`): `Promise`\<\{ `data?`: `any`; `message?`: `string`; `status`: `number`; \}\> -Defined in: [packages/handlers/handle-generate-docx.js:126](https://github.com/GTPSHAX/modul-ajar-generator/blob/9db625383fe8ae8db846d4419c7c2eb1c653406a/packages/handlers/handle-generate-docx.js#L126) +Defined in: [packages/handlers/handle-generate-docx.js:127](https://github.com/GTPSHAX/modul-ajar-generator/blob/d4b0e01a4a3d86231cbebd8dec7d9bc8aedf2a93/packages/handlers/handle-generate-docx.js#L127) Handles the generation of a DOCX document based on the provided body data. diff --git a/docs/api-reference/packages/utils/utils/functions/convertNumToRoman.md b/docs/api-reference/packages/utils/utils/functions/convertNumToRoman.md index 575ecbd..15d6d1e 100644 --- a/docs/api-reference/packages/utils/utils/functions/convertNumToRoman.md +++ b/docs/api-reference/packages/utils/utils/functions/convertNumToRoman.md @@ -8,7 +8,7 @@ > **convertNumToRoman**(`num`): `string` -Defined in: [packages/utils/utils.js:92](https://github.com/GTPSHAX/modul-ajar-generator/blob/9db625383fe8ae8db846d4419c7c2eb1c653406a/packages/utils/utils.js#L92) +Defined in: [packages/utils/utils.js:92](https://github.com/GTPSHAX/modul-ajar-generator/blob/d4b0e01a4a3d86231cbebd8dec7d9bc8aedf2a93/packages/utils/utils.js#L92) Converts a number to its Roman numeral representation. diff --git a/docs/api-reference/packages/utils/utils/functions/extractCodeFromMarkdownFence.md b/docs/api-reference/packages/utils/utils/functions/extractCodeFromMarkdownFence.md index 9f40326..92647ec 100644 --- a/docs/api-reference/packages/utils/utils/functions/extractCodeFromMarkdownFence.md +++ b/docs/api-reference/packages/utils/utils/functions/extractCodeFromMarkdownFence.md @@ -8,7 +8,7 @@ > **extractCodeFromMarkdownFence**(`code`): `string` -Defined in: [packages/utils/utils.js:79](https://github.com/GTPSHAX/modul-ajar-generator/blob/9db625383fe8ae8db846d4419c7c2eb1c653406a/packages/utils/utils.js#L79) +Defined in: [packages/utils/utils.js:79](https://github.com/GTPSHAX/modul-ajar-generator/blob/d4b0e01a4a3d86231cbebd8dec7d9bc8aedf2a93/packages/utils/utils.js#L79) Cleans code extracted from markdown code blocks. Removes the enclosing backticks while preserving inner content. diff --git a/docs/api-reference/packages/utils/utils/functions/getEnvPath.md b/docs/api-reference/packages/utils/utils/functions/getEnvPath.md index 1c7be2d..99a0c65 100644 --- a/docs/api-reference/packages/utils/utils/functions/getEnvPath.md +++ b/docs/api-reference/packages/utils/utils/functions/getEnvPath.md @@ -8,7 +8,7 @@ > **getEnvPath**(`filename?`): `string` \| `null` -Defined in: [packages/utils/utils.js:167](https://github.com/GTPSHAX/modul-ajar-generator/blob/9db625383fe8ae8db846d4419c7c2eb1c653406a/packages/utils/utils.js#L167) +Defined in: [packages/utils/utils.js:167](https://github.com/GTPSHAX/modul-ajar-generator/blob/d4b0e01a4a3d86231cbebd8dec7d9bc8aedf2a93/packages/utils/utils.js#L167) Gets the path to the .env file, checking both the current working directory and the project root. This allows for flexibility in where the .env file can be located, accommodating different deployment and development setups. diff --git a/docs/api-reference/packages/utils/utils/functions/loadContexts.md b/docs/api-reference/packages/utils/utils/functions/loadContexts.md index afa04ee..8f6a852 100644 --- a/docs/api-reference/packages/utils/utils/functions/loadContexts.md +++ b/docs/api-reference/packages/utils/utils/functions/loadContexts.md @@ -8,7 +8,7 @@ > **loadContexts**(`dir`): `object` -Defined in: [packages/utils/utils.js:37](https://github.com/GTPSHAX/modul-ajar-generator/blob/9db625383fe8ae8db846d4419c7c2eb1c653406a/packages/utils/utils.js#L37) +Defined in: [packages/utils/utils.js:37](https://github.com/GTPSHAX/modul-ajar-generator/blob/d4b0e01a4a3d86231cbebd8dec7d9bc8aedf2a93/packages/utils/utils.js#L37) This function loads all Markdown files from a specified directory, reads their content, and constructs an object where each key is derived from the filename (converted to uppercase and underscores) and the value is the file's content. This allows for easy access to the content of multiple Markdown files in a structured format. diff --git a/docs/api-reference/packages/utils/utils/functions/numTokensFromString.md b/docs/api-reference/packages/utils/utils/functions/numTokensFromString.md index b763e93..a5efcb8 100644 --- a/docs/api-reference/packages/utils/utils/functions/numTokensFromString.md +++ b/docs/api-reference/packages/utils/utils/functions/numTokensFromString.md @@ -8,7 +8,7 @@ > **numTokensFromString**(`message`, `model?`): `number` -Defined in: [packages/utils/utils.js:110](https://github.com/GTPSHAX/modul-ajar-generator/blob/9db625383fe8ae8db846d4419c7c2eb1c653406a/packages/utils/utils.js#L110) +Defined in: [packages/utils/utils.js:110](https://github.com/GTPSHAX/modul-ajar-generator/blob/d4b0e01a4a3d86231cbebd8dec7d9bc8aedf2a93/packages/utils/utils.js#L110) Counts the number of tokens in a string using the specified model's tokenizer. diff --git a/docs/api-reference/packages/utils/utils/functions/removeCodeBlocksFromMarkdown.md b/docs/api-reference/packages/utils/utils/functions/removeCodeBlocksFromMarkdown.md index 0cec0ba..fe2f654 100644 --- a/docs/api-reference/packages/utils/utils/functions/removeCodeBlocksFromMarkdown.md +++ b/docs/api-reference/packages/utils/utils/functions/removeCodeBlocksFromMarkdown.md @@ -8,7 +8,7 @@ > **removeCodeBlocksFromMarkdown**(`markdown`): `string` -Defined in: [packages/utils/utils.js:63](https://github.com/GTPSHAX/modul-ajar-generator/blob/9db625383fe8ae8db846d4419c7c2eb1c653406a/packages/utils/utils.js#L63) +Defined in: [packages/utils/utils.js:63](https://github.com/GTPSHAX/modul-ajar-generator/blob/d4b0e01a4a3d86231cbebd8dec7d9bc8aedf2a93/packages/utils/utils.js#L63) Removes markdown code blocks and inline code from a markdown string. Note: This removes MARKDOWN code blocks (e.g., from markdown with embedded code), diff --git a/docs/api-reference/packages/utils/utils/functions/removeImportRequire.md b/docs/api-reference/packages/utils/utils/functions/removeImportRequire.md index 662ec6a..244c078 100644 --- a/docs/api-reference/packages/utils/utils/functions/removeImportRequire.md +++ b/docs/api-reference/packages/utils/utils/functions/removeImportRequire.md @@ -8,7 +8,7 @@ > **removeImportRequire**(`content`): `string` -Defined in: [packages/utils/utils.js:16](https://github.com/GTPSHAX/modul-ajar-generator/blob/9db625383fe8ae8db846d4419c7c2eb1c653406a/packages/utils/utils.js#L16) +Defined in: [packages/utils/utils.js:16](https://github.com/GTPSHAX/modul-ajar-generator/blob/d4b0e01a4a3d86231cbebd8dec7d9bc8aedf2a93/packages/utils/utils.js#L16) Removes import require, and export statements from a string. diff --git a/docs/api-reference/packages/utils/utils/functions/validateBodyParams.md b/docs/api-reference/packages/utils/utils/functions/validateBodyParams.md index dc1c375..1452812 100644 --- a/docs/api-reference/packages/utils/utils/functions/validateBodyParams.md +++ b/docs/api-reference/packages/utils/utils/functions/validateBodyParams.md @@ -8,7 +8,7 @@ > **validateBodyParams**(`body`, ...`requiredParams`): `object` -Defined in: [packages/utils/utils.js:125](https://github.com/GTPSHAX/modul-ajar-generator/blob/9db625383fe8ae8db846d4419c7c2eb1c653406a/packages/utils/utils.js#L125) +Defined in: [packages/utils/utils.js:125](https://github.com/GTPSHAX/modul-ajar-generator/blob/d4b0e01a4a3d86231cbebd8dec7d9bc8aedf2a93/packages/utils/utils.js#L125) Validates that all required parameters are present in the request body. diff --git a/packages/handlers/handle-generate-docx.js b/packages/handlers/handle-generate-docx.js index 81af8c1..faa488e 100644 --- a/packages/handlers/handle-generate-docx.js +++ b/packages/handlers/handle-generate-docx.js @@ -2,6 +2,7 @@ import fs from 'fs' import path from 'path' import consola from 'consola' import { validateBodyParams, extractCodeFromMarkdownFence, removeImportRequire, convertNumToRoman } from '@repo/utils/utils.js' +import handleHCaptchaValidation from './handle-hcaptcha-validation.js' import OpenAIWrapper from '@repo/core/ai/openai-wrapper.js' import VMRunner from '@repo/core/engine/vm-runner.js' @@ -124,6 +125,14 @@ function buildRencanaKegiatan (body, kegiatanKeys) { * @returns {Promise<{status: number, data?: any, message?: string}>} */ const handleGenerateDocx = async (body) => { + // Validate hCaptcha response before proceeding with document generation + if (!body['h-captcha-response']) { + return { status: 400, message: 'hCaptcha response token is missing' } + } + if (!await handleHCaptchaValidation(body)) { + return { status: 400, message: 'hCaptcha validation failed' } + } + const template = 'original' // TODO: Make this dynamic based on request parameter if multiple templates are supported in the future' const kegiatanKeys = Object.keys(body).filter(key => !FILTER_KEYS.includes(key)) diff --git a/packages/handlers/handle-hcaptcha-validation.js b/packages/handlers/handle-hcaptcha-validation.js new file mode 100644 index 0000000..7852f78 --- /dev/null +++ b/packages/handlers/handle-hcaptcha-validation.js @@ -0,0 +1,21 @@ +import { verify } from 'hcaptcha' + +/** + * Handles hCaptcha validation by verifying the hCaptcha response token with the hCaptcha service. + * @param {any} body - The request body containing the hCaptcha response token. + * @returns {Promise} - A promise that resolves to true if the hCaptcha validation is successful, or false otherwise. + */ +const handleHCaptchaValidation = async (body) => { + const { 'h-captcha-response': hCaptchaResponse } = body + const secret = String(process.env.HCAPTCHA_SECRET_KEY) + + try { + const result = await verify(secret, hCaptchaResponse) + return result.success + } catch (error) { + console.error('Error validating hCaptcha:', error) + return false + } +} + +export default handleHCaptchaValidation diff --git a/packages/handlers/package.json b/packages/handlers/package.json index 01db726..00945c5 100644 --- a/packages/handlers/package.json +++ b/packages/handlers/package.json @@ -18,6 +18,7 @@ "@repo/core": "^1.0.0", "@repo/utils": "^1.0.0", "consola": "^3.4.2", - "docx": "^9.6.1" + "docx": "^9.6.1", + "hcaptcha": "^0.2.0" } } diff --git a/resources/views/home.ejs b/resources/views/home.ejs index 6c91da1..a9c604b 100644 --- a/resources/views/home.ejs +++ b/resources/views/home.ejs @@ -376,6 +376,7 @@ Export Template +
@@ -389,6 +390,7 @@ + diff --git a/resources/views/layout/main.ejs b/resources/views/layout/main.ejs index fa377fc..9b54a01 100644 --- a/resources/views/layout/main.ejs +++ b/resources/views/layout/main.ejs @@ -18,7 +18,25 @@ <%- include('../components/navbar.ejs', {APP_NAME}) %> - <%- include('../' + VIEW) %> + <%- include('../' + VIEW, {META}) %> <%- include('../components/footer.ejs', {APP_NAME}) %> + \ No newline at end of file