@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 +116 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/inline/accounts.d.ts +20 -0
- package/dist/inline/accounts.d.ts.map +1 -0
- package/dist/inline/accounts.js +72 -0
- package/dist/inline/accounts.js.map +1 -0
- package/dist/inline/channel.d.ts +4 -0
- package/dist/inline/channel.d.ts.map +1 -0
- package/dist/inline/channel.js +288 -0
- package/dist/inline/channel.js.map +1 -0
- package/dist/inline/config-schema.d.ts +166 -0
- package/dist/inline/config-schema.d.ts.map +1 -0
- package/dist/inline/config-schema.js +43 -0
- package/dist/inline/config-schema.js.map +1 -0
- package/dist/inline/monitor.d.ts +25 -0
- package/dist/inline/monitor.d.ts.map +1 -0
- package/dist/inline/monitor.js +401 -0
- package/dist/inline/monitor.js.map +1 -0
- package/dist/inline/normalize.d.ts +3 -0
- package/dist/inline/normalize.d.ts.map +1 -0
- package/dist/inline/normalize.js +19 -0
- package/dist/inline/normalize.js.map +1 -0
- package/dist/runtime.d.ts +4 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +11 -0
- package/dist/runtime.js.map +1 -0
- package/openclaw.plugin.json +11 -0
- package/package.json +67 -0
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: ["*"]`.
|
package/dist/index.d.ts
ADDED
|
@@ -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 @@
|
|
|
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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"}
|