mindsim 0.1.0 → 0.1.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.
- package/README.md +222 -6
- package/dist/cli.js +465 -4
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -1
- package/dist/resources/mind-topics.d.ts +11 -0
- package/dist/resources/mind-topics.d.ts.map +1 -0
- package/dist/resources/mind-topics.js +18 -0
- package/dist/resources/mind-topics.js.map +1 -0
- package/dist/resources/snapshots.d.ts +29 -1
- package/dist/resources/snapshots.d.ts.map +1 -1
- package/dist/resources/snapshots.js +30 -0
- package/dist/resources/snapshots.js.map +1 -1
- package/dist/resources/usage.d.ts +14 -0
- package/dist/resources/usage.d.ts.map +1 -0
- package/dist/resources/usage.js +20 -0
- package/dist/resources/usage.js.map +1 -0
- package/dist/resources/users.d.ts +14 -0
- package/dist/resources/users.d.ts.map +1 -0
- package/dist/resources/users.js +20 -0
- package/dist/resources/users.js.map +1 -0
- package/dist/types.d.ts +51 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +3 -3
- package/dist/version.js.map +1 -1
- package/package.json +2 -2
- package/src/cli.ts +474 -5
- package/src/index.ts +9 -0
- package/src/resources/mind-topics.ts +16 -0
- package/src/resources/snapshots.ts +60 -0
- package/src/resources/usage.ts +16 -0
- package/src/resources/users.ts +16 -0
- package/src/types.ts +61 -0
- package/src/version.ts +3 -5
- package/tests/resources/mind-topics.test.ts +69 -0
- package/tests/resources/snapshots.test.ts +46 -0
- package/tests/resources/usage.test.ts +34 -0
- package/tests/resources/users.test.ts +54 -0
- package/tests/version.test.ts +1 -3
package/src/types.ts
CHANGED
|
@@ -34,6 +34,7 @@ export interface Mind {
|
|
|
34
34
|
createdAt?: string;
|
|
35
35
|
updatedAt?: string;
|
|
36
36
|
tags: Tag[];
|
|
37
|
+
snapshotCount?: number;
|
|
37
38
|
}
|
|
38
39
|
|
|
39
40
|
export interface CreateMindRequest {
|
|
@@ -66,6 +67,8 @@ export interface SimulationScenario {
|
|
|
66
67
|
export interface RunSimulationRequest {
|
|
67
68
|
mindId: string;
|
|
68
69
|
scenario: SimulationScenario;
|
|
70
|
+
conversationId?: string;
|
|
71
|
+
stream?: boolean;
|
|
69
72
|
runInBackground?: boolean;
|
|
70
73
|
}
|
|
71
74
|
|
|
@@ -160,11 +163,24 @@ export interface MindAssessment {
|
|
|
160
163
|
findingCount?: number | null;
|
|
161
164
|
}
|
|
162
165
|
|
|
166
|
+
export interface SnapshotDetailResponse extends MindAssessment {
|
|
167
|
+
transcripts?: any[];
|
|
168
|
+
psychometrics?: any;
|
|
169
|
+
}
|
|
170
|
+
|
|
163
171
|
export interface ListSnapshotsResponse {
|
|
164
172
|
snapshots: MindAssessment[];
|
|
165
173
|
count: number;
|
|
166
174
|
}
|
|
167
175
|
|
|
176
|
+
export interface DigitalTwinMindAssessment {
|
|
177
|
+
id: string;
|
|
178
|
+
digitalTwinId: string;
|
|
179
|
+
mindAssessmentId: string;
|
|
180
|
+
createdAt: string;
|
|
181
|
+
updatedAt: string;
|
|
182
|
+
}
|
|
183
|
+
|
|
168
184
|
// -- Psychometrics --
|
|
169
185
|
|
|
170
186
|
export interface PersonDetails {
|
|
@@ -183,3 +199,48 @@ export interface GetPsychometricsResponse {
|
|
|
183
199
|
topicsSentimentSummary?: Record<string, any> | null;
|
|
184
200
|
mindReasonerStopError?: any | null;
|
|
185
201
|
}
|
|
202
|
+
|
|
203
|
+
export interface GetMindTopicsResponse {
|
|
204
|
+
personDetails: PersonDetails;
|
|
205
|
+
topicsSentimentSummary?: Record<string, any> | null;
|
|
206
|
+
mindReasonerStopError?: any | null;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
// -- Users --
|
|
210
|
+
|
|
211
|
+
export interface User {
|
|
212
|
+
id: string;
|
|
213
|
+
name: string;
|
|
214
|
+
email: string;
|
|
215
|
+
imageUrl?: string | null;
|
|
216
|
+
createdAt?: string;
|
|
217
|
+
updatedAt?: string;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
export interface ListUsersResponse {
|
|
221
|
+
users: User[];
|
|
222
|
+
count: number;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
// -- Usage --
|
|
226
|
+
|
|
227
|
+
export interface ApiKeyUsage {
|
|
228
|
+
successCount: number;
|
|
229
|
+
errorCount: number;
|
|
230
|
+
totalCount: number;
|
|
231
|
+
averageLatency: number;
|
|
232
|
+
maxLatency: number;
|
|
233
|
+
minLatency: number;
|
|
234
|
+
medianLatency: number;
|
|
235
|
+
p90Latency: number;
|
|
236
|
+
p95Latency: number;
|
|
237
|
+
p99Latency: number;
|
|
238
|
+
p999Latency: number;
|
|
239
|
+
numberOfSimulations: number;
|
|
240
|
+
numberOfSimulatedTwins: number;
|
|
241
|
+
numberOfSnapshotsCreated: number;
|
|
242
|
+
numberOfSnapshotsTotal: number;
|
|
243
|
+
numberOfCoresReprocessed: number;
|
|
244
|
+
numberOfPsychometricsRequests: number;
|
|
245
|
+
numberOfMindTopicsRequests: number;
|
|
246
|
+
}
|
package/src/version.ts
CHANGED
|
@@ -7,7 +7,7 @@ import semver from "semver";
|
|
|
7
7
|
|
|
8
8
|
const execAsync = promisify(exec);
|
|
9
9
|
|
|
10
|
-
const PACKAGE_NAME = "
|
|
10
|
+
const PACKAGE_NAME = "mindsim";
|
|
11
11
|
const REGISTRY_URL = `https://registry.npmjs.org/${PACKAGE_NAME}`;
|
|
12
12
|
|
|
13
13
|
/**
|
|
@@ -54,7 +54,7 @@ export const checkForUpdates = async (verbose = false): Promise<void> => {
|
|
|
54
54
|
const changelogUrl = `https://www.npmjs.com/package/${PACKAGE_NAME}/v/${latestVersion}`;
|
|
55
55
|
|
|
56
56
|
console.warn("\n" + "=".repeat(60));
|
|
57
|
-
console.warn(`⚠️ UPDATE AVAILABLE:
|
|
57
|
+
console.warn(`⚠️ UPDATE AVAILABLE: mindsim`);
|
|
58
58
|
console.warn("=".repeat(60));
|
|
59
59
|
console.warn(` Current Version: ${currentVersion}`);
|
|
60
60
|
console.warn(` Latest Version: ${latestVersion}`);
|
|
@@ -104,8 +104,6 @@ export const updateSdk = async (): Promise<void> => {
|
|
|
104
104
|
if (error instanceof Error) {
|
|
105
105
|
console.error(error.message);
|
|
106
106
|
}
|
|
107
|
-
console.error(
|
|
108
|
-
"Please try running manually: npm install @mindsim/mindsim-sdk-typescript@latest",
|
|
109
|
-
);
|
|
107
|
+
console.error("Please try running manually: npm install mindsim@latest");
|
|
110
108
|
}
|
|
111
109
|
};
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import axios from "axios";
|
|
2
|
+
import { beforeEach, describe, expect, it, type Mocked, vi } from "vitest";
|
|
3
|
+
import { MindSim } from "../../src/index";
|
|
4
|
+
import type { GetMindTopicsResponse } from "../../src/types";
|
|
5
|
+
|
|
6
|
+
vi.mock("axios");
|
|
7
|
+
const mockedAxios = axios as Mocked<typeof axios>;
|
|
8
|
+
|
|
9
|
+
describe("MindSim Mind Topics Resource", () => {
|
|
10
|
+
let mindsim: MindSim;
|
|
11
|
+
const SNAPSHOT_ID = "a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11";
|
|
12
|
+
|
|
13
|
+
const mockClient = {
|
|
14
|
+
get: vi.fn(),
|
|
15
|
+
defaults: { headers: { common: {} } },
|
|
16
|
+
interceptors: { request: { use: vi.fn() }, response: { use: vi.fn() } },
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
beforeEach(() => {
|
|
20
|
+
mockedAxios.create.mockReturnValue(mockClient as any);
|
|
21
|
+
mindsim = new MindSim("test-api-key");
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
it("get() should retrieve topic analysis for a snapshot", async () => {
|
|
25
|
+
const mockResponse: GetMindTopicsResponse = {
|
|
26
|
+
personDetails: {
|
|
27
|
+
id: "p1",
|
|
28
|
+
name: "Test Subject",
|
|
29
|
+
mindDate: "2023-01-01",
|
|
30
|
+
mindAssesssmentId: SNAPSHOT_ID,
|
|
31
|
+
},
|
|
32
|
+
topicsSentimentSummary: {
|
|
33
|
+
topics: [
|
|
34
|
+
{ name: "Coding", sentiment: "Positive" },
|
|
35
|
+
{ name: "Meetings", sentiment: "Negative" },
|
|
36
|
+
],
|
|
37
|
+
},
|
|
38
|
+
mindReasonerStopError: null,
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
mockClient.get.mockResolvedValue({ data: mockResponse });
|
|
42
|
+
|
|
43
|
+
const result = await mindsim.mindTopics.get(SNAPSHOT_ID);
|
|
44
|
+
|
|
45
|
+
expect(mockClient.get).toHaveBeenCalledWith(`/snapshots/${SNAPSHOT_ID}/mind-topics`);
|
|
46
|
+
expect(result.personDetails.name).toBe("Test Subject");
|
|
47
|
+
expect(result.topicsSentimentSummary?.topics).toHaveLength(2);
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
it("get() should handle missing optional fields gracefully", async () => {
|
|
51
|
+
// API might return minimal data if processing isn't fully complete or data is sparse
|
|
52
|
+
const mockResponse: GetMindTopicsResponse = {
|
|
53
|
+
personDetails: {
|
|
54
|
+
id: "p1",
|
|
55
|
+
name: "Test Subject",
|
|
56
|
+
mindDate: "2023-01-01",
|
|
57
|
+
mindAssesssmentId: SNAPSHOT_ID,
|
|
58
|
+
},
|
|
59
|
+
topicsSentimentSummary: null,
|
|
60
|
+
mindReasonerStopError: null,
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
mockClient.get.mockResolvedValue({ data: mockResponse });
|
|
64
|
+
|
|
65
|
+
const result = await mindsim.mindTopics.get(SNAPSHOT_ID);
|
|
66
|
+
|
|
67
|
+
expect(result.topicsSentimentSummary).toBeNull();
|
|
68
|
+
});
|
|
69
|
+
});
|
|
@@ -17,6 +17,7 @@ describe("MindSim Snapshots Resource", () => {
|
|
|
17
17
|
get: vi.fn(),
|
|
18
18
|
post: vi.fn(),
|
|
19
19
|
put: vi.fn(),
|
|
20
|
+
delete: vi.fn(), // Added delete mock
|
|
20
21
|
defaults: { headers: { common: {} } },
|
|
21
22
|
interceptors: { request: { use: vi.fn() }, response: { use: vi.fn() } },
|
|
22
23
|
};
|
|
@@ -26,6 +27,7 @@ describe("MindSim Snapshots Resource", () => {
|
|
|
26
27
|
mindsim = new MindSim("fake-key");
|
|
27
28
|
});
|
|
28
29
|
|
|
30
|
+
// ... (Existing list, create, createFromFile, getStatus tests remain unchanged) ...
|
|
29
31
|
it("list() should retrieve snapshots for a mind", async () => {
|
|
30
32
|
const mockList = {
|
|
31
33
|
snapshots: [{ id: ASSESSMENT_ID, status: "completed" }],
|
|
@@ -132,4 +134,48 @@ describe("MindSim Snapshots Resource", () => {
|
|
|
132
134
|
`/minds/${MIND_ID}/snapshots/${ASSESSMENT_ID}/status`,
|
|
133
135
|
);
|
|
134
136
|
});
|
|
137
|
+
|
|
138
|
+
// NEW TESTS
|
|
139
|
+
|
|
140
|
+
it("getDetail() should retrieve details with query params", async () => {
|
|
141
|
+
mockApiClient.get.mockResolvedValue({
|
|
142
|
+
data: { id: ASSESSMENT_ID, status: "completed", transcripts: ["foo"] },
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
const result = await mindsim.snapshots.getDetail(MIND_ID, ASSESSMENT_ID, {
|
|
146
|
+
includeTranscript: true,
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
expect(mockApiClient.get).toHaveBeenCalledWith(`/minds/${MIND_ID}/snapshots/${ASSESSMENT_ID}`, {
|
|
150
|
+
params: { includeTranscript: true },
|
|
151
|
+
});
|
|
152
|
+
expect(result.transcripts).toHaveLength(1);
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
it("delete() should remove snapshot", async () => {
|
|
156
|
+
mockApiClient.delete.mockResolvedValue({
|
|
157
|
+
data: { message: "deleted", snapshotId: ASSESSMENT_ID },
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
await mindsim.snapshots.delete(MIND_ID, ASSESSMENT_ID);
|
|
161
|
+
expect(mockApiClient.delete).toHaveBeenCalledWith(
|
|
162
|
+
`/minds/${MIND_ID}/snapshots/${ASSESSMENT_ID}`,
|
|
163
|
+
);
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
it("link() should post to link endpoint", async () => {
|
|
167
|
+
mockApiClient.post.mockResolvedValue({ data: { message: "linked" } });
|
|
168
|
+
await mindsim.snapshots.link(MIND_ID, ASSESSMENT_ID);
|
|
169
|
+
expect(mockApiClient.post).toHaveBeenCalledWith(
|
|
170
|
+
`/minds/${MIND_ID}/snapshots/${ASSESSMENT_ID}/link`,
|
|
171
|
+
);
|
|
172
|
+
});
|
|
173
|
+
|
|
174
|
+
it("unlink() should post to unlink endpoint", async () => {
|
|
175
|
+
mockApiClient.post.mockResolvedValue({ data: { message: "unlinked" } });
|
|
176
|
+
await mindsim.snapshots.unlink(MIND_ID, ASSESSMENT_ID);
|
|
177
|
+
expect(mockApiClient.post).toHaveBeenCalledWith(
|
|
178
|
+
`/minds/${MIND_ID}/snapshots/${ASSESSMENT_ID}/unlink`,
|
|
179
|
+
);
|
|
180
|
+
});
|
|
135
181
|
});
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import axios from "axios";
|
|
2
|
+
import { beforeEach, describe, expect, it, type Mocked, vi } from "vitest";
|
|
3
|
+
import { MindSim } from "../../src/index";
|
|
4
|
+
|
|
5
|
+
vi.mock("axios");
|
|
6
|
+
const mockedAxios = axios as Mocked<typeof axios>;
|
|
7
|
+
|
|
8
|
+
describe("MindSim Usage Resource", () => {
|
|
9
|
+
let mindsim: MindSim;
|
|
10
|
+
|
|
11
|
+
const mockClient = {
|
|
12
|
+
get: vi.fn(),
|
|
13
|
+
defaults: { headers: { common: {} } },
|
|
14
|
+
interceptors: { request: { use: vi.fn() }, response: { use: vi.fn() } },
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
beforeEach(() => {
|
|
18
|
+
mockedAxios.create.mockReturnValue(mockClient as any);
|
|
19
|
+
mindsim = new MindSim("test-key");
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
it("get() should call /usage with date params", async () => {
|
|
23
|
+
mockClient.get.mockResolvedValue({
|
|
24
|
+
data: { totalCount: 100, successCount: 99 },
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
const result = await mindsim.usage.get({ from: "2023-01-01", to: "2023-01-31" });
|
|
28
|
+
|
|
29
|
+
expect(mockClient.get).toHaveBeenCalledWith("/usage", {
|
|
30
|
+
params: { from: "2023-01-01", to: "2023-01-31" },
|
|
31
|
+
});
|
|
32
|
+
expect(result.totalCount).toBe(100);
|
|
33
|
+
});
|
|
34
|
+
});
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import axios from "axios";
|
|
2
|
+
import { beforeEach, describe, expect, it, type Mocked, vi } from "vitest";
|
|
3
|
+
import { MindSim } from "../../src/index";
|
|
4
|
+
import type { ListUsersResponse } from "../../src/types";
|
|
5
|
+
|
|
6
|
+
vi.mock("axios");
|
|
7
|
+
const mockedAxios = axios as Mocked<typeof axios>;
|
|
8
|
+
|
|
9
|
+
describe("MindSim Users Resource", () => {
|
|
10
|
+
let mindsim: MindSim;
|
|
11
|
+
|
|
12
|
+
const mockClient = {
|
|
13
|
+
get: vi.fn(),
|
|
14
|
+
defaults: { headers: { common: {} } },
|
|
15
|
+
interceptors: { request: { use: vi.fn() }, response: { use: vi.fn() } },
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
beforeEach(() => {
|
|
19
|
+
mockedAxios.create.mockReturnValue(mockClient as any);
|
|
20
|
+
mindsim = new MindSim("test-api-key");
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
it("list() should call /organizations/users endpoint", async () => {
|
|
24
|
+
const mockResponse: ListUsersResponse = {
|
|
25
|
+
users: [
|
|
26
|
+
{ id: "u1", name: "Alice", email: "alice@test.com" },
|
|
27
|
+
{ id: "u2", name: "Bob", email: "bob@test.com" },
|
|
28
|
+
],
|
|
29
|
+
count: 2,
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
mockClient.get.mockResolvedValue({ data: mockResponse });
|
|
33
|
+
|
|
34
|
+
const result = await mindsim.users.list();
|
|
35
|
+
|
|
36
|
+
expect(mockClient.get).toHaveBeenCalledWith("/organizations/users", {
|
|
37
|
+
params: undefined,
|
|
38
|
+
});
|
|
39
|
+
expect(result.count).toBe(2);
|
|
40
|
+
expect(result.users[0].name).toBe("Alice");
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
it("list() should pass pagination parameters", async () => {
|
|
44
|
+
const mockResponse: ListUsersResponse = { users: [], count: 0 };
|
|
45
|
+
mockClient.get.mockResolvedValue({ data: mockResponse });
|
|
46
|
+
|
|
47
|
+
const params = { limit: 10, offset: 5 };
|
|
48
|
+
await mindsim.users.list(params);
|
|
49
|
+
|
|
50
|
+
expect(mockClient.get).toHaveBeenCalledWith("/organizations/users", {
|
|
51
|
+
params: params,
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
});
|
package/tests/version.test.ts
CHANGED
|
@@ -182,9 +182,7 @@ describe("Version Module", () => {
|
|
|
182
182
|
|
|
183
183
|
await updateSdk();
|
|
184
184
|
|
|
185
|
-
expect(mockExecAsync).toHaveBeenCalledWith(
|
|
186
|
-
"npm install @mindsim/mindsim-sdk-typescript@latest --save",
|
|
187
|
-
);
|
|
185
|
+
expect(mockExecAsync).toHaveBeenCalledWith("npm install mindsim@latest --save");
|
|
188
186
|
expect(consoleLogSpy).toHaveBeenCalledWith(expect.stringContaining("Update complete"));
|
|
189
187
|
});
|
|
190
188
|
|