sonamu 0.7.10 → 0.7.12

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 (133) hide show
  1. package/dist/api/config.d.ts +10 -3
  2. package/dist/api/config.d.ts.map +1 -1
  3. package/dist/api/config.js +2 -1
  4. package/dist/api/sonamu.d.ts +4 -0
  5. package/dist/api/sonamu.d.ts.map +1 -1
  6. package/dist/api/sonamu.js +36 -2
  7. package/dist/bin/cli.js +121 -117
  8. package/dist/database/base-model.d.ts +10 -50
  9. package/dist/database/base-model.d.ts.map +1 -1
  10. package/dist/database/base-model.js +19 -84
  11. package/dist/database/base-model.types.d.ts +4 -4
  12. package/dist/database/base-model.types.d.ts.map +1 -1
  13. package/dist/database/base-model.types.js +1 -1
  14. package/dist/database/db.d.ts +1 -0
  15. package/dist/database/db.d.ts.map +1 -1
  16. package/dist/database/db.js +24 -13
  17. package/dist/database/puri-subset.test-d.js +1 -1
  18. package/dist/database/puri-subset.types.d.ts +1 -0
  19. package/dist/database/puri-subset.types.d.ts.map +1 -1
  20. package/dist/database/puri-subset.types.js +2 -2
  21. package/dist/database/puri.d.ts +96 -1
  22. package/dist/database/puri.d.ts.map +1 -1
  23. package/dist/database/puri.js +214 -2
  24. package/dist/database/puri.types.d.ts +60 -5
  25. package/dist/database/puri.types.d.ts.map +1 -1
  26. package/dist/database/puri.types.js +2 -3
  27. package/dist/database/puri.types.test-d.js +1 -1
  28. package/dist/database/upsert-builder.d.ts +3 -1
  29. package/dist/database/upsert-builder.d.ts.map +1 -1
  30. package/dist/database/upsert-builder.js +19 -4
  31. package/dist/entity/entity-manager.d.ts +5 -4
  32. package/dist/entity/entity-manager.d.ts.map +1 -1
  33. package/dist/entity/entity-manager.js +8 -1
  34. package/dist/index.d.ts +1 -1
  35. package/dist/index.d.ts.map +1 -1
  36. package/dist/index.js +3 -3
  37. package/dist/migration/code-generation.d.ts.map +1 -1
  38. package/dist/migration/code-generation.js +33 -2
  39. package/dist/migration/postgresql-schema-reader.d.ts.map +1 -1
  40. package/dist/migration/postgresql-schema-reader.js +53 -22
  41. package/dist/naite/messaging-types.d.ts.map +1 -1
  42. package/dist/naite/messaging-types.js +1 -1
  43. package/dist/naite/naite-reporter.d.ts +7 -4
  44. package/dist/naite/naite-reporter.d.ts.map +1 -1
  45. package/dist/naite/naite-reporter.js +45 -21
  46. package/dist/naite/naite.js +2 -2
  47. package/dist/stream/sse.d.ts +2 -6
  48. package/dist/stream/sse.d.ts.map +1 -1
  49. package/dist/stream/sse.js +9 -3
  50. package/dist/syncer/api-parser.js +5 -1
  51. package/dist/syncer/file-patterns.d.ts +1 -1
  52. package/dist/syncer/file-patterns.d.ts.map +1 -1
  53. package/dist/syncer/file-patterns.js +6 -5
  54. package/dist/syncer/module-loader.d.ts +5 -0
  55. package/dist/syncer/module-loader.d.ts.map +1 -1
  56. package/dist/syncer/module-loader.js +17 -1
  57. package/dist/syncer/syncer.d.ts +3 -0
  58. package/dist/syncer/syncer.d.ts.map +1 -1
  59. package/dist/syncer/syncer.js +12 -2
  60. package/dist/tasks/decorator.d.ts +26 -0
  61. package/dist/tasks/decorator.d.ts.map +1 -0
  62. package/dist/tasks/decorator.js +28 -0
  63. package/dist/tasks/step-wrapper.d.ts +18 -0
  64. package/dist/tasks/step-wrapper.d.ts.map +1 -0
  65. package/dist/tasks/step-wrapper.js +38 -0
  66. package/dist/tasks/workflow-manager.d.ts +40 -0
  67. package/dist/tasks/workflow-manager.d.ts.map +1 -0
  68. package/dist/tasks/workflow-manager.js +193 -0
  69. package/dist/template/implementations/generated.template.d.ts.map +1 -1
  70. package/dist/template/implementations/generated.template.js +7 -3
  71. package/dist/template/implementations/model.template.js +2 -2
  72. package/dist/template/zod-converter.d.ts.map +1 -1
  73. package/dist/template/zod-converter.js +4 -2
  74. package/dist/types/types.d.ts +28 -11
  75. package/dist/types/types.d.ts.map +1 -1
  76. package/dist/types/types.js +18 -2
  77. package/dist/utils/console-util.js +2 -2
  78. package/dist/utils/formatter.d.ts.map +1 -1
  79. package/dist/utils/formatter.js +10 -2
  80. package/dist/utils/model.d.ts +9 -2
  81. package/dist/utils/model.d.ts.map +1 -1
  82. package/dist/utils/model.js +16 -1
  83. package/dist/utils/type-utils.d.ts.map +1 -1
  84. package/dist/utils/type-utils.js +3 -1
  85. package/dist/vector/embedding.d.ts +2 -5
  86. package/dist/vector/embedding.d.ts.map +1 -1
  87. package/dist/vector/embedding.js +3 -7
  88. package/dist/vector/types.d.ts.map +1 -1
  89. package/dist/vector/types.js +1 -1
  90. package/package.json +4 -2
  91. package/src/api/config.ts +15 -8
  92. package/src/api/sonamu.ts +43 -2
  93. package/src/bin/cli.ts +58 -54
  94. package/src/database/base-model.ts +21 -128
  95. package/src/database/base-model.types.ts +3 -4
  96. package/src/database/db.ts +28 -18
  97. package/src/database/puri-subset.test-d.ts +1 -0
  98. package/src/database/puri-subset.types.ts +2 -0
  99. package/src/database/puri.ts +292 -1
  100. package/src/database/puri.types.test-d.ts +1 -1
  101. package/src/database/puri.types.ts +81 -7
  102. package/src/database/upsert-builder.ts +27 -9
  103. package/src/entity/entity-manager.ts +9 -0
  104. package/src/index.ts +1 -1
  105. package/src/migration/code-generation.ts +40 -1
  106. package/src/migration/postgresql-schema-reader.ts +53 -22
  107. package/src/naite/messaging-types.ts +43 -44
  108. package/src/naite/naite-reporter.ts +51 -20
  109. package/src/naite/naite.ts +1 -1
  110. package/src/shared/app.shared.ts.txt +13 -0
  111. package/src/shared/web.shared.ts.txt +13 -0
  112. package/src/stream/sse.ts +15 -3
  113. package/src/syncer/api-parser.ts +4 -0
  114. package/src/syncer/file-patterns.ts +11 -9
  115. package/src/syncer/module-loader.ts +35 -0
  116. package/src/syncer/syncer.ts +14 -0
  117. package/src/tasks/decorator.ts +71 -0
  118. package/src/tasks/step-wrapper.ts +84 -0
  119. package/src/tasks/workflow-manager.ts +330 -0
  120. package/src/template/implementations/generated.template.ts +19 -6
  121. package/src/template/implementations/model.template.ts +1 -1
  122. package/src/template/zod-converter.ts +3 -0
  123. package/src/types/types.ts +23 -4
  124. package/src/utils/console-util.ts +1 -1
  125. package/src/utils/formatter.ts +8 -1
  126. package/src/utils/model.ts +26 -2
  127. package/src/utils/type-utils.ts +2 -0
  128. package/src/vector/embedding.ts +2 -8
  129. package/src/vector/types.ts +1 -2
  130. package/dist/vector/vector-search.d.ts +0 -47
  131. package/dist/vector/vector-search.d.ts.map +0 -1
  132. package/dist/vector/vector-search.js +0 -176
  133. package/src/vector/vector-search.ts +0 -261
