libmodulor 0.4.0 → 0.6.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 (246) hide show
  1. package/.github/dependabot.yml +19 -0
  2. package/CHANGELOG.md +35 -1
  3. package/README.md +10 -4
  4. package/dist/esm/app/workers/AppSrcFilePathBuilder.d.ts +16 -0
  5. package/dist/esm/app/workers/AppSrcFilePathBuilder.js +6 -4
  6. package/dist/esm/apps/Helper/index.js +1 -0
  7. package/dist/esm/apps/Helper/src/i18n.js +4 -0
  8. package/dist/esm/apps/Helper/src/lib/project.d.ts +2 -0
  9. package/dist/esm/apps/Helper/src/lib/project.js +120 -0
  10. package/dist/esm/apps/Helper/src/manifest.d.ts +5 -0
  11. package/dist/esm/apps/Helper/src/manifest.js +5 -0
  12. package/dist/esm/apps/Helper/src/ucds/CreateProjectUCD.d.ts +15 -0
  13. package/dist/esm/apps/Helper/src/ucds/CreateProjectUCD.js +118 -0
  14. package/dist/esm/apps/Helper/src/ucds/GenerateAppsTestsUCD.js +3 -2
  15. package/dist/esm/bundlers/vite/StripUCDLifecycleServerPlugin.js +3 -0
  16. package/dist/esm/convention.d.ts +1 -0
  17. package/dist/esm/convention.js +17 -4
  18. package/dist/esm/dt/Validation.d.ts +8 -0
  19. package/dist/esm/dt/Validation.js +8 -0
  20. package/dist/esm/dt/base/TBase.d.ts +2 -1
  21. package/dist/esm/dt/base/TBoolean.js +2 -0
  22. package/dist/esm/dt/base/TInt.js +3 -0
  23. package/dist/esm/dt/base/TNumber.js +2 -0
  24. package/dist/esm/dt/base/TObject.d.ts +15 -0
  25. package/dist/esm/dt/base/TObject.js +14 -0
  26. package/dist/esm/dt/base/TString.js +1 -1
  27. package/dist/esm/dt/final/TAmount.js +1 -0
  28. package/dist/esm/dt/final/TCountryISO3166Alpha2.js +1 -0
  29. package/dist/esm/dt/final/TCurrencyISO4217.js +1 -0
  30. package/dist/esm/dt/final/TDateTimeFormat.js +1 -0
  31. package/dist/esm/dt/final/TEmail.js +2 -0
  32. package/dist/esm/dt/final/TEmoji.js +4 -0
  33. package/dist/esm/dt/final/TFile.js +3 -0
  34. package/dist/esm/dt/final/THostAddress.js +2 -0
  35. package/dist/esm/dt/final/TIPv6.js +1 -0
  36. package/dist/esm/dt/final/TJWT.js +8 -0
  37. package/dist/esm/dt/final/TPercentage.js +5 -0
  38. package/dist/esm/dt/final/TSQLQuery.js +1 -0
  39. package/dist/esm/dt/final/TSSHPrivateKey.js +3 -1
  40. package/dist/esm/dt/final/TSemVerVersion.js +1 -0
  41. package/dist/esm/dt/final/TShellCommand.js +1 -0
  42. package/dist/esm/dt/final/TURL.js +2 -0
  43. package/dist/esm/dt/final/TUUID.js +1 -0
  44. package/dist/esm/dt/final/TYesNo.js +1 -1
  45. package/dist/esm/dt/index.d.ts +1 -1
  46. package/dist/esm/i18n/WordingManager.d.ts +16 -0
  47. package/dist/esm/i18n/types.d.ts +5 -0
  48. package/dist/esm/icon/Icon.d.ts +7 -0
  49. package/dist/esm/index.d.ts +3 -0
  50. package/dist/esm/index.js +4 -0
  51. package/dist/esm/index.node.d.ts +1 -0
  52. package/dist/esm/index.node.js +1 -0
  53. package/dist/esm/index.react.d.ts +1 -1
  54. package/dist/esm/product/manifest.d.ts +15 -0
  55. package/dist/esm/products/Helper/container.js +4 -0
  56. package/dist/esm/products/Helper/index.js +5 -0
  57. package/dist/esm/products/Helper/manifest.d.ts +6 -1
  58. package/dist/esm/std/BufferManager.d.ts +18 -0
  59. package/dist/esm/std/ClockManager.d.ts +5 -0
  60. package/dist/esm/std/EnvironmentManager.d.ts +10 -0
  61. package/dist/esm/std/HTTPAPICaller.d.ts +6 -0
  62. package/dist/esm/std/I18nManager.d.ts +26 -0
  63. package/dist/esm/std/JWTManager.d.ts +26 -0
  64. package/dist/esm/std/JobManager.d.ts +6 -0
  65. package/dist/esm/std/LLMManager.d.ts +25 -0
  66. package/dist/esm/std/LLMManager.js +1 -0
  67. package/dist/esm/std/PromptManager.d.ts +8 -0
  68. package/dist/esm/std/SettingsManager.d.ts +19 -0
  69. package/dist/esm/std/SettingsManager.js +9 -0
  70. package/dist/esm/std/ShellCommandExecutor.d.ts +19 -0
  71. package/dist/esm/std/ShellCommandExecutor.js +1 -0
  72. package/dist/esm/std/impl/ConsoleLogger.js +7 -1
  73. package/dist/esm/std/impl/FakeEmailManager.js +1 -0
  74. package/dist/esm/std/impl/FakeJobManager.js +1 -0
  75. package/dist/esm/std/impl/FetchHTTPAPICallExecutor.d.ts +9 -0
  76. package/dist/esm/std/impl/FetchHTTPAPICallExecutor.js +11 -0
  77. package/dist/esm/std/impl/MistralAILLMManager.d.ts +17 -0
  78. package/dist/esm/std/impl/MistralAILLMManager.js +56 -0
  79. package/dist/esm/std/impl/NodeCryptoManager.js +6 -1
  80. package/dist/esm/std/impl/NodeDeterministicCryptoManager.d.ts +14 -0
  81. package/dist/esm/std/impl/NodeDeterministicCryptoManager.js +17 -3
  82. package/dist/esm/std/impl/NodeFSManager.js +10 -0
  83. package/dist/esm/std/impl/NodeHTTPAPICallExecutorAgentBuilder.js +2 -0
  84. package/dist/esm/std/impl/NodePromptManager.js +3 -0
  85. package/dist/esm/std/impl/NodeSpawnShellCommandExecutor.d.ts +4 -0
  86. package/dist/esm/std/impl/NodeSpawnShellCommandExecutor.js +41 -0
  87. package/dist/esm/std/impl/OllamaLLMManager.d.ts +20 -0
  88. package/dist/esm/std/impl/OllamaLLMManager.js +56 -0
  89. package/dist/esm/std/impl/OpenAILLMManager.d.ts +17 -0
  90. package/dist/esm/std/impl/OpenAILLMManager.js +51 -0
  91. package/dist/esm/std/impl/SimpleHTTPAPICaller.js +14 -0
  92. package/dist/esm/std/impl/SimpleMapI18nManager.js +4 -2
  93. package/dist/esm/std/impl/StdDateClockManager.js +3 -0
  94. package/dist/esm/std/impl/UCDataStoreExternalResourceManager.js +3 -0
  95. package/dist/esm/std/impl/WebCryptoManager.js +9 -0
  96. package/dist/esm/std/index.d.ts +2 -0
  97. package/dist/esm/std/index.js +2 -0
  98. package/dist/esm/target/lib/cli/renderer.js +3 -0
  99. package/dist/esm/target/lib/client/consts.d.ts +3 -0
  100. package/dist/esm/target/lib/client/consts.js +3 -0
  101. package/dist/esm/target/lib/mcp-server/MCPServerBooter.js +1 -0
  102. package/dist/esm/target/lib/react/UCContainer.js +1 -0
  103. package/dist/esm/target/lib/react/UCPanel.js +4 -0
  104. package/dist/esm/target/lib/react/form.d.ts +26 -2
  105. package/dist/esm/target/lib/react/form.js +18 -1
  106. package/dist/esm/target/lib/react/useUC.d.ts +8 -0
  107. package/dist/esm/target/lib/react/useUC.js +22 -0
  108. package/dist/esm/target/lib/react/useUCOR.d.ts +15 -0
  109. package/dist/esm/target/lib/react/useUCOR.js +45 -0
  110. package/dist/esm/target/lib/rn/input.d.ts +7 -0
  111. package/dist/esm/target/lib/rn/input.js +2 -0
  112. package/dist/esm/target/lib/server/AuthenticationChecker.js +2 -1
  113. package/dist/esm/target/lib/server/BasicAuthenticationChecker.js +1 -0
  114. package/dist/esm/target/lib/server/CSPDirectivesBuilder.js +13 -0
  115. package/dist/esm/target/lib/server/CustomerFacingErrorBuilder.js +3 -0
  116. package/dist/esm/target/lib/server/PrivateApiKeyAuthenticationChecker.js +1 -0
  117. package/dist/esm/target/lib/server/PublicApiKeyChecker.js +1 -1
  118. package/dist/esm/target/lib/server/RequestChecker.js +5 -4
  119. package/dist/esm/target/lib/server/RequestHandler.d.ts +5 -0
  120. package/dist/esm/target/lib/server/RequestLogger.js +5 -0
  121. package/dist/esm/target/lib/server/ServerManager.d.ts +19 -0
  122. package/dist/esm/target/lib/server/consts.d.ts +3 -0
  123. package/dist/esm/target/lib/server/consts.js +3 -0
  124. package/dist/esm/target/lib/web/input.d.ts +21 -0
  125. package/dist/esm/target/lib/web/input.js +4 -0
  126. package/dist/esm/target/node-core-cli/NodeCoreCLIManager.js +2 -2
  127. package/dist/esm/target/node-express-server/NodeExpressServerManager.js +5 -0
  128. package/dist/esm/target/node-express-server/lib/AuthCookieCreator.js +1 -1
  129. package/dist/esm/target/node-express-server/middlewares/AuthenticationCheckerMiddlewareBuilder.js +1 -0
  130. package/dist/esm/target/node-express-server/middlewares/PublicApiKeyCheckerMiddlewareBuilder.js +1 -0
  131. package/dist/esm/target/node-express-server/middlewares/RequestCheckerMiddlewareBuilder.js +1 -0
  132. package/dist/esm/target/node-express-server/middlewares/RequestHandlerMiddlewareBuilder.js +8 -0
  133. package/dist/esm/target/node-express-server/middlewares/RequestLoggerMiddlewareBuilder.js +1 -0
  134. package/dist/esm/target/node-mcp-server/NodeLocalStdioMCPServerManager.d.ts +10 -0
  135. package/dist/esm/target/node-mcp-server/NodeLocalStdioMCPServerManager.js +14 -0
  136. package/dist/esm/target/react-native-pure/UCForm.js +2 -2
  137. package/dist/esm/target/react-native-pure/UCFormField.d.ts +2 -9
  138. package/dist/esm/target/react-native-pure/UCFormField.js +9 -20
  139. package/dist/esm/target/react-native-pure/UCFormFieldControl.d.ts +3 -10
  140. package/dist/esm/target/react-native-pure/UCFormFieldControl.js +9 -8
  141. package/dist/esm/target/react-native-pure/UCFormFieldDesc.d.ts +2 -5
  142. package/dist/esm/target/react-native-pure/UCFormFieldDesc.js +2 -2
  143. package/dist/esm/target/react-native-pure/UCFormFieldErr.d.ts +2 -6
  144. package/dist/esm/target/react-native-pure/UCFormFieldLabel.d.ts +2 -5
  145. package/dist/esm/target/react-native-pure/UCFormFieldLabel.js +2 -2
  146. package/dist/esm/target/react-native-pure/UCFormSubmitControl.d.ts +2 -7
  147. package/dist/esm/target/react-native-pure/UCFormSubmitControl.js +1 -1
  148. package/dist/esm/target/react-web-pure/UCForm.js +1 -1
  149. package/dist/esm/target/react-web-pure/UCFormField.d.ts +2 -9
  150. package/dist/esm/target/react-web-pure/UCFormField.js +9 -20
  151. package/dist/esm/target/react-web-pure/UCFormFieldControl.d.ts +3 -10
  152. package/dist/esm/target/react-web-pure/UCFormFieldControl.js +20 -5
  153. package/dist/esm/target/react-web-pure/UCFormFieldDesc.d.ts +2 -5
  154. package/dist/esm/target/react-web-pure/UCFormFieldDesc.js +2 -2
  155. package/dist/esm/target/react-web-pure/UCFormFieldErr.d.ts +2 -6
  156. package/dist/esm/target/react-web-pure/UCFormFieldLabel.d.ts +2 -5
  157. package/dist/esm/target/react-web-pure/UCFormFieldLabel.js +3 -3
  158. package/dist/esm/target/react-web-pure/UCFormSubmitControl.d.ts +2 -4
  159. package/dist/esm/target/react-web-pure/UCFormSubmitControl.js +1 -1
  160. package/dist/esm/testing/AppTester.d.ts +4 -0
  161. package/dist/esm/testing/AppTester.js +16 -0
  162. package/dist/esm/testing/AppTesterConfigurator.d.ts +68 -0
  163. package/dist/esm/testing/UCDataStoreTester.d.ts +9 -0
  164. package/dist/esm/testing/UCDataStoreTester.js +13 -0
  165. package/dist/esm/testing/impl/SimpleAppDocsEmitter.js +22 -2
  166. package/dist/esm/testing/impl/SimpleAppTesterConfigurator.js +1 -0
  167. package/dist/esm/testing/impl/SimpleHTMLAppTestReportEmitter.js +9 -3
  168. package/dist/esm/testing/impl/TypeScriptLibUCDefASTParser.js +12 -4
  169. package/dist/esm/testing/impl/VitestAppTestSuiteEmitter.js +6 -0
  170. package/dist/esm/testing/opts.d.ts +38 -0
  171. package/dist/esm/testing/opts.js +1 -1
  172. package/dist/esm/testing/uc-input.js +2 -0
  173. package/dist/esm/testing/workers/AppTesterCtxInitializer.js +7 -0
  174. package/dist/esm/testing/workers/UCExecutor.js +1 -0
  175. package/dist/esm/testing/workers/checkers/AppIndexChecker.js +1 -0
  176. package/dist/esm/testing/workers/checkers/UCDefSourcesChecker.js +4 -0
  177. package/dist/esm/uc/UC.js +19 -1
  178. package/dist/esm/uc/UCInputField.d.ts +28 -0
  179. package/dist/esm/uc/UCInputField.js +42 -0
  180. package/dist/esm/uc/data.d.ts +3 -0
  181. package/dist/esm/uc/def.d.ts +7 -0
  182. package/dist/esm/uc/exec.d.ts +39 -0
  183. package/dist/esm/uc/exec.js +29 -0
  184. package/dist/esm/uc/ext.d.ts +30 -1
  185. package/dist/esm/uc/helpers/UCOutputBuilder.js +5 -0
  186. package/dist/esm/uc/helpers/UCOutputReader.js +3 -1
  187. package/dist/esm/uc/impl/HTTPUCTransporter.js +4 -0
  188. package/dist/esm/uc/impl/InMemoryUCDataStore.js +7 -0
  189. package/dist/esm/uc/impl/KnexUCDataStore.d.ts +4 -0
  190. package/dist/esm/uc/impl/KnexUCDataStore.js +14 -0
  191. package/dist/esm/uc/impl/SimpleUCManager.js +6 -0
  192. package/dist/esm/uc/input-field.d.ts +60 -0
  193. package/dist/esm/uc/input-field.js +33 -0
  194. package/dist/esm/uc/input.d.ts +24 -0
  195. package/dist/esm/uc/lifecycle/client/IdleClientMain.js +1 -0
  196. package/dist/esm/uc/lifecycle/server/IdleServerMain.js +2 -0
  197. package/dist/esm/uc/manager.d.ts +11 -0
  198. package/dist/esm/uc/metadata.d.ts +10 -0
  199. package/dist/esm/uc/opi-layout.d.ts +3 -0
  200. package/dist/esm/uc/opi.d.ts +8 -0
  201. package/dist/esm/uc/output-field.d.ts +9 -0
  202. package/dist/esm/uc/output-part.d.ts +22 -0
  203. package/dist/esm/uc/output.d.ts +3 -0
  204. package/dist/esm/uc/policies/RoleRegularUCPolicy.js +1 -0
  205. package/dist/esm/uc/policies/funcs.js +1 -0
  206. package/dist/esm/uc/policy.d.ts +22 -0
  207. package/dist/esm/uc/sec.d.ts +9 -0
  208. package/dist/esm/uc/server.d.ts +10 -0
  209. package/dist/esm/uc/settings.d.ts +25 -0
  210. package/dist/esm/uc/side-effect.d.ts +16 -0
  211. package/dist/esm/uc/side-effect.js +16 -0
  212. package/dist/esm/uc/utils/rInput.d.ts +12 -0
  213. package/dist/esm/uc/utils/rInput.js +2 -0
  214. package/dist/esm/uc/utils/rVal.d.ts +25 -0
  215. package/dist/esm/uc/utils/rVal.js +27 -0
  216. package/dist/esm/uc/utils/recIs.d.ts +9 -0
  217. package/dist/esm/uc/utils/recIs.js +12 -1
  218. package/dist/esm/uc/utils/stripUCDLifecycleServer.d.ts +13 -0
  219. package/dist/esm/uc/utils/stripUCDLifecycleServer.js +17 -0
  220. package/dist/esm/uc/utils/ucifcoIsForArray.d.ts +6 -0
  221. package/dist/esm/uc/utils/ucifcoIsForArray.js +6 -0
  222. package/dist/esm/uc/workers/SimpleAggregateFinder.d.ts +12 -0
  223. package/dist/esm/uc/workers/SimpleAggregateFinder.js +12 -0
  224. package/dist/esm/uc/workers/UCBuilder.d.ts +7 -0
  225. package/dist/esm/uc/workers/UCBuilder.js +7 -0
  226. package/dist/esm/uc/workers/UCExecChecker.js +2 -0
  227. package/dist/esm/uc/workers/UCInputFilesProcessor.js +10 -4
  228. package/dist/esm/uc/workers/UCOutputFilesProcessor.js +6 -2
  229. package/dist/esm/utils/async/sleep.d.ts +10 -0
  230. package/dist/esm/utils/async/sleep.js +10 -0
  231. package/dist/esm/utils/http/appendData.js +5 -1
  232. package/dist/esm/utils/ioc/ContainerPrinter.js +2 -0
  233. package/dist/esm/utils/ioc/bindCommon.js +4 -0
  234. package/dist/esm/utils/ioc/bindNodeCLI.js +2 -0
  235. package/dist/esm/utils/ioc/bindNodeCore.js +1 -0
  236. package/dist/esm/utils/ioc/bindProduct.js +2 -0
  237. package/dist/esm/utils/ioc/bindRN.js +1 -0
  238. package/dist/esm/utils/ioc/bindServer.js +1 -0
  239. package/dist/esm/utils/ioc/bindWeb.js +2 -0
  240. package/dist/esm/utils/ioc/container.js +6 -0
  241. package/dist/esm/utils/numbers/units.js +3 -0
  242. package/dist/esm/utils/types/funcs.d.ts +35 -0
  243. package/dist/esm/utils/types/funcs.js +35 -0
  244. package/dist/esm/utils/types/utility-types.d.ts +17 -0
  245. package/dist/esm/utils/types/utility-types.js +1 -0
  246. package/package.json +13 -14
