opencode-plugin-teleprompt 0.2.1 → 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +28 -8
- package/dist/opencode/events.d.ts +43 -1
- package/dist/opencode/events.js +374 -7
- package/dist/opencode/events.js.map +1 -1
- package/dist/opencode/permissions.d.ts +8 -2
- package/dist/opencode/permissions.js +95 -8
- package/dist/opencode/permissions.js.map +1 -1
- package/dist/runtime/controller.d.ts +38 -3
- package/dist/runtime/controller.js +517 -24
- package/dist/runtime/controller.js.map +1 -1
- package/dist/state/store.js +52 -0
- package/dist/state/store.js.map +1 -1
- package/dist/summary/format.js +1 -1
- package/dist/summary/format.js.map +1 -1
- package/dist/telegram/api.d.ts +32 -3
- package/dist/telegram/api.js +49 -6
- package/dist/telegram/api.js.map +1 -1
- package/dist/telegram/callback.d.ts +47 -0
- package/dist/telegram/callback.js +195 -0
- package/dist/telegram/callback.js.map +1 -0
- package/dist/telegram/parser.d.ts +3 -2
- package/dist/telegram/parser.js +129 -0
- package/dist/telegram/parser.js.map +1 -1
- package/dist/telegram/poller.d.ts +4 -2
- package/dist/telegram/poller.js +23 -6
- package/dist/telegram/poller.js.map +1 -1
- package/dist/types.d.ts +84 -1
- package/package.json +3 -1
package/README.md
CHANGED
|
@@ -8,6 +8,8 @@ TUI-scoped OpenCode plugin that binds a Telegram channel to one active OpenCode
|
|
|
8
8
|
- **Direct Slash Commands**: Run administrative commands like `/status`, `/queue`, `/dc` or `/approve <id>` directly in the Telegram channel.
|
|
9
9
|
- **Backward Compatibility**: Fully supports old `/tp <prompt>` and `/tp:<command>` syntax out of the box.
|
|
10
10
|
- **Relays Permission Prompts**: Directly relays OpenCode permission requests and accepts direct `/approve`, `/approve-always`, and `/deny` replies.
|
|
11
|
+
- **Inline Keyboards For Approvals**: Permission prompts arrive as Telegram messages with `Approve once` / `Approve always` / `Deny` buttons — no typing required.
|
|
12
|
+
- **Relays OpenCode Questions**: When the agent asks the user a question (via the OpenCode `question` tool), teleprompt posts it to Telegram with inline option buttons (single-choice direct, multi-choice with toggle+confirm). Tap to reply, or fall back to `/qreply`/`/qreject` text commands.
|
|
11
13
|
- **Lease-based Owner Semantics**: Keeps single-owner bridge semantics across multiple OpenCode consoles.
|
|
12
14
|
- **Instant Ctrl+C Exit**: Stops event streams and cleans up instantly, ensuring no exit lags when shutting down OpenCode.
|
|
13
15
|
|
|
@@ -90,10 +92,12 @@ OpenCode installs npm plugins automatically at startup.
|
|
|
90
92
|
- `/model smart` (or `/tp:model smart`)
|
|
91
93
|
- `/model max` (or `/tp:model max`)
|
|
92
94
|
- `/model <provider>/<model>`
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
95
|
+
- `/approve <request_id>`
|
|
96
|
+
- `/approve-always <request_id>`
|
|
97
|
+
- `/deny <request_id>`
|
|
98
|
+
- `/qreply <request_id>` (then `<index>:<label1>|<label2>` lines for each question)
|
|
99
|
+
- `/qreject <request_id>`
|
|
100
|
+
- `/status`
|
|
97
101
|
- `/dc` (or `/tp:dc`)
|
|
98
102
|
|
|
99
103
|
During remote runs, teleprompt posts lifecycle updates (`accepted`, `queued`, `running`, `waiting-permission`, `completed`, `failed`) and result summaries are sent as replies to the originating Telegram message for clear correlation.
|
|
@@ -133,10 +137,21 @@ During remote runs, teleprompt posts lifecycle updates (`accepted`, `queued`, `r
|
|
|
133
137
|
- `accepted` -> `running` -> `completed`
|
|
134
138
|
- summary arrives as reply to the same Telegram message
|
|
135
139
|
5. Trigger a permissioned action prompt and verify:
|
|
136
|
-
- plugin posts permission request with `
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
+
- plugin posts a permission request message with `Approve once`,
|
|
141
|
+
`Approve always`, and `Deny` inline buttons
|
|
142
|
+
- tapping a button (or typing `/approve <request_id>` / `/deny <request_id>`)
|
|
143
|
+
applies the reply via the OpenCode SDK and removes the buttons
|
|
144
|
+
6. Trigger an OpenCode question (e.g. "what's the goal?") and verify:
|
|
145
|
+
- plugin posts a `waiting-question` notice and the question with
|
|
146
|
+
inline option buttons
|
|
147
|
+
- single-choice: tapping an option button replies via
|
|
148
|
+
`client.question.reply` and removes the buttons
|
|
149
|
+
- multi-choice: toggling options marks them with ✅ and a `Confirm`
|
|
150
|
+
button finalizes the reply with all selected labels
|
|
151
|
+
- text fallback: `/qreply <request_id>` with one
|
|
152
|
+
`<index>:<label1>|<label2>` line per question
|
|
153
|
+
7. Send `/interrupt` during a long run and confirm graceful stop.
|
|
154
|
+
8. Send `/dc` and confirm disconnect/unlock behavior.
|
|
140
155
|
|
|
141
156
|
## Command Reference
|
|
142
157
|
|
|
@@ -172,6 +187,11 @@ During remote runs, teleprompt posts lifecycle updates (`accepted`, `queued`, `r
|
|
|
172
187
|
- `/approve <request_id>`: Approve a pending permission request once.
|
|
173
188
|
- `/approve-always <request_id>`: Approve a pending permission request and persist approval behavior when supported.
|
|
174
189
|
- `/deny <request_id>`: Reject a pending permission request.
|
|
190
|
+
- `/qreply <request_id>`: Answer an OpenCode question. Follow with one line per
|
|
191
|
+
question in the form `<index>:<label1>|<label2>`. Only known option labels
|
|
192
|
+
are accepted; unknown labels are dropped. As a fallback to the inline
|
|
193
|
+
keyboard buttons, you can also use this for single-choice questions.
|
|
194
|
+
- `/qreject <request_id>`: Reject an OpenCode question without answering it.
|
|
175
195
|
- `/status`: Show bridge status from Telegram.
|
|
176
196
|
- `/dc`: Disconnect teleprompt from Telegram and unbind the current session.
|
|
177
197
|
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { QuestionInfo } from "../types.js";
|
|
1
2
|
type EventHandlers = {
|
|
2
3
|
onAssistantCompleted: (sessionID: string, assistantMessageID: string, parentUserMessageID: string) => Promise<void>;
|
|
3
4
|
onPermissionAsked: (event: {
|
|
@@ -7,6 +8,24 @@ type EventHandlers = {
|
|
|
7
8
|
patterns: string[];
|
|
8
9
|
metadata: Record<string, unknown>;
|
|
9
10
|
}) => Promise<void>;
|
|
11
|
+
onPermissionReplied?: (requestID: string) => Promise<void>;
|
|
12
|
+
onQuestionAsked?: (event: {
|
|
13
|
+
id: string;
|
|
14
|
+
sessionID: string;
|
|
15
|
+
questions: QuestionInfo[];
|
|
16
|
+
tool?: {
|
|
17
|
+
messageID: string;
|
|
18
|
+
callID: string;
|
|
19
|
+
};
|
|
20
|
+
}) => Promise<void>;
|
|
21
|
+
onQuestionReplied?: (event: {
|
|
22
|
+
id: string;
|
|
23
|
+
sessionID: string;
|
|
24
|
+
}) => Promise<void>;
|
|
25
|
+
onQuestionRejected?: (event: {
|
|
26
|
+
id: string;
|
|
27
|
+
sessionID: string;
|
|
28
|
+
}) => Promise<void>;
|
|
10
29
|
onSessionError: (event: {
|
|
11
30
|
sessionID?: string;
|
|
12
31
|
error?: {
|
|
@@ -14,19 +33,42 @@ type EventHandlers = {
|
|
|
14
33
|
};
|
|
15
34
|
}) => Promise<void>;
|
|
16
35
|
onUserMessage: (sessionID: string, userMessageID: string) => Promise<void>;
|
|
36
|
+
onMessagePartUpdated?: (input: {
|
|
37
|
+
sessionID: string;
|
|
38
|
+
messageID: string;
|
|
39
|
+
part: {
|
|
40
|
+
type: string;
|
|
41
|
+
text?: string;
|
|
42
|
+
[key: string]: unknown;
|
|
43
|
+
};
|
|
44
|
+
delta?: string;
|
|
45
|
+
}) => Promise<void>;
|
|
17
46
|
onStreamError?: (error: unknown) => Promise<void>;
|
|
18
47
|
};
|
|
19
48
|
export declare class SessionEventStream {
|
|
20
49
|
private readonly client;
|
|
21
50
|
private readonly sessionID;
|
|
51
|
+
private readonly directory;
|
|
22
52
|
private readonly handlers;
|
|
53
|
+
private readonly debugLog?;
|
|
23
54
|
private abort;
|
|
24
55
|
private running?;
|
|
25
56
|
private stream?;
|
|
26
|
-
|
|
57
|
+
private pollTimer?;
|
|
58
|
+
constructor(client: any, sessionID: string, directory: string, handlers: EventHandlers, debugLog?: ((message: string) => void) | undefined);
|
|
59
|
+
/** Exposed for testing */
|
|
60
|
+
__test?: {
|
|
61
|
+
pollQuestionListOnce: () => Promise<void>;
|
|
62
|
+
seenForwardedQuestionCalls: Set<string>;
|
|
63
|
+
};
|
|
27
64
|
start(): void;
|
|
28
65
|
stop(): Promise<void>;
|
|
66
|
+
private startQuestionPoller;
|
|
67
|
+
private pollQuestionListOnce;
|
|
29
68
|
private loop;
|
|
30
69
|
private handleEvent;
|
|
70
|
+
private readonly seenForwardedQuestionCalls;
|
|
71
|
+
private handleQuestionToolPart;
|
|
72
|
+
private pollQuestionList;
|
|
31
73
|
}
|
|
32
74
|
export {};
|
package/dist/opencode/events.js
CHANGED
|
@@ -1,26 +1,87 @@
|
|
|
1
|
+
function normalizePatterns(pattern) {
|
|
2
|
+
if (!pattern)
|
|
3
|
+
return [];
|
|
4
|
+
if (Array.isArray(pattern))
|
|
5
|
+
return pattern;
|
|
6
|
+
return [pattern];
|
|
7
|
+
}
|
|
8
|
+
function normalizeQuestions(raw) {
|
|
9
|
+
if (!Array.isArray(raw))
|
|
10
|
+
return [];
|
|
11
|
+
return raw
|
|
12
|
+
.map((entry) => {
|
|
13
|
+
if (!entry || typeof entry !== "object")
|
|
14
|
+
return undefined;
|
|
15
|
+
const item = entry;
|
|
16
|
+
const question = typeof item.question === "string" ? item.question : "";
|
|
17
|
+
const header = typeof item.header === "string" ? item.header : "";
|
|
18
|
+
const rawOptions = Array.isArray(item.options) ? item.options : [];
|
|
19
|
+
const options = rawOptions
|
|
20
|
+
.map((opt) => {
|
|
21
|
+
if (!opt || typeof opt !== "object")
|
|
22
|
+
return undefined;
|
|
23
|
+
const o = opt;
|
|
24
|
+
const label = typeof o.label === "string" ? o.label : "";
|
|
25
|
+
if (!label)
|
|
26
|
+
return undefined;
|
|
27
|
+
const description = typeof o.description === "string" ? o.description : "";
|
|
28
|
+
return { label, description };
|
|
29
|
+
})
|
|
30
|
+
.filter((opt) => Boolean(opt));
|
|
31
|
+
if (!question)
|
|
32
|
+
return undefined;
|
|
33
|
+
const info = {
|
|
34
|
+
question,
|
|
35
|
+
header,
|
|
36
|
+
options,
|
|
37
|
+
};
|
|
38
|
+
if (item.multiple === true)
|
|
39
|
+
info.multiple = true;
|
|
40
|
+
if (item.custom === true)
|
|
41
|
+
info.custom = true;
|
|
42
|
+
return info;
|
|
43
|
+
})
|
|
44
|
+
.filter((item) => Boolean(item));
|
|
45
|
+
}
|
|
1
46
|
export class SessionEventStream {
|
|
2
47
|
client;
|
|
3
48
|
sessionID;
|
|
49
|
+
directory;
|
|
4
50
|
handlers;
|
|
51
|
+
debugLog;
|
|
5
52
|
abort = new AbortController();
|
|
6
53
|
running;
|
|
7
54
|
stream;
|
|
8
|
-
|
|
55
|
+
pollTimer;
|
|
56
|
+
constructor(client, sessionID, directory, handlers, debugLog) {
|
|
9
57
|
this.client = client;
|
|
10
58
|
this.sessionID = sessionID;
|
|
59
|
+
this.directory = directory;
|
|
11
60
|
this.handlers = handlers;
|
|
61
|
+
this.debugLog = debugLog;
|
|
12
62
|
}
|
|
63
|
+
/** Exposed for testing */
|
|
64
|
+
__test;
|
|
13
65
|
start() {
|
|
14
66
|
if (this.running)
|
|
15
67
|
return;
|
|
68
|
+
this.debugLog?.(`start: subscribing to event stream for sessionID=${this.sessionID}`);
|
|
69
|
+
this.__test = {
|
|
70
|
+
pollQuestionListOnce: () => this.pollQuestionListOnce(),
|
|
71
|
+
seenForwardedQuestionCalls: this.seenForwardedQuestionCalls,
|
|
72
|
+
};
|
|
73
|
+
this.startQuestionPoller();
|
|
16
74
|
this.running = this.loop().catch(async (error) => {
|
|
17
75
|
if (this.abort.signal.aborted)
|
|
18
76
|
return;
|
|
77
|
+
this.debugLog?.(`loop error: ${String(error)}`);
|
|
19
78
|
await this.handlers.onStreamError?.(error);
|
|
20
79
|
});
|
|
21
80
|
}
|
|
22
81
|
async stop() {
|
|
23
82
|
this.abort.abort();
|
|
83
|
+
clearTimeout(this.pollTimer);
|
|
84
|
+
this.pollTimer = undefined;
|
|
24
85
|
try {
|
|
25
86
|
if (this.stream && typeof this.stream.return === "function") {
|
|
26
87
|
await this.stream.return();
|
|
@@ -32,16 +93,153 @@ export class SessionEventStream {
|
|
|
32
93
|
await this.running;
|
|
33
94
|
this.running = undefined;
|
|
34
95
|
}
|
|
96
|
+
startQuestionPoller() {
|
|
97
|
+
if (this.pollTimer)
|
|
98
|
+
return;
|
|
99
|
+
const poll = () => {
|
|
100
|
+
this.pollTimer = setTimeout(async () => {
|
|
101
|
+
if (this.abort.signal.aborted)
|
|
102
|
+
return;
|
|
103
|
+
try {
|
|
104
|
+
await this.pollQuestionListOnce();
|
|
105
|
+
}
|
|
106
|
+
catch (err) {
|
|
107
|
+
this.debugLog?.(`question poll timer error: ${String(err)}`);
|
|
108
|
+
}
|
|
109
|
+
if (!this.abort.signal.aborted)
|
|
110
|
+
poll();
|
|
111
|
+
}, 2000);
|
|
112
|
+
this.pollTimer.unref?.();
|
|
113
|
+
};
|
|
114
|
+
poll();
|
|
115
|
+
}
|
|
116
|
+
async pollQuestionListOnce() {
|
|
117
|
+
if (!this.client?.question?.list) {
|
|
118
|
+
this.debugLog?.("poll: client.question.list is not available");
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
this.debugLog?.(`poll: checking question.list() [sessionID=${this.sessionID}]`);
|
|
122
|
+
let result;
|
|
123
|
+
try {
|
|
124
|
+
result = await this.client.question.list();
|
|
125
|
+
}
|
|
126
|
+
catch (err) {
|
|
127
|
+
this.debugLog?.(`poll: question.list() THREW: ${String(err)}`);
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
this.debugLog?.(`poll: question.list() returned type=${typeof result} isArray=${Array.isArray(result)}`);
|
|
131
|
+
const raw = result;
|
|
132
|
+
if (raw && typeof raw === "object") {
|
|
133
|
+
const keys = Object.keys(raw);
|
|
134
|
+
this.debugLog?.(`poll: result keys=[${keys.join(",")}]`);
|
|
135
|
+
if (raw.data !== undefined) {
|
|
136
|
+
this.debugLog?.(`poll: result.data type=${typeof raw.data} isArray=${Array.isArray(raw.data)} length=${Array.isArray(raw.data) ? raw.data.length : "N/A"}`);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
const items = Array.isArray(result) ? result : Array.isArray(result?.data) ? result.data : [];
|
|
140
|
+
this.debugLog?.(`poll: extracted ${items.length} items`);
|
|
141
|
+
if (items.length > 0) {
|
|
142
|
+
for (const item of items) {
|
|
143
|
+
this.debugLog?.(`poll: item id=${item.id} sessionID=${item.sessionID} matchSession=${item.sessionID === this.sessionID} alreadySeen=${this.seenForwardedQuestionCalls.has(item.id)}`);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
const match = items.find((q) => q.sessionID === this.sessionID && !this.seenForwardedQuestionCalls.has(q.id));
|
|
147
|
+
if (!match) {
|
|
148
|
+
this.debugLog?.("poll: no matching question found");
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
this.debugLog?.(`poll: match found id=${match.id} questionsRaw=${JSON.stringify(match.questions)}`);
|
|
152
|
+
const questions = normalizeQuestions(match.questions);
|
|
153
|
+
this.debugLog?.(`poll: normalized questions count=${questions.length}`);
|
|
154
|
+
if (questions.length === 0)
|
|
155
|
+
return;
|
|
156
|
+
this.seenForwardedQuestionCalls.add(match.id);
|
|
157
|
+
this.debugLog?.(`forward: question poll id=${match.id} sessionID=${this.sessionID} questions=${questions.length}`);
|
|
158
|
+
if (this.handlers.onQuestionAsked) {
|
|
159
|
+
await this.handlers.onQuestionAsked({
|
|
160
|
+
id: match.id,
|
|
161
|
+
sessionID: this.sessionID,
|
|
162
|
+
questions,
|
|
163
|
+
tool: match.tool,
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
}
|
|
35
167
|
async loop() {
|
|
36
|
-
|
|
168
|
+
this.debugLog?.(`subscribeGlobal: directory=${this.directory}`);
|
|
169
|
+
// Prefer client.event.subscribe({directory}) — this delivers directory-scoped
|
|
170
|
+
// events including permission.asked and question.asked.
|
|
171
|
+
// Fall back to client.global.event() if subscribe is not available
|
|
172
|
+
// (e.g., in tests with a fake client).
|
|
173
|
+
let streamResult;
|
|
174
|
+
if (typeof this.client?.event?.subscribe === "function") {
|
|
175
|
+
this.debugLog?.("loop: using client.event.subscribe()");
|
|
176
|
+
streamResult = await this.client.event.subscribe({ directory: this.directory }, {
|
|
177
|
+
responseStyle: "stream",
|
|
178
|
+
throwOnError: true,
|
|
179
|
+
signal: this.abort.signal,
|
|
180
|
+
onSseError: (error) => {
|
|
181
|
+
this.debugLog?.(`SSE error: ${String(error)}`);
|
|
182
|
+
},
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
else if (typeof this.client?.global?.event === "function") {
|
|
186
|
+
this.debugLog?.("loop: using client.global.event()");
|
|
187
|
+
streamResult = await this.client.global.event({
|
|
188
|
+
responseStyle: "stream",
|
|
189
|
+
throwOnError: true,
|
|
190
|
+
signal: this.abort.signal,
|
|
191
|
+
onSseError: (error) => {
|
|
192
|
+
this.debugLog?.(`SSE error: ${String(error)}`);
|
|
193
|
+
},
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
else {
|
|
197
|
+
this.debugLog?.("loop: no event subscription method available");
|
|
198
|
+
}
|
|
37
199
|
this.stream = streamResult?.stream;
|
|
200
|
+
if (!this.stream) {
|
|
201
|
+
this.debugLog?.("loop: stream is undefined, skipping for-await");
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
38
204
|
try {
|
|
39
|
-
for await (const
|
|
205
|
+
for await (const chunk of this.stream) {
|
|
40
206
|
if (this.abort.signal.aborted)
|
|
41
207
|
break;
|
|
42
|
-
if (!
|
|
208
|
+
if (!chunk || typeof chunk !== "object")
|
|
43
209
|
continue;
|
|
44
|
-
|
|
210
|
+
// global.event() may return chunks in these shapes:
|
|
211
|
+
// { data: [{ directory, payload: { type, properties } }, ...] }
|
|
212
|
+
// [{ directory, payload: { type, properties } }, ...]
|
|
213
|
+
// { directory, payload: { type, properties } }
|
|
214
|
+
// event.subscribe() returns events directly as { type, properties }
|
|
215
|
+
const rawList = Array.isArray(chunk)
|
|
216
|
+
? chunk
|
|
217
|
+
: Array.isArray(chunk.data)
|
|
218
|
+
? chunk.data
|
|
219
|
+
: chunk.payload
|
|
220
|
+
? [chunk]
|
|
221
|
+
: [chunk];
|
|
222
|
+
for (const raw of rawList) {
|
|
223
|
+
if (!raw || typeof raw !== "object")
|
|
224
|
+
continue;
|
|
225
|
+
const event = raw.payload
|
|
226
|
+
? { type: raw.payload.type, properties: raw.payload.properties, directory: raw.directory }
|
|
227
|
+
: raw;
|
|
228
|
+
if (!event.type)
|
|
229
|
+
continue;
|
|
230
|
+
// Filter by directory for global events (skip irrelevant ones)
|
|
231
|
+
const dir = event.directory;
|
|
232
|
+
if (dir && dir !== this.directory && event.type !== "permission.asked" && event.type !== "question.asked" && event.type !== "question.replied" && event.type !== "question.rejected" && event.type !== "session.error")
|
|
233
|
+
continue;
|
|
234
|
+
this.debugLog?.(`event: type=${event.type} sessionID=${event.properties?.sessionID ?? "?"} id=${event.properties?.id ?? event.properties?.requestID ?? "?"}`);
|
|
235
|
+
try {
|
|
236
|
+
await this.handleEvent(event);
|
|
237
|
+
}
|
|
238
|
+
catch (handlerError) {
|
|
239
|
+
// A misbehaving handler must never kill the entire event stream.
|
|
240
|
+
this.debugLog?.(`handler error for type=${event.type}: ${String(handlerError)}`);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
45
243
|
}
|
|
46
244
|
}
|
|
47
245
|
catch (error) {
|
|
@@ -51,11 +249,82 @@ export class SessionEventStream {
|
|
|
51
249
|
}
|
|
52
250
|
}
|
|
53
251
|
async handleEvent(event) {
|
|
54
|
-
if (
|
|
252
|
+
if (this.debugLog) {
|
|
253
|
+
try {
|
|
254
|
+
const props = event?.properties;
|
|
255
|
+
const summary = props
|
|
256
|
+
? Object.keys(props).slice(0, 6).map((k) => {
|
|
257
|
+
const v = props[k];
|
|
258
|
+
if (v && typeof v === "object")
|
|
259
|
+
return `${k}=<obj:${Object.keys(v).slice(0, 4).join(",")}>`;
|
|
260
|
+
return `${k}=${typeof v === "string" ? v.slice(0, 40) : String(v)}`;
|
|
261
|
+
}).join(" ")
|
|
262
|
+
: "<no-props>";
|
|
263
|
+
this.debugLog(`event: type=${event.type} ${summary}`);
|
|
264
|
+
}
|
|
265
|
+
catch { }
|
|
266
|
+
}
|
|
267
|
+
if (event.type === "permission.asked" || event.type === "permission.updated") {
|
|
268
|
+
const data = event.properties;
|
|
269
|
+
if (data.sessionID !== this.sessionID) {
|
|
270
|
+
this.debugLog?.(`drop: permission.asked for sessionID=${data.sessionID} (bound=${this.sessionID})`);
|
|
271
|
+
return;
|
|
272
|
+
}
|
|
273
|
+
await this.handlers.onPermissionAsked({
|
|
274
|
+
id: data.id,
|
|
275
|
+
sessionID: data.sessionID,
|
|
276
|
+
permission: data.permission || data.type || "unknown",
|
|
277
|
+
patterns: normalizePatterns(data.patterns || data.pattern),
|
|
278
|
+
metadata: data.metadata ?? {},
|
|
279
|
+
});
|
|
280
|
+
return;
|
|
281
|
+
}
|
|
282
|
+
if (event.type === "permission.replied") {
|
|
55
283
|
const data = event.properties;
|
|
56
284
|
if (data.sessionID !== this.sessionID)
|
|
57
285
|
return;
|
|
58
|
-
|
|
286
|
+
const id = data.requestID || data.permissionID;
|
|
287
|
+
if (id) {
|
|
288
|
+
await this.handlers.onPermissionReplied?.(id);
|
|
289
|
+
}
|
|
290
|
+
return;
|
|
291
|
+
}
|
|
292
|
+
if (event.type === "question.asked") {
|
|
293
|
+
const data = event.properties;
|
|
294
|
+
if (data.sessionID !== this.sessionID) {
|
|
295
|
+
this.debugLog?.(`drop: question.asked for sessionID=${data.sessionID} (bound=${this.sessionID})`);
|
|
296
|
+
return;
|
|
297
|
+
}
|
|
298
|
+
const questions = normalizeQuestions(data.questions);
|
|
299
|
+
this.debugLog?.(`forward: question.asked id=${data.id} questions=${questions.length}`);
|
|
300
|
+
if (!this.handlers.onQuestionAsked)
|
|
301
|
+
return;
|
|
302
|
+
await this.handlers.onQuestionAsked({
|
|
303
|
+
id: data.id,
|
|
304
|
+
sessionID: data.sessionID,
|
|
305
|
+
questions,
|
|
306
|
+
tool: data.tool,
|
|
307
|
+
});
|
|
308
|
+
return;
|
|
309
|
+
}
|
|
310
|
+
if (event.type === "question.replied") {
|
|
311
|
+
const data = event.properties;
|
|
312
|
+
if (data.sessionID !== this.sessionID)
|
|
313
|
+
return;
|
|
314
|
+
await this.handlers.onQuestionReplied?.({
|
|
315
|
+
id: data.requestID,
|
|
316
|
+
sessionID: data.sessionID,
|
|
317
|
+
});
|
|
318
|
+
return;
|
|
319
|
+
}
|
|
320
|
+
if (event.type === "question.rejected") {
|
|
321
|
+
const data = event.properties;
|
|
322
|
+
if (data.sessionID !== this.sessionID)
|
|
323
|
+
return;
|
|
324
|
+
await this.handlers.onQuestionRejected?.({
|
|
325
|
+
id: data.requestID,
|
|
326
|
+
sessionID: data.sessionID,
|
|
327
|
+
});
|
|
59
328
|
return;
|
|
60
329
|
}
|
|
61
330
|
if (event.type === "session.error") {
|
|
@@ -65,6 +334,35 @@ export class SessionEventStream {
|
|
|
65
334
|
await this.handlers.onSessionError(data);
|
|
66
335
|
return;
|
|
67
336
|
}
|
|
337
|
+
if (event.type === "message.part.updated") {
|
|
338
|
+
const data = event.properties;
|
|
339
|
+
const part = data.part;
|
|
340
|
+
const partSessionID = part?.sessionID;
|
|
341
|
+
const partMessageID = part?.messageID;
|
|
342
|
+
this.debugLog?.(`msg.part.updated: type=${part?.type} id=${part?.id ?? "?"} msgID=${part?.messageID ?? "?"} sessionID=${partSessionID ?? "?"} keys=${part ? Object.keys(part).slice(0, 10).join(",") : "no-part"} delta=${data.delta?.slice(0, 40) ?? "?"}`);
|
|
343
|
+
if (!partSessionID || partSessionID !== this.sessionID)
|
|
344
|
+
return;
|
|
345
|
+
if (!partMessageID)
|
|
346
|
+
return;
|
|
347
|
+
await this.handlers.onMessagePartUpdated?.({
|
|
348
|
+
sessionID: partSessionID,
|
|
349
|
+
messageID: partMessageID,
|
|
350
|
+
part,
|
|
351
|
+
delta: data.delta,
|
|
352
|
+
});
|
|
353
|
+
// OpenCode TUI surfaces questions as tool calls on the assistant message
|
|
354
|
+
// (part.type === "tool", part.tool === "question", part.state.status
|
|
355
|
+
// === "running"/"pending"). Bridge that into onQuestionAsked so the
|
|
356
|
+
// Telegram inline keyboard fires.
|
|
357
|
+
if (part && part.type === "tool" && part.tool === "question") {
|
|
358
|
+
this.debugLog?.(`msg.part.updated: TOOL CALL detected! part.id=${part.id} callID=${part.callID ?? "?"} state=${JSON.stringify(part.state)}`);
|
|
359
|
+
await this.handleQuestionToolPart(part);
|
|
360
|
+
}
|
|
361
|
+
else if (part && part.type === "tool") {
|
|
362
|
+
this.debugLog?.(`msg.part.updated: non-question tool call: tool=${part.tool}`);
|
|
363
|
+
}
|
|
364
|
+
return;
|
|
365
|
+
}
|
|
68
366
|
if (event.type !== "message.updated")
|
|
69
367
|
return;
|
|
70
368
|
const data = event.properties;
|
|
@@ -80,5 +378,74 @@ export class SessionEventStream {
|
|
|
80
378
|
return;
|
|
81
379
|
await this.handlers.onUserMessage(data.sessionID, data.info.id);
|
|
82
380
|
}
|
|
381
|
+
seenForwardedQuestionCalls = new Set();
|
|
382
|
+
async handleQuestionToolPart(part) {
|
|
383
|
+
const status = part.state?.status;
|
|
384
|
+
if (status === "completed" || status === "error") {
|
|
385
|
+
this.seenForwardedQuestionCalls.delete(part.callID);
|
|
386
|
+
return;
|
|
387
|
+
}
|
|
388
|
+
if (status !== "pending" && status !== "running")
|
|
389
|
+
return;
|
|
390
|
+
// Try to read questions directly from the tool call state.
|
|
391
|
+
const inputQuestions = part.state?.input?.questions;
|
|
392
|
+
const hasDirectQuestions = Array.isArray(inputQuestions) && inputQuestions.length > 0;
|
|
393
|
+
if (hasDirectQuestions) {
|
|
394
|
+
const questions = normalizeQuestions(inputQuestions);
|
|
395
|
+
if (questions.length > 0 && !this.seenForwardedQuestionCalls.has(part.callID)) {
|
|
396
|
+
this.seenForwardedQuestionCalls.add(part.callID);
|
|
397
|
+
this.debugLog?.(`forward: question tool-call id=${part.id} callID=${part.callID} questions=${questions.length} (from state)`);
|
|
398
|
+
if (this.handlers.onQuestionAsked) {
|
|
399
|
+
await this.handlers.onQuestionAsked({
|
|
400
|
+
id: part.callID,
|
|
401
|
+
sessionID: this.sessionID,
|
|
402
|
+
questions,
|
|
403
|
+
tool: { messageID: part.id, callID: part.callID },
|
|
404
|
+
});
|
|
405
|
+
return;
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
// Fallback: poll client.question.list() like OpenCode TUI does.
|
|
410
|
+
// The TUI triggers polling when a question tool call arrives in "running"
|
|
411
|
+
// state but no question.asked event was received.
|
|
412
|
+
if (status === "running" && !this.seenForwardedQuestionCalls.has(part.callID)) {
|
|
413
|
+
await this.pollQuestionList(part.callID, part.id);
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
async pollQuestionList(callID, partID) {
|
|
417
|
+
const maxAttempts = 120;
|
|
418
|
+
for (let attempt = 0; attempt < maxAttempts; attempt++) {
|
|
419
|
+
if (this.abort.signal.aborted)
|
|
420
|
+
return;
|
|
421
|
+
try {
|
|
422
|
+
const result = await this.client.question.list();
|
|
423
|
+
const items = Array.isArray(result) ? result : Array.isArray(result?.data) ? result.data : [];
|
|
424
|
+
const match = items.find((q) => q.sessionID === this.sessionID && q?.tool?.callID === callID);
|
|
425
|
+
if (match) {
|
|
426
|
+
const questions = normalizeQuestions(match.questions);
|
|
427
|
+
if (questions.length > 0 && !this.seenForwardedQuestionCalls.has(callID)) {
|
|
428
|
+
this.seenForwardedQuestionCalls.add(callID);
|
|
429
|
+
this.debugLog?.(`forward: question poll id=${match.id} callID=${callID} questions=${questions.length}`);
|
|
430
|
+
if (this.handlers.onQuestionAsked) {
|
|
431
|
+
await this.handlers.onQuestionAsked({
|
|
432
|
+
id: match.id,
|
|
433
|
+
sessionID: this.sessionID,
|
|
434
|
+
questions,
|
|
435
|
+
tool: match.tool ?? { messageID: partID, callID },
|
|
436
|
+
});
|
|
437
|
+
}
|
|
438
|
+
return;
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
catch (err) {
|
|
443
|
+
this.debugLog?.(`question list poll error: ${String(err)}`);
|
|
444
|
+
}
|
|
445
|
+
await new Promise((r) => setTimeout(r, 250));
|
|
446
|
+
}
|
|
447
|
+
this.debugLog?.(`question poll timeout for callID=${callID}`);
|
|
448
|
+
this.seenForwardedQuestionCalls.delete(callID);
|
|
449
|
+
}
|
|
83
450
|
}
|
|
84
451
|
//# sourceMappingURL=events.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/opencode/events.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/opencode/events.ts"],"names":[],"mappings":"AAmCA,SAAS,iBAAiB,CAAC,OAA2C;IACpE,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,CAAC;IACxB,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;QAAE,OAAO,OAAO,CAAC;IAC3C,OAAO,CAAC,OAAO,CAAC,CAAC;AACnB,CAAC;AAED,SAAS,kBAAkB,CACzB,GAAY;IAEZ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,CAAC;IACnC,OAAO,GAAG;SACP,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QACb,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,OAAO,SAAS,CAAC;QAC1D,MAAM,IAAI,GAAG,KAAgC,CAAC;QAC9C,MAAM,QAAQ,GAAG,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;QACxE,MAAM,MAAM,GAAG,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;QAClE,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QACnE,MAAM,OAAO,GAAG,UAAU;aACvB,GAAG,CAAC,CAAC,GAAG,EAAsD,EAAE;YAC/D,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;gBAAE,OAAO,SAAS,CAAC;YACtD,MAAM,CAAC,GAAG,GAA8B,CAAC;YACzC,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;YACzD,IAAI,CAAC,KAAK;gBAAE,OAAO,SAAS,CAAC;YAC7B,MAAM,WAAW,GAAG,OAAO,CAAC,CAAC,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3E,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC;QAChC,CAAC,CAAC;aACD,MAAM,CAAC,CAAC,GAAG,EAAiD,EAAE,CAC7D,OAAO,CAAC,GAAG,CAAC,CACb,CAAC;QACJ,IAAI,CAAC,QAAQ;YAAE,OAAO,SAAS,CAAC;QAChC,MAAM,IAAI,GAAiB;YACzB,QAAQ;YACR,MAAM;YACN,OAAO;SACR,CAAC;QACF,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI;YAAE,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACjD,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI;YAAE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QAC7C,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;SACD,MAAM,CAAC,CAAC,IAAI,EAAwB,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,OAAO,kBAAkB;IAOV;IACA;IACA;IACA;IACA;IAVX,KAAK,GAAG,IAAI,eAAe,EAAE,CAAC;IAC9B,OAAO,CAAiB;IACxB,MAAM,CAAO;IACb,SAAS,CAAiC;IAElD,YACmB,MAAW,EACX,SAAiB,EACjB,SAAiB,EACjB,QAAuB,EACvB,QAAoC;QAJpC,WAAM,GAAN,MAAM,CAAK;QACX,cAAS,GAAT,SAAS,CAAQ;QACjB,cAAS,GAAT,SAAS,CAAQ;QACjB,aAAQ,GAAR,QAAQ,CAAe;QACvB,aAAQ,GAAR,QAAQ,CAA4B;IACpD,CAAC;IAEJ,0BAA0B;IAC1B,MAAM,CAGJ;IAEF,KAAK;QACH,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QACzB,IAAI,CAAC,QAAQ,EAAE,CAAC,oDAAoD,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;QACtF,IAAI,CAAC,MAAM,GAAG;YACZ,oBAAoB,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,oBAAoB,EAAE;YACvD,0BAA0B,EAAE,IAAI,CAAC,0BAA0B;SAC5D,CAAC;QACF,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC3B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;YAC/C,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO;gBAAE,OAAO;YACtC,IAAI,CAAC,QAAQ,EAAE,CAAC,eAAe,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAChD,MAAM,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC,KAAK,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACnB,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC7B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC;YACH,IAAI,IAAI,CAAC,MAAM,IAAI,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;gBAC5D,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YAC7B,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QACD,MAAM,IAAI,CAAC,OAAO,CAAC;QACnB,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;IAC3B,CAAC;IAEO,mBAAmB;QACzB,IAAI,IAAI,CAAC,SAAS;YAAE,OAAO;QAC3B,MAAM,IAAI,GAAG,GAAG,EAAE;YAChB,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC,KAAK,IAAI,EAAE;gBACrC,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO;oBAAE,OAAO;gBACtC,IAAI,CAAC;oBACH,MAAM,IAAI,CAAC,oBAAoB,EAAE,CAAC;gBACpC,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,IAAI,CAAC,QAAQ,EAAE,CAAC,8BAA8B,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAC/D,CAAC;gBACD,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO;oBAAE,IAAI,EAAE,CAAC;YACzC,CAAC,EAAE,IAAI,CAAC,CAAC;YACT,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,EAAE,CAAC;QAC3B,CAAC,CAAC;QACF,IAAI,EAAE,CAAC;IACT,CAAC;IAEO,KAAK,CAAC,oBAAoB;QAChC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;YACjC,IAAI,CAAC,QAAQ,EAAE,CAAC,6CAA6C,CAAC,CAAC;YAC/D,OAAO;QACT,CAAC;QACD,IAAI,CAAC,QAAQ,EAAE,CAAC,6CAA6C,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;QAChF,IAAI,MAAW,CAAC;QAChB,IAAI,CAAC;YACH,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QAC7C,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,IAAI,CAAC,QAAQ,EAAE,CAAC,gCAAgC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC/D,OAAO;QACT,CAAC;QACD,IAAI,CAAC,QAAQ,EAAE,CAAC,uCAAuC,OAAO,MAAM,YAAY,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACzG,MAAM,GAAG,GAAG,MAAa,CAAC;QAC1B,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;YACnC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC9B,IAAI,CAAC,QAAQ,EAAE,CAAC,sBAAsB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACzD,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBAC3B,IAAI,CAAC,QAAQ,EAAE,CAAC,0BAA0B,OAAO,GAAG,CAAC,IAAI,YAAY,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;YAC9J,CAAC;QACH,CAAC;QACD,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9F,IAAI,CAAC,QAAQ,EAAE,CAAC,mBAAmB,KAAK,CAAC,MAAM,QAAQ,CAAC,CAAC;QACzD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,IAAI,CAAC,QAAQ,EAAE,CAAC,iBAAiB,IAAI,CAAC,EAAE,cAAc,IAAI,CAAC,SAAS,iBAAiB,IAAI,CAAC,SAAS,KAAK,IAAI,CAAC,SAAS,gBAAgB,IAAI,CAAC,0BAA0B,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YACxL,CAAC;QACH,CAAC;QACD,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CACtB,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,0BAA0B,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CACzF,CAAC;QACF,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,IAAI,CAAC,QAAQ,EAAE,CAAC,kCAAkC,CAAC,CAAC;YACpD,OAAO;QACT,CAAC;QACD,IAAI,CAAC,QAAQ,EAAE,CAAC,wBAAwB,KAAK,CAAC,EAAE,iBAAiB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QACpG,MAAM,SAAS,GAAG,kBAAkB,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACtD,IAAI,CAAC,QAAQ,EAAE,CAAC,oCAAoC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC;QACxE,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QACnC,IAAI,CAAC,0BAA0B,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC9C,IAAI,CAAC,QAAQ,EAAE,CACb,6BAA6B,KAAK,CAAC,EAAE,cAAc,IAAI,CAAC,SAAS,cAAc,SAAS,CAAC,MAAM,EAAE,CAClG,CAAC;QACF,IAAI,IAAI,CAAC,QAAQ,CAAC,eAAe,EAAE,CAAC;YAClC,MAAM,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC;gBAClC,EAAE,EAAE,KAAK,CAAC,EAAE;gBACZ,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,SAAS;gBACT,IAAI,EAAE,KAAK,CAAC,IAAI;aACjB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,IAAI;QAChB,IAAI,CAAC,QAAQ,EAAE,CAAC,8BAA8B,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;QAChE,8EAA8E;QAC9E,wDAAwD;QACxD,mEAAmE;QACnE,uCAAuC;QACvC,IAAI,YAAiB,CAAC;QACtB,IAAI,OAAO,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,KAAK,UAAU,EAAE,CAAC;YACxD,IAAI,CAAC,QAAQ,EAAE,CAAC,sCAAsC,CAAC,CAAC;YACxD,YAAY,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAC9C,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,EAC7B;gBACE,aAAa,EAAE,QAAQ;gBACvB,YAAY,EAAE,IAAI;gBAClB,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM;gBACzB,UAAU,EAAE,CAAC,KAAU,EAAE,EAAE;oBACzB,IAAI,CAAC,QAAQ,EAAE,CAAC,cAAc,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBACjD,CAAC;aACF,CACF,CAAC;QACJ,CAAC;aAAM,IAAI,OAAO,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,KAAK,UAAU,EAAE,CAAC;YAC5D,IAAI,CAAC,QAAQ,EAAE,CAAC,mCAAmC,CAAC,CAAC;YACrD,YAAY,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC;gBAC5C,aAAa,EAAE,QAAQ;gBACvB,YAAY,EAAE,IAAI;gBAClB,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM;gBACzB,UAAU,EAAE,CAAC,KAAU,EAAE,EAAE;oBACzB,IAAI,CAAC,QAAQ,EAAE,CAAC,cAAc,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBACjD,CAAC;aACF,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,QAAQ,EAAE,CAAC,8CAA8C,CAAC,CAAC;QAClE,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,YAAY,EAAE,MAAM,CAAC;QACnC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,IAAI,CAAC,QAAQ,EAAE,CAAC,+CAA+C,CAAC,CAAC;YACjE,OAAO;QACT,CAAC;QACD,IAAI,CAAC;YACH,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,IAAI,CAAC,MAA4B,EAAE,CAAC;gBAC5D,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO;oBAAE,MAAM;gBACrC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;oBAAE,SAAS;gBAClD,oDAAoD;gBACpD,kEAAkE;gBAClE,wDAAwD;gBACxD,iDAAiD;gBACjD,oEAAoE;gBACpE,MAAM,OAAO,GAAU,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;oBACzC,CAAC,CAAC,KAAK;oBACP,CAAC,CAAC,KAAK,CAAC,OAAO,CAAE,KAAa,CAAC,IAAI,CAAC;wBAClC,CAAC,CAAE,KAAa,CAAC,IAAI;wBACrB,CAAC,CAAE,KAAa,CAAC,OAAO;4BACtB,CAAC,CAAC,CAAC,KAAK,CAAC;4BACT,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;gBAChB,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;oBAC1B,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;wBAAE,SAAS;oBAC9C,MAAM,KAAK,GAAQ,GAAG,CAAC,OAAO;wBAC5B,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE;wBAC1F,CAAC,CAAC,GAAG,CAAC;oBACR,IAAI,CAAC,KAAK,CAAC,IAAI;wBAAE,SAAS;oBAC1B,+DAA+D;oBAC/D,MAAM,GAAG,GAAI,KAAa,CAAC,SAAS,CAAC;oBACrC,IAAI,GAAG,IAAI,GAAG,KAAK,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC,IAAI,KAAK,kBAAkB,IAAI,KAAK,CAAC,IAAI,KAAK,gBAAgB,IAAI,KAAK,CAAC,IAAI,KAAK,kBAAkB,IAAI,KAAK,CAAC,IAAI,KAAK,mBAAmB,IAAI,KAAK,CAAC,IAAI,KAAK,eAAe;wBAAE,SAAS;oBACjO,IAAI,CAAC,QAAQ,EAAE,CAAC,eAAe,KAAK,CAAC,IAAI,cAAe,KAAK,CAAC,UAAkB,EAAE,SAAS,IAAI,GAAG,OAAQ,KAAK,CAAC,UAAkB,EAAE,EAAE,IAAK,KAAK,CAAC,UAAkB,EAAE,SAAS,IAAI,GAAG,EAAE,CAAC,CAAC;oBACzL,IAAI,CAAC;wBACH,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;oBAChC,CAAC;oBAAC,OAAO,YAAY,EAAE,CAAC;wBACtB,iEAAiE;wBACjE,IAAI,CAAC,QAAQ,EAAE,CAAC,0BAA0B,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;oBACnF,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBAC/B,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;YAC3D,CAAC;QACH,CAAC;IACH,CAAC;IAGO,KAAK,CAAC,WAAW,CAAC,KAAU;QAClC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,KAAK,EAAE,UAAU,CAAC;gBAChC,MAAM,OAAO,GAAG,KAAK;oBACnB,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;wBACvC,MAAM,CAAC,GAAI,KAAa,CAAC,CAAC,CAAC,CAAC;wBAC5B,IAAI,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ;4BAAE,OAAO,GAAG,CAAC,SAAS,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;wBAC5F,OAAO,GAAG,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;oBACtE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;oBACd,CAAC,CAAC,YAAY,CAAC;gBACjB,IAAI,CAAC,QAAQ,CAAC,eAAe,KAAK,CAAC,IAAI,IAAI,OAAO,EAAE,CAAC,CAAC;YACxD,CAAC;YAAC,MAAM,CAAC,CAAA,CAAC;QACZ,CAAC;QACD,IAAI,KAAK,CAAC,IAAI,KAAK,kBAAkB,IAAI,KAAK,CAAC,IAAI,KAAK,oBAAoB,EAAE,CAAC;YAC7E,MAAM,IAAI,GAAG,KAAK,CAAC,UAQlB,CAAC;YACF,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI,CAAC,SAAS,EAAE,CAAC;gBACtC,IAAI,CAAC,QAAQ,EAAE,CAAC,wCAAwC,IAAI,CAAC,SAAS,WAAW,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;gBACpG,OAAO;YACT,CAAC;YACD,MAAM,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC;gBACpC,EAAE,EAAE,IAAI,CAAC,EAAE;gBACX,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,UAAU,EAAE,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,IAAI,IAAI,SAAS;gBACrD,QAAQ,EAAE,iBAAiB,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,OAAO,CAAC;gBAC1D,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,EAAE;aAC9B,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,IAAI,KAAK,CAAC,IAAI,KAAK,oBAAoB,EAAE,CAAC;YACxC,MAAM,IAAI,GAAG,KAAK,CAAC,UAMlB,CAAC;YACF,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI,CAAC,SAAS;gBAAE,OAAO;YAC9C,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,YAAY,CAAC;YAC/C,IAAI,EAAE,EAAE,CAAC;gBACP,MAAM,IAAI,CAAC,QAAQ,CAAC,mBAAmB,EAAE,CAAC,EAAE,CAAC,CAAC;YAChD,CAAC;YACD,OAAO;QACT,CAAC;QAED,IAAI,KAAK,CAAC,IAAI,KAAK,gBAAgB,EAAE,CAAC;YACpC,MAAM,IAAI,GAAG,KAAK,CAAC,UAKlB,CAAC;YACF,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI,CAAC,SAAS,EAAE,CAAC;gBACtC,IAAI,CAAC,QAAQ,EAAE,CAAC,sCAAsC,IAAI,CAAC,SAAS,WAAW,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;gBAClG,OAAO;YACT,CAAC;YACD,MAAM,SAAS,GAAG,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACrD,IAAI,CAAC,QAAQ,EAAE,CAAC,8BAA8B,IAAI,CAAC,EAAE,cAAc,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC;YACvF,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,eAAe;gBAAE,OAAO;YAC3C,MAAM,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC;gBAClC,EAAE,EAAE,IAAI,CAAC,EAAE;gBACX,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,SAAS;gBACT,IAAI,EAAE,IAAI,CAAC,IAAI;aAChB,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,IAAI,KAAK,CAAC,IAAI,KAAK,kBAAkB,EAAE,CAAC;YACtC,MAAM,IAAI,GAAG,KAAK,CAAC,UAIlB,CAAC;YACF,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI,CAAC,SAAS;gBAAE,OAAO;YAC9C,MAAM,IAAI,CAAC,QAAQ,CAAC,iBAAiB,EAAE,CAAC;gBACtC,EAAE,EAAE,IAAI,CAAC,SAAS;gBAClB,SAAS,EAAE,IAAI,CAAC,SAAS;aAC1B,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,IAAI,KAAK,CAAC,IAAI,KAAK,mBAAmB,EAAE,CAAC;YACvC,MAAM,IAAI,GAAG,KAAK,CAAC,UAGlB,CAAC;YACF,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI,CAAC,SAAS;gBAAE,OAAO;YAC9C,MAAM,IAAI,CAAC,QAAQ,CAAC,kBAAkB,EAAE,CAAC;gBACvC,EAAE,EAAE,IAAI,CAAC,SAAS;gBAClB,SAAS,EAAE,IAAI,CAAC,SAAS;aAC1B,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,IAAI,KAAK,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;YACnC,MAAM,IAAI,GAAG,KAAK,CAAC,UAA+D,CAAC;YACnF,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI,CAAC,SAAS;gBAAE,OAAO;YAChE,MAAM,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;YACzC,OAAO;QACT,CAAC;QAED,IAAI,KAAK,CAAC,IAAI,KAAK,sBAAsB,EAAE,CAAC;YAC1C,MAAM,IAAI,GAAG,KAAK,CAAC,UAGlB,CAAC;YACF,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;YACvB,MAAM,aAAa,GAAG,IAAI,EAAE,SAAS,CAAC;YACtC,MAAM,aAAa,GAAG,IAAI,EAAE,SAAS,CAAC;YACtC,IAAI,CAAC,QAAQ,EAAE,CAAC,0BAA0B,IAAI,EAAE,IAAI,OAAO,IAAI,EAAE,EAAE,IAAI,GAAG,UAAU,IAAI,EAAE,SAAS,IAAI,GAAG,cAAc,aAAa,IAAI,GAAG,SAAS,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,UAAU,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;YAC7P,IAAI,CAAC,aAAa,IAAI,aAAa,KAAK,IAAI,CAAC,SAAS;gBAAE,OAAO;YAC/D,IAAI,CAAC,aAAa;gBAAE,OAAO;YAC3B,MAAM,IAAI,CAAC,QAAQ,CAAC,oBAAoB,EAAE,CAAC;gBACzC,SAAS,EAAE,aAAa;gBACxB,SAAS,EAAE,aAAa;gBACxB,IAAI;gBACJ,KAAK,EAAE,IAAI,CAAC,KAAK;aAClB,CAAC,CAAC;YAEH,yEAAyE;YACzE,qEAAqE;YACrE,oEAAoE;YACpE,kCAAkC;YAClC,IAAI,IAAI,IAAK,IAAY,CAAC,IAAI,KAAK,MAAM,IAAK,IAAY,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;gBAC/E,IAAI,CAAC,QAAQ,EAAE,CAAC,iDAAkD,IAAY,CAAC,EAAE,WAAY,IAAY,CAAC,MAAM,IAAI,GAAG,UAAU,IAAI,CAAC,SAAS,CAAE,IAAY,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBACxK,MAAM,IAAI,CAAC,sBAAsB,CAAC,IAAW,CAAC,CAAC;YACjD,CAAC;iBAAM,IAAI,IAAI,IAAK,IAAY,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBACjD,IAAI,CAAC,QAAQ,EAAE,CAAC,kDAAmD,IAAY,CAAC,IAAI,EAAE,CAAC,CAAC;YAC1F,CAAC;YACD,OAAO;QACT,CAAC;QAED,IAAI,KAAK,CAAC,IAAI,KAAK,iBAAiB;YAAE,OAAO;QAC7C,MAAM,IAAI,GAAG,KAAK,CAAC,UAQlB,CAAC;QACF,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI,CAAC,SAAS;YAAE,OAAO;QAC9C,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YACnC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ;gBAAE,OAAO;YAC9D,MAAM,IAAI,CAAC,QAAQ,CAAC,oBAAoB,CACtC,IAAI,CAAC,SAAS,EACd,IAAI,CAAC,IAAI,CAAC,EAAE,EACZ,IAAI,CAAC,IAAI,CAAC,QAAQ,CACnB,CAAC;YACF,OAAO;QACT,CAAC;QACD,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM;YAAE,OAAO;QACtC,MAAM,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAClE,CAAC;IAEgB,0BAA0B,GAAG,IAAI,GAAG,EAAU,CAAC;IAExD,KAAK,CAAC,sBAAsB,CAAC,IAQpC;QACC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC;QAClC,IAAI,MAAM,KAAK,WAAW,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;YACjD,IAAI,CAAC,0BAA0B,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACpD,OAAO;QACT,CAAC;QACD,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO;QAEzD,2DAA2D;QAC3D,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,CAAC;QACpD,MAAM,kBAAkB,GAAG,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC;QACtF,IAAI,kBAAkB,EAAE,CAAC;YACvB,MAAM,SAAS,GAAG,kBAAkB,CAAC,cAAc,CAAC,CAAC;YACrD,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,0BAA0B,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC9E,IAAI,CAAC,0BAA0B,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACjD,IAAI,CAAC,QAAQ,EAAE,CACb,kCAAkC,IAAI,CAAC,EAAE,WAAW,IAAI,CAAC,MAAM,cAAc,SAAS,CAAC,MAAM,eAAe,CAC7G,CAAC;gBACF,IAAI,IAAI,CAAC,QAAQ,CAAC,eAAe,EAAE,CAAC;oBAClC,MAAM,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC;wBAClC,EAAE,EAAE,IAAI,CAAC,MAAM;wBACf,SAAS,EAAE,IAAI,CAAC,SAAS;wBACzB,SAAS;wBACT,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE;qBAClD,CAAC,CAAC;oBACH,OAAO;gBACT,CAAC;YACH,CAAC;QACH,CAAC;QAED,gEAAgE;QAChE,0EAA0E;QAC1E,kDAAkD;QAClD,IAAI,MAAM,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,0BAA0B,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YAC9E,MAAM,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,gBAAgB,CAAC,MAAc,EAAE,MAAc;QAC3D,MAAM,WAAW,GAAG,GAAG,CAAC;QACxB,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,WAAW,EAAE,OAAO,EAAE,EAAE,CAAC;YACvD,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO;gBAAE,OAAO;YACtC,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACjD,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC9F,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CACtB,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,IAAI,CAAC,SAAS,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,KAAK,MAAM,CACzE,CAAC;gBACF,IAAI,KAAK,EAAE,CAAC;oBACV,MAAM,SAAS,GAAG,kBAAkB,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;oBACtD,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,0BAA0B,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;wBACzE,IAAI,CAAC,0BAA0B,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;wBAC5C,IAAI,CAAC,QAAQ,EAAE,CACb,6BAA6B,KAAK,CAAC,EAAE,WAAW,MAAM,cAAc,SAAS,CAAC,MAAM,EAAE,CACvF,CAAC;wBACF,IAAI,IAAI,CAAC,QAAQ,CAAC,eAAe,EAAE,CAAC;4BAClC,MAAM,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC;gCAClC,EAAE,EAAE,KAAK,CAAC,EAAE;gCACZ,SAAS,EAAE,IAAI,CAAC,SAAS;gCACzB,SAAS;gCACT,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE;6BAClD,CAAC,CAAC;wBACL,CAAC;wBACD,OAAO;oBACT,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,CAAC,QAAQ,EAAE,CAAC,6BAA6B,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC9D,CAAC;YACD,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;QAC/C,CAAC;QACD,IAAI,CAAC,QAAQ,EAAE,CAAC,oCAAoC,MAAM,EAAE,CAAC,CAAC;QAC9D,IAAI,CAAC,0BAA0B,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACjD,CAAC;CACF"}
|
|
@@ -1,4 +1,10 @@
|
|
|
1
|
-
import type { PendingPermission, PermissionAskInput } from "../types.js";
|
|
1
|
+
import type { PendingPermission, PermissionAskInput, PendingQuestion, PendingQuestionAnswer, QuestionInfo, QuestionAskInput } from "../types.js";
|
|
2
2
|
export declare function toPendingPermission(input: PermissionAskInput): PendingPermission;
|
|
3
|
+
export declare function toPendingQuestion(input: QuestionAskInput): PendingQuestion;
|
|
3
4
|
export declare function formatPermissionRequestMessage(prefix: string, permission: PendingPermission): string;
|
|
4
|
-
export declare function
|
|
5
|
+
export declare function formatQuestionRequestMessage(question: PendingQuestion, questionIndex?: number): string;
|
|
6
|
+
export declare function getQuestionIndex(question: PendingQuestion, index: number): QuestionInfo | undefined;
|
|
7
|
+
export declare function normalizeAnswers(question: PendingQuestion, answers: PendingQuestionAnswer[]): Array<string[]>;
|
|
8
|
+
export declare function replyPermission(client: any, sessionID: string, requestID: string, action: "once" | "always" | "reject", directory: string): Promise<void>;
|
|
9
|
+
export declare function replyQuestion(client: any, directory: string, requestID: string, answers: Array<string[]>): Promise<void>;
|
|
10
|
+
export declare function rejectQuestion(client: any, directory: string, requestID: string): Promise<void>;
|