@sqlrooms/ai-config 0.26.0-rc.2 → 0.26.0-rc.4

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 (35) hide show
  1. package/dist/AiSettingsSliceConfig.d.ts +5 -69
  2. package/dist/AiSettingsSliceConfig.d.ts.map +1 -1
  3. package/dist/AiSliceConfig.d.ts +120 -329
  4. package/dist/AiSliceConfig.d.ts.map +1 -1
  5. package/dist/AiSliceConfig.js +4 -1
  6. package/dist/AiSliceConfig.js.map +1 -1
  7. package/dist/index.d.ts +2 -1
  8. package/dist/index.d.ts.map +1 -1
  9. package/dist/index.js +1 -1
  10. package/dist/index.js.map +1 -1
  11. package/dist/migration/AnalysisSession-v0.24.14.d.ts +48 -0
  12. package/dist/migration/AnalysisSession-v0.24.14.d.ts.map +1 -0
  13. package/dist/migration/AnalysisSession-v0.24.14.js +59 -0
  14. package/dist/migration/AnalysisSession-v0.24.14.js.map +1 -0
  15. package/dist/migration/AnalysisSession-v0.25.0.d.ts +86 -0
  16. package/dist/migration/AnalysisSession-v0.25.0.d.ts.map +1 -0
  17. package/dist/migration/AnalysisSession-v0.25.0.js +182 -0
  18. package/dist/migration/AnalysisSession-v0.25.0.js.map +1 -0
  19. package/dist/migration/AnalysisSession-v0.26.0.d.ts +61 -0
  20. package/dist/migration/AnalysisSession-v0.26.0.d.ts.map +1 -0
  21. package/dist/migration/AnalysisSession-v0.26.0.js +150 -0
  22. package/dist/migration/AnalysisSession-v0.26.0.js.map +1 -0
  23. package/dist/schema/AnalysisSessionSchema.d.ts +147 -0
  24. package/dist/schema/AnalysisSessionSchema.d.ts.map +1 -0
  25. package/dist/schema/AnalysisSessionSchema.js +50 -0
  26. package/dist/schema/AnalysisSessionSchema.js.map +1 -0
  27. package/dist/schema/UIMessageSchema.d.ts +252 -0
  28. package/dist/schema/UIMessageSchema.d.ts.map +1 -0
  29. package/dist/schema/UIMessageSchema.js +138 -0
  30. package/dist/schema/UIMessageSchema.js.map +1 -0
  31. package/package.json +3 -4
  32. package/dist/AnalysisSessionSchema.d.ts +0 -498
  33. package/dist/AnalysisSessionSchema.d.ts.map +0 -1
  34. package/dist/AnalysisSessionSchema.js +0 -88
  35. package/dist/AnalysisSessionSchema.js.map +0 -1
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Migration function to convert old format of AnalysisSession to new format.
3
+ *
4
+ * Version: 0.24.14
5
+ * Introduced: Migration from 'ollamaBaseUrl' to 'baseUrl' field
6
+ *
7
+ * SessionSchema:
8
+ *
9
+ * OLD SCHEMA (legacy format):
10
+ * {
11
+ * id: string,
12
+ * name: string,
13
+ * modelProvider: string,
14
+ * model: string,
15
+ * customModelName?: string,
16
+ * ollamaBaseUrl?: string, // OLD FIELD
17
+ * analysisResults: AnalysisResult[],
18
+ * createdAt?: Date
19
+ * }
20
+ *
21
+ * NEW SCHEMA (current format):
22
+ * {
23
+ * id: string,
24
+ * name: string,
25
+ * modelProvider: string,
26
+ * model: string,
27
+ * customModelName?: string,
28
+ * baseUrl?: string, // NEW FIELD
29
+ * analysisResults: AnalysisResult[],
30
+ * createdAt?: Date
31
+ * }
32
+ *
33
+ * Key changes:
34
+ * - Renamed 'ollamaBaseUrl' field to 'baseUrl' for better generic naming
35
+ * - The field serves the same purpose but with a more provider-agnostic name
36
+ */
37
+ /**
38
+ * Helper function to detect if data needs migration from v0.24.14 format
39
+ */
40
+ declare function needsV0_24_14Migration(data: unknown): boolean;
41
+ /**
42
+ * Helper function to migrate data from v0.24.14 format
43
+ */
44
+ declare function migrateFromV0_24_14(data: unknown): {
45
+ baseUrl: string;
46
+ };
47
+ export { needsV0_24_14Migration, migrateFromV0_24_14 };
48
+ //# sourceMappingURL=AnalysisSession-v0.24.14.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AnalysisSession-v0.24.14.d.ts","sourceRoot":"","sources":["../../src/migration/AnalysisSession-v0.24.14.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAEH;;GAEG;AACH,iBAAS,sBAAsB,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAOtD;AAED;;GAEG;AACH,iBAAS,mBAAmB,CAAC,IAAI,EAAE,OAAO;;EAUzC;AAGD,OAAO,EAAC,sBAAsB,EAAE,mBAAmB,EAAC,CAAC"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Migration function to convert old format of AnalysisSession to new format.
3
+ *
4
+ * Version: 0.24.14
5
+ * Introduced: Migration from 'ollamaBaseUrl' to 'baseUrl' field
6
+ *
7
+ * SessionSchema:
8
+ *
9
+ * OLD SCHEMA (legacy format):
10
+ * {
11
+ * id: string,
12
+ * name: string,
13
+ * modelProvider: string,
14
+ * model: string,
15
+ * customModelName?: string,
16
+ * ollamaBaseUrl?: string, // OLD FIELD
17
+ * analysisResults: AnalysisResult[],
18
+ * createdAt?: Date
19
+ * }
20
+ *
21
+ * NEW SCHEMA (current format):
22
+ * {
23
+ * id: string,
24
+ * name: string,
25
+ * modelProvider: string,
26
+ * model: string,
27
+ * customModelName?: string,
28
+ * baseUrl?: string, // NEW FIELD
29
+ * analysisResults: AnalysisResult[],
30
+ * createdAt?: Date
31
+ * }
32
+ *
33
+ * Key changes:
34
+ * - Renamed 'ollamaBaseUrl' field to 'baseUrl' for better generic naming
35
+ * - The field serves the same purpose but with a more provider-agnostic name
36
+ */
37
+ /**
38
+ * Helper function to detect if data needs migration from v0.24.14 format
39
+ */
40
+ function needsV0_24_14Migration(data) {
41
+ return (data !== null &&
42
+ typeof data === 'object' &&
43
+ 'ollamaBaseUrl' in data &&
44
+ !('baseUrl' in data));
45
+ }
46
+ /**
47
+ * Helper function to migrate data from v0.24.14 format
48
+ */
49
+ function migrateFromV0_24_14(data) {
50
+ // migrate from old ollamaBaseUrl to new baseUrl
51
+ const { ollamaBaseUrl, ...rest } = data;
52
+ return {
53
+ ...rest,
54
+ baseUrl: ollamaBaseUrl,
55
+ };
56
+ }
57
+ // Export individual migration functions for use in centralized migration
58
+ export { needsV0_24_14Migration, migrateFromV0_24_14 };
59
+ //# sourceMappingURL=AnalysisSession-v0.24.14.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AnalysisSession-v0.24.14.js","sourceRoot":"","sources":["../../src/migration/AnalysisSession-v0.24.14.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAEH;;GAEG;AACH,SAAS,sBAAsB,CAAC,IAAa;IAC3C,OAAO,CACL,IAAI,KAAK,IAAI;QACb,OAAO,IAAI,KAAK,QAAQ;QACxB,eAAe,IAAI,IAAI;QACvB,CAAC,CAAC,SAAS,IAAI,IAAI,CAAC,CACrB,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,mBAAmB,CAAC,IAAa;IACxC,gDAAgD;IAChD,MAAM,EAAC,aAAa,EAAE,GAAG,IAAI,EAAC,GAAG,IAGhC,CAAC;IACF,OAAO;QACL,GAAG,IAAI;QACP,OAAO,EAAE,aAAa;KACvB,CAAC;AACJ,CAAC;AAED,yEAAyE;AACzE,OAAO,EAAC,sBAAsB,EAAE,mBAAmB,EAAC,CAAC","sourcesContent":["/**\n * Migration function to convert old format of AnalysisSession to new format.\n *\n * Version: 0.24.14\n * Introduced: Migration from 'ollamaBaseUrl' to 'baseUrl' field\n *\n * SessionSchema:\n *\n * OLD SCHEMA (legacy format):\n * {\n * id: string,\n * name: string,\n * modelProvider: string,\n * model: string,\n * customModelName?: string,\n * ollamaBaseUrl?: string, // OLD FIELD\n * analysisResults: AnalysisResult[],\n * createdAt?: Date\n * }\n *\n * NEW SCHEMA (current format):\n * {\n * id: string,\n * name: string,\n * modelProvider: string,\n * model: string,\n * customModelName?: string,\n * baseUrl?: string, // NEW FIELD\n * analysisResults: AnalysisResult[],\n * createdAt?: Date\n * }\n *\n * Key changes:\n * - Renamed 'ollamaBaseUrl' field to 'baseUrl' for better generic naming\n * - The field serves the same purpose but with a more provider-agnostic name\n */\n\n/**\n * Helper function to detect if data needs migration from v0.24.14 format\n */\nfunction needsV0_24_14Migration(data: unknown): boolean {\n return (\n data !== null &&\n typeof data === 'object' &&\n 'ollamaBaseUrl' in data &&\n !('baseUrl' in data)\n );\n}\n\n/**\n * Helper function to migrate data from v0.24.14 format\n */\nfunction migrateFromV0_24_14(data: unknown) {\n // migrate from old ollamaBaseUrl to new baseUrl\n const {ollamaBaseUrl, ...rest} = data as {ollamaBaseUrl: string} & Record<\n string,\n unknown\n >;\n return {\n ...rest,\n baseUrl: ollamaBaseUrl,\n };\n}\n\n// Export individual migration functions for use in centralized migration\nexport {needsV0_24_14Migration, migrateFromV0_24_14};\n"]}
@@ -0,0 +1,86 @@
1
+ /**
2
+ * Migration function to migrate AnalysisResult.streamMessage to new streamMessage format.
3
+ *
4
+ * Version: 0.25.0
5
+ * Introduced: migrate old openassistant toolCallMessages to Vercel AI SDK v4 toolInvocation format
6
+ *
7
+ * AnalysisResult:
8
+ * {
9
+ * id: string,
10
+ * prompt: string,
11
+ * errorMessage?: ErrorMessageSchema,
12
+ * isCompleted: boolean,
13
+ * streamMessage: StreamMessageSchema, //<-- migrate from old streamMessage to new streamMessage
14
+ * }
15
+ *
16
+ * OLD SCHEMA (legacy format, introduced in ai package v0.8.0):
17
+ * {
18
+ * id: string,
19
+ * prompt: string,
20
+ * isCompleted: boolean,
21
+ * errorMessage?: { error: string },
22
+ * streamMessage: {
23
+ * text: string, // DEPRECATED
24
+ * reasoning?: string, // DEPRECATED
25
+ * analysis?: string, // DEPRECATED
26
+ * toolCallMessages: Array<{ // DEPRECATED
27
+ * toolCallId: string,
28
+ * toolName: string,
29
+ * args: unknown,
30
+ * llmResult: unknown,
31
+ * additionalData?: unknown,
32
+ * isCompleted: boolean,
33
+ * }>,
34
+ * parts: Array<{
35
+ * | { type: 'text', text: string }
36
+ * | { // OLD FORMAT
37
+ * type: 'tool',
38
+ * toolCallMessages: Array<{
39
+ * toolCallId: string,
40
+ * toolName: string,
41
+ * args: unknown,
42
+ * llmResult: unknown,
43
+ * additionalData?: unknown,
44
+ * isCompleted: boolean,
45
+ * }>,
46
+ * }
47
+ * }>,
48
+ * },
49
+ * }
50
+ *
51
+ * NEW SCHEMA (current format):
52
+ * {
53
+ * id: string,
54
+ * prompt: string,
55
+ * isCompleted: boolean,
56
+ * errorMessage?: { error: string },
57
+ * streamMessage: {
58
+ * parts: Array<{
59
+ * | { type: 'text', text: string }
60
+ * | { // NEW FORMAT
61
+ * type: 'tool-invocation',
62
+ * toolInvocation: {
63
+ * toolCallId: string,
64
+ * toolName: string,
65
+ * args: unknown,
66
+ * state: 'call' | 'result',
67
+ * result: unknown,
68
+ * },
69
+ * additionalData?: unknown,
70
+ * isCompleted: boolean,
71
+ * }
72
+ * }>,
73
+ * },
74
+ * }
75
+ *
76
+ */
77
+ /**
78
+ * Helper function to detect if session needs migration from v0.25.0 format
79
+ */
80
+ declare function needsV0_25_0Migration(data: unknown): boolean;
81
+ /**
82
+ * Helper function to migrate session data from v0.25.0 format
83
+ */
84
+ declare function migrateFromV0_25_0(data: unknown): unknown;
85
+ export { needsV0_25_0Migration, migrateFromV0_25_0 };
86
+ //# sourceMappingURL=AnalysisSession-v0.25.0.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AnalysisSession-v0.25.0.d.ts","sourceRoot":"","sources":["../../src/migration/AnalysisSession-v0.25.0.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2EG;AAoEH;;GAEG;AACH,iBAAS,qBAAqB,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAuBrD;AAED;;GAEG;AACH,iBAAS,kBAAkB,CAAC,IAAI,EAAE,OAAO,WAyBxC;AAGD,OAAO,EAAC,qBAAqB,EAAE,kBAAkB,EAAC,CAAC"}
@@ -0,0 +1,182 @@
1
+ /**
2
+ * Migration function to migrate AnalysisResult.streamMessage to new streamMessage format.
3
+ *
4
+ * Version: 0.25.0
5
+ * Introduced: migrate old openassistant toolCallMessages to Vercel AI SDK v4 toolInvocation format
6
+ *
7
+ * AnalysisResult:
8
+ * {
9
+ * id: string,
10
+ * prompt: string,
11
+ * errorMessage?: ErrorMessageSchema,
12
+ * isCompleted: boolean,
13
+ * streamMessage: StreamMessageSchema, //<-- migrate from old streamMessage to new streamMessage
14
+ * }
15
+ *
16
+ * OLD SCHEMA (legacy format, introduced in ai package v0.8.0):
17
+ * {
18
+ * id: string,
19
+ * prompt: string,
20
+ * isCompleted: boolean,
21
+ * errorMessage?: { error: string },
22
+ * streamMessage: {
23
+ * text: string, // DEPRECATED
24
+ * reasoning?: string, // DEPRECATED
25
+ * analysis?: string, // DEPRECATED
26
+ * toolCallMessages: Array<{ // DEPRECATED
27
+ * toolCallId: string,
28
+ * toolName: string,
29
+ * args: unknown,
30
+ * llmResult: unknown,
31
+ * additionalData?: unknown,
32
+ * isCompleted: boolean,
33
+ * }>,
34
+ * parts: Array<{
35
+ * | { type: 'text', text: string }
36
+ * | { // OLD FORMAT
37
+ * type: 'tool',
38
+ * toolCallMessages: Array<{
39
+ * toolCallId: string,
40
+ * toolName: string,
41
+ * args: unknown,
42
+ * llmResult: unknown,
43
+ * additionalData?: unknown,
44
+ * isCompleted: boolean,
45
+ * }>,
46
+ * }
47
+ * }>,
48
+ * },
49
+ * }
50
+ *
51
+ * NEW SCHEMA (current format):
52
+ * {
53
+ * id: string,
54
+ * prompt: string,
55
+ * isCompleted: boolean,
56
+ * errorMessage?: { error: string },
57
+ * streamMessage: {
58
+ * parts: Array<{
59
+ * | { type: 'text', text: string }
60
+ * | { // NEW FORMAT
61
+ * type: 'tool-invocation',
62
+ * toolInvocation: {
63
+ * toolCallId: string,
64
+ * toolName: string,
65
+ * args: unknown,
66
+ * state: 'call' | 'result',
67
+ * result: unknown,
68
+ * },
69
+ * additionalData?: unknown,
70
+ * isCompleted: boolean,
71
+ * }
72
+ * }>,
73
+ * },
74
+ * }
75
+ *
76
+ */
77
+ /**
78
+ * Helper function to detect if streamMessage needs migration from v0.25.0 format
79
+ */
80
+ function needsStreamMessageMigration(streamMessage) {
81
+ return (streamMessage !== null &&
82
+ typeof streamMessage === 'object' &&
83
+ 'toolCallMessages' in streamMessage &&
84
+ 'parts' in streamMessage);
85
+ }
86
+ /**
87
+ * Helper function to migrate a single streamMessage from v0.25.0 format
88
+ */
89
+ function migrateStreamMessage(streamMessage) {
90
+ if (!needsStreamMessageMigration(streamMessage)) {
91
+ return streamMessage;
92
+ }
93
+ const parts = streamMessage.parts;
94
+ const newParts = [];
95
+ for (const part of parts) {
96
+ if (part.type === 'text') {
97
+ const text = part.text;
98
+ newParts.push({
99
+ type: 'text',
100
+ text,
101
+ });
102
+ }
103
+ else if (part.type === 'tool') {
104
+ const toolCallMessages = part.toolCallMessages;
105
+ for (const toolCallMessage of toolCallMessages) {
106
+ const toolCallId = toolCallMessage.toolCallId;
107
+ const toolName = toolCallMessage.toolName;
108
+ const args = toolCallMessage.args;
109
+ const isCompleted = toolCallMessage.isCompleted;
110
+ const llmResult = toolCallMessage.llmResult;
111
+ const additionalData = toolCallMessage.additionalData;
112
+ const toolInvocation = {
113
+ toolCallId,
114
+ toolName,
115
+ args,
116
+ state: isCompleted ? 'result' : 'call',
117
+ result: llmResult,
118
+ };
119
+ newParts.push({
120
+ type: 'tool-invocation',
121
+ toolInvocation,
122
+ additionalData,
123
+ isCompleted,
124
+ });
125
+ }
126
+ }
127
+ }
128
+ return {
129
+ parts: newParts,
130
+ };
131
+ }
132
+ /**
133
+ * Helper function to detect if session needs migration from v0.25.0 format
134
+ */
135
+ function needsV0_25_0Migration(data) {
136
+ if (data === null ||
137
+ typeof data !== 'object' ||
138
+ !('analysisResults' in data)) {
139
+ return false;
140
+ }
141
+ const session = data;
142
+ const analysisResults = session.analysisResults;
143
+ if (!Array.isArray(analysisResults)) {
144
+ return false;
145
+ }
146
+ // Check if any analysisResult has a streamMessage that needs migration
147
+ return analysisResults.some((result) => {
148
+ if (result && typeof result === 'object' && 'streamMessage' in result) {
149
+ return needsStreamMessageMigration(result.streamMessage);
150
+ }
151
+ return false;
152
+ });
153
+ }
154
+ /**
155
+ * Helper function to migrate session data from v0.25.0 format
156
+ */
157
+ function migrateFromV0_25_0(data) {
158
+ if (!needsV0_25_0Migration(data)) {
159
+ return data;
160
+ }
161
+ const session = data;
162
+ const analysisResults = session.analysisResults;
163
+ const migratedAnalysisResults = analysisResults.map((result) => {
164
+ if (result && typeof result === 'object' && 'streamMessage' in result) {
165
+ const streamMessage = result.streamMessage;
166
+ if (needsStreamMessageMigration(streamMessage)) {
167
+ return {
168
+ ...result,
169
+ streamMessage: migrateStreamMessage(streamMessage),
170
+ };
171
+ }
172
+ }
173
+ return result;
174
+ });
175
+ return {
176
+ ...session,
177
+ analysisResults: migratedAnalysisResults,
178
+ };
179
+ }
180
+ // Export individual migration functions for use in centralized migration
181
+ export { needsV0_25_0Migration, migrateFromV0_25_0 };
182
+ //# sourceMappingURL=AnalysisSession-v0.25.0.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AnalysisSession-v0.25.0.js","sourceRoot":"","sources":["../../src/migration/AnalysisSession-v0.25.0.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Migration function to migrate AnalysisResult.streamMessage to new streamMessage format.\n *\n * Version: 0.25.0\n * Introduced: migrate old openassistant toolCallMessages to Vercel AI SDK v4 toolInvocation format\n *\n * AnalysisResult:\n * {\n * id: string,\n * prompt: string,\n * errorMessage?: ErrorMessageSchema,\n * isCompleted: boolean,\n * streamMessage: StreamMessageSchema, //<-- migrate from old streamMessage to new streamMessage\n * }\n *\n * OLD SCHEMA (legacy format, introduced in ai package v0.8.0):\n * {\n * id: string,\n * prompt: string,\n * isCompleted: boolean,\n * errorMessage?: { error: string },\n * streamMessage: {\n * text: string, // DEPRECATED\n * reasoning?: string, // DEPRECATED\n * analysis?: string, // DEPRECATED\n * toolCallMessages: Array<{ // DEPRECATED\n * toolCallId: string,\n * toolName: string,\n * args: unknown,\n * llmResult: unknown,\n * additionalData?: unknown,\n * isCompleted: boolean,\n * }>,\n * parts: Array<{\n * | { type: 'text', text: string }\n * | { // OLD FORMAT\n * type: 'tool',\n * toolCallMessages: Array<{\n * toolCallId: string,\n * toolName: string,\n * args: unknown,\n * llmResult: unknown,\n * additionalData?: unknown,\n * isCompleted: boolean,\n * }>,\n * }\n * }>,\n * },\n * }\n *\n * NEW SCHEMA (current format):\n * {\n * id: string,\n * prompt: string,\n * isCompleted: boolean,\n * errorMessage?: { error: string },\n * streamMessage: {\n * parts: Array<{\n * | { type: 'text', text: string }\n * | { // NEW FORMAT\n * type: 'tool-invocation',\n * toolInvocation: {\n * toolCallId: string,\n * toolName: string,\n * args: unknown,\n * state: 'call' | 'result',\n * result: unknown,\n * },\n * additionalData?: unknown,\n * isCompleted: boolean,\n * }\n * }>,\n * },\n * }\n *\n */\n\n/**\n * Helper function to detect if streamMessage needs migration from v0.25.0 format\n */\nfunction needsStreamMessageMigration(streamMessage: unknown): boolean {\n return (\n streamMessage !== null &&\n typeof streamMessage === 'object' &&\n 'toolCallMessages' in streamMessage &&\n 'parts' in streamMessage\n );\n}\n\n/**\n * Helper function to migrate a single streamMessage from v0.25.0 format\n */\nfunction migrateStreamMessage(streamMessage: unknown) {\n if (!needsStreamMessageMigration(streamMessage)) {\n return streamMessage;\n }\n\n const parts = (streamMessage as {parts: Record<string, unknown>[]}).parts;\n const newParts = [];\n\n for (const part of parts) {\n if (part.type === 'text') {\n const text = part.text;\n newParts.push({\n type: 'text',\n text,\n });\n } else if (part.type === 'tool') {\n const toolCallMessages = part.toolCallMessages as Record<\n string,\n unknown\n >[];\n for (const toolCallMessage of toolCallMessages) {\n const toolCallId = toolCallMessage.toolCallId;\n const toolName = toolCallMessage.toolName;\n const args = toolCallMessage.args;\n const isCompleted = toolCallMessage.isCompleted;\n const llmResult = toolCallMessage.llmResult;\n const additionalData = toolCallMessage.additionalData;\n\n const toolInvocation = {\n toolCallId,\n toolName,\n args,\n state: isCompleted ? 'result' : 'call',\n result: llmResult,\n };\n\n newParts.push({\n type: 'tool-invocation',\n toolInvocation,\n additionalData,\n isCompleted,\n });\n }\n }\n }\n\n return {\n parts: newParts,\n };\n}\n\n/**\n * Helper function to detect if session needs migration from v0.25.0 format\n */\nfunction needsV0_25_0Migration(data: unknown): boolean {\n if (\n data === null ||\n typeof data !== 'object' ||\n !('analysisResults' in data)\n ) {\n return false;\n }\n\n const session = data as Record<string, unknown>;\n const analysisResults = session.analysisResults;\n\n if (!Array.isArray(analysisResults)) {\n return false;\n }\n\n // Check if any analysisResult has a streamMessage that needs migration\n return analysisResults.some((result) => {\n if (result && typeof result === 'object' && 'streamMessage' in result) {\n return needsStreamMessageMigration(result.streamMessage);\n }\n return false;\n });\n}\n\n/**\n * Helper function to migrate session data from v0.25.0 format\n */\nfunction migrateFromV0_25_0(data: unknown) {\n if (!needsV0_25_0Migration(data)) {\n return data;\n }\n\n const session = data as Record<string, unknown>;\n const analysisResults = session.analysisResults as Record<string, unknown>[];\n\n const migratedAnalysisResults = analysisResults.map((result) => {\n if (result && typeof result === 'object' && 'streamMessage' in result) {\n const streamMessage = result.streamMessage;\n if (needsStreamMessageMigration(streamMessage)) {\n return {\n ...result,\n streamMessage: migrateStreamMessage(streamMessage),\n };\n }\n }\n return result;\n });\n\n return {\n ...session,\n analysisResults: migratedAnalysisResults,\n };\n}\n\n// Export individual migration functions for use in centralized migration\nexport {needsV0_25_0Migration, migrateFromV0_25_0};\n"]}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Migration function to convert old AnalysisSession to new format
3
+ *
4
+ * Version: 0.26.x
5
+ *
6
+ * Changes:
7
+ * - add uiMessages (AI SDK v5) to AnalysisSession along with legacy analysisResults
8
+ * - add toolAdditionalData to AnalysisSession to store tool call additional data per session
9
+ * - deprecate the following properties in AnalysisResult:
10
+ * - streamMessage
11
+ *
12
+ * OLD SCHEMA (legacy format):
13
+ * {
14
+ * id: string,
15
+ * name: string,
16
+ * modelProvider: string,
17
+ * model: string,
18
+ * customModelName?: string,
19
+ * baseUrl?: string,
20
+ * createdAt?: Date
21
+ * analysisResults: Array<{
22
+ * id: string,
23
+ * prompt: string,
24
+ * isCompleted: boolean,
25
+ * errorMessage?: { error: string },
26
+ * streamMessage: StreamMessageSchema, //<-- OLD FIELD, DEPRECATED
27
+ * }>,
28
+ * }
29
+ *
30
+ * NEW SCHEMA (current format):
31
+ * {
32
+ * id: string,
33
+ * name: string,
34
+ * modelProvider: string,
35
+ * model: string,
36
+ * customModelName?: string,
37
+ * baseUrl?: string,
38
+ * createdAt?: Date
39
+ * analysisResults: Array<{
40
+ * id: string,
41
+ * prompt: string,
42
+ * isCompleted: boolean,
43
+ * errorMessage?: { error: string },
44
+ * }>,
45
+ * uiMessages: Array<UIMessageSchema>, //<-- NEW FIELD
46
+ * toolAdditionalData: Record<string, unknown>, //<-- NEW FIELD
47
+ * }
48
+ */
49
+ type UnknownRecord = Record<string, unknown>;
50
+ /** Detect if session needs migration to UI messages */
51
+ declare function needsV0_26_0Migration(data: unknown): boolean;
52
+ /** Perform migration to AI SDK v5 uiMessages/toolAdditionalData */
53
+ declare function migrateFromV0_26_0(data: unknown): {
54
+ analysisResults: {
55
+ [x: string]: unknown;
56
+ }[];
57
+ uiMessages: UnknownRecord[];
58
+ toolAdditionalData: UnknownRecord;
59
+ };
60
+ export { needsV0_26_0Migration, migrateFromV0_26_0 };
61
+ //# sourceMappingURL=AnalysisSession-v0.26.0.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AnalysisSession-v0.26.0.d.ts","sourceRoot":"","sources":["../../src/migration/AnalysisSession-v0.26.0.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+CG;AAEH,KAAK,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAM7C,uDAAuD;AACvD,iBAAS,qBAAqB,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAQrD;AAED,mEAAmE;AACnE,iBAAS,kBAAkB,CAAC,IAAI,EAAE,OAAO;;;;;;EA8FxC;AAED,OAAO,EAAC,qBAAqB,EAAE,kBAAkB,EAAC,CAAC"}
@@ -0,0 +1,150 @@
1
+ /**
2
+ * Migration function to convert old AnalysisSession to new format
3
+ *
4
+ * Version: 0.26.x
5
+ *
6
+ * Changes:
7
+ * - add uiMessages (AI SDK v5) to AnalysisSession along with legacy analysisResults
8
+ * - add toolAdditionalData to AnalysisSession to store tool call additional data per session
9
+ * - deprecate the following properties in AnalysisResult:
10
+ * - streamMessage
11
+ *
12
+ * OLD SCHEMA (legacy format):
13
+ * {
14
+ * id: string,
15
+ * name: string,
16
+ * modelProvider: string,
17
+ * model: string,
18
+ * customModelName?: string,
19
+ * baseUrl?: string,
20
+ * createdAt?: Date
21
+ * analysisResults: Array<{
22
+ * id: string,
23
+ * prompt: string,
24
+ * isCompleted: boolean,
25
+ * errorMessage?: { error: string },
26
+ * streamMessage: StreamMessageSchema, //<-- OLD FIELD, DEPRECATED
27
+ * }>,
28
+ * }
29
+ *
30
+ * NEW SCHEMA (current format):
31
+ * {
32
+ * id: string,
33
+ * name: string,
34
+ * modelProvider: string,
35
+ * model: string,
36
+ * customModelName?: string,
37
+ * baseUrl?: string,
38
+ * createdAt?: Date
39
+ * analysisResults: Array<{
40
+ * id: string,
41
+ * prompt: string,
42
+ * isCompleted: boolean,
43
+ * errorMessage?: { error: string },
44
+ * }>,
45
+ * uiMessages: Array<UIMessageSchema>, //<-- NEW FIELD
46
+ * toolAdditionalData: Record<string, unknown>, //<-- NEW FIELD
47
+ * }
48
+ */
49
+ function isObject(value) {
50
+ return typeof value === 'object' && value !== null;
51
+ }
52
+ /** Detect if session needs migration to UI messages */
53
+ function needsV0_26_0Migration(data) {
54
+ if (!isObject(data))
55
+ return false;
56
+ const uiMessages = data.uiMessages;
57
+ const toolAdditionalData = data.toolAdditionalData;
58
+ // Session needs migration if either field is missing
59
+ return !Array.isArray(uiMessages) || toolAdditionalData === undefined;
60
+ }
61
+ /** Perform migration to AI SDK v5 uiMessages/toolAdditionalData */
62
+ function migrateFromV0_26_0(data) {
63
+ const session = { ...data };
64
+ const analysisResults = session.analysisResults || [];
65
+ const existingUiMessages = session.uiMessages || [];
66
+ const toolAdditionalData = session.toolAdditionalData || {};
67
+ const synthesizedMessages = [];
68
+ for (const result of analysisResults) {
69
+ if (!isObject(result))
70
+ continue;
71
+ const id = result.id || '';
72
+ const prompt = result.prompt || '';
73
+ const streamMessage = result.streamMessage || {};
74
+ const parts = streamMessage.parts || [];
75
+ // Create user message for the prompt
76
+ if (prompt) {
77
+ synthesizedMessages.push({
78
+ id,
79
+ role: 'user',
80
+ parts: [{ type: 'text', text: prompt }],
81
+ });
82
+ }
83
+ // Create assistant message mapping the parts
84
+ const assistantParts = [];
85
+ for (const part of parts) {
86
+ if (part.type === 'text') {
87
+ const text = part.text;
88
+ assistantParts.push({ type: 'text', text });
89
+ }
90
+ else if (part.type === 'tool-invocation') {
91
+ const toolInvocation = part.toolInvocation;
92
+ if (isObject(toolInvocation)) {
93
+ const toolCallId = toolInvocation.toolCallId;
94
+ const toolName = toolInvocation.toolName;
95
+ const state = toolInvocation.state;
96
+ const args = toolInvocation.args;
97
+ const llmResult = toolInvocation.result;
98
+ const additional = part.additionalData;
99
+ // Persist additionalData per toolCallId into session-level toolAdditionalData
100
+ if (toolCallId && additional !== undefined && toolAdditionalData) {
101
+ toolAdditionalData[toolCallId] = additional;
102
+ }
103
+ // Map state to AI SDK v5 tool-* parts
104
+ if (state === 'call') {
105
+ assistantParts.push({
106
+ type: `tool-${toolName}`,
107
+ toolCallId,
108
+ state: 'input-available',
109
+ input: args,
110
+ });
111
+ }
112
+ else {
113
+ // Fallback: treat other states as result
114
+ assistantParts.push({
115
+ type: `tool-${toolName}`,
116
+ toolCallId,
117
+ state: 'output-available',
118
+ input: args,
119
+ output: llmResult,
120
+ });
121
+ }
122
+ }
123
+ }
124
+ // Unknown legacy part types are ignored
125
+ }
126
+ if (assistantParts.length > 0) {
127
+ synthesizedMessages.push({
128
+ id: `${id}-assistant`,
129
+ role: 'assistant',
130
+ parts: assistantParts,
131
+ });
132
+ }
133
+ }
134
+ // Remove deprecated streamMessage field from analysisResults
135
+ const cleanedAnalysisResults = analysisResults.map((result) => {
136
+ if (!isObject(result))
137
+ return result;
138
+ // eslint-disable-line @typescript-eslint/no-unused-vars
139
+ const { streamMessage, ...rest } = result;
140
+ return rest;
141
+ });
142
+ return {
143
+ ...session,
144
+ analysisResults: cleanedAnalysisResults,
145
+ uiMessages: [...existingUiMessages, ...synthesizedMessages],
146
+ toolAdditionalData,
147
+ };
148
+ }
149
+ export { needsV0_26_0Migration, migrateFromV0_26_0 };
150
+ //# sourceMappingURL=AnalysisSession-v0.26.0.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AnalysisSession-v0.26.0.js","sourceRoot":"","sources":["../../src/migration/AnalysisSession-v0.26.0.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Migration function to convert old AnalysisSession to new format\n *\n * Version: 0.26.x\n *\n * Changes:\n * - add uiMessages (AI SDK v5) to AnalysisSession along with legacy analysisResults\n * - add toolAdditionalData to AnalysisSession to store tool call additional data per session\n * - deprecate the following properties in AnalysisResult:\n * - streamMessage\n *\n * OLD SCHEMA (legacy format):\n * {\n * id: string,\n * name: string,\n * modelProvider: string,\n * model: string,\n * customModelName?: string,\n * baseUrl?: string,\n * createdAt?: Date\n * analysisResults: Array<{\n * id: string,\n * prompt: string,\n * isCompleted: boolean,\n * errorMessage?: { error: string },\n * streamMessage: StreamMessageSchema, //<-- OLD FIELD, DEPRECATED\n * }>,\n * }\n *\n * NEW SCHEMA (current format):\n * {\n * id: string,\n * name: string,\n * modelProvider: string,\n * model: string,\n * customModelName?: string,\n * baseUrl?: string,\n * createdAt?: Date\n * analysisResults: Array<{\n * id: string,\n * prompt: string,\n * isCompleted: boolean,\n * errorMessage?: { error: string },\n * }>,\n * uiMessages: Array<UIMessageSchema>, //<-- NEW FIELD\n * toolAdditionalData: Record<string, unknown>, //<-- NEW FIELD\n * }\n */\n\ntype UnknownRecord = Record<string, unknown>;\n\nfunction isObject(value: unknown): value is UnknownRecord {\n return typeof value === 'object' && value !== null;\n}\n\n/** Detect if session needs migration to UI messages */\nfunction needsV0_26_0Migration(data: unknown): boolean {\n if (!isObject(data)) return false;\n\n const uiMessages = (data as UnknownRecord).uiMessages;\n const toolAdditionalData = (data as UnknownRecord).toolAdditionalData;\n\n // Session needs migration if either field is missing\n return !Array.isArray(uiMessages) || toolAdditionalData === undefined;\n}\n\n/** Perform migration to AI SDK v5 uiMessages/toolAdditionalData */\nfunction migrateFromV0_26_0(data: unknown) {\n const session = {...(data as UnknownRecord)};\n const analysisResults = (session.analysisResults as UnknownRecord[]) || [];\n const existingUiMessages = (session.uiMessages as UnknownRecord[]) || [];\n const toolAdditionalData =\n (session.toolAdditionalData as UnknownRecord) || {};\n\n const synthesizedMessages: UnknownRecord[] = [];\n\n for (const result of analysisResults) {\n if (!isObject(result)) continue;\n const id = (result.id as string) || '';\n const prompt = (result.prompt as string) || '';\n const streamMessage = (result.streamMessage as UnknownRecord) || {};\n const parts = (streamMessage.parts as UnknownRecord[]) || [];\n\n // Create user message for the prompt\n if (prompt) {\n synthesizedMessages.push({\n id,\n role: 'user',\n parts: [{type: 'text', text: prompt}],\n });\n }\n\n // Create assistant message mapping the parts\n const assistantParts: UnknownRecord[] = [];\n for (const part of parts) {\n if (part.type === 'text') {\n const text = part.text as string;\n assistantParts.push({type: 'text', text});\n } else if (part.type === 'tool-invocation') {\n const toolInvocation = part.toolInvocation;\n if (isObject(toolInvocation)) {\n const toolCallId = toolInvocation.toolCallId as string;\n const toolName = toolInvocation.toolName as string;\n const state = toolInvocation.state as string;\n const args = toolInvocation.args;\n const llmResult = toolInvocation.result;\n const additional = part.additionalData;\n\n // Persist additionalData per toolCallId into session-level toolAdditionalData\n if (toolCallId && additional !== undefined && toolAdditionalData) {\n toolAdditionalData[toolCallId] = additional;\n }\n\n // Map state to AI SDK v5 tool-* parts\n if (state === 'call') {\n assistantParts.push({\n type: `tool-${toolName}`,\n toolCallId,\n state: 'input-available',\n input: args,\n });\n } else {\n // Fallback: treat other states as result\n assistantParts.push({\n type: `tool-${toolName}`,\n toolCallId,\n state: 'output-available',\n input: args,\n output: llmResult,\n });\n }\n }\n }\n // Unknown legacy part types are ignored\n }\n\n if (assistantParts.length > 0) {\n synthesizedMessages.push({\n id: `${id}-assistant`,\n role: 'assistant',\n parts: assistantParts,\n });\n }\n }\n\n // Remove deprecated streamMessage field from analysisResults\n const cleanedAnalysisResults = analysisResults.map((result) => {\n if (!isObject(result)) return result;\n // eslint-disable-line @typescript-eslint/no-unused-vars\n const {streamMessage, ...rest} = result as UnknownRecord & {\n streamMessage?: unknown;\n };\n return rest;\n });\n\n return {\n ...session,\n analysisResults: cleanedAnalysisResults,\n uiMessages: [...existingUiMessages, ...synthesizedMessages],\n toolAdditionalData,\n };\n}\n\nexport {needsV0_26_0Migration, migrateFromV0_26_0};\n"]}