@chibitek/chibi 0.1.173 → 0.1.174
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/assets/{abnfDiagram-O67JEVCF-DaA9WpZw.js → abnfDiagram-O67JEVCF-BVDndX1g.js} +1 -1
- package/dist/assets/{arc-DJ4Kdvv6.js → arc-WduS6wYB.js} +1 -1
- package/dist/assets/{architectureDiagram-NJMV4G6O-B975BUTv.js → architectureDiagram-NJMV4G6O-CYK9LkCf.js} +1 -1
- package/dist/assets/{blockDiagram-BEXU5L5S-CXOOfLy7.js → blockDiagram-BEXU5L5S-BMj-aPW9.js} +1 -1
- package/dist/assets/{c4Diagram-YGBWAQC7-CorqQ94E.js → c4Diagram-YGBWAQC7-cXYIStgL.js} +1 -1
- package/dist/assets/channel-TratrwmM.js +1 -0
- package/dist/assets/{chunk-2Q5K7J3B-CPFHpKez.js → chunk-2Q5K7J3B-CZ_nCppA.js} +1 -1
- package/dist/assets/{chunk-3FUC2YCW-CrzBuB3A.js → chunk-3FUC2YCW-C3wRAbtM.js} +2 -2
- package/dist/assets/{chunk-5VM5RSS4-DXJTBdvO.js → chunk-5VM5RSS4-CMvgOXJP.js} +1 -1
- package/dist/assets/{chunk-GTNCS2PH-B0TxALG4.js → chunk-GTNCS2PH-9wBuLQzU.js} +1 -1
- package/dist/assets/{chunk-GWA4HPMP-BL44uVOP.js → chunk-GWA4HPMP-BpJMmfAi.js} +1 -1
- package/dist/assets/{chunk-JWPE2WC7-CxSklH7P.js → chunk-JWPE2WC7-BnM06ABv.js} +1 -1
- package/dist/assets/{chunk-NETBCI7D-_Lb-D8AY.js → chunk-NETBCI7D-CjjiiXiT.js} +1 -1
- package/dist/assets/{chunk-WEXAMYUT-Dz5jp0xb.js → chunk-WEXAMYUT-D3heHHZs.js} +1 -1
- package/dist/assets/{chunk-XXDRQBXY-C-cd9N0r.js → chunk-XXDRQBXY-n_P41ZlM.js} +1 -1
- package/dist/assets/{classDiagram-v2-NBCMYWYE-DtQ1781-.js → classDiagram-v2-NBCMYWYE-Dz60Ek-6.js} +1 -1
- package/dist/assets/{cose-bilkent-JH36ORCC-CHzWXNdH.js → cose-bilkent-JH36ORCC-BCt6vBi9.js} +1 -1
- package/dist/assets/{cynefin-OW5HDTMX-lHbKcf1S.js → cynefin-OW5HDTMX-U0uq4EAQ.js} +1 -1
- package/dist/assets/{cynefinDiagram-VND7K2PF-BxY6MCKD.js → cynefinDiagram-VND7K2PF-CaQX0eUJ.js} +1 -1
- package/dist/assets/{dagre-6A5THRUB-C2SBw-Mo.js → dagre-6A5THRUB-DlCMESYH.js} +1 -1
- package/dist/assets/{diagram-22UHCM2B-BwIAlmAU.js → diagram-22UHCM2B-Cl1xmlTD.js} +1 -1
- package/dist/assets/{diagram-3UASUU5V-i6fBkckD.js → diagram-3UASUU5V-Cus3CPg7.js} +1 -1
- package/dist/assets/{diagram-ATOU4E4O-DwedCbB_.js → diagram-ATOU4E4O-i06rMvae.js} +1 -1
- package/dist/assets/{diagram-CDSNMT55-BISF-AQC.js → diagram-CDSNMT55-CUM5_heN.js} +1 -1
- package/dist/assets/{diagram-MLGK6HIB-ImgdRRxp.js → diagram-MLGK6HIB-B5NKRruo.js} +1 -1
- package/dist/assets/{diagram-MPIPVDR6-CxlAwPCS.js → diagram-MPIPVDR6-CAumAcGl.js} +1 -1
- package/dist/assets/{ebnfDiagram-ZINNZB2B-sVJkymKa.js → ebnfDiagram-ZINNZB2B-B19d7d8l.js} +1 -1
- package/dist/assets/{elk-276RUBZZ-DU1vyX4w.js → elk-276RUBZZ-NJEpfRWi.js} +1 -1
- package/dist/assets/{erDiagram-OPXOYQCR-CnCmL1Ve.js → erDiagram-OPXOYQCR-BExk6CHc.js} +1 -1
- package/dist/assets/{flowDiagram-KWPJA3E3-DME2uLJf.js → flowDiagram-KWPJA3E3-ClExQ_p0.js} +1 -1
- package/dist/assets/{ganttDiagram-FUAMR5RP-CJQNW9ts.js → ganttDiagram-FUAMR5RP-1MeM9sSl.js} +1 -1
- package/dist/assets/{gitGraphDiagram-X574FWY7-D88_Y9tg.js → gitGraphDiagram-X574FWY7-Tw9Dudpa.js} +1 -1
- package/dist/assets/{index-U9LN4GhF.js → index-KYHldywn.js} +3 -3
- package/dist/assets/{index-ChmZZe7i.js → index-qsorLr2x.js} +1 -1
- package/dist/assets/{infoDiagram-VRGFBTTK-CxWEf3NI.js → infoDiagram-VRGFBTTK-ChU2tjvl.js} +1 -1
- package/dist/assets/{ishikawaDiagram-OU5B5YK6-B_YoNVjF.js → ishikawaDiagram-OU5B5YK6-BeTbrX2Q.js} +1 -1
- package/dist/assets/{journeyDiagram-ZHPQQLJL-ZYuBE2Bm.js → journeyDiagram-ZHPQQLJL-B7ijaWBD.js} +1 -1
- package/dist/assets/{kanban-definition-PNTS6WVX-jmY_M4Qf.js → kanban-definition-PNTS6WVX-JBmK2F1r.js} +1 -1
- package/dist/assets/{linear-kKUF6ayN.js → linear-B7FXe3Ue.js} +1 -1
- package/dist/assets/{mermaid.core-DC5051S_.js → mermaid.core-BPlfZpqv.js} +5 -5
- package/dist/assets/{mindmap-definition-NLK3R4M7-C5knfygJ.js → mindmap-definition-NLK3R4M7-CmT3S5QR.js} +1 -1
- package/dist/assets/{pegDiagram-GJSIUBJH-Ex6iedL2.js → pegDiagram-GJSIUBJH-CFFHIcdQ.js} +1 -1
- package/dist/assets/{pieDiagram-5QR66LMP-Dv38Ox0D.js → pieDiagram-5QR66LMP-yTiPmXRV.js} +1 -1
- package/dist/assets/{quadrantDiagram-O4NWA36T-CwOEor8N.js → quadrantDiagram-O4NWA36T-Cw8u7esm.js} +1 -1
- package/dist/assets/{railroadDiagram-XR7U4H2S-DVgqz5MR.js → railroadDiagram-XR7U4H2S-BfKggsOW.js} +1 -1
- package/dist/assets/{requirementDiagram-PLB6GJNP-BxiuYo52.js → requirementDiagram-PLB6GJNP-Cf3n79jF.js} +1 -1
- package/dist/assets/{sankeyDiagram-IPEJSGJF--vq_1flP.js → sankeyDiagram-IPEJSGJF-B2NkSZig.js} +1 -1
- package/dist/assets/{sequenceDiagram-PO4LG4MO-9hLpfPA6.js → sequenceDiagram-PO4LG4MO-BfFYiYK3.js} +1 -1
- package/dist/assets/{sizeCapture-INFHLROL-BeGMkj9s.js → sizeCapture-INFHLROL-CZ_2nC3f.js} +1 -1
- package/dist/assets/{stateDiagram-v2-GCMORJYK-BnNOMugb.js → stateDiagram-v2-GCMORJYK-B9jwzMXf.js} +1 -1
- package/dist/assets/{swimlanes-2SLR337P-C1YG6Jq-.js → swimlanes-2SLR337P-Bxhafu77.js} +1 -1
- package/dist/assets/swimlanesDiagram-TC7HE7FX-DWNGCaH3.js +8 -0
- package/dist/assets/{timeline-definition-EJHVYXUP-Co7OtwGA.js → timeline-definition-EJHVYXUP-Dle5SJls.js} +1 -1
- package/dist/assets/{usecaseDiagram-POWQR4AR-BYHFARv3.js → usecaseDiagram-POWQR4AR-CgRTu9EO.js} +1 -1
- package/dist/assets/{vennDiagram-UO4OBE2U-C-sdhL3h.js → vennDiagram-UO4OBE2U-D7m_1z6B.js} +1 -1
- package/dist/assets/{wardleyDiagram-VNRHLVJA-wf8ZNrmQ.js → wardleyDiagram-VNRHLVJA-7-TzmX4L.js} +1 -1
- package/dist/assets/{xychartDiagram-PMCCYNJV-BjRlkVGv.js → xychartDiagram-PMCCYNJV-BVXXdviS.js} +1 -1
- package/dist/index.html +1 -1
- package/dist-server/index.js +645 -327
- package/dist-server/openmausbot.js +2 -2
- package/dist-server/pair-cli.js +2 -2
- package/dist-server/server/dictation.js +8 -0
- package/dist-server/server/drivers/claude.js +4 -4
- package/dist-server/server/oauth-account-core.js +153 -0
- package/dist-server/server/oauth-account-tools.js +7 -348
- package/dist-server/server/oauth-calendar-tools.js +551 -0
- package/dist-server/shared/oauth-providers.js +2 -1
- package/package.json +1 -1
- package/dist/assets/channel-sBYHnjxz.js +0 -1
- package/dist/assets/swimlanesDiagram-TC7HE7FX-9DghUs7S.js +0 -8
|
@@ -30179,8 +30179,8 @@ var init_claude = __esm({
|
|
|
30179
30179
|
DEFAULT_AUTOCOMPACT_TOKENS = 2e5;
|
|
30180
30180
|
CLAUDE_FLAG_FLOORS = {
|
|
30181
30181
|
"--strict-mcp-config": [1, 0, 60],
|
|
30182
|
-
"--setting-sources": [1, 0,
|
|
30183
|
-
"--autocompact": [2, 1,
|
|
30182
|
+
"--setting-sources": [1, 0, 125],
|
|
30183
|
+
"--autocompact": [2, 1, 221],
|
|
30184
30184
|
// 2.1.267 is the first CLI that accepts it; below that the recorded prompt
|
|
30185
30185
|
// simply is not refreshed, which is the pre-existing behaviour.
|
|
30186
30186
|
"--system-prompt-snapshot": [2, 1, 267],
|
package/dist-server/pair-cli.js
CHANGED
|
@@ -30179,8 +30179,8 @@ var init_claude = __esm({
|
|
|
30179
30179
|
DEFAULT_AUTOCOMPACT_TOKENS = 2e5;
|
|
30180
30180
|
CLAUDE_FLAG_FLOORS = {
|
|
30181
30181
|
"--strict-mcp-config": [1, 0, 60],
|
|
30182
|
-
"--setting-sources": [1, 0,
|
|
30183
|
-
"--autocompact": [2, 1,
|
|
30182
|
+
"--setting-sources": [1, 0, 125],
|
|
30183
|
+
"--autocompact": [2, 1, 221],
|
|
30184
30184
|
// 2.1.267 is the first CLI that accepts it; below that the recorded prompt
|
|
30185
30185
|
// simply is not refreshed, which is the pre-existing behaviour.
|
|
30186
30186
|
"--system-prompt-snapshot": [2, 1, 267],
|
|
@@ -84,6 +84,14 @@ export function checkCleanup(input, output) {
|
|
|
84
84
|
if (tokens.filter((t) => kept.has(t)).length / tokens.length < 0.6)
|
|
85
85
|
return { ok: false, reason: "overlap" };
|
|
86
86
|
}
|
|
87
|
+
// a correction swaps a misheard word for the right one; words with nothing
|
|
88
|
+
// taken out for them were never said
|
|
89
|
+
const spoken = new Set(contentTokens(input));
|
|
90
|
+
const written = new Set(contentTokens(cleaned));
|
|
91
|
+
const added = [...written].filter((t) => !spoken.has(t)).length;
|
|
92
|
+
const removed = [...spoken].filter((t) => !written.has(t)).length;
|
|
93
|
+
if (added > removed + 1)
|
|
94
|
+
return { ok: false, reason: "added" };
|
|
87
95
|
return { ok: true, text: cleaned };
|
|
88
96
|
}
|
|
89
97
|
export async function ask(provider, prompt, timeoutMs) {
|
|
@@ -259,12 +259,12 @@ const DEFAULT_AUTOCOMPACT_TOKENS = 200_000;
|
|
|
259
259
|
*
|
|
260
260
|
* Verified against the published binaries, not the changelog (which never
|
|
261
261
|
* records `--autocompact`): `--strict-mcp-config` is present in 1.0.60 and
|
|
262
|
-
* absent from 1.0.0; `--setting-sources` first appears in 1.0.
|
|
263
|
-
* lacks it); `--autocompact` first appears in 2.1.
|
|
262
|
+
* absent from 1.0.0; `--setting-sources` first appears in 1.0.125 (1.0.124
|
|
263
|
+
* lacks it); `--autocompact` first appears in 2.1.221 (2.1.220 lacks it). */
|
|
264
264
|
export const CLAUDE_FLAG_FLOORS = {
|
|
265
265
|
"--strict-mcp-config": [1, 0, 60],
|
|
266
|
-
"--setting-sources": [1, 0,
|
|
267
|
-
"--autocompact": [2, 1,
|
|
266
|
+
"--setting-sources": [1, 0, 125],
|
|
267
|
+
"--autocompact": [2, 1, 221],
|
|
268
268
|
// 2.1.267 is the first CLI that accepts it; below that the recorded prompt
|
|
269
269
|
// simply is not refreshed, which is the pre-existing behaviour.
|
|
270
270
|
"--system-prompt-snapshot": [2, 1, 267],
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
// What every account tool shares: the account and call types, argument
|
|
2
|
+
// basics, and one authenticated request to Google or Microsoft Graph.
|
|
3
|
+
import { z } from "zod";
|
|
4
|
+
import { OAUTH_PROVIDERS } from "../shared/oauth-providers.js";
|
|
5
|
+
const HTTP_TIMEOUT_MS = 30_000;
|
|
6
|
+
const MAX_RESULT_CHARS = 48_000;
|
|
7
|
+
const MAX_JSON_BYTES = 4 * 1024 * 1024;
|
|
8
|
+
export const MAX_DOWNLOAD_BYTES = 8 * 1024 * 1024;
|
|
9
|
+
export const READS = { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true };
|
|
10
|
+
export const CREATES = { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true };
|
|
11
|
+
/** Sends mail or invitations to other people: cannot be taken back. */
|
|
12
|
+
export const SENDS = { readOnlyHint: false, destructiveHint: true, idempotentHint: false, openWorldHint: true };
|
|
13
|
+
export const accountArg = { type: "string", description: "Email address of the account to use. Optional only when this bot has exactly one account of this provider." };
|
|
14
|
+
export const EMAIL = /^[^\s@<>,;"]+@[^\s@<>,;"]+\.[^\s@<>,;"]+$/;
|
|
15
|
+
export const noNewlines = (value) => !/[\r\n]/.test(value);
|
|
16
|
+
export const base = z.object({ account: z.string().max(320).optional() });
|
|
17
|
+
export class ToolInputError extends Error {
|
|
18
|
+
}
|
|
19
|
+
export function bounded(text, limit = MAX_RESULT_CHARS) {
|
|
20
|
+
return text.length <= limit ? text : `${text.slice(0, limit)}\n[truncated: ask for less]`;
|
|
21
|
+
}
|
|
22
|
+
export function addresses(value, field) {
|
|
23
|
+
if (value === undefined)
|
|
24
|
+
return [];
|
|
25
|
+
const list = (Array.isArray(value) ? value : value.split(",")).map((item) => item.trim()).filter(Boolean);
|
|
26
|
+
if (list.length > 50)
|
|
27
|
+
throw new ToolInputError(`${field}: at most 50 addresses`);
|
|
28
|
+
for (const item of list) {
|
|
29
|
+
if (!EMAIL.test(item))
|
|
30
|
+
throw new ToolInputError(`${field}: "${item.slice(0, 80)}" is not an email address`);
|
|
31
|
+
}
|
|
32
|
+
return list;
|
|
33
|
+
}
|
|
34
|
+
export class ProviderApiError extends Error {
|
|
35
|
+
status;
|
|
36
|
+
constructor(status, message) {
|
|
37
|
+
super(message);
|
|
38
|
+
this.status = status;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
export async function readLimited(response, limit) {
|
|
42
|
+
const declared = Number(response.headers.get("content-length") ?? "0");
|
|
43
|
+
if (declared > limit) {
|
|
44
|
+
await response.body?.cancel().catch(() => { });
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
if (!response.body)
|
|
48
|
+
return Buffer.alloc(0);
|
|
49
|
+
const reader = response.body.getReader();
|
|
50
|
+
const chunks = [];
|
|
51
|
+
let size = 0;
|
|
52
|
+
for (;;) {
|
|
53
|
+
const { done, value } = await reader.read();
|
|
54
|
+
if (done)
|
|
55
|
+
break;
|
|
56
|
+
size += value.byteLength;
|
|
57
|
+
if (size > limit) {
|
|
58
|
+
await reader.cancel().catch(() => { });
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
chunks.push(value);
|
|
62
|
+
}
|
|
63
|
+
return Buffer.concat(chunks);
|
|
64
|
+
}
|
|
65
|
+
export function providerErrorMessage(body, status) {
|
|
66
|
+
const error = body?.error;
|
|
67
|
+
const message = typeof error === "string"
|
|
68
|
+
? error
|
|
69
|
+
: error && typeof error === "object" && typeof error.message === "string"
|
|
70
|
+
? error.message
|
|
71
|
+
: "";
|
|
72
|
+
return (message || `request failed with HTTP ${status}`).split(/\r?\n/)[0].slice(0, 300);
|
|
73
|
+
}
|
|
74
|
+
export async function call(ctx, account, url, init) {
|
|
75
|
+
const fetcher = ctx.fetch ?? fetch;
|
|
76
|
+
const { expect, ...request } = init;
|
|
77
|
+
for (let attempt = 0; attempt < 2; attempt += 1) {
|
|
78
|
+
const token = await ctx.accessToken(account.id);
|
|
79
|
+
const headers = new Headers(request.headers);
|
|
80
|
+
headers.set("authorization", `Bearer ${token}`);
|
|
81
|
+
if (!headers.has("accept") && expect === "json")
|
|
82
|
+
headers.set("accept", "application/json");
|
|
83
|
+
const response = await fetcher(url, { ...request, headers, signal: AbortSignal.timeout(HTTP_TIMEOUT_MS) });
|
|
84
|
+
if (response.status === 401 && attempt === 0) {
|
|
85
|
+
await response.body?.cancel().catch(() => { });
|
|
86
|
+
ctx.invalidate(account.id);
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
89
|
+
if (!response.ok) {
|
|
90
|
+
const raw = await readLimited(response, 64 * 1024);
|
|
91
|
+
let body = null;
|
|
92
|
+
try {
|
|
93
|
+
body = raw ? JSON.parse(raw.toString("utf8")) : null;
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
body = null;
|
|
97
|
+
}
|
|
98
|
+
const message = providerErrorMessage(body, response.status);
|
|
99
|
+
if (response.status === 403)
|
|
100
|
+
throw new ProviderApiError(403, `${account.email} does not allow this: ${message}`);
|
|
101
|
+
if (response.status === 404)
|
|
102
|
+
throw new ProviderApiError(404, `Not found in ${account.email}: ${message}`);
|
|
103
|
+
throw new ProviderApiError(response.status, `${OAUTH_PROVIDERS[account.provider].label} refused the request for ${account.email}: ${message}`);
|
|
104
|
+
}
|
|
105
|
+
if (expect === "none") {
|
|
106
|
+
await response.body?.cancel().catch(() => { });
|
|
107
|
+
return undefined;
|
|
108
|
+
}
|
|
109
|
+
const bytes = await readLimited(response, expect === "json" ? MAX_JSON_BYTES : MAX_DOWNLOAD_BYTES);
|
|
110
|
+
if (expect === "bytes")
|
|
111
|
+
return bytes;
|
|
112
|
+
if (!bytes)
|
|
113
|
+
throw new ProviderApiError(502, "The response was too large");
|
|
114
|
+
try {
|
|
115
|
+
return JSON.parse(bytes.toString("utf8"));
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
throw new ProviderApiError(502, "The service returned an unreadable response");
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
throw new ProviderApiError(401, `${account.email} needs to sign in again: open Settings → Accounts and connect it again.`);
|
|
122
|
+
}
|
|
123
|
+
export function parse(schema, value, what) {
|
|
124
|
+
const parsed = schema.safeParse(value);
|
|
125
|
+
if (!parsed.success)
|
|
126
|
+
throw new ProviderApiError(502, `Unexpected ${what} response`);
|
|
127
|
+
return parsed.data;
|
|
128
|
+
}
|
|
129
|
+
export function json(value) {
|
|
130
|
+
return JSON.stringify(value, null, 1);
|
|
131
|
+
}
|
|
132
|
+
export function htmlToText(html) {
|
|
133
|
+
return html
|
|
134
|
+
.replace(/<(script|style)[\s\S]*?<\/\1>/gi, "")
|
|
135
|
+
.replace(/<br\s*\/?>/gi, "\n")
|
|
136
|
+
.replace(/<\/(p|div|tr|li|h\d)>/gi, "\n")
|
|
137
|
+
.replace(/<[^>]+>/g, "")
|
|
138
|
+
.replace(/ /g, " ")
|
|
139
|
+
.replace(/&/g, "&")
|
|
140
|
+
.replace(/</g, "<")
|
|
141
|
+
.replace(/>/g, ">")
|
|
142
|
+
.replace(/"/g, '"')
|
|
143
|
+
.replace(/'/g, "'")
|
|
144
|
+
.replace(/\n{3,}/g, "\n\n")
|
|
145
|
+
.trim();
|
|
146
|
+
}
|
|
147
|
+
export const GRAPH = "https://graph.microsoft.com/v1.0";
|
|
148
|
+
export const graphRecipient = z.object({ emailAddress: z.object({ address: z.string().optional(), name: z.string().optional() }).optional() });
|
|
149
|
+
export function recipient(value) {
|
|
150
|
+
const address = value?.emailAddress?.address;
|
|
151
|
+
const name = value?.emailAddress?.name;
|
|
152
|
+
return address ? (name && name !== address ? `${name} <${address}>` : address) : undefined;
|
|
153
|
+
}
|