@argentic/chest-sdk 0.1.1 → 0.3.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/README.md +573 -37
- package/client/index.ts +12 -5
- package/client/src/ai.ts +374 -0
- package/client/src/api.ts +85 -0
- package/client/src/chest.ts +80 -0
- package/client/src/errors.ts +58 -3
- package/client/src/events.ts +228 -0
- package/client/src/files.ts +93 -88
- package/client/src/member.ts +61 -17
- package/client/src/members.ts +167 -0
- package/client/src/notifications.ts +148 -0
- package/client/src/testing.ts +564 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -5
- package/dist/index.js.map +1 -1
- package/dist/src/ai.d.ts +131 -0
- package/dist/src/ai.d.ts.map +1 -0
- package/dist/src/ai.js +290 -0
- package/dist/src/ai.js.map +1 -0
- package/dist/src/api.d.ts +11 -0
- package/dist/src/api.d.ts.map +1 -0
- package/dist/src/api.js +93 -0
- package/dist/src/api.js.map +1 -0
- package/dist/src/chest.d.ts +10 -0
- package/dist/src/chest.d.ts.map +1 -0
- package/dist/src/chest.js +49 -0
- package/dist/src/chest.js.map +1 -0
- package/dist/src/errors.d.ts +19 -0
- package/dist/src/errors.d.ts.map +1 -1
- package/dist/src/errors.js +49 -3
- package/dist/src/errors.js.map +1 -1
- package/dist/src/events.d.ts +56 -0
- package/dist/src/events.d.ts.map +1 -0
- package/dist/src/events.js +193 -0
- package/dist/src/events.js.map +1 -0
- package/dist/src/files.d.ts +17 -1
- package/dist/src/files.d.ts.map +1 -1
- package/dist/src/files.js +95 -92
- package/dist/src/files.js.map +1 -1
- package/dist/src/member.d.ts +10 -3
- package/dist/src/member.d.ts.map +1 -1
- package/dist/src/member.js +34 -11
- package/dist/src/member.js.map +1 -1
- package/dist/src/members.d.ts +34 -0
- package/dist/src/members.d.ts.map +1 -0
- package/dist/src/members.js +146 -0
- package/dist/src/members.js.map +1 -0
- package/dist/src/notifications.d.ts +25 -0
- package/dist/src/notifications.d.ts.map +1 -0
- package/dist/src/notifications.js +121 -0
- package/dist/src/notifications.js.map +1 -0
- package/dist/src/testing.d.ts +101 -0
- package/dist/src/testing.d.ts.map +1 -0
- package/dist/src/testing.js +552 -0
- package/dist/src/testing.js.map +1 -0
- package/package.json +40 -4
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export type Notice = {
|
|
2
|
+
title: string;
|
|
3
|
+
body?: string;
|
|
4
|
+
path?: string;
|
|
5
|
+
key?: string;
|
|
6
|
+
};
|
|
7
|
+
export type Delivery = {
|
|
8
|
+
delivered: string[];
|
|
9
|
+
skipped: string[];
|
|
10
|
+
};
|
|
11
|
+
export type BadgeCount = {
|
|
12
|
+
memberId: string;
|
|
13
|
+
count: number;
|
|
14
|
+
};
|
|
15
|
+
export type BadgeWrite = {
|
|
16
|
+
set: string[];
|
|
17
|
+
skipped: string[];
|
|
18
|
+
};
|
|
19
|
+
export declare function notify(memberIds: Iterable<string>, notice: Notice): Promise<Delivery>;
|
|
20
|
+
export declare function withdraw(key: string, memberIds?: Iterable<string>): Promise<void>;
|
|
21
|
+
export declare const badge: {
|
|
22
|
+
set(memberId: string, count: number): Promise<boolean>;
|
|
23
|
+
setMany(counts: Iterable<BadgeCount>): Promise<BadgeWrite>;
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=notifications.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notifications.d.ts","sourceRoot":"","sources":["../../client/src/notifications.ts"],"names":[],"mappings":"AA4BA,MAAM,MAAM,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAGnF,MAAM,MAAM,QAAQ,GAAG;IAAE,SAAS,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAElE,MAAM,MAAM,UAAU,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAG7D,MAAM,MAAM,UAAU,GAAG;IAAE,GAAG,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAiE9D,wBAAsB,MAAM,CAAC,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAU3F;AAKD,wBAAsB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAIvF;AAID,eAAO,MAAM,KAAK;IAGV,GAAG,WAAW,MAAM,SAAS,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAOtD,OAAO,SAAS,QAAQ,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC;CAajE,CAAC"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { ask as chest, json, refusal } from "./api.js";
|
|
2
|
+
import { ChestError, Unavailable } from "./errors.js";
|
|
3
|
+
import { memberIdPattern } from "./member.js";
|
|
4
|
+
// The bounds of a Chest.
|
|
5
|
+
const maxMembers = 500, maxTitle = 80, maxBody = 280, maxPath = 512, maxCount = 9999;
|
|
6
|
+
const keyPattern = /^[a-z0-9._:-]{1,64}$/u;
|
|
7
|
+
// What the Chest removes from a title before keeping it: control characters
|
|
8
|
+
// and the characters that reorder text.
|
|
9
|
+
const removed = /[\p{Cc}\u061c\u200e\u200f\u202a-\u202e\u2066-\u2069]/gu;
|
|
10
|
+
const ask = (method, path, value) => chest("notifications", method, path, { body: JSON.stringify(value), type: "application/json" });
|
|
11
|
+
// expect lets through the one answer expected; a refusal is what the Chest
|
|
12
|
+
// says, any other success is not the Chest's.
|
|
13
|
+
async function expect(response, status) {
|
|
14
|
+
if (response.status === status)
|
|
15
|
+
return;
|
|
16
|
+
if (response.status < 400) {
|
|
17
|
+
await response.body?.cancel();
|
|
18
|
+
throw new Unavailable();
|
|
19
|
+
}
|
|
20
|
+
throw await refusal(response, "notifications");
|
|
21
|
+
}
|
|
22
|
+
const length = (s) => [...s].length;
|
|
23
|
+
function checkId(id) {
|
|
24
|
+
if (typeof id !== "string" || !memberIdPattern.test(id))
|
|
25
|
+
throw new ChestError("invalid_id", 400, "invalid member identifier");
|
|
26
|
+
return id;
|
|
27
|
+
}
|
|
28
|
+
// checkIds reads 1 to 500 member identifiers, as given.
|
|
29
|
+
function checkIds(ids) {
|
|
30
|
+
const all = [...ids];
|
|
31
|
+
if (all.length < 1 || all.length > maxMembers)
|
|
32
|
+
throw new ChestError("invalid_body", 400, "1 to 500 member identifiers");
|
|
33
|
+
return all.map(checkId);
|
|
34
|
+
}
|
|
35
|
+
function checkKey(key) {
|
|
36
|
+
if (typeof key !== "string" || !keyPattern.test(key))
|
|
37
|
+
throw new ChestError("invalid_key", 400, "a key is 1 to 64 of a-z 0-9 . _ : -");
|
|
38
|
+
return key;
|
|
39
|
+
}
|
|
40
|
+
function checkCount(count) {
|
|
41
|
+
if (typeof count !== "number" || !Number.isInteger(count) || count < 0 || count > maxCount)
|
|
42
|
+
throw new ChestError("invalid_count", 400, "a count is 0 to 9999");
|
|
43
|
+
return count;
|
|
44
|
+
}
|
|
45
|
+
// checkPath accepts /chest, or /chest followed by '/', '?' or '#': printable
|
|
46
|
+
// ASCII but '\', 512 bytes at most, never '//', no '.' or '..' segment
|
|
47
|
+
// (written %2e either).
|
|
48
|
+
function checkPath(path) {
|
|
49
|
+
if (typeof path !== "string" || path.length > maxPath || !/^\/chest([/?#][\x21-\x5b\x5d-\x7e]*)?$/u.test(path) || path.includes("//") || path.split(/[?#]/u)[0].split("/").some(s => /^(\.|%2e){1,2}$/iu.test(s)))
|
|
50
|
+
throw new ChestError("invalid_path", 400, "a path is /chest or under it");
|
|
51
|
+
return path;
|
|
52
|
+
}
|
|
53
|
+
// partition checks an answer that splits the identifiers asked, each once,
|
|
54
|
+
// in their order, between two lists of it; anything else is not the Chest's.
|
|
55
|
+
function partition(answer, first, second, asked) {
|
|
56
|
+
const a = answer !== null && typeof answer === "object" && !Array.isArray(answer) ? answer : null;
|
|
57
|
+
const lists = [a?.[first], a?.[second]];
|
|
58
|
+
if (!lists.every(l => Array.isArray(l) && l.every(id => typeof id === "string")))
|
|
59
|
+
throw new Unavailable();
|
|
60
|
+
const [one, two] = lists;
|
|
61
|
+
const wanted = [...new Set(asked)];
|
|
62
|
+
const inOrder = (l) => l.every((id, i) => wanted.indexOf(id) > (i === 0 ? -1 : wanted.indexOf(l[i - 1])));
|
|
63
|
+
if (one.length + two.length !== wanted.length || !inOrder(one) || !inOrder(two) || one.some(id => two.includes(id)))
|
|
64
|
+
throw new Unavailable();
|
|
65
|
+
return [[...one], [...two]];
|
|
66
|
+
}
|
|
67
|
+
// notify puts one item in the inbox of each member who has the tool, among
|
|
68
|
+
// 1 to 500 identifiers (each counted once). A link to path, on the tool's
|
|
69
|
+
// team host, opens it. With a key, the member's item of that key is replaced:
|
|
70
|
+
// new text, new time, first and unread again.
|
|
71
|
+
export async function notify(memberIds, notice) {
|
|
72
|
+
const members = checkIds(memberIds);
|
|
73
|
+
const { title, body, path, key } = notice;
|
|
74
|
+
if (typeof title !== "string" || length(title) < 1 || length(title) > maxTitle || title.replace(removed, "").trim() === "")
|
|
75
|
+
throw new ChestError("invalid_title", 400, "a title is 1 to 80 characters");
|
|
76
|
+
if (body !== undefined && (typeof body !== "string" || length(body) > maxBody))
|
|
77
|
+
throw new ChestError("invalid_text", 400, "a body is 280 characters at most");
|
|
78
|
+
const command = { members, title, ...(body ? { body } : {}), ...(path !== undefined ? { path: checkPath(path) } : {}), ...(key !== undefined ? { key: checkKey(key) } : {}) };
|
|
79
|
+
const response = await ask("POST", "/notifications", command);
|
|
80
|
+
await expect(response, 200);
|
|
81
|
+
const [delivered, skipped] = partition(await json(response), "delivered", "skipped", members);
|
|
82
|
+
return { delivered, skipped };
|
|
83
|
+
}
|
|
84
|
+
// withdraw removes the items of that key, from every member or from those
|
|
85
|
+
// named (1 to 500): the thing they were about is done. It never says what
|
|
86
|
+
// existed.
|
|
87
|
+
export async function withdraw(key, memberIds) {
|
|
88
|
+
const command = { key: checkKey(key), ...(memberIds !== undefined ? { members: checkIds(memberIds) } : {}) };
|
|
89
|
+
const response = await ask("POST", "/notifications/withdraw", command);
|
|
90
|
+
await expect(response, 204);
|
|
91
|
+
}
|
|
92
|
+
// badge sets the count shown on the tool's tile for a member (0 to 9,999; 0
|
|
93
|
+
// clears it): a state, not an event, so setting it again changes nothing.
|
|
94
|
+
export const badge = {
|
|
95
|
+
// set is true once the member's badge is set, false when they do not have
|
|
96
|
+
// the tool.
|
|
97
|
+
async set(memberId, count) {
|
|
98
|
+
checkId(memberId);
|
|
99
|
+
const response = await ask("PUT", "/badges/" + memberId, { count: checkCount(count) });
|
|
100
|
+
await expect(response, 200);
|
|
101
|
+
return partition(await json(response), "set", "skipped", [memberId])[0].length === 1;
|
|
102
|
+
},
|
|
103
|
+
// setMany sets 1 to 500 badges, a member at most once.
|
|
104
|
+
async setMany(counts) {
|
|
105
|
+
const all = [...counts];
|
|
106
|
+
if (all.length < 1 || all.length > maxMembers)
|
|
107
|
+
throw new ChestError("invalid_body", 400, "1 to 500 badges");
|
|
108
|
+
const badges = all.map(b => {
|
|
109
|
+
if (b === null || typeof b !== "object")
|
|
110
|
+
throw new ChestError("invalid_body", 400, "a badge is {memberId, count}");
|
|
111
|
+
return { member: checkId(b.memberId), count: checkCount(b.count) };
|
|
112
|
+
});
|
|
113
|
+
if (new Set(badges.map(b => b.member)).size !== badges.length)
|
|
114
|
+
throw new ChestError("invalid_body", 400, "a member at most once");
|
|
115
|
+
const response = await ask("PUT", "/badges", { badges });
|
|
116
|
+
await expect(response, 200);
|
|
117
|
+
const [set, skipped] = partition(await json(response), "set", "skipped", badges.map(b => b.member));
|
|
118
|
+
return { set, skipped };
|
|
119
|
+
},
|
|
120
|
+
};
|
|
121
|
+
//# sourceMappingURL=notifications.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notifications.js","sourceRoot":"","sources":["../../client/src/notifications.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { type IncomingMessage } from "node:http";
|
|
2
|
+
import type { Alias, Provider } from "./ai.js";
|
|
3
|
+
import type { AiUnavailableReason } from "./errors.js";
|
|
4
|
+
import type { ChestEvent } from "./events.js";
|
|
5
|
+
import { type Member } from "./member.js";
|
|
6
|
+
export type FakeGroup = {
|
|
7
|
+
id: string;
|
|
8
|
+
name: string;
|
|
9
|
+
members: string[];
|
|
10
|
+
};
|
|
11
|
+
export type FakeFile = {
|
|
12
|
+
data: Uint8Array;
|
|
13
|
+
type: string;
|
|
14
|
+
updated: string;
|
|
15
|
+
};
|
|
16
|
+
export type FakeNotification = {
|
|
17
|
+
member: string;
|
|
18
|
+
title: string;
|
|
19
|
+
body?: string;
|
|
20
|
+
path: string;
|
|
21
|
+
key?: string;
|
|
22
|
+
};
|
|
23
|
+
export type FakeAiModel = {
|
|
24
|
+
alias: Alias;
|
|
25
|
+
model: string;
|
|
26
|
+
provider?: Provider;
|
|
27
|
+
input?: number;
|
|
28
|
+
output?: number;
|
|
29
|
+
};
|
|
30
|
+
export type FakeAiReply = string | {
|
|
31
|
+
text?: string;
|
|
32
|
+
toolCalls?: {
|
|
33
|
+
name: string;
|
|
34
|
+
arguments: string;
|
|
35
|
+
id?: string;
|
|
36
|
+
}[];
|
|
37
|
+
};
|
|
38
|
+
export type FakeAi = {
|
|
39
|
+
models?: FakeAiModel[];
|
|
40
|
+
reply?: (request: Record<string, unknown>) => FakeAiReply;
|
|
41
|
+
cap?: number;
|
|
42
|
+
unavailable?: AiUnavailableReason;
|
|
43
|
+
};
|
|
44
|
+
export type FakeAiCall = {
|
|
45
|
+
path: string;
|
|
46
|
+
body: unknown;
|
|
47
|
+
};
|
|
48
|
+
export type FakeChestOptions = {
|
|
49
|
+
members?: Member[];
|
|
50
|
+
former?: {
|
|
51
|
+
id: string;
|
|
52
|
+
name?: string;
|
|
53
|
+
erased?: boolean;
|
|
54
|
+
}[];
|
|
55
|
+
groups?: FakeGroup[];
|
|
56
|
+
capabilities?: string[];
|
|
57
|
+
receives?: string[];
|
|
58
|
+
files?: Record<string, {
|
|
59
|
+
data: Uint8Array | string;
|
|
60
|
+
type?: string;
|
|
61
|
+
}>;
|
|
62
|
+
ai?: FakeAi;
|
|
63
|
+
chest?: {
|
|
64
|
+
organization?: string;
|
|
65
|
+
timeZone?: string;
|
|
66
|
+
language?: string;
|
|
67
|
+
};
|
|
68
|
+
};
|
|
69
|
+
export type FakeEvent = {
|
|
70
|
+
[K in ChestEvent["type"]]: {
|
|
71
|
+
type: K;
|
|
72
|
+
data: Extract<ChestEvent, {
|
|
73
|
+
type: K;
|
|
74
|
+
}>["data"];
|
|
75
|
+
id?: string;
|
|
76
|
+
occurredAt?: string;
|
|
77
|
+
};
|
|
78
|
+
}[ChestEvent["type"]];
|
|
79
|
+
export type FakeChest = {
|
|
80
|
+
api: string;
|
|
81
|
+
token: string;
|
|
82
|
+
tool: string;
|
|
83
|
+
members: Member[];
|
|
84
|
+
groups: FakeGroup[];
|
|
85
|
+
files: Map<string, FakeFile>;
|
|
86
|
+
notifications: FakeNotification[];
|
|
87
|
+
badges: Map<string, number>;
|
|
88
|
+
acknowledged: string[];
|
|
89
|
+
ai: FakeAiCall[];
|
|
90
|
+
emit(event: FakeEvent, to: string | ((request: Request) => Response | Promise<Response>)): Promise<number>;
|
|
91
|
+
close(): Promise<void>;
|
|
92
|
+
};
|
|
93
|
+
export type AssertionOptions = {
|
|
94
|
+
token?: string;
|
|
95
|
+
tool?: string;
|
|
96
|
+
now?: Date;
|
|
97
|
+
};
|
|
98
|
+
export declare function signAssertion(member: Member, options?: AssertionOptions): string;
|
|
99
|
+
export declare function withMember<R extends Request | IncomingMessage>(request: R, member: Member, options?: AssertionOptions): R;
|
|
100
|
+
export declare function fakeChest(options?: FakeChestOptions): Promise<FakeChest>;
|
|
101
|
+
//# sourceMappingURL=testing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../../client/src/testing.ts"],"names":[],"mappings":"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"}
|