opencode-discord-presence 0.2.2 → 0.2.4

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.
@@ -0,0 +1,4 @@
1
+ import type { PresenceConfig } from "./types/index.js";
2
+ export declare const DEFAULT_CLIENT_ID = "1466770544748662819";
3
+ export declare function getConfig(): PresenceConfig;
4
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAEtD,eAAO,MAAM,iBAAiB,wBAAwB,CAAA;AAEtD,wBAAgB,SAAS,IAAI,cAAc,CAK1C"}
package/dist/config.js ADDED
@@ -0,0 +1,8 @@
1
+ export const DEFAULT_CLIENT_ID = "1466770544748662819";
2
+ export function getConfig() {
3
+ return {
4
+ enabled: process.env.OPENCODE_DISCORD_ENABLED !== "false",
5
+ clientId: process.env.OPENCODE_DISCORD_CLIENT_ID || DEFAULT_CLIENT_ID,
6
+ };
7
+ }
8
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,iBAAiB,GAAG,qBAAqB,CAAA;AAEtD,MAAM,UAAU,SAAS;IACvB,OAAO;QACL,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,wBAAwB,KAAK,OAAO;QACzD,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,0BAA0B,IAAI,iBAAiB;KACtE,CAAA;AACH,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,10 +1,5 @@
1
- import type { Plugin } from "@opencode-ai/plugin";
2
- interface PresenceConfig {
3
- enabled: boolean;
4
- clientId: string;
5
- }
6
- declare function getConfig(): PresenceConfig;
7
- export declare const OpenCodeDiscordPresence: Plugin;
1
+ import { OpenCodeDiscordPresence } from "./plugin.js";
2
+ export { OpenCodeDiscordPresence };
8
3
  export default OpenCodeDiscordPresence;
