@jitera/connect 1.5.0 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +1 -1
- package/README.md +51 -13
- package/content/instructions.md +7 -4
- package/content/session-start-unbound.md +12 -0
- package/content/session-start.md +14 -5
- package/dist/bin/cli.js +101 -93
- package/dist/bin/cli.js.map +1 -1
- package/dist/bin/connect.js +3 -0
- package/dist/bin/connect.js.map +1 -1
- package/dist/bin/init.js +122 -119
- package/dist/bin/init.js.map +1 -1
- package/dist/bin/login.js +221 -211
- package/dist/bin/login.js.map +1 -1
- package/dist/bin/proxy.js +2 -1
- package/dist/bin/proxy.js.map +1 -1
- package/dist/bin/set-agent.d.ts +3 -0
- package/dist/bin/set-agent.d.ts.map +1 -0
- package/dist/bin/set-agent.js +165 -0
- package/dist/bin/set-agent.js.map +1 -0
- package/dist/bin/statusline.js +6 -1
- package/dist/bin/statusline.js.map +1 -1
- package/dist/cli-session.d.ts +12 -0
- package/dist/cli-session.d.ts.map +1 -1
- package/dist/cli-session.js +25 -0
- package/dist/cli-session.js.map +1 -1
- package/dist/exit.d.ts +8 -0
- package/dist/exit.d.ts.map +1 -0
- package/dist/exit.js +32 -0
- package/dist/exit.js.map +1 -0
- package/dist/graphql.d.ts +6 -0
- package/dist/graphql.d.ts.map +1 -1
- package/dist/graphql.js +24 -0
- package/dist/graphql.js.map +1 -1
- package/dist/hook-io.d.ts +2 -0
- package/dist/hook-io.d.ts.map +1 -1
- package/dist/hook-io.js +3 -0
- package/dist/hook-io.js.map +1 -1
- package/dist/hooks/session-start.js +19 -5
- package/dist/hooks/session-start.js.map +1 -1
- package/dist/hooks/stop.js +7 -1
- package/dist/hooks/stop.js.map +1 -1
- package/dist/hooks/user-prompt-submit.js +78 -20
- package/dist/hooks/user-prompt-submit.js.map +1 -1
- package/dist/project-marker.d.ts +1 -0
- package/dist/project-marker.d.ts.map +1 -1
- package/dist/project-marker.js +40 -2
- package/dist/project-marker.js.map +1 -1
- package/dist/proxy.d.ts +5 -1
- package/dist/proxy.d.ts.map +1 -1
- package/dist/proxy.js +42 -2
- package/dist/proxy.js.map +1 -1
- package/dist/select.d.ts +17 -0
- package/dist/select.d.ts.map +1 -1
- package/dist/select.js +164 -3
- package/dist/select.js.map +1 -1
- package/dist/statusline.d.ts +2 -1
- package/dist/statusline.d.ts.map +1 -1
- package/dist/statusline.js +6 -1
- package/dist/statusline.js.map +1 -1
- package/package.json +1 -1
- package/skills/jitera-context/SKILL.md +22 -0
- package/skills/jitera-memory/SKILL.md +20 -2
- package/templates/AGENTS.md.tmpl +10 -4
|
@@ -1,18 +1,36 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { callTool, McpCallError } from "../mcp-client.js";
|
|
3
3
|
import { discoverDeployment } from "../discovery.js";
|
|
4
|
-
import { emitContext, readHookInput } from "../hook-io.js";
|
|
4
|
+
import { emitContext, promptText, readHookInput } from "../hook-io.js";
|
|
5
5
|
import { readProjectMarker } from "../project-marker.js";
|
|
6
6
|
import { claimOnce } from "../session-marker.js";
|
|
7
7
|
import { writeSessionStatus } from "../session-status.js";
|
|
8
8
|
const MAX_CONTEXT_CHARS = 6000;
|
|
9
|
+
// The composite tool searches memory, documents and source concurrently, so it
|
|
10
|
+
// is slower than a bare recall. This hook blocks the user's prompt, so the
|
|
11
|
+
// ceiling stays close to the old one rather than tracking the server's own
|
|
12
|
+
// per-section timeout.
|
|
13
|
+
const GATHER_TIMEOUT_MS = 10000;
|
|
9
14
|
const RECALL_TIMEOUT_MS = 8000;
|
|
15
|
+
// Keywords are extracted from the task, so a pasted stack trace or diff adds
|
|
16
|
+
// upload on a path that blocks the prompt without adding signal.
|
|
17
|
+
const MAX_TASK_CHARS = 2000;
|
|
10
18
|
const input = readHookInput();
|
|
11
|
-
if (!claimOnce(input.session_id, "recall"))
|
|
12
|
-
process.exit(0);
|
|
13
19
|
const apiKey = process.env["CLAUDE_PLUGIN_OPTION_JITERA_API_KEY"] ?? "";
|
|
14
20
|
if (!apiKey)
|
|
15
21
|
process.exit(0);
|
|
22
|
+
// Without .jitera.json this repository is not bound to a project, so there is
|
|
23
|
+
// no project whose context could be gathered. Bail before discovery rather
|
|
24
|
+
// than spend a network round trip guessing at a project nobody chose; session
|
|
25
|
+
// start is where the user is told how to bind it.
|
|
26
|
+
const marker = readProjectMarker(input.cwd ?? process.cwd());
|
|
27
|
+
if (!marker)
|
|
28
|
+
process.exit(0);
|
|
29
|
+
// Claimed only once there is something to claim it for: burning the session's
|
|
30
|
+
// single gather on an unbound repo would mean running init mid-session never
|
|
31
|
+
// took effect.
|
|
32
|
+
if (!claimOnce(input.session_id, "recall"))
|
|
33
|
+
process.exit(0);
|
|
16
34
|
let url;
|
|
17
35
|
const override = process.env["JITERA_MCP_URL"];
|
|
18
36
|
if (override) {
|
|
@@ -31,24 +49,63 @@ else {
|
|
|
31
49
|
process.exit(0);
|
|
32
50
|
}
|
|
33
51
|
}
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
52
|
+
const transport = { url, apiKey, projectUuid: marker.project };
|
|
53
|
+
// `set-agent` records which agents this repository reads. Absent means every
|
|
54
|
+
// agent, which is what the tools do when the argument is omitted.
|
|
55
|
+
const agents = marker.agents && marker.agents.length > 0 ? [...marker.agents] : undefined;
|
|
56
|
+
const task = promptText(input).slice(0, MAX_TASK_CHARS);
|
|
57
|
+
// The blind recall serves two purposes: it is what deployments predating the
|
|
58
|
+
// composite tool answer, and it is the right call when there is no prompt text
|
|
59
|
+
// to gather for. It stays query-less on purpose — a server without the widening
|
|
60
|
+
// ladder can return less for a query than for no query.
|
|
61
|
+
const recall = () => callTool({
|
|
62
|
+
...transport,
|
|
63
|
+
name: "recall_jitera_memory",
|
|
64
|
+
args: agents ? { agents } : {},
|
|
65
|
+
timeoutMs: RECALL_TIMEOUT_MS,
|
|
66
|
+
});
|
|
67
|
+
// The fallback exists for deployments that predate the composite tool, so it
|
|
68
|
+
// is worth a second round trip only when the tool is genuinely absent. Falling
|
|
69
|
+
// back on a timeout would stack RECALL_TIMEOUT_MS on top of GATHER_TIMEOUT_MS
|
|
70
|
+
// while the user's prompt is blocked.
|
|
71
|
+
function toolIsMissing(error) {
|
|
72
|
+
if (!(error instanceof McpCallError))
|
|
73
|
+
return false;
|
|
74
|
+
const detail = error.detail;
|
|
75
|
+
if (detail?.code === -32601 || detail?.code === -32602)
|
|
76
|
+
return true;
|
|
77
|
+
return /unknown tool|tool not found|method not found/i.test(error.message);
|
|
45
78
|
}
|
|
46
|
-
|
|
79
|
+
function giveUp(error) {
|
|
47
80
|
const message = error instanceof McpCallError ? error.message : String(error);
|
|
48
81
|
writeSessionStatus(input.session_id, { recallError: message });
|
|
49
|
-
process.stderr.write(`jitera-connect: could not load project
|
|
82
|
+
process.stderr.write(`jitera-connect: could not load project context: ${message}\n`);
|
|
50
83
|
process.exit(0);
|
|
51
84
|
}
|
|
85
|
+
let memory;
|
|
86
|
+
const startedAt = Date.now();
|
|
87
|
+
try {
|
|
88
|
+
// Gathering for an empty task makes the server ask for one, and that answer
|
|
89
|
+
// would be injected as though it were project context.
|
|
90
|
+
memory = task
|
|
91
|
+
? await callTool({
|
|
92
|
+
...transport,
|
|
93
|
+
name: "gather_jitera_context",
|
|
94
|
+
args: { task, budget: MAX_CONTEXT_CHARS, ...(agents ? { agents } : {}) },
|
|
95
|
+
timeoutMs: GATHER_TIMEOUT_MS,
|
|
96
|
+
})
|
|
97
|
+
: await recall();
|
|
98
|
+
}
|
|
99
|
+
catch (gatherError) {
|
|
100
|
+
if (!task || !toolIsMissing(gatherError))
|
|
101
|
+
giveUp(gatherError);
|
|
102
|
+
try {
|
|
103
|
+
memory = await recall();
|
|
104
|
+
}
|
|
105
|
+
catch (error) {
|
|
106
|
+
giveUp(error);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
52
109
|
writeSessionStatus(input.session_id, {
|
|
53
110
|
recallMs: Date.now() - startedAt,
|
|
54
111
|
recallChars: memory.length,
|
|
@@ -57,9 +114,10 @@ writeSessionStatus(input.session_id, {
|
|
|
57
114
|
if (!memory)
|
|
58
115
|
process.exit(0);
|
|
59
116
|
const body = memory.length > MAX_CONTEXT_CHARS
|
|
60
|
-
? `${memory.slice(0, MAX_CONTEXT_CHARS)}\n\n[truncated, call
|
|
117
|
+
? `${memory.slice(0, MAX_CONTEXT_CHARS)}\n\n[truncated, call gather_jitera_context for the rest]`
|
|
61
118
|
: memory;
|
|
62
|
-
emitContext("UserPromptSubmit", `
|
|
63
|
-
`Treat this as current.
|
|
64
|
-
`and persist
|
|
119
|
+
emitContext("UserPromptSubmit", `Project context for this workspace, gathered at session start:\n\n${body}\n\n` +
|
|
120
|
+
`Treat this as current. It was gathered for the first prompt of this session, so call ` +
|
|
121
|
+
`gather_jitera_context yourself when the task moves on to a different area, and persist ` +
|
|
122
|
+
`new decisions with remember_jitera_memory.`);
|
|
65
123
|
//# sourceMappingURL=user-prompt-submit.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"user-prompt-submit.js","sourceRoot":"","sources":["../../src/hooks/user-prompt-submit.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"user-prompt-submit.js","sourceRoot":"","sources":["../../src/hooks/user-prompt-submit.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D,MAAM,iBAAiB,GAAG,IAAI,CAAC;AAC/B,+EAA+E;AAC/E,2EAA2E;AAC3E,2EAA2E;AAC3E,uBAAuB;AACvB,MAAM,iBAAiB,GAAG,KAAK,CAAC;AAChC,MAAM,iBAAiB,GAAG,IAAI,CAAC;AAC/B,6EAA6E;AAC7E,iEAAiE;AACjE,MAAM,cAAc,GAAG,IAAI,CAAC;AAE5B,MAAM,KAAK,GAAG,aAAa,EAAE,CAAC;AAE9B,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,IAAI,EAAE,CAAC;AACxE,IAAI,CAAC,MAAM;IAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAE7B,8EAA8E;AAC9E,2EAA2E;AAC3E,8EAA8E;AAC9E,kDAAkD;AAClD,MAAM,MAAM,GAAG,iBAAiB,CAAC,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;AAC7D,IAAI,CAAC,MAAM;IAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAE7B,8EAA8E;AAC9E,6EAA6E;AAC7E,eAAe;AACf,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,UAAU,EAAE,QAAQ,CAAC;IAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAE5D,IAAI,GAAW,CAAC;AAChB,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;AAC/C,IAAI,QAAQ,EAAE,CAAC;IACb,GAAG,GAAG,QAAQ,CAAC;AACjB,CAAC;KAAM,CAAC;IACN,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,MAAM,kBAAkB,CAAC;YAC1C,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC;YAC5D,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;SAC5C,CAAC,CAAC;QACH,GAAG,GAAG,UAAU,CAAC,MAAM,CAAC;IAC1B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,mBAAoB,KAAe,CAAC,OAAO,IAAI,CAAC,CAAC;QACtE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,MAAM,SAAS,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;AAE/D,6EAA6E;AAC7E,kEAAkE;AAClE,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAE1F,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;AAExD,6EAA6E;AAC7E,+EAA+E;AAC/E,gFAAgF;AAChF,wDAAwD;AACxD,MAAM,MAAM,GAAG,GAAG,EAAE,CAClB,QAAQ,CAAC;IACP,GAAG,SAAS;IACZ,IAAI,EAAE,sBAAsB;IAC5B,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE;IAC9B,SAAS,EAAE,iBAAiB;CAC7B,CAAC,CAAC;AAEL,6EAA6E;AAC7E,+EAA+E;AAC/E,8EAA8E;AAC9E,sCAAsC;AACtC,SAAS,aAAa,CAAC,KAAc;IACnC,IAAI,CAAC,CAAC,KAAK,YAAY,YAAY,CAAC;QAAE,OAAO,KAAK,CAAC;IACnD,MAAM,MAAM,GAAG,KAAK,CAAC,MAAuC,CAAC;IAC7D,IAAI,MAAM,EAAE,IAAI,KAAK,CAAC,KAAK,IAAI,MAAM,EAAE,IAAI,KAAK,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACpE,OAAO,+CAA+C,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;AAC7E,CAAC;AAED,SAAS,MAAM,CAAC,KAAc;IAC5B,MAAM,OAAO,GAAG,KAAK,YAAY,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC9E,kBAAkB,CAAC,KAAK,CAAC,UAAU,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC;IAC/D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,mDAAmD,OAAO,IAAI,CAAC,CAAC;IACrF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,IAAI,MAAc,CAAC;AACnB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;AAC7B,IAAI,CAAC;IACH,4EAA4E;IAC5E,uDAAuD;IACvD,MAAM,GAAG,IAAI;QACX,CAAC,CAAC,MAAM,QAAQ,CAAC;YACb,GAAG,SAAS;YACZ,IAAI,EAAE,uBAAuB;YAC7B,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,iBAAiB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE;YACxE,SAAS,EAAE,iBAAiB;SAC7B,CAAC;QACJ,CAAC,CAAC,MAAM,MAAM,EAAE,CAAC;AACrB,CAAC;AAAC,OAAO,WAAW,EAAE,CAAC;IACrB,IAAI,CAAC,IAAI,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC;QAAE,MAAM,CAAC,WAAW,CAAC,CAAC;IAC9D,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,MAAM,EAAE,CAAC;IAC1B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,CAAC;IAChB,CAAC;AACH,CAAC;AAED,kBAAkB,CAAC,KAAK,CAAC,UAAU,EAAE;IACnC,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;IAChC,WAAW,EAAE,MAAM,CAAC,MAAM;IAC1B,WAAW,EAAE,SAAS;CACvB,CAAC,CAAC;AAEH,IAAI,CAAC,MAAM;IAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAE7B,MAAM,IAAI,GACR,MAAM,CAAC,MAAM,GAAG,iBAAiB;IAC/B,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,iBAAiB,CAAC,0DAA0D;IACjG,CAAC,CAAC,MAAM,CAAC;AAEb,WAAW,CACT,kBAAkB,EAClB,qEAAqE,IAAI,MAAM;IAC7E,uFAAuF;IACvF,yFAAyF;IACzF,4CAA4C,CAC/C,CAAC"}
|
package/dist/project-marker.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ export declare const MARKER_FILENAME = ".jitera.json";
|
|
|
2
2
|
export interface ProjectMarker {
|
|
3
3
|
readonly environment?: string | undefined;
|
|
4
4
|
readonly project?: string | undefined;
|
|
5
|
+
readonly agents?: readonly string[] | undefined;
|
|
5
6
|
}
|
|
6
7
|
export interface FoundProjectMarker extends ProjectMarker {
|
|
7
8
|
readonly path: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project-marker.d.ts","sourceRoot":"","sources":["../src/project-marker.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,eAAe,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"project-marker.d.ts","sourceRoot":"","sources":["../src/project-marker.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,eAAe,iBAAiB,CAAC;AAU9C,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1C,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAGtC,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;CACjD;AAED,MAAM,WAAW,kBAAmB,SAAQ,aAAa;IACvD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS,CAoDlF;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAED,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,aAAa,EACrB,MAAM,UAAQ,GACb,iBAAiB,CAiCnB"}
|
package/dist/project-marker.js
CHANGED
|
@@ -4,6 +4,9 @@ export const MARKER_FILENAME = ".jitera.json";
|
|
|
4
4
|
// Environments are studio, studio-stage, studio-NN. Anything else in the file
|
|
5
5
|
// is not echoed back into session context.
|
|
6
6
|
const SAFE_ENVIRONMENT = /^[A-Za-z0-9-]{1,64}$/;
|
|
7
|
+
// A committed marker is editable by hand, and every selected id becomes a
|
|
8
|
+
// clause in the server's filter, so the list is bounded rather than trusted.
|
|
9
|
+
const MAX_AGENTS = 100;
|
|
7
10
|
export function readProjectMarker(startDir) {
|
|
8
11
|
let dir = startDir;
|
|
9
12
|
for (;;) {
|
|
@@ -16,16 +19,40 @@ export function readProjectMarker(startDir) {
|
|
|
16
19
|
catch {
|
|
17
20
|
return undefined;
|
|
18
21
|
}
|
|
19
|
-
|
|
20
|
-
|
|
22
|
+
// `null` parses cleanly and then throws on property access, and a array
|
|
23
|
+
// or a bare scalar is not a marker either. Malformed reads as unbound,
|
|
24
|
+
// the same as unparseable, because hooks must never break a session.
|
|
25
|
+
if (parsed === null || typeof parsed !== "object" || Array.isArray(parsed)) {
|
|
26
|
+
return undefined;
|
|
27
|
+
}
|
|
28
|
+
const fields = parsed;
|
|
29
|
+
const environment = fields["environment"];
|
|
30
|
+
const project = fields["project"];
|
|
31
|
+
const agents = fields["agents"];
|
|
32
|
+
// Trimmed and de-duplicated: an id with stray whitespace matches no
|
|
33
|
+
// partition on the server and would silently narrow recall to nothing.
|
|
34
|
+
const agentIds = Array.isArray(agents)
|
|
35
|
+
? [
|
|
36
|
+
...new Set(agents
|
|
37
|
+
.filter((id) => typeof id === "string")
|
|
38
|
+
.map((id) => id.trim())
|
|
39
|
+
.filter((id) => id !== "")),
|
|
40
|
+
].slice(0, MAX_AGENTS)
|
|
41
|
+
: undefined;
|
|
21
42
|
return {
|
|
22
43
|
path,
|
|
23
44
|
...(typeof environment === "string" && SAFE_ENVIRONMENT.test(environment)
|
|
24
45
|
? { environment }
|
|
25
46
|
: {}),
|
|
26
47
|
...(typeof project === "string" ? { project } : {}),
|
|
48
|
+
...(agentIds && agentIds.length > 0 ? { agents: agentIds } : {}),
|
|
27
49
|
};
|
|
28
50
|
}
|
|
51
|
+
// Never look past the repository root. `init` writes the marker there, so
|
|
52
|
+
// a stray .jitera.json in a parent directory (or $HOME) would otherwise
|
|
53
|
+
// bind every repository beneath it to a project nobody chose for them.
|
|
54
|
+
if (existsSync(join(dir, ".git")))
|
|
55
|
+
return undefined;
|
|
29
56
|
const parent = dirname(dir);
|
|
30
57
|
if (parent === dir)
|
|
31
58
|
return undefined;
|
|
@@ -50,6 +77,17 @@ export function writeProjectMarker(root, marker, dryRun = false) {
|
|
|
50
77
|
...(marker.environment ? { environment: marker.environment } : {}),
|
|
51
78
|
...(marker.project ? { project: marker.project } : {}),
|
|
52
79
|
};
|
|
80
|
+
// An empty list is a real choice - "read every agent" - and has to erase a
|
|
81
|
+
// previous selection rather than be mistaken for "leave it alone".
|
|
82
|
+
if (marker.agents) {
|
|
83
|
+
const ids = [
|
|
84
|
+
...new Set(marker.agents.map((id) => id.trim()).filter((id) => id !== "")),
|
|
85
|
+
].slice(0, MAX_AGENTS);
|
|
86
|
+
if (ids.length > 0)
|
|
87
|
+
next["agents"] = ids;
|
|
88
|
+
else
|
|
89
|
+
delete next["agents"];
|
|
90
|
+
}
|
|
53
91
|
const serialized = `${JSON.stringify(next, undefined, 2)}\n`;
|
|
54
92
|
const changed = before !== serialized;
|
|
55
93
|
if (changed && !dryRun)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project-marker.js","sourceRoot":"","sources":["../src/project-marker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAE1C,MAAM,CAAC,MAAM,eAAe,GAAG,cAAc,CAAC;AAE9C,8EAA8E;AAC9E,2CAA2C;AAC3C,MAAM,gBAAgB,GAAG,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"project-marker.js","sourceRoot":"","sources":["../src/project-marker.ts"],"names":[],"mappings":"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"}
|
package/dist/proxy.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type JsonRpcRequest } from "./mcp-client.ts";
|
|
1
2
|
export interface ProxyStreams {
|
|
2
3
|
readonly input: NodeJS.ReadableStream;
|
|
3
4
|
readonly output: NodeJS.WritableStream;
|
|
@@ -8,9 +9,12 @@ export interface ProxyConfig {
|
|
|
8
9
|
readonly apiKey: string;
|
|
9
10
|
readonly instructions?: string | undefined;
|
|
10
11
|
readonly projectUuid?: string | undefined;
|
|
12
|
+
readonly agents?: readonly string[] | undefined;
|
|
11
13
|
}
|
|
12
14
|
export declare function resolveProjectUuid(env: NodeJS.ProcessEnv, cwd?: string): string | undefined;
|
|
13
|
-
export declare function
|
|
15
|
+
export declare function resolveAgents(cwd: string, env?: NodeJS.ProcessEnv): readonly string[] | undefined;
|
|
16
|
+
export declare function withAgentSelection(request: JsonRpcRequest, agents: readonly string[] | undefined): JsonRpcRequest;
|
|
17
|
+
export declare function runProxy({ url, apiKey, instructions, projectUuid, agents }: ProxyConfig, { input, output, log }: ProxyStreams): Promise<void>;
|
|
14
18
|
export interface ProxyEnvironment extends ProxyConfig {
|
|
15
19
|
readonly brand: string;
|
|
16
20
|
}
|
package/dist/proxy.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proxy.d.ts","sourceRoot":"","sources":["../src/proxy.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"proxy.d.ts","sourceRoot":"","sources":["../src/proxy.ts"],"names":[],"mappings":"AAIA,OAAO,EAAyB,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAK7E,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,cAAc,CAAC;IACtC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,cAAc,CAAC;IACvC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,cAAc,CAAC;CACrC;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3C,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1C,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;CACjD;AAID,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,MAAM,CAAC,UAAU,EACtB,GAAG,GAAE,MAAsB,GAC1B,MAAM,GAAG,SAAS,CAIpB;AAED,wBAAgB,aAAa,CAC3B,GAAG,EAAE,MAAM,EACX,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,SAAS,MAAM,EAAE,GAAG,SAAS,CAS/B;AAOD,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,cAAc,EACvB,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,GACpC,cAAc,CAsBhB;AAiBD,wBAAsB,QAAQ,CAC5B,EAAE,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,WAAW,EAC/D,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,YAAY,GACnC,OAAO,CAAC,IAAI,CAAC,CAwCf;AAED,MAAM,WAAW,gBAAiB,SAAQ,WAAW;IACnD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,wBAAsB,qBAAqB,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAW7F"}
|
package/dist/proxy.js
CHANGED
|
@@ -12,6 +12,41 @@ export function resolveProjectUuid(env, cwd = process.cwd()) {
|
|
|
12
12
|
return override;
|
|
13
13
|
return readProjectMarker(cwd)?.project;
|
|
14
14
|
}
|
|
15
|
+
export function resolveAgents(cwd, env = process.env) {
|
|
16
|
+
// JITERA_PROJECT overrides which project the proxy talks to, and agent ids
|
|
17
|
+
// belong to the project they were chosen in. Sending this repository's ids
|
|
18
|
+
// alongside someone else's project matches nothing and quietly empties the
|
|
19
|
+
// recall, so the override drops the selection with it.
|
|
20
|
+
if (env["JITERA_PROJECT"])
|
|
21
|
+
return undefined;
|
|
22
|
+
const agents = readProjectMarker(cwd)?.agents;
|
|
23
|
+
return agents && agents.length > 0 ? agents : undefined;
|
|
24
|
+
}
|
|
25
|
+
// Tools whose reach `set-agent` narrows. Clients other than Claude Code reach
|
|
26
|
+
// the server through this proxy, so the repository's choice is applied here
|
|
27
|
+
// rather than relying on every client to know about it.
|
|
28
|
+
const AGENT_SCOPED_TOOLS = new Set(["recall_jitera_memory", "gather_jitera_context"]);
|
|
29
|
+
export function withAgentSelection(request, agents) {
|
|
30
|
+
if (!agents || agents.length === 0 || request.method !== "tools/call")
|
|
31
|
+
return request;
|
|
32
|
+
const params = request.params;
|
|
33
|
+
if (!params?.name || !AGENT_SCOPED_TOOLS.has(params.name))
|
|
34
|
+
return request;
|
|
35
|
+
// A caller that named agents itself has been more specific than the
|
|
36
|
+
// repository default, so leave it alone.
|
|
37
|
+
const args = params.arguments;
|
|
38
|
+
if (args !== undefined && (typeof args !== "object" || Array.isArray(args))) {
|
|
39
|
+
// Not a valid MCP argument object; forwarding it unchanged lets the server
|
|
40
|
+
// reject it rather than this throwing on a property test.
|
|
41
|
+
return request;
|
|
42
|
+
}
|
|
43
|
+
if (args && "agents" in args)
|
|
44
|
+
return request;
|
|
45
|
+
return {
|
|
46
|
+
...request,
|
|
47
|
+
params: { ...params, arguments: { ...(args ?? {}), agents: [...agents] } },
|
|
48
|
+
};
|
|
49
|
+
}
|
|
15
50
|
function isNotification(request) {
|
|
16
51
|
return request.id === undefined || request.id === null;
|
|
17
52
|
}
|
|
@@ -24,7 +59,7 @@ function injectInstructions(response, instructions) {
|
|
|
24
59
|
result["instructions"] = instructions;
|
|
25
60
|
}
|
|
26
61
|
}
|
|
27
|
-
export async function runProxy({ url, apiKey, instructions, projectUuid }, { input, output, log }) {
|
|
62
|
+
export async function runProxy({ url, apiKey, instructions, projectUuid, agents }, { input, output, log }) {
|
|
28
63
|
const lines = createInterface({ input, crlfDelay: Infinity });
|
|
29
64
|
for await (const line of lines) {
|
|
30
65
|
const trimmed = line.trim();
|
|
@@ -40,7 +75,12 @@ export async function runProxy({ url, apiKey, instructions, projectUuid }, { inp
|
|
|
40
75
|
}
|
|
41
76
|
let response;
|
|
42
77
|
try {
|
|
43
|
-
response = await postRpc(request,
|
|
78
|
+
response = await postRpc(withAgentSelection(request, agents), {
|
|
79
|
+
url,
|
|
80
|
+
apiKey,
|
|
81
|
+
projectUuid,
|
|
82
|
+
timeoutMs: REQUEST_TIMEOUT_MS,
|
|
83
|
+
});
|
|
44
84
|
}
|
|
45
85
|
catch (error) {
|
|
46
86
|
const message = error instanceof McpCallError ? error.message : String(error);
|
package/dist/proxy.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proxy.js","sourceRoot":"","sources":["../src/proxy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEhD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,OAAO,EAAuB,MAAM,iBAAiB,CAAC;AAC7E,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExD,MAAM,kBAAkB,GAAG,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"proxy.js","sourceRoot":"","sources":["../src/proxy.ts"],"names":[],"mappings":"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"}
|
package/dist/select.d.ts
CHANGED
|
@@ -8,6 +8,10 @@ export declare class InvalidChoiceError extends Error {
|
|
|
8
8
|
readonly answer: string;
|
|
9
9
|
constructor(answer: string);
|
|
10
10
|
}
|
|
11
|
+
export declare class NoInputError extends Error {
|
|
12
|
+
readonly name = "NoInputError";
|
|
13
|
+
constructor();
|
|
14
|
+
}
|
|
11
15
|
export declare function chooseFrom<T>({ items, prompt, label, theme, }: {
|
|
12
16
|
readonly items: readonly T[];
|
|
13
17
|
readonly prompt: string;
|
|
@@ -33,4 +37,17 @@ export interface SelectOptions<T> {
|
|
|
33
37
|
readonly output: SelectOutput;
|
|
34
38
|
}
|
|
35
39
|
export declare function interactiveSelect<T>({ items, prompt, label, theme, input, output }: SelectOptions<T>): Promise<T>;
|
|
40
|
+
export interface MultiSelectOptions<T> extends SelectOptions<T> {
|
|
41
|
+
readonly selected?: (item: T) => boolean;
|
|
42
|
+
readonly viewport?: number;
|
|
43
|
+
readonly columns?: number;
|
|
44
|
+
}
|
|
45
|
+
export declare function multiSelect<T>({ items, prompt, label, theme, input, output, selected, viewport, columns, }: MultiSelectOptions<T>): Promise<T[]>;
|
|
46
|
+
export declare function chooseManyFrom<T>({ items, prompt, label, theme, selected, }: {
|
|
47
|
+
readonly items: readonly T[];
|
|
48
|
+
readonly prompt: string;
|
|
49
|
+
readonly label: (item: T) => string;
|
|
50
|
+
readonly theme: Theme;
|
|
51
|
+
readonly selected?: (item: T) => boolean;
|
|
52
|
+
}): Promise<T[]>;
|
|
36
53
|
//# sourceMappingURL=select.d.ts.map
|
package/dist/select.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"select.d.ts","sourceRoot":"","sources":["../src/select.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAExC,qBAAa,oBAAqB,SAAQ,KAAK;IAC7C,SAAkB,IAAI,0BAA0B;IAEhD,cAEC;CACF;AAED,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,SAAkB,IAAI,wBAAwB;IAC9C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAExB,YAAY,MAAM,EAAE,MAAM,EAGzB;CACF;
|
|
1
|
+
{"version":3,"file":"select.d.ts","sourceRoot":"","sources":["../src/select.ts"],"names":[],"mappings":"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"}
|
package/dist/select.js
CHANGED
|
@@ -13,6 +13,26 @@ export class InvalidChoiceError extends Error {
|
|
|
13
13
|
this.answer = answer;
|
|
14
14
|
}
|
|
15
15
|
}
|
|
16
|
+
export class NoInputError extends Error {
|
|
17
|
+
name = "NoInputError";
|
|
18
|
+
constructor() {
|
|
19
|
+
super("no answer was given and there is no terminal to ask on");
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
// `rl.question` never settles when stdin is already at EOF, which left a
|
|
23
|
+
// scripted run hanging until the process exited with nothing saved.
|
|
24
|
+
async function ask(prompt) {
|
|
25
|
+
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
26
|
+
try {
|
|
27
|
+
return await new Promise((resolve, reject) => {
|
|
28
|
+
rl.once("close", () => reject(new NoInputError()));
|
|
29
|
+
void rl.question(prompt).then(resolve, reject);
|
|
30
|
+
}).then((answer) => answer.trim());
|
|
31
|
+
}
|
|
32
|
+
finally {
|
|
33
|
+
rl.close();
|
|
34
|
+
}
|
|
35
|
+
}
|
|
16
36
|
// Arrow-key selection on a terminal, a numbered prompt everywhere else.
|
|
17
37
|
export async function chooseFrom({ items, prompt, label, theme, }) {
|
|
18
38
|
if (process.stdin.isTTY && process.stdout.isTTY) {
|
|
@@ -29,9 +49,7 @@ export async function chooseFrom({ items, prompt, label, theme, }) {
|
|
|
29
49
|
items.forEach((item, index) => {
|
|
30
50
|
process.stdout.write(` ${theme.accent(String(index + 1).padStart(2))} ${label(item)}\n`);
|
|
31
51
|
});
|
|
32
|
-
const
|
|
33
|
-
const answer = (await rl.question(`\n ${theme.dim(`Number [1-${items.length}]`)} `)).trim();
|
|
34
|
-
rl.close();
|
|
52
|
+
const answer = await ask(`\n ${theme.dim(`Number [1-${items.length}]`)} `);
|
|
35
53
|
const picked = items[Number(answer) - 1];
|
|
36
54
|
if (!picked)
|
|
37
55
|
throw new InvalidChoiceError(answer);
|
|
@@ -108,4 +126,147 @@ export function interactiveSelect({ items, prompt, label, theme, input, output }
|
|
|
108
126
|
input.on("data", onData);
|
|
109
127
|
});
|
|
110
128
|
}
|
|
129
|
+
function parseMultiKey(sequence) {
|
|
130
|
+
if (sequence === "\u0003" || sequence === "\u001b")
|
|
131
|
+
return { kind: "cancel" };
|
|
132
|
+
if (sequence === "\r" || sequence === "\n" || sequence === "\r\n")
|
|
133
|
+
return { kind: "confirm" };
|
|
134
|
+
if (sequence === " ")
|
|
135
|
+
return { kind: "toggle" };
|
|
136
|
+
if (sequence === "a" || sequence === "A")
|
|
137
|
+
return { kind: "all" };
|
|
138
|
+
if (sequence === "n" || sequence === "N")
|
|
139
|
+
return { kind: "none_of_them" };
|
|
140
|
+
if (sequence === "\u001b[A" || sequence === "\u001bOA" || sequence === "k") {
|
|
141
|
+
return { kind: "move", delta: -1 };
|
|
142
|
+
}
|
|
143
|
+
if (sequence === "\u001b[B" || sequence === "\u001bOB" || sequence === "j") {
|
|
144
|
+
return { kind: "move", delta: 1 };
|
|
145
|
+
}
|
|
146
|
+
return { kind: "none" };
|
|
147
|
+
}
|
|
148
|
+
// Rows are redrawn by moving the cursor up a fixed number of lines, so every
|
|
149
|
+
// row has to occupy exactly one line. Agent descriptions are free text from the
|
|
150
|
+
// studio, so they are flattened and cut to the terminal width.
|
|
151
|
+
function oneLine(text, width) {
|
|
152
|
+
const flat = text.replace(/\s+/g, " ").trim();
|
|
153
|
+
return flat.length <= width ? flat : `${flat.slice(0, Math.max(1, width - 1))}…`;
|
|
154
|
+
}
|
|
155
|
+
// Checkbox selection: space toggles, enter confirms. Returns the ticked items,
|
|
156
|
+
// which may legitimately be none — "none" means "do not narrow", and the
|
|
157
|
+
// caller decides what that implies.
|
|
158
|
+
export function multiSelect({ items, prompt, label, theme, input, output, selected, viewport, columns, }) {
|
|
159
|
+
if (items.length === 0) {
|
|
160
|
+
return Promise.reject(new Error("there is nothing to select from"));
|
|
161
|
+
}
|
|
162
|
+
const width = Math.max(20, (columns ?? process.stdout.columns ?? 80) - 8);
|
|
163
|
+
// Leave room for the blank line, the prompt, the blank line and the footer.
|
|
164
|
+
const rows = Math.max(1, Math.min(items.length, viewport ?? Math.max(1, (process.stdout.rows ?? 24) - 5)));
|
|
165
|
+
const windowed = rows < items.length;
|
|
166
|
+
const painted = windowed ? rows + 1 : rows;
|
|
167
|
+
return new Promise((resolve, reject) => {
|
|
168
|
+
let highlighted = 0;
|
|
169
|
+
let top = 0;
|
|
170
|
+
const ticked = items.map((item) => (selected ? selected(item) : false));
|
|
171
|
+
const row = (index) => {
|
|
172
|
+
const box = ticked[index] ? theme.ok("[x]") : theme.dim("[ ]");
|
|
173
|
+
const text = oneLine(label(items[index]), width);
|
|
174
|
+
return index === highlighted
|
|
175
|
+
? ` ${theme.accent("❯")} ${box} ${theme.bold(text)}`
|
|
176
|
+
: ` ${box} ${text}`;
|
|
177
|
+
};
|
|
178
|
+
const scroll = () => {
|
|
179
|
+
if (highlighted < top)
|
|
180
|
+
top = highlighted;
|
|
181
|
+
else if (highlighted >= top + rows)
|
|
182
|
+
top = highlighted - rows + 1;
|
|
183
|
+
top = Math.max(0, Math.min(top, items.length - rows));
|
|
184
|
+
};
|
|
185
|
+
const paintItems = () => {
|
|
186
|
+
scroll();
|
|
187
|
+
for (let offset = 0; offset < rows; offset += 1) {
|
|
188
|
+
output.write(`\r\u001b[2K${row(top + offset)}\n`);
|
|
189
|
+
}
|
|
190
|
+
if (windowed) {
|
|
191
|
+
output.write(`\r\u001b[2K ${theme.dim(`${highlighted + 1}/${items.length}`)}\n`);
|
|
192
|
+
}
|
|
193
|
+
};
|
|
194
|
+
const repaint = () => {
|
|
195
|
+
output.write(`\u001b[${painted}A`);
|
|
196
|
+
paintItems();
|
|
197
|
+
};
|
|
198
|
+
const finish = () => {
|
|
199
|
+
input.off("data", onData);
|
|
200
|
+
input.setRawMode?.(false);
|
|
201
|
+
input.pause?.();
|
|
202
|
+
output.write(`\u001b[${painted + 3}A\r\u001b[J`);
|
|
203
|
+
output.write("\u001b[?25h");
|
|
204
|
+
};
|
|
205
|
+
const onData = (chunk) => {
|
|
206
|
+
const action = parseMultiKey(chunk.toString());
|
|
207
|
+
if (action.kind === "move") {
|
|
208
|
+
highlighted = (highlighted + action.delta + items.length) % items.length;
|
|
209
|
+
repaint();
|
|
210
|
+
}
|
|
211
|
+
else if (action.kind === "toggle") {
|
|
212
|
+
ticked[highlighted] = !ticked[highlighted];
|
|
213
|
+
repaint();
|
|
214
|
+
}
|
|
215
|
+
else if (action.kind === "all") {
|
|
216
|
+
ticked.fill(true);
|
|
217
|
+
repaint();
|
|
218
|
+
}
|
|
219
|
+
else if (action.kind === "none_of_them") {
|
|
220
|
+
ticked.fill(false);
|
|
221
|
+
repaint();
|
|
222
|
+
}
|
|
223
|
+
else if (action.kind === "confirm") {
|
|
224
|
+
finish();
|
|
225
|
+
resolve(items.filter((_item, index) => ticked[index]));
|
|
226
|
+
}
|
|
227
|
+
else if (action.kind === "cancel") {
|
|
228
|
+
finish();
|
|
229
|
+
reject(new SelectCancelledError());
|
|
230
|
+
}
|
|
231
|
+
};
|
|
232
|
+
output.write("\u001b[?25l");
|
|
233
|
+
output.write(`\n ${theme.bold(prompt)} ${theme.dim("↑/↓ move · space select · a all · n none · enter save")}\n\n`);
|
|
234
|
+
paintItems();
|
|
235
|
+
input.setRawMode?.(true);
|
|
236
|
+
input.resume?.();
|
|
237
|
+
input.on("data", onData);
|
|
238
|
+
});
|
|
239
|
+
}
|
|
240
|
+
// Terminal picker when there is one, a numbered list everywhere else.
|
|
241
|
+
export async function chooseManyFrom({ items, prompt, label, theme, selected, }) {
|
|
242
|
+
if (process.stdin.isTTY && process.stdout.isTTY) {
|
|
243
|
+
return multiSelect({
|
|
244
|
+
items,
|
|
245
|
+
prompt,
|
|
246
|
+
label,
|
|
247
|
+
theme,
|
|
248
|
+
input: process.stdin,
|
|
249
|
+
output: process.stdout,
|
|
250
|
+
...(selected ? { selected } : {}),
|
|
251
|
+
});
|
|
252
|
+
}
|
|
253
|
+
process.stdout.write(`\n ${theme.bold(prompt)}\n\n`);
|
|
254
|
+
items.forEach((item, index) => {
|
|
255
|
+
const mark = selected?.(item) ? theme.ok("x") : " ";
|
|
256
|
+
process.stdout.write(` ${theme.accent(String(index + 1).padStart(2))} [${mark}] ${label(item)}\n`);
|
|
257
|
+
});
|
|
258
|
+
const answer = await ask(`\n ${theme.dim(`Numbers, comma separated, or blank for all [1-${items.length}]`)} `);
|
|
259
|
+
if (!answer)
|
|
260
|
+
return [];
|
|
261
|
+
const picked = [];
|
|
262
|
+
for (const part of answer.split(",")) {
|
|
263
|
+
const index = Number(part.trim()) - 1;
|
|
264
|
+
const item = items[index];
|
|
265
|
+
if (!item)
|
|
266
|
+
throw new InvalidChoiceError(part.trim());
|
|
267
|
+
if (!picked.includes(item))
|
|
268
|
+
picked.push(item);
|
|
269
|
+
}
|
|
270
|
+
return picked;
|
|
271
|
+
}
|
|
111
272
|
//# sourceMappingURL=select.js.map
|
package/dist/select.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"select.js","sourceRoot":"","sources":["../src/select.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"select.js","sourceRoot":"","sources":["../src/select.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAIzD,MAAM,OAAO,oBAAqB,SAAQ,KAAK;IAC3B,IAAI,GAAG,sBAAsB,CAAC;IAEhD;QACE,KAAK,CAAC,qBAAqB,CAAC,CAAC;IAC/B,CAAC;CACF;AAED,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IACzB,IAAI,GAAG,oBAAoB,CAAC;IACrC,MAAM,CAAS;IAExB,YAAY,MAAc;QACxB,KAAK,CAAC,IAAI,MAAM,qCAAqC,CAAC,CAAC;QACvD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;CACF;AAED,MAAM,OAAO,YAAa,SAAQ,KAAK;IACnB,IAAI,GAAG,cAAc,CAAC;IAExC;QACE,KAAK,CAAC,wDAAwD,CAAC,CAAC;IAClE,CAAC;CACF;AAED,yEAAyE;AACzE,oEAAoE;AACpE,KAAK,UAAU,GAAG,CAAC,MAAc;IAC/B,MAAM,EAAE,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC7E,IAAI,CAAC;QACH,OAAO,MAAM,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACnD,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,YAAY,EAAE,CAAC,CAAC,CAAC;YACnD,KAAK,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IACrC,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC;AACH,CAAC;AAED,wEAAwE;AACxE,MAAM,CAAC,KAAK,UAAU,UAAU,CAAI,EAClC,KAAK,EACL,MAAM,EACN,KAAK,EACL,KAAK,GAMN;IACC,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAChD,OAAO,iBAAiB,CAAC;YACvB,KAAK;YACL,MAAM;YACN,KAAK;YACL,KAAK;YACL,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,CAAC,CAAC;IACL,CAAC;IAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACtD,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QAC5B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/F,CAAC,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,OAAO,KAAK,CAAC,GAAG,CAAC,aAAa,KAAK,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC;IAC5E,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IACzC,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAClD,OAAO,MAAM,CAAC;AAChB,CAAC;AA8BD,SAAS,QAAQ,CAAC,QAAgB,EAAE,KAAa;IAC/C,IAAI,QAAQ,KAAK,GAAG,IAAI,QAAQ,KAAK,GAAG;QAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IACpE,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,KAAK,MAAM;QAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;IAC9F,IAAI,QAAQ,KAAK,KAAK,IAAI,QAAQ,KAAK,KAAK,IAAI,QAAQ,KAAK,GAAG;QAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC;IACrG,IAAI,QAAQ,KAAK,KAAK,IAAI,QAAQ,KAAK,KAAK,IAAI,QAAQ,KAAK,GAAG;QAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;IACpG,IAAI,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,KAAK,GAAG,KAAK;YAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IACpD,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAI,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAoB;IACnG,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC,CAAC;IACtE,CAAC;IAED,OAAO,IAAI,OAAO,CAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACxC,IAAI,WAAW,GAAG,CAAC,CAAC;QAEpB,MAAM,GAAG,GAAG,CAAC,KAAa,EAAU,EAAE;YACpC,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAM,CAAC,CAAC;YACtC,OAAO,KAAK,KAAK,WAAW,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC;QAC9F,CAAC,CAAC;QAEF,MAAM,UAAU,GAAG,GAAS,EAAE;YAC5B,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;gBACrD,MAAM,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACxC,CAAC;QACH,CAAC,CAAC;QAEF,MAAM,OAAO,GAAG,GAAS,EAAE;YACzB,MAAM,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;YACnC,UAAU,EAAE,CAAC;QACf,CAAC,CAAC;QAEF,0EAA0E;QAC1E,6EAA6E;QAC7E,MAAM,MAAM,GAAG,GAAS,EAAE;YACxB,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAC1B,KAAK,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC;YAC1B,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;YAChB,MAAM,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,MAAM,GAAG,CAAC,QAAQ,CAAC,CAAC;YAC5C,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACzB,CAAC,CAAC;QAEF,MAAM,MAAM,GAAG,CAAC,KAAsB,EAAQ,EAAE;YAC9C,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;YACxD,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBAC3B,WAAW,GAAG,CAAC,WAAW,GAAG,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC;gBACzE,OAAO,EAAE,CAAC;YACZ,CAAC;iBAAM,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBAClC,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC;gBAC3B,OAAO,EAAE,CAAC;YACZ,CAAC;iBAAM,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBACrC,MAAM,EAAE,CAAC;gBACT,OAAO,CAAC,KAAK,CAAC,WAAW,CAAM,CAAC,CAAC;YACnC,CAAC;iBAAM,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACpC,MAAM,EAAE,CAAC;gBACT,MAAM,CAAC,IAAI,oBAAoB,EAAE,CAAC,CAAC;YACrC,CAAC;QACH,CAAC,CAAC;QAEF,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACvB,MAAM,CAAC,KAAK,CAAC,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;QAC7E,UAAU,EAAE,CAAC;QAEb,KAAK,CAAC,UAAU,EAAE,CAAC,IAAI,CAAC,CAAC;QACzB,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;QACjB,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;AACL,CAAC;AAWD,SAAS,aAAa,CAAC,QAAgB;IACrC,IAAI,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,QAAQ;QAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IAC9E,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,KAAK,MAAM;QAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;IAC9F,IAAI,QAAQ,KAAK,GAAG;QAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IAChD,IAAI,QAAQ,KAAK,GAAG,IAAI,QAAQ,KAAK,GAAG;QAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IACjE,IAAI,QAAQ,KAAK,GAAG,IAAI,QAAQ,KAAK,GAAG;QAAE,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC;IAC1E,IAAI,QAAQ,KAAK,UAAU,IAAI,QAAQ,KAAK,UAAU,IAAI,QAAQ,KAAK,GAAG,EAAE,CAAC;QAC3E,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC;IACrC,CAAC;IACD,IAAI,QAAQ,KAAK,UAAU,IAAI,QAAQ,KAAK,UAAU,IAAI,QAAQ,KAAK,GAAG,EAAE,CAAC;QAC3E,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;IACpC,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AAC1B,CAAC;AAED,6EAA6E;AAC7E,gFAAgF;AAChF,+DAA+D;AAC/D,SAAS,OAAO,CAAC,IAAY,EAAE,KAAa;IAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAC9C,OAAO,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;AACnF,CAAC;AAYD,+EAA+E;AAC/E,yEAAyE;AACzE,oCAAoC;AACpC,MAAM,UAAU,WAAW,CAAI,EAC7B,KAAK,EACL,MAAM,EACN,KAAK,EACL,KAAK,EACL,KAAK,EACL,MAAM,EACN,QAAQ,EACR,QAAQ,EACR,OAAO,GACe;IACtB,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC,CAAC;IACtE,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1E,4EAA4E;IAC5E,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CACnB,CAAC,EACD,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,QAAQ,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CACjF,CAAC;IACF,MAAM,QAAQ,GAAG,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC;IACrC,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAE3C,OAAO,IAAI,OAAO,CAAM,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC1C,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,IAAI,GAAG,GAAG,CAAC,CAAC;QACZ,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;QAExE,MAAM,GAAG,GAAG,CAAC,KAAa,EAAU,EAAE;YACpC,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAC/D,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAM,CAAC,EAAE,KAAK,CAAC,CAAC;YACtD,OAAO,KAAK,KAAK,WAAW;gBAC1B,CAAC,CAAC,KAAK,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;gBACrD,CAAC,CAAC,OAAO,GAAG,IAAI,IAAI,EAAE,CAAC;QAC3B,CAAC,CAAC;QAEF,MAAM,MAAM,GAAG,GAAS,EAAE;YACxB,IAAI,WAAW,GAAG,GAAG;gBAAE,GAAG,GAAG,WAAW,CAAC;iBACpC,IAAI,WAAW,IAAI,GAAG,GAAG,IAAI;gBAAE,GAAG,GAAG,WAAW,GAAG,IAAI,GAAG,CAAC,CAAC;YACjE,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC;QACxD,CAAC,CAAC;QAEF,MAAM,UAAU,GAAG,GAAS,EAAE;YAC5B,MAAM,EAAE,CAAC;YACT,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,EAAE,MAAM,IAAI,CAAC,EAAE,CAAC;gBAChD,MAAM,CAAC,KAAK,CAAC,cAAc,GAAG,CAAC,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;YACpD,CAAC;YACD,IAAI,QAAQ,EAAE,CAAC;gBACb,MAAM,CAAC,KAAK,CAAC,kBAAkB,KAAK,CAAC,GAAG,CAAC,GAAG,WAAW,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC;YACtF,CAAC;QACH,CAAC,CAAC;QAEF,MAAM,OAAO,GAAG,GAAS,EAAE;YACzB,MAAM,CAAC,KAAK,CAAC,UAAU,OAAO,GAAG,CAAC,CAAC;YACnC,UAAU,EAAE,CAAC;QACf,CAAC,CAAC;QAEF,MAAM,MAAM,GAAG,GAAS,EAAE;YACxB,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAC1B,KAAK,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC;YAC1B,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;YAChB,MAAM,CAAC,KAAK,CAAC,UAAU,OAAO,GAAG,CAAC,aAAa,CAAC,CAAC;YACjD,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QAC9B,CAAC,CAAC;QAEF,MAAM,MAAM,GAAG,CAAC,KAAsB,EAAQ,EAAE;YAC9C,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC/C,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBAC3B,WAAW,GAAG,CAAC,WAAW,GAAG,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC;gBACzE,OAAO,EAAE,CAAC;YACZ,CAAC;iBAAM,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACpC,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;gBAC3C,OAAO,EAAE,CAAC;YACZ,CAAC;iBAAM,IAAI,MAAM,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;gBACjC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAClB,OAAO,EAAE,CAAC;YACZ,CAAC;iBAAM,IAAI,MAAM,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;gBAC1C,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACnB,OAAO,EAAE,CAAC;YACZ,CAAC;iBAAM,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBACrC,MAAM,EAAE,CAAC;gBACT,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACzD,CAAC;iBAAM,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACpC,MAAM,EAAE,CAAC;gBACT,MAAM,CAAC,IAAI,oBAAoB,EAAE,CAAC,CAAC;YACrC,CAAC;QACH,CAAC,CAAC;QAEF,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QAC5B,MAAM,CAAC,KAAK,CACV,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,uDAAuD,CAAC,MAAM,CACtG,CAAC;QACF,UAAU,EAAE,CAAC;QAEb,KAAK,CAAC,UAAU,EAAE,CAAC,IAAI,CAAC,CAAC;QACzB,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;QACjB,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;AACL,CAAC;AAED,sEAAsE;AACtE,MAAM,CAAC,KAAK,UAAU,cAAc,CAAI,EACtC,KAAK,EACL,MAAM,EACN,KAAK,EACL,KAAK,EACL,QAAQ,GAOT;IACC,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAChD,OAAO,WAAW,CAAC;YACjB,KAAK;YACL,MAAM;YACN,KAAK;YACL,KAAK;YACL,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAClC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACtD,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QAC5B,MAAM,IAAI,GAAG,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QACpD,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,OAAO,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,CAChF,CAAC;IACJ,CAAC,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,MAAM,GAAG,CACtB,OAAO,KAAK,CAAC,GAAG,CAAC,iDAAiD,KAAK,CAAC,MAAM,GAAG,CAAC,GAAG,CACtF,CAAC;IAEF,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IAEvB,MAAM,MAAM,GAAQ,EAAE,CAAC;IACvB,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QACrC,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC;QACtC,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;QAC1B,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,kBAAkB,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QACrD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChD,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|