@wilm-ai/wilma-cli 1.6.2 → 2.0.0
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/LICENSE +21 -0
- package/README.md +57 -67
- package/dist/access.d.ts +12 -0
- package/dist/access.js +33 -0
- package/dist/agent-data.d.ts +496 -0
- package/dist/agent-data.js +578 -0
- package/dist/cli-args.d.ts +33 -0
- package/dist/cli-args.js +256 -0
- package/dist/cli-help.d.ts +2 -0
- package/dist/cli-help.js +141 -0
- package/dist/cli-output.d.ts +6 -0
- package/dist/cli-output.js +184 -0
- package/dist/config.js +63 -24
- package/dist/credentials.d.ts +69 -0
- package/dist/credentials.js +195 -0
- package/dist/downloads.d.ts +23 -0
- package/dist/downloads.js +105 -0
- package/dist/index.js +692 -1657
- package/dist/login-server.d.ts +52 -0
- package/dist/login-server.js +595 -0
- package/dist/mcp-tools.d.ts +23 -0
- package/dist/mcp-tools.js +235 -0
- package/dist/mcp.d.ts +1 -0
- package/dist/mcp.js +153 -0
- package/dist/output-json.d.ts +1 -0
- package/dist/output-json.js +26 -0
- package/dist/session-store.d.ts +7 -0
- package/dist/session-store.js +61 -0
- package/dist/tenant-search.d.ts +11 -0
- package/dist/tenant-search.js +127 -0
- package/dist/totp.d.ts +6 -0
- package/dist/totp.js +49 -0
- package/package.json +24 -8
|
@@ -0,0 +1,496 @@
|
|
|
1
|
+
import { WilmaClient, type LessonNote, type Message, type MessageFolder, type MfaCallback, type NewsItem, type NewsResource, type OverviewData, type StudentInfo, type WilmaProfile } from "@wilm-ai/wilma-client";
|
|
2
|
+
import type { SessionStore } from "./session-store.js";
|
|
3
|
+
/**
|
|
4
|
+
* An error with a stable code for agents and scripts (the CLI's JSON errors
|
|
5
|
+
* and exit codes use it): e.g. "unknown_student", "invalid_argument".
|
|
6
|
+
*/
|
|
7
|
+
export declare class WilmaAiError extends Error {
|
|
8
|
+
readonly code: string;
|
|
9
|
+
readonly details?: Record<string, unknown>;
|
|
10
|
+
constructor(code: string, message: string, details?: Record<string, unknown>);
|
|
11
|
+
}
|
|
12
|
+
/** YYYY-MM-DD, or "today", "yesterday" or "tomorrow" (Finnish time). */
|
|
13
|
+
export declare function parseIsoDate(raw: string): string;
|
|
14
|
+
export type ScheduleDateSelection = {
|
|
15
|
+
when: string;
|
|
16
|
+
startDate: string;
|
|
17
|
+
endDate: string;
|
|
18
|
+
queryDate?: string;
|
|
19
|
+
outputWhen: string;
|
|
20
|
+
};
|
|
21
|
+
export declare const SCHEDULE_WHEN: readonly ["today", "tomorrow", "week", "next-week"];
|
|
22
|
+
/** Everything a daily summary is built from (see fetchSummaryInputs). */
|
|
23
|
+
export interface SummaryInputs {
|
|
24
|
+
overview: OverviewData;
|
|
25
|
+
news: NewsItem[];
|
|
26
|
+
messages: Message[];
|
|
27
|
+
lessonNotes: LessonNote[];
|
|
28
|
+
/** Parts Wilma couldn't give this time (the rest of the summary is still right). */
|
|
29
|
+
unavailable: string[];
|
|
30
|
+
}
|
|
31
|
+
export type StudentRef = {
|
|
32
|
+
studentNumber: string;
|
|
33
|
+
name: string;
|
|
34
|
+
wilma?: string;
|
|
35
|
+
};
|
|
36
|
+
/** One Wilma login. A family can have several (children on different Wilmas). */
|
|
37
|
+
export interface AccessAccount {
|
|
38
|
+
profile: WilmaProfile;
|
|
39
|
+
mfa?: MfaCallback;
|
|
40
|
+
/** The Wilma's name, shown to tell children apart when there are several logins. */
|
|
41
|
+
label?: string | null;
|
|
42
|
+
onStudents?: (students: StudentInfo[]) => Promise<void>;
|
|
43
|
+
/** The children saved with the login, used when Wilma's own list comes back empty. */
|
|
44
|
+
knownStudents?: {
|
|
45
|
+
studentNumber: string;
|
|
46
|
+
name: string;
|
|
47
|
+
}[];
|
|
48
|
+
}
|
|
49
|
+
type AccountStudent = StudentInfo & {
|
|
50
|
+
account: number;
|
|
51
|
+
};
|
|
52
|
+
export type FetchedAttachment = {
|
|
53
|
+
status: "fetched";
|
|
54
|
+
/** Set for a bulletin attachment. */
|
|
55
|
+
newsId?: number;
|
|
56
|
+
/** Set for a printout (Tulosteet); `resource` then describes the printout. */
|
|
57
|
+
printoutId?: string;
|
|
58
|
+
resource: NewsResource;
|
|
59
|
+
fileName: string;
|
|
60
|
+
contentType: string | null;
|
|
61
|
+
data: Buffer;
|
|
62
|
+
} | {
|
|
63
|
+
status: "not_a_file";
|
|
64
|
+
newsId: number;
|
|
65
|
+
resource: NewsResource;
|
|
66
|
+
message: string;
|
|
67
|
+
};
|
|
68
|
+
/** Continue saved sessions instead of logging in for each process (CLI and local MCP server). */
|
|
69
|
+
export declare function useSessionStore(store: SessionStore | undefined): void;
|
|
70
|
+
/**
|
|
71
|
+
* Keep a session that is already logged in — e.g. the one the login page just
|
|
72
|
+
* verified — so the first tool call needs no second login (and, with two-step
|
|
73
|
+
* verification, no second code).
|
|
74
|
+
*/
|
|
75
|
+
export declare function adoptSession(profile: WilmaProfile, client: WilmaClient): void;
|
|
76
|
+
/** Save any sessions still being written (call before a short-lived process exits). */
|
|
77
|
+
export declare function flushSessions(): Promise<void>;
|
|
78
|
+
/**
|
|
79
|
+
* Read-only Wilma access for agent tools (MCP). Covers every Wilma login the
|
|
80
|
+
* family has saved; every method defaults to all children, and a student
|
|
81
|
+
* number or name narrows it. Uses one pooled session per Wilma login for
|
|
82
|
+
* listing and for every child.
|
|
83
|
+
*/
|
|
84
|
+
/**
|
|
85
|
+
* The students a name or number refers to. Agents and people pass names from
|
|
86
|
+
* free text, so match strictly: a student number, the full name, or the start
|
|
87
|
+
* of a name part ("Kiia" for "Kiia Example"). No fuzzy matching — a child not
|
|
88
|
+
* on the account must not match a sibling. Throws when nothing or several match.
|
|
89
|
+
*/
|
|
90
|
+
export declare function matchStudents<T extends {
|
|
91
|
+
studentNumber: string;
|
|
92
|
+
name: string;
|
|
93
|
+
}>(students: T[], student: string): T[];
|
|
94
|
+
export declare class WilmaAccess {
|
|
95
|
+
private readonly accounts;
|
|
96
|
+
private studentsCache;
|
|
97
|
+
/** One logged-in session per Wilma login, shared by every child on it. */
|
|
98
|
+
private readonly sessions;
|
|
99
|
+
/** Logins that failed while other logins worked. */
|
|
100
|
+
readonly problems: {
|
|
101
|
+
wilma: string;
|
|
102
|
+
message: string;
|
|
103
|
+
}[];
|
|
104
|
+
constructor(accounts: AccessAccount | AccessAccount[]);
|
|
105
|
+
private get multi();
|
|
106
|
+
private session;
|
|
107
|
+
private labelOf;
|
|
108
|
+
private ref;
|
|
109
|
+
students(): Promise<AccountStudent[]>;
|
|
110
|
+
/** The children as tools and commands show them (with their Wilma when there are several). */
|
|
111
|
+
studentList(): Promise<StudentRef[]>;
|
|
112
|
+
selectStudents(student?: string): Promise<AccountStudent[]>;
|
|
113
|
+
private client;
|
|
114
|
+
private perStudent;
|
|
115
|
+
/** Try each selected student until one can open the item (messages and news are often shared across siblings). */
|
|
116
|
+
private firstStudentWith;
|
|
117
|
+
/** The daily briefing per child (see buildSummaryData). `since`: YYYY-MM-DD, "yesterday"… */
|
|
118
|
+
summary(opts?: {
|
|
119
|
+
student?: string;
|
|
120
|
+
days?: number;
|
|
121
|
+
since?: string;
|
|
122
|
+
}): Promise<{
|
|
123
|
+
students: ({
|
|
124
|
+
student: StudentRef;
|
|
125
|
+
} & {
|
|
126
|
+
summary: {
|
|
127
|
+
unavailable?: string[] | undefined;
|
|
128
|
+
today: string;
|
|
129
|
+
tomorrow: string;
|
|
130
|
+
todaySchedule: import("@wilm-ai/wilma-client").ScheduleLesson[];
|
|
131
|
+
tomorrowSchedule: import("@wilm-ai/wilma-client").ScheduleLesson[];
|
|
132
|
+
upcomingExams: import("@wilm-ai/wilma-client").UpcomingExam[];
|
|
133
|
+
homework: import("@wilm-ai/wilma-client").HomeworkItem[];
|
|
134
|
+
lessonNotes: LessonNote[];
|
|
135
|
+
news: {
|
|
136
|
+
wilmaId: number;
|
|
137
|
+
title: string;
|
|
138
|
+
published: Date | null | undefined;
|
|
139
|
+
pinned: boolean;
|
|
140
|
+
}[];
|
|
141
|
+
messages: {
|
|
142
|
+
wilmaId: number;
|
|
143
|
+
subject: string;
|
|
144
|
+
sentAt: Date;
|
|
145
|
+
senderName: string | null;
|
|
146
|
+
folder: string;
|
|
147
|
+
unread: boolean;
|
|
148
|
+
replyCount: number;
|
|
149
|
+
}[];
|
|
150
|
+
unreadMessages: number;
|
|
151
|
+
};
|
|
152
|
+
})[];
|
|
153
|
+
problems: {
|
|
154
|
+
wilma: string;
|
|
155
|
+
message: string;
|
|
156
|
+
}[];
|
|
157
|
+
since?: string | undefined;
|
|
158
|
+
generatedAt: Date;
|
|
159
|
+
} | {
|
|
160
|
+
students: ({
|
|
161
|
+
student: StudentRef;
|
|
162
|
+
} & {
|
|
163
|
+
summary: {
|
|
164
|
+
unavailable?: string[] | undefined;
|
|
165
|
+
today: string;
|
|
166
|
+
tomorrow: string;
|
|
167
|
+
todaySchedule: import("@wilm-ai/wilma-client").ScheduleLesson[];
|
|
168
|
+
tomorrowSchedule: import("@wilm-ai/wilma-client").ScheduleLesson[];
|
|
169
|
+
upcomingExams: import("@wilm-ai/wilma-client").UpcomingExam[];
|
|
170
|
+
homework: import("@wilm-ai/wilma-client").HomeworkItem[];
|
|
171
|
+
lessonNotes: LessonNote[];
|
|
172
|
+
news: {
|
|
173
|
+
wilmaId: number;
|
|
174
|
+
title: string;
|
|
175
|
+
published: Date | null | undefined;
|
|
176
|
+
pinned: boolean;
|
|
177
|
+
}[];
|
|
178
|
+
messages: {
|
|
179
|
+
wilmaId: number;
|
|
180
|
+
subject: string;
|
|
181
|
+
sentAt: Date;
|
|
182
|
+
senderName: string | null;
|
|
183
|
+
folder: string;
|
|
184
|
+
unread: boolean;
|
|
185
|
+
replyCount: number;
|
|
186
|
+
}[];
|
|
187
|
+
unreadMessages: number;
|
|
188
|
+
};
|
|
189
|
+
})[];
|
|
190
|
+
problems?: undefined;
|
|
191
|
+
since?: string | undefined;
|
|
192
|
+
generatedAt: Date;
|
|
193
|
+
}>;
|
|
194
|
+
schedule(opts?: {
|
|
195
|
+
student?: string;
|
|
196
|
+
when?: (typeof SCHEDULE_WHEN)[number];
|
|
197
|
+
date?: string;
|
|
198
|
+
weekday?: string;
|
|
199
|
+
}): Promise<{
|
|
200
|
+
students: ({
|
|
201
|
+
student: StudentRef;
|
|
202
|
+
} & {
|
|
203
|
+
lessons: import("@wilm-ai/wilma-client").ScheduleLesson[];
|
|
204
|
+
})[];
|
|
205
|
+
problems: {
|
|
206
|
+
wilma: string;
|
|
207
|
+
message: string;
|
|
208
|
+
}[];
|
|
209
|
+
date: string;
|
|
210
|
+
weekStart?: undefined;
|
|
211
|
+
weekEnd?: undefined;
|
|
212
|
+
when: string;
|
|
213
|
+
} | {
|
|
214
|
+
students: ({
|
|
215
|
+
student: StudentRef;
|
|
216
|
+
} & {
|
|
217
|
+
lessons: import("@wilm-ai/wilma-client").ScheduleLesson[];
|
|
218
|
+
})[];
|
|
219
|
+
problems?: undefined;
|
|
220
|
+
date: string;
|
|
221
|
+
weekStart?: undefined;
|
|
222
|
+
weekEnd?: undefined;
|
|
223
|
+
when: string;
|
|
224
|
+
} | {
|
|
225
|
+
students: ({
|
|
226
|
+
student: StudentRef;
|
|
227
|
+
} & {
|
|
228
|
+
lessons: import("@wilm-ai/wilma-client").ScheduleLesson[];
|
|
229
|
+
})[];
|
|
230
|
+
problems: {
|
|
231
|
+
wilma: string;
|
|
232
|
+
message: string;
|
|
233
|
+
}[];
|
|
234
|
+
weekStart: string;
|
|
235
|
+
weekEnd: string;
|
|
236
|
+
date?: undefined;
|
|
237
|
+
when: string;
|
|
238
|
+
} | {
|
|
239
|
+
students: ({
|
|
240
|
+
student: StudentRef;
|
|
241
|
+
} & {
|
|
242
|
+
lessons: import("@wilm-ai/wilma-client").ScheduleLesson[];
|
|
243
|
+
})[];
|
|
244
|
+
problems?: undefined;
|
|
245
|
+
weekStart: string;
|
|
246
|
+
weekEnd: string;
|
|
247
|
+
date?: undefined;
|
|
248
|
+
when: string;
|
|
249
|
+
}>;
|
|
250
|
+
homework(opts?: {
|
|
251
|
+
student?: string;
|
|
252
|
+
limit?: number;
|
|
253
|
+
}): Promise<{
|
|
254
|
+
students: ({
|
|
255
|
+
student: StudentRef;
|
|
256
|
+
} & {
|
|
257
|
+
homework: import("@wilm-ai/wilma-client").HomeworkItem[];
|
|
258
|
+
})[];
|
|
259
|
+
problems: {
|
|
260
|
+
wilma: string;
|
|
261
|
+
message: string;
|
|
262
|
+
}[];
|
|
263
|
+
} | {
|
|
264
|
+
students: ({
|
|
265
|
+
student: StudentRef;
|
|
266
|
+
} & {
|
|
267
|
+
homework: import("@wilm-ai/wilma-client").HomeworkItem[];
|
|
268
|
+
})[];
|
|
269
|
+
problems?: undefined;
|
|
270
|
+
}>;
|
|
271
|
+
upcomingExams(opts?: {
|
|
272
|
+
student?: string;
|
|
273
|
+
limit?: number;
|
|
274
|
+
}): Promise<{
|
|
275
|
+
students: ({
|
|
276
|
+
student: StudentRef;
|
|
277
|
+
} & {
|
|
278
|
+
exams: import("@wilm-ai/wilma-client").UpcomingExam[];
|
|
279
|
+
})[];
|
|
280
|
+
problems: {
|
|
281
|
+
wilma: string;
|
|
282
|
+
message: string;
|
|
283
|
+
}[];
|
|
284
|
+
} | {
|
|
285
|
+
students: ({
|
|
286
|
+
student: StudentRef;
|
|
287
|
+
} & {
|
|
288
|
+
exams: import("@wilm-ai/wilma-client").UpcomingExam[];
|
|
289
|
+
})[];
|
|
290
|
+
problems?: undefined;
|
|
291
|
+
}>;
|
|
292
|
+
grades(opts?: {
|
|
293
|
+
student?: string;
|
|
294
|
+
limit?: number;
|
|
295
|
+
}): Promise<{
|
|
296
|
+
students: ({
|
|
297
|
+
student: StudentRef;
|
|
298
|
+
} & {
|
|
299
|
+
grades: import("@wilm-ai/wilma-client").ExamGrade[];
|
|
300
|
+
})[];
|
|
301
|
+
problems: {
|
|
302
|
+
wilma: string;
|
|
303
|
+
message: string;
|
|
304
|
+
}[];
|
|
305
|
+
} | {
|
|
306
|
+
students: ({
|
|
307
|
+
student: StudentRef;
|
|
308
|
+
} & {
|
|
309
|
+
grades: import("@wilm-ai/wilma-client").ExamGrade[];
|
|
310
|
+
})[];
|
|
311
|
+
problems?: undefined;
|
|
312
|
+
}>;
|
|
313
|
+
/** Lesson notes for one day (default today), the last `days` days, or `from`–`to` (to defaults to today). */
|
|
314
|
+
lessonNotes(opts?: {
|
|
315
|
+
student?: string;
|
|
316
|
+
date?: string;
|
|
317
|
+
days?: number;
|
|
318
|
+
from?: string;
|
|
319
|
+
to?: string;
|
|
320
|
+
}): Promise<{
|
|
321
|
+
students: ({
|
|
322
|
+
student: StudentRef;
|
|
323
|
+
} & {
|
|
324
|
+
notes: LessonNote[];
|
|
325
|
+
})[];
|
|
326
|
+
problems: {
|
|
327
|
+
wilma: string;
|
|
328
|
+
message: string;
|
|
329
|
+
}[];
|
|
330
|
+
from: string;
|
|
331
|
+
to: string;
|
|
332
|
+
} | {
|
|
333
|
+
students: ({
|
|
334
|
+
student: StudentRef;
|
|
335
|
+
} & {
|
|
336
|
+
notes: LessonNote[];
|
|
337
|
+
})[];
|
|
338
|
+
problems?: undefined;
|
|
339
|
+
from: string;
|
|
340
|
+
to: string;
|
|
341
|
+
} | {
|
|
342
|
+
students: ({
|
|
343
|
+
student: StudentRef;
|
|
344
|
+
} & {
|
|
345
|
+
notes: LessonNote[];
|
|
346
|
+
})[];
|
|
347
|
+
problems: {
|
|
348
|
+
wilma: string;
|
|
349
|
+
message: string;
|
|
350
|
+
}[];
|
|
351
|
+
date: string;
|
|
352
|
+
} | {
|
|
353
|
+
students: ({
|
|
354
|
+
student: StudentRef;
|
|
355
|
+
} & {
|
|
356
|
+
notes: LessonNote[];
|
|
357
|
+
})[];
|
|
358
|
+
problems?: undefined;
|
|
359
|
+
date: string;
|
|
360
|
+
}>;
|
|
361
|
+
/** Lesson notes counted by kind (absences, lateness, feedback…): this school year, or from a date. */
|
|
362
|
+
lessonNotesSummary(opts?: {
|
|
363
|
+
student?: string;
|
|
364
|
+
from?: string;
|
|
365
|
+
to?: string;
|
|
366
|
+
}): Promise<{
|
|
367
|
+
students: ({
|
|
368
|
+
student: StudentRef;
|
|
369
|
+
} & {
|
|
370
|
+
summary: import("@wilm-ai/wilma-client").LessonNoteSummary;
|
|
371
|
+
})[];
|
|
372
|
+
problems: {
|
|
373
|
+
wilma: string;
|
|
374
|
+
message: string;
|
|
375
|
+
}[];
|
|
376
|
+
} | {
|
|
377
|
+
students: ({
|
|
378
|
+
student: StudentRef;
|
|
379
|
+
} & {
|
|
380
|
+
summary: import("@wilm-ai/wilma-client").LessonNoteSummary;
|
|
381
|
+
})[];
|
|
382
|
+
problems?: undefined;
|
|
383
|
+
}>;
|
|
384
|
+
gradebook(opts?: {
|
|
385
|
+
student?: string;
|
|
386
|
+
}): Promise<{
|
|
387
|
+
students: ({
|
|
388
|
+
student: StudentRef;
|
|
389
|
+
} & {
|
|
390
|
+
gradebook: import("@wilm-ai/wilma-client").GradebookEntry[];
|
|
391
|
+
})[];
|
|
392
|
+
problems: {
|
|
393
|
+
wilma: string;
|
|
394
|
+
message: string;
|
|
395
|
+
}[];
|
|
396
|
+
} | {
|
|
397
|
+
students: ({
|
|
398
|
+
student: StudentRef;
|
|
399
|
+
} & {
|
|
400
|
+
gradebook: import("@wilm-ai/wilma-client").GradebookEntry[];
|
|
401
|
+
})[];
|
|
402
|
+
problems?: undefined;
|
|
403
|
+
}>;
|
|
404
|
+
printouts(opts?: {
|
|
405
|
+
student?: string;
|
|
406
|
+
}): Promise<{
|
|
407
|
+
students: ({
|
|
408
|
+
student: StudentRef;
|
|
409
|
+
} & {
|
|
410
|
+
printouts: import("@wilm-ai/wilma-client").Printout[];
|
|
411
|
+
})[];
|
|
412
|
+
problems: {
|
|
413
|
+
wilma: string;
|
|
414
|
+
message: string;
|
|
415
|
+
}[];
|
|
416
|
+
} | {
|
|
417
|
+
students: ({
|
|
418
|
+
student: StudentRef;
|
|
419
|
+
} & {
|
|
420
|
+
printouts: import("@wilm-ai/wilma-client").Printout[];
|
|
421
|
+
})[];
|
|
422
|
+
problems?: undefined;
|
|
423
|
+
}>;
|
|
424
|
+
printout(opts: {
|
|
425
|
+
id: string;
|
|
426
|
+
student?: string;
|
|
427
|
+
}): Promise<FetchedAttachment & {
|
|
428
|
+
student: StudentRef;
|
|
429
|
+
}>;
|
|
430
|
+
messages(opts?: {
|
|
431
|
+
student?: string;
|
|
432
|
+
folder?: MessageFolder;
|
|
433
|
+
limit?: number;
|
|
434
|
+
}): Promise<{
|
|
435
|
+
students: ({
|
|
436
|
+
student: StudentRef;
|
|
437
|
+
} & {
|
|
438
|
+
messages: Message[];
|
|
439
|
+
})[];
|
|
440
|
+
problems: {
|
|
441
|
+
wilma: string;
|
|
442
|
+
message: string;
|
|
443
|
+
}[];
|
|
444
|
+
} | {
|
|
445
|
+
students: ({
|
|
446
|
+
student: StudentRef;
|
|
447
|
+
} & {
|
|
448
|
+
messages: Message[];
|
|
449
|
+
})[];
|
|
450
|
+
problems?: undefined;
|
|
451
|
+
}>;
|
|
452
|
+
message(opts: {
|
|
453
|
+
id: number;
|
|
454
|
+
student?: string;
|
|
455
|
+
}): Promise<{
|
|
456
|
+
student: StudentRef;
|
|
457
|
+
message: Message;
|
|
458
|
+
}>;
|
|
459
|
+
news(opts?: {
|
|
460
|
+
student?: string;
|
|
461
|
+
limit?: number;
|
|
462
|
+
includeOlder?: boolean;
|
|
463
|
+
}): Promise<{
|
|
464
|
+
students: ({
|
|
465
|
+
student: StudentRef;
|
|
466
|
+
} & {
|
|
467
|
+
news: NewsItem[];
|
|
468
|
+
})[];
|
|
469
|
+
problems: {
|
|
470
|
+
wilma: string;
|
|
471
|
+
message: string;
|
|
472
|
+
}[];
|
|
473
|
+
} | {
|
|
474
|
+
students: ({
|
|
475
|
+
student: StudentRef;
|
|
476
|
+
} & {
|
|
477
|
+
news: NewsItem[];
|
|
478
|
+
})[];
|
|
479
|
+
problems?: undefined;
|
|
480
|
+
}>;
|
|
481
|
+
newsItem(opts: {
|
|
482
|
+
id: number;
|
|
483
|
+
student?: string;
|
|
484
|
+
}): Promise<{
|
|
485
|
+
student: StudentRef;
|
|
486
|
+
news: NewsItem;
|
|
487
|
+
}>;
|
|
488
|
+
newsAttachment(opts: {
|
|
489
|
+
newsId: number;
|
|
490
|
+
resourceId: string;
|
|
491
|
+
student?: string;
|
|
492
|
+
}): Promise<FetchedAttachment & {
|
|
493
|
+
student: StudentRef;
|
|
494
|
+
}>;
|
|
495
|
+
}
|
|
496
|
+
export {};
|