@@ -0,0 +1 @@
1
+ export {};
@@ -1,4 +1,12 @@
1
1
  export interface PromptManagerPromptOpts<T extends string> {
2
+ /**
3
+ * Predicate to validate the input
4
+ *
5
+ * It keeps asking while the value is not valid, unless the user presses `Ctrl+C`.
6
+ *
7
+ * @param value
8
+ * @returns
9
+ */
2
10
  validate?: (value: T) => Promise<boolean>;
3
11
  }
4
12
  export interface PromptManager {
@@ -1,10 +1,29 @@
1
+ /**
2
+ * Placeholder for string settings that must be defined explicitly at runtime (e.g. secrets).
3
+ */
1
4
  export declare const SettingsManagerMandatoryPlaceholder = "!<>!";
5
+ /**
6
+ * Placeholder for array settings that must be defined explicitly at runtime (e.g. secrets).
7
+ */
2
8
  export declare const SettingsManagerMandatoryPlaceholderForArray: string[];
9
+ /**
10
+ * Placeholder for object settings that must be defined explicitly at runtime (e.g. secrets).
11
+ */
3
12
  export declare const SettingsManagerMandatoryPlaceholderForObject: {
4
13
  '0': string;
5
14
  };
15
+ /**
16
+ * A group of settings
17
+ *
18
+ * Prefix them with the thing that is configurable to avoid conflicts when defining settings together for a product and/or a target.
19
+ */
6
20
  export interface Settings {
7
21
  }
22
+ /**
23
+ * Interface to implement by the classes that needs settings
24
+ *
25
+ * As `S`, pass the subset of settings that the class needs (e.g. `Pick<SomeSettings, 'setting_1'>`).
26
+ */
8
27
  export interface Configurable<S> {
9
28
  s(): S;
10
29
  }
@@ -1,7 +1,16 @@
1
+ /**
2
+ * Placeholder for string settings that must be defined explicitly at runtime (e.g. secrets).
3
+ */
1
4
  export const SettingsManagerMandatoryPlaceholder = '!<>!';
5
+ /**
6
+ * Placeholder for array settings that must be defined explicitly at runtime (e.g. secrets).
7
+ */
2
8
  export const SettingsManagerMandatoryPlaceholderForArray = [
3
9
  SettingsManagerMandatoryPlaceholder,
4
10
  ];
11
+ /**
12
+ * Placeholder for object settings that must be defined explicitly at runtime (e.g. secrets).
13
+ */
5
14
  export const SettingsManagerMandatoryPlaceholderForObject = {
6
15
  '0': SettingsManagerMandatoryPlaceholder,
7
16
  };
@@ -0,0 +1,19 @@
1
+ import type { FilePath } from '../dt/index.js';
2
+ import type { Worker } from './Worker.js';
3
+ export type ShellCommandExecutorCommandArg = string;
4
+ export type ShellCommandExecutorCommandBin = 'docker' | 'file' | 'git' | 'open' | 'ssh-keygen' | 'ssh-keyscan' | 'unzip' | 'yarn' | 'zip' | (string & {});
5
+ export type ShellCommandExecutorEnv = Record<string, string>;
6
+ export type ShellCommandExecutorInstruction = string;
7
+ export type ShellCommandExecutorScript = string;
8
+ export type ShellCommandExecutorShebang = '#!/bin/bash';
9
+ export interface ShellCommandExecutorInput {
10
+ bin: ShellCommandExecutorCommandBin;
11
+ opts?: {
12
+ args?: ShellCommandExecutorCommandArg[];
13
+ cwd?: FilePath;
14
+ env?: ShellCommandExecutorEnv;
15
+ };
16
+ }
17
+ export type ShellCommandExecutorOutput = string;
18
+ export interface ShellCommandExecutor extends Worker<ShellCommandExecutorInput, Promise<ShellCommandExecutorOutput>> {
19
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -15,6 +15,7 @@ import { inject, injectable } from 'inversify';
15
15
  let ConsoleLogger = class ConsoleLogger {
16
16
  static { ConsoleLogger_1 = this; }
17
17
  settingsManager;
18
+ // Ordered by level
18
19
  static LEVELS = [
19
20
  'trace',
20
21
  'debug',
@@ -34,30 +35,35 @@ let ConsoleLogger = class ConsoleLogger {
34
35
  if (!this.shouldLog('debug')) {
35
36
  return;
36
37
  }
38
+ // biome-ignore lint/suspicious/noConsole: we want it
37
39
  console.debug(`${this.t()} [debug] ${message}`, ...meta);
38
40
  }
39
41
  error(err) {
40
42
  if (!this.shouldLog('error')) {
41
43
  return;
42
44
  }
45
+ // biome-ignore lint/suspicious/noConsole: we want it
43
46
  console.error(err);
44
47
  }
45
48
  info(message, ...meta) {
46
49
  if (!this.shouldLog('info')) {
47
50
  return;
48
51
  }
52
+ // biome-ignore lint/suspicious/noConsole: we want it
49
53
  console.info(`${this.t()} [info] ${message}`, ...meta);
50
54
  }
51
55
  trace(message, ...meta) {
52
56
  if (!this.shouldLog('trace')) {
53
57
  return;
54
58
  }
55
- console.debug(`${this.t()} [trace] ${message}`, ...meta);
59
+ // biome-ignore lint/suspicious/noConsole: we want it
60
+ console.trace(`${this.t()} [trace] ${message}`, ...meta);
56
61
  }
57
62
  warn(message, ...meta) {
58
63
  if (!this.shouldLog('warn')) {
59
64
  return;
60
65
  }
66
+ // biome-ignore lint/suspicious/noConsole: we want it
61
67
  console.warn(`${this.t()} [warn] ${message}`, ...meta);
62
68
  }
63
69
  shouldLog(level) {
@@ -20,6 +20,7 @@ let FakeEmailManager = class FakeEmailManager {
20
20
  this.entries.push({ def, replyTo, to });
21
21
  }
22
22
  async verify() {
23
+ // Nothing to do
23
24
  }
24
25
  };
25
26
  FakeEmailManager = __decorate([
@@ -20,6 +20,7 @@ let FakeJobManager = class FakeJobManager {
20
20
  this.entries.push({ input, jobName, queueName });
21
21
  }
22
22
  async init() {
23
+ // Nothing to do
23
24
  }
24
25
  };
25
26
  FakeJobManager = __decorate([
@@ -1,4 +1,13 @@
1
1
  import type { HTTPAPICallExecutor, HTTPAPICallExecutorFunc } from '../HTTPAPICallExecutor.js';
2
+ /**
3
+ * Nowadays, most platforms include it as a global :
4
+ *
5
+ * - Node : https://nodejs.org/api/globals.html#fetch
6
+ * - RN : https://reactnative.dev/docs/network#using-fetch
7
+ * - Web : https://developer.mozilla.org/fr/docs/Web/API/Fetch_API
8
+ *
9
+ * So we should be safe using it almost everywhere.
10
+ */
2
11
  export declare class FetchHTTPAPICallExecutor implements HTTPAPICallExecutor {
3
12
  fn<Res>(): HTTPAPICallExecutorFunc<Res>;
4
13
  }
@@ -5,8 +5,19 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
5
5
  return c > 3 && r && Object.defineProperty(target, key, r), r;
6
6
  };
7
7
  import { injectable } from 'inversify';
8
+ /**
9
+ * Nowadays, most platforms include it as a global :
10
+ *
11
+ * - Node : https://nodejs.org/api/globals.html#fetch
12
+ * - RN : https://reactnative.dev/docs/network#using-fetch
13
+ * - Web : https://developer.mozilla.org/fr/docs/Web/API/Fetch_API
14
+ *
15
+ * So we should be safe using it almost everywhere.
16
+ */
8
17
  let FetchHTTPAPICallExecutor = class FetchHTTPAPICallExecutor {
9
18
  fn() {
19
+ // The generalization in HTTPAPICallExecutor is not exactly the same as the actual implementation
20
+ // @ts-ignore
10
21
  return fetch;
11
22
  }
12
23
  };
@@ -0,0 +1,17 @@
1
+ import type { ApiKey } from '../../dt/index.js';
2
+ import type { HTTPAPICaller } from '../HTTPAPICaller.js';
3
+ import type { LLMManager, LLMManagerSendReq, LLMManagerSendRes } from '../LLMManager.js';
4
+ import type { Configurable, Settings, SettingsManager } from '../SettingsManager.js';
5
+ export interface MistralAILLMManagerSettings extends Settings {
6
+ mai_api_key: ApiKey;
7
+ }
8
+ type S = MistralAILLMManagerSettings;
9
+ export declare class MistralAILLMManager implements Configurable<S>, LLMManager {
10
+ private httpAPICaller;
11
+ private settingsManager;
12
+ private static BASE_URL;
13
+ constructor(httpAPICaller: HTTPAPICaller, settingsManager: SettingsManager<S>);
14
+ s(): MistralAILLMManagerSettings;
15
+ send(req: LLMManagerSendReq): Promise<LLMManagerSendRes>;
16
+ }
17
+ export {};
@@ -0,0 +1,56 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
11
+ return function (target, key) { decorator(target, key, paramIndex); }
12
+ };
13
+ var MistralAILLMManager_1;
14
+ import { inject, injectable } from 'inversify';
15
+ let MistralAILLMManager = class MistralAILLMManager {
16
+ static { MistralAILLMManager_1 = this; }
17
+ httpAPICaller;
18
+ settingsManager;
19
+ static BASE_URL = 'https://api.mistral.ai/v1';
20
+ constructor(httpAPICaller, settingsManager) {
21
+ this.httpAPICaller = httpAPICaller;
22
+ this.settingsManager = settingsManager;
23
+ }
24
+ s() {
25
+ return {
26
+ mai_api_key: this.settingsManager.get()('mai_api_key'),
27
+ };
28
+ }
29
+ async send(req) {
30
+ return await this.httpAPICaller.exec({
31
+ authorizationHeader: {
32
+ value: this.s().mai_api_key,
33
+ prefix: 'Bearer',
34
+ },
35
+ errBuilder: async (error) => {
36
+ if ('message' in error) {
37
+ return error.message;
38
+ }
39
+ return error.detail.map((d) => d.msg).join('\n');
40
+ },
41
+ method: 'POST',
42
+ req: {
43
+ envelope: 'json',
44
+ builder: async () => req,
45
+ },
46
+ urlBuilder: async () => `${MistralAILLMManager_1.BASE_URL}/chat/completions`,
47
+ });
48
+ }
49
+ };
50
+ MistralAILLMManager = MistralAILLMManager_1 = __decorate([
51
+ injectable(),
52
+ __param(0, inject('HTTPAPICaller')),
53
+ __param(1, inject('SettingsManager')),
54
+ __metadata("design:paramtypes", [Object, Object])
55
+ ], MistralAILLMManager);
56
+ export { MistralAILLMManager };
@@ -7,10 +7,13 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
7
7
  import crypto from 'node:crypto';
8
8
  import { promisify } from 'node:util';
9
9
  import { injectable } from 'inversify';
10
+ // https://nodejs.org/api/crypto.html#cryptopbkdf2password-salt-iterations-keylen-digest-callback
10
11
  const pbkdf2 = promisify(crypto.pbkdf2);
12
+ // https://nodejs.org/api/crypto.html#cryptoscryptpassword-salt-keylen-options-callback
11
13
  const scrypt = promisify(crypto.scrypt);
12
14
  let NodeCryptoManager = class NodeCryptoManager {
13
15
  async clear() {
16
+ // Nothing to do
14
17
  }
15
18
  hash(algorithm, base, binaryToTextEncoding) {
16
19
  return crypto
@@ -35,9 +38,11 @@ let NodeCryptoManager = class NodeCryptoManager {
35
38
  return Uint8Array.from(result);
36
39
  }
37
40
  async randomString(length) {
41
+ // Not perfect in terms of randomness (because of Math.random() but pretty fine for now)
38
42
  let res = '';
39
43
  while (res.length < length) {
40
44
  const next = Math.random().toString(36).slice(2, 3);
45
+ // For now, we want only chars at the beginning, so it can be used as an identifier (i.e. in a database)
41
46
  if (res.length === 0 &&
42
47
  Number.isInteger(Number.parseInt(next, 10))) {
43
48
  continue;
@@ -50,7 +55,7 @@ let NodeCryptoManager = class NodeCryptoManager {
50
55
  return crypto.randomUUID();
51
56
  }
52
57
  async scrypt(password, salt, keyLength) {
53
- const buffer = (await scrypt(password, salt, keyLength));
58
+ const buffer = (await scrypt(password, salt, keyLength)); // Forced to cast because it seems to be not typed correctly
54
59
  return buffer.toString('hex');
55
60
  }
56
61
  };
@@ -1,6 +1,20 @@
1
1
  import type { UIntQuantity, UUID } from '../../dt/index.js';
2
2
  import type { CryptoManagerRandomString } from '../CryptoManager.js';
3
3
  import { NodeCryptoManager } from './NodeCryptoManager.js';
4
+ /**
5
+ * A deterministic {@link CryptoManager} based on {@link NodeCryptoManager}
6
+ *
7
+ * The main purpose is to have an implementation that generates always the
8
+ * same data deterministically to make snapshot assertions in tests easier.
9
+ *
10
+ * WARNING : it keeps internal "seeds" to generate always the same data.
11
+ *
12
+ * In our case, it's an auto-incremented integer.
13
+ *
14
+ * So if the same implementation is used in multiple places
15
+ * (e.g. in concurrent tests within the same test suite),
16
+ * be ready for "race conditions" and inconsistencies.
17
+ */
4
18
  export declare class NodeDeterministicCryptoManager extends NodeCryptoManager {
5
19
  private randomStringIdx;
6
20
  private uuidIdx;
@@ -7,6 +7,20 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
7
7
  import { createHash } from 'node:crypto';
8
8
  import { injectable } from 'inversify';
9
9
  import { NodeCryptoManager } from './NodeCryptoManager.js';
10
+ /**
11
+ * A deterministic {@link CryptoManager} based on {@link NodeCryptoManager}
12
+ *
13
+ * The main purpose is to have an implementation that generates always the
14
+ * same data deterministically to make snapshot assertions in tests easier.
15
+ *
16
+ * WARNING : it keeps internal "seeds" to generate always the same data.
17
+ *
18
+ * In our case, it's an auto-incremented integer.
19
+ *
20
+ * So if the same implementation is used in multiple places
21
+ * (e.g. in concurrent tests within the same test suite),
22
+ * be ready for "race conditions" and inconsistencies.
23
+ */
10
24
  let NodeDeterministicCryptoManager = class NodeDeterministicCryptoManager extends NodeCryptoManager {
11
25
  randomStringIdx = 0;
12
26
  uuidIdx = 0;
@@ -33,14 +47,14 @@ let NodeDeterministicCryptoManager = class NodeDeterministicCryptoManager extend
33
47
  const hashBytes = hash.digest().subarray(0, 16);
34
48
  const bytes = Array.from(hashBytes);
35
49
  if (bytes[6] !== undefined) {
36
- bytes[6] = (bytes[6] & 0x0f) | 0x40;
50
+ bytes[6] = (bytes[6] & 0x0f) | 0x40; // Set the version to 4 (UUID v4)
37
51
  }
38
52
  if (bytes[8] !== undefined) {
39
- bytes[8] = (bytes[8] & 0x3f) | 0x80;
53
+ bytes[8] = (bytes[8] & 0x3f) | 0x80; // Set the variant to the correct RFC 4122 variant
40
54
  }
41
55
  const raw = bytes
42
56
  .map((byte) => {
43
- return (byte + 0x1_00).toString(16).substring(1);
57
+ return (byte + 0x1_00).toString(16).substring(1); // Convert byte to hex
44
58
  })
45
59
  .join('');
46
60
  const uuid = [
@@ -13,6 +13,9 @@ let NodeFSManager = class NodeFSManager {
13
13
  return true;
14
14
  }
15
15
  async cat(path, opts) {
16
+ // Be careful : omitting to pass an encoding makes it return a Buffer and not a string
17
+ // This can be problematic in some callers, manipulating the file as a string (e.g. startsWith, includes, etc.)
18
+ // So make sure to fallback on a default encoding
16
19
  return readFile(path, opts?.encoding ?? 'utf8');
17
20
  }
18
21
  async chmod(path, mode) {
@@ -25,6 +28,8 @@ let NodeFSManager = class NodeFSManager {
25
28
  await appendFile(src, content);
26
29
  }
27
30
  async exists(path) {
31
+ // Before, we could use fs.exists(path) but it's been deprecated : @deprecated since v1.0.0 Use `fs.stat()` or `fs.access()` instead
32
+ // Both functions are very unpractical to use because we need to wrap everything in a try/catch. It's too verbose !
28
33
  try {
29
34
  await stat(path);
30
35
  return true;
@@ -45,6 +50,11 @@ let NodeFSManager = class NodeFSManager {
45
50
  const parsedPath = parse(path);
46
51
  const stats = await stat(path);
47
52
  const { birthtime, size } = stats;
53
+ // For now there is nothing in the standard library to detect it.
54
+ // There are 3rd party packages like mime, mime-type, etc. but we prefer
55
+ // limiting the external dependencies.
56
+ // One can also call `file -b --mime-type /some/path` via exec/spawn if their
57
+ // system has this utility.
48
58
  const mimeType = null;
49
59
  const type = this.determineType(stats);
50
60
  return {
@@ -21,6 +21,8 @@ let NodeHTTPAPICallExecutorAgentBuilder = class NodeHTTPAPICallExecutorAgentBuil
21
21
  exec({ url, }) {
22
22
  if (url.protocol.startsWith('https')) {
23
23
  return new https.Agent({
24
+ // We allow self-signed certificates in non-prod environments
25
+ // This is useful when testing the CLI calling a the server from a docker container for example
24
26
  rejectUnauthorized: this.environmentManager.isProd(),
25
27
  });
26
28
  }
@@ -9,10 +9,13 @@ import { createInterface } from 'node:readline/promises';
9
9
  import { injectable } from 'inversify';
10
10
  let NodePromptManager = class NodePromptManager {
11
11
  async prompt(invite, opts) {
12
+ // TODO : Add keypress handling to hide when sensitive data is typed
12
13
  const readLine = createInterface({
13
14
  input: stdin,
14
15
  output: stdout,
15
16
  });
17
+ // To avoid "Warning: Detected unsettled top-level await at file:///[...]/dist/esm/xxx.js"
18
+ // when pressing Ctrl+C while being prompted
16
19
  readLine.on('SIGINT', () => {
17
20
  readLine.close();
18
21
  process.exit(0);
@@ -0,0 +1,4 @@
1
+ import type { ShellCommandExecutor, ShellCommandExecutorInput, ShellCommandExecutorOutput } from '../ShellCommandExecutor.js';
2
+ export declare class NodeSpawnShellCommandExecutor implements ShellCommandExecutor {
3
+ exec({ bin, opts, }: ShellCommandExecutorInput): Promise<ShellCommandExecutorOutput>;
4
+ }
@@ -0,0 +1,41 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { spawn } from 'node:child_process';
8
+ import { injectable } from 'inversify';
9
+ let NodeSpawnShellCommandExecutor = class NodeSpawnShellCommandExecutor {
10
+ async exec({ bin, opts, }) {
11
+ return new Promise((resolve, reject) => {
12
+ let stderr = '';
13
+ let stdout = '';
14
+ const proc = spawn(bin, opts?.args || [], {
15
+ cwd: opts?.cwd,
16
+ env: opts?.env,
17
+ });
18
+ proc.stderr.on('data', (chunk) => {
19
+ stderr += chunk;
20
+ });
21
+ proc.stdout.on('data', (chunk) => {
22
+ stdout += chunk;
23
+ });
24
+ proc.stdout.on('error', (err) => {
25
+ reject(err);
26
+ });
27
+ proc.on('close', (code, signal) => {
28
+ if (code === 0) {
29
+ resolve(stdout);
30
+ }
31
+ else {
32
+ reject(new Error(`Command failed with exit code (${code}), signal (${signal}), stderr (${stderr}) stdout (${stdout})`));
33
+ }
34
+ });
35
+ });
36
+ }
37
+ };
38
+ NodeSpawnShellCommandExecutor = __decorate([
39
+ injectable()
40
+ ], NodeSpawnShellCommandExecutor);
41
+ export { NodeSpawnShellCommandExecutor };
@@ -0,0 +1,20 @@
1
+ import type { URL } from '../../dt/index.js';
2
+ import type { HTTPAPICaller } from '../HTTPAPICaller.js';
3
+ import type { LLMManager, LLMManagerSendReq, LLMManagerSendRes } from '../LLMManager.js';
4
+ import type { Configurable, Settings, SettingsManager } from '../SettingsManager.js';
5
+ /**
6
+ * Unlike the "commercial" APIs, Ollama does not secure the API with an API key
7
+ * @see https://github.com/ollama/ollama/issues/849
8
+ */
9
+ export interface OllamaLLMManagerSettings extends Settings {
10
+ oll_base_url: URL;
11
+ }
12
+ type S = OllamaLLMManagerSettings;
13
+ export declare class OllamaLLMManager implements Configurable<S>, LLMManager {
14
+ private httpAPICaller;
15
+ private settingsManager;
16
+ constructor(httpAPICaller: HTTPAPICaller, settingsManager: SettingsManager<S>);
17
+ s(): OllamaLLMManagerSettings;
18
+ send(req: LLMManagerSendReq): Promise<LLMManagerSendRes>;
19
+ }
20
+ export {};
@@ -0,0 +1,56 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
11
+ return function (target, key) { decorator(target, key, paramIndex); }
12
+ };
13
+ import { inject, injectable } from 'inversify';
14
+ import { IllegalArgumentError } from '../../error/index.js';
15
+ let OllamaLLMManager = class OllamaLLMManager {
16
+ httpAPICaller;
17
+ settingsManager;
18
+ constructor(httpAPICaller, settingsManager) {
19
+ this.httpAPICaller = httpAPICaller;
20
+ this.settingsManager = settingsManager;
21
+ }
22
+ s() {
23
+ return {
24
+ oll_base_url: this.settingsManager.get()('oll_base_url'),
25
+ };
26
+ }
27
+ async send(req) {
28
+ const firstMessage = req.messages[0];
29
+ if (!firstMessage) {
30
+ throw new IllegalArgumentError('Please provide at least one message');
31
+ }
32
+ return await this.httpAPICaller.exec({
33
+ errBuilder: async (error) => error.error,
34
+ method: 'POST',
35
+ outputBuilder: async (res) => ({
36
+ choices: [{ message: { content: res.response } }],
37
+ }),
38
+ req: {
39
+ envelope: 'json',
40
+ builder: async () => ({
41
+ model: req.model,
42
+ prompt: firstMessage.content,
43
+ stream: false,
44
+ }),
45
+ },
46
+ urlBuilder: async () => `${this.s().oll_base_url}/api/generate`,
47
+ });
48
+ }
49
+ };
50
+ OllamaLLMManager = __decorate([
51
+ injectable(),
52
+ __param(0, inject('HTTPAPICaller')),
53
+ __param(1, inject('SettingsManager')),
54
+ __metadata("design:paramtypes", [Object, Object])
55
+ ], OllamaLLMManager);
56
+ export { OllamaLLMManager };
@@ -0,0 +1,17 @@
1
+ import type { ApiKey } from '../../dt/index.js';
2
+ import type { HTTPAPICaller } from '../HTTPAPICaller.js';
3
+ import type { LLMManager, LLMManagerSendReq, LLMManagerSendRes } from '../LLMManager.js';
4
+ import type { Configurable, Settings, SettingsManager } from '../SettingsManager.js';
5
+ export interface OpenAILLMManagerSettings extends Settings {
6
+ oai_api_key: ApiKey;
7
+ }
8
+ type S = OpenAILLMManagerSettings;
9
+ export declare class OpenAILLMManager implements Configurable<S>, LLMManager {
10
+ private httpAPICaller;
11
+ private settingsManager;
12
+ private static BASE_URL;
13
+ constructor(httpAPICaller: HTTPAPICaller, settingsManager: SettingsManager<S>);
14
+ s(): OpenAILLMManagerSettings;
15
+ send(req: LLMManagerSendReq): Promise<LLMManagerSendRes>;
16
+ }
17
+ export {};
@@ -0,0 +1,51 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
11
+ return function (target, key) { decorator(target, key, paramIndex); }
12
+ };
13
+ var OpenAILLMManager_1;
14
+ import { inject, injectable } from 'inversify';
15
+ let OpenAILLMManager = class OpenAILLMManager {
16
+ static { OpenAILLMManager_1 = this; }
17
+ httpAPICaller;
18
+ settingsManager;
19
+ static BASE_URL = 'https://api.openai.com/v1';
20
+ constructor(httpAPICaller, settingsManager) {
21
+ this.httpAPICaller = httpAPICaller;
22
+ this.settingsManager = settingsManager;
23
+ }
24
+ s() {
25
+ return {
26
+ oai_api_key: this.settingsManager.get()('oai_api_key'),
27
+ };
28
+ }
29
+ async send(req) {
30
+ return await this.httpAPICaller.exec({
31
+ authorizationHeader: {
32
+ value: this.s().oai_api_key,
33
+ prefix: 'Bearer',
34
+ },
35
+ errBuilder: async (error) => error.error.message,
36
+ method: 'POST',
37
+ req: {
38
+ envelope: 'json',
39
+ builder: async () => req,
40
+ },
41
+ urlBuilder: async () => `${OpenAILLMManager_1.BASE_URL}/chat/completions`,
42
+ });
43
+ }
44
+ };
45
+ OpenAILLMManager = OpenAILLMManager_1 = __decorate([
46
+ injectable(),
47
+ __param(0, inject('HTTPAPICaller')),
48
+ __param(1, inject('SettingsManager')),
49
+ __metadata("design:paramtypes", [Object, Object])
50
+ ], OpenAILLMManager);
51
+ export { OpenAILLMManager };