@2kw/ai 7.3.0-dev.5 → 7.3.0-dev.8
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/bridge/hub.d.ts +11 -0
- package/dist/bridge/hub.js +44 -0
- package/dist/bridge/inventory.d.ts +27 -0
- package/dist/bridge/inventory.js +41 -0
- package/dist/bridge/pairing.d.ts +41 -0
- package/dist/bridge/pairing.js +158 -0
- package/dist/bridge/paths.d.ts +7 -0
- package/dist/bridge/paths.js +16 -0
- package/dist/bridge/run.d.ts +12 -0
- package/dist/bridge/run.js +134 -0
- package/dist/bridge/shell.d.ts +17 -0
- package/dist/bridge/shell.js +48 -0
- package/dist/bridge/store.d.ts +33 -0
- package/dist/bridge/store.js +110 -0
- package/dist/bridge/toml.d.ts +16 -0
- package/dist/bridge/toml.js +39 -0
- package/dist/commands/bridge.d.ts +7 -0
- package/dist/commands/bridge.js +228 -0
- package/dist/commands/extractions.js +24 -5
- package/dist/index.js +2 -0
- package/dist/relay-protocol/b64.d.ts +13 -0
- package/dist/relay-protocol/b64.js +34 -0
- package/dist/relay-protocol/canonical-json.d.ts +22 -0
- package/dist/relay-protocol/canonical-json.js +101 -0
- package/dist/relay-protocol/frames.d.ts +75 -0
- package/dist/relay-protocol/frames.js +224 -0
- package/dist/relay-protocol/headers.d.ts +18 -0
- package/dist/relay-protocol/headers.js +88 -0
- package/dist/relay-protocol/jws.d.ts +28 -0
- package/dist/relay-protocol/jws.js +113 -0
- package/dist/relay-protocol/keys.d.ts +26 -0
- package/dist/relay-protocol/keys.js +80 -0
- package/dist/relay-protocol/pairing.d.ts +26 -0
- package/dist/relay-protocol/pairing.js +49 -0
- package/dist/relay-protocol/wire.d.ts +101 -0
- package/dist/relay-protocol/wire.js +63 -0
- package/dist/relay-protocol/wordlist.d.ts +30 -0
- package/dist/relay-protocol/wordlist.js +289 -0
- package/package.json +4 -1
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local bridge pairing (#1377, plan P3, P4, P6, P10): the redeem proof, the pairing poll token,
|
|
3
|
+
* the six-word fingerprint and the device configHash. The cli copies this file into
|
|
4
|
+
* `cli/src/relay-protocol/`, so it imports `node:crypto` and siblings only and runs on Node 18.
|
|
5
|
+
* test/vectors/pairing.json pins every function here for the backend too.
|
|
6
|
+
*/
|
|
7
|
+
import type { KeyObject } from "node:crypto";
|
|
8
|
+
export declare const PAIR_PROOF_PREFIX = "localbridge-pair-v1";
|
|
9
|
+
export declare const PAIRING_TYP = "localbridge-pairing+jwt";
|
|
10
|
+
/** The C8 shape: what the bridge signs to redeem a pairing code. */
|
|
11
|
+
export declare function pairProofInput(code: string, kid: string, publicKey: string, name: string, os: string): string;
|
|
12
|
+
export declare function signPairProof(key: KeyObject, code: string, kid: string, publicKey: string, name: string, os: string): string;
|
|
13
|
+
/** The pairing poll token: `iss` is the pairing id, `aud` is `<issuer>/v1/local-bridge/pairings`. */
|
|
14
|
+
export declare function mintPairingJwt(key: KeyObject, kid: string, pairingId: string, issuer: string, nowSec: number): string;
|
|
15
|
+
/** Six words: the first 66 bits of SHA-256(raw public key), big-endian, as six 11-bit indices. */
|
|
16
|
+
export declare function fingerprintWords(rawPublicKey: Uint8Array): string[];
|
|
17
|
+
export interface DeviceConfig {
|
|
18
|
+
shell: string | null;
|
|
19
|
+
workspaces: readonly {
|
|
20
|
+
name: string;
|
|
21
|
+
path: string;
|
|
22
|
+
}[];
|
|
23
|
+
}
|
|
24
|
+
/** C10 over what a device exposes: `{shell: <path or null>, workspaces sorted by name}`. */
|
|
25
|
+
export declare function deviceConfigHash(config: DeviceConfig): string;
|
|
26
|
+
//# sourceMappingURL=pairing.d.ts.map
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { b64url, randomHex, sha256, sha256b64url } from "./b64.js";
|
|
2
|
+
import { canonicalJson } from "./canonical-json.js";
|
|
3
|
+
import { signJws } from "./jws.js";
|
|
4
|
+
import { signBytes } from "./keys.js";
|
|
5
|
+
import { MAX_JWT_LIFETIME_SECONDS } from "./wire.js";
|
|
6
|
+
import { WORDLIST } from "./wordlist.js";
|
|
7
|
+
export const PAIR_PROOF_PREFIX = "localbridge-pair-v1";
|
|
8
|
+
export const PAIRING_TYP = "localbridge-pairing+jwt";
|
|
9
|
+
/** The C8 shape: what the bridge signs to redeem a pairing code. */
|
|
10
|
+
export function pairProofInput(code, kid, publicKey, name, os) {
|
|
11
|
+
return `${PAIR_PROOF_PREFIX}\n${code}\n${kid}\n${publicKey}\n${name}\n${os}`;
|
|
12
|
+
}
|
|
13
|
+
export function signPairProof(key, code, kid, publicKey, name, os) {
|
|
14
|
+
return b64url(signBytes(key, pairProofInput(code, kid, publicKey, name, os)));
|
|
15
|
+
}
|
|
16
|
+
/** The pairing poll token: `iss` is the pairing id, `aud` is `<issuer>/v1/local-bridge/pairings`. */
|
|
17
|
+
export function mintPairingJwt(key, kid, pairingId, issuer, nowSec) {
|
|
18
|
+
return signJws(PAIRING_TYP, kid, {
|
|
19
|
+
iss: pairingId,
|
|
20
|
+
aud: `${issuer}/v1/local-bridge/pairings`,
|
|
21
|
+
iat: nowSec,
|
|
22
|
+
exp: nowSec + MAX_JWT_LIFETIME_SECONDS,
|
|
23
|
+
jti: randomHex(16),
|
|
24
|
+
}, key);
|
|
25
|
+
}
|
|
26
|
+
/** Six words: the first 66 bits of SHA-256(raw public key), big-endian, as six 11-bit indices. */
|
|
27
|
+
export function fingerprintWords(rawPublicKey) {
|
|
28
|
+
if (rawPublicKey.length !== 32) {
|
|
29
|
+
throw new Error("Ed25519 public key must be 32 bytes");
|
|
30
|
+
}
|
|
31
|
+
const digest = sha256(rawPublicKey);
|
|
32
|
+
const words = [];
|
|
33
|
+
for (let i = 0; i < 6; i += 1) {
|
|
34
|
+
let index = 0;
|
|
35
|
+
for (let bit = i * 11; bit < (i + 1) * 11; bit += 1) {
|
|
36
|
+
index = (index << 1) | ((digest[bit >> 3] >> (7 - (bit & 7))) & 1);
|
|
37
|
+
}
|
|
38
|
+
words.push(WORDLIST[index]);
|
|
39
|
+
}
|
|
40
|
+
return words;
|
|
41
|
+
}
|
|
42
|
+
/** C10 over what a device exposes: `{shell: <path or null>, workspaces sorted by name}`. */
|
|
43
|
+
export function deviceConfigHash(config) {
|
|
44
|
+
const workspaces = config.workspaces
|
|
45
|
+
.map(({ name, path }) => ({ name, path }))
|
|
46
|
+
.sort((a, b) => (a.name < b.name ? -1 : a.name > b.name ? 1 : 0));
|
|
47
|
+
return `sha256:${sha256b64url(canonicalJson({ shell: config.shell, workspaces }))}`;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=pairing.js.map
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/** Wire constants and message shapes shared by relay and hub. Spec §6, plan contract C4–C11. */
|
|
2
|
+
export declare const REQUEST_TYP = "mcprelay-request+jwt";
|
|
3
|
+
export declare const RELAY_TYP = "relay+jwt";
|
|
4
|
+
export declare const PROTOCOL_VERSION = 1;
|
|
5
|
+
export declare const MAX_BODY_BYTES: number;
|
|
6
|
+
export declare const MAX_FRAME_PAYLOAD_BYTES: number;
|
|
7
|
+
/**
|
|
8
|
+
* Frames a single POST to the hub may carry. The hub keeps the signatures of exactly this many
|
|
9
|
+
* recent frames, refuses a frames POST carrying more, and the relay never batches more — so an
|
|
10
|
+
* identical retry of the latest POST is always fully inside that window and is answered
|
|
11
|
+
* idempotently instead of being mistaken for a rewritten frame.
|
|
12
|
+
*/
|
|
13
|
+
export declare const MAX_FRAMES_PER_POST = 64;
|
|
14
|
+
/**
|
|
15
|
+
* Cancel ids one poll may carry, in either direction. The hub puts at most this many tombstones
|
|
16
|
+
* into a poll response, oldest first, and the relay acks at most this many per poll — because an
|
|
17
|
+
* ack rides in the poll's QUERY STRING, and a request line plus headers has to stay inside the
|
|
18
|
+
* 16 KiB Node allows and the 8 KiB nginx and Apache ship with. An id is `rq_` + 32 hex = 35
|
|
19
|
+
* characters plus a comma, so 64 ids are 2 304 bytes: under 3 KiB with the rest of the URL,
|
|
20
|
+
* whatever else a proxy on the hop adds. Anything past the cap simply waits for the next poll.
|
|
21
|
+
*/
|
|
22
|
+
export declare const MAX_CANCELS_PER_POLL = 64;
|
|
23
|
+
export declare const MAX_HEADER_BYTES: number;
|
|
24
|
+
export declare const CLOCK_SKEW_SECONDS = 30;
|
|
25
|
+
export declare const MAX_JWT_LIFETIME_SECONDS = 60;
|
|
26
|
+
export declare const POLL_WAIT_SECONDS = 25;
|
|
27
|
+
export declare const ACCEPTANCE_MS = 10000;
|
|
28
|
+
export declare const OWNER_LEASE_MS = 30000;
|
|
29
|
+
export declare const OFFLINE_MS = 60000;
|
|
30
|
+
export declare const CALL_TOTAL_MS: number;
|
|
31
|
+
export declare const LISTEN_TOTAL_MS: number;
|
|
32
|
+
export declare const MAX_HEAD_DEADLINE_MS: number;
|
|
33
|
+
export declare const CONTROL_RESERVE = 32;
|
|
34
|
+
export type RequestClass = "CALL" | "CONTROL" | "LISTEN";
|
|
35
|
+
export declare const REQUEST_CLASSES: readonly RequestClass[];
|
|
36
|
+
export type HeaderPair = [string, string];
|
|
37
|
+
export interface Envelope {
|
|
38
|
+
id: string;
|
|
39
|
+
server: string;
|
|
40
|
+
method: string;
|
|
41
|
+
url: string;
|
|
42
|
+
headers: HeaderPair[];
|
|
43
|
+
assertion: string;
|
|
44
|
+
/** base64url of the request body; the empty string for no body. */
|
|
45
|
+
body: string;
|
|
46
|
+
}
|
|
47
|
+
export interface PolledRequest {
|
|
48
|
+
requestClass: RequestClass;
|
|
49
|
+
envelope: Envelope;
|
|
50
|
+
}
|
|
51
|
+
export interface PollBody {
|
|
52
|
+
generation: string;
|
|
53
|
+
requests: PolledRequest[];
|
|
54
|
+
cancels: string[];
|
|
55
|
+
jwksRefresh: boolean;
|
|
56
|
+
}
|
|
57
|
+
export interface ForwardRequest {
|
|
58
|
+
relayId: string;
|
|
59
|
+
requestClass: RequestClass;
|
|
60
|
+
/** epoch seconds, equal to the assertion's dl claim */
|
|
61
|
+
headDeadlineAt: number;
|
|
62
|
+
envelope: Envelope;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Spec §6.7. The array is the source and the union is derived from it, so the set is enumerable
|
|
66
|
+
* at run time: the golden vectors publish a row per code and a unit test checks that table
|
|
67
|
+
* against this list, which is what stops the documented codes and the implemented ones drifting.
|
|
68
|
+
*/
|
|
69
|
+
export declare const ERROR_CODES: readonly ["connector_not_in_inventory", "relay_not_active", "relay_offline", "relay_unavailable", "relay_unknown", "not_allowlisted", "assertion_invalid", "config_changed", "stdio_capacity", "upstream_unreachable", "upstream_timeout", "upstream_incomplete", "outcome_unknown", "response_invalid", "body_too_large", "session_lost", "relay_in_use", "request_unknown", "protocol_unsupported"];
|
|
70
|
+
export type ErrorCode = (typeof ERROR_CODES)[number];
|
|
71
|
+
export type ForwardLine = {
|
|
72
|
+
kind: "hub";
|
|
73
|
+
code: ErrorCode;
|
|
74
|
+
message: string;
|
|
75
|
+
} | {
|
|
76
|
+
kind: "frame";
|
|
77
|
+
frame: import("./frames.js").Frame;
|
|
78
|
+
};
|
|
79
|
+
export interface RequestAssertionClaims {
|
|
80
|
+
iss: string;
|
|
81
|
+
aud: string;
|
|
82
|
+
org: string;
|
|
83
|
+
rid: string;
|
|
84
|
+
srv: string;
|
|
85
|
+
cnu: string;
|
|
86
|
+
cfg: string;
|
|
87
|
+
cls: RequestClass;
|
|
88
|
+
htm: string;
|
|
89
|
+
htu: string;
|
|
90
|
+
hdh: string;
|
|
91
|
+
bdh: string;
|
|
92
|
+
dl: number;
|
|
93
|
+
sub: string;
|
|
94
|
+
agt?: string;
|
|
95
|
+
run?: string;
|
|
96
|
+
cid?: string;
|
|
97
|
+
iat: number;
|
|
98
|
+
exp: number;
|
|
99
|
+
jti: string;
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=wire.d.ts.map
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
// GENERATED COPY of relay/src/protocol/wire.ts (#1377). Do not edit here: edit the relay's file,
|
|
2
|
+
// then run `npm run sync:relay-protocol` in cli/. `npm run check:relay-protocol` fails on any drift.
|
|
3
|
+
/** Wire constants and message shapes shared by relay and hub. Spec §6, plan contract C4–C11. */
|
|
4
|
+
export const REQUEST_TYP = "mcprelay-request+jwt";
|
|
5
|
+
export const RELAY_TYP = "relay+jwt";
|
|
6
|
+
export const PROTOCOL_VERSION = 1;
|
|
7
|
+
export const MAX_BODY_BYTES = 8 * 1024 * 1024;
|
|
8
|
+
export const MAX_FRAME_PAYLOAD_BYTES = 1024 * 1024;
|
|
9
|
+
/**
|
|
10
|
+
* Frames a single POST to the hub may carry. The hub keeps the signatures of exactly this many
|
|
11
|
+
* recent frames, refuses a frames POST carrying more, and the relay never batches more — so an
|
|
12
|
+
* identical retry of the latest POST is always fully inside that window and is answered
|
|
13
|
+
* idempotently instead of being mistaken for a rewritten frame.
|
|
14
|
+
*/
|
|
15
|
+
export const MAX_FRAMES_PER_POST = 64;
|
|
16
|
+
/**
|
|
17
|
+
* Cancel ids one poll may carry, in either direction. The hub puts at most this many tombstones
|
|
18
|
+
* into a poll response, oldest first, and the relay acks at most this many per poll — because an
|
|
19
|
+
* ack rides in the poll's QUERY STRING, and a request line plus headers has to stay inside the
|
|
20
|
+
* 16 KiB Node allows and the 8 KiB nginx and Apache ship with. An id is `rq_` + 32 hex = 35
|
|
21
|
+
* characters plus a comma, so 64 ids are 2 304 bytes: under 3 KiB with the rest of the URL,
|
|
22
|
+
* whatever else a proxy on the hop adds. Anything past the cap simply waits for the next poll.
|
|
23
|
+
*/
|
|
24
|
+
export const MAX_CANCELS_PER_POLL = 64;
|
|
25
|
+
export const MAX_HEADER_BYTES = 64 * 1024;
|
|
26
|
+
export const CLOCK_SKEW_SECONDS = 30;
|
|
27
|
+
export const MAX_JWT_LIFETIME_SECONDS = 60;
|
|
28
|
+
export const POLL_WAIT_SECONDS = 25;
|
|
29
|
+
export const ACCEPTANCE_MS = 10_000;
|
|
30
|
+
export const OWNER_LEASE_MS = 30_000;
|
|
31
|
+
export const OFFLINE_MS = 60_000;
|
|
32
|
+
export const CALL_TOTAL_MS = 10 * 60_000;
|
|
33
|
+
export const LISTEN_TOTAL_MS = 60 * 60_000;
|
|
34
|
+
export const MAX_HEAD_DEADLINE_MS = 10 * 60_000;
|
|
35
|
+
export const CONTROL_RESERVE = 32;
|
|
36
|
+
export const REQUEST_CLASSES = ["CALL", "CONTROL", "LISTEN"];
|
|
37
|
+
/**
|
|
38
|
+
* Spec §6.7. The array is the source and the union is derived from it, so the set is enumerable
|
|
39
|
+
* at run time: the golden vectors publish a row per code and a unit test checks that table
|
|
40
|
+
* against this list, which is what stops the documented codes and the implemented ones drifting.
|
|
41
|
+
*/
|
|
42
|
+
export const ERROR_CODES = [
|
|
43
|
+
"connector_not_in_inventory",
|
|
44
|
+
"relay_not_active",
|
|
45
|
+
"relay_offline",
|
|
46
|
+
"relay_unavailable",
|
|
47
|
+
"relay_unknown",
|
|
48
|
+
"not_allowlisted",
|
|
49
|
+
"assertion_invalid",
|
|
50
|
+
"config_changed",
|
|
51
|
+
"stdio_capacity",
|
|
52
|
+
"upstream_unreachable",
|
|
53
|
+
"upstream_timeout",
|
|
54
|
+
"upstream_incomplete",
|
|
55
|
+
"outcome_unknown",
|
|
56
|
+
"response_invalid",
|
|
57
|
+
"body_too_large",
|
|
58
|
+
"session_lost",
|
|
59
|
+
"relay_in_use",
|
|
60
|
+
"request_unknown",
|
|
61
|
+
"protocol_unsupported",
|
|
62
|
+
];
|
|
63
|
+
//# sourceMappingURL=wire.js.map
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The BIP-39 English word list, 2048 words: the alphabet of the six-word pairing fingerprint
|
|
3
|
+
* (plan P6). Copied unchanged from
|
|
4
|
+
* https://github.com/bitcoin/bips/blob/master/bip-0039/english.txt, whose SHA-256 (LF line
|
|
5
|
+
* endings, trailing newline) is 2f5eed53a4727b4bf8880d8f3f199efc90e58503646d9ff8eff3a2ed3b24dbda;
|
|
6
|
+
* test/unit/pairing.test.ts checks this copy against it. The backend reads the same file as
|
|
7
|
+
* backend/src/main/resources/localbridge/wordlist-en.txt.
|
|
8
|
+
*
|
|
9
|
+
* BIP 39 is published under the MIT License ("License: MIT" in its header,
|
|
10
|
+
* https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki).
|
|
11
|
+
*
|
|
12
|
+
* Copyright (c) 2013 Marek Palatinus, Pavol Rusnak, Aaron Voisine, Sean Bowe (the BIP 39 authors)
|
|
13
|
+
*
|
|
14
|
+
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
|
|
15
|
+
* and associated documentation files (the "Software"), to deal in the Software without
|
|
16
|
+
* restriction, including without limitation the rights to use, copy, modify, merge, publish,
|
|
17
|
+
* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
|
|
18
|
+
* Software is furnished to do so, subject to the following conditions:
|
|
19
|
+
*
|
|
20
|
+
* The above copyright notice and this permission notice shall be included in all copies or
|
|
21
|
+
* substantial portions of the Software.
|
|
22
|
+
*
|
|
23
|
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
|
|
24
|
+
* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
25
|
+
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
|
26
|
+
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
27
|
+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
28
|
+
*/
|
|
29
|
+
export declare const WORDLIST: readonly string[];
|
|
30
|
+
//# sourceMappingURL=wordlist.d.ts.map
|
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
// GENERATED COPY of relay/src/protocol/wordlist.ts (#1377). Do not edit here: edit the relay's file,
|
|
2
|
+
// then run `npm run sync:relay-protocol` in cli/. `npm run check:relay-protocol` fails on any drift.
|
|
3
|
+
/**
|
|
4
|
+
* The BIP-39 English word list, 2048 words: the alphabet of the six-word pairing fingerprint
|
|
5
|
+
* (plan P6). Copied unchanged from
|
|
6
|
+
* https://github.com/bitcoin/bips/blob/master/bip-0039/english.txt, whose SHA-256 (LF line
|
|
7
|
+
* endings, trailing newline) is 2f5eed53a4727b4bf8880d8f3f199efc90e58503646d9ff8eff3a2ed3b24dbda;
|
|
8
|
+
* test/unit/pairing.test.ts checks this copy against it. The backend reads the same file as
|
|
9
|
+
* backend/src/main/resources/localbridge/wordlist-en.txt.
|
|
10
|
+
*
|
|
11
|
+
* BIP 39 is published under the MIT License ("License: MIT" in its header,
|
|
12
|
+
* https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki).
|
|
13
|
+
*
|
|
14
|
+
* Copyright (c) 2013 Marek Palatinus, Pavol Rusnak, Aaron Voisine, Sean Bowe (the BIP 39 authors)
|
|
15
|
+
*
|
|
16
|
+
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
|
|
17
|
+
* and associated documentation files (the "Software"), to deal in the Software without
|
|
18
|
+
* restriction, including without limitation the rights to use, copy, modify, merge, publish,
|
|
19
|
+
* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
|
|
20
|
+
* Software is furnished to do so, subject to the following conditions:
|
|
21
|
+
*
|
|
22
|
+
* The above copyright notice and this permission notice shall be included in all copies or
|
|
23
|
+
* substantial portions of the Software.
|
|
24
|
+
*
|
|
25
|
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
|
|
26
|
+
* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
27
|
+
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
|
28
|
+
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
29
|
+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
30
|
+
*/
|
|
31
|
+
export const WORDLIST = [
|
|
32
|
+
"abandon", "ability", "able", "about", "above", "absent", "absorb", "abstract",
|
|
33
|
+
"absurd", "abuse", "access", "accident", "account", "accuse", "achieve", "acid",
|
|
34
|
+
"acoustic", "acquire", "across", "act", "action", "actor", "actress", "actual",
|
|
35
|
+
"adapt", "add", "addict", "address", "adjust", "admit", "adult", "advance",
|
|
36
|
+
"advice", "aerobic", "affair", "afford", "afraid", "again", "age", "agent",
|
|
37
|
+
"agree", "ahead", "aim", "air", "airport", "aisle", "alarm", "album",
|
|
38
|
+
"alcohol", "alert", "alien", "all", "alley", "allow", "almost", "alone",
|
|
39
|
+
"alpha", "already", "also", "alter", "always", "amateur", "amazing", "among",
|
|
40
|
+
"amount", "amused", "analyst", "anchor", "ancient", "anger", "angle", "angry",
|
|
41
|
+
"animal", "ankle", "announce", "annual", "another", "answer", "antenna", "antique",
|
|
42
|
+
"anxiety", "any", "apart", "apology", "appear", "apple", "approve", "april",
|
|
43
|
+
"arch", "arctic", "area", "arena", "argue", "arm", "armed", "armor",
|
|
44
|
+
"army", "around", "arrange", "arrest", "arrive", "arrow", "art", "artefact",
|
|
45
|
+
"artist", "artwork", "ask", "aspect", "assault", "asset", "assist", "assume",
|
|
46
|
+
"asthma", "athlete", "atom", "attack", "attend", "attitude", "attract", "auction",
|
|
47
|
+
"audit", "august", "aunt", "author", "auto", "autumn", "average", "avocado",
|
|
48
|
+
"avoid", "awake", "aware", "away", "awesome", "awful", "awkward", "axis",
|
|
49
|
+
"baby", "bachelor", "bacon", "badge", "bag", "balance", "balcony", "ball",
|
|
50
|
+
"bamboo", "banana", "banner", "bar", "barely", "bargain", "barrel", "base",
|
|
51
|
+
"basic", "basket", "battle", "beach", "bean", "beauty", "because", "become",
|
|
52
|
+
"beef", "before", "begin", "behave", "behind", "believe", "below", "belt",
|
|
53
|
+
"bench", "benefit", "best", "betray", "better", "between", "beyond", "bicycle",
|
|
54
|
+
"bid", "bike", "bind", "biology", "bird", "birth", "bitter", "black",
|
|
55
|
+
"blade", "blame", "blanket", "blast", "bleak", "bless", "blind", "blood",
|
|
56
|
+
"blossom", "blouse", "blue", "blur", "blush", "board", "boat", "body",
|
|
57
|
+
"boil", "bomb", "bone", "bonus", "book", "boost", "border", "boring",
|
|
58
|
+
"borrow", "boss", "bottom", "bounce", "box", "boy", "bracket", "brain",
|
|
59
|
+
"brand", "brass", "brave", "bread", "breeze", "brick", "bridge", "brief",
|
|
60
|
+
"bright", "bring", "brisk", "broccoli", "broken", "bronze", "broom", "brother",
|
|
61
|
+
"brown", "brush", "bubble", "buddy", "budget", "buffalo", "build", "bulb",
|
|
62
|
+
"bulk", "bullet", "bundle", "bunker", "burden", "burger", "burst", "bus",
|
|
63
|
+
"business", "busy", "butter", "buyer", "buzz", "cabbage", "cabin", "cable",
|
|
64
|
+
"cactus", "cage", "cake", "call", "calm", "camera", "camp", "can",
|
|
65
|
+
"canal", "cancel", "candy", "cannon", "canoe", "canvas", "canyon", "capable",
|
|
66
|
+
"capital", "captain", "car", "carbon", "card", "cargo", "carpet", "carry",
|
|
67
|
+
"cart", "case", "cash", "casino", "castle", "casual", "cat", "catalog",
|
|
68
|
+
"catch", "category", "cattle", "caught", "cause", "caution", "cave", "ceiling",
|
|
69
|
+
"celery", "cement", "census", "century", "cereal", "certain", "chair", "chalk",
|
|
70
|
+
"champion", "change", "chaos", "chapter", "charge", "chase", "chat", "cheap",
|
|
71
|
+
"check", "cheese", "chef", "cherry", "chest", "chicken", "chief", "child",
|
|
72
|
+
"chimney", "choice", "choose", "chronic", "chuckle", "chunk", "churn", "cigar",
|
|
73
|
+
"cinnamon", "circle", "citizen", "city", "civil", "claim", "clap", "clarify",
|
|
74
|
+
"claw", "clay", "clean", "clerk", "clever", "click", "client", "cliff",
|
|
75
|
+
"climb", "clinic", "clip", "clock", "clog", "close", "cloth", "cloud",
|
|
76
|
+
"clown", "club", "clump", "cluster", "clutch", "coach", "coast", "coconut",
|
|
77
|
+
"code", "coffee", "coil", "coin", "collect", "color", "column", "combine",
|
|
78
|
+
"come", "comfort", "comic", "common", "company", "concert", "conduct", "confirm",
|
|
79
|
+
"congress", "connect", "consider", "control", "convince", "cook", "cool", "copper",
|
|
80
|
+
"copy", "coral", "core", "corn", "correct", "cost", "cotton", "couch",
|
|
81
|
+
"country", "couple", "course", "cousin", "cover", "coyote", "crack", "cradle",
|
|
82
|
+
"craft", "cram", "crane", "crash", "crater", "crawl", "crazy", "cream",
|
|
83
|
+
"credit", "creek", "crew", "cricket", "crime", "crisp", "critic", "crop",
|
|
84
|
+
"cross", "crouch", "crowd", "crucial", "cruel", "cruise", "crumble", "crunch",
|
|
85
|
+
"crush", "cry", "crystal", "cube", "culture", "cup", "cupboard", "curious",
|
|
86
|
+
"current", "curtain", "curve", "cushion", "custom", "cute", "cycle", "dad",
|
|
87
|
+
"damage", "damp", "dance", "danger", "daring", "dash", "daughter", "dawn",
|
|
88
|
+
"day", "deal", "debate", "debris", "decade", "december", "decide", "decline",
|
|
89
|
+
"decorate", "decrease", "deer", "defense", "define", "defy", "degree", "delay",
|
|
90
|
+
"deliver", "demand", "demise", "denial", "dentist", "deny", "depart", "depend",
|
|
91
|
+
"deposit", "depth", "deputy", "derive", "describe", "desert", "design", "desk",
|
|
92
|
+
"despair", "destroy", "detail", "detect", "develop", "device", "devote", "diagram",
|
|
93
|
+
"dial", "diamond", "diary", "dice", "diesel", "diet", "differ", "digital",
|
|
94
|
+
"dignity", "dilemma", "dinner", "dinosaur", "direct", "dirt", "disagree", "discover",
|
|
95
|
+
"disease", "dish", "dismiss", "disorder", "display", "distance", "divert", "divide",
|
|
96
|
+
"divorce", "dizzy", "doctor", "document", "dog", "doll", "dolphin", "domain",
|
|
97
|
+
"donate", "donkey", "donor", "door", "dose", "double", "dove", "draft",
|
|
98
|
+
"dragon", "drama", "drastic", "draw", "dream", "dress", "drift", "drill",
|
|
99
|
+
"drink", "drip", "drive", "drop", "drum", "dry", "duck", "dumb",
|
|
100
|
+
"dune", "during", "dust", "dutch", "duty", "dwarf", "dynamic", "eager",
|
|
101
|
+
"eagle", "early", "earn", "earth", "easily", "east", "easy", "echo",
|
|
102
|
+
"ecology", "economy", "edge", "edit", "educate", "effort", "egg", "eight",
|
|
103
|
+
"either", "elbow", "elder", "electric", "elegant", "element", "elephant", "elevator",
|
|
104
|
+
"elite", "else", "embark", "embody", "embrace", "emerge", "emotion", "employ",
|
|
105
|
+
"empower", "empty", "enable", "enact", "end", "endless", "endorse", "enemy",
|
|
106
|
+
"energy", "enforce", "engage", "engine", "enhance", "enjoy", "enlist", "enough",
|
|
107
|
+
"enrich", "enroll", "ensure", "enter", "entire", "entry", "envelope", "episode",
|
|
108
|
+
"equal", "equip", "era", "erase", "erode", "erosion", "error", "erupt",
|
|
109
|
+
"escape", "essay", "essence", "estate", "eternal", "ethics", "evidence", "evil",
|
|
110
|
+
"evoke", "evolve", "exact", "example", "excess", "exchange", "excite", "exclude",
|
|
111
|
+
"excuse", "execute", "exercise", "exhaust", "exhibit", "exile", "exist", "exit",
|
|
112
|
+
"exotic", "expand", "expect", "expire", "explain", "expose", "express", "extend",
|
|
113
|
+
"extra", "eye", "eyebrow", "fabric", "face", "faculty", "fade", "faint",
|
|
114
|
+
"faith", "fall", "false", "fame", "family", "famous", "fan", "fancy",
|
|
115
|
+
"fantasy", "farm", "fashion", "fat", "fatal", "father", "fatigue", "fault",
|
|
116
|
+
"favorite", "feature", "february", "federal", "fee", "feed", "feel", "female",
|
|
117
|
+
"fence", "festival", "fetch", "fever", "few", "fiber", "fiction", "field",
|
|
118
|
+
"figure", "file", "film", "filter", "final", "find", "fine", "finger",
|
|
119
|
+
"finish", "fire", "firm", "first", "fiscal", "fish", "fit", "fitness",
|
|
120
|
+
"fix", "flag", "flame", "flash", "flat", "flavor", "flee", "flight",
|
|
121
|
+
"flip", "float", "flock", "floor", "flower", "fluid", "flush", "fly",
|
|
122
|
+
"foam", "focus", "fog", "foil", "fold", "follow", "food", "foot",
|
|
123
|
+
"force", "forest", "forget", "fork", "fortune", "forum", "forward", "fossil",
|
|
124
|
+
"foster", "found", "fox", "fragile", "frame", "frequent", "fresh", "friend",
|
|
125
|
+
"fringe", "frog", "front", "frost", "frown", "frozen", "fruit", "fuel",
|
|
126
|
+
"fun", "funny", "furnace", "fury", "future", "gadget", "gain", "galaxy",
|
|
127
|
+
"gallery", "game", "gap", "garage", "garbage", "garden", "garlic", "garment",
|
|
128
|
+
"gas", "gasp", "gate", "gather", "gauge", "gaze", "general", "genius",
|
|
129
|
+
"genre", "gentle", "genuine", "gesture", "ghost", "giant", "gift", "giggle",
|
|
130
|
+
"ginger", "giraffe", "girl", "give", "glad", "glance", "glare", "glass",
|
|
131
|
+
"glide", "glimpse", "globe", "gloom", "glory", "glove", "glow", "glue",
|
|
132
|
+
"goat", "goddess", "gold", "good", "goose", "gorilla", "gospel", "gossip",
|
|
133
|
+
"govern", "gown", "grab", "grace", "grain", "grant", "grape", "grass",
|
|
134
|
+
"gravity", "great", "green", "grid", "grief", "grit", "grocery", "group",
|
|
135
|
+
"grow", "grunt", "guard", "guess", "guide", "guilt", "guitar", "gun",
|
|
136
|
+
"gym", "habit", "hair", "half", "hammer", "hamster", "hand", "happy",
|
|
137
|
+
"harbor", "hard", "harsh", "harvest", "hat", "have", "hawk", "hazard",
|
|
138
|
+
"head", "health", "heart", "heavy", "hedgehog", "height", "hello", "helmet",
|
|
139
|
+
"help", "hen", "hero", "hidden", "high", "hill", "hint", "hip",
|
|
140
|
+
"hire", "history", "hobby", "hockey", "hold", "hole", "holiday", "hollow",
|
|
141
|
+
"home", "honey", "hood", "hope", "horn", "horror", "horse", "hospital",
|
|
142
|
+
"host", "hotel", "hour", "hover", "hub", "huge", "human", "humble",
|
|
143
|
+
"humor", "hundred", "hungry", "hunt", "hurdle", "hurry", "hurt", "husband",
|
|
144
|
+
"hybrid", "ice", "icon", "idea", "identify", "idle", "ignore", "ill",
|
|
145
|
+
"illegal", "illness", "image", "imitate", "immense", "immune", "impact", "impose",
|
|
146
|
+
"improve", "impulse", "inch", "include", "income", "increase", "index", "indicate",
|
|
147
|
+
"indoor", "industry", "infant", "inflict", "inform", "inhale", "inherit", "initial",
|
|
148
|
+
"inject", "injury", "inmate", "inner", "innocent", "input", "inquiry", "insane",
|
|
149
|
+
"insect", "inside", "inspire", "install", "intact", "interest", "into", "invest",
|
|
150
|
+
"invite", "involve", "iron", "island", "isolate", "issue", "item", "ivory",
|
|
151
|
+
"jacket", "jaguar", "jar", "jazz", "jealous", "jeans", "jelly", "jewel",
|
|
152
|
+
"job", "join", "joke", "journey", "joy", "judge", "juice", "jump",
|
|
153
|
+
"jungle", "junior", "junk", "just", "kangaroo", "keen", "keep", "ketchup",
|
|
154
|
+
"key", "kick", "kid", "kidney", "kind", "kingdom", "kiss", "kit",
|
|
155
|
+
"kitchen", "kite", "kitten", "kiwi", "knee", "knife", "knock", "know",
|
|
156
|
+
"lab", "label", "labor", "ladder", "lady", "lake", "lamp", "language",
|
|
157
|
+
"laptop", "large", "later", "latin", "laugh", "laundry", "lava", "law",
|
|
158
|
+
"lawn", "lawsuit", "layer", "lazy", "leader", "leaf", "learn", "leave",
|
|
159
|
+
"lecture", "left", "leg", "legal", "legend", "leisure", "lemon", "lend",
|
|
160
|
+
"length", "lens", "leopard", "lesson", "letter", "level", "liar", "liberty",
|
|
161
|
+
"library", "license", "life", "lift", "light", "like", "limb", "limit",
|
|
162
|
+
"link", "lion", "liquid", "list", "little", "live", "lizard", "load",
|
|
163
|
+
"loan", "lobster", "local", "lock", "logic", "lonely", "long", "loop",
|
|
164
|
+
"lottery", "loud", "lounge", "love", "loyal", "lucky", "luggage", "lumber",
|
|
165
|
+
"lunar", "lunch", "luxury", "lyrics", "machine", "mad", "magic", "magnet",
|
|
166
|
+
"maid", "mail", "main", "major", "make", "mammal", "man", "manage",
|
|
167
|
+
"mandate", "mango", "mansion", "manual", "maple", "marble", "march", "margin",
|
|
168
|
+
"marine", "market", "marriage", "mask", "mass", "master", "match", "material",
|
|
169
|
+
"math", "matrix", "matter", "maximum", "maze", "meadow", "mean", "measure",
|
|
170
|
+
"meat", "mechanic", "medal", "media", "melody", "melt", "member", "memory",
|
|
171
|
+
"mention", "menu", "mercy", "merge", "merit", "merry", "mesh", "message",
|
|
172
|
+
"metal", "method", "middle", "midnight", "milk", "million", "mimic", "mind",
|
|
173
|
+
"minimum", "minor", "minute", "miracle", "mirror", "misery", "miss", "mistake",
|
|
174
|
+
"mix", "mixed", "mixture", "mobile", "model", "modify", "mom", "moment",
|
|
175
|
+
"monitor", "monkey", "monster", "month", "moon", "moral", "more", "morning",
|
|
176
|
+
"mosquito", "mother", "motion", "motor", "mountain", "mouse", "move", "movie",
|
|
177
|
+
"much", "muffin", "mule", "multiply", "muscle", "museum", "mushroom", "music",
|
|
178
|
+
"must", "mutual", "myself", "mystery", "myth", "naive", "name", "napkin",
|
|
179
|
+
"narrow", "nasty", "nation", "nature", "near", "neck", "need", "negative",
|
|
180
|
+
"neglect", "neither", "nephew", "nerve", "nest", "net", "network", "neutral",
|
|
181
|
+
"never", "news", "next", "nice", "night", "noble", "noise", "nominee",
|
|
182
|
+
"noodle", "normal", "north", "nose", "notable", "note", "nothing", "notice",
|
|
183
|
+
"novel", "now", "nuclear", "number", "nurse", "nut", "oak", "obey",
|
|
184
|
+
"object", "oblige", "obscure", "observe", "obtain", "obvious", "occur", "ocean",
|
|
185
|
+
"october", "odor", "off", "offer", "office", "often", "oil", "okay",
|
|
186
|
+
"old", "olive", "olympic", "omit", "once", "one", "onion", "online",
|
|
187
|
+
"only", "open", "opera", "opinion", "oppose", "option", "orange", "orbit",
|
|
188
|
+
"orchard", "order", "ordinary", "organ", "orient", "original", "orphan", "ostrich",
|
|
189
|
+
"other", "outdoor", "outer", "output", "outside", "oval", "oven", "over",
|
|
190
|
+
"own", "owner", "oxygen", "oyster", "ozone", "pact", "paddle", "page",
|
|
191
|
+
"pair", "palace", "palm", "panda", "panel", "panic", "panther", "paper",
|
|
192
|
+
"parade", "parent", "park", "parrot", "party", "pass", "patch", "path",
|
|
193
|
+
"patient", "patrol", "pattern", "pause", "pave", "payment", "peace", "peanut",
|
|
194
|
+
"pear", "peasant", "pelican", "pen", "penalty", "pencil", "people", "pepper",
|
|
195
|
+
"perfect", "permit", "person", "pet", "phone", "photo", "phrase", "physical",
|
|
196
|
+
"piano", "picnic", "picture", "piece", "pig", "pigeon", "pill", "pilot",
|
|
197
|
+
"pink", "pioneer", "pipe", "pistol", "pitch", "pizza", "place", "planet",
|
|
198
|
+
"plastic", "plate", "play", "please", "pledge", "pluck", "plug", "plunge",
|
|
199
|
+
"poem", "poet", "point", "polar", "pole", "police", "pond", "pony",
|
|
200
|
+
"pool", "popular", "portion", "position", "possible", "post", "potato", "pottery",
|
|
201
|
+
"poverty", "powder", "power", "practice", "praise", "predict", "prefer", "prepare",
|
|
202
|
+
"present", "pretty", "prevent", "price", "pride", "primary", "print", "priority",
|
|
203
|
+
"prison", "private", "prize", "problem", "process", "produce", "profit", "program",
|
|
204
|
+
"project", "promote", "proof", "property", "prosper", "protect", "proud", "provide",
|
|
205
|
+
"public", "pudding", "pull", "pulp", "pulse", "pumpkin", "punch", "pupil",
|
|
206
|
+
"puppy", "purchase", "purity", "purpose", "purse", "push", "put", "puzzle",
|
|
207
|
+
"pyramid", "quality", "quantum", "quarter", "question", "quick", "quit", "quiz",
|
|
208
|
+
"quote", "rabbit", "raccoon", "race", "rack", "radar", "radio", "rail",
|
|
209
|
+
"rain", "raise", "rally", "ramp", "ranch", "random", "range", "rapid",
|
|
210
|
+
"rare", "rate", "rather", "raven", "raw", "razor", "ready", "real",
|
|
211
|
+
"reason", "rebel", "rebuild", "recall", "receive", "recipe", "record", "recycle",
|
|
212
|
+
"reduce", "reflect", "reform", "refuse", "region", "regret", "regular", "reject",
|
|
213
|
+
"relax", "release", "relief", "rely", "remain", "remember", "remind", "remove",
|
|
214
|
+
"render", "renew", "rent", "reopen", "repair", "repeat", "replace", "report",
|
|
215
|
+
"require", "rescue", "resemble", "resist", "resource", "response", "result", "retire",
|
|
216
|
+
"retreat", "return", "reunion", "reveal", "review", "reward", "rhythm", "rib",
|
|
217
|
+
"ribbon", "rice", "rich", "ride", "ridge", "rifle", "right", "rigid",
|
|
218
|
+
"ring", "riot", "ripple", "risk", "ritual", "rival", "river", "road",
|
|
219
|
+
"roast", "robot", "robust", "rocket", "romance", "roof", "rookie", "room",
|
|
220
|
+
"rose", "rotate", "rough", "round", "route", "royal", "rubber", "rude",
|
|
221
|
+
"rug", "rule", "run", "runway", "rural", "sad", "saddle", "sadness",
|
|
222
|
+
"safe", "sail", "salad", "salmon", "salon", "salt", "salute", "same",
|
|
223
|
+
"sample", "sand", "satisfy", "satoshi", "sauce", "sausage", "save", "say",
|
|
224
|
+
"scale", "scan", "scare", "scatter", "scene", "scheme", "school", "science",
|
|
225
|
+
"scissors", "scorpion", "scout", "scrap", "screen", "script", "scrub", "sea",
|
|
226
|
+
"search", "season", "seat", "second", "secret", "section", "security", "seed",
|
|
227
|
+
"seek", "segment", "select", "sell", "seminar", "senior", "sense", "sentence",
|
|
228
|
+
"series", "service", "session", "settle", "setup", "seven", "shadow", "shaft",
|
|
229
|
+
"shallow", "share", "shed", "shell", "sheriff", "shield", "shift", "shine",
|
|
230
|
+
"ship", "shiver", "shock", "shoe", "shoot", "shop", "short", "shoulder",
|
|
231
|
+
"shove", "shrimp", "shrug", "shuffle", "shy", "sibling", "sick", "side",
|
|
232
|
+
"siege", "sight", "sign", "silent", "silk", "silly", "silver", "similar",
|
|
233
|
+
"simple", "since", "sing", "siren", "sister", "situate", "six", "size",
|
|
234
|
+
"skate", "sketch", "ski", "skill", "skin", "skirt", "skull", "slab",
|
|
235
|
+
"slam", "sleep", "slender", "slice", "slide", "slight", "slim", "slogan",
|
|
236
|
+
"slot", "slow", "slush", "small", "smart", "smile", "smoke", "smooth",
|
|
237
|
+
"snack", "snake", "snap", "sniff", "snow", "soap", "soccer", "social",
|
|
238
|
+
"sock", "soda", "soft", "solar", "soldier", "solid", "solution", "solve",
|
|
239
|
+
"someone", "song", "soon", "sorry", "sort", "soul", "sound", "soup",
|
|
240
|
+
"source", "south", "space", "spare", "spatial", "spawn", "speak", "special",
|
|
241
|
+
"speed", "spell", "spend", "sphere", "spice", "spider", "spike", "spin",
|
|
242
|
+
"spirit", "split", "spoil", "sponsor", "spoon", "sport", "spot", "spray",
|
|
243
|
+
"spread", "spring", "spy", "square", "squeeze", "squirrel", "stable", "stadium",
|
|
244
|
+
"staff", "stage", "stairs", "stamp", "stand", "start", "state", "stay",
|
|
245
|
+
"steak", "steel", "stem", "step", "stereo", "stick", "still", "sting",
|
|
246
|
+
"stock", "stomach", "stone", "stool", "story", "stove", "strategy", "street",
|
|
247
|
+
"strike", "strong", "struggle", "student", "stuff", "stumble", "style", "subject",
|
|
248
|
+
"submit", "subway", "success", "such", "sudden", "suffer", "sugar", "suggest",
|
|
249
|
+
"suit", "summer", "sun", "sunny", "sunset", "super", "supply", "supreme",
|
|
250
|
+
"sure", "surface", "surge", "surprise", "surround", "survey", "suspect", "sustain",
|
|
251
|
+
"swallow", "swamp", "swap", "swarm", "swear", "sweet", "swift", "swim",
|
|
252
|
+
"swing", "switch", "sword", "symbol", "symptom", "syrup", "system", "table",
|
|
253
|
+
"tackle", "tag", "tail", "talent", "talk", "tank", "tape", "target",
|
|
254
|
+
"task", "taste", "tattoo", "taxi", "teach", "team", "tell", "ten",
|
|
255
|
+
"tenant", "tennis", "tent", "term", "test", "text", "thank", "that",
|
|
256
|
+
"theme", "then", "theory", "there", "they", "thing", "this", "thought",
|
|
257
|
+
"three", "thrive", "throw", "thumb", "thunder", "ticket", "tide", "tiger",
|
|
258
|
+
"tilt", "timber", "time", "tiny", "tip", "tired", "tissue", "title",
|
|
259
|
+
"toast", "tobacco", "today", "toddler", "toe", "together", "toilet", "token",
|
|
260
|
+
"tomato", "tomorrow", "tone", "tongue", "tonight", "tool", "tooth", "top",
|
|
261
|
+
"topic", "topple", "torch", "tornado", "tortoise", "toss", "total", "tourist",
|
|
262
|
+
"toward", "tower", "town", "toy", "track", "trade", "traffic", "tragic",
|
|
263
|
+
"train", "transfer", "trap", "trash", "travel", "tray", "treat", "tree",
|
|
264
|
+
"trend", "trial", "tribe", "trick", "trigger", "trim", "trip", "trophy",
|
|
265
|
+
"trouble", "truck", "true", "truly", "trumpet", "trust", "truth", "try",
|
|
266
|
+
"tube", "tuition", "tumble", "tuna", "tunnel", "turkey", "turn", "turtle",
|
|
267
|
+
"twelve", "twenty", "twice", "twin", "twist", "two", "type", "typical",
|
|
268
|
+
"ugly", "umbrella", "unable", "unaware", "uncle", "uncover", "under", "undo",
|
|
269
|
+
"unfair", "unfold", "unhappy", "uniform", "unique", "unit", "universe", "unknown",
|
|
270
|
+
"unlock", "until", "unusual", "unveil", "update", "upgrade", "uphold", "upon",
|
|
271
|
+
"upper", "upset", "urban", "urge", "usage", "use", "used", "useful",
|
|
272
|
+
"useless", "usual", "utility", "vacant", "vacuum", "vague", "valid", "valley",
|
|
273
|
+
"valve", "van", "vanish", "vapor", "various", "vast", "vault", "vehicle",
|
|
274
|
+
"velvet", "vendor", "venture", "venue", "verb", "verify", "version", "very",
|
|
275
|
+
"vessel", "veteran", "viable", "vibrant", "vicious", "victory", "video", "view",
|
|
276
|
+
"village", "vintage", "violin", "virtual", "virus", "visa", "visit", "visual",
|
|
277
|
+
"vital", "vivid", "vocal", "voice", "void", "volcano", "volume", "vote",
|
|
278
|
+
"voyage", "wage", "wagon", "wait", "walk", "wall", "walnut", "want",
|
|
279
|
+
"warfare", "warm", "warrior", "wash", "wasp", "waste", "water", "wave",
|
|
280
|
+
"way", "wealth", "weapon", "wear", "weasel", "weather", "web", "wedding",
|
|
281
|
+
"weekend", "weird", "welcome", "west", "wet", "whale", "what", "wheat",
|
|
282
|
+
"wheel", "when", "where", "whip", "whisper", "wide", "width", "wife",
|
|
283
|
+
"wild", "will", "win", "window", "wine", "wing", "wink", "winner",
|
|
284
|
+
"winter", "wire", "wisdom", "wise", "wish", "witness", "wolf", "woman",
|
|
285
|
+
"wonder", "wood", "wool", "word", "work", "world", "worry", "worth",
|
|
286
|
+
"wrap", "wreck", "wrestle", "wrist", "write", "wrong", "yard", "year",
|
|
287
|
+
"yellow", "you", "young", "youth", "zebra", "zero", "zone", "zoo",
|
|
288
|
+
];
|
|
289
|
+
//# sourceMappingURL=wordlist.js.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@2kw/ai",
|
|
3
|
-
"version": "7.3.0-dev.
|
|
3
|
+
"version": "7.3.0-dev.8",
|
|
4
4
|
"description": "CLI for 2kw.ai — schema-driven document extraction, an OpenAI-compatible EU LLM gateway, transcription, prompts, datasets, and experiments from your terminal or agentic workflows. Ships as 2kw, backbone, and bb.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"cli",
|
|
@@ -39,6 +39,8 @@
|
|
|
39
39
|
"fix:generated": "tsx openapi/scripts/check-generated.ts --write",
|
|
40
40
|
"check:coverage": "tsx openapi/scripts/check-coverage.ts",
|
|
41
41
|
"sync:agent-schema": "tsx scripts/sync-agent-schema.ts",
|
|
42
|
+
"sync:relay-protocol": "tsx scripts/sync-relay-protocol.ts",
|
|
43
|
+
"check:relay-protocol": "tsx scripts/sync-relay-protocol.ts --check",
|
|
42
44
|
"typecheck": "tsc --noEmit",
|
|
43
45
|
"test": "vitest",
|
|
44
46
|
"test:run": "vitest run",
|
|
@@ -55,6 +57,7 @@
|
|
|
55
57
|
"open": "^10.2.0",
|
|
56
58
|
"openapi-fetch": "^0.13.5",
|
|
57
59
|
"ora": "^8.2.0",
|
|
60
|
+
"smol-toml": "^1.9.1",
|
|
58
61
|
"yaml": "^2.9.1"
|
|
59
62
|
},
|
|
60
63
|
"devDependencies": {
|