@inline-openclaw/inline 0.0.3

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 ADDED
@@ -0,0 +1,116 @@
1
+ # @inline-openclaw/inline
2
+
3
+ OpenClaw channel plugin for interacting with an OpenClaw agent via **Inline**.
4
+
5
+ Status: **beta** (solid foundation; expect iteration).
6
+
7
+ Quick setup guide: `docs/openclaw-setup.md`.
8
+ Create bot/token guide: `docs/create-inline-bot.md`.
9
+
10
+ Supports:
11
+
12
+ - Inline DMs (`ChatType=direct`)
13
+ - Inline chats (including top-level thread-style chats) as conversations (`ChatType=group`)
14
+ - Message replies: OpenClaw `replyToId` is mapped to Inline `replyToMsgId` (message id).
15
+
16
+ Non-goals (for now):
17
+
18
+ - Subthreads: Inline “replyTo” is a message reply, not a thread identifier. We do not expose OpenClaw subthread mode yet (`capabilities.threads=false`).
19
+
20
+ ## Install
21
+
22
+ Requires OpenClaw `2026.2.9` or newer.
23
+
24
+ From npm (once published):
25
+
26
+ ```sh
27
+ openclaw plugins install @inline-openclaw/inline
28
+ ```
29
+
30
+ If the plugin is already installed, update in place:
31
+
32
+ ```sh
33
+ openclaw config set plugins.installs.inline.spec '"@inline-openclaw/inline@latest"'
34
+ openclaw plugins update inline
35
+ ```
36
+
37
+ From a local checkout (dev):
38
+
39
+ ```sh
40
+ cd /path/to/inline/packages/openclaw-inline
41
+ bun run build
42
+ openclaw plugins install --link /path/to/inline/packages/openclaw-inline
43
+ ```
44
+
45
+ ## Configure
46
+
47
+ Channel config lives under `channels.inline` (the plugin config schema is intentionally empty).
48
+
49
+ Plugin id is `inline` (for `plugins.entries.*`).
50
+ If you enable explicitly, use:
51
+
52
+ ```yaml
53
+ plugins:
54
+ entries:
55
+ inline:
56
+ enabled: true
57
+ ```
58
+
59
+ Minimal setup (token field only):
60
+
61
+ ```yaml
62
+ channels:
63
+ inline:
64
+ enabled: true
65
+ token: "<INLINE_BOT_TOKEN>"
66
+ ```
67
+
68
+ `baseUrl` defaults to `https://api.inline.chat`.
69
+ `dmPolicy` defaults to `pairing` (recommended starting point).
70
+
71
+ Example:
72
+
73
+ ```yaml
74
+ channels:
75
+ inline:
76
+ enabled: true
77
+ baseUrl: "https://api.inline.chat"
78
+ token: "<INLINE_BOT_TOKEN>"
79
+
80
+ # DMs:
81
+ dmPolicy: "pairing" # pairing|open|disabled
82
+ allowFrom:
83
+ - "inline:123" # or "user:123" or just "123"
84
+
85
+ # Group threads/chats:
86
+ groupPolicy: "allowlist" # allowlist|open|disabled
87
+ groupAllowFrom:
88
+ - "inline:123" # or "user:123" or just "123"
89
+ requireMention: true
90
+ ```
91
+
92
+ If you set `dmPolicy: "open"`, set `allowFrom: ["*"]`.
93
+
94
+ Multi-account:
95
+
96
+ ```yaml
97
+ channels:
98
+ inline:
99
+ accounts:
100
+ default:
101
+ baseUrl: "https://api.inline.chat"
102
+ token: "<BOT_TOKEN_A>"
103
+ work:
104
+ baseUrl: "https://api.inline.chat"
105
+ token: "<BOT_TOKEN_B>"
106
+ ```
107
+
108
+ ## Quick Troubleshooting
109
+
110
+ - `plugin not found: inline` / `plugins.entries.inline: plugin not found: inline`
111
+ - Ensure the plugin is installed and discovered (`openclaw plugins list`).
112
+ - `doctor --fix` suggests Inline changes even though channel is healthy
113
+ - Plugin entry id should be `inline`.
114
+ - `Inline: SETUP / no token`
115
+ - Ensure `channels.inline.token` is set and plugin is updated (`openclaw plugins update inline`).
116
+ - If using `dmPolicy: "open"`, ensure `allowFrom: ["*"]`.
@@ -0,0 +1,10 @@
1
+ import type { OpenClawPluginApi } from "openclaw/plugin-sdk";
2
+ declare const plugin: {
3
+ id: string;
4
+ name: string;
5
+ description: string;
6
+ configSchema: unknown;
7
+ register: (api: OpenClawPluginApi) => void;
8
+ };
9
+ export default plugin;
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAK5D,QAAA,MAAM,MAAM,EAAE;IACZ,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IAGnB,YAAY,EAAE,OAAO,CAAA;IACrB,QAAQ,EAAE,CAAC,GAAG,EAAE,iBAAiB,KAAK,IAAI,CAAA;CAU3C,CAAA;AAED,eAAe,MAAM,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,15 @@
1
+ import { emptyPluginConfigSchema } from "openclaw/plugin-sdk";
2
+ import { inlineChannelPlugin } from "./inline/channel.js";
3
+ import { setInlineRuntime } from "./runtime.js";
4
+ const plugin = {
5
+ id: "inline",
6
+ name: "Inline",
7
+ description: "Inline Chat channel plugin (realtime RPC)",
8
+ configSchema: emptyPluginConfigSchema(),
9
+ register(api) {
10
+ setInlineRuntime(api.runtime);
11
+ api.registerChannel({ plugin: inlineChannelPlugin });
12
+ },
13
+ };
14
+ export default plugin;
15
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAA;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAA;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAE/C,MAAM,MAAM,GAQR;IACF,EAAE,EAAE,QAAQ;IACZ,IAAI,EAAE,QAAQ;IACd,WAAW,EAAE,2CAA2C;IACxD,YAAY,EAAE,uBAAuB,EAAE;IACvC,QAAQ,CAAC,GAAsB;QAC7B,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;QAC7B,GAAG,CAAC,eAAe,CAAC,EAAE,MAAM,EAAE,mBAAmB,EAAE,CAAC,CAAA;IACtD,CAAC;CACF,CAAA;AAED,eAAe,MAAM,CAAA"}
@@ -0,0 +1,20 @@
1
+ import type { OpenClawConfig } from "openclaw/plugin-sdk";
2
+ import type { InlineRuntimeConfig } from "./config-schema.js";
3
+ export type ResolvedInlineAccount = {
4
+ accountId: string;
5
+ name: string;
6
+ enabled: boolean;
7
+ configured: boolean;
8
+ baseUrl: string | null;
9
+ token: string | null;
10
+ tokenFile: string | null;
11
+ config: InlineRuntimeConfig;
12
+ };
13
+ export declare function listInlineAccountIds(cfg: OpenClawConfig): string[];
14
+ export declare function resolveDefaultInlineAccountId(cfg: OpenClawConfig): string;
15
+ export declare function resolveInlineAccount(params: {
16
+ cfg: OpenClawConfig;
17
+ accountId?: string | null;
18
+ }): ResolvedInlineAccount;
19
+ export declare function resolveInlineToken(account: ResolvedInlineAccount): Promise<string>;
20
+ //# sourceMappingURL=accounts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accounts.d.ts","sourceRoot":"","sources":["../../src/inline/accounts.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AAEzD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AAG7D,MAAM,MAAM,qBAAqB,GAAG;IAClC,SAAS,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,OAAO,CAAA;IAChB,UAAU,EAAE,OAAO,CAAA;IACnB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,MAAM,EAAE,mBAAmB,CAAA;CAC5B,CAAA;AAaD,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,cAAc,GAAG,MAAM,EAAE,CAgBlE;AAED,wBAAgB,6BAA6B,CAAC,GAAG,EAAE,cAAc,GAAG,MAAM,CAIzE;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE;IAC3C,GAAG,EAAE,cAAc,CAAA;IACnB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAC1B,GAAG,qBAAqB,CA2BxB;AAED,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,MAAM,CAAC,CAWxF"}
@@ -0,0 +1,72 @@
1
+ import { DEFAULT_ACCOUNT_ID } from "openclaw/plugin-sdk";
2
+ import { readFile } from "node:fs/promises";
3
+ import { InlineRuntimeConfigSchema } from "./config-schema.js";
4
+ const DEFAULT_BASE_URL = "https://api.inline.chat";
5
+ function readInlineConfig(cfg) {
6
+ const raw = (cfg.channels?.inline ?? {});
7
+ const result = InlineRuntimeConfigSchema.safeParse(raw);
8
+ if (!result.success) {
9
+ return InlineRuntimeConfigSchema.parse({});
10
+ }
11
+ return result.data;
12
+ }
13
+ export function listInlineAccountIds(cfg) {
14
+ const config = readInlineConfig(cfg);
15
+ const ids = new Set();
16
+ const hasBase = Boolean((config.token ?? "").trim() ||
17
+ (config.tokenFile ?? "").trim() ||
18
+ (config.baseUrl ?? "").trim());
19
+ if (hasBase) {
20
+ ids.add(DEFAULT_ACCOUNT_ID);
21
+ }
22
+ for (const key of Object.keys(config.accounts ?? {})) {
23
+ const normalized = key.trim();
24
+ if (normalized)
25
+ ids.add(normalized);
26
+ }
27
+ return [...ids];
28
+ }
29
+ export function resolveDefaultInlineAccountId(cfg) {
30
+ const ids = listInlineAccountIds(cfg);
31
+ if (ids.includes(DEFAULT_ACCOUNT_ID))
32
+ return DEFAULT_ACCOUNT_ID;
33
+ return ids[0] ?? DEFAULT_ACCOUNT_ID;
34
+ }
35
+ export function resolveInlineAccount(params) {
36
+ const config = readInlineConfig(params.cfg);
37
+ const requested = (params.accountId ?? DEFAULT_ACCOUNT_ID).trim() || DEFAULT_ACCOUNT_ID;
38
+ const accountOverride = config.accounts?.[requested] ?? null;
39
+ const { accounts: _accounts, ...base } = config;
40
+ const effective = accountOverride
41
+ ? { ...base, ...accountOverride }
42
+ : config;
43
+ const enabled = effective.enabled ?? true;
44
+ const baseUrl = (effective.baseUrl ?? "").trim() || DEFAULT_BASE_URL;
45
+ const token = (effective.token ?? "").trim();
46
+ const tokenFile = (effective.tokenFile ?? "").trim();
47
+ const configured = Boolean(token || tokenFile);
48
+ return {
49
+ accountId: requested,
50
+ name: effective.name?.trim() || requested,
51
+ enabled,
52
+ configured,
53
+ baseUrl: baseUrl || null,
54
+ token: token || null,
55
+ tokenFile: tokenFile || null,
56
+ config: effective,
57
+ };
58
+ }
59
+ export async function resolveInlineToken(account) {
60
+ const inlineToken = (account.token ?? "").trim();
61
+ if (inlineToken)
62
+ return inlineToken;
63
+ const tokenFile = (account.tokenFile ?? "").trim();
64
+ if (!tokenFile)
65
+ throw new Error("Inline token missing (set channels.inline.token or channels.inline.tokenFile)");
66
+ const raw = await readFile(tokenFile, "utf8");
67
+ const token = raw.trim();
68
+ if (!token)
69
+ throw new Error(`Inline tokenFile is empty: ${tokenFile}`);
70
+ return token;
71
+ }
72
+ //# sourceMappingURL=accounts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accounts.js","sourceRoot":"","sources":["../../src/inline/accounts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { type ChannelPlugin } from "openclaw/plugin-sdk";
2
+ import { type ResolvedInlineAccount } from "./accounts.js";
3
+ export declare const inlineChannelPlugin: ChannelPlugin<ResolvedInlineAccount>;
4
+ //# sourceMappingURL=channel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channel.d.ts","sourceRoot":"","sources":["../../src/inline/channel.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,aAAa,EAEnB,MAAM,qBAAqB,CAAA;AAG5B,OAAO,EAKL,KAAK,qBAAqB,EAC3B,MAAM,eAAe,CAAA;AAgItB,eAAO,MAAM,mBAAmB,EAAE,aAAa,CAAC,qBAAqB,CAgMpE,CAAA"}
@@ -0,0 +1,288 @@
1
+ import { buildChannelConfigSchema, DEFAULT_ACCOUNT_ID, formatPairingApproveHint, PAIRING_APPROVED_MESSAGE, } from "openclaw/plugin-sdk";
2
+ import { InlineSdkClient } from "@inline-chat/realtime-sdk";
3
+ import { InlineConfigSchema } from "./config-schema.js";
4
+ import { listInlineAccountIds, resolveDefaultInlineAccountId, resolveInlineAccount, resolveInlineToken, } from "./accounts.js";
5
+ import { looksLikeInlineTargetId, normalizeInlineTarget } from "./normalize.js";
6
+ import { monitorInlineProvider } from "./monitor.js";
7
+ import { getInlineRuntime } from "../runtime.js";
8
+ const activeMonitors = new Map();
9
+ const meta = {
10
+ id: "inline",
11
+ label: "Inline",
12
+ selectionLabel: "Inline (native)",
13
+ docsPath: "/channels/inline",
14
+ docsLabel: "inline",
15
+ blurb: "Inline Chat via realtime RPC (bot token).",
16
+ aliases: ["inline-chat"],
17
+ order: 30,
18
+ quickstartAllowFrom: true,
19
+ };
20
+ function normalizeInlineAllowEntry(raw) {
21
+ return raw.trim().replace(/^inline:/i, "").replace(/^user:/i, "");
22
+ }
23
+ async function notifyPairingApprovedInline(params) {
24
+ const normalizedId = normalizeInlineAllowEntry(params.id);
25
+ if (!normalizedId)
26
+ return;
27
+ let userId;
28
+ try {
29
+ userId = BigInt(normalizedId);
30
+ }
31
+ catch {
32
+ throw new Error(`inline pairing notify: invalid user id "${params.id}"`);
33
+ }
34
+ const accountId = resolveDefaultInlineAccountId(params.cfg);
35
+ const account = resolveInlineAccount({ cfg: params.cfg, accountId });
36
+ if (!account.configured || !account.baseUrl) {
37
+ throw new Error(`Inline not configured for account "${account.accountId}" (missing token or baseUrl)`);
38
+ }
39
+ const token = await resolveInlineToken(account);
40
+ const client = new InlineSdkClient({
41
+ baseUrl: account.baseUrl,
42
+ token,
43
+ });
44
+ await client.connect();
45
+ try {
46
+ await client.sendMessage({
47
+ userId,
48
+ text: PAIRING_APPROVED_MESSAGE,
49
+ parseMarkdown: account.config.parseMarkdown ?? true,
50
+ });
51
+ }
52
+ finally {
53
+ await client.close().catch(() => { });
54
+ }
55
+ }
56
+ async function sendMessageInline(params) {
57
+ const account = resolveInlineAccount({ cfg: params.cfg, accountId: params.accountId ?? null });
58
+ if (!account.configured || !account.baseUrl) {
59
+ throw new Error(`Inline not configured for account "${account.accountId}" (missing token or baseUrl)`);
60
+ }
61
+ const token = await resolveInlineToken(account);
62
+ const normalizedTarget = normalizeInlineTarget(params.to) ?? params.to.trim();
63
+ if (!normalizedTarget) {
64
+ throw new Error("inline sendText: missing target");
65
+ }
66
+ if (!/^[0-9]+$/.test(normalizedTarget)) {
67
+ throw new Error(`inline sendText: invalid target "${params.to}" (expected chat id)`);
68
+ }
69
+ const chatId = BigInt(normalizedTarget);
70
+ const client = new InlineSdkClient({
71
+ baseUrl: account.baseUrl,
72
+ token,
73
+ });
74
+ await client.connect();
75
+ try {
76
+ const parseInlineId = (raw) => {
77
+ if (raw == null)
78
+ return undefined;
79
+ if (typeof raw === "bigint")
80
+ return raw;
81
+ if (typeof raw === "number") {
82
+ if (!Number.isFinite(raw) || !Number.isInteger(raw) || raw < 0)
83
+ return undefined;
84
+ return BigInt(raw);
85
+ }
86
+ if (typeof raw === "string") {
87
+ const trimmed = raw.trim();
88
+ if (!trimmed)
89
+ return undefined;
90
+ try {
91
+ return BigInt(trimmed);
92
+ }
93
+ catch {
94
+ return undefined;
95
+ }
96
+ }
97
+ return undefined;
98
+ };
99
+ // Inline "threads" are modeled as chats (chatId). OpenClaw's threadId is not a message id.
100
+ // Only map OpenClaw replyToId -> Inline replyToMsgId.
101
+ const replyToMsgId = parseInlineId(params.replyToId);
102
+ const result = await client.sendMessage({
103
+ chatId,
104
+ text: params.text,
105
+ ...(replyToMsgId != null ? { replyToMsgId } : {}),
106
+ parseMarkdown: account.config.parseMarkdown ?? true,
107
+ });
108
+ const bestEffort = result.messageId != null ? String(result.messageId) : BigInt(Date.now()).toString();
109
+ return { messageId: bestEffort, chatId: normalizedTarget };
110
+ }
111
+ finally {
112
+ await client.close().catch(() => { });
113
+ }
114
+ }
115
+ export const inlineChannelPlugin = {
116
+ id: "inline",
117
+ meta,
118
+ capabilities: {
119
+ chatTypes: ["direct", "group"],
120
+ media: false,
121
+ reactions: false,
122
+ threads: false,
123
+ nativeCommands: false,
124
+ blockStreaming: true,
125
+ },
126
+ reload: { configPrefixes: ["channels.inline"] },
127
+ configSchema: buildChannelConfigSchema(InlineConfigSchema),
128
+ config: {
129
+ listAccountIds: (cfg) => listInlineAccountIds(cfg),
130
+ resolveAccount: (cfg, accountId) => resolveInlineAccount({ cfg, accountId: accountId ?? null }),
131
+ defaultAccountId: (cfg) => resolveDefaultInlineAccountId(cfg),
132
+ isConfigured: (account) => account.configured,
133
+ describeAccount: (account) => ({
134
+ accountId: account.accountId,
135
+ name: account.name,
136
+ enabled: account.enabled,
137
+ configured: account.configured,
138
+ baseUrl: account.baseUrl ? "[set]" : "[missing]",
139
+ tokenSource: account.token ? "config" : account.tokenFile ? "file" : "missing",
140
+ }),
141
+ resolveAllowFrom: ({ cfg, accountId }) => (resolveInlineAccount({ cfg, accountId: accountId ?? null }).config.allowFrom ?? []).map((entry) => normalizeInlineAllowEntry(String(entry))),
142
+ formatAllowFrom: ({ allowFrom }) => allowFrom
143
+ .map((entry) => String(entry).trim())
144
+ .filter(Boolean)
145
+ .map((entry) => normalizeInlineAllowEntry(entry)),
146
+ },
147
+ pairing: {
148
+ idLabel: "inlineUserId",
149
+ normalizeAllowEntry: (entry) => normalizeInlineAllowEntry(entry),
150
+ notifyApproval: async ({ cfg, id }) => {
151
+ await notifyPairingApprovedInline({ cfg, id });
152
+ },
153
+ },
154
+ security: {
155
+ resolveDmPolicy: ({ cfg, accountId, account }) => {
156
+ const resolvedAccountId = accountId ?? account.accountId ?? DEFAULT_ACCOUNT_ID;
157
+ const useAccountPath = Boolean(cfg.channels?.inline?.accounts?.[resolvedAccountId]);
158
+ const basePath = useAccountPath
159
+ ? `channels.inline.accounts.${resolvedAccountId}.`
160
+ : "channels.inline.";
161
+ return {
162
+ policy: account.config.dmPolicy ?? "pairing",
163
+ allowFrom: account.config.allowFrom ?? [],
164
+ policyPath: `${basePath}dmPolicy`,
165
+ allowFromPath: `${basePath}allowFrom`,
166
+ approveHint: formatPairingApproveHint("inline"),
167
+ normalizeEntry: (raw) => normalizeInlineAllowEntry(raw),
168
+ };
169
+ },
170
+ },
171
+ messaging: {
172
+ normalizeTarget: normalizeInlineTarget,
173
+ targetResolver: {
174
+ looksLikeId: looksLikeInlineTargetId,
175
+ hint: "<chatId>",
176
+ },
177
+ },
178
+ outbound: {
179
+ deliveryMode: "direct",
180
+ chunker: (text, limit) => getInlineRuntime().channel.text.chunkMarkdownText(text, limit),
181
+ chunkerMode: "markdown",
182
+ textChunkLimit: 4000,
183
+ sendText: async ({ cfg, to, text, accountId, replyToId, threadId }) => {
184
+ // Inline threads are modeled as chats. OpenClaw threadId isn't a message id for Inline.
185
+ const result = await sendMessageInline({
186
+ cfg,
187
+ to,
188
+ text,
189
+ accountId: accountId ?? null,
190
+ replyToId: replyToId ?? null,
191
+ });
192
+ return { channel: "inline", to, messageId: result.messageId, chatId: result.chatId };
193
+ },
194
+ sendMedia: async ({ cfg, to, text, mediaUrl, accountId, replyToId, threadId }) => {
195
+ // Inline threads are modeled as chats. OpenClaw threadId isn't a message id for Inline.
196
+ const combined = mediaUrl ? `${text}\n\nAttachment: ${mediaUrl}` : text;
197
+ const result = await sendMessageInline({
198
+ cfg,
199
+ to,
200
+ text: combined,
201
+ accountId: accountId ?? null,
202
+ replyToId: replyToId ?? null,
203
+ });
204
+ return { channel: "inline", to, messageId: result.messageId, chatId: result.chatId };
205
+ },
206
+ },
207
+ status: {
208
+ defaultRuntime: {
209
+ accountId: DEFAULT_ACCOUNT_ID,
210
+ running: false,
211
+ lastStartAt: null,
212
+ lastStopAt: null,
213
+ lastError: null,
214
+ },
215
+ buildChannelSummary: ({ snapshot }) => ({
216
+ configured: snapshot.configured ?? false,
217
+ running: snapshot.running ?? false,
218
+ lastStartAt: snapshot.lastStartAt ?? null,
219
+ lastStopAt: snapshot.lastStopAt ?? null,
220
+ lastError: snapshot.lastError ?? null,
221
+ lastInboundAt: snapshot.lastInboundAt ?? null,
222
+ lastOutboundAt: snapshot.lastOutboundAt ?? null,
223
+ }),
224
+ buildAccountSnapshot: ({ account, runtime }) => ({
225
+ accountId: account.accountId,
226
+ name: account.name,
227
+ enabled: account.enabled,
228
+ configured: account.configured,
229
+ baseUrl: account.baseUrl ? "[set]" : "[missing]",
230
+ tokenSource: account.token ? "config" : account.tokenFile ? "file" : "missing",
231
+ running: runtime?.running ?? false,
232
+ lastStartAt: runtime?.lastStartAt ?? null,
233
+ lastStopAt: runtime?.lastStopAt ?? null,
234
+ lastError: runtime?.lastError ?? null,
235
+ lastInboundAt: runtime?.lastInboundAt ?? null,
236
+ lastOutboundAt: runtime?.lastOutboundAt ?? null,
237
+ }),
238
+ },
239
+ gateway: {
240
+ startAccount: async (ctx) => {
241
+ const account = ctx.account;
242
+ if (!account.configured || !account.baseUrl) {
243
+ throw new Error(`Inline not configured for account "${account.accountId}" (missing baseUrl or token)`);
244
+ }
245
+ ctx.log?.info(`[${account.accountId}] starting Inline realtime monitor`);
246
+ // Best-effort stop if already running for this account.
247
+ const existing = activeMonitors.get(account.accountId);
248
+ if (existing) {
249
+ await existing.stop().catch(() => { });
250
+ activeMonitors.delete(account.accountId);
251
+ }
252
+ const now = Date.now();
253
+ ctx.setStatus({
254
+ ...ctx.getStatus(),
255
+ accountId: account.accountId,
256
+ configured: true,
257
+ running: true,
258
+ lastStartAt: now,
259
+ lastError: null,
260
+ });
261
+ const handle = await monitorInlineProvider({
262
+ cfg: ctx.cfg,
263
+ account,
264
+ runtime: ctx.runtime,
265
+ abortSignal: ctx.abortSignal,
266
+ ...(ctx.log ? { log: ctx.log } : {}),
267
+ statusSink: (patch) => {
268
+ ctx.setStatus({ ...ctx.getStatus(), ...patch });
269
+ },
270
+ });
271
+ activeMonitors.set(account.accountId, handle);
272
+ return handle;
273
+ },
274
+ stopAccount: async (ctx) => {
275
+ const existing = activeMonitors.get(ctx.account.accountId);
276
+ if (existing) {
277
+ await existing.stop().catch(() => { });
278
+ activeMonitors.delete(ctx.account.accountId);
279
+ }
280
+ ctx.setStatus({
281
+ ...ctx.getStatus(),
282
+ running: false,
283
+ lastStopAt: Date.now(),
284
+ });
285
+ },
286
+ },
287
+ };
288
+ //# sourceMappingURL=channel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channel.js","sourceRoot":"","sources":["../../src/inline/channel.ts"],"names":[],"mappings":"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"}