@api-client/core 0.19.0 → 0.19.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (121) hide show
  1. package/build/src/decorators/observed.d.ts.map +1 -1
  2. package/build/src/decorators/observed.js +49 -8
  3. package/build/src/decorators/observed.js.map +1 -1
  4. package/build/src/mocking/ModelingMock.d.ts +2 -0
  5. package/build/src/mocking/ModelingMock.d.ts.map +1 -1
  6. package/build/src/mocking/ModelingMock.js +2 -0
  7. package/build/src/mocking/ModelingMock.js.map +1 -1
  8. package/build/src/mocking/lib/Ai.d.ts +11 -0
  9. package/build/src/mocking/lib/Ai.d.ts.map +1 -0
  10. package/build/src/mocking/lib/Ai.js +53 -0
  11. package/build/src/mocking/lib/Ai.js.map +1 -0
  12. package/build/src/modeling/ai/DataDomainDelta.d.ts +146 -0
  13. package/build/src/modeling/ai/DataDomainDelta.d.ts.map +1 -0
  14. package/build/src/modeling/ai/DataDomainDelta.js +729 -0
  15. package/build/src/modeling/ai/DataDomainDelta.js.map +1 -0
  16. package/build/src/modeling/ai/DomainSerialization.d.ts +20 -0
  17. package/build/src/modeling/ai/DomainSerialization.d.ts.map +1 -0
  18. package/build/src/modeling/ai/DomainSerialization.js +185 -0
  19. package/build/src/modeling/ai/DomainSerialization.js.map +1 -0
  20. package/build/src/modeling/ai/domain_response_schema.d.ts +806 -0
  21. package/build/src/modeling/ai/domain_response_schema.d.ts.map +1 -0
  22. package/build/src/modeling/ai/domain_response_schema.js +289 -0
  23. package/build/src/modeling/ai/domain_response_schema.js.map +1 -0
  24. package/build/src/modeling/ai/domain_tools.d.ts +68 -0
  25. package/build/src/modeling/ai/domain_tools.d.ts.map +1 -0
  26. package/build/src/modeling/ai/domain_tools.js +71 -0
  27. package/build/src/modeling/ai/domain_tools.js.map +1 -0
  28. package/build/src/modeling/ai/index.d.ts +10 -0
  29. package/build/src/modeling/ai/index.d.ts.map +1 -0
  30. package/build/src/modeling/ai/index.js +9 -0
  31. package/build/src/modeling/ai/index.js.map +1 -0
  32. package/build/src/modeling/ai/message_parser.d.ts +23 -0
  33. package/build/src/modeling/ai/message_parser.d.ts.map +1 -0
  34. package/build/src/modeling/ai/message_parser.js +93 -0
  35. package/build/src/modeling/ai/message_parser.js.map +1 -0
  36. package/build/src/modeling/ai/prompts/domain_system.d.ts +6 -0
  37. package/build/src/modeling/ai/prompts/domain_system.d.ts.map +1 -0
  38. package/build/src/modeling/ai/prompts/domain_system.js +80 -0
  39. package/build/src/modeling/ai/prompts/domain_system.js.map +1 -0
  40. package/build/src/modeling/ai/tools/DataDomain.tools.d.ts +25 -0
  41. package/build/src/modeling/ai/tools/DataDomain.tools.d.ts.map +1 -0
  42. package/build/src/modeling/ai/tools/DataDomain.tools.js +334 -0
  43. package/build/src/modeling/ai/tools/DataDomain.tools.js.map +1 -0
  44. package/build/src/modeling/ai/tools/Semantic.tools.d.ts +48 -0
  45. package/build/src/modeling/ai/tools/Semantic.tools.d.ts.map +1 -0
  46. package/build/src/modeling/ai/tools/Semantic.tools.js +36 -0
  47. package/build/src/modeling/ai/tools/Semantic.tools.js.map +1 -0
  48. package/build/src/modeling/ai/tools/config.d.ts +13 -0
  49. package/build/src/modeling/ai/tools/config.d.ts.map +1 -0
  50. package/build/src/modeling/ai/tools/config.js +2 -0
  51. package/build/src/modeling/ai/tools/config.js.map +1 -0
  52. package/build/src/modeling/ai/types.d.ts +302 -0
  53. package/build/src/modeling/ai/types.d.ts.map +1 -0
  54. package/build/src/modeling/ai/types.js +40 -0
  55. package/build/src/modeling/ai/types.js.map +1 -0
  56. package/build/src/models/AiMessage.d.ts +185 -0
  57. package/build/src/models/AiMessage.d.ts.map +1 -0
  58. package/build/src/models/AiMessage.js +203 -0
  59. package/build/src/models/AiMessage.js.map +1 -0
  60. package/build/src/models/AiSession.d.ts +80 -0
  61. package/build/src/models/AiSession.d.ts.map +1 -0
  62. package/build/src/models/AiSession.js +102 -0
  63. package/build/src/models/AiSession.js.map +1 -0
  64. package/build/src/models/kinds.d.ts +2 -0
  65. package/build/src/models/kinds.d.ts.map +1 -1
  66. package/build/src/models/kinds.js +2 -0
  67. package/build/src/models/kinds.js.map +1 -1
  68. package/build/src/sdk/AiSdk.d.ts +93 -0
  69. package/build/src/sdk/AiSdk.d.ts.map +1 -0
  70. package/build/src/sdk/AiSdk.js +348 -0
  71. package/build/src/sdk/AiSdk.js.map +1 -0
  72. package/build/src/sdk/RouteBuilder.d.ts +7 -0
  73. package/build/src/sdk/RouteBuilder.d.ts.map +1 -1
  74. package/build/src/sdk/RouteBuilder.js +18 -0
  75. package/build/src/sdk/RouteBuilder.js.map +1 -1
  76. package/build/src/sdk/Sdk.d.ts +2 -0
  77. package/build/src/sdk/Sdk.d.ts.map +1 -1
  78. package/build/src/sdk/Sdk.js +2 -0
  79. package/build/src/sdk/Sdk.js.map +1 -1
  80. package/build/src/sdk/SdkBase.d.ts +4 -0
  81. package/build/src/sdk/SdkBase.d.ts.map +1 -1
  82. package/build/src/sdk/SdkBase.js.map +1 -1
  83. package/build/src/sdk/SdkMock.d.ts +15 -0
  84. package/build/src/sdk/SdkMock.d.ts.map +1 -1
  85. package/build/src/sdk/SdkMock.js +118 -0
  86. package/build/src/sdk/SdkMock.js.map +1 -1
  87. package/build/tsconfig.tsbuildinfo +1 -1
  88. package/package.json +3 -3
  89. package/src/decorators/observed.ts +51 -9
  90. package/src/mocking/ModelingMock.ts +2 -0
  91. package/src/mocking/lib/Ai.ts +71 -0
  92. package/src/modeling/ai/DataDomainDelta.ts +798 -0
  93. package/src/modeling/ai/DomainSerialization.ts +199 -0
  94. package/src/modeling/ai/domain_response_schema.ts +301 -0
  95. package/src/modeling/ai/domain_tools.ts +76 -0
  96. package/src/modeling/ai/message_parser.ts +101 -0
  97. package/src/modeling/ai/prompts/domain_system.ts +79 -0
  98. package/src/modeling/ai/readme.md +8 -0
  99. package/src/modeling/ai/tools/DataDomain.tools.ts +365 -0
  100. package/src/modeling/ai/tools/Semantic.tools.ts +38 -0
  101. package/src/modeling/ai/tools/config.ts +13 -0
  102. package/src/modeling/ai/tools/readme.md +3 -0
  103. package/src/modeling/ai/types.ts +306 -0
  104. package/src/models/AiMessage.ts +335 -0
  105. package/src/models/AiSession.ts +160 -0
  106. package/src/models/kinds.ts +2 -0
  107. package/src/sdk/AiSdk.ts +395 -0
  108. package/src/sdk/RouteBuilder.ts +27 -0
  109. package/src/sdk/Sdk.ts +3 -0
  110. package/src/sdk/SdkBase.ts +4 -0
  111. package/src/sdk/SdkMock.ts +185 -0
  112. package/tests/unit/decorators/observed_recursive.spec.ts +39 -0
  113. package/tests/unit/mocking/current/Ai.spec.ts +109 -0
  114. package/tests/unit/modeling/ai/DataDomainDelta.spec.ts +419 -0
  115. package/tests/unit/modeling/ai/DomainAiTools.spec.ts +29 -0
  116. package/tests/unit/modeling/ai/DomainSerialization.spec.ts +143 -0
  117. package/tests/unit/modeling/ai/message_parser.spec.ts +157 -0
  118. package/tests/unit/modeling/ai/tools/DataDomain.tools.spec.ts +64 -0
  119. package/tests/unit/modeling/ai/tools/Semantic.tools.spec.ts +55 -0
  120. package/tests/unit/models/AiMessage.spec.ts +216 -0
  121. package/tests/unit/models/AiSession.spec.ts +147 -0
