opencode-plugin-teleprompt 0.1.12 → 0.2.1

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 CHANGED
@@ -4,11 +4,12 @@ TUI-scoped OpenCode plugin that binds a Telegram channel to one active OpenCode
4
4
 
5
5
  ## What It Does
6
6
 
7
- - Polls a strict Telegram channel for `/tp` commands
8
- - Injects `/tp <prompt>` into the currently bound OpenCode session
9
- - Sends summary-only response messages back to the same channel
10
- - Relays OpenCode permission prompts and accepts Telegram `approve`, `approve-always`, `deny`
11
- - Keeps single-owner bridge semantics across multiple OpenCode consoles
7
+ - **Frictionless Chat Interface**: Type direct prompts (like `write a python function`) in your Telegram channel without any prefixes!
8
+ - **Direct Slash Commands**: Run administrative commands like `/status`, `/queue`, `/dc` or `/approve <id>` directly in the Telegram channel.
9
+ - **Backward Compatibility**: Fully supports old `/tp <prompt>` and `/tp:<command>` syntax out of the box.
10
+ - **Relays Permission Prompts**: Directly relays OpenCode permission requests and accepts direct `/approve`, `/approve-always`, and `/deny` replies.
11
+ - **Lease-based Owner Semantics**: Keeps single-owner bridge semantics across multiple OpenCode consoles.
12
+ - **Instant Ctrl+C Exit**: Stops event streams and cleans up instantly, ensuring no exit lags when shutting down OpenCode.
12
13
 
13
14
  ## V1 Limits
14
15
 
@@ -67,33 +68,33 @@ OpenCode installs npm plugins automatically at startup.
67
68
  5. While teleprompt is active, local prompt input is locked for that session.
68
69
  6. Disconnect options:
69
70
  - Press `Esc` twice in a row in OpenCode
70
- - Send `/tp:dc` in Telegram channel
71
+ - Send `/dc` in Telegram channel
71
72
  - Run `/tp:stop` in OpenCode
72
73
  7. Use Telegram channel commands:
73
- - `/tp <prompt>`
74
- - `/tp:interrupt`
75
- - `/tp:queue`
76
- - `/tp:cancel <job_id|last>`
77
- - `/tp:retry`
78
- - `/tp:context`
79
- - `/tp:compact`
80
- - `/tp:newsession`
81
- - `/tp:reset-context`
82
- - `/tp:who`
83
- - `/tp:health`
84
- - `/tp:reclaim`
85
- - `/tp:history`
86
- - `/tp:last-error`
87
- - `/tp:model`
88
- - `/tp:model fast`
89
- - `/tp:model smart`
90
- - `/tp:model max`
91
- - `/tp:model <provider>/<model>`
92
- - `/tp approve <request_id>`
93
- - `/tp approve-always <request_id>`
94
- - `/tp deny <request_id>`
95
- - `/tp status`
96
- - `/tp:dc`
74
+ - `<prompt>` (any message NOT starting with `/` is treated directly as a prompt!)
75
+ - `/interrupt` (or `/tp:interrupt`)
76
+ - `/queue` (or `/tp:queue`)
77
+ - `/cancel <job_id|last>` (or `/tp:cancel <job_id|last>`)
78
+ - `/retry` (or `/tp:retry`)
79
+ - `/context` (or `/tp:context`)
80
+ - `/compact` (or `/tp:compact`)
81
+ - `/newsession` (or `/tp:newsession`)
82
+ - `/reset-context` (or `/tp:reset-context`)
83
+ - `/who` (or `/tp:who`)
84
+ - `/health` (or `/tp:health`)
85
+ - `/reclaim` (or `/tp:reclaim`)
86
+ - `/history` (or `/tp:history`)
87
+ - `/last-error` (or `/tp:last-error`)
88
+ - `/model` (or `/tp:model`)
89
+ - `/model fast` (or `/tp:model fast`)
90
+ - `/model smart` (or `/tp:model smart`)
91
+ - `/model max` (or `/tp:model max`)
92
+ - `/model <provider>/<model>`
93
+ - `/approve <request_id>`
94
+ - `/approve-always <request_id>`
95
+ - `/deny <request_id>`
96
+ - `/status`
97
+ - `/dc` (or `/tp:dc`)
97
98
 
98
99
  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.
99
100
 
