opensoma 0.1.3 → 0.2.1
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/dist/package.json +18 -2
- package/dist/src/client.d.ts +10 -0
- package/dist/src/client.d.ts.map +1 -1
- package/dist/src/client.js +139 -22
- package/dist/src/client.js.map +1 -1
- package/dist/src/commands/auth.d.ts +16 -0
- package/dist/src/commands/auth.d.ts.map +1 -1
- package/dist/src/commands/auth.js +105 -44
- package/dist/src/commands/auth.js.map +1 -1
- package/dist/src/commands/dashboard.d.ts.map +1 -1
- package/dist/src/commands/dashboard.js +1 -1
- package/dist/src/commands/dashboard.js.map +1 -1
- package/dist/src/commands/event.d.ts.map +1 -1
- package/dist/src/commands/event.js.map +1 -1
- package/dist/src/commands/helpers.d.ts +8 -0
- package/dist/src/commands/helpers.d.ts.map +1 -1
- package/dist/src/commands/helpers.js +35 -4
- package/dist/src/commands/helpers.js.map +1 -1
- package/dist/src/commands/member.d.ts.map +1 -1
- package/dist/src/commands/member.js.map +1 -1
- package/dist/src/commands/mentoring.d.ts.map +1 -1
- package/dist/src/commands/mentoring.js +14 -5
- package/dist/src/commands/mentoring.js.map +1 -1
- package/dist/src/commands/notice.d.ts.map +1 -1
- package/dist/src/commands/notice.js.map +1 -1
- package/dist/src/commands/room.d.ts.map +1 -1
- package/dist/src/commands/room.js.map +1 -1
- package/dist/src/commands/team.d.ts.map +1 -1
- package/dist/src/commands/team.js.map +1 -1
- package/dist/src/credential-manager.d.ts +7 -0
- package/dist/src/credential-manager.d.ts.map +1 -1
- package/dist/src/credential-manager.js +76 -2
- package/dist/src/credential-manager.js.map +1 -1
- package/dist/src/errors.d.ts +8 -0
- package/dist/src/errors.d.ts.map +1 -0
- package/dist/src/errors.js +11 -0
- package/dist/src/errors.js.map +1 -0
- package/dist/src/formatters.d.ts.map +1 -1
- package/dist/src/formatters.js +54 -7
- package/dist/src/formatters.js.map +1 -1
- package/dist/src/http.d.ts +6 -0
- package/dist/src/http.d.ts.map +1 -1
- package/dist/src/http.js +183 -8
- package/dist/src/http.js.map +1 -1
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +1 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/session-recovery.d.ts +12 -0
- package/dist/src/session-recovery.d.ts.map +1 -0
- package/dist/src/session-recovery.js +34 -0
- package/dist/src/session-recovery.js.map +1 -0
- package/dist/src/shared/utils/mentoring-params.d.ts.map +1 -1
- package/dist/src/shared/utils/mentoring-params.js +4 -1
- package/dist/src/shared/utils/mentoring-params.js.map +1 -1
- package/dist/src/shared/utils/swmaestro.d.ts.map +1 -1
- package/dist/src/shared/utils/swmaestro.js.map +1 -1
- package/dist/src/token-extractor.d.ts +12 -0
- package/dist/src/token-extractor.d.ts.map +1 -1
- package/dist/src/token-extractor.js +81 -18
- package/dist/src/token-extractor.js.map +1 -1
- package/dist/src/types.d.ts +18 -0
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/types.js +7 -0
- package/dist/src/types.js.map +1 -1
- package/package.json +17 -1
- package/src/client.test.ts +176 -12
- package/src/client.ts +154 -37
- package/src/commands/auth.test.ts +167 -0
- package/src/commands/auth.ts +140 -58
- package/src/commands/dashboard.ts +5 -6
- package/src/commands/event.ts +5 -6
- package/src/commands/helpers.test.ts +112 -0
- package/src/commands/helpers.ts +61 -6
- package/src/commands/member.ts +4 -5
- package/src/commands/mentoring.ts +36 -19
- package/src/commands/notice.ts +4 -5
- package/src/commands/room.ts +4 -5
- package/src/commands/team.ts +4 -5
- package/src/credential-manager.test.ts +42 -2
- package/src/credential-manager.ts +104 -3
- package/src/errors.ts +10 -0
- package/src/formatters.test.ts +1 -1
- package/src/formatters.ts +91 -18
- package/src/http.test.ts +75 -10
- package/src/http.ts +228 -10
- package/src/index.ts +1 -0
- package/src/session-recovery.ts +56 -0
- package/src/shared/utils/mentoring-params.test.ts +9 -4
- package/src/shared/utils/mentoring-params.ts +6 -3
- package/src/shared/utils/swmaestro.ts +2 -2
- package/src/token-extractor.test.ts +46 -8
- package/src/token-extractor.ts +115 -22
- package/src/types.test.ts +4 -2
- package/src/types.ts +7 -0
- package/.claude-plugin/README.md +0 -145
- package/.claude-plugin/plugin.json +0 -23
- package/.github/workflows/release.yml +0 -86
- package/.oxfmtrc.json +0 -9
- package/.oxlintrc.json +0 -4
- package/AGENTS.md +0 -78
- package/README.md +0 -252
- package/bun.lock +0 -297
- package/bunfig.toml +0 -2
- package/e2e/.gitkeep +0 -0
- package/skills/opensoma/SKILL.md +0 -345
- package/skills/opensoma/references/common-patterns.md +0 -182
- package/skills/opensoma/references/output-format.md +0 -130
package/dist/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "opensoma",
|
|
3
|
-
"version": "0.1
|
|
3
|
+
"version": "0.2.1",
|
|
4
4
|
"description": "SWMaestro MyPage CLI & SDK for AI agents",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
"url": "git+https://github.com/devxoul/opensoma.git"
|
|
9
9
|
},
|
|
10
10
|
"bin": {
|
|
11
|
-
"opensoma": "
|
|
11
|
+
"opensoma": "dist/src/cli.js"
|
|
12
12
|
},
|
|
13
13
|
"type": "module",
|
|
14
14
|
"main": "dist/src/index.js",
|
|
@@ -25,6 +25,22 @@
|
|
|
25
25
|
".": {
|
|
26
26
|
"types": "./src/index.ts",
|
|
27
27
|
"default": "./src/index.ts"
|
|
28
|
+
},
|
|
29
|
+
"./client": {
|
|
30
|
+
"types": "./src/client.ts",
|
|
31
|
+
"default": "./src/client.ts"
|
|
32
|
+
},
|
|
33
|
+
"./types": {
|
|
34
|
+
"types": "./src/types.ts",
|
|
35
|
+
"default": "./src/types.ts"
|
|
36
|
+
},
|
|
37
|
+
"./constants": {
|
|
38
|
+
"types": "./src/constants.ts",
|
|
39
|
+
"default": "./src/constants.ts"
|
|
40
|
+
},
|
|
41
|
+
"./shared/utils/mentoring-params": {
|
|
42
|
+
"types": "./src/shared/utils/mentoring-params.ts",
|
|
43
|
+
"default": "./src/shared/utils/mentoring-params.ts"
|
|
28
44
|
}
|
|
29
45
|
},
|
|
30
46
|
"scripts": {
|
package/dist/src/client.d.ts
CHANGED
|
@@ -6,10 +6,12 @@ export interface SomaClientOptions {
|
|
|
6
6
|
csrfToken?: string;
|
|
7
7
|
username?: string;
|
|
8
8
|
password?: string;
|
|
9
|
+
verbose?: boolean;
|
|
9
10
|
}
|
|
10
11
|
export declare class SomaClient {
|
|
11
12
|
private readonly http;
|
|
12
13
|
private readonly options;
|
|
14
|
+
private loginCredentials;
|
|
13
15
|
readonly mentoring: {
|
|
14
16
|
list(options?: {
|
|
15
17
|
status?: string;
|
|
@@ -90,9 +92,17 @@ export declare class SomaClient {
|
|
|
90
92
|
apply(id: number): Promise<void>;
|
|
91
93
|
};
|
|
92
94
|
constructor(options?: SomaClientOptions);
|
|
95
|
+
getSessionData(): {
|
|
96
|
+
sessionCookie: string | undefined;
|
|
97
|
+
csrfToken: string | null;
|
|
98
|
+
};
|
|
99
|
+
private requireAuth;
|
|
93
100
|
private resolveUser;
|
|
94
101
|
login(username?: string, password?: string): Promise<void>;
|
|
95
102
|
isLoggedIn(): Promise<boolean>;
|
|
103
|
+
logout(): Promise<void>;
|
|
96
104
|
saveCredentials(manager?: CredentialManager): Promise<void>;
|
|
105
|
+
private containsErrorIndicator;
|
|
106
|
+
private extractErrorMessage;
|
|
97
107
|
}
|
|
98
108
|
//# sourceMappingURL=client.d.ts.map
|
package/dist/src/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/src/client.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { MENU_NO } from './constants.js';
|
|
2
2
|
import { CredentialManager } from './credential-manager.js';
|
|
3
|
+
import { AuthenticationError } from './errors.js';
|
|
3
4
|
import * as formatters from './formatters.js';
|
|
4
5
|
import { SomaHttp } from './http.js';
|
|
5
6
|
import { buildMentoringListParams } from './shared/utils/mentoring-params.js';
|
|
@@ -7,6 +8,7 @@ import { buildApplicationPayload, buildCancelApplicationPayload, buildDeleteMent
|
|
|
7
8
|
export class SomaClient {
|
|
8
9
|
http;
|
|
9
10
|
options;
|
|
11
|
+
loginCredentials;
|
|
10
12
|
mentoring;
|
|
11
13
|
room;
|
|
12
14
|
dashboard;
|
|
@@ -16,9 +18,16 @@ export class SomaClient {
|
|
|
16
18
|
event;
|
|
17
19
|
constructor(options = {}) {
|
|
18
20
|
this.options = options;
|
|
19
|
-
this.
|
|
21
|
+
this.loginCredentials =
|
|
22
|
+
options.username && options.password ? { username: options.username, password: options.password } : null;
|
|
23
|
+
this.http = new SomaHttp({
|
|
24
|
+
sessionCookie: options.sessionCookie,
|
|
25
|
+
csrfToken: options.csrfToken,
|
|
26
|
+
verbose: options.verbose,
|
|
27
|
+
});
|
|
20
28
|
this.mentoring = {
|
|
21
29
|
list: async (options) => {
|
|
30
|
+
await this.requireAuth();
|
|
22
31
|
const user = options?.search?.me ? await this.resolveUser() : undefined;
|
|
23
32
|
const html = await this.http.get('/mypage/mentoLec/list.do', buildMentoringListParams({
|
|
24
33
|
status: options?.status,
|
|
@@ -27,46 +36,74 @@ export class SomaClient {
|
|
|
27
36
|
search: options?.search,
|
|
28
37
|
user,
|
|
29
38
|
}));
|
|
30
|
-
return {
|
|
39
|
+
return {
|
|
40
|
+
items: formatters.parseMentoringList(html),
|
|
41
|
+
pagination: formatters.parsePagination(html),
|
|
42
|
+
};
|
|
43
|
+
},
|
|
44
|
+
get: async (id) => {
|
|
45
|
+
await this.requireAuth();
|
|
46
|
+
return formatters.parseMentoringDetail(await this.http.get('/mypage/mentoLec/view.do', {
|
|
47
|
+
menuNo: MENU_NO.MENTORING,
|
|
48
|
+
qustnrSn: String(id),
|
|
49
|
+
}), id);
|
|
31
50
|
},
|
|
32
|
-
get: async (id) => formatters.parseMentoringDetail(await this.http.get('/mypage/mentoLec/view.do', { menuNo: MENU_NO.MENTORING, qustnrSn: String(id) }), id),
|
|
33
51
|
create: async (params) => {
|
|
34
|
-
await this.
|
|
52
|
+
await this.requireAuth();
|
|
53
|
+
const html = await this.http.post('/mypage/mentoLec/insert.do', buildMentoringPayload(params));
|
|
54
|
+
if (this.containsErrorIndicator(html)) {
|
|
55
|
+
throw new Error(this.extractErrorMessage(html) || '멘토링 등록에 실패했습니다.');
|
|
56
|
+
}
|
|
35
57
|
},
|
|
36
58
|
delete: async (id) => {
|
|
59
|
+
await this.requireAuth();
|
|
37
60
|
await this.http.post('/mypage/mentoLec/delete.do', buildDeleteMentoringPayload(id));
|
|
38
61
|
},
|
|
39
62
|
apply: async (id) => {
|
|
63
|
+
await this.requireAuth();
|
|
40
64
|
await this.http.post('/application/application/application.do', buildApplicationPayload(id));
|
|
41
65
|
},
|
|
42
66
|
cancel: async (params) => {
|
|
67
|
+
await this.requireAuth();
|
|
43
68
|
await this.http.post('/mypage/userAnswer/cancel.do', buildCancelApplicationPayload(params));
|
|
44
69
|
},
|
|
45
70
|
history: async (options) => {
|
|
71
|
+
await this.requireAuth();
|
|
46
72
|
const html = await this.http.get('/mypage/userAnswer/history.do', {
|
|
47
73
|
menuNo: MENU_NO.APPLICATION_HISTORY,
|
|
48
74
|
...(options?.page ? { pageIndex: String(options.page) } : {}),
|
|
49
75
|
});
|
|
50
|
-
return {
|
|
76
|
+
return {
|
|
77
|
+
items: formatters.parseApplicationHistory(html),
|
|
78
|
+
pagination: formatters.parsePagination(html),
|
|
79
|
+
};
|
|
51
80
|
},
|
|
52
81
|
};
|
|
53
82
|
this.room = {
|
|
54
|
-
list: async (options) =>
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
83
|
+
list: async (options) => {
|
|
84
|
+
await this.requireAuth();
|
|
85
|
+
return formatters.parseRoomList(await this.http.post('/mypage/officeMng/list.do', {
|
|
86
|
+
menuNo: MENU_NO.ROOM,
|
|
87
|
+
sdate: options?.date ?? new Date().toISOString().slice(0, 10),
|
|
88
|
+
searchItemId: options?.room ? String(resolveRoomId(options.room)) : '',
|
|
89
|
+
}));
|
|
90
|
+
},
|
|
91
|
+
available: async (roomId, date) => {
|
|
92
|
+
await this.requireAuth();
|
|
93
|
+
return formatters.parseRoomSlots(await this.http.post('/mypage/officeMng/rentTime.do', {
|
|
94
|
+
viewType: 'CONTBODY',
|
|
95
|
+
itemId: String(roomId),
|
|
96
|
+
rentDt: date,
|
|
97
|
+
}));
|
|
98
|
+
},
|
|
64
99
|
reserve: async (params) => {
|
|
100
|
+
await this.requireAuth();
|
|
65
101
|
await this.http.post('/mypage/itemRent/insert.do', buildRoomReservationPayload(params));
|
|
66
102
|
},
|
|
67
103
|
};
|
|
68
104
|
this.dashboard = {
|
|
69
105
|
get: async () => {
|
|
106
|
+
await this.requireAuth();
|
|
70
107
|
const [dashboard, { items: myMentoring }] = await Promise.all([
|
|
71
108
|
formatters.parseDashboard(await this.http.get('/mypage/myMain/dashboard.do', { menuNo: MENU_NO.DASHBOARD })),
|
|
72
109
|
this.mentoring.list({ search: { field: 'author', value: '@me', me: true } }),
|
|
@@ -75,40 +112,87 @@ export class SomaClient {
|
|
|
75
112
|
title: item.title,
|
|
76
113
|
url: `/mypage/mentoLec/view.do?qustnrSn=${item.id}`,
|
|
77
114
|
status: item.status,
|
|
115
|
+
date: item.sessionDate,
|
|
116
|
+
time: item.sessionTime.start,
|
|
117
|
+
timeEnd: item.sessionTime.end,
|
|
118
|
+
type: item.type,
|
|
78
119
|
}));
|
|
79
120
|
return dashboard;
|
|
80
121
|
},
|
|
81
122
|
};
|
|
82
123
|
this.notice = {
|
|
83
124
|
list: async (options) => {
|
|
125
|
+
await this.requireAuth();
|
|
84
126
|
const html = await this.http.get('/mypage/myNotice/list.do', {
|
|
85
127
|
menuNo: MENU_NO.NOTICE,
|
|
86
128
|
...(options?.page ? { pageIndex: String(options.page) } : {}),
|
|
87
129
|
});
|
|
88
|
-
return {
|
|
130
|
+
return {
|
|
131
|
+
items: formatters.parseNoticeList(html),
|
|
132
|
+
pagination: formatters.parsePagination(html),
|
|
133
|
+
};
|
|
134
|
+
},
|
|
135
|
+
get: async (id) => {
|
|
136
|
+
await this.requireAuth();
|
|
137
|
+
return formatters.parseNoticeDetail(await this.http.get('/mypage/myNotice/view.do', {
|
|
138
|
+
menuNo: MENU_NO.NOTICE,
|
|
139
|
+
nttId: String(id),
|
|
140
|
+
}), id);
|
|
89
141
|
},
|
|
90
|
-
get: async (id) => formatters.parseNoticeDetail(await this.http.get('/mypage/myNotice/view.do', { menuNo: MENU_NO.NOTICE, nttId: String(id) }), id),
|
|
91
142
|
};
|
|
92
143
|
this.team = {
|
|
93
|
-
show: async () =>
|
|
144
|
+
show: async () => {
|
|
145
|
+
await this.requireAuth();
|
|
146
|
+
return formatters.parseTeamInfo(await this.http.get('/mypage/myTeam/team.do', { menuNo: MENU_NO.TEAM }));
|
|
147
|
+
},
|
|
94
148
|
};
|
|
95
149
|
this.member = {
|
|
96
|
-
show: async () =>
|
|
150
|
+
show: async () => {
|
|
151
|
+
await this.requireAuth();
|
|
152
|
+
return formatters.parseMemberInfo(await this.http.get('/mypage/myInfo/forUpdateMy.do', { menuNo: MENU_NO.MEMBER_INFO }));
|
|
153
|
+
},
|
|
97
154
|
};
|
|
98
155
|
this.event = {
|
|
99
156
|
list: async (options) => {
|
|
157
|
+
await this.requireAuth();
|
|
100
158
|
const html = await this.http.get('/mypage/applicants/list.do', {
|
|
101
159
|
menuNo: MENU_NO.EVENT,
|
|
102
160
|
...(options?.page ? { pageIndex: String(options.page) } : {}),
|
|
103
161
|
});
|
|
104
|
-
return {
|
|
162
|
+
return {
|
|
163
|
+
items: formatters.parseEventList(html),
|
|
164
|
+
pagination: formatters.parsePagination(html),
|
|
165
|
+
};
|
|
166
|
+
},
|
|
167
|
+
get: async (id) => {
|
|
168
|
+
await this.requireAuth();
|
|
169
|
+
return parseEventDetail(await this.http.get('/mypage/applicants/view.do', {
|
|
170
|
+
menuNo: MENU_NO.EVENT,
|
|
171
|
+
bbsId: String(id),
|
|
172
|
+
}));
|
|
105
173
|
},
|
|
106
|
-
get: async (id) => parseEventDetail(await this.http.get('/mypage/applicants/view.do', { menuNo: MENU_NO.EVENT, bbsId: String(id) })),
|
|
107
174
|
apply: async (id) => {
|
|
175
|
+
await this.requireAuth();
|
|
108
176
|
await this.http.post('/application/application/application.do', buildApplicationPayload(id));
|
|
109
177
|
},
|
|
110
178
|
};
|
|
111
179
|
}
|
|
180
|
+
getSessionData() {
|
|
181
|
+
return {
|
|
182
|
+
sessionCookie: this.http.getSessionCookie(),
|
|
183
|
+
csrfToken: this.http.getCsrfToken(),
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
async requireAuth() {
|
|
187
|
+
let identity = await this.http.checkLogin();
|
|
188
|
+
if (!identity && this.loginCredentials) {
|
|
189
|
+
await this.http.login(this.loginCredentials.username, this.loginCredentials.password);
|
|
190
|
+
identity = await this.http.checkLogin();
|
|
191
|
+
}
|
|
192
|
+
if (!identity) {
|
|
193
|
+
throw new AuthenticationError();
|
|
194
|
+
}
|
|
195
|
+
}
|
|
112
196
|
async resolveUser() {
|
|
113
197
|
const identity = await this.http.checkLogin();
|
|
114
198
|
return identity ?? undefined;
|
|
@@ -120,10 +204,17 @@ export class SomaClient {
|
|
|
120
204
|
throw new Error('Username and password are required');
|
|
121
205
|
}
|
|
122
206
|
await this.http.login(resolvedUsername, resolvedPassword);
|
|
207
|
+
this.loginCredentials = {
|
|
208
|
+
username: resolvedUsername,
|
|
209
|
+
password: resolvedPassword,
|
|
210
|
+
};
|
|
123
211
|
}
|
|
124
212
|
async isLoggedIn() {
|
|
125
213
|
return Boolean(await this.http.checkLogin());
|
|
126
214
|
}
|
|
215
|
+
async logout() {
|
|
216
|
+
await this.http.logout();
|
|
217
|
+
}
|
|
127
218
|
async saveCredentials(manager = new CredentialManager()) {
|
|
128
219
|
const sessionCookie = this.http.getSessionCookie();
|
|
129
220
|
const csrfToken = this.http.getCsrfToken();
|
|
@@ -133,9 +224,35 @@ export class SomaClient {
|
|
|
133
224
|
await manager.setCredentials({
|
|
134
225
|
sessionCookie,
|
|
135
226
|
csrfToken,
|
|
136
|
-
username: this.
|
|
227
|
+
username: this.loginCredentials?.username,
|
|
228
|
+
password: this.loginCredentials?.password,
|
|
137
229
|
loggedInAt: new Date().toISOString(),
|
|
138
230
|
});
|
|
139
231
|
}
|
|
232
|
+
containsErrorIndicator(html) {
|
|
233
|
+
const errorPatterns = [
|
|
234
|
+
'class="error"',
|
|
235
|
+
'class="alert-danger"',
|
|
236
|
+
'alert-error',
|
|
237
|
+
'오류가 발생했습니다',
|
|
238
|
+
'등록에 실패했습니다',
|
|
239
|
+
'실패하였습니다',
|
|
240
|
+
'잘못된 접근',
|
|
241
|
+
'권한이 없습니다',
|
|
242
|
+
'<script>alert(',
|
|
243
|
+
];
|
|
244
|
+
return errorPatterns.some((pattern) => html.includes(pattern));
|
|
245
|
+
}
|
|
246
|
+
extractErrorMessage(html) {
|
|
247
|
+
const alertMatch = html.match(/<script>alert\(['"](.+?)['"]\)/);
|
|
248
|
+
if (alertMatch) {
|
|
249
|
+
return alertMatch[1];
|
|
250
|
+
}
|
|
251
|
+
const errorDivMatch = html.match(/class="error[^"]*"[^>]*>\s*([^<]+)/);
|
|
252
|
+
if (errorDivMatch) {
|
|
253
|
+
return errorDivMatch[1].trim();
|
|
254
|
+
}
|
|
255
|
+
return null;
|
|
256
|
+
}
|
|
140
257
|
}
|
|
141
258
|
//# sourceMappingURL=client.js.map
|
package/dist/src/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AACrC,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AACxD,OAAO,KAAK,UAAU,MAAM,cAAc,CAAA;AAC1C,OAAO,
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,19 @@
|
|
|
1
1
|
import { Command } from 'commander';
|
|
2
|
+
import { CredentialManager } from '../credential-manager.js';
|
|
3
|
+
import { SomaHttp } from '../http.js';
|
|
4
|
+
import type { ExtractedSessionCandidate } from '../token-extractor.js';
|
|
5
|
+
type ExtractedSessionValidator = Pick<SomaHttp, 'checkLogin' | 'extractCsrfToken'>;
|
|
6
|
+
type CredentialStore = Pick<CredentialManager, 'getCredentials' | 'remove' | 'setCredentials'>;
|
|
7
|
+
type StatusValidator = Pick<SomaHttp, 'checkLogin'>;
|
|
8
|
+
type ReloginHttp = Pick<SomaHttp, 'checkLogin' | 'getCsrfToken' | 'getSessionCookie' | 'login'>;
|
|
9
|
+
export declare function resolveExtractedCredentials(candidates: ExtractedSessionCandidate[], createValidator?: (sessionCookie: string) => ExtractedSessionValidator): Promise<{
|
|
10
|
+
csrfToken: string;
|
|
11
|
+
sessionCookie: string;
|
|
12
|
+
} | null>;
|
|
13
|
+
export declare function inspectStoredAuthStatus(manager?: CredentialStore, createValidator?: (credentials: {
|
|
14
|
+
sessionCookie: string;
|
|
15
|
+
csrfToken: string;
|
|
16
|
+
}) => StatusValidator, createReloginHttp?: () => ReloginHttp): Promise<Record<string, boolean | null | string>>;
|
|
2
17
|
export declare const authCommand: Command;
|
|
18
|
+
export {};
|
|
3
19
|
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/commands/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/commands/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAEnC,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAA;AACzD,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAIlC,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAA;AAKnE,KAAK,yBAAyB,GAAG,IAAI,CAAC,QAAQ,EAAE,YAAY,GAAG,kBAAkB,CAAC,CAAA;AAClF,KAAK,eAAe,GAAG,IAAI,CAAC,iBAAiB,EAAE,gBAAgB,GAAG,QAAQ,GAAG,gBAAgB,CAAC,CAAA;AAC9F,KAAK,eAAe,GAAG,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAA;AACnD,KAAK,WAAW,GAAG,IAAI,CAAC,QAAQ,EAAE,YAAY,GAAG,cAAc,GAAG,kBAAkB,GAAG,OAAO,CAAC,CAAA;AAM/F,wBAAsB,2BAA2B,CAC/C,UAAU,EAAE,yBAAyB,EAAE,EACvC,eAAe,GAAE,CAAC,aAAa,EAAE,MAAM,KAAK,yBACX,GAChC,OAAO,CAAC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CAkB9D;AAgED,wBAAsB,uBAAuB,CAC3C,OAAO,GAAE,eAAyC,EAClD,eAAe,GAAE,CAAC,WAAW,EAAE;IAAE,aAAa,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,KAAK,eACc,EAC9F,iBAAiB,GAAE,MAAM,WAAkC,GAC1D,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,GAAG,MAAM,CAAC,CAAC,CAuDlD;AAyCD,eAAO,MAAM,WAAW,SA2BrB,CAAA"}
|
|
@@ -1,9 +1,28 @@
|
|
|
1
1
|
import { Command } from 'commander';
|
|
2
2
|
import { CredentialManager } from '../credential-manager.js';
|
|
3
3
|
import { SomaHttp } from '../http.js';
|
|
4
|
+
import { recoverSession } from '../session-recovery.js';
|
|
4
5
|
import { handleError } from '../shared/utils/error-handler.js';
|
|
5
6
|
import { formatOutput } from '../shared/utils/output.js';
|
|
6
|
-
|
|
7
|
+
const EXPIRED_SESSION_HINT = 'Session expired. Run: opensoma auth login or opensoma auth extract';
|
|
8
|
+
const UNVERIFIED_SESSION_HINT = 'Could not verify session. Try again or run: opensoma auth login or opensoma auth extract';
|
|
9
|
+
export async function resolveExtractedCredentials(candidates, createValidator = (sessionCookie) => new SomaHttp({ sessionCookie })) {
|
|
10
|
+
for (const candidate of candidates) {
|
|
11
|
+
const http = createValidator(candidate.sessionCookie);
|
|
12
|
+
try {
|
|
13
|
+
const valid = Boolean(await http.checkLogin());
|
|
14
|
+
if (!valid) {
|
|
15
|
+
continue;
|
|
16
|
+
}
|
|
17
|
+
return {
|
|
18
|
+
sessionCookie: candidate.sessionCookie,
|
|
19
|
+
csrfToken: await http.extractCsrfToken(),
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
catch { }
|
|
23
|
+
}
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
7
26
|
async function loginAction(options) {
|
|
8
27
|
try {
|
|
9
28
|
const username = options.username ?? process.env.OPENSOMA_USERNAME;
|
|
@@ -13,15 +32,23 @@ async function loginAction(options) {
|
|
|
13
32
|
}
|
|
14
33
|
const http = new SomaHttp();
|
|
15
34
|
await http.login(username, password);
|
|
16
|
-
const sessionCookie = http.getSessionCookie();
|
|
17
35
|
const csrfToken = http.getCsrfToken();
|
|
18
|
-
if (!
|
|
19
|
-
throw new Error('Login succeeded but
|
|
36
|
+
if (!csrfToken) {
|
|
37
|
+
throw new Error('Login succeeded but CSRF token is missing');
|
|
38
|
+
}
|
|
39
|
+
const valid = Boolean(await http.checkLogin());
|
|
40
|
+
if (!valid) {
|
|
41
|
+
throw new Error('Login succeeded but session is not valid');
|
|
42
|
+
}
|
|
43
|
+
const sessionCookie = http.getSessionCookie();
|
|
44
|
+
if (!sessionCookie) {
|
|
45
|
+
throw new Error('Login succeeded but session cookie is missing');
|
|
20
46
|
}
|
|
21
47
|
await new CredentialManager().setCredentials({
|
|
22
48
|
sessionCookie,
|
|
23
49
|
csrfToken,
|
|
24
50
|
username,
|
|
51
|
+
password,
|
|
25
52
|
loggedInAt: new Date().toISOString(),
|
|
26
53
|
});
|
|
27
54
|
console.log(formatOutput({ ok: true, username, loggedIn: true }, options.pretty));
|
|
@@ -32,36 +59,81 @@ async function loginAction(options) {
|
|
|
32
59
|
}
|
|
33
60
|
async function logoutAction(options) {
|
|
34
61
|
try {
|
|
35
|
-
|
|
36
|
-
|
|
62
|
+
const manager = new CredentialManager();
|
|
63
|
+
const credentials = await manager.getCredentials();
|
|
64
|
+
let upstreamLoggedOut = false;
|
|
65
|
+
if (credentials) {
|
|
66
|
+
const http = new SomaHttp({ sessionCookie: credentials.sessionCookie, csrfToken: credentials.csrfToken });
|
|
67
|
+
try {
|
|
68
|
+
await http.logout();
|
|
69
|
+
upstreamLoggedOut = true;
|
|
70
|
+
}
|
|
71
|
+
catch { }
|
|
72
|
+
}
|
|
73
|
+
await manager.remove();
|
|
74
|
+
console.log(formatOutput({ ok: true, loggedIn: false, upstreamLoggedOut }, options.pretty));
|
|
37
75
|
}
|
|
38
76
|
catch (error) {
|
|
39
77
|
handleError(error);
|
|
40
78
|
}
|
|
41
79
|
}
|
|
42
|
-
async function
|
|
80
|
+
export async function inspectStoredAuthStatus(manager = new CredentialManager(), createValidator = (credentials) => new SomaHttp({ sessionCookie: credentials.sessionCookie, csrfToken: credentials.csrfToken }), createReloginHttp = () => new SomaHttp()) {
|
|
81
|
+
const creds = await manager.getCredentials();
|
|
82
|
+
if (!creds) {
|
|
83
|
+
return { authenticated: false, credentials: null };
|
|
84
|
+
}
|
|
85
|
+
let identity = null;
|
|
43
86
|
try {
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
87
|
+
identity = await createValidator(creds).checkLogin();
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
return {
|
|
91
|
+
authenticated: true,
|
|
92
|
+
valid: false,
|
|
93
|
+
username: creds.username ?? null,
|
|
94
|
+
loggedInAt: creds.loggedInAt ?? null,
|
|
95
|
+
hint: UNVERIFIED_SESSION_HINT,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
if (!identity) {
|
|
51
99
|
try {
|
|
52
|
-
const
|
|
53
|
-
|
|
100
|
+
const refreshedCredentials = await recoverSession(creds, manager, createReloginHttp);
|
|
101
|
+
if (refreshedCredentials) {
|
|
102
|
+
return {
|
|
103
|
+
authenticated: true,
|
|
104
|
+
valid: true,
|
|
105
|
+
username: refreshedCredentials.username ?? null,
|
|
106
|
+
loggedInAt: refreshedCredentials.loggedInAt ?? null,
|
|
107
|
+
};
|
|
108
|
+
}
|
|
54
109
|
}
|
|
55
110
|
catch {
|
|
56
|
-
|
|
111
|
+
return {
|
|
112
|
+
authenticated: true,
|
|
113
|
+
valid: false,
|
|
114
|
+
username: creds.username ?? null,
|
|
115
|
+
loggedInAt: creds.loggedInAt ?? null,
|
|
116
|
+
hint: UNVERIFIED_SESSION_HINT,
|
|
117
|
+
};
|
|
57
118
|
}
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
}
|
|
119
|
+
await manager.remove();
|
|
120
|
+
return {
|
|
121
|
+
authenticated: false,
|
|
122
|
+
credentials: null,
|
|
123
|
+
clearedStaleCredentials: true,
|
|
124
|
+
hint: EXPIRED_SESSION_HINT,
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
return {
|
|
128
|
+
authenticated: true,
|
|
129
|
+
valid: true,
|
|
130
|
+
username: creds.username ?? null,
|
|
131
|
+
loggedInAt: creds.loggedInAt ?? null,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
async function statusAction(options) {
|
|
135
|
+
try {
|
|
136
|
+
console.log(formatOutput(await inspectStoredAuthStatus(), options.pretty));
|
|
65
137
|
}
|
|
66
138
|
catch (error) {
|
|
67
139
|
handleError(error);
|
|
@@ -71,31 +143,20 @@ async function extractAction(options) {
|
|
|
71
143
|
try {
|
|
72
144
|
const { TokenExtractor } = (await import('../token-extractor.js'));
|
|
73
145
|
const extractor = new TokenExtractor();
|
|
74
|
-
const
|
|
75
|
-
if (
|
|
146
|
+
const candidates = await extractor.extractCandidates();
|
|
147
|
+
if (candidates.length === 0) {
|
|
76
148
|
throw new Error('No SWMaestro session found in any browser. Login to swmaestro.ai in a supported Chromium browser (Chrome, Edge, Brave, Arc, Vivaldi) first.');
|
|
77
149
|
}
|
|
78
|
-
const
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
try {
|
|
82
|
-
valid = Boolean(await http.checkLogin());
|
|
83
|
-
if (valid) {
|
|
84
|
-
csrfToken = await http.extractCsrfToken();
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
catch {
|
|
88
|
-
valid = false;
|
|
89
|
-
}
|
|
90
|
-
if (!valid) {
|
|
91
|
-
warn('Warning: Could not validate session. Cookies may be expired.');
|
|
150
|
+
const credentials = await resolveExtractedCredentials(candidates);
|
|
151
|
+
if (!credentials) {
|
|
152
|
+
throw new Error('Found SWMaestro session cookies in supported browsers, but none are valid. Refresh your swmaestro.ai login in a supported Chromium browser and try again.');
|
|
92
153
|
}
|
|
93
154
|
await new CredentialManager().setCredentials({
|
|
94
|
-
sessionCookie:
|
|
95
|
-
csrfToken: csrfToken
|
|
155
|
+
sessionCookie: credentials.sessionCookie,
|
|
156
|
+
csrfToken: credentials.csrfToken,
|
|
96
157
|
loggedInAt: new Date().toISOString(),
|
|
97
158
|
});
|
|
98
|
-
console.log(formatOutput({ ok: true, extracted: true, valid }, options.pretty));
|
|
159
|
+
console.log(formatOutput({ ok: true, extracted: true, valid: true }, options.pretty));
|
|
99
160
|
}
|
|
100
161
|
catch (error) {
|
|
101
162
|
handleError(error);
|
|
@@ -110,7 +171,7 @@ export const authCommand = new Command('auth')
|
|
|
110
171
|
.option('--pretty', 'Pretty print JSON output')
|
|
111
172
|
.action(loginAction))
|
|
112
173
|
.addCommand(new Command('logout')
|
|
113
|
-
.description('
|
|
174
|
+
.description('Log out upstream session and remove saved credentials')
|
|
114
175
|
.option('--pretty', 'Pretty print JSON output')
|
|
115
176
|
.action(logoutAction))
|
|
116
177
|
.addCommand(new Command('status')
|