@oh-hai/cli 0.4.4 → 0.4.5
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/auth/token-store.d.ts +17 -0
- package/dist/auth/token-store.js +21 -0
- package/dist/auth/token-store.js.map +1 -1
- package/dist/commands/handlers.js +2 -0
- package/dist/commands/handlers.js.map +1 -1
- package/dist/commands/login.js +83 -3
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/mail/http.d.ts +47 -0
- package/dist/commands/mail/http.js +106 -0
- package/dist/commands/mail/http.js.map +1 -0
- package/dist/commands/mail/identity.d.ts +15 -0
- package/dist/commands/mail/identity.js +135 -0
- package/dist/commands/mail/identity.js.map +1 -0
- package/dist/commands/mail.d.ts +2 -0
- package/dist/commands/mail.js +232 -0
- package/dist/commands/mail.js.map +1 -0
- package/dist/commands/messaging/http.d.ts +9 -1
- package/dist/commands/messaging/http.js +2 -2
- package/dist/commands/messaging/http.js.map +1 -1
- package/dist/commands/messaging/sessions-http.d.ts +2 -0
- package/dist/commands/messaging/sessions-http.js +1 -1
- package/dist/commands/messaging/sessions-http.js.map +1 -1
- package/dist/commands/registry.js +27 -0
- package/dist/commands/registry.js.map +1 -1
- package/dist/commands/whoami.d.ts +14 -1
- package/dist/commands/whoami.js +36 -5
- package/dist/commands/whoami.js.map +1 -1
- package/dist/help.js +1 -0
- package/dist/help.js.map +1 -1
- package/package.json +1 -1
|
@@ -29,6 +29,23 @@ export declare function parseKey(key: string): {
|
|
|
29
29
|
origin: string;
|
|
30
30
|
agentId: string;
|
|
31
31
|
};
|
|
32
|
+
/** The id prefix marking a stored identity as the account OWNER's human session rather than an
|
|
33
|
+
* agent bearer (issue #874). The store is keyed `(origin, id)` and has never cared what the id
|
|
34
|
+
* MEANS, so a human simply takes an id shape an agent id cannot collide with — no second field,
|
|
35
|
+
* no migration, and `--account`, `oh-hai use` and the env override all keep working unchanged. */
|
|
36
|
+
export declare const HUMAN_ID_PREFIX = "human:";
|
|
37
|
+
/** Whether a stored id is a HUMAN identity.
|
|
38
|
+
*
|
|
39
|
+
* A PREFIX test, deliberately never a substring one: an agent legitimately named
|
|
40
|
+
* `not-human-agent` contains the word and MUST still classify as an agent. Misclassifying it
|
|
41
|
+
* would hand the human-inbox surface an agent bearer — which `GET /v1/messages` answers with that
|
|
42
|
+
* agent's OWN submitted messages rather than an error, i.e. a plausible, well-formed, wrong
|
|
43
|
+
* inbox. The classification is the only thing standing between those two outcomes, so it is a
|
|
44
|
+
* test on the id's SHAPE and nothing else. */
|
|
45
|
+
export declare function isHumanId(id: string): boolean;
|
|
46
|
+
/** The `<userId>` half of a `human:<userId>` id. Returns undefined for an agent id, so a caller
|
|
47
|
+
* cannot accidentally treat an agent id as a user id by slicing blindly. */
|
|
48
|
+
export declare function humanUserId(id: string): string | undefined;
|
|
32
49
|
/** The keys-only index file the keychain backend uses for enumeration — a sibling of the
|
|
33
50
|
* credentials file (`~/.config/oh-hai/keys.json`), honoring the same XDG resolution. */
|
|
34
51
|
export declare function keychainIndexPath(env?: NodeJS.ProcessEnv): string;
|
package/dist/auth/token-store.js
CHANGED
|
@@ -24,6 +24,27 @@ export function parseKey(key) {
|
|
|
24
24
|
const idx = key.indexOf("|");
|
|
25
25
|
return idx < 0 ? { origin: "", agentId: key } : { origin: key.slice(0, idx), agentId: key.slice(idx + 1) };
|
|
26
26
|
}
|
|
27
|
+
/** The id prefix marking a stored identity as the account OWNER's human session rather than an
|
|
28
|
+
* agent bearer (issue #874). The store is keyed `(origin, id)` and has never cared what the id
|
|
29
|
+
* MEANS, so a human simply takes an id shape an agent id cannot collide with — no second field,
|
|
30
|
+
* no migration, and `--account`, `oh-hai use` and the env override all keep working unchanged. */
|
|
31
|
+
export const HUMAN_ID_PREFIX = "human:";
|
|
32
|
+
/** Whether a stored id is a HUMAN identity.
|
|
33
|
+
*
|
|
34
|
+
* A PREFIX test, deliberately never a substring one: an agent legitimately named
|
|
35
|
+
* `not-human-agent` contains the word and MUST still classify as an agent. Misclassifying it
|
|
36
|
+
* would hand the human-inbox surface an agent bearer — which `GET /v1/messages` answers with that
|
|
37
|
+
* agent's OWN submitted messages rather than an error, i.e. a plausible, well-formed, wrong
|
|
38
|
+
* inbox. The classification is the only thing standing between those two outcomes, so it is a
|
|
39
|
+
* test on the id's SHAPE and nothing else. */
|
|
40
|
+
export function isHumanId(id) {
|
|
41
|
+
return id.startsWith(HUMAN_ID_PREFIX);
|
|
42
|
+
}
|
|
43
|
+
/** The `<userId>` half of a `human:<userId>` id. Returns undefined for an agent id, so a caller
|
|
44
|
+
* cannot accidentally treat an agent id as a user id by slicing blindly. */
|
|
45
|
+
export function humanUserId(id) {
|
|
46
|
+
return isHumanId(id) ? id.slice(HUMAN_ID_PREFIX.length) : undefined;
|
|
47
|
+
}
|
|
27
48
|
/** The keys-only index file the keychain backend uses for enumeration — a sibling of the
|
|
28
49
|
* credentials file (`~/.config/oh-hai/keys.json`), honoring the same XDG resolution. */
|
|
29
50
|
export function keychainIndexPath(env = process.env) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token-store.js","sourceRoot":"","sources":["../../src/auth/token-store.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"token-store.js","sourceRoot":"","sources":["../../src/auth/token-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,6 +11,7 @@ import { fleetCommand } from "./fleet.js";
|
|
|
11
11
|
import { inboxCommand } from "./inbox.js";
|
|
12
12
|
import { loginCommand } from "./login.js";
|
|
13
13
|
import { logoutCommand } from "./logout.js";
|
|
14
|
+
import { mailCommand } from "./mail.js";
|
|
14
15
|
import { messagesCommand } from "./messages.js";
|
|
15
16
|
import { notifyCommand } from "./notify.js";
|
|
16
17
|
import { sessionCommand } from "./session.js";
|
|
@@ -34,6 +35,7 @@ export const COMMAND_HANDLERS = {
|
|
|
34
35
|
bridge: bridgeCommand,
|
|
35
36
|
session: sessionCommand,
|
|
36
37
|
fleet: fleetCommand,
|
|
38
|
+
mail: mailCommand,
|
|
37
39
|
messages: messagesCommand,
|
|
38
40
|
doctor: doctorCommand,
|
|
39
41
|
teach: teachCommand,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handlers.js","sourceRoot":"","sources":["../../src/commands/handlers.ts"],"names":[],"mappings":"AAAA,gGAAgG;AAChG,4FAA4F;AAC5F,2FAA2F;AAC3F,uFAAuF;AACvF,2FAA2F;AAE3F,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,CAAC,MAAM,gBAAgB,GAAmC;IAC9D,KAAK,EAAE,YAAY;IACnB,KAAK,EAAE,YAAY;IACnB,MAAM,EAAE,aAAa;IACrB,MAAM,EAAE,aAAa;IACrB,GAAG,EAAE,UAAU;IACf,MAAM,EAAE,aAAa;IACrB,GAAG,EAAE,UAAU;IACf,IAAI,EAAE,WAAW;IACjB,MAAM,EAAE,aAAa;IACrB,KAAK,EAAE,YAAY;IACnB,MAAM,EAAE,aAAa;IACrB,OAAO,EAAE,cAAc;IACvB,KAAK,EAAE,YAAY;IACnB,QAAQ,EAAE,eAAe;IACzB,MAAM,EAAE,aAAa;IACrB,KAAK,EAAE,YAAY;IACnB,OAAO,EAAE,cAAc;CACxB,CAAC"}
|
|
1
|
+
{"version":3,"file":"handlers.js","sourceRoot":"","sources":["../../src/commands/handlers.ts"],"names":[],"mappings":"AAAA,gGAAgG;AAChG,4FAA4F;AAC5F,2FAA2F;AAC3F,uFAAuF;AACvF,2FAA2F;AAE3F,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,CAAC,MAAM,gBAAgB,GAAmC;IAC9D,KAAK,EAAE,YAAY;IACnB,KAAK,EAAE,YAAY;IACnB,MAAM,EAAE,aAAa;IACrB,MAAM,EAAE,aAAa;IACrB,GAAG,EAAE,UAAU;IACf,MAAM,EAAE,aAAa;IACrB,GAAG,EAAE,UAAU;IACf,IAAI,EAAE,WAAW;IACjB,MAAM,EAAE,aAAa;IACrB,KAAK,EAAE,YAAY;IACnB,MAAM,EAAE,aAAa;IACrB,OAAO,EAAE,cAAc;IACvB,KAAK,EAAE,YAAY;IACnB,IAAI,EAAE,WAAW;IACjB,QAAQ,EAAE,eAAe;IACzB,MAAM,EAAE,aAAa;IACrB,KAAK,EAAE,YAAY;IACnB,OAAO,EAAE,cAAc;CACxB,CAAC"}
|
package/dist/commands/login.js
CHANGED
|
@@ -12,6 +12,8 @@ import { sanitizeForTerminal } from "../terminal.js";
|
|
|
12
12
|
import { isHttpUrl } from "../url.js";
|
|
13
13
|
import { flagOn, parseCommandArgs } from "./flags.js";
|
|
14
14
|
import { throwTransportError } from "./http.js";
|
|
15
|
+
import { classifyProbeStatus, probeGet, readActor, readJsonBody } from "./whoami.js";
|
|
16
|
+
import { isHumanId } from "../auth/token-store.js";
|
|
15
17
|
/** Per-request bound for each device-grant POST when no `--timeout`/`MA2H_TIMEOUT_MS` is set. It
|
|
16
18
|
* bounds a SINGLE request, never the whole flow — the human's approval window (minutes) is bounded
|
|
17
19
|
* separately by the poll budget below, so a snappy per-request timeout can't abort a slow human. */
|
|
@@ -32,14 +34,64 @@ const DEFAULT_EXPIRES_IN_SECONDS = 900;
|
|
|
32
34
|
const MIN_EXPIRES_IN_SECONDS = 1;
|
|
33
35
|
const MAX_EXPIRES_IN_SECONDS = 3600;
|
|
34
36
|
export async function loginCommand(ctx) {
|
|
35
|
-
const { values } = parseCommandArgs(ctx.argv, { "token-stdin": { type: "boolean" } });
|
|
36
|
-
if (flagOn(values
|
|
37
|
+
const { values } = parseCommandArgs(ctx.argv, { "token-stdin": { type: "boolean" }, human: { type: "boolean" } });
|
|
38
|
+
if (flagOn(values.human)) {
|
|
39
|
+
await humanLogin(ctx);
|
|
40
|
+
}
|
|
41
|
+
else if (flagOn(values["token-stdin"])) {
|
|
37
42
|
await tokenStdinLogin(ctx);
|
|
38
43
|
}
|
|
39
44
|
else {
|
|
40
45
|
await runDeviceCodeFlow(ctx);
|
|
41
46
|
}
|
|
42
47
|
}
|
|
48
|
+
/**
|
|
49
|
+
* `--human` (§4.3, issue #874): store the ACCOUNT OWNER's session token so `oh-hai mail` can read
|
|
50
|
+
* their own inbox. Stdin only, and the id is taken from the SERVER.
|
|
51
|
+
*
|
|
52
|
+
* WHY STDIN RATHER THAN THE DEVICE-CODE FLOW. That flow mints an AGENT bearer — the human picks an
|
|
53
|
+
* agent to bind at approval time — so there is no human-principal variant of it without a server
|
|
54
|
+
* change, which #874 excludes. The repo already has the right shape for this: `--token-stdin` takes
|
|
55
|
+
* a piped credential and stores it without ever printing it. A proper human device-code flow is the
|
|
56
|
+
* better end state and is filed as follow-up.
|
|
57
|
+
*
|
|
58
|
+
* WHY THE ID COMES FROM `/auth/whoami` AND NEVER FROM `--account`. The stored key decides which
|
|
59
|
+
* commands will accept this credential, so letting the caller name it would let a mistyped or
|
|
60
|
+
* malicious id file an AGENT token under a `human:` key — which is precisely the confusion
|
|
61
|
+
* `mail/identity.ts` exists to prevent, arriving through the front door. The Hub attests the actor;
|
|
62
|
+
* a non-human one is refused and NOTHING is stored.
|
|
63
|
+
*/
|
|
64
|
+
async function humanLogin(ctx) {
|
|
65
|
+
const raw = await ctx.runtime.readStdin();
|
|
66
|
+
const token = raw.trim();
|
|
67
|
+
if (token === "") {
|
|
68
|
+
throw new CliError("usage", 'no token on stdin — pipe your session token, e.g. `printf %s "$TOKEN" | oh-hai login --human`.');
|
|
69
|
+
}
|
|
70
|
+
// Ask the Hub who this credential IS. Every failure arm below stores nothing.
|
|
71
|
+
const res = await probeGet(ctx, "/auth/whoami", token);
|
|
72
|
+
if (res.status !== 200)
|
|
73
|
+
classifyProbeStatus(res.status);
|
|
74
|
+
const actor = readActor(await readJsonBody(res));
|
|
75
|
+
if (actor === undefined) {
|
|
76
|
+
throw new CliError("error", "unexpected Hub response (200 without an identity); could not confirm the token (check --base-url).");
|
|
77
|
+
}
|
|
78
|
+
// A REFLECTED CREDENTIAL MUST NEVER REACH stdout. A buggy or hostile Hub can answer with an actor
|
|
79
|
+
// that EMBEDS the token it was just given (`human:<the-token>`); `readActor` would accept it and
|
|
80
|
+
// `storeAndReport` prints the actor as `agent_id` on both output paths — so the session bearer
|
|
81
|
+
// would land on stdout, breaking the never-print contract at the one moment the token is in hand.
|
|
82
|
+
if (actor.includes(token)) {
|
|
83
|
+
throw new CliError("server", "the Hub echoed the presented credential back inside its identity response; refusing rather than storing or printing it.");
|
|
84
|
+
}
|
|
85
|
+
if (!isHumanId(actor)) {
|
|
86
|
+
// The common mistake: piping an AGENT token here. Refuse rather than storing it under a human
|
|
87
|
+
// key — a stored agent token wearing a `human:` id would defeat the mail gate entirely.
|
|
88
|
+
throw new CliError("usage", `that token authenticates as "${sanitizeForTerminal(actor)}", which is an AGENT, not a human — nothing was stored. ` +
|
|
89
|
+
"Pipe your own session token, or use `oh-hai login` to store an agent bearer.");
|
|
90
|
+
}
|
|
91
|
+
// The actor IS the storage id: the Hub returns `human:<userId>`, which is exactly the shape the
|
|
92
|
+
// store and `mail/identity.ts` key on. Nothing is derived by string surgery here.
|
|
93
|
+
await storeAndReport(ctx, actor, token);
|
|
94
|
+
}
|
|
43
95
|
/** `--token-stdin` (§4.3): read a bearer from stdin (local bootstrap / paste) and store it the same
|
|
44
96
|
* way the device-code path does. Behavior is frozen — #195 only adds the device-code flow. */
|
|
45
97
|
async function tokenStdinLogin(ctx) {
|
|
@@ -47,6 +99,17 @@ async function tokenStdinLogin(ctx) {
|
|
|
47
99
|
if (account === undefined) {
|
|
48
100
|
throw new CliError("usage", "an agent id is required — pass --account/--agent or set MA2H_AGENT_ID.");
|
|
49
101
|
}
|
|
102
|
+
// THE `human:` PREFIX IS RESERVED ON THIS PATH (#874). This arm stores whatever `--account` names
|
|
103
|
+
// WITHOUT attesting the token, which is fine for an agent id — the Hub 403s a mismatched bearer at
|
|
104
|
+
// use time — but not for a human one: `mail`'s gate keys on the stored ID, so
|
|
105
|
+
// `login --token-stdin --account human:<id>` with an agent bearer would file an agent token under
|
|
106
|
+
// a human key, pass that gate, and return the agent's own self-list as if it were the account
|
|
107
|
+
// inbox. Same shape as the env-token hole this branch already closes: the id must IMPLY the
|
|
108
|
+
// credential, and only `--human` establishes that, by taking the id from `/auth/whoami`.
|
|
109
|
+
if (isHumanId(account)) {
|
|
110
|
+
throw new CliError("usage", `"${sanitizeForTerminal(account)}" is a reserved human identity id, and this path does not verify the token behind it. ` +
|
|
111
|
+
"Use `oh-hai login --human` instead — it takes the id from the Hub, so the credential and the id cannot disagree.");
|
|
112
|
+
}
|
|
50
113
|
const raw = await ctx.runtime.readStdin();
|
|
51
114
|
const token = raw.trim();
|
|
52
115
|
if (token === "") {
|
|
@@ -138,6 +201,18 @@ export async function runDeviceCodeFlow(ctx, command = "login") {
|
|
|
138
201
|
// The loop exhausted its budget without a terminal response — treat as a timeout (§7).
|
|
139
202
|
throw new CliError("timeout", "device authorization did not complete before the code expired; run `oh-hai login` again.");
|
|
140
203
|
}
|
|
204
|
+
/** Strip the controls `JSON.stringify` does NOT escape — C1 (U+0080–U+009F) and DEL — from a value
|
|
205
|
+
* that is about to be serialized into an envelope. Narrower than `sanitizeForTerminal`, which also
|
|
206
|
+
* strips C0 and would mangle legitimate content; C0 needs no help here because JSON escapes it. */
|
|
207
|
+
function stripJsonControls(value) {
|
|
208
|
+
let out = "";
|
|
209
|
+
for (const ch of value) {
|
|
210
|
+
const code = ch.codePointAt(0) ?? 0;
|
|
211
|
+
if (code !== 0x7f && !(code >= 0x80 && code <= 0x9f))
|
|
212
|
+
out += ch;
|
|
213
|
+
}
|
|
214
|
+
return out;
|
|
215
|
+
}
|
|
141
216
|
/** Store the bearer Hub-scoped (§5.1) and report success. The token is NEVER in the output (§5.4);
|
|
142
217
|
* an existing token for this identity is overwritten silently (§4.3). Shared by both login paths and
|
|
143
218
|
* the onboarding entrypoints — `command` labels the §8 success envelope ("login" / "setup"). */
|
|
@@ -147,7 +222,12 @@ async function storeAndReport(ctx, agentId, token, command = "login") {
|
|
|
147
222
|
if (ctx.json) {
|
|
148
223
|
// No token field, ever (§5.4). `storage` reports which backend actually holds it. The agent id
|
|
149
224
|
// is emitted raw — JSON.stringify escapes any control character, so it can't reach the terminal.
|
|
150
|
-
ctx.io.log(serializeEnvelope(
|
|
225
|
+
ctx.io.log(serializeEnvelope(
|
|
226
|
+
// `JSON.stringify` escapes C0 but passes C1 (U+0080–U+009F) and DEL through RAW, so a
|
|
227
|
+
// Hub-chosen id carrying one would reach a terminal live inside the envelope. The human
|
|
228
|
+
// line below already sanitizes for this reason; the JSON path did not. The RAW id is still
|
|
229
|
+
// what was stored above — this sanitizes only what is DISPLAYED.
|
|
230
|
+
buildOk(command, { agent_id: stripJsonControls(agentId), base_url: ctx.config.baseUrl, storage: store.backendName })));
|
|
151
231
|
}
|
|
152
232
|
else {
|
|
153
233
|
// Sanitize the DISPLAYED agent id — on the device-code path it's server-supplied, so a hostile
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import type { CommandContext } from "../context.js";
|
|
2
|
+
/** The triage views `GET /v1/messages` exposes to a human. `active` is the default feed and is
|
|
3
|
+
* expressed by sending NO view param — the Hub treats `archived` and `snoozed` as mutually
|
|
4
|
+
* exclusive opt-ins, so a caller must never send both. */
|
|
5
|
+
export type MailView = "active" | "archived";
|
|
6
|
+
/** The fields of an inbox row this client actually keys on — NOT a claim about what the Hub sends.
|
|
7
|
+
*
|
|
8
|
+
* IMPORTANT, AND THE OPPOSITE OF THE AGENT PATH. `GET /v1/messages` answers a HUMAN bearer with
|
|
9
|
+
* `toGetMessageBody(m, true)` — the FULL message, envelope and all, including `body`, `context`,
|
|
10
|
+
* and the resolver-only `archived_at` / `snoozed_until`. Only the AGENT self-list is projected to
|
|
11
|
+
* an index (`toAgentListItem`), which is what `messages.ts` documents and what an earlier revision
|
|
12
|
+
* of this comment wrongly copied.
|
|
13
|
+
*
|
|
14
|
+
* Two consequences worth stating rather than rediscovering:
|
|
15
|
+
* - the human TABLE narrows to these fields by choice, not because the Hub sent only these;
|
|
16
|
+
* - under `--json` the caller receives the full bodies, which is the point of the surface — so
|
|
17
|
+
* nothing here may assume a field is absent. This interface is a floor, never an exhaustive
|
|
18
|
+
* shape, and `isMailRow` validates only the three fields the renderer dereferences. */
|
|
19
|
+
export interface MailRow {
|
|
20
|
+
id: string;
|
|
21
|
+
type: string;
|
|
22
|
+
status: string;
|
|
23
|
+
title?: string;
|
|
24
|
+
created_at?: string;
|
|
25
|
+
priority?: string;
|
|
26
|
+
agent?: {
|
|
27
|
+
id?: string;
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
/** List the account inbox — full message bodies, not an index (see MailRow). `view` selects the
|
|
31
|
+
* triage feed; `archived` is an explicit opt-in. */
|
|
32
|
+
export declare function listInbox(ctx: CommandContext, token: string, opts: {
|
|
33
|
+
limit?: number;
|
|
34
|
+
offset?: number;
|
|
35
|
+
view?: MailView;
|
|
36
|
+
}): Promise<MailRow[]>;
|
|
37
|
+
/** Pull one message by id.
|
|
38
|
+
*
|
|
39
|
+
* VALIDATED LIKE THE LIST PATH, and for the same reason. `readJson` collapses a malformed 2xx —
|
|
40
|
+
* non-JSON, an array, `{}` — to an empty object, so an unvalidated detail read would exit 0 and
|
|
41
|
+
* print `{ message: {} }` (or a row of em dashes), presenting a Hub/proxy contract failure as a
|
|
42
|
+
* successful read of an empty message. The list path already refuses that; leaving the detail path
|
|
43
|
+
* permissive made the two disagree about what a valid response is. */
|
|
44
|
+
export declare function readMessage(ctx: CommandContext, token: string, id: string): Promise<MailRow & Record<string, unknown>>;
|
|
45
|
+
/** Apply one triage verb to one message. Returns nothing — the Hub answers 2xx with no body worth
|
|
46
|
+
* rendering, and inventing one would imply state this command did not read back. */
|
|
47
|
+
export declare function triage(ctx: CommandContext, token: string, id: string, verb: "archive" | "unarchive"): Promise<void>;
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
// Hub calls for the `oh-hai mail` surface — the account owner's own inbox (issue #874).
|
|
2
|
+
//
|
|
3
|
+
// Every function here takes a HUMAN session bearer. Nothing in this module decides whether the
|
|
4
|
+
// caller is entitled to use it: that is `identity.ts`'s pre-flight gate, which runs before any of
|
|
5
|
+
// these are reached. Re-checking here would invite the response-inspection shape the gate exists to
|
|
6
|
+
// avoid — see that module's header.
|
|
7
|
+
//
|
|
8
|
+
// Status mapping, transport errors, and the error envelope are REUSED from the messaging layer
|
|
9
|
+
// rather than reimplemented: a second copy of the status table drifts, and a drifted copy maps a
|
|
10
|
+
// 404 or a 409 to the wrong exit code, which is exactly the machine contract callers branch on.
|
|
11
|
+
import { throwTransportError } from "../http.js";
|
|
12
|
+
import { readErrorEnvelope, readJson, redactToken, requestTimeoutMs, statusToCliError } from "../messaging/http.js";
|
|
13
|
+
import { redactDeep } from "../messaging/sessions-http.js";
|
|
14
|
+
import { CliError } from "../../envelope.js";
|
|
15
|
+
function isMailRow(v) {
|
|
16
|
+
const r = v;
|
|
17
|
+
return typeof r === "object" && r !== null && typeof r.id === "string" && typeof r.type === "string" && typeof r.status === "string";
|
|
18
|
+
}
|
|
19
|
+
async function get(ctx, token, path) {
|
|
20
|
+
const url = `${ctx.config.baseUrl}${path}`;
|
|
21
|
+
let res;
|
|
22
|
+
try {
|
|
23
|
+
res = await ctx.runtime.fetchImpl(url, {
|
|
24
|
+
method: "GET",
|
|
25
|
+
headers: { Authorization: `Bearer ${token}` },
|
|
26
|
+
signal: AbortSignal.timeout(requestTimeoutMs(ctx)),
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
throwTransportError(error, ctx.config.baseUrl);
|
|
31
|
+
}
|
|
32
|
+
if (res.status < 200 || res.status >= 300) {
|
|
33
|
+
const { code, message } = await readErrorEnvelope(res);
|
|
34
|
+
throw statusToCliError(res.status, redactToken(message, token), code);
|
|
35
|
+
}
|
|
36
|
+
// REDACT THE BEARER FROM THE SUCCESS BODY TOO — not just from error messages (§5.4).
|
|
37
|
+
// A buggy or hostile Hub can echo the Authorization value into any field, and this surface
|
|
38
|
+
// serializes rows VERBATIM under `--json` (deliberately, so a multi-line body survives) — so an
|
|
39
|
+
// echoed bearer would land on stdout intact. The sibling `listMessages` already round-trips its
|
|
40
|
+
// rows through the same redactor; the human inbox path must not be the one that skips it.
|
|
41
|
+
// Fails CLOSED: a re-parse failure raises a server error rather than returning un-redacted data.
|
|
42
|
+
return redactDeep(await readJson(res), token, "message");
|
|
43
|
+
}
|
|
44
|
+
/** List the account inbox — full message bodies, not an index (see MailRow). `view` selects the
|
|
45
|
+
* triage feed; `archived` is an explicit opt-in. */
|
|
46
|
+
export async function listInbox(ctx, token, opts) {
|
|
47
|
+
const query = new URLSearchParams();
|
|
48
|
+
if (opts.limit !== undefined)
|
|
49
|
+
query.set("limit", String(opts.limit));
|
|
50
|
+
if (opts.offset !== undefined)
|
|
51
|
+
query.set("offset", String(opts.offset));
|
|
52
|
+
// Only the archived view carries a param; `active` is the absence of one.
|
|
53
|
+
if (opts.view === "archived")
|
|
54
|
+
query.set("archived", "true");
|
|
55
|
+
const suffix = query.toString();
|
|
56
|
+
const body = await get(ctx, token, `/v1/messages${suffix ? `?${suffix}` : ""}`);
|
|
57
|
+
const messages = body.messages;
|
|
58
|
+
if (!Array.isArray(messages) || !messages.every(isMailRow)) {
|
|
59
|
+
// A malformed body is a SERVER error, never a silently empty inbox — an empty table would read
|
|
60
|
+
// as "nothing to triage" and hide a Hub or proxy regression behind good news.
|
|
61
|
+
throw new CliError("server", "the Hub returned a malformed message list (expected { messages: [{ id, type, status }] }).");
|
|
62
|
+
}
|
|
63
|
+
return messages;
|
|
64
|
+
}
|
|
65
|
+
/** Pull one message by id.
|
|
66
|
+
*
|
|
67
|
+
* VALIDATED LIKE THE LIST PATH, and for the same reason. `readJson` collapses a malformed 2xx —
|
|
68
|
+
* non-JSON, an array, `{}` — to an empty object, so an unvalidated detail read would exit 0 and
|
|
69
|
+
* print `{ message: {} }` (or a row of em dashes), presenting a Hub/proxy contract failure as a
|
|
70
|
+
* successful read of an empty message. The list path already refuses that; leaving the detail path
|
|
71
|
+
* permissive made the two disagree about what a valid response is. */
|
|
72
|
+
export async function readMessage(ctx, token, id) {
|
|
73
|
+
const body = await get(ctx, token, `/v1/messages/${encodeURIComponent(id)}`);
|
|
74
|
+
if (!isMailRow(body)) {
|
|
75
|
+
throw new CliError("server", "the Hub returned a malformed message (expected { id, type, status }).");
|
|
76
|
+
}
|
|
77
|
+
// AND IT MUST BE THE MESSAGE THAT WAS ASKED FOR. A well-shaped body for a DIFFERENT id passes the
|
|
78
|
+
// shape check and would exit 0 having shown the wrong message — the caller then archives, quotes
|
|
79
|
+
// or acts on something they never requested. The agent-side `pollMessage` validates this echo for
|
|
80
|
+
// the same reason; a shape check alone is not an identity check.
|
|
81
|
+
if (body.id !== id) {
|
|
82
|
+
throw new CliError("server", "the Hub returned a different message than the one requested.");
|
|
83
|
+
}
|
|
84
|
+
return body;
|
|
85
|
+
}
|
|
86
|
+
/** Apply one triage verb to one message. Returns nothing — the Hub answers 2xx with no body worth
|
|
87
|
+
* rendering, and inventing one would imply state this command did not read back. */
|
|
88
|
+
export async function triage(ctx, token, id, verb) {
|
|
89
|
+
const url = `${ctx.config.baseUrl}/v1/messages/${encodeURIComponent(id)}/${verb}`;
|
|
90
|
+
let res;
|
|
91
|
+
try {
|
|
92
|
+
res = await ctx.runtime.fetchImpl(url, {
|
|
93
|
+
method: "POST",
|
|
94
|
+
headers: { Authorization: `Bearer ${token}` },
|
|
95
|
+
signal: AbortSignal.timeout(requestTimeoutMs(ctx)),
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
throwTransportError(error, ctx.config.baseUrl);
|
|
100
|
+
}
|
|
101
|
+
if (res.status < 200 || res.status >= 300) {
|
|
102
|
+
const { code, message } = await readErrorEnvelope(res);
|
|
103
|
+
throw statusToCliError(res.status, redactToken(message, token), code);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=http.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../../src/commands/mail/http.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { CommandContext } from "../context.js";
|
|
2
|
+
/** The human identity a `mail` command runs as. */
|
|
3
|
+
export interface MailIdentity {
|
|
4
|
+
/** The account owner's session bearer. */
|
|
5
|
+
token: string;
|
|
6
|
+
/** The `<userId>` half of the stored `human:<userId>` id — never the raw stored key. */
|
|
7
|
+
userId: string;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Resolve the human identity for a `mail` command, or refuse.
|
|
11
|
+
*
|
|
12
|
+
* Called before any request is composed. Throws rather than returning a discriminated result: a
|
|
13
|
+
* caller cannot then forget to branch, which is the failure this whole module exists to prevent.
|
|
14
|
+
*/
|
|
15
|
+
export declare function resolveMailIdentity(ctx: CommandContext): Promise<MailIdentity>;
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
// Identity resolution for the `oh-hai mail` surface — the account OWNER's own inbox (issue #874).
|
|
2
|
+
//
|
|
3
|
+
// WHY THE REFUSAL IS PRE-FLIGHT, AND WHY IT CANNOT BE A RESPONSE CHECK.
|
|
4
|
+
// `GET /v1/messages` is DUAL-AUDIENCE: with a human session bearer it returns the account-wide
|
|
5
|
+
// inbox; with an AGENT bearer it SUCCEEDS and returns that agent's own submitted messages. It does
|
|
6
|
+
// not error for the wrong audience — it returns different data with the same shape and the same
|
|
7
|
+
// 200. So a guard that inspects the RESPONSE is unsound by construction, and the sibling
|
|
8
|
+
// agent-side guard in `messaging/http.ts` says exactly that in its own comment:
|
|
9
|
+
//
|
|
10
|
+
// a heuristic, not a proof of the agent branch: a single-agent or empty account has no
|
|
11
|
+
// foreign row to trip on
|
|
12
|
+
//
|
|
13
|
+
// That hole is widest precisely where it matters most — a fresh or single-agent account — and its
|
|
14
|
+
// failure mode is silent: a plausible, well-formed, WRONG inbox with nothing signalling it.
|
|
15
|
+
// Deciding from the RESOLVED IDENTITY, before a request is composed, has no such hole: an agent
|
|
16
|
+
// identity never reaches the network here at all. Every `mail` command therefore calls
|
|
17
|
+
// `resolveMailIdentity` FIRST, and nothing in this module consults response data.
|
|
18
|
+
//
|
|
19
|
+
// FAIL CLOSED. An unresolvable identity is refused as not-human rather than attempted
|
|
20
|
+
// unauthenticated — "I could not tell" is never permission to send.
|
|
21
|
+
import { resolveIdentity } from "../../auth/resolve-token.js";
|
|
22
|
+
import { humanUserId, isHumanId } from "../../auth/token-store.js";
|
|
23
|
+
import { CliError } from "../../envelope.js";
|
|
24
|
+
import { sanitizeForTerminal } from "../messaging/shared.js";
|
|
25
|
+
import { classifyProbeStatus, probeGet, readActor, readJsonBody } from "../whoami.js";
|
|
26
|
+
/** How to get one, appended to every refusal so the error is actionable rather than a diagnosis. */
|
|
27
|
+
const REMEDY = "`oh-hai mail` reads YOUR account inbox, so it needs a human identity: run `oh-hai login --human` " +
|
|
28
|
+
"(or select one with --account human:<id>). To read an agent's own submitted messages instead, use `oh-hai messages list`.";
|
|
29
|
+
/**
|
|
30
|
+
* Resolve the human identity for a `mail` command, or refuse.
|
|
31
|
+
*
|
|
32
|
+
* Called before any request is composed. Throws rather than returning a discriminated result: a
|
|
33
|
+
* caller cannot then forget to branch, which is the failure this whole module exists to prevent.
|
|
34
|
+
*/
|
|
35
|
+
export async function resolveMailIdentity(ctx) {
|
|
36
|
+
// FIRST, AND BEFORE THE ID IS EVEN CONSULTED: refuse an env bearer.
|
|
37
|
+
//
|
|
38
|
+
// `MA2H_AGENT_TOKEN` is an AGENT credential by name and by contract, and — the part that makes
|
|
39
|
+
// this a hole rather than a nicety — it is NOT BOUND TO THE CONFIGURED ACCOUNT. `resolveIdentity`
|
|
40
|
+
// returns it verbatim alongside whatever `--account` says (the same unbinding `requireWatchIdentity`
|
|
41
|
+
// documents for the drain lock). So without this arm:
|
|
42
|
+
//
|
|
43
|
+
// MA2H_AGENT_TOKEN=<agent bearer> oh-hai mail list --account human:usr_1
|
|
44
|
+
//
|
|
45
|
+
// presents a human-SHAPED id with an AGENT token behind it. The id test below would pass, the
|
|
46
|
+
// request would go out, and the Hub would answer with that agent's own submissions — the exact
|
|
47
|
+
// plausible-but-wrong inbox this module exists to prevent, reached through the env path instead
|
|
48
|
+
// of the store. A human identity must be STORE-resolved, where the token was looked up BY the
|
|
49
|
+
// human id and the two are therefore bound.
|
|
50
|
+
if (ctx.config.tokenSource === "env") {
|
|
51
|
+
throw new CliError("usage", "MA2H_AGENT_TOKEN is set, and it is an AGENT credential that is not bound to --account — it cannot be used as a human identity. " +
|
|
52
|
+
"Unset it and run `oh-hai login --human`, so the session token is stored under (and resolved by) your human id.");
|
|
53
|
+
}
|
|
54
|
+
const store = await ctx.runtime.openStore();
|
|
55
|
+
const { account, token } = await resolveIdentity(ctx.config, store);
|
|
56
|
+
// Order matters: classify the IDENTITY before asking whether a token exists. An agent identity
|
|
57
|
+
// that happens to have no stored token must still read as "wrong identity", not as "log in" —
|
|
58
|
+
// sending the caller to re-login would have them authenticate as the agent again and arrive back
|
|
59
|
+
// here, having been told the wrong thing twice.
|
|
60
|
+
if (account === undefined) {
|
|
61
|
+
throw new CliError("usage", `no identity is selected, so this command cannot tell whose inbox to read. ${REMEDY}`);
|
|
62
|
+
}
|
|
63
|
+
if (!isHumanId(account)) {
|
|
64
|
+
// SANITIZE THE ID BEFORE IT REACHES A TERMINAL. A device-code login stores the agent id the HUB
|
|
65
|
+
// chose, verbatim — `runDeviceCodeFlow` accepts any non-empty `agent_id` — so a custom or
|
|
66
|
+
// compromised Hub can plant control characters in it, and this message goes straight to stderr.
|
|
67
|
+
// The login and whoami display paths already sanitize for exactly this; the table rendering in
|
|
68
|
+
// mail.ts does too. The ERROR path was the one place still interpolating it raw.
|
|
69
|
+
throw new CliError("usage", `the selected identity "${sanitizeForTerminal(account)}" is an AGENT, not a human. ${REMEDY}`);
|
|
70
|
+
}
|
|
71
|
+
if (token === undefined) {
|
|
72
|
+
throw new CliError("auth", `no stored token for "${sanitizeForTerminal(account)}" — run \`oh-hai login --human\`.`);
|
|
73
|
+
}
|
|
74
|
+
// `humanUserId` re-tests the prefix rather than slicing on the strength of the check above, so
|
|
75
|
+
// this stays correct if the two are ever separated.
|
|
76
|
+
const userId = humanUserId(account);
|
|
77
|
+
if (userId === undefined || userId === "") {
|
|
78
|
+
throw new CliError("usage", `the selected identity "${sanitizeForTerminal(account)}" carries no user id. ${REMEDY}`);
|
|
79
|
+
}
|
|
80
|
+
// ATTEST THE CREDENTIAL. The checks above establish that the stored ID claims to be human; they
|
|
81
|
+
// cannot establish that the TOKEN is. The `human:` prefix is only reserved as of this change, and
|
|
82
|
+
// it never was on the server: `MA2H_AGENT_TOKENS` splits on `=` with no reserved-prefix rule, and
|
|
83
|
+
// an older CLI accepted `login --token-stdin --account human:bot` with any bearer. So a
|
|
84
|
+
// credential stored BEFORE this change — or configured on the Hub — can carry a human-shaped id
|
|
85
|
+
// over an AGENT token, and every local check would wave it through.
|
|
86
|
+
//
|
|
87
|
+
// This is the same rule as the two refusals above, applied honestly: an id-based check is sound
|
|
88
|
+
// only where the id IMPLIES the credential. History means it does not, so ask the Hub who this
|
|
89
|
+
// token actually is and believe THAT.
|
|
90
|
+
//
|
|
91
|
+
// ORDERING IS DELIBERATE. The local refusals run FIRST, so the common wrong-identity case still
|
|
92
|
+
// costs no network call at all and the "an agent identity never reaches the network" property
|
|
93
|
+
// holds for it. This probe runs only for a credential that already looks human, and it targets
|
|
94
|
+
// `/auth/whoami` — an identity endpoint that discloses nothing about the inbox — so the INBOX is
|
|
95
|
+
// still never touched by a non-human caller.
|
|
96
|
+
const res = await probeGet(ctx, "/auth/whoami", token);
|
|
97
|
+
if (res.status !== 200)
|
|
98
|
+
classifyProbeStatus(res.status);
|
|
99
|
+
const actor = readActor(await readJsonBody(res));
|
|
100
|
+
if (actor === undefined) {
|
|
101
|
+
throw new CliError("server", "the Hub did not attest an identity for this credential (200 without an actor); refusing rather than assuming it is yours.");
|
|
102
|
+
}
|
|
103
|
+
// NEVER ECHO AN ACTOR THAT CONTAINS THE CREDENTIAL. `sanitizeForTerminal` strips controls; it does
|
|
104
|
+
// not redact a PRINTABLE bearer. A Hub answering `agent:<the-token>` would otherwise have its
|
|
105
|
+
// actor interpolated into the refusal below and written to stderr — the §5.4 never-print contract
|
|
106
|
+
// broken by the very check that exists to protect the surface. The login arm refuses this exact
|
|
107
|
+
// shape; adding the probe here without the same refusal reproduced the hole one file over.
|
|
108
|
+
if (actor.includes(token)) {
|
|
109
|
+
throw new CliError("server", "the Hub echoed the presented credential back inside its identity response; refusing rather than reporting it.");
|
|
110
|
+
}
|
|
111
|
+
// THE ATTESTED ACTOR MUST BE **THIS** IDENTITY, not merely *a* human one.
|
|
112
|
+
//
|
|
113
|
+
// "Is it human?" is not the question. An older CLI accepted `--token-stdin --account human:A` with
|
|
114
|
+
// ANY bearer, so a store can hold human B's valid session token under the key `human:A`. The Hub
|
|
115
|
+
// then attests `human:B` — genuinely human — and a human-only check passes, after which
|
|
116
|
+
// `--account human:A` lists, reads and ARCHIVES B's inbox while every message claims to run as A.
|
|
117
|
+
// A cross-account read, reached through a check that looked like it had closed the hole.
|
|
118
|
+
//
|
|
119
|
+
// This is the third variant of one rule in this PR, and the general form is the one to hold:
|
|
120
|
+
// the credential must be attested as the EXACT identity being acted on, not as a member of the
|
|
121
|
+
// right class.
|
|
122
|
+
if (actor !== account) {
|
|
123
|
+
throw new CliError("usage", `the stored credential under "${sanitizeForTerminal(account)}" is attested by the Hub as a DIFFERENT identity. ` +
|
|
124
|
+
"It was stored before the `human:` prefix was reserved, or under the wrong key. Re-run `oh-hai login --human` to replace it — " +
|
|
125
|
+
"the attested id is not shown here because it is not yours to learn from a mismatched key.");
|
|
126
|
+
}
|
|
127
|
+
// NOTE: no separate "is the actor human?" arm here, deliberately. The equality check above already
|
|
128
|
+
// implies it — `account` passed `isHumanId` earlier, and `actor` must equal `account` — so such a
|
|
129
|
+
// branch could never execute. Leaving one would imply a live guard that is doing nothing, which is
|
|
130
|
+
// how a later reader concludes the class is covered when the equality check is what covers it.
|
|
131
|
+
// Equal to `account` by the check above; read from the ATTESTED value so the Hub remains the
|
|
132
|
+
// source of truth rather than the local key.
|
|
133
|
+
return { token, userId: humanUserId(actor) ?? userId };
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=identity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identity.js","sourceRoot":"","sources":["../../../src/commands/mail/identity.ts"],"names":[],"mappings":"AAAA,kGAAkG;AAClG,EAAE;AACF,wEAAwE;AACxE,+FAA+F;AAC/F,mGAAmG;AACnG,gGAAgG;AAChG,yFAAyF;AACzF,gFAAgF;AAChF,EAAE;AACF,2FAA2F;AAC3F,6BAA6B;AAC7B,EAAE;AACF,kGAAkG;AAClG,4FAA4F;AAC5F,gGAAgG;AAChG,uFAAuF;AACvF,kFAAkF;AAClF,EAAE;AACF,sFAAsF;AACtF,oEAAoE;AAEpE,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAE7D,OAAO,EAAE,mBAAmB,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAUtF,oGAAoG;AACpG,MAAM,MAAM,GACV,mGAAmG;IACnG,2HAA2H,CAAC;AAE9H;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,GAAmB;IAC3D,oEAAoE;IACpE,EAAE;IACF,+FAA+F;IAC/F,kGAAkG;IAClG,qGAAqG;IACrG,sDAAsD;IACtD,EAAE;IACF,6EAA6E;IAC7E,EAAE;IACF,8FAA8F;IAC9F,+FAA+F;IAC/F,gGAAgG;IAChG,8FAA8F;IAC9F,4CAA4C;IAC5C,IAAI,GAAG,CAAC,MAAM,CAAC,WAAW,KAAK,KAAK,EAAE,CAAC;QACrC,MAAM,IAAI,QAAQ,CAChB,OAAO,EACP,iIAAiI;YAC/H,gHAAgH,CACnH,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;IAC5C,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,MAAM,eAAe,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAEpE,+FAA+F;IAC/F,8FAA8F;IAC9F,iGAAiG;IACjG,gDAAgD;IAChD,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,MAAM,IAAI,QAAQ,CAAC,OAAO,EAAE,6EAA6E,MAAM,EAAE,CAAC,CAAC;IACrH,CAAC;IACD,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;QACxB,gGAAgG;QAChG,0FAA0F;QAC1F,gGAAgG;QAChG,+FAA+F;QAC/F,iFAAiF;QACjF,MAAM,IAAI,QAAQ,CAAC,OAAO,EAAE,0BAA0B,mBAAmB,CAAC,OAAO,CAAC,+BAA+B,MAAM,EAAE,CAAC,CAAC;IAC7H,CAAC;IACD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,MAAM,IAAI,QAAQ,CAAC,MAAM,EAAE,wBAAwB,mBAAmB,CAAC,OAAO,CAAC,mCAAmC,CAAC,CAAC;IACtH,CAAC;IAED,+FAA+F;IAC/F,oDAAoD;IACpD,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IACpC,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,EAAE,EAAE,CAAC;QAC1C,MAAM,IAAI,QAAQ,CAAC,OAAO,EAAE,0BAA0B,mBAAmB,CAAC,OAAO,CAAC,yBAAyB,MAAM,EAAE,CAAC,CAAC;IACvH,CAAC;IAED,gGAAgG;IAChG,kGAAkG;IAClG,kGAAkG;IAClG,wFAAwF;IACxF,gGAAgG;IAChG,oEAAoE;IACpE,EAAE;IACF,gGAAgG;IAChG,+FAA+F;IAC/F,sCAAsC;IACtC,EAAE;IACF,gGAAgG;IAChG,8FAA8F;IAC9F,+FAA+F;IAC/F,iGAAiG;IACjG,6CAA6C;IAC7C,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,GAAG,EAAE,cAAc,EAAE,KAAK,CAAC,CAAC;IACvD,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;QAAE,mBAAmB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACxD,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC;IACjD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,MAAM,IAAI,QAAQ,CAAC,QAAQ,EAAE,2HAA2H,CAAC,CAAC;IAC5J,CAAC;IAED,mGAAmG;IACnG,8FAA8F;IAC9F,kGAAkG;IAClG,gGAAgG;IAChG,2FAA2F;IAC3F,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,QAAQ,CAAC,QAAQ,EAAE,+GAA+G,CAAC,CAAC;IAChJ,CAAC;IAED,0EAA0E;IAC1E,EAAE;IACF,mGAAmG;IACnG,iGAAiG;IACjG,wFAAwF;IACxF,kGAAkG;IAClG,yFAAyF;IACzF,EAAE;IACF,6FAA6F;IAC7F,+FAA+F;IAC/F,eAAe;IACf,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;QACtB,MAAM,IAAI,QAAQ,CAChB,OAAO,EACP,gCAAgC,mBAAmB,CAAC,OAAO,CAAC,oDAAoD;YAC9G,+HAA+H;YAC/H,2FAA2F,CAC9F,CAAC;IACJ,CAAC;IACD,mGAAmG;IACnG,kGAAkG;IAClG,mGAAmG;IACnG,+FAA+F;IAE/F,6FAA6F;IAC7F,6CAA6C;IAC7C,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,KAAK,CAAC,IAAI,MAAM,EAAE,CAAC;AACzD,CAAC"}
|