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.
Files changed (42) hide show
  1. package/README.md +222 -6
  2. package/dist/cli.js +465 -4
  3. package/dist/cli.js.map +1 -1
  4. package/dist/index.d.ts +6 -0
  5. package/dist/index.d.ts.map +1 -1
  6. package/dist/index.js +9 -0
  7. package/dist/index.js.map +1 -1
  8. package/dist/resources/mind-topics.d.ts +11 -0
  9. package/dist/resources/mind-topics.d.ts.map +1 -0
  10. package/dist/resources/mind-topics.js +18 -0
  11. package/dist/resources/mind-topics.js.map +1 -0
  12. package/dist/resources/snapshots.d.ts +29 -1
  13. package/dist/resources/snapshots.d.ts.map +1 -1
  14. package/dist/resources/snapshots.js +30 -0
  15. package/dist/resources/snapshots.js.map +1 -1
  16. package/dist/resources/usage.d.ts +14 -0
  17. package/dist/resources/usage.d.ts.map +1 -0
  18. package/dist/resources/usage.js +20 -0
  19. package/dist/resources/usage.js.map +1 -0
  20. package/dist/resources/users.d.ts +14 -0
  21. package/dist/resources/users.d.ts.map +1 -0
  22. package/dist/resources/users.js +20 -0
  23. package/dist/resources/users.js.map +1 -0
  24. package/dist/types.d.ts +51 -0
  25. package/dist/types.d.ts.map +1 -1
  26. package/dist/version.d.ts.map +1 -1
  27. package/dist/version.js +3 -3
  28. package/dist/version.js.map +1 -1
  29. package/package.json +2 -2
  30. package/src/cli.ts +474 -5
  31. package/src/index.ts +9 -0
  32. package/src/resources/mind-topics.ts +16 -0
  33. package/src/resources/snapshots.ts +60 -0
  34. package/src/resources/usage.ts +16 -0
  35. package/src/resources/users.ts +16 -0
  36. package/src/types.ts +61 -0
  37. package/src/version.ts +3 -5
  38. package/tests/resources/mind-topics.test.ts +69 -0
  39. package/tests/resources/snapshots.test.ts +46 -0
  40. package/tests/resources/usage.test.ts +34 -0
  41. package/tests/resources/users.test.ts +54 -0
  42. 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 = "@mindsim/mindsim-sdk-typescript";
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: @mindsim/mindsim-sdk-typescript`);
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
+ });
@@ -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