@@ -25,6 +25,8 @@ import type { DataCatalogVersionSchema } from '../models/DataCatalogVersion.js'
25
25
  import { DataDomain, type DataDomainSchema } from '../modeling/DataDomain.js'
26
26
  import type { ForeignDomainDependency } from '../modeling/types.js'
27
27
  import { nanoid } from '../nanoid.js'
28
+ import type { AiSessionSchema, AiSessionApp } from '../models/AiSession.js'
29
+ import type { AiMessageSchema } from '../models/AiMessage.js'
28
30
 
29
31
  export interface MockResult {
30
32
  /**
@@ -770,6 +772,189 @@ export class SdkMock {
770
772
  },
771
773
  }
772
774
 
775
+ ai = {
776
+ sessions: {
777
+ list: async (init?: MockListResult, options?: InterceptOptions): Promise<void> => {
778
+ const { mock } = this
779
+ const respond = this.createDefaultResponse(
780
+ 200,
781
+ { 'content-type': 'application/json' },
782
+ () => {
783
+ const obj: ContextListResult<AiSessionSchema> = {
784
+ items: this.gen.ai.sessions('general', init?.size ?? 5),
785
+ cursor: this.createCursorOption(init),
786
+ }
787
+ return JSON.stringify(obj)
788
+ },
789
+ init
790
+ )
791
+ await mock.add(
792
+ {
793
+ match: {
794
+ uri: RouteBuilder.aiSessions(':oid', ':app' as AiSessionApp),
795
+ methods: ['GET'],
796
+ },
797
+ respond,
798
+ },
799
+ options
800
+ )
801
+ },
802
+ create: async (init?: MockResult, options?: InterceptOptions): Promise<void> => {
803
+ const { mock } = this
804
+ const respond = this.createDefaultResponse(
805
+ 201,
806
+ { 'content-type': 'application/json' },
807
+ () => JSON.stringify(this.gen.ai.session()),
808
+ init
809
+ )
810
+ await mock.add(
811
+ {
812
+ match: {
813
+ uri: RouteBuilder.aiSessions(':oid', ':app' as AiSessionApp),
814
+ methods: ['POST'],
815
+ },
816
+ respond,
817
+ },
818
+ options
819
+ )
820
+ },
821
+ read: async (init?: MockResult, options?: InterceptOptions): Promise<void> => {
822
+ const { mock } = this
823
+ const respond = this.createDefaultResponse(
824
+ 200,
825
+ { 'content-type': 'application/json' },
826
+ () => JSON.stringify(this.gen.ai.session()),
827
+ init
828
+ )
829
+ await mock.add(
830
+ {
831
+ match: {
832
+ uri: RouteBuilder.aiSession(':oid', ':app' as AiSessionApp, ':sid'),
833
+ methods: ['GET'],
834
+ },
835
+ respond,
836
+ },
837
+ options
838
+ )
839
+ },
840
+ update: async (init?: MockResult, options?: InterceptOptions): Promise<void> => {
841
+ const { mock } = this
842
+ const respond = this.createDefaultResponse(
843
+ 200,
844
+ { 'content-type': 'application/json' },
845
+ () => JSON.stringify(this.gen.ai.session()),
846
+ init
847
+ )
848
+ await mock.add(
849
+ {
850
+ match: {
851
+ uri: RouteBuilder.aiSession(':oid', ':app' as AiSessionApp, ':sid'),
852
+ methods: ['PUT'],
853
+ },
854
+ respond,
855
+ },
856
+ options
857
+ )
858
+ },
859
+ delete: async (init?: MockResult, options?: InterceptOptions): Promise<void> => {
860
+ const { mock } = this
861
+ const respond = this.createDefaultResponse(204, undefined, undefined, init)
862
+ await mock.add(
863
+ {
864
+ match: {
865
+ uri: RouteBuilder.aiSession(':oid', ':app' as AiSessionApp, ':sid'),
866
+ methods: ['DELETE'],
867
+ },
868
+ respond,
869
+ },
870
+ options
871
+ )
872
+ },
873
+ },
874
+
875
+ messages: {
876
+ list: async (init?: MockListResult, options?: InterceptOptions): Promise<void> => {
877
+ const { mock } = this
878
+ const respond = this.createDefaultResponse(
879
+ 200,
880
+ { 'content-type': 'application/json' },
881
+ () => {
882
+ const obj: ContextListResult<AiMessageSchema> = {
883
+ items: this.gen.ai.messages(init?.size ?? 5),
884
+ cursor: this.createCursorOption(init),
885
+ }
886
+ return JSON.stringify(obj)
887
+ },
888
+ init
889
+ )
890
+ await mock.add(
891
+ {
892
+ match: {
893
+ uri: RouteBuilder.aiMessages(':oid', ':sid'),
894
+ methods: ['GET'],
895
+ },
896
+ respond,
897
+ },
898
+ options
899
+ )
900
+ },
901
+ update: async (init?: MockResult, options?: InterceptOptions): Promise<void> => {
902
+ const { mock } = this
903
+ const respond = this.createDefaultResponse(
904
+ 200,
905
+ { 'content-type': 'application/json' },
906
+ () => JSON.stringify(this.gen.ai.message()),
907
+ init
908
+ )
909
+ await mock.add(
910
+ {
911
+ match: {
912
+ uri: RouteBuilder.aiMessage(':oid', ':sid', ':mid'),
913
+ methods: ['PUT'],
914
+ },
915
+ respond,
916
+ },
917
+ options
918
+ )
919
+ },
920
+ delete: async (init?: MockResult, options?: InterceptOptions): Promise<void> => {
921
+ const { mock } = this
922
+ const respond = this.createDefaultResponse(204, undefined, undefined, init)
923
+ await mock.add(
924
+ {
925
+ match: {
926
+ uri: RouteBuilder.aiMessage(':oid', ':sid', ':mid'),
927
+ methods: ['DELETE'],
928
+ },
929
+ respond,
930
+ },
931
+ options
932
+ )
933
+ },
934
+ },
935
+
936
+ modifyDomain: async (init?: MockResult, options?: InterceptOptions): Promise<void> => {
937
+ const { mock } = this
938
+ // Return a basic JSON response simulating the stream end state for simplicity if not overriding.
939
+ const respond = this.createDefaultResponse(
940
+ 200,
941
+ { 'content-type': 'text/event-stream' },
942
+ () => 'event: done\ndata: {}\n\n',
943
+ init
944
+ )
945
+ await mock.add(
946
+ {
947
+ match: {
948
+ uri: RouteBuilder.aiModifyDomain(':oid', ':fid') as string,
949
+ methods: ['POST'],
950
+ },
951
+ respond,
952
+ },
953
+ options
954
+ )
955
+ },
956
+ }
957
+
773
958
  /**
774
959
  * User API mocks.
775
960
  */
@@ -0,0 +1,39 @@
1
+ import { test } from '@japa/runner'
2
+ import { observed, toRaw } from '../../../src/decorators/observed.js'
3
+
4
+ test.group('toRaw recursive proxies', () => {
5
+ test('toRaw cleans proxies recursively', ({ assert }) => {
6
+ const mockDomain = {
7
+ notifyChange() {
8
+ // nothing...
9
+ },
10
+ }
11
+ class TestClass {
12
+ domain = mockDomain
13
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
14
+ @observed({ deep: true }) accessor data: any
15
+ }
16
+
17
+ const obj1 = new TestClass()
18
+ const obj2 = new TestClass()
19
+
20
+ obj1.data = { nested: 1 }
21
+ // obj1.data is a proxy
22
+ obj2.data = { prop: obj1.data }
23
+
24
+ const raw1 = toRaw(obj1, obj1.data)
25
+ const raw2 = toRaw(obj2, obj2.data)
26
+
27
+ // obj2.data is a proxy. toRaw should return its raw representation.
28
+ // However, that raw representation's .prop was assigned a proxy (obj1.data).
29
+ // toRaw should recursively clean it and return a raw object whose .prop
30
+ // is exactly raw1.
31
+ assert.strictEqual(raw2.prop, raw1)
32
+
33
+ // Additional case: Array
34
+ const obj3 = new TestClass()
35
+ obj3.data = [obj1.data]
36
+ const raw3 = toRaw(obj3, obj3.data)
37
+ assert.strictEqual(raw3[0], raw1)
38
+ })
39
+ })
@@ -0,0 +1,109 @@
1
+ import { test } from '@japa/runner'
2
+ import { Ai } from '../../../../src/mocking/lib/Ai.js'
3
+ import { AiSessionKind, AiMessageKind } from '../../../../src/models/kinds.js'
4
+ import type { AiSessionSchema } from '../../../../src/models/AiSession.js'
5
+ import type { AiMessageSchema } from '../../../../src/models/AiMessage.js'
6
+
7
+ test.group('Ai Mock Generator', (group) => {
8
+ let aiMock: Ai
9
+
10
+ group.each.setup(() => {
11
+ aiMock = new Ai()
12
+ })
13
+
14
+ test('session() returns a valid AiSession object', ({ assert }) => {
15
+ const result = aiMock.session()
16
+ assert.typeOf(result, 'object')
17
+ assert.equal(result.kind, AiSessionKind)
18
+ assert.equal(result.app, 'general')
19
+ assert.property(result, 'key')
20
+ assert.property(result, 'title')
21
+ assert.property(result, 'pinned')
22
+ assert.property(result, 'userRenamed')
23
+ assert.property(result, 'createdAt')
24
+ assert.property(result, 'updatedAt')
25
+ })
26
+
27
+ test('session(app, init) allows overriding properties', ({ assert }) => {
28
+ const init: Partial<AiSessionSchema> = {
29
+ title: 'Custom Title',
30
+ pinned: true,
31
+ app: 'domain',
32
+ }
33
+ const result = aiMock.session('domain', init)
34
+ assert.equal(result.app, 'domain')
35
+ assert.equal(result.title, 'Custom Title')
36
+ assert.isTrue(result.pinned)
37
+ })
38
+
39
+ test('sessions() returns a list defined by default size', ({ assert }) => {
40
+ const result = aiMock.sessions()
41
+ assert.isArray(result)
42
+ assert.lengthOf(result, 5)
43
+ result.forEach((item) => {
44
+ assert.equal(item.app, 'general')
45
+ })
46
+ })
47
+
48
+ test('sessions(app, size) overrides settings', ({ assert }) => {
49
+ const result = aiMock.sessions('api', 3)
50
+ assert.lengthOf(result, 3)
51
+ result.forEach((item) => {
52
+ assert.equal(item.app, 'api')
53
+ })
54
+ })
55
+
56
+ test("message('user') returns a valid AiUserMessage object", ({ assert }) => {
57
+ const result = aiMock.message('user')
58
+ assert.typeOf(result, 'object')
59
+ assert.equal(result.kind, AiMessageKind)
60
+ assert.equal(result.role, 'user')
61
+ assert.property(result, 'key')
62
+ assert.property(result, 'session')
63
+ assert.property(result, 'text')
64
+ assert.equal(result.state, 'complete')
65
+ assert.property(result, 'createdAt')
66
+ assert.property(result, 'updatedAt')
67
+ })
68
+
69
+ test("message('model') returns a valid AiModelMessage object", ({ assert }) => {
70
+ const result = aiMock.message('model')
71
+ assert.typeOf(result, 'object')
72
+ assert.equal(result.kind, AiMessageKind)
73
+ assert.equal(result.role, 'model')
74
+ assert.property(result, 'key')
75
+ assert.property(result, 'session')
76
+ assert.property(result, 'text')
77
+ assert.property(result, 'state')
78
+ assert.property(result, 'applied')
79
+ assert.property(result, 'thoughts')
80
+ })
81
+
82
+ test('message(role, init) allows overriding properties', ({ assert }) => {
83
+ const init: Partial<AiMessageSchema> = {
84
+ text: 'Custom Text',
85
+ session: 'session-123',
86
+ }
87
+ const result = aiMock.message('user', init)
88
+ assert.equal(result.text, 'Custom Text')
89
+ assert.equal(result.session, 'session-123')
90
+ })
91
+
92
+ test('messages() returns a list of mixed messages', ({ assert }) => {
93
+ const result = aiMock.messages(5)
94
+ assert.isArray(result)
95
+ assert.lengthOf(result, 5)
96
+ result.forEach((item) => {
97
+ assert.include(['user', 'model'], item.role)
98
+ })
99
+ })
100
+
101
+ test('messages(size, session) groups messages by session', ({ assert }) => {
102
+ const sessionId = 'test-session-id'
103
+ const result = aiMock.messages(3, sessionId)
104
+ assert.lengthOf(result, 3)
105
+ result.forEach((item) => {
106
+ assert.equal(item.session, sessionId)
107
+ })
108
+ })
109
+ })