openryoko 2026.9.3 → 2026.9.5
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/dist/package.json +1 -1
- package/dist/src/connectors/discord/engaged-threads.d.ts +24 -0
- package/dist/src/connectors/discord/engaged-threads.d.ts.map +1 -0
- package/dist/src/connectors/discord/engaged-threads.js +28 -0
- package/dist/src/connectors/discord/engaged-threads.js.map +1 -0
- package/dist/src/connectors/discord/index.d.ts +91 -3
- package/dist/src/connectors/discord/index.d.ts.map +1 -1
- package/dist/src/connectors/discord/index.js +386 -34
- package/dist/src/connectors/discord/index.js.map +1 -1
- package/dist/src/connectors/discord/remote.d.ts +16 -1
- package/dist/src/connectors/discord/remote.d.ts.map +1 -1
- package/dist/src/connectors/discord/remote.js +70 -1
- package/dist/src/connectors/discord/remote.js.map +1 -1
- package/dist/src/connectors/discord/respond-policy.d.ts +96 -0
- package/dist/src/connectors/discord/respond-policy.d.ts.map +1 -0
- package/dist/src/connectors/discord/respond-policy.js +85 -0
- package/dist/src/connectors/discord/respond-policy.js.map +1 -0
- package/dist/src/connectors/discord/threads.d.ts +20 -2
- package/dist/src/connectors/discord/threads.d.ts.map +1 -1
- package/dist/src/connectors/discord/threads.js +28 -1
- package/dist/src/connectors/discord/threads.js.map +1 -1
- package/dist/src/connectors/slack/agents-canvas.d.ts +1 -0
- package/dist/src/connectors/slack/agents-canvas.d.ts.map +1 -1
- package/dist/src/connectors/slack/agents-canvas.js +75 -22
- package/dist/src/connectors/slack/agents-canvas.js.map +1 -1
- package/dist/src/gateway/api.d.ts +4 -0
- package/dist/src/gateway/api.d.ts.map +1 -1
- package/dist/src/gateway/api.js +25 -2
- package/dist/src/gateway/api.js.map +1 -1
- package/dist/src/gateway/server.d.ts.map +1 -1
- package/dist/src/gateway/server.js +2 -0
- package/dist/src/gateway/server.js.map +1 -1
- package/dist/src/sessions/context.d.ts +32 -7
- package/dist/src/sessions/context.d.ts.map +1 -1
- package/dist/src/sessions/context.js +81 -12
- package/dist/src/sessions/context.js.map +1 -1
- package/dist/src/sessions/manager.d.ts.map +1 -1
- package/dist/src/sessions/manager.js +18 -3
- package/dist/src/sessions/manager.js.map +1 -1
- package/dist/src/shared/types.d.ts +63 -10
- package/dist/src/shared/types.d.ts.map +1 -1
- package/dist/web/404.html +1 -1
- package/dist/web/__next.__PAGE__.txt +1 -1
- package/dist/web/__next._full.txt +1 -1
- package/dist/web/__next._tree.txt +1 -1
- package/dist/web/_next/static/chunks/{0los6agi5yfk-.js → 1ydtstxdw369l.js} +1 -1
- package/dist/web/_not-found/__next._full.txt +1 -1
- package/dist/web/_not-found/__next._not-found.__PAGE__.txt +1 -1
- package/dist/web/_not-found/__next._tree.txt +1 -1
- package/dist/web/_not-found.html +1 -1
- package/dist/web/_not-found.txt +1 -1
- package/dist/web/chat/__next._full.txt +1 -1
- package/dist/web/chat/__next._tree.txt +1 -1
- package/dist/web/chat/__next.chat.__PAGE__.txt +1 -1
- package/dist/web/chat.html +1 -1
- package/dist/web/chat.txt +1 -1
- package/dist/web/cron/__next._full.txt +1 -1
- package/dist/web/cron/__next._tree.txt +1 -1
- package/dist/web/cron/__next.cron.__PAGE__.txt +1 -1
- package/dist/web/cron.html +1 -1
- package/dist/web/cron.txt +1 -1
- package/dist/web/index.html +1 -1
- package/dist/web/index.txt +1 -1
- package/dist/web/kanban/__next._full.txt +1 -1
- package/dist/web/kanban/__next._tree.txt +1 -1
- package/dist/web/kanban/__next.kanban.__PAGE__.txt +1 -1
- package/dist/web/kanban.html +1 -1
- package/dist/web/kanban.txt +1 -1
- package/dist/web/logs/__next._full.txt +1 -1
- package/dist/web/logs/__next._tree.txt +1 -1
- package/dist/web/logs/__next.logs.__PAGE__.txt +1 -1
- package/dist/web/logs.html +1 -1
- package/dist/web/logs.txt +1 -1
- package/dist/web/org/__next._full.txt +1 -1
- package/dist/web/org/__next._tree.txt +1 -1
- package/dist/web/org/__next.org.__PAGE__.txt +1 -1
- package/dist/web/org.html +1 -1
- package/dist/web/org.txt +1 -1
- package/dist/web/sessions/__next._full.txt +1 -1
- package/dist/web/sessions/__next._tree.txt +1 -1
- package/dist/web/sessions/__next.sessions.__PAGE__.txt +1 -1
- package/dist/web/sessions.html +1 -1
- package/dist/web/sessions.txt +1 -1
- package/dist/web/settings/__next._full.txt +2 -2
- package/dist/web/settings/__next._tree.txt +1 -1
- package/dist/web/settings/__next.settings.__PAGE__.txt +2 -2
- package/dist/web/settings.html +1 -1
- package/dist/web/settings.txt +2 -2
- package/dist/web/skills/__next._full.txt +1 -1
- package/dist/web/skills/__next._tree.txt +1 -1
- package/dist/web/skills/__next.skills.__PAGE__.txt +1 -1
- package/dist/web/skills.html +1 -1
- package/dist/web/skills.txt +1 -1
- package/package.json +1 -1
- package/template/AGENTS.md +1 -1
- package/template/CLAUDE.md +1 -1
- package/template/config.default.yaml +13 -5
- package/template/docs/connectors.md +93 -1
- /package/dist/web/_next/static/{Kudq_QcLnSoz7UYDmluYu → vW8A0EhHuyi1vRgv7Qkyg}/_buildManifest.js +0 -0
- /package/dist/web/_next/static/{Kudq_QcLnSoz7UYDmluYu → vW8A0EhHuyi1vRgv7Qkyg}/_clientMiddlewareManifest.js +0 -0
- /package/dist/web/_next/static/{Kudq_QcLnSoz7UYDmluYu → vW8A0EhHuyi1vRgv7Qkyg}/_ssgManifest.js +0 -0
package/dist/package.json
CHANGED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-memory record of conversation anchors the bot has engaged: threads it
|
|
3
|
+
* replied or reacted in, plus the IDs of eligible messages it sent or
|
|
4
|
+
* reacted to — a Discord public thread created from a message reuses that
|
|
5
|
+
* message's ID, so recording message IDs makes future threads rooted on the
|
|
6
|
+
* bot's own messages count as engaged from their first reply.
|
|
7
|
+
*
|
|
8
|
+
* Backs the `respondTo.engagedThreads` continuation. No eviction, matching
|
|
9
|
+
* the Slack ConversationTracker: engagement is a promise ("mention once,
|
|
10
|
+
* then converse"), and silently evicting it would re-arm the mention
|
|
11
|
+
* requirement mid-conversation. Memory stays bounded by what the connector
|
|
12
|
+
* feeds in (see `DiscordConnector.recordEngagement`): nothing at all unless
|
|
13
|
+
* a consumer exists, and only anchor-eligible IDs — DM and in-thread message
|
|
14
|
+
* IDs can never root a thread and are never recorded. At the ~60-70 bytes a
|
|
15
|
+
* Set entry really costs, even hundreds of thousands of anchors stay in the
|
|
16
|
+
* tens of megabytes. Entries live until the connector is recreated (gateway
|
|
17
|
+
* restart, config save, connector reload).
|
|
18
|
+
*/
|
|
19
|
+
export declare class EngagedThreadTracker {
|
|
20
|
+
private readonly ids;
|
|
21
|
+
record(id: string): void;
|
|
22
|
+
has(id: string): boolean;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=engaged-threads.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engaged-threads.d.ts","sourceRoot":"","sources":["../../../../src/connectors/discord/engaged-threads.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAqB;IAEzC,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAIxB,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;CAGzB"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-memory record of conversation anchors the bot has engaged: threads it
|
|
3
|
+
* replied or reacted in, plus the IDs of eligible messages it sent or
|
|
4
|
+
* reacted to — a Discord public thread created from a message reuses that
|
|
5
|
+
* message's ID, so recording message IDs makes future threads rooted on the
|
|
6
|
+
* bot's own messages count as engaged from their first reply.
|
|
7
|
+
*
|
|
8
|
+
* Backs the `respondTo.engagedThreads` continuation. No eviction, matching
|
|
9
|
+
* the Slack ConversationTracker: engagement is a promise ("mention once,
|
|
10
|
+
* then converse"), and silently evicting it would re-arm the mention
|
|
11
|
+
* requirement mid-conversation. Memory stays bounded by what the connector
|
|
12
|
+
* feeds in (see `DiscordConnector.recordEngagement`): nothing at all unless
|
|
13
|
+
* a consumer exists, and only anchor-eligible IDs — DM and in-thread message
|
|
14
|
+
* IDs can never root a thread and are never recorded. At the ~60-70 bytes a
|
|
15
|
+
* Set entry really costs, even hundreds of thousands of anchors stay in the
|
|
16
|
+
* tens of megabytes. Entries live until the connector is recreated (gateway
|
|
17
|
+
* restart, config save, connector reload).
|
|
18
|
+
*/
|
|
19
|
+
export class EngagedThreadTracker {
|
|
20
|
+
ids = new Set();
|
|
21
|
+
record(id) {
|
|
22
|
+
this.ids.add(id);
|
|
23
|
+
}
|
|
24
|
+
has(id) {
|
|
25
|
+
return this.ids.has(id);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=engaged-threads.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engaged-threads.js","sourceRoot":"","sources":["../../../../src/connectors/discord/engaged-threads.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,OAAO,oBAAoB;IACd,GAAG,GAAG,IAAI,GAAG,EAAU,CAAC;IAEzC,MAAM,CAAC,EAAU;QACf,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACnB,CAAC;IAED,GAAG,CAAC,EAAU;QACZ,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC1B,CAAC;CACF"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Connector, ConnectorCapabilities, ConnectorHealth, IncomingMessage, Target } from "../../shared/types.js";
|
|
1
|
+
import type { Connector, ConnectorCapabilities, ConnectorHealth, DiscordReplyStyle, DiscordRespondToConfig, IncomingMessage, Target } from "../../shared/types.js";
|
|
2
2
|
export interface DiscordConnectorConfig {
|
|
3
3
|
/** Unique instance identifier (e.g. "discord-vox") */
|
|
4
4
|
id?: string;
|
|
@@ -10,10 +10,19 @@ export interface DiscordConnectorConfig {
|
|
|
10
10
|
guildId?: string;
|
|
11
11
|
/** Only respond to messages in this channel (right-click channel → Copy Channel ID) */
|
|
12
12
|
channelId?: string;
|
|
13
|
-
/** Route messages from specific channels to remote Jinn instances
|
|
14
|
-
|
|
13
|
+
/** Route messages from specific channels to remote Jinn instances. A plain
|
|
14
|
+
* string value is the remote's URL; the object form adds the bearer token
|
|
15
|
+
* the receiving gateway requires on /api/* when its auth is enabled. */
|
|
16
|
+
channelRouting?: Record<string, string | {
|
|
17
|
+
url: string;
|
|
18
|
+
token?: string;
|
|
19
|
+
}>;
|
|
15
20
|
/** If set, this instance proxies all Discord operations through the primary instance at this URL */
|
|
16
21
|
proxyVia?: string;
|
|
22
|
+
/** Deterministic per-scope response gate (DM / channel). See DiscordRespondToConfig. */
|
|
23
|
+
respondTo?: DiscordRespondToConfig;
|
|
24
|
+
/** Where responses land in flat guild channels. Default: "channel". */
|
|
25
|
+
replyStyle?: DiscordReplyStyle;
|
|
17
26
|
}
|
|
18
27
|
export declare class DiscordConnector implements Connector {
|
|
19
28
|
name: string;
|
|
@@ -26,6 +35,19 @@ export declare class DiscordConnector implements Connector {
|
|
|
26
35
|
private status;
|
|
27
36
|
private lastError;
|
|
28
37
|
private typingIntervals;
|
|
38
|
+
private engagedThreads;
|
|
39
|
+
private readonly replyStyle;
|
|
40
|
+
/** channelRouting normalized to { url, token } with string keys (YAML may
|
|
41
|
+
* parse snowflake keys as numbers and values may be plain URL strings). */
|
|
42
|
+
private readonly routing;
|
|
43
|
+
/**
|
|
44
|
+
* Channels where thread creation failed for a channel-level reason
|
|
45
|
+
* (missing permission / access). Both the session keying and the reply
|
|
46
|
+
* destination consult this, so after one failed turn the channel settles
|
|
47
|
+
* into consistent reply-style behavior instead of splitting every turn
|
|
48
|
+
* into a fresh thread-keyed session. In-memory; resets with the connector.
|
|
49
|
+
*/
|
|
50
|
+
private readonly threadStyleFailed;
|
|
29
51
|
constructor(config: DiscordConnectorConfig);
|
|
30
52
|
onMessage(handler: (msg: IncomingMessage) => void): void;
|
|
31
53
|
getEmployee(): string | undefined;
|
|
@@ -36,11 +58,77 @@ export declare class DiscordConnector implements Connector {
|
|
|
36
58
|
reconstructTarget(replyContext: Record<string, unknown> | null | undefined): Target;
|
|
37
59
|
sendMessage(target: Target, text: string): Promise<string | undefined>;
|
|
38
60
|
replyMessage(target: Target, text: string): Promise<string | undefined>;
|
|
61
|
+
/**
|
|
62
|
+
* Send a response in Discord-sized chunks. Only the first chunk carries
|
|
63
|
+
* the reply reference — one visual attachment per response, the rest
|
|
64
|
+
* reads as its continuation. Engagement is recorded per delivered chunk,
|
|
65
|
+
* so a partial send still counts. Failures are returned, not thrown, so
|
|
66
|
+
* the caller can see how far the send got.
|
|
67
|
+
*/
|
|
68
|
+
private sendChunks;
|
|
69
|
+
/**
|
|
70
|
+
* Where a response physically lands. Threads and DMs are already precise
|
|
71
|
+
* destinations and ignore replyStyle. In flat guild channels: "reply"
|
|
72
|
+
* attaches the response to the triggering message, "thread" opens (or
|
|
73
|
+
* reuses) the thread rooted on it, and "channel" keeps the legacy plain
|
|
74
|
+
* send. The thread path falls back to "reply" when the channel can't host
|
|
75
|
+
* message threads (voice/stage text chat) or when Discord refuses — a
|
|
76
|
+
* channel-level refusal (missing permission/access) is remembered so the
|
|
77
|
+
* session keying in handleMessage stops splitting turns into thread keys.
|
|
78
|
+
*/
|
|
79
|
+
private resolveReplyDestination;
|
|
39
80
|
editMessage(target: Target, text: string): Promise<void>;
|
|
40
81
|
addReaction(target: Target, emoji: string): Promise<void>;
|
|
41
82
|
removeReaction(target: Target, emoji: string): Promise<void>;
|
|
42
83
|
setTypingStatus(channelId: string, _threadTs: string | undefined, status: string): Promise<void>;
|
|
43
84
|
private handleMessage;
|
|
85
|
+
/**
|
|
86
|
+
* True when this flat-channel message's session should be keyed to the
|
|
87
|
+
* thread the reply will open (replyStyle=thread). Mirrors exactly the
|
|
88
|
+
* conditions under which resolveReplyDestination will actually attempt a
|
|
89
|
+
* thread, so the session key and the reply destination never diverge:
|
|
90
|
+
* channels that can't host message threads, channels where the bot lacks
|
|
91
|
+
* the thread permissions right now (checked per turn against the live
|
|
92
|
+
* permission cache), and channels where creation already failed at the
|
|
93
|
+
* channel level all stay channel-keyed from the first turn.
|
|
94
|
+
*/
|
|
95
|
+
private threadSessionEligible;
|
|
96
|
+
/**
|
|
97
|
+
* Pre-flight permission check for thread style, evaluated against the
|
|
98
|
+
* cached guild permissions so it costs no request. Optimistic when the
|
|
99
|
+
* answer is unknowable (no permissionsFor on the channel shape, member
|
|
100
|
+
* not cached) — the failure path in replyMessage self-heals those.
|
|
101
|
+
*/
|
|
102
|
+
private canOpenThreads;
|
|
103
|
+
/**
|
|
104
|
+
* Track engagement for the `respondTo.engagedThreads` continuation. Only
|
|
105
|
+
* anchor-eligible IDs whose engagement can actually be consumed are kept:
|
|
106
|
+
* the thread itself, or — in flat guild channels — the acted-on message,
|
|
107
|
+
* since a public thread created from a message reuses its ID. DM and
|
|
108
|
+
* in-thread message IDs can never root a thread and are never recorded,
|
|
109
|
+
* which keeps the unbounded tracker's real footprint small.
|
|
110
|
+
*/
|
|
111
|
+
private recordEngagement;
|
|
112
|
+
/**
|
|
113
|
+
* True when engagement recorded under this id can ever be read back. The
|
|
114
|
+
* local gate consults the tracker only when the channel scope is
|
|
115
|
+
* mention-gated with engagedThreads on (DMs have no threads, so dm=mention
|
|
116
|
+
* alone consumes nothing). The routed path consults it for messages whose
|
|
117
|
+
* channel id — or, for threads, parent channel id — is a channelRouting
|
|
118
|
+
* key; for a flat-channel anchor the future thread's parent is the channel
|
|
119
|
+
* itself, so its route counts too.
|
|
120
|
+
*/
|
|
121
|
+
private consumesEngagement;
|
|
122
|
+
/**
|
|
123
|
+
* Resolve who the message addresses. Reply attribution applies only to
|
|
124
|
+
* actual replies (`MessageType.Reply`) — a crosspost or forward also
|
|
125
|
+
* carries a `reference` but addresses nobody. `mentions.repliedUser` comes
|
|
126
|
+
* from the gateway's resolved reference and works whether or not the reply
|
|
127
|
+
* pinged; when Discord omitted the resolution and `allowFetch` is set,
|
|
128
|
+
* fall back to one fetch of the referenced message. A deleted reference
|
|
129
|
+
* stays undefined — no addressee.
|
|
130
|
+
*/
|
|
131
|
+
private resolveAddressing;
|
|
44
132
|
/** Forward a message to a remote Jinn instance via HTTP */
|
|
45
133
|
private proxyToRemote;
|
|
46
134
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/connectors/discord/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/connectors/discord/index.ts"],"names":[],"mappings":"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"}
|