@moxxy/plugin-channel-discord 0.28.1 → 0.30.0
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/approval.d.ts.map +1 -1
- package/dist/approval.js +2 -1
- package/dist/approval.js.map +1 -1
- package/dist/channel/message-handler.d.ts +1 -1
- package/dist/channel/message-handler.d.ts.map +1 -1
- package/dist/channel/message-handler.js +2 -0
- package/dist/channel/message-handler.js.map +1 -1
- package/dist/channel/turn-runner.d.ts +1 -1
- package/dist/channel/turn-runner.d.ts.map +1 -1
- package/dist/channel/turn-runner.js +7 -2
- package/dist/channel/turn-runner.js.map +1 -1
- package/dist/channel/typing-indicator.d.ts.map +1 -1
- package/dist/channel/typing-indicator.js +2 -1
- package/dist/channel/typing-indicator.js.map +1 -1
- package/dist/permission.d.ts.map +1 -1
- package/dist/permission.js +2 -1
- package/dist/permission.js.map +1 -1
- package/dist/render.d.ts +1 -1
- package/dist/render.d.ts.map +1 -1
- package/dist/render.js +4 -1
- package/dist/render.js.map +1 -1
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +2 -1
- package/dist/schema.js.map +1 -1
- package/package.json +5 -5
- package/src/approval.ts +2 -1
- package/src/channel/message-handler.ts +3 -2
- package/src/channel/turn-runner.test.ts +6 -3
- package/src/channel/turn-runner.ts +7 -3
- package/src/channel/typing-indicator.ts +2 -1
- package/src/channel/voice-handler.test.ts +5 -3
- package/src/permission.ts +2 -1
- package/src/render.ts +4 -2
- package/src/schema.ts +2 -1
- package/src/subcommands.test.ts +15 -15
package/dist/approval.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"approval.d.ts","sourceRoot":"","sources":["../src/approval.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEtF,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC;IAClC,QAAQ,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,gBAAgB,KAAK,IAAI,CAAC;CACxD;AAED;;;;;;GAMG;AACH,qBAAa,uBAAwB,YAAW,gBAAgB;IAC9D,QAAQ,CAAC,IAAI,sBAAsB;IACnC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsC;IAC9D,OAAO,CAAC,SAAS,CAA0E;IAC3F,OAAO,CAAC,MAAM,CAAK;IAEnB,UAAU,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAIvE,OAAO,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"approval.d.ts","sourceRoot":"","sources":["../src/approval.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEtF,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC;IAClC,QAAQ,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,gBAAgB,KAAK,IAAI,CAAC;CACxD;AAED;;;;;;GAMG;AACH,qBAAa,uBAAwB,YAAW,gBAAgB;IAC9D,QAAQ,CAAC,IAAI,sBAAsB;IACnC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsC;IAC9D,OAAO,CAAC,SAAS,CAA0E;IAC3F,OAAO,CAAC,MAAM,CAAK;IAEnB,UAAU,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAIvE,OAAO,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAmBlE,8EAA8E;IAC9E,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IAInD,oDAAoD;IACpD,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO;IAQrD,2DAA2D;IAC3D,sBAAsB,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO;IAQ3E,QAAQ,CAAC,MAAM,SAAmB,GAAG,IAAI;CAS1C"}
|
package/dist/approval.js
CHANGED
|
@@ -18,10 +18,11 @@ export class DiscordApprovalResolver {
|
|
|
18
18
|
// No bot wired up — best fallback is the request's defaultOptionId.
|
|
19
19
|
return { optionId: request.defaultOptionId ?? request.options[0]?.id ?? 'approve' };
|
|
20
20
|
}
|
|
21
|
+
const decider = this.deciderFn;
|
|
21
22
|
const id = `appr_${this.nextId++}`;
|
|
22
23
|
return new Promise((resolve) => {
|
|
23
24
|
this.pending.set(id, { id, request, resolve });
|
|
24
|
-
|
|
25
|
+
decider(id, request).catch((err) => {
|
|
25
26
|
this.pending.delete(id);
|
|
26
27
|
resolve({
|
|
27
28
|
optionId: request.defaultOptionId ?? request.options[0]?.id ?? 'cancel',
|
package/dist/approval.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"approval.js","sourceRoot":"","sources":["../src/approval.ts"],"names":[],"mappings":"AAQA;;;;;;GAMG;AACH,MAAM,OAAO,uBAAuB;IACzB,IAAI,GAAG,kBAAkB,CAAC;IAClB,OAAO,GAAG,IAAI,GAAG,EAA2B,CAAC;IACtD,SAAS,GAAqE,IAAI,CAAC;IACnF,MAAM,GAAG,CAAC,CAAC;IAEnB,UAAU,CAAC,EAA2D;QACpE,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,OAAwB;QACpC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,oEAAoE;YACpE,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,SAAS,EAAE,CAAC;QACtF,CAAC;QACD,MAAM,EAAE,GAAG,QAAQ,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;QACnC,OAAO,IAAI,OAAO,CAAmB,CAAC,OAAO,EAAE,EAAE;YAC/C,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;YAC/C,
|
|
1
|
+
{"version":3,"file":"approval.js","sourceRoot":"","sources":["../src/approval.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type ChannelHandle, type ClientSession as Session } from '@moxxy/sdk';
|
|
2
2
|
import type { InboundMessage } from '../schema.js';
|
|
3
3
|
import type { DiscordApprovalResolver } from '../approval.js';
|
|
4
4
|
import type { DiscordPermissionResolver } from '../permission.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"message-handler.d.ts","sourceRoot":"","sources":["../../src/channel/message-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"message-handler.d.ts","sourceRoot":"","sources":["../../src/channel/message-handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { assertDefined } from '@moxxy/sdk';
|
|
1
2
|
import { gateInbound } from '../allow-list.js';
|
|
2
3
|
import { runSlash } from './slash-handler.js';
|
|
3
4
|
/**
|
|
@@ -73,6 +74,7 @@ export async function handleInboundMessage(ctx, state, deps, cb) {
|
|
|
73
74
|
if (!state.session)
|
|
74
75
|
return;
|
|
75
76
|
const [head, ...rest] = text.split(/\s+/);
|
|
77
|
+
assertDefined(head, 'splitting a non-empty command string yields at least one token');
|
|
76
78
|
const reply = await runSlash(head.slice(1), rest.join(' '), state.session, {
|
|
77
79
|
toggleYolo: cb.toggleYolo,
|
|
78
80
|
voice: cb.voice,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"message-handler.js","sourceRoot":"","sources":["../../src/channel/message-handler.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"message-handler.js","sourceRoot":"","sources":["../../src/channel/message-handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { newTurnId } from '@moxxy/core';
|
|
2
|
-
import type
|
|
2
|
+
import { type ClientSession as Session } from '@moxxy/sdk';
|
|
3
3
|
import type { ChannelLogger, SendableChannelLike } from './discord-like.js';
|
|
4
4
|
import type { TypingIndicator } from './typing-indicator.js';
|
|
5
5
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"turn-runner.d.ts","sourceRoot":"","sources":["../../src/channel/turn-runner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"turn-runner.d.ts","sourceRoot":"","sources":["../../src/channel/turn-runner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAiB,KAAK,aAAa,IAAI,OAAO,EAAE,MAAM,YAAY,CAAC;AAG1E,OAAO,KAAK,EAAE,aAAa,EAAE,mBAAmB,EAAmB,MAAM,mBAAmB,CAAC;AAC7F,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAE7D;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,OAAQ,CAAC;AACvC,eAAO,MAAM,qBAAqB,OAAQ,CAAC;AAE3C,gEAAgE;AAChE,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAGtE;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,mBAAmB,CAAC;IACtC,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC;IACjC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,CAAC,EAAE,aAAa,CAAC;IAChC;;;;OAIG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACzD;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,QAAQ,CAAC,UAAU,EAAE,eAAe,CAAC;IACrC,oEAAoE;IACpE,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,SAAS,CAAC,CAAC;CAC/C;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,cAAc,CAClC,IAAI,EAAE,kBAAkB,EACxB,IAAI,EAAE,qBAAqB,GAC1B,OAAO,CAAC,IAAI,CAAC,CAkFf"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { assertDefined } from '@moxxy/sdk';
|
|
1
2
|
import { FramePump, driveTurn, subscribeTurn } from '@moxxy/channel-kit';
|
|
2
3
|
import { DiscordTurnRenderer, splitForDiscord } from '../render.js';
|
|
3
4
|
/**
|
|
@@ -51,7 +52,9 @@ export async function runDiscordTurn(deps, opts) {
|
|
|
51
52
|
sink: {
|
|
52
53
|
send: async (t, final) => {
|
|
53
54
|
const parts = splitForDiscord(t);
|
|
54
|
-
const
|
|
55
|
+
const head = parts[0];
|
|
56
|
+
assertDefined(head, 'discord: FramePump never sinks empty text (emptyFinalText guarantees a part)');
|
|
57
|
+
const sent = await sendPart(head);
|
|
55
58
|
if (final)
|
|
56
59
|
for (const tail of parts.slice(1))
|
|
57
60
|
await sendPart(tail);
|
|
@@ -59,8 +62,10 @@ export async function runDiscordTurn(deps, opts) {
|
|
|
59
62
|
},
|
|
60
63
|
edit: async (message, t, final) => {
|
|
61
64
|
const parts = splitForDiscord(t);
|
|
65
|
+
const head = parts[0];
|
|
66
|
+
assertDefined(head, 'discord: FramePump never sinks empty text (emptyFinalText guarantees a part)');
|
|
62
67
|
try {
|
|
63
|
-
await message.edit(
|
|
68
|
+
await message.edit(head);
|
|
64
69
|
}
|
|
65
70
|
catch (err) {
|
|
66
71
|
logger?.warn('discord edit failed', { err: String(err) });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"turn-runner.js","sourceRoot":"","sources":["../../src/channel/turn-runner.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"turn-runner.js","sourceRoot":"","sources":["../../src/channel/turn-runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"typing-indicator.d.ts","sourceRoot":"","sources":["../../src/channel/typing-indicator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAK7D;;;;GAIG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,KAAK,CAA+C;IAE5D,KAAK,CAAC,OAAO,EAAE,mBAAmB,GAAG,IAAI;
|
|
1
|
+
{"version":3,"file":"typing-indicator.d.ts","sourceRoot":"","sources":["../../src/channel/typing-indicator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAK7D;;;;GAIG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,KAAK,CAA+C;IAE5D,KAAK,CAAC,OAAO,EAAE,mBAAmB,GAAG,IAAI;IAYzC,IAAI,IAAI,IAAI;CAMb"}
|
|
@@ -11,8 +11,9 @@ export class TypingIndicator {
|
|
|
11
11
|
this.stop();
|
|
12
12
|
if (!channel.sendTyping)
|
|
13
13
|
return;
|
|
14
|
+
const sendTyping = channel.sendTyping;
|
|
14
15
|
const ping = () => {
|
|
15
|
-
void
|
|
16
|
+
void sendTyping().catch(() => undefined);
|
|
16
17
|
};
|
|
17
18
|
ping();
|
|
18
19
|
this.timer = setInterval(ping, REFRESH_MS);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"typing-indicator.js","sourceRoot":"","sources":["../../src/channel/typing-indicator.ts"],"names":[],"mappings":"AAEA,sFAAsF;AACtF,MAAM,UAAU,GAAG,KAAK,CAAC;AAEzB;;;;GAIG;AACH,MAAM,OAAO,eAAe;IAClB,KAAK,GAA0C,IAAI,CAAC;IAE5D,KAAK,CAAC,OAA4B;QAChC,IAAI,CAAC,IAAI,EAAE,CAAC;QACZ,IAAI,CAAC,OAAO,CAAC,UAAU;YAAE,OAAO;QAChC,MAAM,IAAI,GAAG,GAAS,EAAE;YACtB,KAAK,
|
|
1
|
+
{"version":3,"file":"typing-indicator.js","sourceRoot":"","sources":["../../src/channel/typing-indicator.ts"],"names":[],"mappings":"AAEA,sFAAsF;AACtF,MAAM,UAAU,GAAG,KAAK,CAAC;AAEzB;;;;GAIG;AACH,MAAM,OAAO,eAAe;IAClB,KAAK,GAA0C,IAAI,CAAC;IAE5D,KAAK,CAAC,OAA4B;QAChC,IAAI,CAAC,IAAI,EAAE,CAAC;QACZ,IAAI,CAAC,OAAO,CAAC,UAAU;YAAE,OAAO;QAChC,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;QACtC,MAAM,IAAI,GAAG,GAAS,EAAE;YACtB,KAAK,UAAU,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAC3C,CAAC,CAAC;QACF,IAAI,EAAE,CAAC;QACP,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QAC3C,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;IACvB,CAAC;IAED,IAAI;QACF,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC1B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QACpB,CAAC;IACH,CAAC;CACF"}
|
package/dist/permission.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"permission.d.ts","sourceRoot":"","sources":["../src/permission.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,EACnB,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;IAC/B,QAAQ,CAAC,GAAG,EAAE,iBAAiB,CAAC;IAChC,QAAQ,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,kBAAkB,KAAK,IAAI,CAAC;CAC1D;AAED;;;;;;;;;GASG;AACH,qBAAa,yBAA0B,YAAW,kBAAkB;IAClE,QAAQ,CAAC,IAAI,aAAa;IAC1B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAwC;IAChE,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAqB;IACnD,OAAO,CAAC,SAAS,CACV;IAEP,UAAU,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,eAAe,EAAE,GAAG,EAAE,iBAAiB,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAIhF,KAAK,CAAC,IAAI,EAAE,eAAe,EAAE,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"permission.d.ts","sourceRoot":"","sources":["../src/permission.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,EACnB,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;IAC/B,QAAQ,CAAC,GAAG,EAAE,iBAAiB,CAAC;IAChC,QAAQ,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,kBAAkB,KAAK,IAAI,CAAC;CAC1D;AAED;;;;;;;;;GASG;AACH,qBAAa,yBAA0B,YAAW,kBAAkB;IAClE,QAAQ,CAAC,IAAI,aAAa;IAC1B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAwC;IAChE,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAqB;IACnD,OAAO,CAAC,SAAS,CACV;IAEP,UAAU,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,eAAe,EAAE,GAAG,EAAE,iBAAiB,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAIhF,KAAK,CAAC,IAAI,EAAE,eAAe,EAAE,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAmBvF,6EAA6E;IAC7E,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,kBAAkB,GAAG,OAAO;IAQrE,oFAAoF;IACpF,QAAQ,CAAC,MAAM,SAAmB,GAAG,IAAI;CAM1C"}
|
package/dist/permission.js
CHANGED
|
@@ -23,9 +23,10 @@ export class DiscordPermissionResolver {
|
|
|
23
23
|
if (!this.deciderFn) {
|
|
24
24
|
return { mode: 'deny', reason: 'no decider attached (bot not running)' };
|
|
25
25
|
}
|
|
26
|
+
const decider = this.deciderFn;
|
|
26
27
|
const decision = await new Promise((resolve) => {
|
|
27
28
|
this.pending.set(call.callId, { callId: call.callId, call, ctx, resolve });
|
|
28
|
-
|
|
29
|
+
decider(call, ctx).catch((err) => {
|
|
29
30
|
this.pending.delete(call.callId);
|
|
30
31
|
resolve({ mode: 'deny', reason: err instanceof Error ? err.message : String(err) });
|
|
31
32
|
});
|
package/dist/permission.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"permission.js","sourceRoot":"","sources":["../src/permission.ts"],"names":[],"mappings":"AAcA;;;;;;;;;GASG;AACH,MAAM,OAAO,yBAAyB;IAC3B,IAAI,GAAG,SAAS,CAAC;IACT,OAAO,GAAG,IAAI,GAAG,EAA6B,CAAC;IAC/C,aAAa,GAAG,IAAI,GAAG,EAAU,CAAC;IAC3C,SAAS,GACf,IAAI,CAAC;IAEP,UAAU,CAAC,EAAoE;QAC7E,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,IAAqB,EAAE,GAAsB;QACvD,IAAI,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACtC,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,kCAAkC,EAAE,CAAC;QAC/E,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,uCAAuC,EAAE,CAAC;QAC3E,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,IAAI,OAAO,CAAqB,CAAC,OAAO,EAAE,EAAE;YACjE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;YAC3E,
|
|
1
|
+
{"version":3,"file":"permission.js","sourceRoot":"","sources":["../src/permission.ts"],"names":[],"mappings":"AAcA;;;;;;;;;GASG;AACH,MAAM,OAAO,yBAAyB;IAC3B,IAAI,GAAG,SAAS,CAAC;IACT,OAAO,GAAG,IAAI,GAAG,EAA6B,CAAC;IAC/C,aAAa,GAAG,IAAI,GAAG,EAAU,CAAC;IAC3C,SAAS,GACf,IAAI,CAAC;IAEP,UAAU,CAAC,EAAoE;QAC7E,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,IAAqB,EAAE,GAAsB;QACvD,IAAI,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACtC,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,kCAAkC,EAAE,CAAC;QAC/E,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,uCAAuC,EAAE,CAAC;QAC3E,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC;QAC/B,MAAM,QAAQ,GAAG,MAAM,IAAI,OAAO,CAAqB,CAAC,OAAO,EAAE,EAAE;YACjE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;YAC3E,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;gBAC/B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACjC,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACtF,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QACH,IAAI,QAAQ,CAAC,IAAI,KAAK,eAAe;YAAE,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzE,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,6EAA6E;IAC7E,cAAc,CAAC,MAAc,EAAE,QAA4B;QACzD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACzC,IAAI,CAAC,OAAO;YAAE,OAAO,KAAK,CAAC;QAC3B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC5B,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC1B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,oFAAoF;IACpF,QAAQ,CAAC,MAAM,GAAG,gBAAgB;QAChC,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;YAC5C,OAAO,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QAC5C,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;CACF"}
|
package/dist/render.d.ts
CHANGED
package/dist/render.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAE5D;;;GAGG;AACH,eAAO,MAAM,qBAAqB,OAAQ,CAAC;AA8B3C,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,cAAc,CAAuB;IAC7C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAgC;IACtD,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,SAAS,CAAM;IAEvB,wEAAwE;IACxE,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO;IAkDlC,QAAQ,IAAI,MAAM;IAUlB;oDACgD;IAChD,SAAS,IAAI,MAAM;IAInB,KAAK,IAAI,IAAI;IASb,OAAO,CAAC,cAAc;CAcvB;AA2CD;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,GAAE,MAA8B,GAAG,MAAM,EAAE,CAwB7F"}
|
package/dist/render.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { assertDefined } from '@moxxy/sdk';
|
|
1
2
|
/**
|
|
2
3
|
* Discord messages cap at 2000 chars; leave margin for the fence-reopen text a
|
|
3
4
|
* split may prepend to a tail part.
|
|
@@ -197,7 +198,9 @@ function openFenceAt(text, idx, seed) {
|
|
|
197
198
|
const fenceRe = /(?:^|\n)(```[^\n]*)/g;
|
|
198
199
|
let m;
|
|
199
200
|
while ((m = fenceRe.exec(scan)) !== null) {
|
|
200
|
-
|
|
201
|
+
const fence = m[1];
|
|
202
|
+
assertDefined(fence, 'fenceRe has a mandatory capture group when it matches');
|
|
203
|
+
open = open === null ? fence : null;
|
|
201
204
|
}
|
|
202
205
|
return open;
|
|
203
206
|
}
|
package/dist/render.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render.js","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"render.js","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"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"}
|
package/dist/schema.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,YAAY,CAAC;AAG/B;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,OAAQ,CAAC;AAEvC,gFAAgF;AAChF,eAAO,MAAM,eAAe,QAAmB,CAAC;AAEhD,QAAA,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;EAMpB,CAAC;AAEH,eAAO,MAAM,oBAAoB;;IAE/B,oEAAoE;;;IAGpE,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAKpB,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAClE,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAEjE,2EAA2E;AAC3E,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,MAAM,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI,CAAC;IAC3E,QAAQ,CAAC,WAAW,CAAC,EAAE;QACrB,MAAM,CAAC,IAAI,gBAAgB,CAAC;YAC1B,QAAQ,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC;YACtB,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC;YACvB,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;YAC/B,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;YACxB,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;SACzB,CAAC,CAAC;KACJ,GAAG,IAAI,CAAC;CACV;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,cAAc,GAAG,cAAc,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,YAAY,CAAC;AAG/B;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,OAAQ,CAAC;AAEvC,gFAAgF;AAChF,eAAO,MAAM,eAAe,QAAmB,CAAC;AAEhD,QAAA,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;EAMpB,CAAC;AAEH,eAAO,MAAM,oBAAoB;;IAE/B,oEAAoE;;;IAGpE,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAKpB,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAClE,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAEjE,2EAA2E;AAC3E,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,MAAM,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI,CAAC;IAC3E,QAAQ,CAAC,WAAW,CAAC,EAAE;QACrB,MAAM,CAAC,IAAI,gBAAgB,CAAC;YAC1B,QAAQ,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC;YACtB,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC;YACvB,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;YAC/B,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;YACxB,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;SACzB,CAAC,CAAC;KACJ,GAAG,IAAI,CAAC;CACV;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,cAAc,GAAG,cAAc,GAAG,IAAI,CA2BhF"}
|
package/dist/schema.js
CHANGED
|
@@ -42,7 +42,8 @@ export const inboundMessageSchema = z.object({
|
|
|
42
42
|
export function extractInboundMessage(msg) {
|
|
43
43
|
const attachments = [];
|
|
44
44
|
try {
|
|
45
|
-
|
|
45
|
+
const rawAttachments = msg.attachments;
|
|
46
|
+
for (const a of rawAttachments?.values ? rawAttachments.values() : []) {
|
|
46
47
|
attachments.push({
|
|
47
48
|
id: a?.id,
|
|
48
49
|
url: a?.url,
|
package/dist/schema.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,YAAY,CAAC;AAC/B,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAE5C;;;;;GAKG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,CAAC;AAEvC,gFAAgF;AAChF,MAAM,CAAC,MAAM,eAAe,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AAEhD,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IAChC,EAAE,EAAE,eAAe;IACnB,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC;IAChC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;IAC3C,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE;IACpC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE;CACvC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C,EAAE,EAAE,eAAe;IACnB,oEAAoE;IACpE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,iBAAiB,CAAC;IAC1C,SAAS,EAAE,eAAe;IAC1B,oBAAoB;IACpB,OAAO,EAAE,eAAe,CAAC,QAAQ,EAAE;IACnC,QAAQ,EAAE,eAAe;IACzB,WAAW,EAAE,CAAC,CAAC,OAAO,EAAE;IACxB,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;CAC/C,CAAC,CAAC;AAuBH;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CAAC,GAAmB;IACvD,MAAM,WAAW,GAAc,EAAE,CAAC;IAClC,IAAI,CAAC;QACH,KAAK,MAAM,CAAC,IAAI,
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,YAAY,CAAC;AAC/B,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAE5C;;;;;GAKG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,CAAC;AAEvC,gFAAgF;AAChF,MAAM,CAAC,MAAM,eAAe,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AAEhD,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IAChC,EAAE,EAAE,eAAe;IACnB,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC;IAChC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;IAC3C,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE;IACpC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE;CACvC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C,EAAE,EAAE,eAAe;IACnB,oEAAoE;IACpE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,iBAAiB,CAAC;IAC1C,SAAS,EAAE,eAAe;IAC1B,oBAAoB;IACpB,OAAO,EAAE,eAAe,CAAC,QAAQ,EAAE;IACnC,QAAQ,EAAE,eAAe;IACzB,WAAW,EAAE,CAAC,CAAC,OAAO,EAAE;IACxB,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;CAC/C,CAAC,CAAC;AAuBH;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CAAC,GAAmB;IACvD,MAAM,WAAW,GAAc,EAAE,CAAC;IAClC,IAAI,CAAC;QACH,MAAM,cAAc,GAAG,GAAG,CAAC,WAAW,CAAC;QACvC,KAAK,MAAM,CAAC,IAAI,cAAc,EAAE,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;YACtE,WAAW,CAAC,IAAI,CAAC;gBACf,EAAE,EAAE,CAAC,EAAE,EAAE;gBACT,GAAG,EAAE,CAAC,EAAE,GAAG;gBACX,WAAW,EAAE,CAAC,EAAE,WAAW,IAAI,IAAI;gBACnC,IAAI,EAAE,CAAC,EAAE,IAAI;gBACb,IAAI,EAAE,CAAC,EAAE,IAAI,IAAI,IAAI;aACtB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,SAAS,GAAG;QAChB,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,IAAI;QAC5B,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,EAAE;QACxB,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,KAAK,IAAI;QACrC,WAAW;KACZ,CAAC;IACF,MAAM,MAAM,GAAG,oBAAoB,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IACzD,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;AAC7C,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@moxxy/plugin-channel-discord",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.30.0",
|
|
4
4
|
"description": "Discord channel for moxxy via discord.js. Treats Discord DMs and allow-listed guild channels as a bidirectional channel: prompts in, streamed assistant replies out (edit-throttled), button-based permission prompts, DM code pairing.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"moxxy",
|
|
@@ -68,10 +68,10 @@
|
|
|
68
68
|
"dependencies": {
|
|
69
69
|
"@clack/prompts": "^1.4.0",
|
|
70
70
|
"discord.js": "^14.16.0",
|
|
71
|
-
"@moxxy/
|
|
72
|
-
"@moxxy/
|
|
73
|
-
"@moxxy/sdk": "0.
|
|
74
|
-
"@moxxy/
|
|
71
|
+
"@moxxy/core": "0.30.0",
|
|
72
|
+
"@moxxy/plugin-vault": "0.30.0",
|
|
73
|
+
"@moxxy/sdk": "0.30.0",
|
|
74
|
+
"@moxxy/channel-kit": "0.30.0"
|
|
75
75
|
},
|
|
76
76
|
"devDependencies": {
|
|
77
77
|
"@types/node": "^22.10.0",
|
package/src/approval.ts
CHANGED
|
@@ -28,10 +28,11 @@ export class DiscordApprovalResolver implements ApprovalResolver {
|
|
|
28
28
|
// No bot wired up — best fallback is the request's defaultOptionId.
|
|
29
29
|
return { optionId: request.defaultOptionId ?? request.options[0]?.id ?? 'approve' };
|
|
30
30
|
}
|
|
31
|
+
const decider = this.deciderFn;
|
|
31
32
|
const id = `appr_${this.nextId++}`;
|
|
32
33
|
return new Promise<ApprovalDecision>((resolve) => {
|
|
33
34
|
this.pending.set(id, { id, request, resolve });
|
|
34
|
-
|
|
35
|
+
decider(id, request).catch((err) => {
|
|
35
36
|
this.pending.delete(id);
|
|
36
37
|
resolve({
|
|
37
38
|
optionId: request.defaultOptionId ?? request.options[0]?.id ?? 'cancel',
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { assertDefined, type ChannelHandle, type ClientSession as Session } from '@moxxy/sdk';
|
|
2
2
|
import { gateInbound } from '../allow-list.js';
|
|
3
3
|
import type { InboundMessage } from '../schema.js';
|
|
4
4
|
import type { DiscordApprovalResolver } from '../approval.js';
|
|
@@ -130,7 +130,8 @@ export async function handleInboundMessage(
|
|
|
130
130
|
if (text.startsWith('/')) {
|
|
131
131
|
if (!state.session) return;
|
|
132
132
|
const [head, ...rest] = text.split(/\s+/);
|
|
133
|
-
|
|
133
|
+
assertDefined(head, 'splitting a non-empty command string yields at least one token');
|
|
134
|
+
const reply = await runSlash(head.slice(1), rest.join(' '), state.session, {
|
|
134
135
|
toggleYolo: cb.toggleYolo,
|
|
135
136
|
voice: cb.voice,
|
|
136
137
|
performSessionAction: (action, notice) =>
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { describe, expect, it } from 'vitest';
|
|
2
|
-
import { asTurnId, type MoxxyEvent } from '@moxxy/sdk';
|
|
2
|
+
import { assertDefined, asTurnId, type MoxxyEvent } from '@moxxy/sdk';
|
|
3
3
|
import type { ClientSession as Session } from '@moxxy/sdk';
|
|
4
4
|
import type { SendableChannelLike, SentMessageLike } from './discord-like.js';
|
|
5
5
|
import { TypingIndicator } from './typing-indicator.js';
|
|
@@ -91,7 +91,9 @@ describe('runDiscordTurn — send-once-then-edit streaming', () => {
|
|
|
91
91
|
);
|
|
92
92
|
// Exactly one streamed message; later frames are edits of it.
|
|
93
93
|
expect(sends).toHaveLength(1);
|
|
94
|
-
|
|
94
|
+
const firstSend = sends[0];
|
|
95
|
+
assertDefined(firstSend, 'a streamed frame was sent');
|
|
96
|
+
expect(firstSend.startsWith('Hello')).toBe(true);
|
|
95
97
|
expect(edits.length).toBeGreaterThanOrEqual(1);
|
|
96
98
|
expect(edits[edits.length - 1]).toBe('Hello, world. Done.');
|
|
97
99
|
});
|
|
@@ -111,7 +113,8 @@ describe('runDiscordTurn — send-once-then-edit streaming', () => {
|
|
|
111
113
|
);
|
|
112
114
|
// First send is the streamed head; final tails arrive as extra sends.
|
|
113
115
|
expect(sends.length).toBeGreaterThanOrEqual(3); // head + >=2 tails
|
|
114
|
-
const finalHead = edits[edits.length - 1]
|
|
116
|
+
const finalHead = edits[edits.length - 1];
|
|
117
|
+
assertDefined(finalHead, 'the final frame was edited in place');
|
|
115
118
|
expect(finalHead.length).toBeLessThanOrEqual(1_900);
|
|
116
119
|
// Reassembling head + tails recovers the whole final text.
|
|
117
120
|
const reassembled = [finalHead, ...sends.slice(1)].join('\n');
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { newTurnId } from '@moxxy/core';
|
|
2
|
-
import type
|
|
2
|
+
import { assertDefined, type ClientSession as Session } from '@moxxy/sdk';
|
|
3
3
|
import { FramePump, driveTurn, subscribeTurn } from '@moxxy/channel-kit';
|
|
4
4
|
import { DiscordTurnRenderer, splitForDiscord } from '../render.js';
|
|
5
5
|
import type { ChannelLogger, SendableChannelLike, SentMessageLike } from './discord-like.js';
|
|
@@ -82,14 +82,18 @@ export async function runDiscordTurn(
|
|
|
82
82
|
sink: {
|
|
83
83
|
send: async (t, final) => {
|
|
84
84
|
const parts = splitForDiscord(t);
|
|
85
|
-
const
|
|
85
|
+
const head = parts[0];
|
|
86
|
+
assertDefined(head, 'discord: FramePump never sinks empty text (emptyFinalText guarantees a part)');
|
|
87
|
+
const sent = await sendPart(head);
|
|
86
88
|
if (final) for (const tail of parts.slice(1)) await sendPart(tail);
|
|
87
89
|
return sent;
|
|
88
90
|
},
|
|
89
91
|
edit: async (message, t, final) => {
|
|
90
92
|
const parts = splitForDiscord(t);
|
|
93
|
+
const head = parts[0];
|
|
94
|
+
assertDefined(head, 'discord: FramePump never sinks empty text (emptyFinalText guarantees a part)');
|
|
91
95
|
try {
|
|
92
|
-
await message.edit(
|
|
96
|
+
await message.edit(head);
|
|
93
97
|
} catch (err) {
|
|
94
98
|
logger?.warn('discord edit failed', { err: String(err) });
|
|
95
99
|
}
|
|
@@ -14,8 +14,9 @@ export class TypingIndicator {
|
|
|
14
14
|
start(channel: SendableChannelLike): void {
|
|
15
15
|
this.stop();
|
|
16
16
|
if (!channel.sendTyping) return;
|
|
17
|
+
const sendTyping = channel.sendTyping;
|
|
17
18
|
const ping = (): void => {
|
|
18
|
-
void
|
|
19
|
+
void sendTyping().catch(() => undefined);
|
|
19
20
|
};
|
|
20
21
|
ping();
|
|
21
22
|
this.timer = setInterval(ping, REFRESH_MS);
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { describe, expect, it, vi } from 'vitest';
|
|
2
|
-
import type
|
|
2
|
+
import { assertDefined, type ClientSession as Session } from '@moxxy/sdk';
|
|
3
3
|
import type { InboundMessage } from '../schema.js';
|
|
4
4
|
import { MAX_AUDIO_BYTES } from '../schema.js';
|
|
5
5
|
import type { InboundContext } from './message-handler.js';
|
|
@@ -58,9 +58,11 @@ const okFetch = (bytes = 16) =>
|
|
|
58
58
|
describe('pickAudioAttachment', () => {
|
|
59
59
|
it('picks the first audio/* attachment and ignores others', () => {
|
|
60
60
|
const msg = audioMsg();
|
|
61
|
+
const first = msg.attachments[0];
|
|
62
|
+
assertDefined(first, 'audioMsg seeds at least one attachment');
|
|
61
63
|
expect(pickAudioAttachment(msg.attachments)?.contentType).toBe('audio/ogg');
|
|
62
|
-
expect(pickAudioAttachment([{ ...
|
|
63
|
-
expect(pickAudioAttachment([{ ...
|
|
64
|
+
expect(pickAudioAttachment([{ ...first, contentType: 'image/png' }])).toBeNull();
|
|
65
|
+
expect(pickAudioAttachment([{ ...first, contentType: null }])).toBeNull();
|
|
64
66
|
});
|
|
65
67
|
});
|
|
66
68
|
|
package/src/permission.ts
CHANGED
|
@@ -40,9 +40,10 @@ export class DiscordPermissionResolver implements PermissionResolver {
|
|
|
40
40
|
if (!this.deciderFn) {
|
|
41
41
|
return { mode: 'deny', reason: 'no decider attached (bot not running)' };
|
|
42
42
|
}
|
|
43
|
+
const decider = this.deciderFn;
|
|
43
44
|
const decision = await new Promise<PermissionDecision>((resolve) => {
|
|
44
45
|
this.pending.set(call.callId, { callId: call.callId, call, ctx, resolve });
|
|
45
|
-
|
|
46
|
+
decider(call, ctx).catch((err) => {
|
|
46
47
|
this.pending.delete(call.callId);
|
|
47
48
|
resolve({ mode: 'deny', reason: err instanceof Error ? err.message : String(err) });
|
|
48
49
|
});
|
package/src/render.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { assertDefined, type MoxxyEvent } from '@moxxy/sdk';
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* Discord messages cap at 2000 chars; leave margin for the fence-reopen text a
|
|
@@ -222,7 +222,9 @@ function openFenceAt(text: string, idx: number, seed: string | null): string | n
|
|
|
222
222
|
const fenceRe = /(?:^|\n)(```[^\n]*)/g;
|
|
223
223
|
let m: RegExpExecArray | null;
|
|
224
224
|
while ((m = fenceRe.exec(scan)) !== null) {
|
|
225
|
-
|
|
225
|
+
const fence = m[1];
|
|
226
|
+
assertDefined(fence, 'fenceRe has a mandatory capture group when it matches');
|
|
227
|
+
open = open === null ? fence : null;
|
|
226
228
|
}
|
|
227
229
|
return open;
|
|
228
230
|
}
|
package/src/schema.ts
CHANGED
|
@@ -68,7 +68,8 @@ export interface RawMessageLike {
|
|
|
68
68
|
export function extractInboundMessage(msg: RawMessageLike): InboundMessage | null {
|
|
69
69
|
const attachments: unknown[] = [];
|
|
70
70
|
try {
|
|
71
|
-
|
|
71
|
+
const rawAttachments = msg.attachments;
|
|
72
|
+
for (const a of rawAttachments?.values ? rawAttachments.values() : []) {
|
|
72
73
|
attachments.push({
|
|
73
74
|
id: a?.id,
|
|
74
75
|
url: a?.url,
|
package/src/subcommands.test.ts
CHANGED
|
@@ -27,7 +27,7 @@ beforeEach(async () => {
|
|
|
27
27
|
keySource: createStaticKeySource(deriveKey('test', generateSalt())),
|
|
28
28
|
});
|
|
29
29
|
const plugin = buildDiscordPlugin({ vault });
|
|
30
|
-
discordDef = plugin.channels
|
|
30
|
+
discordDef = (plugin.channels ?? [])[0] as ChannelDef;
|
|
31
31
|
writeOut = [];
|
|
32
32
|
writeErr = [];
|
|
33
33
|
origStdoutWrite = process.stdout.write.bind(process.stdout);
|
|
@@ -72,24 +72,24 @@ describe('discord ChannelDef', () => {
|
|
|
72
72
|
});
|
|
73
73
|
|
|
74
74
|
it('is unavailable without a token, available with one in the vault', async () => {
|
|
75
|
-
const unavailable = await discordDef.isAvailable
|
|
76
|
-
expect(unavailable
|
|
77
|
-
expect(unavailable
|
|
75
|
+
const unavailable = await discordDef.isAvailable?.({ cwd: tmp, vault });
|
|
76
|
+
expect(unavailable?.ok).toBe(false);
|
|
77
|
+
expect(unavailable?.reason).toMatch(/MOXXY_DISCORD_TOKEN/);
|
|
78
78
|
await vault.set(DISCORD_TOKEN_KEY, 'x'.repeat(24) + '.abcdef.' + 'y'.repeat(28));
|
|
79
|
-
const available = await discordDef.isAvailable
|
|
80
|
-
expect(available
|
|
79
|
+
const available = await discordDef.isAvailable?.({ cwd: tmp, vault });
|
|
80
|
+
expect(available?.ok).toBe(true);
|
|
81
81
|
});
|
|
82
82
|
});
|
|
83
83
|
|
|
84
84
|
describe('discord channel subcommands (registered on ChannelDef)', () => {
|
|
85
85
|
it('exposes setup, pair, unpair, status', () => {
|
|
86
|
-
expect(Object.keys(discordDef.subcommands
|
|
86
|
+
expect(Object.keys(discordDef.subcommands ?? {})).toEqual(
|
|
87
87
|
expect.arrayContaining(['setup', 'pair', 'unpair', 'status']),
|
|
88
88
|
);
|
|
89
89
|
});
|
|
90
90
|
|
|
91
91
|
it('`status` reports unconfigured vault state as JSON', async () => {
|
|
92
|
-
const code = await discordDef.subcommands
|
|
92
|
+
const code = await discordDef.subcommands?.status?.run(ctx());
|
|
93
93
|
expect(code).toBe(0);
|
|
94
94
|
const parsed = JSON.parse(writeOut.join(''));
|
|
95
95
|
expect(parsed).toEqual({
|
|
@@ -103,7 +103,7 @@ describe('discord channel subcommands (registered on ChannelDef)', () => {
|
|
|
103
103
|
await vault.set(DISCORD_TOKEN_KEY, 'x'.repeat(24) + '.abcdef.' + 'y'.repeat(28));
|
|
104
104
|
await vault.set(DISCORD_AUTHORIZED_USER_KEY, '987654321');
|
|
105
105
|
await vault.set(DISCORD_ALLOWED_CHANNELS_KEY, serializeAllowedChannels(['123456789']));
|
|
106
|
-
const code = await discordDef.subcommands
|
|
106
|
+
const code = await discordDef.subcommands?.status?.run(ctx());
|
|
107
107
|
expect(code).toBe(0);
|
|
108
108
|
const parsed = JSON.parse(writeOut.join(''));
|
|
109
109
|
expect(parsed).toEqual({
|
|
@@ -115,7 +115,7 @@ describe('discord channel subcommands (registered on ChannelDef)', () => {
|
|
|
115
115
|
|
|
116
116
|
it('`status` reports null (not junk) for a corrupt stored user id', async () => {
|
|
117
117
|
await vault.set(DISCORD_AUTHORIZED_USER_KEY, 'not-a-snowflake');
|
|
118
|
-
const code = await discordDef.subcommands
|
|
118
|
+
const code = await discordDef.subcommands?.status?.run(ctx());
|
|
119
119
|
expect(code).toBe(0);
|
|
120
120
|
const parsed = JSON.parse(writeOut.join(''));
|
|
121
121
|
expect(parsed.authorizedUserId).toBeNull();
|
|
@@ -123,14 +123,14 @@ describe('discord channel subcommands (registered on ChannelDef)', () => {
|
|
|
123
123
|
|
|
124
124
|
it('`unpair` clears the authorized user and reports', async () => {
|
|
125
125
|
await vault.set(DISCORD_AUTHORIZED_USER_KEY, '111');
|
|
126
|
-
const code = await discordDef.subcommands
|
|
126
|
+
const code = await discordDef.subcommands?.unpair?.run(ctx());
|
|
127
127
|
expect(code).toBe(0);
|
|
128
128
|
expect(writeOut.join('')).toContain('unpaired');
|
|
129
129
|
expect(await vault.get(DISCORD_AUTHORIZED_USER_KEY)).toBeNull();
|
|
130
130
|
});
|
|
131
131
|
|
|
132
132
|
it('`unpair` is a no-op when nothing is paired', async () => {
|
|
133
|
-
const code = await discordDef.subcommands
|
|
133
|
+
const code = await discordDef.subcommands?.unpair?.run(ctx());
|
|
134
134
|
expect(code).toBe(0);
|
|
135
135
|
expect(writeOut.join('')).toContain('no pairing was active');
|
|
136
136
|
});
|
|
@@ -146,7 +146,7 @@ describe('discord channel subcommands (registered on ChannelDef)', () => {
|
|
|
146
146
|
// assert that `pair` drives the in-process pairing flow (wires the
|
|
147
147
|
// session's permission resolver) instead of delegating to startChannel.
|
|
148
148
|
await expect(
|
|
149
|
-
discordDef.subcommands
|
|
149
|
+
discordDef.subcommands?.pair?.run(ctx({ startChannel, session: { setPermissionResolver } })),
|
|
150
150
|
).rejects.toThrow(/token/i);
|
|
151
151
|
expect(setPermissionResolver).toHaveBeenCalledTimes(1);
|
|
152
152
|
expect(startChannel).not.toHaveBeenCalled();
|
|
@@ -160,7 +160,7 @@ describe('discord channel subcommands (registered on ChannelDef)', () => {
|
|
|
160
160
|
Object.defineProperty(process.stdin, 'isTTY', { value: false, configurable: true });
|
|
161
161
|
try {
|
|
162
162
|
const startChannel = vi.fn(async () => 0);
|
|
163
|
-
const code = await discordDef.subcommands
|
|
163
|
+
const code = await discordDef.subcommands?.pair?.run(ctx({ startChannel }));
|
|
164
164
|
expect(code).toBe(1);
|
|
165
165
|
expect(startChannel).not.toHaveBeenCalled();
|
|
166
166
|
expect(writeErr.join('')).toMatch(/TTY/);
|
|
@@ -175,7 +175,7 @@ describe('discord channel subcommands (registered on ChannelDef)', () => {
|
|
|
175
175
|
args: { positional: [], flags: {} },
|
|
176
176
|
startChannel: async () => 0,
|
|
177
177
|
};
|
|
178
|
-
const code = await discordDef.subcommands
|
|
178
|
+
const code = await discordDef.subcommands?.status?.run(badCtx as never);
|
|
179
179
|
expect(code).toBe(1);
|
|
180
180
|
expect(writeErr.join('')).toContain('vault unavailable');
|
|
181
181
|
});
|