@@ -119,23 +120,23 @@ During remote runs, teleprompt posts lifecycle updates (`accepted`, `queued`, `r
119
120
  - `OPENCODE_TELEGRAM_CHANNEL_ID`
120
121
  3. Start OpenCode and ensure plugin loads without startup errors.
121
122
  4. Open one session, run `/tp:start`, verify bridge binds.
122
- 5. Send `/tp status` from Telegram and confirm status response.
123
- 6. Send `/tp test ping` and confirm lifecycle + summary reply.
124
- 7. Send `/tp:dc` and confirm local input is unlocked in OpenCode.
123
+ 5. Send `/status` from Telegram and confirm status response.
124
+ 6. Send `test ping` and confirm lifecycle + summary reply.
125
+ 7. Send `/dc` and confirm local input is unlocked in OpenCode.
125
126
 
126
127
  ## Telegram Live E2E Quick Checklist
127
128
 
128
129
  1. Start OpenCode session and run `/tp:start`.
129
- 2. From Telegram channel, run `/tp status` and verify owner/session info.
130
- 3. Run `/tp:model` and switch once with `/tp:model fast` (or explicit provider/model).
131
- 4. Send `/tp write a 1-line summary of this session` and verify:
130
+ 2. From Telegram channel, run `/status` and verify owner/session info.
131
+ 3. Run `/model` and switch once with `/model fast` (or explicit provider/model).
132
+ 4. Send `write a 1-line summary of this session` and verify:
132
133
  - `accepted` -> `running` -> `completed`
133
134
  - summary arrives as reply to the same Telegram message
134
135
  5. Trigger a permissioned action prompt and verify:
135
136
  - plugin posts permission request with `request_id`
136
- - `/tp approve <request_id>` (or `/tp deny <request_id>`) is applied immediately
137
- 6. Send `/tp:interrupt` during a long run and confirm graceful stop.
138
- 7. Send `/tp:dc` and confirm disconnect/unlock behavior.
137
+ - `/approve <request_id>` (or `/deny <request_id>`) is applied immediately
138
+ 6. Send `/interrupt` during a long run and confirm graceful stop.
139
+ 7. Send `/dc` and confirm disconnect/unlock behavior.
139
140
 
140
141
  ## Command Reference
141
142
 
@@ -149,32 +150,32 @@ During remote runs, teleprompt posts lifecycle updates (`accepted`, `queued`, `r
149
150
 
150
151
  ### Telegram Commands
151
152
 
152
- - `/tp <prompt>`: Queue a new prompt for the currently bound session.
153
- - `/tp:interrupt`: Abort the currently running remote prompt without disconnecting the bridge.
154
- - `/tp:queue`: Show active prompt and queued prompts.
155
- - `/tp:cancel <job_id|last>`: Remove a queued prompt by job ID, or remove the newest queued prompt with `last`.
156
- - `/tp:retry`: Re-queue the most recent prompt from prompt history.
157
- - `/tp:context`: Show compact session context (recent prompts, summaries, and changed files).
158
- - `/tp:compact`: Trigger session summarization/compaction for long-running sessions.
159
- - `/tp:newsession`: Create a new OpenCode session and switch teleprompt binding to it.
160
- - `/tp:reset-context`: Alias behavior for creating/switching to a fresh session context.
161
- - `/tp:who`: Show lease ownership details (current instance, lease owner, ownership state).
162
- - `/tp:health`: Show bridge health (lease age/staleness, poller/event stream status, queue stats).
163
- - `/tp:reclaim`: Try to reclaim bridge ownership for the current instance.
164
- - `/tp:history`: Show recent run history with status and short summaries.
165
- - `/tp:last-error`: Show the latest failed or interrupted run summary.
166
- - `/tp:model`: List available models by provider and show current model selection.
167
- - `/tp:model fast`: Select a model using the `fast` preset resolver.
168
- - `/tp:model smart`: Select a model using the `smart` preset resolver.
169
- - `/tp:model max`: Select a model using the `max` preset resolver.
170
- - `/tp:model <provider>/<model>`: Select an explicit provider/model for the bound session.
171
- - `/tp approve <request_id>`: Approve a pending permission request once.
172
- - `/tp approve-always <request_id>`: Approve a pending permission request and persist approval behavior when supported.
173
- - `/tp deny <request_id>`: Reject a pending permission request.
174
- - `/tp status`: Show bridge status from Telegram.
175
- - `/tp:dc`: Disconnect teleprompt from Telegram and unbind the current session.
153
+ - `<prompt>`: Any message not starting with `/` is queued directly as a prompt for the session.
154
+ - `/interrupt`: Abort the currently running remote prompt without disconnecting the bridge.
155
+ - `/queue`: Show active prompt and queued prompts.
156
+ - `/cancel <job_id|last>`: Remove a queued prompt by job ID, or remove the newest queued prompt with `last`.
157
+ - `/retry`: Re-queue the most recent prompt from prompt history.
158
+ - `/context`: Show compact session context (recent prompts, summaries, and changed files).
159
+ - `/compact`: Trigger session summarization/compaction for long-running sessions.
160
+ - `/newsession`: Create a new OpenCode session and switch teleprompt binding to it.
161
+ - `/reset-context`: Alias behavior for creating/switching to a fresh session context.
162
+ - `/who`: Show lease ownership details (current instance, lease owner, ownership state).
163
+ - `/health`: Show bridge health (lease age/staleness, poller/event stream status, queue stats).
164
+ - `/reclaim`: Try to reclaim bridge ownership for the current instance.
165
+ - `/history`: Show recent run history with status and short summaries.
166
+ - `/last-error`: Show the latest failed or interrupted run summary.
167
+ - `/model`: List available models by provider and show current model selection.
168
+ - `/model fast`: Select a model using the `fast` preset resolver.
169
+ - `/model smart`: Select a model using the `smart` preset resolver.
170
+ - `/model max`: Select a model using the `max` preset resolver.
171
+ - `/model <provider>/<model>`: Select an explicit provider/model for the bound session.
172
+ - `/approve <request_id>`: Approve a pending permission request once.
173
+ - `/approve-always <request_id>`: Approve a pending permission request and persist approval behavior when supported.
174
+ - `/deny <request_id>`: Reject a pending permission request.
175
+ - `/status`: Show bridge status from Telegram.
176
+ - `/dc`: Disconnect teleprompt from Telegram and unbind the current session.
176
177
 
177
178
  ## Shutdown Behavior
178
179
 
179
- - On normal TUI disposal (`Ctrl+C`, clean exit), poller and heartbeat stop and lease is released.
180
+ - On normal TUI disposal (`Ctrl+C`, clean exit), poller and heartbeat stop and lease is released **instantly** without hangs.
180
181
  - On unclean termination, lease expires by TTL and next owner instance can reclaim.
package/dist/index.d.ts CHANGED
@@ -5,6 +5,7 @@ declare const server: Plugin;
5
5
  declare const _default: {
6
6
  id: string;
7
7
  server: Plugin;
8
+ tui: import("./tui-types.js").TuiPlugin;
8
9
  };
9
10
  export default _default;
10
11
  export { id, server, tui };
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { tui } from "./tui.js";
2
2
  const id = "opencode-plugin-teleprompt";
3
3
  const server = async () => ({});
4
- export default { id, server };
4
+ export default { id, server, tui };
5
5
  export { id, server, tui };
6
6
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAG/B,MAAM,EAAE,GAAG,4BAA4B,CAAC;AAExC,MAAM,MAAM,GAAW,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;AAExC,eAAe,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC;AAC9B,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAG/B,MAAM,EAAE,GAAG,4BAA4B,CAAC;AAExC,MAAM,MAAM,GAAW,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;AAExC,eAAe,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;AACnC,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC"}
@@ -17,10 +17,8 @@ export async function getCurrentOrCreateSessionID(api, client) {
17
17
  return sessionID;
18
18
  }
19
19
  }