@@ -3,7 +3,7 @@ import type { EmbeddingProvider, EmbeddingResult, ProgressCallback, VectorConfig
3
3
  * 임베딩 클라이언트
4
4
  * Voyage AI와 OpenAI 임베딩을 SDK 방식으로 통합 지원
5
5
  */
6
- export declare class Embedding {
6
+ export declare class EmbeddingClass {
7
7
  private config;
8
8
  constructor(config?: Partial<VectorConfig>);
9
9
  /**
@@ -34,13 +34,10 @@ export declare class Embedding {
34
34
  * OpenAI 임베딩
35
35
  */
36
36
  private embedOpenAI;
37
- /**
38
- * 벡터를 PostgreSQL vector 타입 문자열로 변환
39
- */
40
- static toVectorString(embedding: number[]): string;
41
37
  /**
42
38
  * 임베딩 provider의 차원 수 반환
43
39
  */
44
40
  getDimensions(provider: EmbeddingProvider): number;
45
41
  }
42
+ export declare const Embedding: EmbeddingClass;
46
43
  //# sourceMappingURL=embedding.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"embedding.d.ts","sourceRoot":"","sources":["../../src/vector/embedding.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,iBAAiB,EACjB,eAAe,EACf,gBAAgB,EAChB,YAAY,EACZ,eAAe,EAChB,MAAM,SAAS,CAAC;AAEjB;;;GAGG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAAe;gBAEjB,MAAM,GAAE,OAAO,CAAC,YAAY,CAAM;IAU9C;;OAEG;IACH,OAAO,CAAC,eAAe;IAQvB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAQzB;;;;;;OAMG;IACG,KAAK,CACT,KAAK,EAAE,MAAM,EAAE,EACf,QAAQ,EAAE,iBAAiB,EAC3B,SAAS,GAAE,eAA4B,EACvC,UAAU,CAAC,EAAE,gBAAgB,GAC5B,OAAO,CAAC,eAAe,EAAE,CAAC;IA0B7B;;OAEG;IACG,QAAQ,CACZ,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,iBAAiB,EAC3B,SAAS,GAAE,eAA4B,GACtC,OAAO,CAAC,eAAe,CAAC;IAK3B;;OAEG;YACW,WAAW;IAuBzB;;OAEG;YACW,WAAW;IAiBzB;;OAEG;IACH,MAAM,CAAC,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,MAAM;IAIlD;;OAEG;IACH,aAAa,CAAC,QAAQ,EAAE,iBAAiB,GAAG,MAAM;CAGnD"}
1
+ {"version":3,"file":"embedding.d.ts","sourceRoot":"","sources":["../../src/vector/embedding.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,iBAAiB,EACjB,eAAe,EACf,gBAAgB,EAChB,YAAY,EACZ,eAAe,EAChB,MAAM,SAAS,CAAC;AAEjB;;;GAGG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAe;gBAEjB,MAAM,GAAE,OAAO,CAAC,YAAY,CAAM;IAU9C;;OAEG;IACH,OAAO,CAAC,eAAe;IAQvB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAQzB;;;;;;OAMG;IACG,KAAK,CACT,KAAK,EAAE,MAAM,EAAE,EACf,QAAQ,EAAE,iBAAiB,EAC3B,SAAS,GAAE,eAA4B,EACvC,UAAU,CAAC,EAAE,gBAAgB,GAC5B,OAAO,CAAC,eAAe,EAAE,CAAC;IA0B7B;;OAEG;IACG,QAAQ,CACZ,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,iBAAiB,EAC3B,SAAS,GAAE,eAA4B,GACtC,OAAO,CAAC,eAAe,CAAC;IAK3B;;OAEG;YACW,WAAW;IAuBzB;;OAEG;YACW,WAAW;IAiBzB;;OAEG;IACH,aAAa,CAAC,QAAQ,EAAE,iBAAiB,GAAG,MAAM;CAGnD;AACD,eAAO,MAAM,SAAS,gBAAuB,CAAC"}
@@ -6,7 +6,7 @@ import { DEFAULT_VECTOR_CONFIG } from "./config.js";
6
6
  /**
7
7
  * 임베딩 클라이언트
8
8
  * Voyage AI와 OpenAI 임베딩을 SDK 방식으로 통합 지원
9
- */ export class Embedding {
9
+ */ export class EmbeddingClass {
10
10
  config;
11
11
  constructor(config = {}){
12
12
  this.config = {
@@ -118,15 +118,11 @@ import { DEFAULT_VECTOR_CONFIG } from "./config.js";
118
118
  }));
119
119
  }
120
120
  /**
121
- * 벡터를 PostgreSQL vector 타입 문자열로 변환
122
- */ static toVectorString(embedding) {
123
- return `[${embedding.join(",")}]`;
124
- }
125
- /**
126
121
  * 임베딩 provider의 차원 수 반환
127
122
  */ getDimensions(provider) {
128
123
  return provider === "voyage" ? this.config.voyage.dimensions : this.config.openai.dimensions;
129
124
  }
130
125
  }
126
+ export const Embedding = new EmbeddingClass();
131
127
 
132
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy92ZWN0b3IvZW1iZWRkaW5nLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNyZWF0ZU9wZW5BSSwgdHlwZSBPcGVuQUlQcm92aWRlciB9IGZyb20gXCJAYWktc2RrL29wZW5haVwiO1xuaW1wb3J0IHsgdHlwZSBFbWJlZGRpbmdNb2RlbCwgZW1iZWRNYW55IH0gZnJvbSBcImFpXCI7XG5pbXBvcnQgeyBWb3lhZ2VBSUNsaWVudCB9IGZyb20gXCJ2b3lhZ2VhaVwiO1xuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB7IERFRkFVTFRfVkVDVE9SX0NPTkZJRyB9IGZyb20gXCIuL2NvbmZpZ1wiO1xuaW1wb3J0IHR5cGUge1xuICBFbWJlZGRpbmdQcm92aWRlcixcbiAgRW1iZWRkaW5nUmVzdWx0LFxuICBQcm9ncmVzc0NhbGxiYWNrLFxuICBWZWN0b3JDb25maWcsXG4gIFZlY3RvcklucHV0VHlwZSxcbn0gZnJvbSBcIi4vdHlwZXNcIjtcblxuLyoqXG4gKiDsnoTrsqDrlKkg7YG065287J207Ja47Yq4XG4gKiBWb3lhZ2UgQUnsmYAgT3BlbkFJIOyehOuyoOuUqeydhCBTREsg67Cp7Iud7Jy866GcIO2Gte2VqSDsp4Dsm5BcbiAqL1xuZXhwb3J0IGNsYXNzIEVtYmVkZGluZyB7XG4gIHByaXZhdGUgY29uZmlnOiBWZWN0b3JDb25maWc7XG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBQYXJ0aWFsPFZlY3RvckNvbmZpZz4gPSB7fSkge1xuICAgIHRoaXMuY29uZmlnID0ge1xuICAgICAgdm95YWdlOiB7IC4uLkRFRkFVTFRfVkVDVE9SX0NPTkZJRy52b3lhZ2UsIC4uLmNvbmZpZy52b3lhZ2UgfSxcbiAgICAgIG9wZW5haTogeyAuLi5ERUZBVUxUX1ZFQ1RPUl9DT05GSUcub3BlbmFpLCAuLi5jb25maWcub3BlbmFpIH0sXG4gICAgICBjaHVua2luZzogeyAuLi5ERUZBVUxUX1ZFQ1RPUl9DT05GSUcuY2h1bmtpbmcsIC4uLmNvbmZpZy5jaHVua2luZyB9LFxuICAgICAgc2VhcmNoOiB7IC4uLkRFRkFVTFRfVkVDVE9SX0NPTkZJRy5zZWFyY2gsIC4uLmNvbmZpZy5zZWFyY2ggfSxcbiAgICAgIHBndmVjdG9yOiB7IC4uLkRFRkFVTFRfVkVDVE9SX0NPTkZJRy5wZ3ZlY3RvciwgLi4uY29uZmlnLnBndmVjdG9yIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWb3lhZ2UgQUkg7YG065287J207Ja47Yq4IOy0iOq4sO2ZlFxuICAgKi9cbiAgcHJpdmF0ZSBnZXRWb3lhZ2VDbGllbnQoKTogVm95YWdlQUlDbGllbnQge1xuICAgIGNvbnN0IGFwaUtleSA9IFNvbmFtdS5zZWNyZXRzPy52b3lhZ2VfYXBpX2tleSA/PyBwcm9jZXNzLmVudi5WT1lBR0VfQVBJX0tFWTtcbiAgICBpZiAoIWFwaUtleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVk9ZQUdFX0FQSV9LRVnqsIAg7ISk7KCV65CY7KeAIOyViuyVmOyKteuLiOuLpC4g7ZmY6rK967OA7IiY66W8IO2ZleyduO2VmOyEuOyalC5cIik7XG4gICAgfVxuICAgIHJldHVybiBuZXcgVm95YWdlQUlDbGllbnQoeyBhcGlLZXkgfSk7XG4gIH1cblxuICAvKipcbiAgICogT3BlbkFJIHByb3ZpZGVyIOyDneyEsVxuICAgKi9cbiAgcHJpdmF0ZSBnZXRPcGVuQUlQcm92aWRlcigpOiBPcGVuQUlQcm92aWRlciB7XG4gICAgY29uc3QgYXBpS2V5ID0gU29uYW11LnNlY3JldHM/Lm9wZW5haV9hcGlfa2V5ID8/IHByb2Nlc3MuZW52Lk9QRU5BSV9BUElfS0VZO1xuICAgIGlmICghYXBpS2V5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJPUEVOQUlfQVBJX0tFWeqwgCDshKTsoJXrkJjsp4Ag7JWK7JWY7Iq164uI64ukLiDtmZjqsr3rs4DsiJjrpbwg7ZmV7J247ZWY7IS47JqULlwiKTtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZU9wZW5BSSh7IGFwaUtleSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDthY3siqTtirgg7J6E67Kg65SpIOyDneyEsVxuICAgKiBAcGFyYW0gdGV4dHMgLSDsnoTrsqDrlKntlaAg7YWN7Iqk7Yq4IOuwsOyXtCAoYmF0Y2hTaXpl7J207IOBIOyLnCDsnpDrj5kg67aE7ZWgKVxuICAgKiBAcGFyYW0gcHJvdmlkZXIgLSAndm95YWdlJyB8ICdvcGVuYWknXG4gICAqIEBwYXJhbSBpbnB1dFR5cGUgLSAnZG9jdW1lbnQnIHwgJ3F1ZXJ5JyAoVm95YWdlIEFJ66eMIO2VtOuLuSlcbiAgICogQHBhcmFtIG9uUHJvZ3Jlc3MgLSDsp4TtlonrpaAg7L2c67CxXG4gICAqL1xuICBhc3luYyBlbWJlZChcbiAgICB0ZXh0czogc3RyaW5nW10sXG4gICAgcHJvdmlkZXI6IEVtYmVkZGluZ1Byb3ZpZGVyLFxuICAgIGlucHV0VHlwZTogVmVjdG9ySW5wdXRUeXBlID0gXCJkb2N1bWVudFwiLFxuICAgIG9uUHJvZ3Jlc3M/OiBQcm9ncmVzc0NhbGxiYWNrLFxuICApOiBQcm9taXNlPEVtYmVkZGluZ1Jlc3VsdFtdPiB7XG4gICAgY29uc3QgbWF4QmF0Y2hTaXplID1cbiAgICAgIHByb3ZpZGVyID09PSBcInZveWFnZVwiID8gdGhpcy5jb25maWcudm95YWdlLmJhdGNoU2l6ZSA6IHRoaXMuY29uZmlnLm9wZW5haS5iYXRjaFNpemU7XG5cbiAgICAvLyBiYXRjaFNpemXsnbTtlZjrqbQg67CU66GcIO2YuOy2nFxuICAgIGlmICh0ZXh0cy5sZW5ndGggPD0gbWF4QmF0Y2hTaXplKSB7XG4gICAgICByZXR1cm4gcHJvdmlkZXIgPT09IFwidm95YWdlXCJcbiAgICAgICAgPyBhd2FpdCB0aGlzLmVtYmVkVm95YWdlKHRleHRzLCBpbnB1dFR5cGUpXG4gICAgICAgIDogYXdhaXQgdGhpcy5lbWJlZE9wZW5BSSh0ZXh0cyk7XG4gICAgfVxuXG4gICAgLy8gYmF0Y2hTaXpl7J207IOB7J2066m0IOyekOuPmeycvOuhnCDrgpjriKDshJwg7LKY66asXG4gICAgY29uc3QgYmF0Y2hlcyA9IEFycmF5LmZyb20oeyBsZW5ndGg6IE1hdGguY2VpbCh0ZXh0cy5sZW5ndGggLyBtYXhCYXRjaFNpemUpIH0sIChfLCBpKSA9PlxuICAgICAgdGV4dHMuc2xpY2UoaSAqIG1heEJhdGNoU2l6ZSwgKGkgKyAxKSAqIG1heEJhdGNoU2l6ZSksXG4gICAgKTtcblxuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIGJhdGNoZXMubWFwKChiYXRjaCkgPT5cbiAgICAgICAgcHJvdmlkZXIgPT09IFwidm95YWdlXCIgPyB0aGlzLmVtYmVkVm95YWdlKGJhdGNoLCBpbnB1dFR5cGUpIDogdGhpcy5lbWJlZE9wZW5BSShiYXRjaCksXG4gICAgICApLFxuICAgICk7XG5cbiAgICBvblByb2dyZXNzPy4odGV4dHMubGVuZ3RoLCB0ZXh0cy5sZW5ndGgpO1xuICAgIHJldHVybiByZXN1bHRzLmZsYXQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDri6jsnbwg7YWN7Iqk7Yq4IOyehOuyoOuUqSAo7Y647J2YIOuplOyEnOuTnClcbiAgICovXG4gIGFzeW5jIGVtYmVkT25lKFxuICAgIHRleHQ6IHN0cmluZyxcbiAgICBwcm92aWRlcjogRW1iZWRkaW5nUHJvdmlkZXIsXG4gICAgaW5wdXRUeXBlOiBWZWN0b3JJbnB1dFR5cGUgPSBcImRvY3VtZW50XCIsXG4gICk6IFByb21pc2U8RW1iZWRkaW5nUmVzdWx0PiB7XG4gICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHRoaXMuZW1iZWQoW3RleHRdLCBwcm92aWRlciwgaW5wdXRUeXBlKTtcbiAgICByZXR1cm4gcmVzdWx0c1swXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWb3lhZ2UgQUkg7J6E67Kg65SpXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGVtYmVkVm95YWdlKFxuICAgIHRleHRzOiBzdHJpbmdbXSxcbiAgICBpbnB1dFR5cGU6IFZlY3RvcklucHV0VHlwZSxcbiAgKTogUHJvbWlzZTxFbWJlZGRpbmdSZXN1bHRbXT4ge1xuICAgIGNvbnN0IGNsaWVudCA9IHRoaXMuZ2V0Vm95YWdlQ2xpZW50KCk7XG4gICAgY29uc3Qgdm95YWdlQ29uZmlnID0gdGhpcy5jb25maWcudm95YWdlO1xuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQuZW1iZWQoe1xuICAgICAgaW5wdXQ6IHRleHRzLFxuICAgICAgbW9kZWw6IHZveWFnZUNvbmZpZy5tb2RlbCxcbiAgICAgIGlucHV0VHlwZTogaW5wdXRUeXBlLFxuICAgIH0pO1xuICAgIGlmICghcmVzcG9uc2UuZGF0YSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVm95YWdlIEFQSTog7J2R64u1IOuNsOydtO2EsOqwgCDsl4bsirXri4jri6QuXCIpO1xuICAgIH1cblxuICAgIHJldHVybiByZXNwb25zZS5kYXRhLm1hcCgoaXRlbSkgPT4gKHtcbiAgICAgIGVtYmVkZGluZzogaXRlbS5lbWJlZGRpbmcgPz8gW10sXG4gICAgICBtb2RlbDogdm95YWdlQ29uZmlnLm1vZGVsLFxuICAgICAgdG9rZW5Db3VudDogcmVzcG9uc2UudXNhZ2U/LnRvdGFsVG9rZW5zID8/IDAsXG4gICAgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIE9wZW5BSSDsnoTrsqDrlKlcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZW1iZWRPcGVuQUkodGV4dHM6IHN0cmluZ1tdKTogUHJvbWlzZTxFbWJlZGRpbmdSZXN1bHRbXT4ge1xuICAgIGNvbnN0IG9wZW5haSA9IHRoaXMuZ2V0T3BlbkFJUHJvdmlkZXIoKTtcbiAgICBjb25zdCBvcGVuYWlDb25maWcgPSB0aGlzLmNvbmZpZy5vcGVuYWk7XG4gICAgY29uc3QgbW9kZWwgPSBvcGVuYWkuZW1iZWRkaW5nTW9kZWwob3BlbmFpQ29uZmlnLm1vZGVsKTtcblxuICAgIGNvbnN0IHsgZW1iZWRkaW5ncywgdXNhZ2UgfSA9IGF3YWl0IGVtYmVkTWFueSh7XG4gICAgICBtb2RlbDogbW9kZWwgYXMgRW1iZWRkaW5nTW9kZWwsXG4gICAgICB2YWx1ZXM6IHRleHRzLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGVtYmVkZGluZ3MubWFwKChlbWJlZGRpbmcpID0+ICh7XG4gICAgICBlbWJlZGRpbmcsXG4gICAgICBtb2RlbDogb3BlbmFpQ29uZmlnLm1vZGVsLFxuICAgICAgdG9rZW5Db3VudDogdXNhZ2U/LnRva2VucyA/PyAwLFxuICAgIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDrsqHthLDrpbwgUG9zdGdyZVNRTCB2ZWN0b3Ig7YOA7J6FIOusuOyekOyXtOuhnCDrs4DtmZhcbiAgICovXG4gIHN0YXRpYyB0b1ZlY3RvclN0cmluZyhlbWJlZGRpbmc6IG51bWJlcltdKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFske2VtYmVkZGluZy5qb2luKFwiLFwiKX1dYDtcbiAgfVxuXG4gIC8qKlxuICAgKiDsnoTrsqDrlKkgcHJvdmlkZXLsnZgg7LCo7JuQIOyImCDrsJjtmZhcbiAgICovXG4gIGdldERpbWVuc2lvbnMocHJvdmlkZXI6IEVtYmVkZGluZ1Byb3ZpZGVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gcHJvdmlkZXIgPT09IFwidm95YWdlXCIgPyB0aGlzLmNvbmZpZy52b3lhZ2UuZGltZW5zaW9ucyA6IHRoaXMuY29uZmlnLm9wZW5haS5kaW1lbnNpb25zO1xuICB9XG59XG4iXSwibmFtZXMiOlsiY3JlYXRlT3BlbkFJIiwiZW1iZWRNYW55IiwiVm95YWdlQUlDbGllbnQiLCJTb25hbXUiLCJERUZBVUxUX1ZFQ1RPUl9DT05GSUciLCJFbWJlZGRpbmciLCJjb25maWciLCJ2b3lhZ2UiLCJvcGVuYWkiLCJjaHVua2luZyIsInNlYXJjaCIsInBndmVjdG9yIiwiZ2V0Vm95YWdlQ2xpZW50IiwiYXBpS2V5Iiwic2VjcmV0cyIsInZveWFnZV9hcGlfa2V5IiwicHJvY2VzcyIsImVudiIsIlZPWUFHRV9BUElfS0VZIiwiRXJyb3IiLCJnZXRPcGVuQUlQcm92aWRlciIsIm9wZW5haV9hcGlfa2V5IiwiT1BFTkFJX0FQSV9LRVkiLCJlbWJlZCIsInRleHRzIiwicHJvdmlkZXIiLCJpbnB1dFR5cGUiLCJvblByb2dyZXNzIiwibWF4QmF0Y2hTaXplIiwiYmF0Y2hTaXplIiwibGVuZ3RoIiwiZW1iZWRWb3lhZ2UiLCJlbWJlZE9wZW5BSSIsImJhdGNoZXMiLCJBcnJheSIsImZyb20iLCJNYXRoIiwiY2VpbCIsIl8iLCJpIiwic2xpY2UiLCJyZXN1bHRzIiwiUHJvbWlzZSIsImFsbCIsIm1hcCIsImJhdGNoIiwiZmxhdCIsImVtYmVkT25lIiwidGV4dCIsImNsaWVudCIsInZveWFnZUNvbmZpZyIsInJlc3BvbnNlIiwiaW5wdXQiLCJtb2RlbCIsImRhdGEiLCJpdGVtIiwiZW1iZWRkaW5nIiwidG9rZW5Db3VudCIsInVzYWdlIiwidG90YWxUb2tlbnMiLCJvcGVuYWlDb25maWciLCJlbWJlZGRpbmdNb2RlbCIsImVtYmVkZGluZ3MiLCJ2YWx1ZXMiLCJ0b2tlbnMiLCJ0b1ZlY3RvclN0cmluZyIsImpvaW4iLCJnZXREaW1lbnNpb25zIiwiZGltZW5zaW9ucyJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsWUFBWSxRQUE2QixpQkFBaUI7QUFDbkUsU0FBOEJDLFNBQVMsUUFBUSxLQUFLO0FBQ3BELFNBQVNDLGNBQWMsUUFBUSxXQUFXO0FBQzFDLFNBQVNDLE1BQU0sUUFBUSxtQkFBZ0I7QUFDdkMsU0FBU0MscUJBQXFCLFFBQVEsY0FBVztBQVNqRDs7O0NBR0MsR0FDRCxPQUFPLE1BQU1DO0lBQ0hDLE9BQXFCO0lBRTdCLFlBQVlBLFNBQWdDLENBQUMsQ0FBQyxDQUFFO1FBQzlDLElBQUksQ0FBQ0EsTUFBTSxHQUFHO1lBQ1pDLFFBQVE7Z0JBQUUsR0FBR0gsc0JBQXNCRyxNQUFNO2dCQUFFLEdBQUdELE9BQU9DLE1BQU07WUFBQztZQUM1REMsUUFBUTtnQkFBRSxHQUFHSixzQkFBc0JJLE1BQU07Z0JBQUUsR0FBR0YsT0FBT0UsTUFBTTtZQUFDO1lBQzVEQyxVQUFVO2dCQUFFLEdBQUdMLHNCQUFzQkssUUFB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
128
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy92ZWN0b3IvZW1iZWRkaW5nLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNyZWF0ZU9wZW5BSSwgdHlwZSBPcGVuQUlQcm92aWRlciB9IGZyb20gXCJAYWktc2RrL29wZW5haVwiO1xuaW1wb3J0IHsgdHlwZSBFbWJlZGRpbmdNb2RlbCwgZW1iZWRNYW55IH0gZnJvbSBcImFpXCI7XG5pbXBvcnQgeyBWb3lhZ2VBSUNsaWVudCB9IGZyb20gXCJ2b3lhZ2VhaVwiO1xuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB7IERFRkFVTFRfVkVDVE9SX0NPTkZJRyB9IGZyb20gXCIuL2NvbmZpZ1wiO1xuaW1wb3J0IHR5cGUge1xuICBFbWJlZGRpbmdQcm92aWRlcixcbiAgRW1iZWRkaW5nUmVzdWx0LFxuICBQcm9ncmVzc0NhbGxiYWNrLFxuICBWZWN0b3JDb25maWcsXG4gIFZlY3RvcklucHV0VHlwZSxcbn0gZnJvbSBcIi4vdHlwZXNcIjtcblxuLyoqXG4gKiDsnoTrsqDrlKkg7YG065287J207Ja47Yq4XG4gKiBWb3lhZ2UgQUnsmYAgT3BlbkFJIOyehOuyoOuUqeydhCBTREsg67Cp7Iud7Jy866GcIO2Gte2VqSDsp4Dsm5BcbiAqL1xuZXhwb3J0IGNsYXNzIEVtYmVkZGluZ0NsYXNzIHtcbiAgcHJpdmF0ZSBjb25maWc6IFZlY3RvckNvbmZpZztcblxuICBjb25zdHJ1Y3Rvcihjb25maWc6IFBhcnRpYWw8VmVjdG9yQ29uZmlnPiA9IHt9KSB7XG4gICAgdGhpcy5jb25maWcgPSB7XG4gICAgICB2b3lhZ2U6IHsgLi4uREVGQVVMVF9WRUNUT1JfQ09ORklHLnZveWFnZSwgLi4uY29uZmlnLnZveWFnZSB9LFxuICAgICAgb3BlbmFpOiB7IC4uLkRFRkFVTFRfVkVDVE9SX0NPTkZJRy5vcGVuYWksIC4uLmNvbmZpZy5vcGVuYWkgfSxcbiAgICAgIGNodW5raW5nOiB7IC4uLkRFRkFVTFRfVkVDVE9SX0NPTkZJRy5jaHVua2luZywgLi4uY29uZmlnLmNodW5raW5nIH0sXG4gICAgICBzZWFyY2g6IHsgLi4uREVGQVVMVF9WRUNUT1JfQ09ORklHLnNlYXJjaCwgLi4uY29uZmlnLnNlYXJjaCB9LFxuICAgICAgcGd2ZWN0b3I6IHsgLi4uREVGQVVMVF9WRUNUT1JfQ09ORklHLnBndmVjdG9yLCAuLi5jb25maWcucGd2ZWN0b3IgfSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFZveWFnZSBBSSDtgbTrnbzsnbTslrjtirgg7LSI6riw7ZmUXG4gICAqL1xuICBwcml2YXRlIGdldFZveWFnZUNsaWVudCgpOiBWb3lhZ2VBSUNsaWVudCB7XG4gICAgY29uc3QgYXBpS2V5ID0gU29uYW11LnNlY3JldHM/LnZveWFnZV9hcGlfa2V5ID8/IHByb2Nlc3MuZW52LlZPWUFHRV9BUElfS0VZO1xuICAgIGlmICghYXBpS2V5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJWT1lBR0VfQVBJX0tFWeqwgCDshKTsoJXrkJjsp4Ag7JWK7JWY7Iq164uI64ukLiDtmZjqsr3rs4DsiJjrpbwg7ZmV7J247ZWY7IS47JqULlwiKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBWb3lhZ2VBSUNsaWVudCh7IGFwaUtleSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPcGVuQUkgcHJvdmlkZXIg7IOd7ISxXG4gICAqL1xuICBwcml2YXRlIGdldE9wZW5BSVByb3ZpZGVyKCk6IE9wZW5BSVByb3ZpZGVyIHtcbiAgICBjb25zdCBhcGlLZXkgPSBTb25hbXUuc2VjcmV0cz8ub3BlbmFpX2FwaV9rZXkgPz8gcHJvY2Vzcy5lbnYuT1BFTkFJX0FQSV9LRVk7XG4gICAgaWYgKCFhcGlLZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk9QRU5BSV9BUElfS0VZ6rCAIOyEpOygleuQmOyngCDslYrslZjsirXri4jri6QuIO2ZmOqyveuzgOyImOulvCDtmZXsnbjtlZjshLjsmpQuXCIpO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlT3BlbkFJKHsgYXBpS2V5IH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIO2FjeyKpO2KuCDsnoTrsqDrlKkg7IOd7ISxXG4gICAqIEBwYXJhbSB0ZXh0cyAtIOyehOuyoOuUqe2VoCDthY3siqTtirgg67Cw7Je0IChiYXRjaFNpemXsnbTsg4Eg7IucIOyekOuPmSDrtoTtlaApXG4gICAqIEBwYXJhbSBwcm92aWRlciAtICd2b3lhZ2UnIHwgJ29wZW5haSdcbiAgICogQHBhcmFtIGlucHV0VHlwZSAtICdkb2N1bWVudCcgfCAncXVlcnknIChWb3lhZ2UgQUnrp4wg7ZW064u5KVxuICAgKiBAcGFyYW0gb25Qcm9ncmVzcyAtIOynhO2WieuloCDsvZzrsLFcbiAgICovXG4gIGFzeW5jIGVtYmVkKFxuICAgIHRleHRzOiBzdHJpbmdbXSxcbiAgICBwcm92aWRlcjogRW1iZWRkaW5nUHJvdmlkZXIsXG4gICAgaW5wdXRUeXBlOiBWZWN0b3JJbnB1dFR5cGUgPSBcImRvY3VtZW50XCIsXG4gICAgb25Qcm9ncmVzcz86IFByb2dyZXNzQ2FsbGJhY2ssXG4gICk6IFByb21pc2U8RW1iZWRkaW5nUmVzdWx0W10+IHtcbiAgICBjb25zdCBtYXhCYXRjaFNpemUgPVxuICAgICAgcHJvdmlkZXIgPT09IFwidm95YWdlXCIgPyB0aGlzLmNvbmZpZy52b3lhZ2UuYmF0Y2hTaXplIDogdGhpcy5jb25maWcub3BlbmFpLmJhdGNoU2l6ZTtcblxuICAgIC8vIGJhdGNoU2l6ZeydtO2VmOuptCDrsJTroZwg7Zi47LacXG4gICAgaWYgKHRleHRzLmxlbmd0aCA8PSBtYXhCYXRjaFNpemUpIHtcbiAgICAgIHJldHVybiBwcm92aWRlciA9PT0gXCJ2b3lhZ2VcIlxuICAgICAgICA/IGF3YWl0IHRoaXMuZW1iZWRWb3lhZ2UodGV4dHMsIGlucHV0VHlwZSlcbiAgICAgICAgOiBhd2FpdCB0aGlzLmVtYmVkT3BlbkFJKHRleHRzKTtcbiAgICB9XG5cbiAgICAvLyBiYXRjaFNpemXsnbTsg4HsnbTrqbQg7J6Q64+Z7Jy866GcIOuCmOuIoOyEnCDsspjrpqxcbiAgICBjb25zdCBiYXRjaGVzID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogTWF0aC5jZWlsKHRleHRzLmxlbmd0aCAvIG1heEJhdGNoU2l6ZSkgfSwgKF8sIGkpID0+XG4gICAgICB0ZXh0cy5zbGljZShpICogbWF4QmF0Y2hTaXplLCAoaSArIDEpICogbWF4QmF0Y2hTaXplKSxcbiAgICApO1xuXG4gICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgYmF0Y2hlcy5tYXAoKGJhdGNoKSA9PlxuICAgICAgICBwcm92aWRlciA9PT0gXCJ2b3lhZ2VcIiA/IHRoaXMuZW1iZWRWb3lhZ2UoYmF0Y2gsIGlucHV0VHlwZSkgOiB0aGlzLmVtYmVkT3BlbkFJKGJhdGNoKSxcbiAgICAgICksXG4gICAgKTtcblxuICAgIG9uUHJvZ3Jlc3M/Lih0ZXh0cy5sZW5ndGgsIHRleHRzLmxlbmd0aCk7XG4gICAgcmV0dXJuIHJlc3VsdHMuZmxhdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIOuLqOydvCDthY3siqTtirgg7J6E67Kg65SpICjtjrjsnZgg66mU7ISc65OcKVxuICAgKi9cbiAgYXN5bmMgZW1iZWRPbmUoXG4gICAgdGV4dDogc3RyaW5nLFxuICAgIHByb3ZpZGVyOiBFbWJlZGRpbmdQcm92aWRlcixcbiAgICBpbnB1dFR5cGU6IFZlY3RvcklucHV0VHlwZSA9IFwiZG9jdW1lbnRcIixcbiAgKTogUHJvbWlzZTxFbWJlZGRpbmdSZXN1bHQ+IHtcbiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgdGhpcy5lbWJlZChbdGV4dF0sIHByb3ZpZGVyLCBpbnB1dFR5cGUpO1xuICAgIHJldHVybiByZXN1bHRzWzBdO1xuICB9XG5cbiAgLyoqXG4gICAqIFZveWFnZSBBSSDsnoTrsqDrlKlcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZW1iZWRWb3lhZ2UoXG4gICAgdGV4dHM6IHN0cmluZ1tdLFxuICAgIGlucHV0VHlwZTogVmVjdG9ySW5wdXRUeXBlLFxuICApOiBQcm9taXNlPEVtYmVkZGluZ1Jlc3VsdFtdPiB7XG4gICAgY29uc3QgY2xpZW50ID0gdGhpcy5nZXRWb3lhZ2VDbGllbnQoKTtcbiAgICBjb25zdCB2b3lhZ2VDb25maWcgPSB0aGlzLmNvbmZpZy52b3lhZ2U7XG5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5lbWJlZCh7XG4gICAgICBpbnB1dDogdGV4dHMsXG4gICAgICBtb2RlbDogdm95YWdlQ29uZmlnLm1vZGVsLFxuICAgICAgaW5wdXRUeXBlOiBpbnB1dFR5cGUsXG4gICAgfSk7XG4gICAgaWYgKCFyZXNwb25zZS5kYXRhKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJWb3lhZ2UgQVBJOiDsnZHri7Ug642w7J207YSw6rCAIOyXhuyKteuLiOuLpC5cIik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3BvbnNlLmRhdGEubWFwKChpdGVtKSA9PiAoe1xuICAgICAgZW1iZWRkaW5nOiBpdGVtLmVtYmVkZGluZyA/PyBbXSxcbiAgICAgIG1vZGVsOiB2b3lhZ2VDb25maWcubW9kZWwsXG4gICAgICB0b2tlbkNvdW50OiByZXNwb25zZS51c2FnZT8udG90YWxUb2tlbnMgPz8gMCxcbiAgICB9KSk7XG4gIH1cblxuICAvKipcbiAgICogT3BlbkFJIOyehOuyoOuUqVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBlbWJlZE9wZW5BSSh0ZXh0czogc3RyaW5nW10pOiBQcm9taXNlPEVtYmVkZGluZ1Jlc3VsdFtdPiB7XG4gICAgY29uc3Qgb3BlbmFpID0gdGhpcy5nZXRPcGVuQUlQcm92aWRlcigpO1xuICAgIGNvbnN0IG9wZW5haUNvbmZpZyA9IHRoaXMuY29uZmlnLm9wZW5haTtcbiAgICBjb25zdCBtb2RlbCA9IG9wZW5haS5lbWJlZGRpbmdNb2RlbChvcGVuYWlDb25maWcubW9kZWwpO1xuXG4gICAgY29uc3QgeyBlbWJlZGRpbmdzLCB1c2FnZSB9ID0gYXdhaXQgZW1iZWRNYW55KHtcbiAgICAgIG1vZGVsOiBtb2RlbCBhcyBFbWJlZGRpbmdNb2RlbCxcbiAgICAgIHZhbHVlczogdGV4dHMsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZW1iZWRkaW5ncy5tYXAoKGVtYmVkZGluZykgPT4gKHtcbiAgICAgIGVtYmVkZGluZyxcbiAgICAgIG1vZGVsOiBvcGVuYWlDb25maWcubW9kZWwsXG4gICAgICB0b2tlbkNvdW50OiB1c2FnZT8udG9rZW5zID8/IDAsXG4gICAgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIOyehOuyoOuUqSBwcm92aWRlcuydmCDssKjsm5Ag7IiYIOuwmO2ZmFxuICAgKi9cbiAgZ2V0RGltZW5zaW9ucyhwcm92aWRlcjogRW1iZWRkaW5nUHJvdmlkZXIpOiBudW1iZXIge1xuICAgIHJldHVybiBwcm92aWRlciA9PT0gXCJ2b3lhZ2VcIiA/IHRoaXMuY29uZmlnLnZveWFnZS5kaW1lbnNpb25zIDogdGhpcy5jb25maWcub3BlbmFpLmRpbWVuc2lvbnM7XG4gIH1cbn1cbmV4cG9ydCBjb25zdCBFbWJlZGRpbmcgPSBuZXcgRW1iZWRkaW5nQ2xhc3MoKTtcbiJdLCJuYW1lcyI6WyJjcmVhdGVPcGVuQUkiLCJlbWJlZE1hbnkiLCJWb3lhZ2VBSUNsaWVudCIsIlNvbmFtdSIsIkRFRkFVTFRfVkVDVE9SX0NPTkZJRyIsIkVtYmVkZGluZ0NsYXNzIiwiY29uZmlnIiwidm95YWdlIiwib3BlbmFpIiwiY2h1bmtpbmciLCJzZWFyY2giLCJwZ3ZlY3RvciIsImdldFZveWFnZUNsaWVudCIsImFwaUtleSIsInNlY3JldHMiLCJ2b3lhZ2VfYXBpX2tleSIsInByb2Nlc3MiLCJlbnYiLCJWT1lBR0VfQVBJX0tFWSIsIkVycm9yIiwiZ2V0T3BlbkFJUHJvdmlkZXIiLCJvcGVuYWlfYXBpX2tleSIsIk9QRU5BSV9BUElfS0VZIiwiZW1iZWQiLCJ0ZXh0cyIsInByb3ZpZGVyIiwiaW5wdXRUeXBlIiwib25Qcm9ncmVzcyIsIm1heEJhdGNoU2l6ZSIsImJhdGNoU2l6ZSIsImxlbmd0aCIsImVtYmVkVm95YWdlIiwiZW1iZWRPcGVuQUkiLCJiYXRjaGVzIiwiQXJyYXkiLCJmcm9tIiwiTWF0aCIsImNlaWwiLCJfIiwiaSIsInNsaWNlIiwicmVzdWx0cyIsIlByb21pc2UiLCJhbGwiLCJtYXAiLCJiYXRjaCIsImZsYXQiLCJlbWJlZE9uZSIsInRleHQiLCJjbGllbnQiLCJ2b3lhZ2VDb25maWciLCJyZXNwb25zZSIsImlucHV0IiwibW9kZWwiLCJkYXRhIiwiaXRlbSIsImVtYmVkZGluZyIsInRva2VuQ291bnQiLCJ1c2FnZSIsInRvdGFsVG9rZW5zIiwib3BlbmFpQ29uZmlnIiwiZW1iZWRkaW5nTW9kZWwiLCJlbWJlZGRpbmdzIiwidmFsdWVzIiwidG9rZW5zIiwiZ2V0RGltZW5zaW9ucyIsImRpbWVuc2lvbnMiLCJFbWJlZGRpbmciXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLFlBQVksUUFBNkIsaUJBQWlCO0FBQ25FLFNBQThCQyxTQUFTLFFBQVEsS0FBSztBQUNwRCxTQUFTQyxjQUFjLFFBQVEsV0FBVztBQUMxQyxTQUFTQyxNQUFNLFFBQVEsbUJBQWdCO0FBQ3ZDLFNBQVNDLHFCQUFxQixRQUFRLGNBQVc7QUFTakQ7OztDQUdDLEdBQ0QsT0FBTyxNQUFNQztJQUNIQyxPQUFxQjtJQUU3QixZQUFZQSxTQUFnQyxDQUFDLENBQUMsQ0FBRTtRQUM5QyxJQUFJLENBQUNBLE1BQU0sR0FBRztZQUNaQyxRQUFRO2dCQUFFLEdBQUdILHNCQUFzQkcsTUFBTTtnQkFBRSxHQUFHRCxPQUFPQyxNQUFNO1lBQUM7WUFDNURDLFFBQVE7Z0JBQUUsR0FBR0osc0JBQXNCSSxNQUFNO2dCQUFFLEdBQUdGLE9BQU9FLE1BQU07WUFBQztZQUM1REMsVUFBVTtnQkFBRSxHQUFHTCxzQkFBc0JLLFFBQVE7Z0JBQUUsR0FBR0gsT0FBT0csUUFBUTtZQUFDO1lBQ2xFQyxRQUFRO2dCQUFFLEdBQUdOLHNCQUFzQk0sTUFBTTtnQkFBRSxHQUFHSixPQUFPSSxNQUFNO1lBQUM7WUFDNURDLFVBQVU7Z0JBQUUsR0FBR1Asc0JBQXNCTyxRQUFRO2dC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
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/vector/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/vector/types.ts"],"names":[],"mappings":"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"}
@@ -2,4 +2,4 @@
2
2
  * pgvector 통합을 위한 타입 정의
3
3
  */ /** 임베딩 제공자 */ /** 진행률 콜백 */ export { };
4
4
 
5
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy92ZWN0b3IvdHlwZXMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBwZ3ZlY3RvciDthrXtlansnYQg7JyE7ZWcIO2DgOyehSDsoJXsnZhcbiAqL1xuXG4vKiog7J6E67Kg65SpIOygnOqzteyekCAqL1xuZXhwb3J0IHR5cGUgRW1iZWRkaW5nUHJvdmlkZXIgPSBcInZveWFnZVwiIHwgXCJvcGVuYWlcIjtcblxuLyoqIOyeheugpSDtg4DsnoUgKFZveWFnZSBBSSDsoITsmqkgLSDruYTrjIDsua0g7J6E67Kg65SpKSAqL1xuZXhwb3J0IHR5cGUgVmVjdG9ySW5wdXRUeXBlID0gXCJkb2N1bWVudFwiIHwgXCJxdWVyeVwiO1xuXG4vKiog7J6E67Kg65SpIOqysOqzvCAqL1xuZXhwb3J0IGludGVyZmFjZSBFbWJlZGRpbmdSZXN1bHQge1xuICBlbWJlZGRpbmc6IG51bWJlcltdO1xuICBtb2RlbDogc3RyaW5nO1xuICB0b2tlbkNvdW50OiBudW1iZXI7XG59XG5cbi8qKiDssq3tgawg7KCV67O0ICovXG5leHBvcnQgaW50ZXJmYWNlIENodW5rIHtcbiAgaW5kZXg6IG51bWJlcjtcbiAgdGV4dDogc3RyaW5nO1xuICBzdGFydE9mZnNldDogbnVtYmVyO1xuICBlbmRPZmZzZXQ6IG51bWJlcjtcbn1cblxuLyoqIOuyoe2EsCDqsoDsg4kg6rKw6rO8ICovXG5leHBvcnQgaW50ZXJmYWNlIFZlY3RvclNlYXJjaFJlc3VsdDxUID0gUmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHtcbiAgaWQ6IG51bWJlciB8IHN0cmluZztcbiAgc2ltaWxhcml0eTogbnVtYmVyO1xuICBkYXRhOiBUO1xufVxuXG4vKiog7ZWY7J2067iM66as65OcIOqygOyDiSDqsrDqs7wgKFZlY3RvciArIEZUUykgKi9cbmV4cG9ydCBpbnRlcmZhY2UgSHlicmlkU2VhcmNoUmVzdWx0PFQgPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj5cbiAgZXh0ZW5kcyBWZWN0b3JTZWFyY2hSZXN1bHQ8VD4ge1xuICB2ZWN0b3JTY29yZT86IG51bWJlcjtcbiAgZnRzU2NvcmU/OiBudW1iZXI7XG59XG5cbi8qKiDrsqTsuZjrp4jtgawg6rKw6rO8ICovXG5leHBvcnQgaW50ZXJmYWNlIEJlbmNobWFya1Jlc3VsdCB7XG4gIHByb3ZpZGVyOiBFbWJlZGRpbmdQcm92aWRlcjtcbiAgZW1iZWRUaW1lOiBudW1iZXI7XG4gIHNlYXJjaFRpbWU6IG51bWJlcjtcbiAgcmVzdWx0czogVmVjdG9yU2VhcmNoUmVzdWx0W107XG59XG5cbi8qKiBWb3lhZ2UgQUkg7ISk7KCVICovXG5leHBvcnQgaW50ZXJmYWNlIFZveWFnZUNvbmZpZyB7XG4gIGFwaUtleTogc3RyaW5nO1xuICBiYXNlVXJsOiBzdHJpbmc7XG4gIG1vZGVsOiBzdHJpbmc7XG4gIGRpbWVuc2lvbnM6IG51bWJlcjtcbiAgbWF4VG9rZW5zOiBudW1iZXI7XG4gIGJhdGNoU2l6ZTogbnVtYmVyO1xufVxuXG4vKiogT3BlbkFJIOyEpOyglSAqL1xuZXhwb3J0IGludGVyZmFjZSBPcGVuQUlDb25maWcge1xuICBhcGlLZXk6IHN0cmluZztcbiAgYmFzZVVybDogc3RyaW5nO1xuICBtb2RlbDogc3RyaW5nO1xuICBkaW1lbnNpb25zOiBudW1iZXI7XG4gIG1heFRva2VuczogbnVtYmVyO1xuICBiYXRjaFNpemU6IG51bWJlcjtcbn1cblxuLyoqIOyyre2CuSDshKTsoJUgKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2h1bmtpbmdDb25maWcge1xuICBjaHVua1NpemU6IG51bWJlcjtcbiAgY2h1bmtPdmVybGFwOiBudW1iZXI7XG4gIG1pbkNodW5rU2l6ZTogbnVtYmVyO1xuICBza2lwVGhyZXNob2xkOiBudW1iZXI7XG4gIHNlcGFyYXRvcnM6IHN0cmluZ1tdO1xufVxuXG4vKiog6rKA7IOJIOyEpOyglSAqL1xuZXhwb3J0IGludGVyZmFjZSBTZWFyY2hDb25maWcge1xuICBkZWZhdWx0TGltaXQ6IG51bWJlcjtcbiAgc2ltaWxhcml0eVRocmVzaG9sZDogbnVtYmVyO1xuICB2ZWN0b3JXZWlnaHQ6IG51bWJlcjtcbiAgZnRzV2VpZ2h0OiBudW1iZXI7XG59XG5cbi8qKiBwZ3ZlY3RvciDshKTsoJUgKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGd2ZWN0b3JDb25maWcge1xuICBpdGVyYXRpdmVTY2FuOiBib29sZWFuO1xuICBlZlNlYXJjaDogbnVtYmVyO1xufVxuXG4vKiog7KCE7LK0IOuyoe2EsCDshKTsoJUgKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmVjdG9yQ29uZmlnIHtcbiAgdm95YWdlOiBWb3lhZ2VDb25maWc7XG4gIG9wZW5haTogT3BlbkFJQ29uZmlnO1xuICBjaHVua2luZzogQ2h1bmtpbmdDb25maWc7XG4gIHNlYXJjaDogU2VhcmNoQ29uZmlnO1xuICBwZ3ZlY3RvcjogUGd2ZWN0b3JDb25maWc7XG59XG5cbi8qKiDrsqHthLAg6rKA7IOJIOyYteyFmCAqL1xuZXhwb3J0IGludGVyZmFjZSBWZWN0b3JTZWFyY2hPcHRpb25zIHtcbiAgZW1iZWRkaW5nQ29sdW1uPzogc3RyaW5nO1xuICBsaW1pdD86IG51bWJlcjtcbiAgdGhyZXNob2xkPzogbnVtYmVyO1xuICB3aGVyZT86IHN0cmluZztcbn1cblxuLyoqIO2VmOydtOu4jOumrOuTnCDqsoDsg4kg7Ji17IWYICovXG5leHBvcnQgaW50ZXJmYWNlIEh5YnJpZFNlYXJjaE9wdGlvbnMgZXh0ZW5kcyBWZWN0b3JTZWFyY2hPcHRpb25zIHtcbiAgdmVjdG9yV2VpZ2h0PzogbnVtYmVyO1xuICBmdHNXZWlnaHQ/OiBudW1iZXI7XG4gIGZ0c0NvbHVtbj86IHN0cmluZztcbn1cblxuLyoqIOyehOuyoOuUqSDsoIDsnqUg7ZWt66qpICovXG5leHBvcnQgaW50ZXJmYWNlIEVtYmVkZGluZ0l0ZW0ge1xuICBpZDogbnVtYmVyO1xuICB0ZXh0OiBzdHJpbmc7XG59XG5cbi8qKiDsp4TtlonrpaAg7L2c67CxICovXG5leHBvcnQgdHlwZSBQcm9ncmVzc0NhbGxiYWNrID0gKHByb2Nlc3NlZDogbnVtYmVyLCB0b3RhbDogbnVtYmVyKSA9PiB2b2lkO1xuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztDQUVDLEdBRUQsWUFBWSxHQW9IWixXQUFXLEdBQ1gsV0FBMEUifQ==
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy92ZWN0b3IvdHlwZXMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBwZ3ZlY3RvciDthrXtlansnYQg7JyE7ZWcIO2DgOyehSDsoJXsnZhcbiAqL1xuXG4vKiog7J6E67Kg65SpIOygnOqzteyekCAqL1xuZXhwb3J0IHR5cGUgRW1iZWRkaW5nUHJvdmlkZXIgPSBcInZveWFnZVwiIHwgXCJvcGVuYWlcIjtcblxuLyoqIOyeheugpSDtg4DsnoUgKFZveWFnZSBBSSDsoITsmqkgLSDruYTrjIDsua0g7J6E67Kg65SpKSAqL1xuZXhwb3J0IHR5cGUgVmVjdG9ySW5wdXRUeXBlID0gXCJkb2N1bWVudFwiIHwgXCJxdWVyeVwiO1xuXG4vKiog7J6E67Kg65SpIOqysOqzvCAqL1xuZXhwb3J0IGludGVyZmFjZSBFbWJlZGRpbmdSZXN1bHQge1xuICBlbWJlZGRpbmc6IG51bWJlcltdO1xuICBtb2RlbDogc3RyaW5nO1xuICB0b2tlbkNvdW50OiBudW1iZXI7XG59XG5cbi8qKiDssq3tgawg7KCV67O0ICovXG5leHBvcnQgaW50ZXJmYWNlIENodW5rIHtcbiAgaW5kZXg6IG51bWJlcjtcbiAgdGV4dDogc3RyaW5nO1xuICBzdGFydE9mZnNldDogbnVtYmVyO1xuICBlbmRPZmZzZXQ6IG51bWJlcjtcbn1cblxuLyoqIOuyoe2EsCDqsoDsg4kg6rKw6rO8ICovXG5leHBvcnQgaW50ZXJmYWNlIFZlY3RvclNlYXJjaFJlc3VsdDxUID0gUmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHtcbiAgaWQ6IG51bWJlciB8IHN0cmluZztcbiAgc2ltaWxhcml0eTogbnVtYmVyO1xuICBkYXRhOiBUO1xufVxuXG4vKiog7ZWY7J2067iM66as65OcIOqygOyDiSDqsrDqs7wgKFZlY3RvciArIEZUUykgKi9cbmV4cG9ydCBpbnRlcmZhY2UgSHlicmlkU2VhcmNoUmVzdWx0PFQgPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4gZXh0ZW5kcyBWZWN0b3JTZWFyY2hSZXN1bHQ8VD4ge1xuICB2ZWN0b3JTY29yZT86IG51bWJlcjtcbiAgZnRzU2NvcmU/OiBudW1iZXI7XG59XG5cbi8qKiDrsqTsuZjrp4jtgawg6rKw6rO8ICovXG5leHBvcnQgaW50ZXJmYWNlIEJlbmNobWFya1Jlc3VsdCB7XG4gIHByb3ZpZGVyOiBFbWJlZGRpbmdQcm92aWRlcjtcbiAgZW1iZWRUaW1lOiBudW1iZXI7XG4gIHNlYXJjaFRpbWU6IG51bWJlcjtcbiAgcmVzdWx0czogVmVjdG9yU2VhcmNoUmVzdWx0W107XG59XG5cbi8qKiBWb3lhZ2UgQUkg7ISk7KCVICovXG5leHBvcnQgaW50ZXJmYWNlIFZveWFnZUNvbmZpZyB7XG4gIGFwaUtleTogc3RyaW5nO1xuICBiYXNlVXJsOiBzdHJpbmc7XG4gIG1vZGVsOiBzdHJpbmc7XG4gIGRpbWVuc2lvbnM6IG51bWJlcjtcbiAgbWF4VG9rZW5zOiBudW1iZXI7XG4gIGJhdGNoU2l6ZTogbnVtYmVyO1xufVxuXG4vKiogT3BlbkFJIOyEpOyglSAqL1xuZXhwb3J0IGludGVyZmFjZSBPcGVuQUlDb25maWcge1xuICBhcGlLZXk6IHN0cmluZztcbiAgYmFzZVVybDogc3RyaW5nO1xuICBtb2RlbDogc3RyaW5nO1xuICBkaW1lbnNpb25zOiBudW1iZXI7XG4gIG1heFRva2VuczogbnVtYmVyO1xuICBiYXRjaFNpemU6IG51bWJlcjtcbn1cblxuLyoqIOyyre2CuSDshKTsoJUgKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2h1bmtpbmdDb25maWcge1xuICBjaHVua1NpemU6IG51bWJlcjtcbiAgY2h1bmtPdmVybGFwOiBudW1iZXI7XG4gIG1pbkNodW5rU2l6ZTogbnVtYmVyO1xuICBza2lwVGhyZXNob2xkOiBudW1iZXI7XG4gIHNlcGFyYXRvcnM6IHN0cmluZ1tdO1xufVxuXG4vKiog6rKA7IOJIOyEpOyglSAqL1xuZXhwb3J0IGludGVyZmFjZSBTZWFyY2hDb25maWcge1xuICBkZWZhdWx0TGltaXQ6IG51bWJlcjtcbiAgc2ltaWxhcml0eVRocmVzaG9sZDogbnVtYmVyO1xuICB2ZWN0b3JXZWlnaHQ6IG51bWJlcjtcbiAgZnRzV2VpZ2h0OiBudW1iZXI7XG59XG5cbi8qKiBwZ3ZlY3RvciDshKTsoJUgKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGd2ZWN0b3JDb25maWcge1xuICBpdGVyYXRpdmVTY2FuOiBib29sZWFuO1xuICBlZlNlYXJjaDogbnVtYmVyO1xufVxuXG4vKiog7KCE7LK0IOuyoe2EsCDshKTsoJUgKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmVjdG9yQ29uZmlnIHtcbiAgdm95YWdlOiBWb3lhZ2VDb25maWc7XG4gIG9wZW5haTogT3BlbkFJQ29uZmlnO1xuICBjaHVua2luZzogQ2h1bmtpbmdDb25maWc7XG4gIHNlYXJjaDogU2VhcmNoQ29uZmlnO1xuICBwZ3ZlY3RvcjogUGd2ZWN0b3JDb25maWc7XG59XG5cbi8qKiDrsqHthLAg6rKA7IOJIOyYteyFmCAqL1xuZXhwb3J0IGludGVyZmFjZSBWZWN0b3JTZWFyY2hPcHRpb25zIHtcbiAgZW1iZWRkaW5nQ29sdW1uPzogc3RyaW5nO1xuICBsaW1pdD86IG51bWJlcjtcbiAgdGhyZXNob2xkPzogbnVtYmVyO1xuICB3aGVyZT86IHN0cmluZztcbn1cblxuLyoqIO2VmOydtOu4jOumrOuTnCDqsoDsg4kg7Ji17IWYICovXG5leHBvcnQgaW50ZXJmYWNlIEh5YnJpZFNlYXJjaE9wdGlvbnMgZXh0ZW5kcyBWZWN0b3JTZWFyY2hPcHRpb25zIHtcbiAgdmVjdG9yV2VpZ2h0PzogbnVtYmVyO1xuICBmdHNXZWlnaHQ/OiBudW1iZXI7XG4gIGZ0c0NvbHVtbj86IHN0cmluZztcbn1cblxuLyoqIOyehOuyoOuUqSDsoIDsnqUg7ZWt66qpICovXG5leHBvcnQgaW50ZXJmYWNlIEVtYmVkZGluZ0l0ZW0ge1xuICBpZDogbnVtYmVyO1xuICB0ZXh0OiBzdHJpbmc7XG59XG5cbi8qKiDsp4TtlonrpaAg7L2c67CxICovXG5leHBvcnQgdHlwZSBQcm9ncmVzc0NhbGxiYWNrID0gKHByb2Nlc3NlZDogbnVtYmVyLCB0b3RhbDogbnVtYmVyKSA9PiB2b2lkO1xuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztDQUVDLEdBRUQsWUFBWSxHQW1IWixXQUFXLEdBQ1gsV0FBMEUifQ==
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sonamu",
3
- "version": "0.7.10",
3
+ "version": "0.7.12",
4
4
  "description": "Sonamu — TypeScript Fullstack API Framework",
5
5
  "keywords": [
6
6
  "typescript",
@@ -76,8 +76,10 @@
76
76
  "tsicli": "^1.0.5",
77
77
  "vitest": "^4.0.10",
78
78
  "zod": "^4.1.12",
79
- "@sonamu-kit/ts-loader": "^2.1.3",
79
+ "node-cron": "^4.2.1",
80
80
  "@sonamu-kit/hmr-hook": "^0.4.1",
81
+ "@sonamu-kit/ts-loader": "^2.1.3",
82
+ "@sonamu-kit/tasks": "^0.0.1",
81
83
  "@sonamu-kit/hmr-runner": "^0.1.1"
82
84
  },
83
85
  "devDependencies": {
package/src/api/config.ts CHANGED
@@ -9,7 +9,9 @@ import type { QsPluginOptions } from "fastify-qs";
9
9
  import type { SsePluginOptions } from "fastify-sse-v2/lib/types";
10
10
  import type { Knex } from "knex";
11
11
  import type { Driver } from "../file-storage/driver";
12
- import type { SonamuFastifyConfig } from "../types/types";
12
+ import type { WorkflowOptions } from "../tasks/workflow-manager";
13
+ import type { Executable, SonamuFastifyConfig } from "../types/types";
14
+ import type { AuthContext, Context } from "./context";
13
15
 
14
16
  export type DatabaseConfig = Omit<Knex.Config, "connection"> & {
15
17
  connection?: Knex.PgConnectionConfig;
@@ -50,6 +52,7 @@ export type SonamuConfig = {
50
52
  };
51
53
 
52
54
  server: SonamuServerOptions;
55
+ tasks?: SonamuTaskOptions;
53
56
  };
54
57
 
55
58
  export type SonamuServerOptions = {
@@ -90,14 +93,18 @@ export type SonamuServerOptions = {
90
93
  };
91
94
  };
92
95
 
93
- // NOTE(Haze, 251209): config에는 T, Promise<T>, () => T, () => Promise<T>가 모두 올 수 있어야 함.
94
- export type SonamuConfigExport =
95
- | SonamuConfig
96
- | Promise<SonamuConfig>
97
- | (() => SonamuConfig)
98
- | (() => Promise<SonamuConfig>);
96
+ export type SonamuTaskOptions = {
97
+ // worker를 사용할지 여부, 기본적으로 daemon 모드에서만 사용됨.
98
+ enableWorker?: boolean;
99
+ workerOptions?: WorkflowOptions;
100
+ contextProvider: (
101
+ defaultContext: Pick<Context, "reply" | "request" | "headers" | "createSSE" | "naiteStore"> &
102
+ AuthContext,
103
+ ) => Context | Promise<Context>;
104
+ };
99
105
 
100
- export function defineConfig(config: SonamuConfigExport): Promise<SonamuConfig> {
106
+ // NOTE(Haze, 251209): config에는 T, Promise<T>, () => T, () => Promise<T>가 모두 올 수 있어야 함.
107
+ export function defineConfig(config: Executable<SonamuConfig>): Promise<SonamuConfig> {
101
108
  if (typeof config === "function") {
102
109
  return Promise.resolve(config());
103
110
  }
package/src/api/sonamu.ts CHANGED
@@ -3,15 +3,18 @@ import { AsyncLocalStorage } from "async_hooks";
3
3
  import type { FSWatcher } from "chokidar";
4
4
  import type { FastifyInstance, FastifyReply, FastifyRequest } from "fastify";
5
5
  import type { IncomingMessage, Server, ServerResponse } from "http";
6
+ import os from "os";
6
7
  import path from "path";
7
8
  import type { ZodObject } from "zod";
9
+ import { createMockSSEFactory, DB, isDaemonServer } from "..";
8
10
  import type { SonamuDBConfig } from "../database/db";
9
11
  import type { Driver } from "../file-storage/driver";
10
12
  import { Naite } from "../naite/naite";
11
13
  import type { Syncer } from "../syncer/syncer";
14
+ import type { WorkflowManager } from "../tasks/workflow-manager";
12
15
  import type { SonamuFastifyConfig } from "../types/types";
13
16
  import type { AbsolutePath } from "../utils/path-utils";
14
- import type { SonamuConfig, SonamuServerOptions } from "./config";
17
+ import type { SonamuConfig, SonamuServerOptions, SonamuTaskOptions } from "./config";
15
18
  import type { AuthContext, Context, UploadContext } from "./context";
16
19
  import type { ExtendedApi } from "./decorators";
17
20
 
@@ -42,7 +45,7 @@ class SonamuClass {
42
45
  request: null,
43
46
  reply: null,
44
47
  headers: {},
45
- createSSE: () => {},
48
+ createSSE: (schema: ZodObject) => createMockSSEFactory(schema),
46
49
  // biome-ignore lint/suspicious/noExplicitAny: 테스팅 환경에서 컨텍스트가 주입되지 않은 경우 빈 컨텍스트 리턴
47
50
  naiteStore: new Map<string, any>(),
48
51
  } as unknown as Context;
@@ -122,6 +125,15 @@ class SonamuClass {
122
125
  return this._storage;
123
126
  }
124
127
 
128
+ private _workflows: WorkflowManager | null = null;
129
+ get workflows(): WorkflowManager {
130
+ if (this._workflows === null) {
131
+ throw new Error("Sonamu has not been initialized");
132
+ }
133
+
134
+ return this._workflows;
135
+ }
136
+
125
137
  // HMR 처리
126
138
  public watcher: FSWatcher | null = null;
127
139
  private pendingFiles: string[] = [];
@@ -192,6 +204,9 @@ class SonamuClass {
192
204
  return;
193
205
  }
194
206
 
207
+ // Task 등록
208
+ await this.initializeWorkflows(this.config.tasks);
209
+
195
210
  // Syncer
196
211
  const { Syncer } = await import("../syncer/syncer");
197
212
  this.syncer = new Syncer();
@@ -200,6 +215,7 @@ class SonamuClass {
200
215
  await this.syncer.autoloadTypes();
201
216
  await this.syncer.autoloadModels();
202
217
  await this.syncer.autoloadApis();
218
+ await this.syncer.autoloadWorkflows();
203
219
 
204
220
  const { TemplateManager } = await import("../template");
205
221
  await TemplateManager.autoload();
@@ -563,12 +579,36 @@ class SonamuClass {
563
579
  }
564
580
  }
565
581
 
582
+ private async initializeWorkflows(options: SonamuTaskOptions | undefined) {
583
+ const { WorkflowManager } = await import("../tasks/workflow-manager");
584
+ // NOTE: @sonamu-kit/tasks 안에선 knex config를 수정하기 때문에 connection이 아닌 config 째로 보냅니다.
585
+ this._workflows = await WorkflowManager.create(DB.getDBConfig("w"), true);
586
+ if (!options) {
587
+ return;
588
+ }
589
+
590
+ const enableWorker = options.enableWorker ?? isDaemonServer();
591
+ const defaultWorkerOptions = {
592
+ concurrency: os.cpus().length - 1,
593
+ usePubSub: true,
594
+ listenDelay: 500,
595
+ };
596
+
597
+ if (enableWorker) {
598
+ await this.workflows.setupWorker({
599
+ ...defaultWorkerOptions,
600
+ ...options.workerOptions,
601
+ });
602
+ }
603
+ }
604
+
566
605
  private async boot(server: FastifyInstance, options: SonamuServerOptions) {
567
606
  const port = options.listen?.port ?? 3000;
568
607
  const host = options.listen?.host ?? "localhost";
569
608
 
570
609
  server.addHook("onClose", async () => {
571
610
  await options.lifecycle?.onShutdown?.(server);
611
+ await this.workflows.destroy();
572
612
  await this.destroy();
573
613
  });
574
614
 
@@ -640,6 +680,7 @@ class SonamuClass {
640
680
  async destroy(): Promise<void> {
641
681
  const { BaseModel } = await import("../database/base-model");
642
682
  await BaseModel.destroy();
683
+ await this._workflows?.destroy();
643
684
  await this.watcher?.close();
644
685
  this.storage?.destroy();
645
686
  }
package/src/bin/cli.ts CHANGED
@@ -27,61 +27,65 @@ async function bootstrap() {
27
27
  await Sonamu.init(false, false);
28
28
  }
29
29
 
30
- await tsicli(process.argv, {
31
- types: {
32
- "#entityId": {
33
- type: "autocomplete",
34
- name: "#entityId",
35
- message: "Please input #entityId",
36
- choices: EntityManager.getAllParentIds().map((entityId) => ({
37
- title: entityId,
38
- value: entityId,
39
- })),
30
+ try {
31
+ await tsicli(process.argv, {
32
+ types: {
33
+ "#entityId": {
34
+ type: "autocomplete",
35
+ name: "#entityId",
36
+ message: "Please input #entityId",
37
+ choices: EntityManager.getAllParentIds().map((entityId) => ({
38
+ title: entityId,
39
+ value: entityId,
40
+ })),
41
+ },
42
+ "#recordIds": "number[]",
43
+ "#name": "string",
40
44
  },
41
- "#recordIds": "number[]",
42
- "#name": "string",
43
- },
44
- args: [
45
- ["fixture", "init"],
46
- ["fixture", "import", "#entityId", "#recordIds"],
47
- ["fixture", "sync"],
48
- ["migrate", "run"],
49
- ["migrate", "check"],
50
- ["migrate", "rollback"],
51
- ["migrate", "reset"],
52
- ["migrate", "clear"],
53
- ["migrate", "status"],
54
- ["stub", "practice", "#name"],
55
- ["stub", "entity", "#name"],
56
- ["scaffold", "model", "#entityId"],
57
- ["scaffold", "model_test", "#entityId"],
58
- ["scaffold", "view_list", "#entityId"],
59
- ["scaffold", "view_form", "#entityId"],
60
- ["ui"],
61
- ["sync"],
62
- ["dev"],
63
- ["build"],
64
- ["start"],
65
- ],
66
- runners: {
67
- migrate_status,
68
- migrate_run,
69
- fixture_init,
70
- fixture_import,
71
- fixture_sync,
72
- stub_practice,
73
- stub_entity,
74
- scaffold_model,
75
- scaffold_model_test,
76
- ui,
77
- // scaffold_view_list,
78
- // scaffold_view_form,
79
- sync,
80
- dev,
81
- build,
82
- start,
83
- },
84
- });
45
+ args: [
46
+ ["fixture", "init"],
47
+ ["fixture", "import", "#entityId", "#recordIds"],
48
+ ["fixture", "sync"],
49
+ ["migrate", "run"],
50
+ ["migrate", "check"],
51
+ ["migrate", "rollback"],
52
+ ["migrate", "reset"],
53
+ ["migrate", "clear"],
54
+ ["migrate", "status"],
55
+ ["stub", "practice", "#name"],
56
+ ["stub", "entity", "#name"],
57
+ ["scaffold", "model", "#entityId"],
58
+ ["scaffold", "model_test", "#entityId"],
59
+ ["scaffold", "view_list", "#entityId"],
60
+ ["scaffold", "view_form", "#entityId"],
61
+ ["ui"],
62
+ ["sync"],
63
+ ["dev"],
64
+ ["build"],
65
+ ["start"],
66
+ ],
67
+ runners: {
68
+ migrate_status,
69
+ migrate_run,
70
+ fixture_init,
71
+ fixture_import,
72
+ fixture_sync,
73
+ stub_practice,
74
+ stub_entity,
75
+ scaffold_model,
76
+ scaffold_model_test,
77
+ ui,
78
+ // scaffold_view_list,
79
+ // scaffold_view_form,
80
+ sync,
81
+ dev,
82
+ build,
83
+ start,
84
+ },
85
+ });
86
+ } finally {
87
+ await Sonamu.destroy();
88
+ }
85
89
  }
86
90
 
87
91
  bootstrap().finally(async () => {
@@ -2,24 +2,13 @@
2
2
 
3
3
  import type { Knex } from "knex";
4
4
  import { group, isObject, omit, set } from "radashi";
5
+ import type { ListResult } from "..";
5
6
  import { Sonamu } from "../api";
6
- import { EntityManager } from "../entity/entity-manager";
7
- import type { DatabaseSchemaExtend } from "../types/types";
7
+ import type { DatabaseSchemaExtend, SonamuQueryMode } from "../types/types";
8
8
  import { getJoinTables, getTableNamesFromWhere } from "../utils/sql-parser";
9
9
  import { chunk } from "../utils/utils";
10
- import type {
11
- EmbeddingItem,
12
- EmbeddingProvider,
13
- HybridSearchOptions,
14
- HybridSearchResult,
15
- ProgressCallback,
16
- VectorSearchOptions,
17
- VectorSearchResult,
18
- } from "../vector/types";
19
- import { VectorSearch } from "../vector/vector-search";
20
10
  import type {
21
11
  EnhancerMap,
22
- ExecuteSubsetQueryResult,
23
12
  ResolveSubsetIntersection,
24
13
  UnionExtractedTTables,
25
14
  } from "./base-model.types";
@@ -69,118 +58,7 @@ export class BaseModelClass<
69
58
  return new PuriWrapper(db, new UpsertBuilder());
70
59
  }
71
60
 
72
- // VectorSearch 인스턴스 캐시
73
- private _vectorSearch: VectorSearch<any> | null = null;
74
-
75
- /**
76
- * 벡터 검색 인스턴스 반환
77
- * - 기본 provider: voyage
78
- * - 기본 dimensions: 1024 (DEFAULT_VECTOR_CONFIG 사용)
79
- */
80
- getVector<T = Record<string, unknown>>(): VectorSearch<T> {
81
- if (this._vectorSearch) {
82
- return this._vectorSearch as VectorSearch<T>;
83
- }
84
-
85
- const entity = EntityManager.get(this.modelName);
86
-
87
- this._vectorSearch = new VectorSearch<T>(this.getDB("w"), entity.table);
88
-
89
- return this._vectorSearch as VectorSearch<T>;
90
- }
91
-
92
- /**
93
- * 벡터 검색 (코사인 유사도)
94
- * @param query - 검색어
95
- * @param options - 검색 옵션
96
- */
97
- async vectorSearch<T = Record<string, unknown>>(
98
- query: string,
99
- options: VectorSearchOptions & { provider?: EmbeddingProvider } = {},
100
- ): Promise<VectorSearchResult<T>[]> {
101
- const entity = EntityManager.get(this.modelName);
102
- const vectorProp = entity.getVectorColumn();
103
- if (!vectorProp) {
104
- throw new Error(`${this.modelName} Entity에 vector 컬럼이 정의되지 않았습니다.`);
105
- }
106
-
107
- const vs = new VectorSearch<T>(this.getDB("w"), entity.table);
108
- return vs.search(query, options.provider ?? "voyage", {
109
- ...options,
110
- embeddingColumn: options.embeddingColumn ?? vectorProp.name,
111
- });
112
- }
113
-
114
- /**
115
- * 하이브리드 검색 (Vector + FTS)
116
- * @param query - 검색어
117
- * @param options - 검색 옵션
118
- */
119
- async hybridSearch<T = Record<string, unknown>>(
120
- query: string,
121
- options: HybridSearchOptions & { provider?: EmbeddingProvider } = {},
122
- ): Promise<HybridSearchResult<T>[]> {
123
- const entity = EntityManager.get(this.modelName);
124
- const vectorProp = entity.getVectorColumn();
125
- if (!vectorProp) {
126
- throw new Error(`${this.modelName} Entity에 vector 컬럼이 정의되지 않았습니다.`);
127
- }
128
-
129
- const vs = new VectorSearch<T>(this.getDB("w"), entity.table);
130
- return vs.hybridSearch(query, options.provider ?? "voyage", {
131
- ...options,
132
- embeddingColumn: options.embeddingColumn ?? vectorProp.name,
133
- });
134
- }
135
-
136
- /**
137
- * 단일 레코드에 임베딩 저장
138
- * @param id - 레코드 ID
139
- * @param text - 임베딩할 텍스트
140
- * @param options - provider, embeddingColumn 옵션
141
- */
142
- async saveEmbedding(
143
- id: number,
144
- text: string,
145
- options: { provider?: EmbeddingProvider; embeddingColumn?: string } = {},
146
- ): Promise<void> {
147
- const entity = EntityManager.get(this.modelName);
148
- const vectorProp = entity.getVectorColumn(options.embeddingColumn);
149
- if (!vectorProp) {
150
- throw new Error(`${this.modelName} Entity에 vector 컬럼이 정의되지 않았습니다.`);
151
- }
152
-
153
- const { provider = "voyage" } = options;
154
- const vs = this.getVector();
155
- return vs.saveEmbedding(id, text, provider, vectorProp.name);
156
- }
157
-
158
- /**
159
- * 여러 레코드에 임베딩 일괄 저장
160
- * @param items - { id, text } 배열
161
- * @param options - provider, embeddingColumn, onProgress 옵션
162
- */
163
- async saveEmbeddingsBatch(
164
- items: EmbeddingItem[],
165
- options: {
166
- provider?: EmbeddingProvider;
167
- embeddingColumn?: string;
168
- onProgress?: ProgressCallback;
169
- } = {},
170
- ): Promise<void> {
171
- const entity = EntityManager.get(this.modelName);
172
- const vectorProp = entity.getVectorColumn(options.embeddingColumn);
173
- if (!vectorProp) {
174
- throw new Error(`${this.modelName} Entity에 vector 컬럼이 정의되지 않았습니다.`);
175
- }
176
-
177
- const { provider = "voyage", onProgress } = options;
178
- const vs = this.getVector();
179
- return vs.saveEmbeddingsBatch(items, provider, vectorProp.name, onProgress);
180
- }
181
-
182
61
  async destroy() {
183
- this._vectorSearch = null;
184
62
  return DB.destroy();
185
63
  }
186
64
 
@@ -275,6 +153,11 @@ export class BaseModelClass<
275
153
  async executeSubsetQuery<
276
154
  T extends TSubsetKey,
277
155
  TComputedResults extends InferAllSubsets<TSubsetQueries, TLoaderQueries>,
156
+ LP extends {
157
+ num?: number;
158
+ page?: number;
159
+ queryMode?: SonamuQueryMode;
160
+ },
278
161
  >(
279
162
  params: {
280
163
  subset: T;
@@ -282,12 +165,12 @@ export class BaseModelClass<
282
165
  params: {
283
166
  num: number;
284
167
  page: number;
285
- queryMode?: "list" | "count" | "both";
168
+ queryMode?: SonamuQueryMode;
286
169
  };
287
170
  debug?: boolean;
288
171
  optimizeCountQuery?: boolean;
289
172
  } & EnhancerParam<TSubsetKey, TComputedResults, TSubsetMapping>,
290
- ): Promise<ExecuteSubsetQueryResult<TSubsetMapping, T>> {
173
+ ): Promise<ListResult<LP, TSubsetMapping[T]>> {
291
174
  const { subset, qb, params: queryParams, debug = false, optimizeCountQuery = false } = params;
292
175
 
293
176
  if (!this.loaderQueries) {
@@ -296,9 +179,13 @@ export class BaseModelClass<
296
179
 
297
180
  const { num, page } = queryParams;
298
181
 
299
- // COUNT 쿼리 실행
182
+ // COUNT 쿼리 실행 (queryMode: list일 때는 0 리턴)
300
183
  const total = await this.executeCountQuery(qb, queryParams, debug, optimizeCountQuery);
301
184
 
185
+ if (queryParams?.queryMode === "count") {
186
+ return { total } as ListResult<LP, TSubsetMapping[T]>;
187
+ }
188
+
302
189
  // LIST 쿼리 실행
303
190
  const computedRows = await this.executeListQuery(subset, qb, queryParams, num, page, debug);
304
191
 
@@ -308,7 +195,13 @@ export class BaseModelClass<
308
195
  computedRows.map((row) => enhancer?.(row) ?? row),
309
196
  )) as TSubsetMapping[T][];
310
197
 
311
- return { rows, total };
198
+ if (queryParams.queryMode === "list") {
199
+ // 리스트만 리턴
200
+ return { rows } as ListResult<LP, TSubsetMapping[T]>;
201
+ } else {
202
+ // 둘다 리턴
203
+ return { rows, total } as ListResult<LP, TSubsetMapping[T]>;
204
+ }
312
205
  }
313
206
 
314
207
  /**