9
- export { getConfig };
4
+ export { getConfig } from "./config.js";
10
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAOjD,UAAU,cAAc;IACtB,OAAO,EAAE,OAAO,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,iBAAS,SAAS,IAAI,cAAc,CAKnC;AA6FD,eAAO,MAAM,uBAAuB,EAAE,MAkCrC,CAAA;AAED,eAAe,uBAAuB,CAAA;AACtC,OAAO,EAAE,SAAS,EAAE,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAA;AAErD,OAAO,EAAE,uBAAuB,EAAE,CAAA;AAClC,eAAe,uBAAuB,CAAA;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA"}
package/dist/index.js CHANGED
@@ -1,130 +1,5 @@
1
- import { Client } from "@xhayper/discord-rpc";
2
- const DEFAULT_CLIENT_ID = "1334049498592313364";
3
- const RECONNECT_DELAY = 5000;
4
- const MAX_RETRIES = 10;
5
- function getConfig() {
6
- return {
7
- enabled: process.env.OPENCODE_DISCORD_ENABLED !== "false",
8
- clientId: process.env.OPENCODE_DISCORD_CLIENT_ID || DEFAULT_CLIENT_ID,
9
- };
10
- }
11
- class DiscordRPC {
12
- clientId;
13
- client = null;
14
- connected = false;
15
- retryCount = 0;
16
- sessionStart = new Date();
17
- currentPresence = null;
18
- constructor(clientId) {
19
- this.clientId = clientId;
20
- }
21
- async connect() {
22
- if (this.connected)
23
- return true;
24
- return new Promise((resolve) => {
25
- try {
26
- this.client = new Client({ clientId: this.clientId });
27
- this.client.on("ready", () => {
28
- this.connected = true;
29
- this.retryCount = 0;
30
- console.log("[discord-presence] Connected to Discord");
31
- if (this.currentPresence) {
32
- this.client?.user?.setActivity(this.currentPresence).catch(() => { });
33
- }
34
- resolve(true);
35
- });
36
- this.client.on("disconnected", () => {
37
- this.connected = false;
38
- console.log("[discord-presence] Disconnected");
39
- this.scheduleReconnect();
40
- });
41
- this.client.login().catch((err) => {
42
- console.log("[discord-presence] Connection failed:", err?.message || err);
43
- this.scheduleReconnect();
44
- resolve(false);
45
- });
46
- }
47
- catch (error) {
48
- console.log("[discord-presence] Error:", error);
49
- this.scheduleReconnect();
50
- resolve(false);
51
- }
52
- });
53
- }
54
- scheduleReconnect() {
55
- if (this.retryCount >= MAX_RETRIES) {
56
- console.log("[discord-presence] Max retries reached");
57
- return;
58
- }
59
- this.retryCount++;
60
- setTimeout(() => this.connect(), RECONNECT_DELAY);
61
- }
62
- async setPresence(details, state) {
63
- const activity = {
64
- details,
65
- state,
66
- startTimestamp: this.sessionStart,
67
- largeImageKey: "opencode-logo",
68
- largeImageText: "OpenCode",
69
- };
70
- this.currentPresence = activity;
71
- if (!this.connected || !this.client?.user) {
72
- return;
73
- }
74
- try {
75
- await this.client.user.setActivity(activity);
76
- }
77
- catch (error) {
78
- console.warn("[discord-presence] Failed to update:", error);
79
- }
80
- }
81
- async clear() {
82
- this.currentPresence = null;
83
- if (!this.connected || !this.client?.user)
84
- return;
85
- try {
86
- await this.client.user.clearActivity();
87
- }
88
- catch { }
89
- }
90
- }
91
- let rpc = null;
92
- let currentAgent = "OpenCode";
93
- let currentModel = "";
94
- export const OpenCodeDiscordPresence = async (ctx) => {
95
- const config = getConfig();
96
- if (!config.enabled)
97
- return {};
98
- rpc = new DiscordRPC(config.clientId);
99
- const updatePresence = async (idle = false) => {
100
- if (!rpc)
101
- return;
102
- const details = idle ? `${currentAgent} is idle` : `Working with ${currentAgent}`;
103
- const state = currentModel || undefined;
104
- await rpc.setPresence(details, state);
105
- };
106
- const connected = await rpc.connect();
107
- if (connected) {
108
- await updatePresence(false);
109
- }
110
- return {
111
- "chat.message": async (input) => {
112
- if (input.agent)
113
- currentAgent = input.agent;
114
- if (input.model)
115
- currentModel = String(input.model).split("-")[0];
116
- await updatePresence(false);
117
- },
118
- event: async ({ event }) => {
119
- if (event.type === "session.idle") {
120
- await updatePresence(true);
121
- }
122
- if (event.type === "session.deleted") {
123
- await rpc?.clear();
124
- }
125
- },
126
- };
127
- };
1
+ import { OpenCodeDiscordPresence } from "./plugin.js";
2
+ export { OpenCodeDiscordPresence };
128
3
  export default OpenCodeDiscordPresence;