20
- const response = await client.session.create({
21
- responseStyle: "data",
22
- throwOnError: true,
23
- });
20
+ // Bundled SDK convention: (params, options)
21
+ const response = await client.session.create({ directory: api.state.path.directory }, { responseStyle: "data", throwOnError: true });
24
22
  // Try multiple common paths for session ID
25
23
  const sessionID = response?.id ??
26
24
  response?.data?.id ??
@@ -33,8 +31,6 @@ export async function getCurrentOrCreateSessionID(api, client) {
33
31
  }
34
32
  try {
35
33
  const route = api.route;
36
- // According to debug dump, api.route.navigate exists
37
- // Reverting to positional arguments as the object-based call caused a crash
38
34
  if (typeof route.navigate === "function") {
39
35
  route.navigate("session", { sessionID });
40
36
  }
@@ -1 +1 @@
1
- {"version":3,"file":"binding.js","sourceRoot":"","sources":["../../src/opencode/binding.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,mBAAmB,CAAC,GAAiB;IACnD,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC;IAChC,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;IACnE,CAAC;IACD,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,EAAE,SAAS,CAAC;IAC1C,IAAI,CAAC,SAAS,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE,CAAC;QAChD,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;IACxE,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC/C,GAAiB,EACjB,MAAW;IAEX,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC;IAChC,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC7B,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,EAAE,SAAS,CAAC;QAC1C,IAAI,SAAS,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE,CAAC;YAC/C,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;QAC3C,aAAa,EAAE,MAAM;QACrB,YAAY,EAAE,IAAI;KACnB,CAAC,CAAC;IAEH,2CAA2C;IAC3C,MAAM,SAAS,GACZ,QAAgB,EAAE,EAAE;QACpB,QAAgB,EAAE,IAAI,EAAE,EAAE;QAC1B,QAAgB,EAAE,OAAO,EAAE,EAAE;QAC7B,QAAgB,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC;IAEvC,IAAI,CAAC,SAAS,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE,CAAC;QAChD,MAAM,YAAY,GAAG,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QAC1E,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAC5D,MAAM,IAAI,KAAK,CACb,4DAA4D,YAAY,YAAY,YAAY,EAAE,CACnG,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,GAAG,CAAC,KAAY,CAAC;QAC/B,qDAAqD;QACrD,4EAA4E;QAC5E,IAAI,OAAO,KAAK,CAAC,QAAQ,KAAK,UAAU,EAAE,CAAC;YACzC,KAAK,CAAC,QAAQ,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;QAC3C,CAAC;aAAM,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YAC5C,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;QACzD,CAAC;aAAM,IAAI,OAAO,KAAK,CAAC,GAAG,KAAK,UAAU,EAAE,CAAC;YAC3C,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;QACxD,CAAC;aAAM,IAAI,OAAQ,GAAW,CAAC,QAAQ,KAAK,UAAU,EAAE,CAAC;YACtD,GAAW,CAAC,QAAQ,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,0DAA0D;IAC5D,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC"}
1
+ {"version":3,"file":"binding.js","sourceRoot":"","sources":["../../src/opencode/binding.ts"],"names":[],"mappings":"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"}
@@ -22,6 +22,7 @@ export declare class SessionEventStream {
22
22
  private readonly handlers;
23
23
  private abort;
24
24
  private running?;
25
+ private stream?;
25
26
  constructor(client: any, sessionID: string, handlers: EventHandlers);
26
27
  start(): void;
27
28
  stop(): Promise<void>;
@@ -4,6 +4,7 @@ export class SessionEventStream {
4
4
  handlers;
5
5
  abort = new AbortController();
6
6
  running;
7
+ stream;
7
8
  constructor(client, sessionID, handlers) {
8
9
  this.client = client;
9
10
  this.sessionID = sessionID;
@@ -20,13 +21,22 @@ export class SessionEventStream {
20
21
  }
21
22
  async stop() {
22
23
  this.abort.abort();
24
+ try {
25
+ if (this.stream && typeof this.stream.return === "function") {
26
+ await this.stream.return();
27
+ }
28
+ }
29
+ catch {
30
+ // ignore
31
+ }
23
32
  await this.running;
24
33
  this.running = undefined;
25
34
  }
26
35
  async loop() {
27
- const streamResult = await this.client.event.subscribe();
36
+ const streamResult = await this.client.event.subscribe({}, { responseStyle: "stream", throwOnError: true, signal: this.abort.signal });
37
+ this.stream = streamResult?.stream;
28
38
  try {
29
- for await (const event of streamResult.stream) {
39
+ for await (const event of this.stream) {
30
40
  if (this.abort.signal.aborted)
31
41
  break;
32
42
  if (!event || typeof event !== "object")
@@ -34,7 +44,7 @@ export class SessionEventStream {
34
44
  await this.handleEvent(event);
35
45
  }
36
46
  }
37
- catch {
47
+ catch (error) {
38
48
  if (!this.abort.signal.aborted) {
39
49
  throw new Error("Event stream terminated unexpectedly.");
40
50
  }
@@ -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":"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"}
@@ -31,9 +31,9 @@ export function formatPermissionRequestMessage(prefix, permission) {
31
31
  patterns,
32
32
  "",
33
33
  "Reply examples:",
34
- `- Approve once: ${prefix} approve ${permission.requestID}`,
35
- `- Approve always: ${prefix} approve-always ${permission.requestID}`,
36
- `- Deny: ${prefix} deny ${permission.requestID}`,
34
+ `- Approve once: /approve ${permission.requestID}`,
35
+ `- Approve always: /approve-always ${permission.requestID}`,
36
+ `- Deny: /deny ${permission.requestID}`,
37
37
  ].join("\n");
38
38
  }
39
39
  function classifyRisk(permission, metadata) {
@@ -58,16 +58,14 @@ function classifyRisk(permission, metadata) {
58
58
  return "read";
59
59
  }
60
60
  export async function replyPermission(client, sessionID, requestID, action) {
61
- await client.postSessionByIdPermissionsByPermissionId({
62
- path: {
63
- id: sessionID,
64
- permissionID: requestID,
65
- },
66
- body: {
67
- response: action === "once" ? "once" : action === "always" ? "always" : "reject",
68
- },
69
- responseStyle: "data",
70
- throwOnError: true,
71
- });
61
+ // Bundled SDK convention: (params, options)
62
+ // Try the bundled method name first, fall back to workspace SDK name
63
+ const response = action === "once" ? "once" : action === "always" ? "always" : "reject";
64
+ const fn = client.postSessionSessionIDPermissionsPermissionID ??
65
+ client.postSessionIdPermissionsPermissionId ??
66
+ client.postSessionByIdPermissionsByPermissionId;
67
+ if (fn) {
68
+ await fn.call(client, { sessionID, permissionID: requestID, response }, { responseStyle: "data", throwOnError: true });
69
+ }
72
70
  }
73
71
  //# sourceMappingURL=permissions.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"permissions.js","sourceRoot":"","sources":["../../src/opencode/permissions.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"permissions.js","sourceRoot":"","sources":["../../src/opencode/permissions.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  export declare function createTelegramUserMessageID(updateID: number): string;
2
- export declare function submitPrompt(client: any, sessionID: string, prompt: string, updateID: number, model?: {
2
+ export declare function submitPrompt(client: any, sessionID: string, prompt: string, updateID: number, directory: string, model?: {
3
3
  providerID: string;
4
4
  modelID: string;
5
5
  }): Promise<{
@@ -1,26 +1,46 @@
1
1
  export function createTelegramUserMessageID(updateID) {
2
- return `tg-${updateID}`;
2
+ return `msg_tg_${updateID}`;
3
3
  }
4
- export async function submitPrompt(client, sessionID, prompt, updateID, model) {
4
+ export async function submitPrompt(client, sessionID, prompt, updateID, directory, model) {
5
5
  const userMessageID = createTelegramUserMessageID(updateID);
6
- const response = await client.session.prompt({
7
- path: {
8
- id: sessionID,
9
- },
10
- body: {
11
- messageID: userMessageID,
12
- ...(model ? { model } : {}),
13
- parts: [{ type: "text", text: prompt }],
14
- },
6
+ // 1. If a specific model is selected, update the session model first
7
+ if (model) {
8
+ try {
9
+ await client.session.update({
10
+ id: sessionID,
11
+ directory,
12
+ model,
13
+ }, {
14
+ responseStyle: "data",
15
+ throwOnError: true,
16
+ });
17
+ }
18
+ catch (err) {
19
+ // Ignore model update errors or log them silently
20
+ }
21
+ }
22
+ // 2. Clear the active TUI prompt
23
+ try {
24
+ await client.tui.clearPrompt({ directory }, { responseStyle: "data", throwOnError: true });
25
+ }
26
+ catch (err) {
27
+ // Ignore clear errors
28
+ }
29
+ // 3. Append the prompt text to the TUI prompt buffer
30
+ await client.tui.appendPrompt({
31
+ text: prompt,
32
+ directory,
33
+ }, {
34
+ responseStyle: "data",
35
+ throwOnError: true,
36
+ });
37
+ // 4. Submit the TUI prompt
38
+ await client.tui.submitPrompt({ directory }, {
15
39
  responseStyle: "data",
16
40
  throwOnError: true,
17
41
  });
18
- const info = (response?.info || response?.data?.info);
19
- const parts = (response?.parts || response?.data?.parts);
20
42
  return {
21
43
  userMessageID,
22
- assistantMessageID: typeof info?.id === "string" ? info.id : undefined,
23
- assistantParts: parts,
24
44
  };
25
45
  }
26
46
  //# sourceMappingURL=submit.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"submit.js","sourceRoot":"","sources":["../../src/opencode/submit.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,2BAA2B,CAAC,QAAgB;IAC1D,OAAO,MAAM,QAAQ,EAAE,CAAC;AAC1B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,MAAW,EACX,SAAiB,EACjB,MAAc,EACd,QAAgB,EAChB,KAGC;IAMD,MAAM,aAAa,GAAG,2BAA2B,CAAC,QAAQ,CAAC,CAAC;IAC5D,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;QAC3C,IAAI,EAAE;YACJ,EAAE,EAAE,SAAS;SACd;QACD,IAAI,EAAE;YACJ,SAAS,EAAE,aAAa;YACxB,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3B,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;SACxC;QACD,aAAa,EAAE,MAAM;QACrB,YAAY,EAAE,IAAI;KACnB,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,CAAC,QAAQ,EAAE,IAAI,IAAI,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAgC,CAAC;IACrF,MAAM,KAAK,GAAG,CAAC,QAAQ,EAAE,KAAK,IAAI,QAAQ,EAAE,IAAI,EAAE,KAAK,CAE1C,CAAC;IAEd,OAAO;QACL,aAAa;QACb,kBAAkB,EAAE,OAAO,IAAI,EAAE,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS;QACtE,cAAc,EAAE,KAAK;KACtB,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"submit.js","sourceRoot":"","sources":["../../src/opencode/submit.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,2BAA2B,CAAC,QAAgB;IAC1D,OAAO,UAAU,QAAQ,EAAE,CAAC;AAC9B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,MAAW,EACX,SAAiB,EACjB,MAAc,EACd,QAAgB,EAChB,SAAiB,EACjB,KAGC;IAMD,MAAM,aAAa,GAAG,2BAA2B,CAAC,QAAQ,CAAC,CAAC;IAE5D,qEAAqE;IACrE,IAAI,KAAK,EAAE,CAAC;QACV,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,OAAO,CAAC,MAAM,CACzB;gBACE,EAAE,EAAE,SAAS;gBACb,SAAS;gBACT,KAAK;aACN,EACD;gBACE,aAAa,EAAE,MAAM;gBACrB,YAAY,EAAE,IAAI;aACnB,CACF,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,kDAAkD;QACpD,CAAC;IACH,CAAC;IAED,iCAAiC;IACjC,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,GAAG,CAAC,WAAW,CAC1B,EAAE,SAAS,EAAE,EACb,EAAE,aAAa,EAAE,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,CAC9C,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,sBAAsB;IACxB,CAAC;IAED,qDAAqD;IACrD,MAAM,MAAM,CAAC,GAAG,CAAC,YAAY,CAC3B;QACE,IAAI,EAAE,MAAM;QACZ,SAAS;KACV,EACD;QACE,aAAa,EAAE,MAAM;QACrB,YAAY,EAAE,IAAI;KACnB,CACF,CAAC;IAEF,2BAA2B;IAC3B,MAAM,MAAM,CAAC,GAAG,CAAC,YAAY,CAC3B,EAAE,SAAS,EAAE,EACb;QACE,aAAa,EAAE,MAAM;QACrB,YAAY,EAAE,IAAI;KACnB,CACF,CAAC;IAEF,OAAO;QACL,aAAa;KACd,CAAC;AACJ,CAAC"}
@@ -7,6 +7,7 @@ type SessionCredentials = {
7
7
  export declare class BridgeController {
8
8
  private readonly api;
9
9
  private readonly config;
10
+ private readonly storePath;
10
11
  private readonly deps;
11
12
  private readonly instanceID;
12
13
  private readonly client;
@@ -24,7 +25,9 @@ export declare class BridgeController {
24
25
  private lastEscAt;
25
26
  private sessionCredentials?;
26
27
  private activePromptCheckInFlight;
28
+ private completionInFlight;
27
29
  constructor(api: TuiPluginApi, config: BridgeConfig, storePath: string, deps?: Partial<RuntimeDeps>);
30
+ private log;
28
31
  init(): Promise<void>;
29
32
  bindCurrent(credentials?: SessionCredentials): Promise<string>;
30
33
  unbind(): Promise<void>;