129
- export { getConfig };
4
+ export { getConfig } from "./config.js";
130
5
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAA;AAErD,OAAO,EAAE,uBAAuB,EAAE,CAAA;AAClC,eAAe,uBAAuB,CAAA;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA"}
@@ -0,0 +1,3 @@
1
+ import type { Plugin } from "@opencode-ai/plugin";
2
+ export declare const OpenCodeDiscordPresence: Plugin;
3
+ //# sourceMappingURL=plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAQjD,eAAO,MAAM,uBAAuB,EAAE,MAkCrC,CAAA"}
package/dist/plugin.js ADDED
@@ -0,0 +1,40 @@
1
+ import { getConfig } from "./config.js";
2
+ import { DiscordRPCService } from "./services/discord-rpc.js";
3
+ let rpc = null;
4
+ let currentAgent = "OpenCode";
5
+ let currentModel = "";
6
+ export const OpenCodeDiscordPresence = async (ctx) => {
7
+ const config = getConfig();
8
+ if (!config.enabled)
9
+ return {};
10
+ rpc = new DiscordRPCService(config.clientId);
11
+ const updatePresence = async (idle = false) => {
12
+ if (!rpc)
13
+ return;
14
+ const details = idle ? `${currentAgent} is idle` : `Working with ${currentAgent}`;
15
+ const state = currentModel || undefined;
16
+ await rpc.setPresence(details, state);
17
+ };
18
+ const connected = await rpc.connect();
19
+ if (connected) {
20
+ await updatePresence(false);
21
+ }
22
+ return {
23
+ "chat.message": async (input) => {
24
+ if (input.agent)
25
+ currentAgent = input.agent;
26
+ if (input.model)
27
+ currentModel = String(input.model).split("-")[0];
28
+ await updatePresence(false);
29
+ },
30
+ event: async ({ event }) => {
31
+ if (event.type === "session.idle") {
32
+ await updatePresence(true);
33
+ }
34
+ if (event.type === "session.deleted") {
35
+ await rpc?.clear();
36
+ }
37
+ },
38
+ };
39
+ };
40
+ //# sourceMappingURL=plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;AAE7D,IAAI,GAAG,GAA6B,IAAI,CAAA;AACxC,IAAI,YAAY,GAAG,UAAU,CAAA;AAC7B,IAAI,YAAY,GAAG,EAAE,CAAA;AAErB,MAAM,CAAC,MAAM,uBAAuB,GAAW,KAAK,EAAE,GAAG,EAAE,EAAE;IAC3D,MAAM,MAAM,GAAG,SAAS,EAAE,CAAA;IAC1B,IAAI,CAAC,MAAM,CAAC,OAAO;QAAE,OAAO,EAAE,CAAA;IAE9B,GAAG,GAAG,IAAI,iBAAiB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;IAE5C,MAAM,cAAc,GAAG,KAAK,EAAE,IAAI,GAAG,KAAK,EAAE,EAAE;QAC5C,IAAI,CAAC,GAAG;YAAE,OAAM;QAChB,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,YAAY,UAAU,CAAC,CAAC,CAAC,gBAAgB,YAAY,EAAE,CAAA;QACjF,MAAM,KAAK,GAAG,YAAY,IAAI,SAAS,CAAA;QACvC,MAAM,GAAG,CAAC,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;IACvC,CAAC,CAAA;IAED,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,OAAO,EAAE,CAAA;IACrC,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,cAAc,CAAC,KAAK,CAAC,CAAA;IAC7B,CAAC;IAED,OAAO;QACL,cAAc,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;YAC9B,IAAI,KAAK,CAAC,KAAK;gBAAE,YAAY,GAAG,KAAK,CAAC,KAAK,CAAA;YAC3C,IAAI,KAAK,CAAC,KAAK;gBAAE,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;YACjE,MAAM,cAAc,CAAC,KAAK,CAAC,CAAA;QAC7B,CAAC;QAED,KAAK,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;YACzB,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;gBAClC,MAAM,cAAc,CAAC,IAAI,CAAC,CAAA;YAC5B,CAAC;YACD,IAAI,KAAK,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;gBACrC,MAAM,GAAG,EAAE,KAAK,EAAE,CAAA;YACpB,CAAC;QACH,CAAC;KACF,CAAA;AACH,CAAC,CAAA"}
@@ -0,0 +1,15 @@
1
+ export declare class DiscordRPCService {
2
+ private clientId;
3
+ private client;
4
+ private connected;
5
+ private retryCount;
6
+ private sessionStart;
7
+ private currentPresence;
8
+ constructor(clientId: string);
9
+ connect(): Promise<boolean>;
10
+ private scheduleReconnect;
11
+ setPresence(details: string, state?: string): Promise<void>;
12
+ clear(): Promise<void>;
13
+ isConnected(): boolean;
14
+ }
15
+ //# sourceMappingURL=discord-rpc.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discord-rpc.d.ts","sourceRoot":"","sources":["../../src/services/discord-rpc.ts"],"names":[],"mappings":"AAMA,qBAAa,iBAAiB;IAOhB,OAAO,CAAC,QAAQ;IAN5B,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,SAAS,CAAQ;IACzB,OAAO,CAAC,UAAU,CAAI;IACtB,OAAO,CAAC,YAAY,CAAmB;IACvC,OAAO,CAAC,eAAe,CAA2B;gBAE9B,QAAQ,EAAE,MAAM;IAE9B,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC;IAsCjC,OAAO,CAAC,iBAAiB;IASnB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM;IAsB3C,KAAK;IAQX,WAAW,IAAI,OAAO;CAGvB"}
@@ -0,0 +1,87 @@
1
+ import { Client } from "@xhayper/discord-rpc";
2
+ const RECONNECT_DELAY = 5000;
3
+ const MAX_RETRIES = 10;
4
+ export class DiscordRPCService {
5
+ clientId;
6
+ client = null;
7
+ connected = false;
8
+ retryCount = 0;
9
+ sessionStart = new Date();
10
+ currentPresence = null;
11
+ constructor(clientId) {
12
+ this.clientId = clientId;
13
+ }
14
+ async connect() {
15
+ if (this.connected)
16
+ return true;
17
+ return new Promise((resolve) => {
18
+ try {
19
+ this.client = new Client({ clientId: this.clientId });
20
+ this.client.on("ready", () => {
21
+ this.connected = true;
22
+ this.retryCount = 0;
23
+ console.log("[discord-presence] Connected to Discord");
24
+ if (this.currentPresence) {
25
+ this.client?.user?.setActivity(this.currentPresence).catch(() => { });
26
+ }
27
+ resolve(true);
28
+ });
29
+ this.client.on("disconnected", () => {
30
+ this.connected = false;
31
+ console.log("[discord-presence] Disconnected");
32
+ this.scheduleReconnect();
33
+ });
34
+ this.client.login().catch((err) => {
35
+ console.log("[discord-presence] Connection failed:", err?.message || err);
36
+ this.scheduleReconnect();
37
+ resolve(false);
38
+ });
39
+ }
40
+ catch (error) {
41
+ console.log("[discord-presence] Error:", error);
42
+ this.scheduleReconnect();
43
+ resolve(false);
44
+ }
45
+ });
46
+ }
47
+ scheduleReconnect() {
48
+ if (this.retryCount >= MAX_RETRIES) {
49
+ console.log("[discord-presence] Max retries reached");
50
+ return;
51
+ }
52
+ this.retryCount++;
53
+ setTimeout(() => this.connect(), RECONNECT_DELAY);
54
+ }
55
+ async setPresence(details, state) {
56
+ const activity = {
57
+ details,
58
+ state,
59
+ startTimestamp: this.sessionStart,
60
+ largeImageKey: "opencode-logo",
61
+ largeImageText: "OpenCode",
62
+ };
63
+ this.currentPresence = activity;
64
+ if (!this.connected || !this.client?.user) {
65
+ return;
66
+ }
67
+ try {
68
+ await this.client.user.setActivity(activity);
69
+ }
70
+ catch (error) {
71
+ console.warn("[discord-presence] Failed to update:", error);
72
+ }
73
+ }
74
+ async clear() {
75
+ this.currentPresence = null;
76
+ if (!this.connected || !this.client?.user)
77
+ return;
78
+ try {
79
+ await this.client.user.clearActivity();
80
+ }
81
+ catch { }
82
+ }
83
+ isConnected() {
84
+ return this.connected;
85
+ }
86
+ }
87
+ //# sourceMappingURL=discord-rpc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discord-rpc.js","sourceRoot":"","sources":["../../src/services/discord-rpc.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { SetActivity } from "@xhayper/discord-rpc";
2
+ export interface PresenceConfig {
3
+ enabled: boolean;
4
+ clientId: string;
5
+ }
6
+ export interface PresenceState {
7
+ agent: string;
8
+ model: string;
9
+ idle: boolean;
10
+ }
11
+ export type { SetActivity };
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAEvD,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,OAAO,CAAA;CACd;AAED,YAAY,EAAE,WAAW,EAAE,CAAA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":""}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "opencode-discord-presence",
3
- "version": "0.2.2",
3
+ "version": "0.2.4",
4
4
  "description": "Discord Rich Presence plugin for OpenCode - Display your current AI agent, model, and status in Discord",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",